Jump to content

Check side on mod load


Antonii

Recommended Posts

I want my mod to only load when running on the logical client side. The problem is that on initial setup `Minecraft.getInstance().level` is null and so I cannot tell the sides apart. Is there any other clean way of doing this or should I use the `Thread.currentThread()` method?

Link to comment
Share on other sites

8 minutes ago, Antonii said:

I want my mod to only load when running on the logical client side. The problem is that on initial setup `Minecraft.getInstance().level` is null and so I cannot tell the sides apart. Is there any other clean way of doing this or should I use the `Thread.currentThread()` method?

https://mcforge.readthedocs.io/en/latest/concepts/sides/#writing-one-sided-mods

Link to comment
Share on other sites

51 minutes ago, Antonii said:

Well you see DistExecutor is for the physical side. My mod will never run on a server but only on the client side. I only need to set apart the logical server and the logical client.

what exactly should your mod do

if you want to write a client only mod you should use DistExecutor,
if you only have one method, class, code part that is only executed on the client,
the logical side is the better choice, therefore the question what you want to do

Link to comment
Share on other sites

Quote

the logical side is the better choice, therefore the question what you want to do

Yes indeed logical side is better and exactly what I want to do! Now how do I do that? isClientSide() doesn't work....because `level` is null

Edited by Antonii
Link to comment
Share on other sites

3 minutes ago, Antonii said:

Yes indeed logical side is better and exactly what I want to do! Now how do I do that?

again what exactly do you want to do, show your code, because I can't find a solution for your problem with:

5 minutes ago, Antonii said:

isClientSide() doesn't work....because `level` is null

 

Link to comment
Share on other sites

public Main() {
	DistExecutor.safeRunWhenOn(Dist.CLIENT,()->SomeClass::Init);
}
//SomeClass::Init contains register code

This bad/not needed - my mod will never run on physical server

public Main() {
	if (Minecraft.getInstance() == null || !Minecraft.getInstance().level.isClientSide()) return;
	FMLJavaModLoadingContext.get().getModEventBus().addListener(this::Init);
}

This good but doesn't work because `level` is null

Link to comment
Share on other sites

Now now there is no need for irony or insults. I am just asking for help. Redirecting me to a page I already read doesn't help, does it?

Now here is what I understood:

Quote

The logical server is present within the physical server, but is also can run inside a physical client together with a logical client,

So I must "protect" my code from all forms of server. Taking into consideration that this mod will only run on my PC and not on a physical server that leaves me with the following problem: how to differentiate between the logical server and logical client. The method isClientSide() seems appropriate but it is not available where I need it (perhaps at a later stage?)

 

 

Quote

Yes it will. Do not write mods that will crash on server or client

Let's say I do what you keep insisting I should do; I use DistExecutor for Dist.CLIENT and....I don't know if the mod is loaded on logical server or logical client. And this is because

Quote

DistExecutor, which provides various methods to run different methods on different physical sides

 

Edited by Antonii
Link to comment
Share on other sites

3 minutes ago, Antonii said:

how to differentiate between the logical server and logical client. The method isClientSide() seems appropriate but it is not available where I need it.

you don't need it if your mod only runs on the client, this method would always return true

 

4 minutes ago, Antonii said:

Let's say I do what you keep insisting I should do; I use DistExecutor for Dist.CLIENT and....I don't know if the mod is loaded on logical server or logical client. And this is because

you still haven't understood Dist and DistExecutor, if your mod only runs on the client, the physical and logical side is the client

Link to comment
Share on other sites

I admit I left one thing out: I will want to play a normal game locally. When I will do that won't my mod be loaded also on the logical server? It's true that in normal conditions the check is somewhat useless but just sometimes I don't want to load it when playing a singleplayer game. Also I will test my mod locally on a singleplayer world and that will have the same issues.

 

I used to have some sort of check in my mod in 1.12 version that did this.

Edited by Antonii
Link to comment
Share on other sites

Quote

This question makes no sense. Mod loading takes place before there is any kind of logical side. At mod loading time there is no integrated server, because there is no world loaded yet. As such the question "am I loading on the logical server" makes no sense.

