• Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes
  • S'inscrire
  • Se connecter
  • S'inscrire
  • Se connecter
  • Recherche
  • Récent
  • Mots-clés
  • Populaire
  • Utilisateurs
  • Groupes

Résolu Une clef pour une porte .

1.8.x
1.8
7
46
8.7k
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.
  • AymericRed
    AymericRed dernière édition par 5 août 2016, 17:34

    “setInteger”, “getLong”, c’est pas le même type de tag (int != long) donc il te retourne 0, la valeur par défaut.
    Et je ne veux pas être méchant, mais des fois tu ne cherches pas assez toi-même la solution de tes problèmes.

    Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

    AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

    Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
    Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

    1 réponse Dernière réponse Répondre Citer 0
    • Gabs
      Gabs dernière édition par 5 août 2016, 19:34

      @‘AymericRed’:

      “setInteger”, “getLong”, c’est pas le même type de tag (int != long) donc il te retourne 0, la valeur par défaut.
      Et je ne veux pas être méchant, mais des fois tu ne cherches pas assez toi-même la solution de tes problèmes.

      Tu as raison j’avais pas fais attention mais c’est pareil ça return 0 aussi
      edit:

      C’est bon ! x) pour les coords

      EDIT:

      Alors,

      J’ai fais ça:

      public ArrayList <integer>array = new ArrayList();
      @SubscribeEvent
      public void onBlockInteract(PlayerInteractEvent event)
      {
      ItemStack stack = event.entityPlayer.getCurrentEquippedItem();
      BlockPos pos = event.pos;
      if (!event.world.isRemote && event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK && stack.getItem() == CSCItems.clef && event.world.getBlockState(event.pos).getBlock() == Blocks.iron_door && event.pos.getY() == 66) 
      {
      if(!stack.hasTagCompound())
      {
      stack.setTagCompound(new NBTTagCompound());
      }
      stack.getTagCompound().setInteger("x", event.pos.getX());
      stack.getTagCompound().setInteger("y", event.pos.getY());
      stack.getTagCompound().setInteger("z", event.pos.getZ());
      System.out.println(stack.getTagCompound().getInteger("x"));
      System.out.println(stack.getTagCompound().getInteger("y"));
      System.out.println(stack.getTagCompound().getInteger("z"));
      array.add(stack.getTagCompound().getInteger("x"));
      array.add(stack.getTagCompound().getInteger("y"));
      array.add(stack.getTagCompound().getInteger("z"));
      if(stack.hasTagCompound() && stack.getTagCompound().getInteger("x") && …) // ici j'ai une érreur du coup
      {
      }
      System.out.println("Clic droit sur un bloc en fer avec une clef !");
      }
      }

      J’ai stocké les coords dans une array.

      @Broken quand tu me dis: [font=Ubuntu, sans-serifSi elle avais déjà un NBT avec des coordonnées de porte tu regarde si elles correspondent avec la porte sur laquelle a cliqué le joueur, si c’est le cas tu ouvre la porte.]

      [font=Ubuntu, sans-serifLe truc c’est que dans le if je peux pas mettre un boolean (en l’occurrence stack.hasTagCompound()) et un int (stack.getTagCompound().getInteger(“x”)) donc je fais comment ? :x]

      [font=Ubuntu, sans-serifmerci 🙂
      ]</integer>

      1 réponse Dernière réponse Répondre Citer 0
      • Benjamin Loison
        Benjamin Loison dernière édition par 6 août 2016, 00:01

        Si j’étais toi je ferai,

        if(nbt == null)
        {
        // Aucune donnée attribuée, on met les coordonnées
        nbt.setInteger(X);
        nbt.setInteger(Y);
        nbt.setInteger(Z);
        }
        else if(nbt.get(X) == event.posX && …)
        {
        // Tu ouvres la porte
        }
        else
        {
        // Tu n'as pas accès à cette porte !
        }

        En espérant que ça t’ai fais comprendre la structure de sa pensée, si je ne me suis pas troimpé.

        Ps 1: Le code est fictif hein ^^
        Ps 2: Je n’ai pas compris pourquoi tu as crée une ArrayList sachant que get directement le nbt est plus court et si tu veux tester avec l’autre bloc (du haut ou du bas ou les 2), tu enregistres juste le x dans un int et la même chose pour y, z 😉

        >! Développeur de Altis-Life (Arma III) sur Minecraft !
        >! Site web     : https://lemnoslife.com

        1 réponse Dernière réponse Répondre Citer 1
        • Gabs
          Gabs dernière édition par 6 août 2016, 07:16

          @‘Benjamin Loison’:

          Si j’étais toi je ferai,

          if(nbt == null)
          {
             // Aucune donnée attribuée, on met les coordonnées
             nbt.setInteger(X);
             nbt.setInteger(Y);
             nbt.setInteger(Z);
          }
          else if(nbt.get(X) == event.posX && …)
          {
             // Tu ouvres la porte
          }
          else
          {
             // Tu n'as pas accès à cette porte !
          }

          En espérant que ça t’ai fais comprendre la structure de sa pensée, si je ne me suis pas troimpé.

          Ps 1: Le code est fictif hein ^^
          Ps 2: Je n’ai pas compris pourquoi tu as crée une ArrayList sachant que get directement le nbt est plus court et si tu veux tester avec l’autre bloc (du haut ou du bas ou les 2), tu enregistres juste le x dans un int et la même chose pour y, z 😉

          Ah je vois ok merci :),

          Juste pour ouvrir la porte je fais comment ? x)

          et j’ai créer un array car on me la demander enfin du moins se que j’ai compris: [font=Ubuntu, sans-serifAprès il faudra que tu stock côté serveur les coordonnées des porte qui ont déjà un clé pour qu’on ne puisse pas faire plusieurs clés d’une même porte + enregistrer ses coordonnées dans les tags NBT du monde. Quand le joueur fera un clique droit sur la porte avec une nouvelle clé, il faudra que tu vérifie si la porte n’as pas déjà une clé.]
          [font=Ubuntu, sans-serifVoilà pourquoi ^^ mais quand il dit:  enregistrer ses coordonnées dans les tags NBT du monde,]

          [font=Ubuntu, sans-serifC’est ou exactement ? ]

          [font=Ubuntu, sans-serifJ’ai fais ça du coup je pense que c’est mieux garce à toi benjamin :)]

          [font=Ubuntu, sans-serifpublic ArrayList <integer>array = new ArrayList();
          @SubscribeEvent
          public void onBlockInteract(PlayerInteractEvent event)
          {
          ItemStack stack = event.entityPlayer.getCurrentEquippedItem();
          NBTTagCompound nbt = stack.getTagCompound();
          BlockPos pos = event.pos;
          if (!event.world.isRemote && event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK && stack.getItem() == CSCItems.clef && event.world.getBlockState(event.pos).getBlock() == Blocks.iron_door && event.pos.getY() == 66) 
          {
          if(!stack.hasTagCompound())
          {
          stack.setTagCompound(new NBTTagCompound());
          }
          if(!event.world.isRemote && stack.hasTagCompound())
          {
          array.add(nbt.getInteger("x"));
          array.add(nbt.getInteger("y"));
          array.add(nbt.getInteger("z"));
          }
          if(nbt == null)
          {
          stack.getTagCompound().setInteger("x", event.pos.getX());
          stack.getTagCompound().setInteger("y", event.pos.getY());
          stack.getTagCompound().setInteger("z", event.pos.getZ());
          }
          else if(nbt.getInteger("x") == event.pos.getX() && nbt.getInteger("y") == event.pos.getY() && nbt.getInteger("z") == event.pos.getZ())
          {
          System.out.println("Ouverture de la porte");
          }
          else
          {
          System.out.println("Vous n'avez pas accès à cette porte!");
          }
          System.out.println(stack.getTagCompound().getInteger("x"));
          System.out.println(stack.getTagCompound().getInteger("y"));
          System.out.println(stack.getTagCompound().getInteger("z"));
          System.out.println("Clic droit sur un bloc en fer avec une clef !");
          }
          }]

          Le problème est que je peux toujours créer deux clés sur la même porte se qui est normal car il faut que j’enregistre les [font=Ubuntu, sans-serifenregistrer ses coordonnées dans les tags NBT du monde.]
          [font=Ubuntu, sans-serifEt aussi pour prendre le haut ou le bas de la porte je fais comment appart ça  event.pos.getY() == 66)  car bon si c’est pas un monde plat …]
          [font=Ubuntu, sans-serifMerci ! 😉
          ]</integer>

          1 réponse Dernière réponse Répondre Citer 0
          • robin4002
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par 6 août 2016, 11:31

            Mettre x, y, z comme ceci dans ton array n’est pas vraiment une bonne idée.
            Il faudrait plutôt créer un objet contenant l’id de la dimension, x, y et z puis mettre cette objet dans l’array. Ou faire un tableau de 4 int.

            1 réponse Dernière réponse Répondre Citer 0
            • Gabs
              Gabs dernière édition par 6 août 2016, 11:42

              @‘robin4002’:

              Mettre x, y, z comme ceci dans ton array n’est pas vraiment une bonne idée.
              Il faudrait plutôt créer un objet contenant l’id de la dimension, x, y et z puis mettre cette objet dans l’array. Ou faire un tableau de 4 int.

              Comme ça ?

              public static ArrayList <object>array = new ArrayList();
              @SubscribeEvent
              public void onBlockInteract(PlayerInteractEvent event)
              {
              ItemStack stack = event.entityPlayer.getCurrentEquippedItem();
              NBTTagCompound nbt = stack.getTagCompound();
              BlockPos pos = event.pos;
              if (!event.world.isRemote && event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK && stack.getItem() == CSCItems.clef && event.world.getBlockState(event.pos).getBlock() == Blocks.iron_door && event.pos.getY() == 66) 
              {
              if(!stack.hasTagCompound())
              {
              stack.setTagCompound(new NBTTagCompound());
              }
              if(nbt == null)
              {
              stack.getTagCompound().setInteger("x", event.pos.getX());
              stack.getTagCompound().setInteger("y", event.pos.getY());
              stack.getTagCompound().setInteger("z", event.pos.getZ());
              }
              else if(nbt.getInteger("x") == event.pos.getX() && nbt.getInteger("y") == event.pos.getY() && nbt.getInteger("z") == event.pos.getZ())
              {
              System.out.println("Ouverture de la porte");
              }
              else
              {
              System.out.println("Vous n'avez pas accès à cette porte!");
              }
              Object obj = new Object[] {event.world.provider.getDimensionId(), nbt.getInteger("x"), nbt.getInteger("y"), nbt.getInteger("z")};
              if(!event.world.isRemote && stack.hasTagCompound())
              {
              array.add(obj);
              }
              System.out.println(stack.getTagCompound().getInteger("x"));
              System.out.println(stack.getTagCompound().getInteger("y"));
              System.out.println(stack.getTagCompound().getInteger("z"));
              }
              }

              edit crash avec une nouvelle clés:

              [13:52:04] [Server thread/INFO]: Player48 vient d'obtenir le succès [Faire l'inventaire]
              [13:52:04] [Client thread/INFO]: [CHAT] Player48 vient d'obtenir le succès [Faire l'inventaire]
              [13:52:19] [Server thread/ERROR] [FML]: Exception caught during firing event net.minecraftforge.event.entity.player.PlayerInteractEvent@1260ee5:
              java.lang.NullPointerException
              at com.CSC.net.Events.Events.onBlockInteract(Events.java:72) ~[Events.class:?]
              at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_6_Events_onBlockInteract_PlayerInteractEvent.invoke(.dynamic) ~[?:?]
              at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:55) ~[ASMEventHandler.class:?]
              at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:138) [EventBus.class:?]
              at net.minecraftforge.event.ForgeEventFactory.onPlayerInteract(ForgeEventFactory.java:119) [ForgeEventFactory.class:?]
              at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:452) [ItemInWorldManager.class:?]
              at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:624) [NetHandlerPlayServer.class:?]
              at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:67) [C08PacketPlayerBlockPlacement.class:?]
              at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:114) [C08PacketPlayerBlockPlacement.class:?]
              at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:24) [PacketThreadUtil$1.class:?]
              at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_45]
              at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_45]
              at net.minecraftforge.fml.common.FMLCommonHandler.callFuture(FMLCommonHandler.java:709) [FMLCommonHandler.class:?]
              at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?]
              at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:669) [MinecraftServer.class:?]
              at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:171) [IntegratedServer.class:?]
              at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:540) [MinecraftServer.class:?]
              at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45]
              [13:52:19] [Server thread/ERROR] [FML]: Index: 1 Listeners:
              [13:52:19] [Server thread/ERROR] [FML]: 0: NORMAL
              [13:52:19] [Server thread/ERROR] [FML]: 1: ASM: com.CSC.net.Events.Events@1a4c99c onBlockInteract(Lnet/minecraftforge/event/entity/player/PlayerInteractEvent;)V
              [13:52:19] [Server thread/FATAL] [FML]: Exception caught executing FutureTask: java.util.concurrent.ExecutionException: java.lang.NullPointerException
              java.util.concurrent.ExecutionException: java.lang.NullPointerException
              at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_45]
              at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_45]
              at net.minecraftforge.fml.common.FMLCommonHandler.callFuture(FMLCommonHandler.java:710) [FMLCommonHandler.class:?]
              at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?]
              at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:669) [MinecraftServer.class:?]
              at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:171) [IntegratedServer.class:?]
              at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:540) [MinecraftServer.class:?]
              at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45]
              Caused by: java.lang.NullPointerException
              at com.CSC.net.Events.Events.onBlockInteract(Events.java:72) ~[Events.class:?]
              at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_6_Events_onBlockInteract_PlayerInteractEvent.invoke(.dynamic) ~[?:?]
              at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:55) ~[ASMEventHandler.class:?]
              at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:138) ~[EventBus.class:?]
              at net.minecraftforge.event.ForgeEventFactory.onPlayerInteract(ForgeEventFactory.java:119) ~[ForgeEventFactory.class:?]
              at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:452) ~[ItemInWorldManager.class:?]
              at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:624) ~[NetHandlerPlayServer.class:?]
              at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:67) ~[C08PacketPlayerBlockPlacement.class:?]
              at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:114) ~[C08PacketPlayerBlockPlacement.class:?]
              at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:24) ~[PacketThreadUtil$1.class:?]
              at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_45]
              at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_45]
              at net.minecraftforge.fml.common.FMLCommonHandler.callFuture(FMLCommonHandler.java:709) ~[FMLCommonHandler.class:?]
              … 5 more
              ```</object>
              1 réponse Dernière réponse Répondre Citer 0
              • Benjamin Loison
                Benjamin Loison dernière édition par 6 août 2016, 13:25

                Pour identifier des coordonnées sur un serveur il faut l’information, quel est la carte ? La position X ? La position Y ? La position Z ?

                Sachant que je connais ton style de projets, je pense que tu n’as qu’un monde alors pas besoin de préciser (pour l’instant quelle carte), seulement il reste 2 problèmes:

                • Mettons on a finit le système pour savoir si la porte appartient déjà à quelqu’un, comment le client peut savoir directement dans le onBlockActivated que la porte est déjà prise ? Sachant qu’il n’y a que le serveur qui sait quelles portes sont déjà utilisés. Il va donc falloir faire simplement un envoi d’un packet dans le onBlockActivated côté client et faire passer le code qu’on a actuellement dans le code lu dans le packet côté serveur.
                • Pour savoir quelles portes sont déjà utilisées, ce n’est pas bien d’utiliser une ArrayList (mémoire vive), c’est-à-dire que si tu relances ton serveur bas l’ArrayList recommence à zéro, donc il faudrait la stocké dans les NBT du serveur, si c’est possible, ou sous format fichier texte tout simplement.

                De plus je propose que pour l’ouverture etc on ne se fond que sur le bloc du bas ! C’est à dire que je pense qu’il y a des fonctions etc, tu dois pouvoir te débrouiller pour savoir si le joueur fais clique droit sur le haut ou le bas, dans les deux cas tu enregistres les coordonnées x, y, z dans des int, et si c’est le haut, tu fais y -= 1, tout simplement 😉

                Sinon pour l’ouverture de la porte, regardes comment fait Minecraft, ou regarde la porte en bois, sinon deux techniques, tu remplaces les blocs de la porte par une ouverte (je pense que c’est possible avec des paramètres spéciaux) et sinon tu mets une torche de redstone deux blocs en-dessous ^^ 😄

                Voilà je pense que ça t’aura bien aidé 😛 Si tu as d’autres questions, je ne sais pas comment tu comptes faire la fermeture de la porte, si tout le monde peut quand elle est ouverte ou que celui qui a la clé, dans tous les cas maintenant tu dois avoir assez d’idées en tête et n’oublies jamais, les Packets c’est la synchronisation et la résolution de beaucoup de problèmes !

                EDIT: Comme à proposé Robin tu peux créer un tableau de 3 int et tu y fourres le x, y, z c’est plus simple (et dans le bonne ordre !) et sinon si tu veux que toutes les portes soient à nouveau disponible à chaque relancement tu fais l’event côté serveur FMLServerStartingEvent, tu fermes les portes et c’est tout !

                Et je ne fais pas attention à ton crash puisque je te propose une autre manière de penser qui le résoudrera sûrement et je pense que la balise Java pour un crash est un peu inutile ^^ enfin bon tu fais comme bon te sent 😉

                >! Développeur de Altis-Life (Arma III) sur Minecraft !
                >! Site web     : https://lemnoslife.com

                1 réponse Dernière réponse Répondre Citer 0
                • Eikins
                  Eikins dernière édition par 6 août 2016, 14:24

                  Franchement, tu ferais mieux de créer une nouvelle porte en TileEntity, où tu stockerais un UUID.
                  Après tu trouves un Event pour quand un bloque est posé, tu vérifies si il s’agit d’une porte en fer et tu remplace la porte en fer par ta nouvelle porte. Quand tu casse le bloc, tu récupère une porte en fer et dans l’itemstack tu stock l’UUID de la clef. Quand tu poses tu vérifies si l’Itemstack a un UUID, auquel cas tu l’ajoute à ta porte. Ensuite, tu craft une clef, et tu fais clique droit sur la porte pour leur assigner un UUID commun.

                  Je pense sincèrement que c’est plus rapide.

                  Fracture

                  1 réponse Dernière réponse Répondre Citer 0
                  • BrokenSwing
                    BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par 6 août 2016, 14:29

                    C’est pas forcément + rapide, personnellement je n’aime pas modifier le contenu de Minecraft de cette façon (remplacer quand le truc est posé/crafté, etc …) quand il y a une autre façon de la faire. Je crois que je vais donner le code direct, parce que c’est vraiment pas compliqué et il y a déjà 3 pages.

                    1 réponse Dernière réponse Répondre Citer 0
                    • RedRelay
                      RedRelay Moddeurs confirmés dernière édition par 6 août 2016, 14:35

                      @‘Eikins’:

                      Franchement, tu ferais mieux de créer une nouvelle porte en TileEntity, où tu stockerais un UUID.
                      Après tu trouves un Event pour quand un bloque est posé, tu vérifies si il s’agit d’une porte en fer et tu remplace la porte en fer par ta nouvelle porte. Quand tu casse le bloc, tu récupère une porte en fer et dans l’itemstack tu stock l’UUID de la clef. Quand tu poses tu vérifies si l’Itemstack a un UUID, auquel cas tu l’ajoute à ta porte. Ensuite, tu craft une clef, et tu fais clique droit sur la porte pour leur assigner un UUID commun.

                      Je pense sincèrement que c’est plus rapide.

                      Très mauvaise idée, ça rendrait le mod complètement incompatible avec tout les mods qui touchent de loin ou de près aux portes dans Minecraft.

                      –------------------------------------------------------------------------------------
                      Si tu trouves mon intervention pertinente, n'hésite pas a m…

                      1 réponse Dernière réponse Répondre Citer 0
                      • Eikins
                        Eikins dernière édition par 6 août 2016, 15:15

                        Dans ce cas autant créer une nouvelle porte. Après si il veut stocker les coordonnées c’est son choix, mais il faut une collection d’un nouveau DataContainer, avec les coordonnées et un UUID ou un id, car quand le joueur va bouger la porte de position ça va être dur de retrouver la bonne clef.

                        Ou alors une Map<blockpos, uuid=“”>, et dans la clef on stocke uniquement l’UUID.

                        Comme ça quand il clique droit -> on récupère l’UUID stocké dans la Map via la position de la porte. Par contre il faudra bel et bien stocker l’UUID dans les NBT de l’itemstack, et dès qu’on repose la porte, on met à jour la Map.</blockpos,>

                        Fracture

                        1 réponse Dernière réponse Répondre Citer 0
                        • BrokenSwing
                          BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par 6 août 2016, 15:23

                          T’as aussi la solution sneak + clique-droit == réinialisation de la clé et BreakEvent pour virer de la liste les portes qui sont détruites

                          EDIT : Bon voilà tu n’as plus qu’à enregistrer la liste dans les tags NBT du monde.

                          /** On stock les positions des portes qui ont une clé pour éviter que l'on puisse créer 2 clés */
                          public static final List <position>doorsPositions = Lists.newArrayList();
                          @SubscribeEvent
                          public void onInteract(PlayerInteractEvent e) {
                          if(!e.world.isRemote) {
                          ItemStack stack = e.entityPlayer.getHeldItem();
                          if(stack != null && stack.getItem() == Items.apple && e.action == Action.RIGHT_CLICK_BLOCK) {
                          BlockPos pos = e.pos;
                          IBlockState state = e.world.getBlockState(pos);
                          if(state.getBlock() == Blocks.iron_door) {
                          /**
                          * On se base sur la partie haute de la porte, en effet c'est cette partie qui contient
                          * l'information pour savoir si la porte est ouverte ou non.
                          * Ici si c'est la partie basse on ajoute 1 à la coordonnée Y et on récupère donc l'état
                          * de la partie haute.
                          */
                          if(state.getValue(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER) {
                          pos = pos.up();
                          state = e.world.getBlockState(pos);
                          }
                          /**
                          * Si c'est une nouvelle clé on écrit les coordonnée de la porte ainsi que l'id
                          * de la dimension dans ses tag NBT.
                          */
                          if(!stack.hasTagCompound()) {
                          Position p = new Position(pos, e.world.provider.getDimensionId());
                          if(!doorsPositions.contains(p)) {
                          NBTTagCompound nbt = new NBTTagCompound();
                          nbt.setIntArray("doorPos", new int[]{e.world.provider.getDimensionId(), pos.getX(), pos.getY(), pos.getZ()});
                          stack.setTagCompound(nbt);
                          doorsPositions.add(new Position(pos.getX(), pos.getY(), pos.getZ(), e.world.provider.getDimensionId()));
                          e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Tu as créé une clé"));
                          } else {
                          e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Une clé existe déjà pour cette porte"));
                          }
                          }
                          /**
                          * Ici tu peut enlever le else ce qui aura pour effet d'ouvrir la porte lors de la création
                          * de la clé car avec le else on doit créer la porte et refaire clique droit pour l'ouvrir.
                          */
                          else {
                          int[] doorPos = stack.getTagCompound().getIntArray("doorPos");
                          if(doorPos[0] == e.world.provider.getDimensionId() && doorPos[1] == pos.getX() && doorPos[2] == pos.getY() && doorPos[3] == pos.getZ()) {
                          Boolean opened = (Boolean) (state.getValue(BlockDoor.POWERED));
                          /**
                          * Il y a d'autres solutions pour garder la porte ouverte, j'avais essayé de changé le state en POWERED = true
                          * à chaque tick mais en changeant l'état ça update le bloc remettant POWERED à false
                          * donc il faut obligatoirement utiliser la redstone, par contre tu peux faire que la
                          * porte doit être posée sur un certain bloc (que tu va créer) et qui alimentera ou pas la
                          * porte en énergie, ça sera plus propre que la torche. C'est à toi de voir.
                          */
                          if(opened) {
                          e.world.setBlockToAir(pos.down(3));
                          } else {
                          e.world.setBlockState(pos.down(3), Blocks.redstone_torch.getDefaultState());
                          }
                          e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Tu as" + (opened ? " fermé " : " ouvert ") + "la porte"));
                          } else {
                          e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Ceci n'est pas la bonne clé"));
                          }
                          }
                          }
                          }
                          }
                          }
                          @SubscribeEvent
                          public void onBlockBreak(BreakEvent event) {
                          /**
                          * On supprime la porte de la liste si on la casse.
                          */
                          if(event.state.getBlock() == Blocks.iron_door) {
                          BlockPos pos = event.pos;
                          if(event.state.getValue(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER) {
                          pos = pos.up();
                          }
                          Position p = new Position(pos, event.world.provider.getDimensionId());
                          doorsPositions.remove(p);
                          }
                          }
                          /**
                          * On crée un objet pour stocker la position + l'id de la dimension
                          */
                          public static class Position extends BlockPos {
                          public int dimensionId;
                          public Position(double x, double y, double z, int dimension) {
                          super(x, y, z);
                          this.dimensionId = dimension;
                          }
                          public Position(BlockPos pos, int dimension) {
                          super(pos);
                          this.dimensionId = dimension;
                          }
                          @Override
                          public boolean equals(Object o) {
                          if(o instanceof Position) {
                          Position pos = (Position)o;
                          if(super.equals(o) && pos.dimensionId == this.dimensionId) {
                          return true;
                          }
                          }
                          return false;
                          }
                          }
                          ```</position>
                          1 réponse Dernière réponse Répondre Citer 1
                          • Gabs
                            Gabs dernière édition par 7 août 2016, 10:20

                            @‘BrokenSwing’:

                            T’as aussi la solution sneak + clique-droit == réinialisation de la clé et BreakEvent pour virer de la liste les portes qui sont détruites

                            EDIT : Bon voilà tu n’as plus qu’à enregistrer la liste dans les tags NBT du monde.

                            /** On stock les positions des portes qui ont une clé pour éviter que l'on puisse créer 2 clés */
                            public static final List <position>doorsPositions = Lists.newArrayList();
                            @SubscribeEvent
                            public void onInteract(PlayerInteractEvent e) {
                            if(!e.world.isRemote) {
                            ItemStack stack = e.entityPlayer.getHeldItem();
                            if(stack != null && stack.getItem() == Items.apple && e.action == Action.RIGHT_CLICK_BLOCK) {
                            BlockPos pos = e.pos;
                            IBlockState state = e.world.getBlockState(pos);
                            if(state.getBlock() == Blocks.iron_door) {
                            /**
                            * On se base sur la partie haute de la porte, en effet c'est cette partie qui contient
                            * l'information pour savoir si la porte est ouverte ou non.
                            * Ici si c'est la partie basse on ajoute 1 à la coordonnée Y et on récupère donc l'état
                            * de la partie haute.
                            */
                            if(state.getValue(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER) {
                            pos = pos.up();
                            state = e.world.getBlockState(pos);
                            }
                            /**
                            * Si c'est une nouvelle clé on écrit les coordonnée de la porte ainsi que l'id
                            * de la dimension dans ses tag NBT.
                            */
                            if(!stack.hasTagCompound()) {
                            Position p = new Position(pos, e.world.provider.getDimensionId());
                            if(!doorsPositions.contains(p)) {
                            NBTTagCompound nbt = new NBTTagCompound();
                            nbt.setIntArray("doorPos", new int[]{e.world.provider.getDimensionId(), pos.getX(), pos.getY(), pos.getZ()});
                            stack.setTagCompound(nbt);
                            doorsPositions.add(new Position(pos.getX(), pos.getY(), pos.getZ(), e.world.provider.getDimensionId()));
                            e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Tu as créé une clé"));
                            } else {
                            e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Une clé existe déjà pour cette porte"));
                            }
                            }
                            /**
                            * Ici tu peut enlever le else ce qui aura pour effet d'ouvrir la porte lors de la création
                            * de la clé car avec le else on doit créer la porte et refaire clique droit pour l'ouvrir.
                            */
                            else {
                            int[] doorPos = stack.getTagCompound().getIntArray("doorPos");
                            if(doorPos[0] == e.world.provider.getDimensionId() && doorPos[1] == pos.getX() && doorPos[2] == pos.getY() && doorPos[3] == pos.getZ()) {
                            Boolean opened = (Boolean) (state.getValue(BlockDoor.POWERED));
                            /**
                            * Il y a d'autres solutions pour garder la porte ouverte, j'avais essayé de changé le state en POWERED = true
                            * à chaque tick mais en changeant l'état ça update le bloc remettant POWERED à false
                            * donc il faut obligatoirement utiliser la redstone, par contre tu peux faire que la
                            * porte doit être posée sur un certain bloc (que tu va créer) et qui alimentera ou pas la
                            * porte en énergie, ça sera plus propre que la torche. C'est à toi de voir.
                            */
                            if(opened) {
                            e.world.setBlockToAir(pos.down(3));
                            } else {
                            e.world.setBlockState(pos.down(3), Blocks.redstone_torch.getDefaultState());
                            }
                            e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Tu as" + (opened ? " fermé " : " ouvert ") + "la porte"));
                            } else {
                            e.entityPlayer.addChatComponentMessage(new ChatComponentText(EnumChatFormatting.RED + "Ceci n'est pas la bonne clé"));
                            }
                            }
                            }
                            }
                            }
                            }
                            @SubscribeEvent
                            public void onBlockBreak(BreakEvent event) {
                            /**
                            * On supprime la porte de la liste si on la casse.
                            */
                            if(event.state.getBlock() == Blocks.iron_door) {
                            BlockPos pos = event.pos;
                            if(event.state.getValue(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER) {
                            pos = pos.up();
                            }
                            Position p = new Position(pos, event.world.provider.getDimensionId());
                            doorsPositions.remove(p);
                            }
                            }
                            /**
                            * On crée un objet pour stocker la position + l'id de la dimension
                            */
                            public static class Position extends BlockPos {
                            public int dimensionId;
                            public Position(double x, double y, double z, int dimension) {
                            super(x, y, z);
                            this.dimensionId = dimension;
                            }
                            public Position(BlockPos pos, int dimension) {
                            super(pos);
                            this.dimensionId = dimension;
                            }
                            @Override
                            public boolean equals(Object o) {
                            if(o instanceof Position) {
                            Position pos = (Position)o;
                            if(super.equals(o) && pos.dimensionId == this.dimensionId) {
                            return true;
                            }
                            }
                            return false;
                            }
                            }
                            ```</position>

                            Ok en fait j’étais loin ^^
                            Merci 🙂

                            Quand tu me dis d’enregistrer les tag nbt de la liste (Position) dans les tags NBT du monde,

                            C’est ou précisément ? dans un event dans quoi ? et quelques détails m’aiderais merci 🙂

                            1 réponse Dernière réponse Répondre Citer 0
                            • AymericRed
                              AymericRed dernière édition par 7 août 2016, 10:30

                              Il y a un tuto sur le forum (Persistance des données avec WorldSavedData je crois).

                              Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                              AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                              Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                              Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                              1 réponse Dernière réponse Répondre Citer 0
                              • BrokenSwing
                                BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par 7 août 2016, 11:12

                                Oui c’est ça, c’est pas très compliqué franchement tu verra

                                1 réponse Dernière réponse Répondre Citer 0
                                • Gabs
                                  Gabs dernière édition par 7 août 2016, 11:31

                                  @‘AymericRed’:

                                  Il y a un tuto sur le forum (Persistance des données avec WorldSavedData je crois).

                                  Ouaip merci 🙂

                                  J’ai fais ça pour l’instant:
                                  Mes [font=Ubuntu, sans-serifdonnées][font=Ubuntu, sans-serif ne sont pas liées à vos dimensions mais a mon monde c’est ça ?]

                                  package com.CSC.net.save;
                                  import com.CSC.net.Events.Events;
                                  import net.minecraft.nbt.NBTTagCompound;
                                  import net.minecraft.world.World;
                                  import net.minecraft.world.WorldSavedData;
                                  import net.minecraft.world.storage.MapStorage;
                                  import net.minecraftforge.common.DimensionManager;
                                  public class KeySave extends WorldSavedData {
                                  public static KeySave load() {
                                  if(DimensionManager.getWorlds().length < 1) return null;
                                  MapStorage storage = DimensionManager.getWorlds()[0].getMapStorage(); //On récupère la mapStorage de la dimension
                                  final String KEY = Events.Key; // Si vous avez choisis de faire une fonction static String. Quoiqu'il en soit, la variable KEY que nous utiliserons ici représente votre clé. Si vous utilisez un attribut static, utilisez le directement.
                                  KeySave result = (KeySave)storage.loadData(KeySave.class, KEY);//On charge nos données
                                  if (result == null) { //Si nos données n'existe pas, …
                                  result = new KeySave(KEY);// Alors on les crée ...
                                  storage.setData(KEY, result);// Et on les ajoutes à la mapStorage.
                                  }
                                  return result; //On retourne notre objet qui représente les données a sauvegarder
                                  }
                                  public KeySave(String key) {
                                  super(key);
                                  }
                                  @Override
                                  public void readFromNBT(NBTTagCompound p_76184_1_) {
                                  // Vous remplissez les attributs de votre objet via le NBTTagCompound
                                  }
                                  @Override
                                  public void writeToNBT(NBTTagCompound p_76187_1_) {
                                  // Vous écrivez le contenu de votre objet dans le NBTTagCompound
                                  }
                                  }

                                  public static KeySave load() j’ai une crois rouge a gauche sur éclipse erreur --> Syntax error on token “Invalid Character”, delete this token

                                  Et dans le write read nbt c’est un peu comme RankSave ? je sais pas si vous vous en rappelez le système de rang.

                                  Ensuite a chaque modif je dois mettre [font=Ubuntu, sans-serifmarkDirty() c’est ça ?]

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • AymericRed
                                    AymericRed dernière édition par 7 août 2016, 12:04

                                    Pour l’erreur que d’indique eclipse, je dois admettre que je la trouve pas, c’est uniquement sur la ligne “public static KeySave load() {” ?
                                    C’est sauvegardé par dimension, et tu peux choisir laquelle en changeant le 0 de cette ligne “DimensionManager.getWorlds()[0].getMapStorage();”, mais tu dois avoir un moyen d’obtenir un monde par son id dans le dimension manager.
                                    Dans le write, tu écris le contenu de la liste, et dans read tu le récupères. Et pour le markDirty, oui.

                                    Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

                                    AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.

                                    Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
                                    Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.

                                    1 réponse Dernière réponse Répondre Citer 0
                                    • Gabs
                                      Gabs dernière édition par 7 août 2016, 12:16

                                      @‘AymericRed’:

                                      Pour l’erreur que d’indique eclipse, je dois admettre que je la trouve pas, c’est uniquement sur la ligne “public static KeySave load() {” ?
                                      C’est sauvegardé par dimension, et tu peux choisir laquelle en changeant le 0 de cette ligne “DimensionManager.getWorlds()[0].getMapStorage();”, mais tu dois avoir un moyen d’obtenir un monde par son id dans le dimension manager.
                                      Dans le write, tu écris le contenu de la liste, et dans read tu le récupères. Et pour le markDirty, oui.

                                      Bah oui c’est bizarre en fait j’ai fait ctrl + s pour save et j’ai eu une érreur et il ma dit de save en UTF-8 je crois un truc comme ça et j’ai ça du coup:

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • BrokenSwing
                                        BrokenSwing Moddeurs confirmés Rédacteurs dernière édition par 7 août 2016, 12:35

                                        De toute façon ton projet devrait être en UTF-8, si ce n’est pas le cas fait le (ALT + Enter sur ton projet > Resource > Text File Encoding > Other : UTF-8)

                                        1 réponse Dernière réponse Répondre Citer 0
                                        • RedRelay
                                          RedRelay Moddeurs confirmés dernière édition par 7 août 2016, 12:53

                                          Si tu as fais un copier/coller sur internet, tu as surement des espaces qui sont mal encodé.
                                          Un petit Ctrl+A, Ctrl+I ainsi qu’un Ctrl+Shift+F peuvent résoudre ton problème 😉

                                          –------------------------------------------------------------------------------------
                                          Si tu trouves mon intervention pertinente, n'hésite pas a m…

                                          1 réponse Dernière réponse Répondre Citer 0
                                          • 1
                                          • 2
                                          • 3
                                          • 2 / 3
                                          21 sur 46
                                          • Premier message
                                            21/46
                                            Dernier message
                                          Design by Woryk
                                          Contact / Mentions Légales

                                          MINECRAFT FORGE FRANCE © 2018

                                          Powered by NodeBB