Краш при регистрации пакета

Версия Minecraft
1.11.2
1,015
9
102
Пакеты сделаны по учебнику. Сервер выдает вот это:
Код:
Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/entity/EntityPlayerSP
 at java.lang.Class.getDeclaredConstructors0(Native Method) ~[?:1.8.0_131]
 at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) ~[?:1.8.0_131]
 at java.lang.Class.getConstructor0(Class.java:3075) ~[?:1.8.0_131]
 at java.lang.Class.newInstance(Class.java:412) ~[?:1.8.0_131]
 at net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper.instantiate(SimpleNetworkWrapper.java:171) ~[forgeSrc-1.11.2-13.20.1.2393.jar:?]
 at net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper.registerMessage(SimpleNetworkWrapper.java:164) ~[forgeSrc-1.11.2-13.20.1.2393.jar:?]
 at ru.minebot.extreme_energy.network.NetworkHandler.init(NetworkHandler.java:18) ~[McModdingUpd_main/:?]
 at ru.minebot.extreme_energy.ExtremeEnergy.Init(ExtremeEnergy.java:59) ~[McModdingUpd_main/:?]
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
 at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
 at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:649) ~[forgeSrc-1.11.2-13.20.1.2393.jar:?]
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
 at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
 at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
 at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:253) ~[LoadController.class:?]
 at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:231) ~[LoadController.class:?]
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
 at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
 at com.google.common.eventbus.EventSubscriber.handleEvent(EventSubscriber.java:74) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304) ~[guava-17.0.jar:?]
 at com.google.common.eventbus.EventBus.post(EventBus.java:275) ~[guava-17.0.jar:?]
 at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:148) ~[LoadController.class:?]
 at net.minecraftforge.fml.common.Loader.initializeMods(Loader.java:828) ~[Loader.class:?]
 at net.minecraftforge.fml.server.FMLServerHandler.finishServerLoading(FMLServerHandler.java:109) ~[FMLServerHandler.class:?]
 at net.minecraftforge.fml.common.FMLCommonHandler.onServerStarted(FMLCommonHandler.java:337) ~[FMLCommonHandler.class:?]
 at net.minecraft.server.dedicated.DedicatedServer.init(DedicatedServer.java:218) ~[DedicatedServer.class:?]
 at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:508) [MinecraftServer.class:?]
 at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

Network Handler
Код:
    public static final SimpleNetworkWrapper NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel("meemNetwork");
    private static int dec;

    public static void init() {
        NETWORK.registerMessage(PacketFieldCreator.class, PacketFieldCreator.class, dec++, Side.SERVER); // Вот на этой строке краш
        NETWORK.registerMessage(PacketFieldCreator.class, PacketFieldCreator.class, dec++, Side.CLIENT);
}

init вызываю в common proxy в init. Понятное дело, что сервер не может найти у себя класс EntityPlayerSP, но вроде его использование я не заметил
 
Решение
Жалуется на вот это, я фиксил такое у себя
Код:
 if(ctx.side == Side.SERVER)
       {
           System.out.println("PacketToServer");
           handleServerSide(message, ctx.getServerHandler().playerEntity);
       }
       else
       {
           System.out.println("PacketToClient");
           handleClientSide(message, FMLClientHandler.instance().getClientPlayerEntity());
       }


Фиксится созданием отдельного метода в прокси для получения игрока

Код:
public class CommonProxy {

public EntityPlayer getEntityPlayer (MessageContext ctx) {
return ctx.getServerHandler().playerEntity;
}

}

