Не находит класс при вызове GUI

Версия Minecraft
1.6.4
355
2
17
Добро! Я крабожук и что-то сломал, не могу понять конкретно что.
В MCP при дебагге все четко работает, но после recompile/reobfuscate и закинув мод в чистый клиент+форж начинает крашить при вызове GUI.

Классы при этом присутствуют, если проверять через jd-gui все пути тоже верные. Куда могут пропадать эти классы? :unsure:

Java:
java.lang.NoClassDefFoundError: net/example/client/ui/GuiRpgInventory
    at net.example.common.handler.GUIHandler.getClientGuiElement(GUIHandler.java:91)
    at cpw.mods.fml.common.network.NetworkRegistry.openLocalGui(NetworkRegistry.java:328)
    at cpw.mods.fml.common.network.FMLNetworkHandler.openGui(FMLNetworkHandler.java:357)
    at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2480)
    at cpw.mods.fml.common.network.OpenGuiPacket.execute(OpenGuiPacket.java:67)
    at cpw.mods.fml.common.network.FMLNetworkHandler.handleFMLPacket(FMLNetworkHandler.java:116)
    at cpw.mods.fml.common.network.FMLNetworkHandler.handlePacket250Packet(FMLNetworkHandler.java:81)
    at net.minecraft.client.multiplayer.NetClientHandler.func_72501_a(NetClientHandler.java:1651)
    at net.minecraft.network.packet.Packet250CustomPayload.func_73279_a(SourceFile:61)
    at net.minecraft.network.TcpConnection.func_74428_b(TcpConnection.java:462)
    at net.minecraft.client.multiplayer.NetClientHandler.func_72551_d(NetClientHandler.java:281)
    at net.minecraft.client.multiplayer.WorldClient.func_72835_b(WorldClient.java:99)
    at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1930)
    at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:910)
    at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:838)
    at net.minecraft.client.main.Main.main(SourceFile:101)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:131)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:27)
Caused by: java.lang.ClassNotFoundException: net.example.client.ui.GuiRpgInventory
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:186)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 22 more
Caused by: java.lang.NoClassDefFoundError: net/example/client/ui/AbstractContainerUI
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:178)
    ... 24 more
Caused by: java.lang.ClassNotFoundException: net.example.client.ui.AbstractContainerUI
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:97)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 28 more


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
    at net.example.common.handler.GUIHandler.getClientGuiElement(GUIHandler.java:91)
    at cpw.mods.fml.common.network.NetworkRegistry.openLocalGui(NetworkRegistry.java:328)
    at cpw.mods.fml.common.network.FMLNetworkHandler.openGui(FMLNetworkHandler.java:357)
    at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2480)
    at cpw.mods.fml.common.network.OpenGuiPacket.execute(OpenGuiPacket.java:67)
    at cpw.mods.fml.common.network.FMLNetworkHandler.handleFMLPacket(FMLNetworkHandler.java:116)
    at cpw.mods.fml.common.network.FMLNetworkHandler.handlePacket250Packet(FMLNetworkHandler.java:81)
    at net.minecraft.client.multiplayer.NetClientHandler.func_72501_a(NetClientHandler.java:1651)
    at net.minecraft.network.packet.Packet250CustomPayload.func_73279_a(SourceFile:61)
    at net.minecraft.network.TcpConnection.func_74428_b(TcpConnection.java:462)
    at net.minecraft.client.multiplayer.NetClientHandler.func_72551_d(NetClientHandler.java:281)

Лишнее вырезал, оставил только кейс куда ведет ошибка.

Код:
package net.example.common.handler;

import cpw.mods.fml.common.network.IGuiHandler;
import net.example.client.ui.GuiRpgInventory;
import net.example.common.ExtendedPlayer;
import net.example.common.inventory.container.RPGContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class GUIHandler
        implements IGuiHandler
{
   
    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
    {
        ExtendedPlayer extendedPlayer = ExtendedPlayer.get(player);

        switch (ID)
        {
            case 2:
                return new GuiRpgInventory(player, new RPGContainer(player, player.inventory, extendedPlayer.getInventory(), extendedPlayer.getInventoryQuests()));
        }

        return null;
    }
}
 
