Résolu Problème Système de porte.
-
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>
-
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).
-
Ah d’accord ouais c’est bon j’ai trouvé c’était ça: ItemStack stack = e.getEntityPlayer().getHeldItem(e.getHand());
Merci