Jump to content

[Solved][1.15.2-31.1.1] @SubscribeEvent not working in ExampleMod


Recommended Posts

Posted (edited)

I am trying to follow the docs in setting up a 1.15.2-31.1.1 (latest as of writing this post) modding environment. So far everything has been working out nicely, but there is one minor issue that I have run into.  
When loading the mdk into IntelliJ, the @SubscribeEvent annotated method is never called. This one:  
https://github.com/MinecraftForge/MinecraftForge/blob/1.15.x/mdk/src/main/java/com/example/examplemod/ExampleMod.java#L68-L72  

Adding @Mod.EventBusSubscriber(modid = "examplemod", bus = Bus.MOD) to the class does not help either. The nested class (register blocks) is not affected.
However from my understanding that would not be necessary anyways, since Line 39 ( MinecraftForge.EVENT_BUS.register(this); ) accomplishes the same thing.  
I do not expect something so fundamental to be broken, so there must be something that I am doing wrong. Is there an error in my thinking?   

Edit: Using different event types also does not work.  
Edit2: My personal repo is here by the way: https://github.com/sauerkrautMod/sauerkraut  
Edit3: But all tests were done on the Initial Commit

Edited by Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted

Huh, seems that just the @Mod.EventBusSubscriber annotation on the class does not work. "Manually" registering the class using MinecraftForge.EVENT_BUS.register works. I might not have opened a level when performing that test, I am not sure anymore.  
Here is some more confusing stuff:  

  • RegistryEvent.Register<Block> blockRegistryEvent is called using the @Mod.EventBusSubscriber Annotation
  • FMLServerStartingEvent event is not called using the annotation, but is called using MinecraftForge.EVENT_BUS.register(this); 
  • RegistryEvent.Register<Block> blockRegistryEvent is called twice in ExampleMod
    • Removing the annotation from the nested class does not change this  
    • Neither does removing MinecraftForge.EVENT_BUS.register(this);

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted (edited)

Ah, turns out I am the one who is being stupid.  
 

  Quote

This does not register an instance of the class; it registers the class itself (i.e. the event handling methods must be static).

Expand  


I haven't been programming java in a while now. static is pretty un-intuitive to me now.

Edited by Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted
  On 2/12/2020 at 12:26 AM, Busti said:


static is pretty un-intuitive to me now.

Expand  

Static is for things that are members of the class, not to an instance of the class.

 

Math.PI and Math.Pow() are examples. There is no need to call new Math() in order to access those.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted (edited)

@Draco18s sure, it is just that I have been programming almost exclusively in scala for about 5 years now and I just do not spend that much attention to the static keyword anymore.  
In my little universe "static" stuff goes into object. Also classes are overrated ;)

Edited by Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted (edited)

There is one thing that I have been wondering.  
Why do we need @ObjectHolder ? What's wrong with writing instances (i.e. of blocks) directly into the public static final variables?  
Why this black-magic pattern of mutating a final field?  

My best guess is that
@Mod.EventBusSubscriber creates an instance of its class really early and we do not want to create block instances at that point in time.  

Edited by Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted (edited)

Ah, DeferredRegister makes it feel much better. Less Black Magic involved. Feels like an Algebraic Data Type.

Edited by Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted
  On 2/12/2020 at 4:16 AM, Busti said:

Why do we need @ObjectHolder ? What's wrong with writing instances (i.e. of blocks) directly into the public static final variables?  

Expand  

What if some other mod wants to override your item's class with a new class in order to add functionality?

 

Now your mod would think that your item is one thing and the game would think your item was another thing, because it was overwritten in the registry.

@ObjectHolder synchronizes those things so that your mod gets the correct reference.

 

What if you want to reference an item from another mod, but don't know if that mod is loaded or not? @ObjectHolder, check it for null.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted (edited)

Yeah, I get that and in the end, if it is how things are done, I do not really care. I just have to use it.  
I guess I wanted to peek behind the curtain a bit and find out why things are done this way.  
But still. @ObjectHolder feels really dirty and DefferedRegister is much sexier. Now if java just had a good monadic for implementation ?

Edited by Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted (edited)

I mean, just look at this:  

public final class ModBlocks {
    public static final DeferredRegister<Block> BLOCKS =
            new DeferredRegister<>(ForgeRegistries.BLOCKS, SauerkrautMod.MODID);

    public static final DeferredRegister<Item> ITEMS =
            new DeferredRegister<>(ForgeRegistries.ITEMS, SauerkrautMod.MODID);

