Posted February 9, 201510 yr So I made this mod and it works fine as a client mod, but it crashes a forge server if you try to load a server with it. Here is the crash log: ---- Minecraft Crash Report ---- // You're mean. Time: 09/02/15 14:58 Description: Exception in server tick loop net.minecraftforge.fml.common.LoaderException: java.lang.NoClassDefFoundError: net/minecraft/client/Minecraft at net.minecraftforge.fml.common.LoadController.transition(LoadController.java:162) at net.minecraftforge.fml.common.Loader.initializeMods(Loader.java:693) at net.minecraftforge.fml.server.FMLServerHandler.finishServerLoading(FMLServerHandler.java:97) at net.minecraftforge.fml.common.FMLCommonHandler.onServerStarted(FMLCommonHandler.java:327) at net.minecraft.server.dedicated.DedicatedServer.startServer(DedicatedServer.java:210) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:438) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/Minecraft at ultimatedillon.haggis.BlocksItems.InitItems(BlocksItems.java:23) at ultimatedillon.haggis.HaggisMain.load(HaggisMain.java:32) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:515) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) at com.google.common.eventbus.EventBus.post(EventBus.java:275) at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:208) at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:187) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) at com.google.common.eventbus.EventBus.post(EventBus.java:275) at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:118) at net.minecraftforge.fml.common.Loader.initializeMods(Loader.java:692) ... 5 more Caused by: java.lang.ClassNotFoundException: net.minecraft.client.Minecraft at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 34 more Caused by: java.lang.RuntimeException: Attempted to load class net/minecraft/client/Minecraft for invalid side SERVER at net.minecraftforge.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:49) at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ... 36 more A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details: Minecraft Version: 1.8 Operating System: Windows 8.1 (amd64) version 6.3 Java Version: 1.7.0_60, Oracle Corporation Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 937323112 bytes (893 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP v9.10 FML v8.0.26.1299 Minecraft Forge 11.14.0.1299 4 mods loaded, 4 mods active mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized FML{8.0.26.1299} [Forge Mod Loader] (forgeSrc-1.8-11.14.0.1299.jar) Unloaded->Constructed->Pre-initialized->Initialized Forge{11.14.0.1299} [Minecraft Forge] (forgeSrc-1.8-11.14.0.1299.jar) Unloaded->Constructed->Pre-initialized->Initialized haggismod{1.4.1} [AWH Haggis Mod!] (bin) Unloaded->Constructed->Pre-initialized->Errored Profiler Position: N/A (disabled) Is Modded: Definitely; Server brand changed to 'fml,forge' Type: Dedicated Server (map_server.txt) I can figure that the cause is a NoClassDefFoundError, but I cannot figure out how to fix it. I read something about classpath but I have only worked within the Eclipse environment and am unsure how to handle this. Any help would be great. UltimateDillon
February 9, 201510 yr You ake use of the Minecraft class somewhere, which doesnt exist on servers. Put a @SideOnly(Side.CLIENT) above the method you use it.
February 9, 201510 yr Well, i dont know of any other way of getting rid of a side specific reference, and i just know about the stuff i did, where it did work.
February 9, 201510 yr Author @SidedProxy is your friend. How would I go about using @SidedProxy in this instance?
February 9, 201510 yr Author Put client-only code in your client proxy. Would this include initializing and creating items? AKA everything in my BlocksItems class.
February 9, 201510 yr Author No, of course not. It's pretty simple: if a class or method or field that you use has @SideOnly(CLIENT) you can only use it from within your ClientProxy. I know this isn't supposed to be Java class but it's been a while since I wrote this code and I'm unsure which code should be used in ClientProxy, which is empty right now. At the minute, the creation and setup of all items and textures is done in BlocksItems.class which is called in my main class in public void load(FMLInitializationEvent event) Some of my confusion is based on the fact that this problem exists because I want the mod to be able to be included in a Forge server for multiple people to use it, and for mobs to still drop specific items on the server. Thanks. EDIT: This is my BlocksItems class: package ultimatedillon.haggis; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemModelMesher; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; public class BlocksItems { private static ItemModelMesher itemMesher; public static ItemFood raw_haggis; public static ItemFood cooked_haggis; public static ItemFood golden_haggis; public static Item sheep_stomach; public static void InitItems() { itemMesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher(); raw_haggis = new ItemFood(3, 0.3F, false); cooked_haggis = new ItemFood(8, 0.8F, false); golden_haggis = new ItemFood(20, 1.0F, false); sheep_stomach = new Item(); itemMesher.register(raw_haggis, 0, new ModelResourceLocation("haggismod:raw_haggis", "inventory")); raw_haggis.setUnlocalizedName("raw_haggis") .setMaxStackSize(64) .setCreativeTab(CreativeTabs.tabFood); itemMesher.register(cooked_haggis, 0, new ModelResourceLocation("haggismod:cooked_haggis", "inventory")); cooked_haggis.setUnlocalizedName("cooked_haggis") .setMaxStackSize(64) .setCreativeTab(CreativeTabs.tabFood); itemMesher.register(golden_haggis, 0, new ModelResourceLocation("haggismod:golden_haggis", "inventory")); golden_haggis.setUnlocalizedName("golden_haggis") .setMaxStackSize(64) .setCreativeTab(CreativeTabs.tabFood); itemMesher.register(sheep_stomach, 0, new ModelResourceLocation("haggismod:sheep_stomach", "inventory")); sheep_stomach.setUnlocalizedName("sheep_stomach") .setMaxStackSize(64) .setCreativeTab(CreativeTabs.tabMisc); raw_haggis.setPotionEffect(Potion.hunger.id, 30, 0, 0.3F); golden_haggis.setPotionEffect(Potion.regeneration.id, 8, 0, 1.0F); GameRegistry.registerItem(raw_haggis, "raw_haggis"); GameRegistry.registerItem(cooked_haggis, "cooked_haggis"); GameRegistry.registerItem(golden_haggis, "golden_haggis"); GameRegistry.registerItem(sheep_stomach, "sheep_stomach"); GameRegistry.addShapelessRecipe(new ItemStack(raw_haggis), new ItemStack(Items.wheat), new ItemStack(sheep_stomach), new ItemStack(Items.mutton)); GameRegistry.addShapelessRecipe(new ItemStack(raw_haggis), new ItemStack(Items.wheat), new ItemStack(sheep_stomach), new ItemStack(Items.cooked_mutton)); GameRegistry.addRecipe(new ItemStack(golden_haggis), new Object[] { "XXX", "XHX", "XXX", 'X', Items.gold_nugget, 'H', cooked_haggis }); GameRegistry.addSmelting(raw_haggis, new ItemStack(cooked_haggis), 0.35F); } public void InitBlocks() { //Stub Method } }
February 9, 201510 yr Author All the ItemMesher stuff goes in the client-proxy, as that is rendering and thus not available and not needed on a Server. Put it in the ClientProxy. Thank you, that seemed to fix the problem of it crashing the server. For future reference, does this mean that any code that should only be run on the server goes in CommonProxy? Thanks.
February 9, 201510 yr Author No, @SidedProxy distinguishes between Client and Dedicated Server. The Integrated Server (Singleplayer) will use the ClientProxy! If you want to check client vs. server use world.isRemote. Getting too confusing now. I tested this on a dedicated server rather than LAN.
February 9, 201510 yr Author Basically: Do not use @SidedProxy to distinguish what to do. If you have a method in your ClientProxy, you can only call it if isRemote is true, so you are actually on the client (or from the init methods like preInit of course). Maybe I'll understand it one day. But for now, if it works, I'm good. lol
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.