MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Capabilities internal server error et non persistance

    Planifier Épinglé Verrouillé Déplacé Non résolu Support pour les moddeurs
    1.12.2
    25 Messages 2 Publieurs 1.5k Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • SultanS Hors-ligne
      Sultan
      dernière édition par

      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.

      SultanS 1 réponse Dernière réponse Répondre Citer 0
      • SultanS Hors-ligne
        Sultan @Sultan
        dernière édition par

        Le soucis est que fj.sync(event.player); est null mais je comprend pas pourquoi.

        1 réponse Dernière réponse Répondre Citer 0
        • robin4002R Hors-ligne
          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
          dernière édition par

          Bonsoir,

          Vérifie que ton événement attachCapability est bien appelé

          SultanS 4 réponses Dernière réponse Répondre Citer 0
          • SultanS Hors-ligne
            Sultan @robin4002
            dernière édition par

            @robin4002 Je check ça de suite.

            1 réponse Dernière réponse Répondre Citer 0
            • SultanS Hors-ligne
              Sultan @robin4002
              dernière édition par

              @robin4002 T’as raison il est meme pas appelé.

              1 réponse Dernière réponse Répondre Citer 0
              • SultanS Hors-ligne
                Sultan @robin4002
                dernière édition par

                @robin4002 fa748c46-faff-4431-9137-d568c4b0363f-image.png

                et j’ai rien dans la console

                1 réponse Dernière réponse Répondre Citer 0
                • SultanS Hors-ligne
                  Sultan @robin4002
                  dernière édition par Sultan

                  @robin4002 My bad c’est bien appelé 7398c618-7c32-42fb-b76d-bffdab2d6f50-image.png

                  ça c’est au démarrage du serveur mais j’ai rien quand le client se connecte.

                  1 réponse Dernière réponse Répondre Citer 0
                  • robin4002R Hors-ligne
                    robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                    dernière édition par

                    Et après le if, ça passe toujours ?

                    SultanS 2 réponses Dernière réponse Répondre Citer 0
                    • SultanS Hors-ligne
                      Sultan @robin4002
                      dernière édition par

                      @robin4002 Oui.

                      1 réponse Dernière réponse Répondre Citer 0
                      • SultanS Hors-ligne
                        Sultan @robin4002
                        dernière édition par

                        @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.

                        SultanS 1 réponse Dernière réponse Répondre Citer 0
                        • SultanS Hors-ligne
                          Sultan @Sultan
                          dernière édition par

                          @Sultan Quand je relance le client ça revient à la donné de base.

                          SultanS 1 réponse Dernière réponse Répondre Citer 0
                          • SultanS Hors-ligne
                            Sultan @Sultan
                            dernière édition par

                            @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

                            SultanS 1 réponse Dernière réponse Répondre Citer 0
                            • SultanS Hors-ligne
                              Sultan @Sultan
                              dernière édition par

                              @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.

                              1 réponse Dernière réponse Répondre Citer 0
                              • robin4002R Hors-ligne
                                robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                dernière édition par

                                Il faut ajouter un argument --username <pseudo> dans les arguments de lancement du jeu.

                                SultanS 1 réponse Dernière réponse Répondre Citer 0
                                • SultanS Hors-ligne
                                  Sultan @robin4002
                                  dernière édition par

                                  @robin4002 a dit dans Capabilities internal server error et non persistance :

                                  –username <pseudo>

                                  Ok merci beaucoup pour ton aide 🙂

                                  SultanS 1 réponse Dernière réponse Répondre Citer 0
                                  • SultanS Hors-ligne
                                    Sultan @Sultan
                                    dernière édition par

                                    @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. def9cb79-0743-4bdb-bfa1-14422068a84a-image.png

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • robin4002R Hors-ligne
                                      robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                                      dernière édition par

                                      tu peux envoyer un paquet vide au client et dans l’handler du paquet côté client tu ouvres le gui.

                                      SultanS 2 réponses Dernière réponse Répondre Citer 0
                                      • SultanS Hors-ligne
                                        Sultan @robin4002
                                        dernière édition par

                                        @robin4002 Ok merci je vais check ça.

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • SultanS Hors-ligne
                                          Sultan @robin4002
                                          dernière édition par

                                          @robin4002 Alors je reçoit bien le packet mais ça n’affiche pas le gui… 2f6bb8f4-8fdf-4473-bb07-8315ce728865-image.png

                                          SultanS 1 réponse Dernière réponse Répondre Citer 0
                                          • SultanS Hors-ligne
                                            Sultan @Sultan
                                            dernière édition par

                                            @Sultan Je viens de chack et ça n’enclenche meme pas le displayguiscreen…

                                            SultanS 1 réponse Dernière réponse Répondre Citer 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • Premier message
                                              Dernier message
                                            Design by Woryk
                                            ContactMentions Légales

                                            MINECRAFT FORGE FRANCE © 2024

                                            Powered by NodeBB