    public static final RegistryObject<Block> BLOCK_COPPER_ORE = BLOCKS.register("copper_ore", () -> new Block(Block.Properties.create(Material.ROCK)));
    public static final RegistryObject<Item> ITEM_COPPER_ORE = ITEMS.register("copper_ore", BLOCK_COPPER_ORE.lazyMap(block -> new BlockItem(block, new Item.Properties())));
}

It's beautiful!

Edited by Busti

PM's regarding modding questions should belong in the Modder Support sub-forum and won't be answered.

Posted

DeferredRegister is newer than @ObjectHolder

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

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

    • Add the crash-report or latest.log (logs-folder) with sites like https://mclo.gs/ and paste the link to it here  
    • Cracked Launchers are not supported
    • Hi, I have a problem in minecraft java (only in forge 1.20.1), When I start the game after a moment the game crashed with code 1 this only in forge 1.20.1 , I tried to reinstall java, Upgrade java to 17, update the drivers to the latest version, downgrade the drivers to the pervious version, deleting .minecraft and reinstall it , but none of these ways working.   here is the log:   [Launcher] Launching Minecraft... I'm hiding! mods after C:\Users\Windows\AppData\Roaming\.minecraft\mods\tl_skin_cape_forge_1.20_1.20.1-1.32.jar [InnerMinecraftServersImpl]  search changers of the servers read servers from servers.dat [] [InnerMinecraftServersImpl]  prepare inner servers save servers to servers.dat [Launcher] Game skin type: TLAUNCHER [Launcher] Starting Minecraft Forge 1.20.1... [Launcher] Launching in: C:\Users\Windows\AppData\Roaming\.minecraft Starting garbage collector: 96 / 227 MB Garbage collector completed: 60 / 214 MB [Launcher] Processing post-launch actions. Assist launch: true =============================================================================================== [05:29:03] [main/INFO]: ModLauncher running: args [--username, *********, --version, Forge 1.20.1, --gameDir, C:\Users\Windows\AppData\Roaming\.minecraft, --assetsDir, C:\Users\Windows\AppData\Roaming\.minecraft\assets, --assetIndex, 5, --uuid, *************************************, --accessToken, вќ„вќ„вќ„вќ„вќ„вќ„вќ„вќ„, --clientId, null, --xuid, null, --userType, mojang, --versionType, modified, --width, 925, --height, 530, --launchTarget, forgeclient, --fml.forgeVersion, 47.3.22, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [05:29:04] [main/INFO]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.12 by Oracle Corporation; OS Windows 10 arch amd64 version 10.0 [05:29:15] [main/INFO]: Loading ImmediateWindowProvider fmlearlywindow [05:29:24] [main/INFO]: Trying GL version 4.6 [05:29:60] [main/INFO]: Requested GL version 4.6 got version 4.6 [05:29:67] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/Windows/AppData/Roaming/.minecraft/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%23100!/ Service=ModLauncher Env=CLIENT FATAL ERROR in native method: Thread[pool-2-thread-1,5,main]: No context is current or a function that is not available in the current context was called. The JVM will abort execution.     at org.lwjgl.opengl.GL11C.nglGetString(org.lwjgl.opengl@3.3.1+7/Native Method)     at org.lwjgl.opengl.GL11C.glGetString(org.lwjgl.opengl@3.3.1+7/GL11C.java:978)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.initRender(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:209)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.lambda$start$5(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:292)     at net.minecraftforge.fml.earlydisplay.DisplayWindow$$Lambda$437/0x000001fab120a618.run(fmlearlydisplay@1.20.1-47.3.22/Unknown Source)     at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.12/Executors.java:539)     at java.util.concurrent.FutureTask.run(java.base@17.0.12/FutureTask.java:264)     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@17.0.12/ScheduledThreadPoolExecutor.java:304)     at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.12/ThreadPoolExecutor.java:1136)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.12/ThreadPoolExecutor.java:635)     at java.lang.Thread.run(java.base@17.0.12/Thread.java:842) Here I am! [VersionManager] Refreshing versions locally... [VersionManager] Versions has been refreshed (6 ms) [Launcher] Launcher exited. [Launcher] Minecraft closed with exit code: 1 flush now [Launcher] [Crash] Signature "Bad video drivers" matches! [Crash] Signature "Bad video drivers" matches! [Launcher] [Crash] Crash has been recognized! [Crash] Crash has been recognized! flush now
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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