Résolu 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 guidonc 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’airrobin 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 setBlockmais 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 Bvoici 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
-
Ç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
-
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 ! -
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ésoluspublic 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++; } }