NBTTag et IIcon



  • je reviens avec mon blockSafeZone 😜 je cherche a faire en sorte que lorsque je right clic avec un block dessus il récupère la texture du bloc que il j'ai en main alors j'ai fait ce code toujours aussi sale

    :::

    
       @Override
       public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9)
       {
               TileEntity tile = world.getTileEntity(x, y, z);
               TileEntitySafeZone Tile = (TileEntitySafeZone)tile;
    
       if (!world.isRemote){
    
        if(player.isSneaking()){
        Tile.IncreaseState();
    
            if(Tile.GetState() == 0){
            this.State = "left";
            }
            if(Tile.GetState() == 1){
            this.State = "up";
            }
            if(Tile.GetState() == 2){
            this.State = "Down";
            }
            if(Tile.GetState() == 3){
            this.State = "Right";
            }
            if(Tile.GetState() == 4){
            this.State = "nothing";
            }
        player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "State set to: " + State + Tile.GetState()));
        }else if(player.getHeldItem() == null){
        Tile.IncreaseRadius();
        player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "radius set to: " + Tile.GetRadius() + " block"));
        }
        //get texture
          else if (player.getHeldItem().getItem() instanceof ItemBlock) {
             camouflageIcon = player.getHeldItem().getIconIndex();
             return true;
          }
        }
    
    return true;
    }
       //set texture
       @SideOnly(Side.CLIENT)
       @Override
       public IIcon getIcon(int side, int meta) {
           return this.camouflageIcon;
       }
    

    :::

    ça fonctionne plutôt bien sauf avec les metadata exemple si je right clic avec un laine noire le bloc devient de la laine blanche et inversement avec la laine noire les metadata ont l air d'être inversé ça c'est le premier probleme

    Ensuite lorsque je change la texture d'un block dans le monde tout les autres block change de texture j'ai essayer de faire ce code dans le tileEntity mais ça changeait absolument rien car je sait pas si cette méthode peut être utilisé a l’intérieur du tileEntity::::

       public IIcon getIcon(int side, int meta) {return this.camouflageIcon;}
    

    :::
    Pour que la texture s'applique uniquement a une seule instance de bloc

    et pour le dernier c'est la sauvegarde de la texture je vois pas comment procéder pour la sauvegarder j’ avait pensé aux NbtTag sauf que les IIcon ne peuvent pas enfin je pense pas être écrit/lut dans un tag sauf sous forme de String (en utilisant ToString) mais je vois pas comment reconvertir le string vers IIcon

    merci d'avance pour votre aide


  • Administrateurs

    Il faut utiliser
    public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side)
    pour mettre la texture dans le tile entity.



  • La texture ne s'applique pas
    Block:
    :::

    package virusz.block;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemBlock;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ChatComponentText;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.World;
    
    import org.lwjgl.input.Keyboard;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import virusz.core.VirusZCore;
    import virusz.tileEntity.TileEntitySafeZone;
    
    public class BlockSafeZone extends Block
    {
    private String State = "nothing";
    public BlockSafeZone(Material par2Material)
    {
    super(par2Material);
    this.setBlockUnbreakable();
    this.setCreativeTab(VirusZCore.Blocks);
    }
    
    @Override
       public boolean isOpaqueCube()
       {
           return false;
       }
    
       @Override
       public boolean renderAsNormalBlock()
       {
           return false;
       }  
       @Override
       public TileEntity createTileEntity(World world, int metadata)
       {
           return new TileEntitySafeZone();
       }
    
       @Override
       public boolean hasTileEntity(int metadata)
       {
           return true;
       }
       @Override
       public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9)
       {
               TileEntity tile = world.getTileEntity(x, y, z);
               TileEntitySafeZone Tile = (TileEntitySafeZone)tile;
    
       if (!world.isRemote){
    
        if(player.isSneaking()){
        Tile.IncreaseState();
    
            if(Tile.GetState() == 0){
            this.State = "left";
            }
            if(Tile.GetState() == 1){
            this.State = "up";
            }
            if(Tile.GetState() == 2){
            this.State = "Down";
            }
            if(Tile.GetState() == 3){
            this.State = "Right";
            }
            if(Tile.GetState() == 4){
            this.State = "nothing";
            }
        player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "State set to: " + State + Tile.GetState()));
        }else if(player.getHeldItem() == null){
        Tile.IncreaseRadius();
        player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "radius set to: " + Tile.GetRadius() + " block"));
        }
        //get texture
          else if (player.getHeldItem().getItem() instanceof ItemBlock) {
          Tile.GetTextureData();
             return true;
          }
        }
    
    return true;
    }
    
       @Override
       public void onEntityWalking(World world, int x, int y, int z, Entity entity){
               EntityPlayer player = (EntityPlayer)entity;
               TileEntity tile = world.getTileEntity(x, y, z);
               TileEntitySafeZone Tile = (TileEntitySafeZone)tile;
    
        double X = entity.posX;
        double Y = entity.posY;
        double Z = entity.posZ;
        double RADIUS = Tile.GetRadius();
        System.out.println("OnWalking" + Tile.GetState());
    
        if(Tile.GetState() == 0){
        player.setPosition(X-RADIUS, Y, Z);
        }
        if(Tile.GetState() == 1){
        player.setPosition(X, Y, Z-RADIUS);
        }
        if(Tile.GetState() == 2){
        player.setPosition(X, Y, Z+RADIUS);
        }
        if(Tile.GetState() == 3){
        player.setPosition(X+RADIUS, Y, Z);
        }
    
       }
    }
    
    

    :::
    tile Entity
    :::

    package virusz.tileEntity;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.network.NetworkManager;
    import net.minecraft.network.Packet;
    import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.IBlockAccess;
    
    public class TileEntitySafeZone extends TileEntity {
    
    private double radius = 5;
    private int state;
    private IIcon camouflageIcon;
    
       public void IncreaseState(){
        if(state > 3){
        state = state-4;
        }else{
        state++;
        }
           this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
       }
       public int GetState(){
        return state;
       }
       public void IncreaseRadius(){
        if(radius > 60){
        radius = radius-60;
        }else{
        radius = radius+5;
        }
           this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
       }
       public Double GetRadius(){
        return radius;
       }
       @Override
       public void writeToNBT(NBTTagCompound compound)
       {
           super.writeToNBT(compound);
           compound.setInteger("state", this.state);
           compound.setDouble("radius", radius);
       }
       @Override
       public void readFromNBT(NBTTagCompound compound)
       {
           super.readFromNBT(compound);
           this.state = compound.getInteger("state");
           this.radius = compound.getDouble("radius");
       }
    public Packet getDescriptionPacket()
    {
    NBTTagCompound nbttagcompound = new NBTTagCompound();
    this.writeToNBT(nbttagcompound);
    return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound);
    }
    
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
    {
    this.readFromNBT(pkt.func_148857_g());
    }
    
    public void GetTextureData(){
    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
         camouflageIcon = player.getHeldItem().getIconIndex();
         System.out.println(camouflageIcon+"test");
    }
    public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side){
    return camouflageIcon;
    }
    }
    
    

    :::



  • La méthode getIcon est sur le block, pas la tileEntity



  • Si je set dans le block tout les bloc ont le même texture mon but c est que chaque block puisse être texturé différemment
    reprend moi si je dit une connerie xD



  • Hein ? Une classe par block, après tu peux utiliser les metadatas, mais c'est une classe par block


  • Administrateurs

    Tu mets :
    public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side)
    Dans le bloc. Dans cette fonction tu as world, x, y et z donc tu peux récupérer le tile entity, et l’icône qui se trouve dans le tile entity.



  • Edit: Robin viens de répondre xD

    je doit faire quelque choses dans le genre je suppose mais ça fonctionne pas

    @Override
    public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side){
    TileEntity tile = world.getTileEntity(x, y, z);
    TileEntitySafeZone Tile = (TileEntitySafeZone)tile;
    return Tile.getIIcon();
    }
    
    
    public IIcon getIIcon(){
    return camouflageIcon;
    }
    
    

  • Administrateurs

    camouflageIcon est une variable static ou non ?



  • Non elle est pas static


  • Administrateurs

    ça devrait fonctionner alors.
    Envois tout ton code actuel.



  • en la passant static ça fonctionne" mais tout les bloc récupère la texture alors que je voudrait que chaque instance ai sa propre texture

    :::

    package virusz.tileEntity;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.network.NetworkManager;
    import net.minecraft.network.Packet;
    import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.IBlockAccess;
    
    public class TileEntitySafeZone extends TileEntity {
    
    private double radius = 5;
    private int state;
    private static IIcon camouflageIcon;
    
    public void IncreaseState(){
    if(state > 3){
    state = state-4;
    }else{
    state++;
    }
    this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
    }
    public int GetState(){
    return state;
    }
    public void IncreaseRadius(){
    if(radius > 60){
    radius = radius-60;
    }else{
    radius = radius+5;
    }
    this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
    }
    public Double GetRadius(){
    return radius;
    }
    @Override
    public void writeToNBT(NBTTagCompound compound)
    {
    super.writeToNBT(compound);
    compound.setInteger("state", this.state);
    compound.setDouble("radius", radius);
    }
    @Override
    public void readFromNBT(NBTTagCompound compound)
    {
    super.readFromNBT(compound);
    this.state = compound.getInteger("state");
    this.radius = compound.getDouble("radius");
    }
    public Packet getDescriptionPacket()
    {
    NBTTagCompound nbttagcompound = new NBTTagCompound();
    this.writeToNBT(nbttagcompound);
    return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound);
    }
    
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
    {
    this.readFromNBT(pkt.func_148857_g());
    }
    
    public void GetTextureData(){
    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    camouflageIcon = player.getHeldItem().getIconIndex();
    System.out.println(camouflageIcon+"test");
    }
    public IIcon getIIcon(){
    return camouflageIcon;
    }
    }
    
    

    :::

    :::

    package virusz.block;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.ItemBlock;
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ChatComponentText;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraft.util.EnumChatFormatting;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    
    import org.lwjgl.input.Keyboard;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import virusz.core.VirusZCore;
    import virusz.tileEntity.TileEntitySafeZone;
    
    public class BlockSafeZone extends Block
    {
    private String State = "nothing";
    public BlockSafeZone(Material par2Material)
    {
    super(par2Material);
    this.setBlockUnbreakable();
    this.setCreativeTab(VirusZCore.Blocks);
    }
    
    @Override
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    @Override
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntitySafeZone();
    }
    
    @Override
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9)
    {
    TileEntity tile = world.getTileEntity(x, y, z);
    TileEntitySafeZone Tile = (TileEntitySafeZone)tile;
    
    if (!world.isRemote){
    
    if(player.isSneaking()){
    Tile.IncreaseState();
    
    if(Tile.GetState() == 0){
    this.State = "left";
    }
    if(Tile.GetState() == 1){
    this.State = "up";
    }
    if(Tile.GetState() == 2){
    this.State = "Down";
    }
    if(Tile.GetState() == 3){
    this.State = "Right";
    }
    if(Tile.GetState() == 4){
    this.State = "nothing";
    }
    player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "State set to: " + State + Tile.GetState()));
    }else if(player.getHeldItem() == null){
    Tile.IncreaseRadius();
    player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "radius set to: " + Tile.GetRadius() + " block"));
    }
    //get texture
    else if (player.getHeldItem().getItem() instanceof ItemBlock) {
    Tile.GetTextureData();
    return true;
    }
    }
    
    return true;
    }
    @Override
    public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side){
    TileEntity tile = world.getTileEntity(x, y, z);
    TileEntitySafeZone Tile = (TileEntitySafeZone)tile;
    return Tile.getIIcon();
    }
    
    @Override
    public void onEntityWalking(World world, int x, int y, int z, Entity entity){
    EntityPlayer player = (EntityPlayer)entity;
    TileEntity tile = world.getTileEntity(x, y, z);
    TileEntitySafeZone Tile = (TileEntitySafeZone)tile;
    
    double X = entity.posX;
    double Y = entity.posY;
    double Z = entity.posZ;
    double RADIUS = Tile.GetRadius();
    System.out.println("OnWalking" + Tile.GetState());
    
    if(Tile.GetState() == 0){
    player.setPosition(X-RADIUS, Y, Z);
    }
    if(Tile.GetState() == 1){
    player.setPosition(X, Y, Z-RADIUS);
    }
    if(Tile.GetState() == 2){
    player.setPosition(X, Y, Z+RADIUS);
    }
    if(Tile.GetState() == 3){
    player.setPosition(X+RADIUS, Y, Z);
    }
    
    }
    }
    
    

    :::


  • Administrateurs

    La variable ne doit pas être static.
    Utiliser :
    public void GetTextureData(){
    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    camouflageIcon = player.getHeldItem().getIconIndex();
    Minecraft.getMinecraft() ici n'est pas du tout une bonne idée.



  • Edit:j'ai trouver

    j'ai fait ca:

    public class BlockSafeZone extends Block
    {
    EntityPlayer player;
    

    tellement l'habitude de tout faire avec des var local que j'avait oublier que on pouvait faire ca mais ca change pas le probleme si je passe le IIcon en static ça fonctionne mais en non static ça ne fonctionne pas :c



  • et la texture est appliquer a tout les bloc sur le monde



  • Personne a une idée?


  • Administrateurs



  • je vois pas comment ca peut m'aider si je comprend bien c'est un bloc que tu peut private mais ce que j ai vu aussi c'est que tu register les textures en manuel si je fait ca je vais un peu galérer sachant que je veut pas utiliser uniquement quelques bloc mais bien tout les blocks du jeu après j'ai juste survolé le code je lis ça plus en détail pour vois mais si je doit créé une metadata+une texture par block présent dans minecraft je pense que le bloc risque d’être un peu lourd


  • Administrateurs

    C'est un bloc qui change de texture lorsque tu fais un clic droit dessus avec un autre bloc. Peu-importe le quel c'est.
    Ne te soucis pas des metadatas, c'est parce qu'il y a d'autres blocs.



  • Je regarde ça demain je suis trop crever pour réfléchir a demain je vous retient au courant


Log in to reply