Non résolu Capabilities internal server error et non persistance
-
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.
-
Le soucis est que fj.sync(event.player); est null mais je comprend pas pourquoi.
-
Bonsoir,
Vérifie que ton événement attachCapability est bien appelé
-
@robin4002 Je check ça de suite.
-
@robin4002 T’as raison il est meme pas appelé.
-
et j’ai rien dans la console
-
@robin4002 My bad c’est bien appelé
ça c’est au démarrage du serveur mais j’ai rien quand le client se connecte.
-
Et après le if, ça passe toujours ?
-
@robin4002 Oui.
-
@robin4002 Tu veux rigoler? J’ai fais quasiment aucune modif et là j’arrive à me connecter au serveur. Par contre la donnée n’est pas persistante.
-
@Sultan Quand je relance le client ça revient à la donné de base.
-
@Sultan Je crois que c’est dû au fait que dû au fait qu’a chaque fois que je démarre mon client de test ça me change de nom, uèn coup c’est Player665 un coup c’est Player338 etc etc
-
@Sultan Bonjour, alors voici un feedback maintenant que le problème est réglé. Le soucis était qu’à chaque lancement de mon client j’avais un nouveau pseudo donc un nouveau client qui se connectait au serveur donc c’était ça le problème, maintenant j’ai testé de lancer le serveur depuis mon projet intellij et de lancer un client avec le launcher officiel de minecraft et c’est tout bon ça fonctionne à la perfection et donc les données sont bien persistantes. Manque pu qu’à voir comment je pourrais faire pour que le client n’ai pas un pseudo aléatoire.
-
Il faut ajouter un argument
--username <pseudo>
dans les arguments de lancement du jeu. -
@robin4002 a dit dans Capabilities internal server error et non persistance :
–username <pseudo>
Ok merci beaucoup pour ton aide
-
@Sultan J’ai une dernière question, comment je pourrais m’y prendre pour que mon firstjoin ouvre un gui a un joueur? Sachant que le gui ne contient aucun slot ou info devant être communiquée au serveur.
-
tu peux envoyer un paquet vide au client et dans l’handler du paquet côté client tu ouvres le gui.
-
@robin4002 Ok merci je vais check ça.
-
@robin4002 Alors je reçoit bien le packet mais ça n’affiche pas le gui…
-
@Sultan Je viens de chack et ça n’enclenche meme pas le displayguiscreen…