16 juin 2023, 13:46

Bonjour, je met en ligne ce post car j’essaye de faire un système de first join au serveur avec mon mod. Le soucis est que quand je j’arrive pas à me connecter au serveur, ça me dit internal serveur error : at net.sultan.tonation.capabilities.EventHandler.onPlayerLoggedIn(EventHandler.java:42) ~[EventHandler.class:?]

Je pense que sinon, avec le code que j’ai, la capability first_join devrait-être persistante au démarrage du serveur.

class first join

package net.sultan.tonation.capabilities.capabilities;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.sultan.tonation.capabilities.tonation;

public class FirstJoin implements IFirstJoin{
    public int first_join;

    public FirstJoin()
    {

    }

    public FirstJoin(int i)
    {
        this.first_join = i;
    }

    @Override
    public void setFirstJoin()
    {
        this.first_join = 0;
    }

    @Override
    public int isFirstConnection()
    {
        return this.first_join;
    }

    @Override
    public void sync(EntityPlayer player) //sync data between player and server
    {
        FirstJoinPacket packet = new FirstJoinPacket(first_join);

        if(!player.world.isRemote)
        {
            System.out.println("sync, isRemote ? : no, send to player");
            EntityPlayerMP playerMP = (EntityPlayerMP)player;
            tonation.network.sendTo(packet, playerMP);
        }
        else
        {
            System.out.println("sync, isRemote ? : yes, send to server");
            tonation.network.sendToServer(packet);
        }
    }
}

class firstjoinpack

package net.sultan.tonation.capabilities.capabilities;

import io.netty.buffer.ByteBuf;
import net.minecraft.client.Minecraft;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class FirstJoinPacket implements IMessage {
    public int first_join;

    public FirstJoinPacket(int fj)
    {
        this.first_join = fj;
    }

    public FirstJoinPacket()
    {

    }

    @Override
    public void fromBytes(ByteBuf buf) {
        first_join = buf.readInt();
    }

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(first_join);
    }

    public static class ServerHandler implements IMessageHandler<FirstJoinPacket, IMessage> {

        @Override
        public IMessage onMessage(FirstJoinPacket message, MessageContext ctx)
        {
            System.out.println("Packet recu serveur, firstjoin = " + message.first_join);

            ctx.getServerHandler().player.getServerWorld().addScheduledTask(new ScheduledPacketTask(ctx.getServerHandler().player, message));
            return null;
        }

    }

    @SideOnly(Side.CLIENT)
    public static class ClientHandler implements IMessageHandler <FirstJoinPacket, IMessage>{

        @Override
        public IMessage onMessage(FirstJoinPacket message, MessageContext ctx)
        {
            System.out.println("Packet recu client, firstjoin = " + message.first_join);
            Minecraft.getMinecraft().addScheduledTask(new ScheduledPacketTask(null, message));
            return null;
        }
    }
}

class firstjoinprovider

package net.sultan.tonation.capabilities.capabilities;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.INBTSerializable;
import net.sultan.tonation.capabilities.tonation;

public class FirstJoinProvider implements ICapabilityProvider, INBTSerializable<NBTTagCompound>
{
        protected IFirstJoin firstJoin;
        protected EntityPlayer player;

        @Override
        public NBTTagCompound serializeNBT() {
                return (NBTTagCompound) tonation.FIRST_JOIN_CAP.writeNBT(this.firstJoin, null);
        }

        @Override
        public void deserializeNBT(NBTTagCompound nbt) {
                tonation.FIRST_JOIN_CAP.readNBT(this.firstJoin, null, nbt);
        }

        @Override
        public boolean hasCapability(Capability<?> capability, EnumFacing facing)
        {
                return tonation.FIRST_JOIN_CAP != null && capability == tonation.FIRST_JOIN_CAP;
        }

        @Override
        public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
                return this.hasCapability(capability, facing) ? tonation.FIRST_JOIN_CAP.cast(this.firstJoin) : null;
        }

        public static void register()
        {
                CapabilityManager.INSTANCE.register(IFirstJoin.class, new FirstJoinStorage(), FirstJoin::new);
        }

        public FirstJoinProvider(EntityPlayer player)
        {
                this.firstJoin  = new FirstJoin(1);
                this.player = player;
        }

        public IFirstJoin getFirstJoinObj()
        {
                return firstJoin;
        }
}

class firstjoinstorage

package net.sultan.tonation.capabilities.capabilities;

import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.Capability.IStorage;

public class FirstJoinStorage implements IStorage<IFirstJoin> {
    @Override
    public NBTBase writeNBT(Capability<IFirstJoin> capability, IFirstJoin instance, EnumFacing side)
    {
        NBTTagCompound nbt = new NBTTagCompound();
        nbt.setInteger("first_join", instance.isFirstConnection());
        return nbt;
    }

