MFF

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

    Récupérer le type de block d'un itemstack pour le poser

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    7 Messages 3 Publieurs 2.1k Vues 1 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.
    • O Hors-ligne
      omabeach
      dernière édition par

      bonjour, cela fait quelques jours que je travaille sur un bock deployeur étant tout a f ait novice dans le domaine…
      j’ai suivi des tutoriels, bidouillé,  et je suis presque arrivé au résultat souhaité mais je bloque depuis 2 / jours sur un truc…

      mon deployeur doit remplacer un certain type de block au dessus de lui par un autre.

      la hauteur est réglable via bouton sur le gui
      ça c’est fait et fonctionnel ( grâce au tuto sur la chaine sur le tilentity pour incrémenter ou décrémenter une valeur.)

      le type de block a remplacer est pour l’instant fixe, de même  que le "remplacer par "
      mais je veux que “le block a remplacer " et " remplacer par” soit défini via gui

      donc j’ai crée le gui + contenair qui contient 2 itemstack, toute cette partie fonctionne.
      (merci les tutos)

      mais je n’arrive pas a setblock le type de block qui est dans le slot sélectionné.

      dans l’idée le getStackInSlot(0) est le block a remplacer, et si il est nul, on le considere comme de l’air
      et le getStackInSlot(1) est le block qui remplace, et si il est nul, on le considère comme de l’air

      robin m’a surement donné l’astuce, mais je n’arrive pas a la mettre en oeuvre ;(
      http://www.minecraftforgefrance.fr/showthread.php?tid=2082&pid=32654#pid32654
      il suffit de tester que getStackInSlot(0) != null et que Block.getBlockFromItem(getStackInSlot(0)) != null.
      Ensuite tu utilises Block.getBlockFromItem(getStackInSlot(0)) pour ton setBlock

      mais voila, j’ai eu beau traficoter dans tout les sens la valeur de getstackinslot me revient toujours nul,
      car il me demande de créer la methode getstackinslot, je la crée, 
      après j’avoue que je sais pas trop si je dois, la remplir et comment ><

      du coup je me tourne vers vous avant de lâcher l’affaire et faire autant de “blockdeployeur” que de block deployé voulu…
      si personne se manifeste on passera au plans B

      voici les codes fonctionnel avant que je change tout et n’importe quoi :

      class ModLantien

      package aaa.atlantiscraft.modlantien;
      
      import aaa.atlantiscraft.modlantien.proxy.CommonProxy;
      import cpw.mods.fml.common.Mod;
      import cpw.mods.fml.common.Mod.EventHandler;
      import cpw.mods.fml.common.Mod.Instance;
      import cpw.mods.fml.common.SidedProxy;
      import cpw.mods.fml.common.event.FMLInitializationEvent;
      import cpw.mods.fml.common.event.FMLPostInitializationEvent;
      import cpw.mods.fml.common.event.FMLPreInitializationEvent;
      import cpw.mods.fml.common.network.NetworkRegistry;
      import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
      import cpw.mods.fml.common.registry.GameRegistry;
      import cpw.mods.fml.relauncher.Side;
      import net.minecraft.block.Block;
      import net.minecraft.block.material.Material;
      import net.minecraft.creativetab.CreativeTabs;
      
      @Mod(modid = "modlantia", name = "Mod Lantien", version = "1")
      public class ModLantien {
      
      @Instance("modlantia")
      public static ModLantien instance;
      
      @SidedProxy(clientSide = "aaa.atlantiscraft.modlantien.proxy.ClientProxy", serverSide = "aaa.atlantiscraft.modlantien.proxy.CommonProxy")
      public static CommonProxy proxy;
      public static Block blockdeployeurvitre;
      public static Block blockdeployeurporte;
      public static SimpleNetworkWrapper network;
      
      @EventHandler
      public void preInit(FMLPreInitializationEvent event) {
      
      network = NetworkRegistry.INSTANCE.newSimpleChannel("MyChannel");
      network.registerMessage(DeployeurPacket.Handler.class, DeployeurPacket.class, 0, Side.SERVER);
      network.registerMessage(DeployeurPacketmoins.Handler.class, DeployeurPacketmoins.class, 1, Side.SERVER);
      
      blockdeployeurporte = new BlockDeployeurPorte(Material.rock).setBlockName("deployeur2").setBlockTextureName("modlantia" + ":deployeur_porte").setCreativeTab(CreativeTabs.tabBlock);
      
      GameRegistry.registerBlock(blockdeployeurporte, "deployeur_porte");
      GameRegistry.registerTileEntity(TileEntityDeployeurPorte.class, "modlantia:BlockDeployeurPorte");
      
      }
      
      @EventHandler
      public void init(FMLInitializationEvent event) {
      proxy.registerRender();
      }
      
      @EventHandler
      public void postInit(FMLPostInitializationEvent event) {
      NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandlerModlantien());
      
      }
      }
      
      

      class BlockDeployeurPorte

      package aaa.atlantiscraft.modlantien;
      
      import net.minecraft.block.Block;
      import net.minecraft.block.material.Material;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.init.Blocks;
      import net.minecraft.init.Items;
      import net.minecraft.item.Item;
      import net.minecraft.item.ItemStack;
      import net.minecraft.tileentity.TileEntity;
      import net.minecraft.world.World;
      
      public class BlockDeployeurPorte extends Block {
      
      protected BlockDeployeurPorte(Material material) {
      super(material);
      }
      
      @Override
      public boolean hasTileEntity(int metadata) {
      return true;
      }
      
      @Override
      public TileEntity createTileEntity(World world, int metadata) {
      return new TileEntityDeployeurPorte();
      }
      
      public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX,
      float hitY, float hitZ) {
      if (world.isRemote) {
      return true;
      } else {
      player.openGui(ModLantien.instance, 0, world, x, y, z);
      }
      return false;
      }
      
      public void breakBlock(World world, int x, int y, int z, Block p_149749_5_, int p_149749_6_) {
      if (!world.isRemote) {
      generationoff(world, x, y, z);
      System.out.println("block detruit");
      }
      }
      
      public void onBlockAdded(World world, int x, int y, int z) {
      if (!world.isRemote) {
      if (!world.isBlockIndirectlyGettingPowered(x, y, z)) {
      generationon(world, x, y, z);
      System.out.println("posé si eteint");
      } else if (world.isBlockIndirectlyGettingPowered(x, y, z)) {
      generationoff(world, x, y, z);
      System.out.println("posé si allumé");
      }
      }
      }
      
      public void onNeighborBlockChange(World world, int x, int y, int z, Block p_149695_5_) {
      if (!world.isRemote) {
      if (!world.isBlockIndirectlyGettingPowered(x, y, z)) {
      generationon(world, x, y, z);
      System.out.println();
      } else if (world.isBlockIndirectlyGettingPowered(x, y, z)) {
      generationoff(world, x, y, z);
      System.out.println();
      }
      }
      }
      
      public void generationon(World world, int x, int y, int z) {
      
      TileEntity tile = world.getTileEntity(x, y, z);
      TileEntityDeployeurPorte TileDeployeur = (TileEntityDeployeurPorte) tile;
      
      int hauteur = TileDeployeur.getNumber();
      int remplissage = 0;
      while (remplissage < hauteur) {
      if (world.getBlock(x, y + 1 + remplissage, z) == Blocks.glass_pane);
      world.setBlock(x, y + 1 + remplissage, z, Blocks.stone);
      remplissage++;
      }
      }
      
      public void generationoff(World world, int x, int y, int z) {
      TileEntity tile = world.getTileEntity(x, y, z);
      TileEntityDeployeurPorte TileDeployeur = (TileEntityDeployeurPorte) tile;
      
      int hauteur = TileDeployeur.getNumber();
      int vidage = 0;
      while (vidage < hauteur) {
      if (world.getBlock(x, y + 1 + vidage, z) == Blocks.stone);
      world.setBlock(x, y + 1 + vidage, z, Blocks.glass_pane);
      vidage++;
      }
      }
      
      public boolean isOpaqueCube() {
      return false;
      }
      
      }
      
      

      class TileEntityDeployeurPorte

      package aaa.atlantiscraft.modlantien;
      
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.inventory.IInventory;
      import net.minecraft.item.ItemStack;
      import net.minecraft.nbt.NBTTagCompound;
      import net.minecraft.nbt.NBTTagList;
      import net.minecraft.tileentity.TileEntity;
      import net.minecraftforge.common.util.Constants;
      
      public class TileEntityDeployeurPorte extends TileEntity implements IInventory {
      public int number;
      public ItemStack[] contents = new ItemStack[2];
      private String customName;
      
      @Override
      public void readFromNBT(NBTTagCompound compound) {
      super.readFromNBT(compound);
      this.number = compound.getInteger("Number");
      if(compound.hasKey("CustomName", Constants.NBT.TAG_STRING))
             {
                 this.customName = compound.getString("CustomName");
             }
      
             NBTTagList nbttaglist = compound.getTagList("Items", Constants.NBT.TAG_COMPOUND);
             this.contents = new ItemStack[this.getSizeInventory()];
             for(int i = 0; i < nbttaglist.tagCount(); ++i)
             {
                 NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
                 int j = nbttagcompound1.getByte("Slot") & 255;
      
                 if(j >= 0 && j < this.contents.length)
                 {
                     this.contents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
                 }
             }
         }
      
      @Override
      public void writeToNBT(NBTTagCompound compound) {
      super.writeToNBT(compound);
      compound.setInteger("Number", this.number);
      //// ajout
      if(this.hasCustomInventoryName())
             {
                 compound.setString("CustomName", this.customName);
             }
      
             NBTTagList nbttaglist = new NBTTagList();
             for(int i = 0; i < this.contents.length; ++i)
             {
                 if(this.contents* != null)
                 {
                     NBTTagCompound nbttagcompound1 = new NBTTagCompound();
                     nbttagcompound1.setByte("Slot", (byte)i);
                     this.contents*.writeToNBT(nbttagcompound1);
                     nbttaglist.appendTag(nbttagcompound1);
                 }
             }
             compound.setTag("Items", nbttaglist);
         }
      
      public void increase() {
      this.number++;
      }
      
      public void decrease() {
      this.number–;
      }
      
      public int getNumber() {
      return number;
      }
      
      @Override
         public int getSizeInventory()
         {
             return this.contents.length;
         }
      
         @Override
         public ItemStack getStackInSlot(int slotIndex)
         {
             return this.contents[slotIndex];
         }
      
         @Override
         public ItemStack decrStackSize(int slotIndex, int amount)
         {
             if(this.contents[slotIndex] != null)
             {
                 ItemStack itemstack;
      
                 if(this.contents[slotIndex].stackSize <= amount)
                 {
                     itemstack = this.contents[slotIndex];
                     this.contents[slotIndex] = null;
                     this.markDirty();
                     return itemstack;
                 }
                 else
                 {
                     itemstack = this.contents[slotIndex].splitStack(amount);
      
                     if(this.contents[slotIndex].stackSize == 0)
                     {
                         this.contents[slotIndex] = null;
                     }
                     this.markDirty();
                     return itemstack;
                 }
             }
             else
             {
                 return null;
             }
         }
      
         @Override
         public ItemStack getStackInSlotOnClosing(int slotIndex)
         {
             if(this.contents[slotIndex] != null)
             {
                 ItemStack itemstack = this.contents[slotIndex];
                 this.contents[slotIndex] = null;
                 return itemstack;
             }
             else
             {
                 return null;
             }
         }
      
         @Override
         public void setInventorySlotContents(int slotIndex, ItemStack stack)
         {
             this.contents[slotIndex] = stack;
      
             if(stack != null && stack.stackSize > this.getInventoryStackLimit())
             {
                 stack.stackSize = this.getInventoryStackLimit();
             }
      
             this.markDirty();
         }
      
         @Override
         public String getInventoryName()
         {
             return this.hasCustomInventoryName() ? this.customName : "  Hauteur  ";
         }
      
         @Override
         public boolean hasCustomInventoryName()
         {
             return this.customName != null && !this.customName.isEmpty();
         }
      
         public void setCustomName(String customName)
         {
             this.customName = customName;
         }
      
         @Override
         public int getInventoryStackLimit()
         {
             return 64;
         }
      
         @Override
         public boolean isUseableByPlayer(EntityPlayer player)
         {
             return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
         }
      
         @Override
         public void openInventory()
         {
      
         }
      
         @Override
         public void closeInventory()
         {
      
         }
      
         @Override
         public boolean isItemValidForSlot(int slotIndex, ItemStack stack)
         {
             return true;
         }
      }
      

      voila le tout, merci d’avance a celui qui jetera un ptit oeil ^^
      puis je suis pas contre des critique de correction et d’amelioration ^^

      bonne journée

      https://www.youtube.com/channel/UC74HKvv67kvm8and7xkQfbg

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

        Ça fait un truc comme ça, j’ai pas testé et si ça marche c’est sensiblement pareil pour generationOff

        
        public void generationon(World world, int x, int y, int z) {
        
        TileEntity tile = world.getTileEntity(x, y, z);
        if(tile instanceof TileEntityDeployeurPorte)
        {
        TileEntityDeployeurPorte TileDeployeur = (TileEntityDeployeurPorte) tile;
        
        int hauteur = TileDeployeur.getNumber();
        int remplissage = 0;
        Block blockReplace = TileDeployeur.getStackInSlot(0) != null ? Block.getBlockFromItem(TileDeployeur.getStackInSlot(0).getItem()) : Blocks.air;
        Block blockToReplace = TileDeployeur.getStackInSlot(0) != null ? Block.getBlockFromItem(TileDeployeur.getStackInSlot(1).getItem()) : Blocks.air;
        while (remplissage < hauteur) {
        if (world.getBlock(x, y + 1 + remplissage, z) == blockToReplace);
        world.setBlock(x, y + 1 + remplissage, z, blockReplace);
        remplissage++;
        }
        }
        }
        
        
        1 réponse Dernière réponse Répondre Citer 0
        • O Hors-ligne
          omabeach
          dernière édition par

          un bon début !! ça fonctionne ! ça prend juste pas en compte les metadata des block ><
          je dirais que ça doit se jouer dans le getItem() je pense, je pars chercher 🙂
          je vais essayer de fixer ça ^^

          merci en tout cas 🙂

          https://www.youtube.com/channel/UC74HKvv67kvm8and7xkQfbg

          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

            Pour le metadata tu dois utiliser getStackInSlot(0).getItemMetadata() et world.getBlockMetadata(x, y, z).

            1 réponse Dernière réponse Répondre Citer 0
            • O Hors-ligne
              omabeach
              dernière édition par

              @‘robin4002’:

              Pour le metadata tu dois utiliser getStackInSlot(0).getItemMetadata() et world.getBlockMetadata(x, y, z).

              je n’arrive pas a le mettre, il me demande de tout changer, et si je changer tout comme il veut, ça m’invoque un block de l’id du metadata…

              tu me dit ça d’une manière, 
              que ça parait simple a insérer sans tout changer, alors j’me dit que je fais pas comme il faut…
              dsl d’être mauvais !

              https://www.youtube.com/channel/UC74HKvv67kvm8and7xkQfbg

              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

                public void generationon(World world, int x, int y, int z)
                {
                TileEntity tile = world.getTileEntity(x, y, z);
                if(tile instanceof TileEntityDeployeurPorte)
                {
                TileEntityDeployeurPorte tileDeployeur = (TileEntityDeployeurPorte) tile;
                
                int hauteur = tileDeployeur.getNumber();
                int remplissage = 0;
                Block blockReplace = tileDeployeur.getStackInSlot(0) != null ? Block.getBlockFromItem(tileDeployeur.getStackInSlot(0).getItem()) : Blocks.air;
                Block blockToReplace = tileDeployeur.getStackInSlot(0) != null ? Block.getBlockFromItem(tileDeployeur.getStackInSlot(1).getItem()) : Blocks.air;
                int metaReplace = tileDeployeur.getStackInSlot(0) != null ? tileDeployeur.getStackInSlot(0).getItemMetadata() : 0;
                int metaToReplace = tileDeployeur.getStackInSlot(0) != null ? tileDeployeur.getStackInSlot(1).getItemMetadata() : 0;
                while (remplissage < hauteur)
                {
                if (world.getBlock(x, y + 1 + remplissage, z) == blockToReplace && world.getBlockMetadata(x, y + 1 + remplissage, z) == metaToReplace);
                world.setBlock(x, y + 1 + remplissage, z, blockReplace, metaReplace, 3);
                remplissage++;
                }
                }
                }
                

                Rien de compliqué.

                1 réponse Dernière réponse Répondre Citer 1
                • O Hors-ligne
                  omabeach
                  dernière édition par

                  @‘robin4002’:

                  Rien de compliqué.

                  .getItemMetadata est en fait .getItemDamage
                  ce qui m’a encore plus perturbé pour l’inserer 🙂
                  merci a vous 2, ça fonctionne au poil.

                  je balance le code final si ça sert a d’autre newbie comme moi.
                  & passe le sujet en résolus

                  public void generationon(World world, int x, int y, int z) {
                  
                  TileEntity tile = world.getTileEntity(x, y, z);
                  TileEntityDeployeurPorte TileDeployeur = (TileEntityDeployeurPorte) tile;
                  int hauteur = TileDeployeur.getNumber();
                  int remplissage = 0;
                  Block blockReplace = TileDeployeur.getStackInSlot(0) != null ? Block.getBlockFromItem(TileDeployeur.getStackInSlot(0).getItem()) : Blocks.air;
                         Block blockToReplace = TileDeployeur.getStackInSlot(1) != null ? Block.getBlockFromItem(TileDeployeur.getStackInSlot(1).getItem()) : Blocks.air;
                         int metaReplace = TileDeployeur.getStackInSlot(0) != null ? TileDeployeur.getStackInSlot(0).getItemDamage() : 0;
                         int metaToReplace = TileDeployeur.getStackInSlot(1) != null ? TileDeployeur.getStackInSlot(1).getItemDamage() : 0;
                  
                  while (remplissage < hauteur) {
                  if (world.getBlock(x, y + 1 + remplissage, z) == blockReplace && world.getBlockMetadata(x, y + 1 + remplissage, z) == metaReplace);
                  world.setBlock(x, y + 1 + remplissage, z, blockToReplace, metaToReplace, 3);
                  remplissage++;
                  }
                  }
                  public void generationoff(World world, int x, int y, int z) {
                  TileEntity tile = world.getTileEntity(x, y, z);
                  TileEntityDeployeurPorte TileDeployeur = (TileEntityDeployeurPorte) tile;
                  int hauteur = TileDeployeur.getNumber();
                  int vidage = 0;
                  Block blockReplace = TileDeployeur.getStackInSlot(0) != null ? Block.getBlockFromItem(TileDeployeur.getStackInSlot(0).getItem()) : Blocks.air;
                         Block blockToReplace = TileDeployeur.getStackInSlot(1) != null ? Block.getBlockFromItem(TileDeployeur.getStackInSlot(1).getItem()) : Blocks.air;
                  
                         int metaReplace = TileDeployeur.getStackInSlot(0) != null ? TileDeployeur.getStackInSlot(0).getItemDamage() : 0;
                         int metaToReplace = TileDeployeur.getStackInSlot(1) != null ? TileDeployeur.getStackInSlot(1).getItemDamage() : 0;
                  
                  while (vidage < hauteur) {
                  if (world.getBlock(x, y + 1 + vidage, z) == blockToReplace && world.getBlockMetadata(x, y + 1 + vidage, z) == metaToReplace);
                  world.setBlock(x, y + 1 + vidage, z, blockReplace, metaReplace, 3);
                  vidage++;
                  }
                  }
                  

                  https://www.youtube.com/channel/UC74HKvv67kvm8and7xkQfbg

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

                  MINECRAFT FORGE FRANCE © 2024

                  Powered by NodeBB