Последнее редактирование:

timaxa007

Модератор
5,831
409
672
@Sunrise, если я и сталкивался, то старался сразу-же исправлять. Но у тебя написано-же:
Класс не найден.
Была у тебя полная сборка или нет. Если нет, то сделай так что, чужой мод загружался раньше твоего мода.
Точного совета вред-ли будет, без самого кода.
 
3,005
192
592
обычно появляется, если пытаться выполнить чисто клиентский код на сервере.
На сколько я вижу, он юзает метод IGuiHandler#getClientGuiElement, где в названии уже говориться, что это должно вызываться на клиенте.

@Sunrise Попробуй повесить "@SideOnly(Side.CLIENT)" на метод.
Если не получится, попробуй разделить IGuiHandler на 2 стороны через прокси.
Типо в клиент прокси обработка клиента, в сервер прокси обработка сервера.
 

timaxa007

Модератор
5,831
409
672
@Sasha68, если при этом в ошибке при этом было про это дополнительно написано, что данный код не выполним на стороне SERVER.
А он пытается открыть GuiRpgInventory, который якобы нет такого класса:
java.lang.NoClassDefFoundError: net/example/client/ui/GuiRpgInventory
И ещё при этом нету класса AbstractContainerUI.
Caused by: java.lang.NoClassDefFoundError: net/example/client/ui/AbstractContainerUI
---
"@SideOnly(Side.CLIENT)" на метод.
А так-же на класс GuiRpgInventory.
---
@Sunrise, так-же убедись, что ты из нужной папки берёшь компилированный/обуфицированный код код.
 
355
2
17
@timaxa007, пробовал раскидывать сайды на методы и на клиентские классы. После компиляции/обфускации весь нужный мне код из reobf/ закидываю сразу в джарник, все как полагается по свойственным пакетам, весь остальной функционал работает, в том числе и другие GuiScreen, а вот этот GUI чет отказывается пыхтеть.

Ранее такая же структура была и все работало, GUIHandler разбит на клиент/сервер, в каждом из прокси регистрируется сам хэндлер.

AbstractContainerUI это расширение обычного GuiContainer, по-сути с оверайдом всех методов, его потом по-сути и наследует GuiRpgInventory

При загрузке никаких крашей или же ошибок инициализации с данными классами нет.

Какой еще момент я упускаю?
 
355
2
17
Методом тыка-перетыка понял, что причина кроется в AbstractContainerUI, но не совсем понятно почему так.
Этот класс по сути полный овверайд GuiContainer, только изменены местами модификаторы доступа и местами добавлена прозрачность и прочие микро изменения в самом дизайне тултипа.


Java:
package net.example.client.gui;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.example.client.renderer.ItemOverlayRenderer;
import net.example.common.inventory.slot.ISlot;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.Icon;
import net.minecraft.util.MathHelper;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

import java.util.*;

@SideOnly(Side.CLIENT)
public abstract class AbstractContainerUI
        extends GuiContainer
{

    public int width;
    public int height;

    public int xSize = 176;
    public int ySize = 166;

    public int guiLeft;
    public int guiTop;

    public Slot theSlot;

    public Slot clickedSlot;

    public boolean isRightMouseClick;

    public ItemStack draggedStack;
    public int field_85049_r;
    public int field_85048_s;
    public Slot returningStackDestSlot;
    public long returningStackTime;

    public ItemStack returningStack;
    public Slot field_92033_y;
    public long field_92032_z;
    public final Set field_94077_p = new HashSet();
    public boolean field_94076_q;
    public int field_94071_C;
    public int field_94067_D;
    public boolean field_94068_E;
    public int field_94069_F;
    public long field_94070_G;
    public Slot field_94072_H;
    public int field_94073_I;
    public boolean field_94074_J;
    public ItemStack field_94075_K;
   
    private GuiButton selectedButton;
    private int eventButton;
    private long lastMouseEvent;
    private int field_92018_d;

    public AbstractContainerUI(Container container)
    {
        super(container);
        this.allowUserInput = true;
    }

    .... все те же методы из GuiContainer ...
}

Возможно так делать нельзя, но почему тогда в среде работает?
 
Сверху