• 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 Problème Système de porte.

1.9.x et 1.10.x
1.10.x
2
3
818
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.
  • Gabs
    Gabs dernière édition par 10 déc. 2016, 14:22

    Bonjour,

    J’avais créer un sujet il y a quelques mois pour créer un système de porte avec des clés (En 1.8).

    Il marchait très bien en 1.8 mais j’ai passer maintenant mon Mod en 1.10 et il y a un petit problème.

    Une fois la clé créer quand j’essaye de l’ouvrir bah elle ne s’ouvre pas, fin elle s’ouvre et se ferme directement d’après la console.

    Je vous passe le code et les logs:

     public static ItemStack items;
        public static Position p1;
        public static final List <position>doorsPositions = Lists.newArrayList();
        @SubscribeEvent
        public void onInteract(PlayerInteractEvent.RightClickBlock e)
        {
            if(!e.getWorld().isRemote)
            {
                ItemStack stack = e.getEntityPlayer().getHeldItemMainhand();
                if(stack != null && stack.getItem() == CSCItems.clef)
                {
                    BlockPos pos = e.getPos();
                    IBlockState state = e.getWorld().getBlockState(pos);
                    items = stack;
                    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.getWorld().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.getWorld().provider.getDimension());
                            p1 = p;
                            if(!doorsPositions.contains(p))
                            {
                                NBTTagCompound nbt = new NBTTagCompound();
                                nbt.setIntArray("doorPos", new int[] {e.getWorld().provider.getDimension(), pos.getX(), pos.getY(), pos.getZ()});
                                stack.setTagCompound(nbt);
                                doorsPositions.add(new Position(pos.getX(), pos.getY(), pos.getZ(), e.getWorld().provider.getDimension()));
                                e.getEntityPlayer().addChatComponentMessage(new TextComponentTranslation(ChatFormatting.GREEN + "Tu as cr�� une cl�"));
                            }
                            else
                            {
                                e.getEntityPlayer().addChatComponentMessage(new TextComponentTranslation(ChatFormatting.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.getWorld().provider.getDimension() && doorPos[1] == pos.getX() && doorPos[2] == pos.getY() && doorPos[3] == pos.getZ())
                            {
                                Boolean opened = (Boolean)(state.getValue(BlockDoor.POWERED));
                                System.out.println(opened);
                                /**
                                 * 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.getWorld().setBlockToAir(pos.down(3));
                                }
                                else
                                {
                                    e.getWorld().setBlockState(pos.down(3), Blocks.REDSTONE_TORCH.getDefaultState());
                                }
                                e.getEntityPlayer().addChatComponentMessage(new TextComponentTranslation(ChatFormatting.GREEN + "Tu as" + (opened ? " ferm� " : " ouvert ") + "la porte"));
                            }
                            else
                            {
                                e.getEntityPlayer().addChatComponentMessage(new TextComponentTranslation(ChatFormatting.RED + "Ceci n'est pas la bonne cl�"));
                            }
                        }
                    }
                }
            }
        }
        @SubscribeEvent
        public void onBlockBreak(BlockEvent.BreakEvent event)
        {
            /**
             * On supprime la porte de la liste si on la casse.
             */
            if(event.getState().getBlock() == Blocks.IRON_DOOR)
            {
                BlockPos pos = event.getPos();
                if(event.getState().getValue(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER)
                {
                    pos = pos.up();
                }
                Position p = new Position(pos, event.getWorld().provider.getDimension());
                doorsPositions.remove(p);
                for(int i = 0; i < event.getPlayer().inventory.getSizeInventory(); i++)
                {
                System.out.println(i);
                event.getPlayer().inventory.setInventorySlotContents(event.getPlayer().inventory.currentItem, new ItemStack(CSCItems.clef));
                event.getWorld().setBlockState(pos.down(3), Blocks.DIRT.getDefaultState());
                }
                System.out.println("");
            }
        }
        /**
         * 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;
            }
        }

    Quand je créer la clé

    [15:21:03] [Server thread/INFO] [STDOUT]: [com.CSC.net.Events.Events:onBlockBreak:173]: 
    [15:21:05] [Server thread/INFO] [STDOUT]: [com.CSC.net.Events.Events:onInteract:124]: false
    [15:21:05] [Client thread/INFO]: [CHAT] §aTu as cr�� une cl�
    [15:21:05] [Client thread/INFO]: [CHAT] §aTu as ouvert la porte
    

    Quand je ferme la porte avec un seul clic:

    
    [15:21:10] [Server thread/INFO] [STDOUT]: [com.CSC.net.Events.Events:onInteract:124]: true
    [15:21:10] [Server thread/INFO] [STDOUT]: [com.CSC.net.Events.Events:onInteract:124]: false
    [15:21:10] [Client thread/INFO]: [CHAT] §aTu as ferm� la porte
    [15:21:10] [Client thread/INFO]: [CHAT] §aTu as ouvert la porte
    
    

    Au final la porte est toujours ouverte.

    J’ai essayer de vire le ! du world.isRemote mais c’est toujours buggé.

    Merci d’avance.</position>

    1 réponse Dernière réponse Répondre Citer 0
    • robin4002
      robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par 10 déc. 2016, 14:27

      Salut,
      La fonction est appelé deux fois, une fois par main.
      Donc forcement elle se referme directement après avoir été ouverte.

      Au lieu de get la main hand, get l’item en fonction de la main utilisé pour le clic droit (event.getHand() le crois).

      1 réponse Dernière réponse Répondre Citer 1
      • Gabs
        Gabs dernière édition par 10 déc. 2016, 16:44

        Ah d’accord ouais c’est bon j’ai trouvé c’était ça: ItemStack stack = e.getEntityPlayer().getHeldItem(e.getHand());

        Merci 🙂

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

        MINECRAFT FORGE FRANCE © 2018

        Powered by NodeBB