Jump to content

Best practices for modding vanilla entity functionality


InspectorCaracal

Recommended Posts

I've been enjoying my dive into Forge modding so far, but I'm being presented with a pretty steep compatability conundrum at the moment. (I'm interested in general best practices and solutions, not just this specific case, but to make explaining it easier, I'm just going to talk about my current specific scenario rather than try to generalize.)

My current end-goal here is bee hibernation: if the temperature at the hive's location is below freezing, then the bees won't come out. For my own hives, this is a trivial modification, since they already use mod classes that extend vanilla and I can override methods there with impunity. But this does Absolutely Nothing for the vanilla bee nests.

The obvious solution is to replace all the vanilla bee nests with my own modded version as well, but that raises potential compatability issues if there's ever a different hypothetical mod that also wants to extend beehive functionality. I'd likely have to write in compatability with other mods on a case-by-case basis.

(The only other thing I've stumbled across is coremods and I am absolutely not going to touch core modding. xD If I can't do a thing without coremodding I am simply not going to do it.)

So, that said: what should I be doing here? Is replacing the vanilla entities with modded extensions typical, or is there a better solution?

Link to comment
Share on other sites

there is no definite answer.

for your case - bees - you need to investigate bee entity and bee hive and see what code is where.

investigate bee goals (or ai tasks). goals can be replaced with your own. or, maybe instead of removing original goal for finding flowers, you can just add your own and bee will sometimes use original code and sometimes your code for finding flowers.