This is exactly what I thought! Thanks. This is why I said

Quote

but it is not available where I need it (perhaps at a later stage?)

So the issue at hand is to differentiate between the two...when? On events? I recall that some events where called on both sides.

 

Quote

 At mod loading time there is no integrated server, because there is no world loaded yet.

You must put this in the docs perhaps on the Sided page

Edited by Antonii
positive reinforcement
Link to comment
Share on other sites

5 minutes ago, Antonii said:

So the issue at hand is to differentiate between the two...when? On events? I recall that some events where called on both sides.

yes or if you have data that only exist on one side (Edit: Example would be a capability)

Edited by Luis_ST
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I have a structure, and sometimes several mobs spawn there. This is a boss and must spawn alone. Here is the code for spawning entities in the structure { "type": "minecraft:jigsaw", "start_pool": "egyptcraft:boss_pyramid/start_pool", "size": 5, "max_distance_from_center": 80, "biomes": "#egyptcraft:has_structure/boss_pyramid", "step": "surface_structures", "start_height": { "absolute": 0 }, "project_start_to_heightmap": "WORLD_SURFACE_WG", "use_expansion_hack": false, "spawn_overrides": { "monster": { "bounding_box": "full", "spawns": [ { "type": "egyptcraft:anubis", "maxCount": 1, "minCount": 1, "weight": 100 } ] } } } Maybe it's something else?
    • I have OreGenEvent.GenerateMinable event, I need to get a chance to spawn (generate) every ore that is processed in this event. Also e.getType().name().toString() is name this is the same block name by which it can be entered in the Block.getByID?  forge 1.12.2 59(recommended)
    • Hello everybody! Out of nowhere my minecraft doesn't allow me to play on forge 1.19.2 I tried to reinstall minecraft, doesn't have any mod right now on the forge version. Tried the newest version of forge, tried recommended version as well. I have the newest version of Java as well...   I dont know why it stopped working but it just stopped completly out of nowhere...   Thank you so much for your help guys ❤️
    • Hello, my world is crashing at 0% loaded and I don't know why. (Forge 43.2.14, 1.19.2) I have two worlds that I play on, and one works and the other doesn't, even with the same mod list. Here's the crash report: https://pastebin.com/AUbRwkGj
    • Minecraft 1.12.2 Very frustrating error. only ever occurs on one device. Started yesterday without prompting (maybe java updated or something?) Says things that have been imported actually arent when running client Reinstalled Intellij, cleared cache, cleaned and rebuilt gradle, redownloaded the entire file from git. Nothing works. (I believe I have the right plugins installed, dependencies OK, and am using corretto 1.8).   One thing I did for more of the below errors was just to explicitly import them, which was working up until this little guy who literally does not exist in forge to import. the class inhereting something inhereting it refers to import net.minecraftforge.registries.IForgeRegistryEntry.Impl, not net.minecraftforge.registries.IForgeRegistryEntry$Impl as the output implies. also I didn't even have to manually import these things for it to work on my other device. (which is just importing the minecraft package that contains them), but here I did have to just to get rid of a few errors--not even make anything work?? I dont know. (edited) here's the aforementioned "below error" (one of many like it): error: cannot access net.minecraftforge.registries.IForgeRegistryEntry.Impl public class BlockBase extends Block {        ^   class file for net.minecraftforge.registries.IForgeRegistryEntry$Impl not found Here's the class BlockBase:   package com.quantum.exodus.common.blocks; import com.quantum.exodus.ExodusMod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraftforge.registries.IForgeRegistryEntry.Impl; public class BlockBase extends Block { protected String name; public BlockBase(Material material, String name) { super(material); this.name = name; setTranslationKey(name); setRegistryName(name); } public void registerItemModel(Item itemBlock) { ExodusMod.proxy.registerItemRenderer(itemBlock, 0, name); } public Item createItemBlock() { return new ItemBlock(this).setRegistryName(getRegistryName()); } @Override public BlockBase setCreativeTab(CreativeTabs tab) { super.setCreativeTab(tab); return this; } }
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.