Jump to content

Recommended Posts

Posted

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

Posted

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
}

}

 

 

Posted

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.

Posted

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.

Posted

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.

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



×
×
  • Create New...

Important Information

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