and there are always events - when a bee entity is about to be spawned, you can decide you don't want that. store all the bee's data and cancel it being added to the world. then later (when it gets warmer or whatever), take the bees you stored and add them to the world yourself (when you deserialize their data, they'll know their hive location).... events can do wonders, but onlyu after you looked into the flow of original code.

Link to comment
Share on other sites

8 hours ago, diesieben07 said:

If there are no hooks in place for what you want to do, you can go down several routes.

  • Make a pull request into Forge if you think the hook could be useful for others as well.
  • Replace the vanilla objects
  • Just not alter vanilla things

Ah, hmm! I hadn't thought about adding a hook to Forge myself. I'll have to sit down and go through everything to figure out if there's a most generally useful approach that could use a new hook.

 

7 hours ago, MFMods said:

there is no definite answer.

for your case - bees - you need to investigate bee entity and bee hive and see what code is where.

investigate bee goals (or ai tasks). goals can be replaced with your own. or, maybe instead of removing original goal for finding flowers, you can just add your own and bee will sometimes use original code and sometimes your code for finding flowers.

and there are always events - when a bee entity is about to be spawned, you can decide you don't want that. store all the bee's data and cancel it being added to the world. then later (when it gets warmer or whatever), take the bees you stored and add them to the world yourself (when you deserialize their data, they'll know their hive location).... events can do wonders, but onlyu after you looked into the flow of original code.

I've already done all those things, but it's a good reminder to look at the original source. (Speaking of flow of original code, the changes I want to make are on the TileEntity for the hive, not the bee, but that's tangential.)

Although, when I was investigating the bee-goals angle, I couldn't find an easy way to replace or add AI goals without writing your own custom extension class? I don't need it for this, but if there's a hook for that, I'd love to learn what it is.

Link to comment
Share on other sites

So to summarize, it sounds like if I have a specific change in mind, the first step is to make absolutely sure there are no existing hooks that can do the thing, and then, if it's likely enough other people will want to modify the thing themselves to cause inter-mod compatability issues, I should look into making a forge hook PR everyone can use, and if it's not likely, then I don't really need to worry about it and can just replace them. Which is extremely reasonable.

p.s. Thanks to going back and reviewing all the stuff that is in Forge already, I think I got a solution involving cancelling the bee entity join event and re-adding the bee data to the hive as an alternative to changing the release conditions, so I shouldn't have to break into anything after all. It's kinda tricky to find the stuff I need to use as a fresh modder but I'm continually impressed by how Forge is put together to let you do stuff.

Edited by InspectorCaracal
added postscript
Link to comment
Share on other sites

This has nothing to do with the OP but it's a direct result of my previous post and I hate how I keep making new threads so I'm reusing this one >.>

I'm trying to implement my entity join event solution, but I'm stuck because I can't figure out how to check if a chunk is fully loaded or not. My searching turned up exactly one solution, which is for 1.14 and references World.getChunkProvider().isChunkLoaded(pos) - which doesn't appear to exist in 1.16

How do I check if a chunk is fully loaded in 1.16.x?

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 tried downloading forge and installing mods on my own, and it lead to crashes on start up. I have tried installing mods through curseforge to the same effect. I tried virtually every installation of forge that's available for 1.21, from forge 51.0.1-51.0.24. Either the game crashes when trying to load mods, or the game does not read the mods in my mod folder and runs like it was vanilla. I do not know what is causing the game to fail to recognize the mods. I installed forge from curseforge, and added the mods directly from cursed forge, and all of the mods are 1.21 compatible. in spite of that, it is still failing to load mods. what else could I do to get this fixed? the error loading the mods is "Error loading mods, 2 errors have occurred during loading" with each saying "Invalid mod file found." here is the crash log:   Time: 2024-07-15 13:18:49 Description: Mod loading error has occurred java.lang.Exception: Mod Loading has failed     at TRANSFORMER/[email protected]/net.minecraftforge.logging.CrashReportExtender.dumpModLoadingCrashReport(CrashReportExtender.java:49) ~[forge-1.21-51.0.24-universal.jar:?] {re:classloading}     at TRANSFORMER/[email protected]/net.minecraftforge.client.loading.ClientModLoader.completeModLoading(ClientModLoader.java:119) ~[forge-1.21-51.0.24-universal.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.lambda$new$7(Minecraft.java:616) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.Util.ifElse(Util.java:513) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.lambda$new$8(Minecraft.java:609) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraftforge.client.loading.ForgeLoadingOverlay.render(ForgeLoadingOverlay.java:146) ~[forge-1.21-51.0.24-universal.jar:?] {re:classloading}     at TRANSFORMER/[email protected]/net.minecraft.client.renderer.GameRenderer.render(GameRenderer.java:879) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.runTick(Minecraft.java:1180) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.run(Minecraft.java:795) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.main.Main.main(Main.java:228) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?] {}     at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?] {}     at SECURE-BOOTSTRAP/[email protected]/net.minecraftforge.fml.loading.targets.CommonLaunchHandler.runTarget(CommonLaunchHandler.java:91) ~[fmlloader-1.21-51.0.24.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/net.minecraftforge.fml.loading.targets.CommonLaunchHandler.lambda$makeService$0(CommonLaunchHandler.java:75) ~[fmlloader-1.21-51.0.24.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:77) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:97) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.Launcher.run(Launcher.java:116) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.Launcher.main(Launcher.java:75) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.BootstrapEntry.main(BootstrapEntry.java:17) [modlauncher-10.2.1.jar!/:?] {}     at [email protected]/net.minecraftforge.bootstrap.Bootstrap.moduleMain(Bootstrap.java:188) [bootstrap-2.1.3.jar!/:?] {}     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?] {}     at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?] {}     at net.minecraftforge.bootstrap.Bootstrap.bootstrapMain(Bootstrap.java:133) [bootstrap-2.1.3.jar:2.1.3] {}     at net.minecraftforge.bootstrap.Bootstrap.start(Bootstrap.java:53) [bootstrap-2.1.3.jar:2.1.3] {}     at net.minecraftforge.bootstrap.ForgeBootstrap.main(ForgeBootstrap.java:19) [bootstrap-2.1.3.jar:2.1.3] {} A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Render thread Suspected Mods: NONE Stacktrace:     at TRANSFORMER/[email protected]/net.minecraftforge.logging.CrashReportExtender.lambda$dumpModLoadingCrashReport$7(CrashReportExtender.java:52) ~[forge-1.21-51.0.24-universal.jar!/:?] {re:classloading} -- NO MOD INFO AVAILABLE -- Details:     Mod File: NO FILE INFO     Failure message: Invalid mod file found C:\Users\Danny\curseforge\minecraft\Instances\Magic - modded\mods\mahoutsukai-1.21.0-v1.35.2.jar     Mod Version: NO MOD INFO AVAILABLE     Mod Issue URL: NOT PROVIDED     Exception message: MISSING EXCEPTION MESSAGE Stacktrace:     at TRANSFORMER/[email protected]/net.minecraftforge.logging.CrashReportExtender.lambda$dumpModLoadingCrashReport$7(CrashReportExtender.java:52) ~[forge-1.21-51.0.24-universal.jar:?] {re:classloading}     at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) ~[?:?] {}     at TRANSFORMER/[email protected]/net.minecraftforge.logging.CrashReportExtender.dumpModLoadingCrashReport(CrashReportExtender.java:50) ~[forge-1.21-51.0.24-universal.jar:?] {re:classloading}     at TRANSFORMER/[email protected]/net.minecraftforge.client.loading.ClientModLoader.completeModLoading(ClientModLoader.java:119) ~[forge-1.21-51.0.24-universal.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.lambda$new$7(Minecraft.java:616) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.Util.ifElse(Util.java:513) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.lambda$new$8(Minecraft.java:609) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraftforge.client.loading.ForgeLoadingOverlay.render(ForgeLoadingOverlay.java:146) ~[forge-1.21-51.0.24-universal.jar:?] {re:classloading}     at TRANSFORMER/[email protected]/net.minecraft.client.renderer.GameRenderer.render(GameRenderer.java:879) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.runTick(Minecraft.java:1180) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.Minecraft.run(Minecraft.java:795) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at TRANSFORMER/[email protected]/net.minecraft.client.main.Main.main(Main.java:228) ~[forge-1.21-51.0.24-client.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?] {}     at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?] {}     at SECURE-BOOTSTRAP/[email protected]/net.minecraftforge.fml.loading.targets.CommonLaunchHandler.runTarget(CommonLaunchHandler.java:91) ~[fmlloader-1.21-51.0.24.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/net.minecraftforge.fml.loading.targets.CommonLaunchHandler.lambda$makeService$0(CommonLaunchHandler.java:75) ~[fmlloader-1.21-51.0.24.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:77) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:97) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.Launcher.run(Launcher.java:116) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.Launcher.main(Launcher.java:75) [modlauncher-10.2.1.jar!/:?] {}     at SECURE-BOOTSTRAP/[email protected]/cpw.mods.modlauncher.BootstrapEntry.main(BootstrapEntry.java:17) [modlauncher-10.2.1.jar!/:?] {}     at [email protected]/net.minecraftforge.bootstrap.Bootstrap.moduleMain(Bootstrap.java:188) [bootstrap-2.1.3.jar!/:?] {}     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?] {}     at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?] {}     at net.minecraftforge.bootstrap.Bootstrap.bootstrapMain(Bootstrap.java:133) [bootstrap-2.1.3.jar:2.1.3] {}     at net.minecraftforge.bootstrap.Bootstrap.start(Bootstrap.java:53) [bootstrap-2.1.3.jar:2.1.3] {}     at net.minecraftforge.bootstrap.ForgeBootstrap.main(ForgeBootstrap.java:19) [bootstrap-2.1.3.jar:2.1.3] {} -- NO MOD INFO AVAILABLE -- Details:     Mod File: NO FILE INFO     Failure message: Invalid mod file found C:\Users\Danny\curseforge\minecraft\Instances\Magic - modded\mods\waystones-neoforge-1.21-21.0.8.jar     Mod Version: NO MOD INFO AVAILABLE     Mod Issue URL: NOT PROVIDED     Exception message: MISSING EXCEPTION MESSAGE -- System Details -- Details:     Minecraft Version: 1.21     Minecraft Version ID: 1.21     Operating System: Windows 10 (amd64) version 10.0     Java Version: 21.0.3, Microsoft     Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Microsoft     Memory: 350197760 bytes (333 MiB) / 650117120 bytes (620 MiB) up to 4294967296 bytes (4096 MiB)     CPUs: 32     Processor Vendor: GenuineIntel     Processor Name: 13th Gen Intel(R) Core(TM) i9-13900K     Identifier: Intel64 Family 6 Model 183 Stepping 1     Microarchitecture: Raptor Lake     Frequency (GHz): 3.00     Number of physical packages: 1     Number of physical CPUs: 24     Number of logical CPUs: 32     Graphics card #0 name: NVIDIA GeForce GTX 1080 Ti     Graphics card #0 vendor: NVIDIA     Graphics card #0 VRAM (MiB): 11264.00     Graphics card #0 deviceId: VideoController1     Graphics card #0 versionInfo: 32.0.15.5612     Memory slot #0 capacity (MiB): 8192.00     Memory slot #0 clockSpeed (GHz): 3.20     Memory slot #0 type: DDR4     Memory slot #1 capacity (MiB): 8192.00     Memory slot #1 clockSpeed (GHz): 3.20     Memory slot #1 type: DDR4     Memory slot #2 capacity (MiB): 8192.00     Memory slot #2 clockSpeed (GHz): 3.20     Memory slot #2 type: DDR4     Memory slot #3 capacity (MiB): 8192.00     Memory slot #3 clockSpeed (GHz): 3.20     Memory slot #3 type: DDR4     Virtual memory max (MiB): 37441.13     Virtual memory used (MiB): 15153.36     Swap memory total (MiB): 4864.00     Swap memory used (MiB): 0.00     Space in storage for jna.tmpdir (MiB): available: 147541.50, total: 475918.38     Space in storage for org.lwjgl.system.SharedLibraryExtractPath (MiB): available: 147541.50, total: 475918.38     Space in storage for io.netty.native.workdir (MiB): available: 147541.50, total: 475918.38     Space in storage for java.io.tmpdir (MiB): available: 147541.50, total: 475918.38     Space in storage for workdir (MiB): available: 147541.50, total: 475918.38     JVM Flags: 4 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xss1M -Xmx4096m -Xms256m     ModLauncher: 10.2.1     ModLauncher launch target: forge_client     ModLauncher naming: mcp     ModLauncher services:          / slf4jfixer PLUGINSERVICE          / runtimedistcleaner PLUGINSERVICE          / runtime_enum_extender PLUGINSERVICE          / object_holder_definalize PLUGINSERVICE          / capability_token_subclass PLUGINSERVICE          / accesstransformer PLUGINSERVICE          / eventbus PLUGINSERVICE          / mixin PLUGINSERVICE          / fml TRANSFORMATIONSERVICE          / mixin TRANSFORMATIONSERVICE      FML Language Providers:          lowcodefml@51         [email protected]         [email protected]     Mod List:          forge-1.21-51.0.24-client.jar                     |Minecraft                     |minecraft                     |1.21                |NONE      |Manifest: NOSIGNATURE         forge-1.21-51.0.24-universal.jar                  |Forge                         |forge                         |51.0.24             |NONE      |Manifest: NOSIGNATURE
    • Re-add these one by one until you find the one causing this issue
    • i think removing all those helped, but i do need most of those mods.
  • Topics

×
×
  • Create New...

Important Information

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