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



  • 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


  • Rédacteurs

    Ç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++;
    }
    }
    }
    
    


  • 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 🙂


  • Administrateurs

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



  • @'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 !


  • Administrateurs

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



  • @'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++;
    }
    }