Multiples boxes de collision sur un rendu TESR rotatif



  • Bonjour tout le monde !

    Je poste cette question qui va surement en intéresser plus d'un.

    En effet, je me suis mis dans l'idée de faire une chaise via un rendu TESR, jusque la, rien de bien complexe.
    Ensuite je l'ai faite tourner, la encore sa peut aller…

    Mais la où je pêche, c'est pour sa hitbox !
    La boite de sélection qui s'affiche autour à été rapide a faire, mais ce qui me pose problème c'est de mettre sur ma chaise deux boites de collision (une pour l'assise et une pour le dossier) et de faire tourner celles-ci avec mon bloc !

    J'ai bien essayé par moi même, et au bout de plusieurs heures je me suis retrouvé avec ceci:

    
    public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB axisalignedBB, List list, Entity entity, IBlockAccess access)
    
    {
    
    TileEntity te = access.getTileEntity(x, y, z);
    
    if(te instanceof TileEntityChair)
    
    {
    
    float f = 0.0625F;
    
    TileEntityChair tile = (TileEntityChair)te;
    
    switch(tile.getDirection()) 
    
       {
    
        case 0:
    
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
    
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
               this.setBlockBounds(0.125F, 0, 0.0625F, 0.875F, 1F, 0.1875F);
    
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
        break;
    
        case 1:
    
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
    
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
        this.setBlockBounds(0.8125F, 0, 0.125F, 0.9375F, 1F, 0.875F);
    
        super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
        break;
    
        case 2:
    
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
    
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
        this.setBlockBounds(0.125F, 0, 0.8125F, 0.875F, 1F, 0.9375F);
    
        super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
        break;
    
        case 3:
    
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
    
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
        this.setBlockBounds(0.0625F, 0, 0.125F, 0.1875F, 1F, 0.875F);
    
        super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
    
        break;
    
        }
    
    }
    
    }
    

    Ce que ça donne ?
    Et bien, je me retrouve avec les boites de collision  par défaut...

    Bref, je suis totalement perdu, et impossible de trouver sur les forums officiels de forge une solution !

    Quelqu’un aurai t'il déjà réussi quelque chose comme sa ?

    Merci de m'avoir lu !


  • Administrateurs

    Tu peux envoyer ta classe complète ?



  • @'robin4002':

    Tu peux envoyer ta classe complète ?

    Bien sur !

    
    package com.sugarshy.harmomod.blocks;
    
    import java.util.List;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.util.IIcon;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    import net.minecraftforge.common.util.ForgeDirection;
    
    import com.sugarshy.harmomod.TileEntity.TileEntityChair;
    import com.sugarshy.harmomod.TileEntity.TileEntityPatternChest;
    import com.sugarshy.harmomod.common.Harmomod;
    import com.sugarshy.harmomod.proxy.ClientProxy;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    
    public class Chair extends Block
    {
    public Chair()
    {
    super(Material.wood);
    }
    
    public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB axisalignedBB, List list, Entity entity, IBlockAccess access)
    {
    TileEntity te = access.getTileEntity(x, y, z);
    if(te instanceof TileEntityChair)
    {
    float f = 0.0625F;
    TileEntityChair tile = (TileEntityChair)te;
    switch(tile.getDirection()) 
       {
        case 0:
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
               this.setBlockBounds(0.125F, 0, 0.0625F, 0.875F, 1F, 0.1875F);
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
        break;
        case 1:
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
        this.setBlockBounds(0.8125F, 0, 0.125F, 0.9375F, 1F, 0.875F);
        super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
        break;
        case 2:
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
        this.setBlockBounds(0.125F, 0, 0.8125F, 0.875F, 1F, 0.9375F);
        super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
        break;
        case 3:
        this.setBlockBounds(0.1F, 0.0F, 0.1F - f, 0.8F, 0.6F, 0.8F);
               super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
        this.setBlockBounds(0.0625F, 0, 0.125F, 0.1875F, 1F, 0.875F);
        super.addCollisionBoxesToList(world, x, y, z, axisalignedBB, list, entity);
        break;
        }
    }
    
    }
    
    @SideOnly(Side.CLIENT)
        public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z)
        {
            return AxisAlignedBB.getBoundingBox((double)x + this.minX+ 0.20D, (double)y + this.minY, (double)z + this.minZ+ 0.20D, (double)x + this.maxX- 0.20D, (double)y + this.maxY+ 0.20D, (double)z + this.maxZ- 0.20D);
        }
    
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
        {
            if(stack.getItemDamage() == 0)
            {
                TileEntity tile = world.getTileEntity(x, y, z);
                if(tile instanceof TileEntityChair)
                {
                    int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
                    ((TileEntityChair)tile).setDirection((byte)direction);
                }
            }
        }
    
    @Override
        public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis)
        {
            if((axis == ForgeDirection.UP || axis == ForgeDirection.DOWN) && !world.isRemote && world.getBlockMetadata(x, y, z) == 0)
            {
                TileEntity tile = world.getTileEntity(x, y, z);
                if(tile instanceof TileEntityChair)
                {
                TileEntityChair tileDirectional = (TileEntityChair)tile;
                    byte direction = tileDirectional.getDirection();
                    direction++;
                    if(direction > 3)
                    {
                        direction = 0;
                    }
                    tileDirectional.setDirection(direction);
                    return true;
                }
            }
            return false;
        }
    
        public ForgeDirection[] getValidRotations(World world, int x, int y, int z)
        {
            return world.getBlockMetadata(x, y, z) == 0 ? new ForgeDirection[] {ForgeDirection.UP, ForgeDirection.DOWN} : ForgeDirection.VALID_DIRECTIONS;
        }
    
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityChair();
    }
    
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    @SideOnly(Side.CLIENT)
    public int getRenderType()
    {
    return ClientProxy.renderInventoryTESRId;
    }
    
    }
    


  • Personne ? 😕


  • Administrateurs

    Je ne sais pas trop pourquoi ça ne fonctionne pas, je viens de comparer avec le code de kévin, lui il utilise ça en plus :
    https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/city/blocks/BlockTrail.java#L1098-L1119