Код:
public class ClientProxy extends CommonProxy{

@Override
public EntityPlayer getEntityPlayer (MessageContext ctx) {
return ctx.side...
1,015
9
102
Ivasik написал(а):
Ну что же вы за Васи такие, а? Full code во первых, и во вторых не юзайте клиентского игрока!


Вот твой AbstractPacket
Код:
public abstract class AbstractPacket<REQ extends IMessage> implements IMessage, IMessageHandler<REQ, REQ>
{
    @Override
    public REQ onMessage(final REQ message, final MessageContext ctx)
    {
        if(ctx.side == Side.SERVER)
        {
            System.out.println("PacketToServer");
            handleServerSide(message, ctx.getServerHandler().playerEntity);
        }
        else
        {
            System.out.println("PacketToClient");
            handleClientSide(message, FMLClientHandler.instance().getClientPlayerEntity());
        }
        return null;
    }

    public abstract void handleClientSide(final REQ message, final EntityPlayer player);
    public abstract void handleServerSide(final REQ message, final EntityPlayer player);
}

Вот мой пакет:
Код:
public class PacketFieldCreator extends AbstractPacket<PacketFieldCreator> {
    protected BlockPos pos;
    protected int voltage;
    protected int radius;

    public PacketFieldCreator(){}

    public PacketFieldCreator(BlockPos pos, int voltage, int radius){
        this.pos = pos;
        this.voltage = voltage;
        this.radius = radius;
    }

    @Override
    public void toBytes(final ByteBuf buf) {

        buf.writeInt(radius);
        buf.writeInt(voltage);
        buf.writeInt(pos.getX());
        buf.writeInt(pos.getY());
        buf.writeInt(pos.getZ());
    }

    @Override
    public void fromBytes(final ByteBuf buf) {
        radius = buf.readInt();
        voltage = buf.readInt();
        int m, n, b;
        m = buf.readInt();
        n = buf.readInt();
        b = buf.readInt();
        pos = new BlockPos(m, n, b);
    }

    @Override
    public void handleClientSide(PacketFieldCreator message, EntityPlayer player) {
    }

    @Override
    public void handleServerSide(PacketFieldCreator message, EntityPlayer player) {
        try {
            IFieldCreatorEnergy te = ((IFieldCreatorEnergy) player.world.getTileEntity(message.pos));
            te.setRadius(message.radius);
            te.setVoltage(message.voltage);
        }
        catch (ClassCastException e){
            IFieldCreator te = ((IFieldCreator) player.world.getTileEntity(message.pos));
            te.setRadius(message.radius);
        }
    }
}

Вот твой хандлер:
Код:
public class NetworkHandler
{
    // NetworkName - название канала
    public static final SimpleNetworkWrapper NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel("meemNetwork");
    private static int dec;

    public static void init() {
        NETWORK.registerMessage(PacketFieldCreator.class, PacketFieldCreator.class, dec++, Side.SERVER);
        NETWORK.registerMessage(PacketFieldCreator.class, PacketFieldCreator.class, dec++, Side.CLIENT);
    }

    //Метод который отправляет пакеты всем на клиенте/сервере(Зависит от ситуации)
    public static void sendToAll(final IMessage message) {
        NETWORK.sendToAll(message);
    }
    //Метод который отправляет пакет конкретному игроку.
    public static void sendTo(final IMessage message, final EntityPlayerMP player) {
        NETWORK.sendTo(message, player);
    }
    //Наш пользовательский метод, который использует LocationDoublePacket для упрощения отправки пакетов методом sendToAllAround.
    public static void sendToAllAround(final LocationDoublePacket message, final World world) {
        sendToAllAround(message, message.getTargetPoint(world));
    }
    //Метод который отправляет пакет всем игрокам от отправителя, в определённом радиусе.
    public static void sendToAllAround(final IMessage message, final NetworkRegistry.TargetPoint point) {
        NETWORK.sendToAllAround(message, point);
    }
    //Метод который отправляет пакет в определённое измерение.
    public static void sendToDimension(final IMessage message, final int dimensionId) {
        NETWORK.sendToDimension(message, dimensionId);
    }
    //Метод который отправляет пакет на сервер.
    public static void sendToServer(final IMessage message){
        NETWORK.sendToServer(message);
    }
}
 
1,015
9
102
Thunder написал(а):
Клиентского игрока у меня нигде нет. Перешел на другу пакетную систему, код в пакетах аналогичный, работает прекрасно, для меня проблема исчерпалась

Что за "другая пакетная система"? Это случайно не это?
 
216
6
19
Жалуется на вот это, я фиксил такое у себя
Код:
 if(ctx.side == Side.SERVER)
       {
           System.out.println("PacketToServer");
           handleServerSide(message, ctx.getServerHandler().playerEntity);
       }
       else
       {
           System.out.println("PacketToClient");
           handleClientSide(message, FMLClientHandler.instance().getClientPlayerEntity());
       }


Фиксится созданием отдельного метода в прокси для получения игрока

Код:
public class CommonProxy {

public EntityPlayer getEntityPlayer (MessageContext ctx) {
return ctx.getServerHandler().playerEntity;
}

}

Код:
public class ClientProxy extends CommonProxy{

@Override
public EntityPlayer getEntityPlayer (MessageContext ctx) {
return ctx.side == Side.CLIENT ? Minecraft.getMinecraft().thePlayer : super.getEntityPlayer(ctx);
}

}
 
Сверху