    @Override
    public void readNBT(Capability<IFirstJoin> capability, IFirstJoin instance, EnumFacing side, NBTBase base)
    {
        if(base instanceof NBTTagCompound) {
            NBTTagCompound nbt = (NBTTagCompound)base;
            instance.setFirstJoin();
        }
    }
}

class ifirstjoin

package net.sultan.tonation.capabilities.capabilities;

import net.minecraft.entity.player.EntityPlayer;

public interface IFirstJoin {
    public void setFirstJoin();
    public int isFirstConnection();
    public void sync(EntityPlayer player);
}

class scheduledpackettask

package net.sultan.tonation.capabilities.capabilities;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.sultan.tonation.capabilities.tonation;

public class ScheduledPacketTask implements Runnable
{
    private EntityPlayer player;
    private FirstJoinPacket message;

    public ScheduledPacketTask(EntityPlayer player, FirstJoinPacket message)
    {
        this.player = player;
        this.message = message;
    }

    @Override
    public void run()
    {
        EntityPlayer player = this.player == null ? getPlayer() : this.player;
        player.getCapability(tonation.FIRST_JOIN_CAP, null).setFirstJoin();
    }

    @SideOnly(Side.CLIENT)
    private EntityPlayer getPlayer()
    {
        return Minecraft.getMinecraft().player;
    }
}

class eventhandler (gestion des évènements)

package net.sultan.tonation.capabilities;

import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
import net.sultan.tonation.capabilities.capabilities.FirstJoinProvider;
import net.sultan.tonation.capabilities.capabilities.IFirstJoin;

@Mod.EventBusSubscriber
public class EventHandler {
    public static final ResourceLocation FIRST_JOIN_CAP = new ResourceLocation(tonation.MODID, "first_join");

    @SubscribeEvent
    public void attachCapability(AttachCapabilitiesEvent<Entity> event)
    {
        Entity entity = event.getObject();

        if(!(entity instanceof EntityPlayer));
        event.addCapability(FIRST_JOIN_CAP, new FirstJoinProvider((EntityPlayer)entity));
    }

    @SubscribeEvent
    public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event)
    {
        if(!event.player.world.isRemote)
        {
            event.player.getCapability(tonation.FIRST_JOIN_CAP, null).sync(event.player);
        }
    }

    @SubscribeEvent
    public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event)
    {
        EntityPlayer player = event.player;
        IFirstJoin fj = player.getCapability(tonation.FIRST_JOIN_CAP, null);
        fj.sync(player);

        if(fj.isFirstConnection() == 1){
            String message = String.format("Here is your first connection!", (int) fj.isFirstConnection());
            player.sendMessage(new TextComponentString(message));
        }
        else{
            player.sendMessage(new TextComponentString("Hello back bud!"));
        }
        player.getCapability(tonation.FIRST_JOIN_CAP, null).setFirstJoin();
    }
}

class tonation (classe principale)

package net.sultan.tonation.capabilities;

import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import net.minecraftforge.fml.relauncher.Side;
import net.sultan.tonation.capabilities.capabilities.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Mod(modid = tonation.MODID, name = tonation.NAME, version = tonation.VERSION)
public class tonation
{
    @CapabilityInject(IFirstJoin.class)
    public static final Capability<IFirstJoin> FIRST_JOIN_CAP = null;

    public static final String MODID = "tonation";
    public static final String NAME = "TonationMod";
    public static final String VERSION = "1.0";
    public static Logger LOGGER = LogManager.getLogger();
    public static SimpleNetworkWrapper network;

    /*@SidedProxy(clientSide = "net.sultan.tonation.capabilities.CommonProxy", serverSide = "net.sultan.tonation.capabilities.CommonProxy")
    public static CommonProxy proxy;*/

    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
        //Register network max range 255
        network = NetworkRegistry.INSTANCE.newSimpleChannel("tonation");

        //Server processing
        network.registerMessage(FirstJoinPacket.ServerHandler.class, FirstJoinPacket.class, 1, Side.SERVER);

        if(event.getSide() != Side.SERVER)
        {
            //Client processing
            network.registerMessage(FirstJoinPacket.ClientHandler.class, FirstJoinPacket.class, 0, Side.CLIENT);
        }
        LOGGER = event.getModLog();
    }

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
        //proxy.init();
        FirstJoinProvider.register();
        LOGGER.info("LOGGER NAME : ", LOGGER.getName());
    }
}

Merci d’avance pour votre aide, je suis sûr qu’il y a quelque-chose qui m’a échappé et qu’il s’agit de trois fois rien.