Rendu ISBRH - Hitbox qui bouge



  • Bon, bha c'est encore moi… Je pense avoir bien compris le fonctionnement du rendu ISBRH, j'ai réussi à les orienter selon la position que je veux, donc jusque là tout va bien mais étant donné que je travaille avec des hitxboxs réduites (celle des walls), je vois que selon mon orientation elles se déplacent également...

     Donc sur ce premier screen on voit que la hitbox est fonctionnelle, elle ne bug pas

     Là on voit que la hitbox est buguée

    Elle change uniquement selon où je suis, donc de base, elle est correcte.

    Voici ma classe principale:

    package com.mod.trillium.blocks;
    
    import java.util.List;
    
    import com.mod.trillium.proxy.ClientProxy;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.ItemStack;
    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;
    
    public class BlockRenduIS extends Block {
    public BlockRenduIS(Material p_i45394_1_) {
    super(p_i45394_1_);
    }
    
    @SideOnly(Side.CLIENT)
    public float getAmbientOcclusionLightValue() {
    return 1.0F;
    }
    
    public boolean renderAsNormalBlock() {
    return false;
    }
    
    public boolean isOpaqueCube() {
    return false;
    }
    
    @SideOnly(Side.CLIENT)
    public int getRenderType() {
    return ClientProxy.renderIsbrh;
    }
    
    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockAccess state, int x, int y, int z, int side) {
    return true;
    }
        public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB axisAlignedBB, List list, Entity entity)
        {
            if(world.getBlockMetadata(x, y, z) == 0)
            {
            this.setBlockBounds(0.25F, 0.0F, 0.50F, 0.75F, 1.0F, 1.0F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
    
            }
    
            if(world.getBlockMetadata(x, y, z) == 1)
            {
            this.setBlockBounds(0.0F, 0.0F, 0.25F, 0.50F, 1.0F, 0.75F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
            }
    
            if(world.getBlockMetadata(x, y, z) == 2)
            {
            this.setBlockBounds(0.25F, 0.0F, 0.0F, 0.75F, 1.0F, 0.50F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
            }
    
            if(world.getBlockMetadata(x, y, z) == 3)
            {
            this.setBlockBounds(0.50F, 0.0F, 0.25F, 1.0F, 1.0F, 0.75F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
            }
        }
        public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
        {
            int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
            world.setBlockMetadataWithNotify(x, y, z, direction, 2);
        }
    
    }
    

    Le rendu:

    package com.mod.trillium.renderer;
    
    import java.util.List;
    
    import org.lwjgl.opengl.GL11;
    
    import com.mod.trillium.proxy.ClientProxy;
    
    import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import net.minecraft.block.Block;
    import net.minecraft.client.renderer.RenderBlocks;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.entity.Entity;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    
    public class RenderBlockIsbrh implements ISimpleBlockRenderingHandler
    {
        @Override
        public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
        {
    Tessellator tessellator = Tessellator.instance;
    renderer.setRenderBounds(0.25F, 0.0F, 0.25F, 0.75F, 1.0F, 0.75F);
    this.renderInInventory(tessellator, renderer, block, metadata);
    
        }
    
        @Override
        public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
        {
        if(world.getBlockMetadata(x, y, z) == 0)
            {
                renderer.setRenderBounds(0.25F, 0.0F, 0.50F, 0.75F, 1.0F, 1.0F);
                renderer.renderStandardBlock(block, x, y, z);
            }
    
            if(world.getBlockMetadata(x, y, z) == 1)
            {
                renderer.setRenderBounds(0.0F, 0.0F, 0.25F, 0.50F, 1.0F, 0.75F);
                renderer.renderStandardBlock(block, x, y, z);
            }
    
            if(world.getBlockMetadata(x, y, z) == 2)
            {
                renderer.setRenderBounds(0.25F, 0.0F, 0.0F, 0.75F, 1.0F, 0.50F);
                renderer.renderStandardBlock(block, x, y, z);
            }
    
            if(world.getBlockMetadata(x, y, z) == 3)
            {
                renderer.setRenderBounds(0.50F, 0.0F, 0.25F, 1.0F, 1.0F, 0.75F);
                renderer.renderStandardBlock(block, x, y, z);
            }
    return true;
        }
    
    @Override
        public boolean shouldRender3DInInventory(int modelId)
        {
            return true;
        }
    
        @Override
        public int getRenderId()
        {
            return ClientProxy.renderIsbrh;
        }
    
        private void renderInInventory(Tessellator tessellator, RenderBlocks renderer, Block block, int metadata)
        {
            GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
            tessellator.startDrawingQuads();
            tessellator.setNormal(0.0F, -1F, 0.0F);
            renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(0, metadata));
            tessellator.draw();
            tessellator.startDrawingQuads();
            tessellator.setNormal(0.0F, 1.0F, 0.0F);
            renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(1, metadata));
            tessellator.draw();
            tessellator.startDrawingQuads();
            tessellator.setNormal(0.0F, 0.0F, -1F);
            renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(2, metadata));
            tessellator.draw();
            tessellator.startDrawingQuads();
            tessellator.setNormal(0.0F, 0.0F, 1.0F);
            renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(3, metadata));
            tessellator.draw();
            tessellator.startDrawingQuads();
            tessellator.setNormal(-1F, 0.0F, 0.0F);
            renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, block.getIcon(4, metadata));
            tessellator.draw();
            tessellator.startDrawingQuads();
            tessellator.setNormal(1.0F, 0.0F, 0.0F);
            renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, block.getIcon(5, metadata));
            tessellator.draw();
            GL11.glTranslatef(0.5F, 0.5F, 0.5F);
        }
    }
    

    D'après moi, tout devrait venir de ma classe principale mais je ne comprends pas bien le système de mathématiques et je n'arrive donc pas à déceler le souci. Peut-être le Rendu n'est-il pas fait pour faire des hitboxs réduites ?

    Merci beaucoup de votre attention,
    Kylian.



  • Dans ton deuxième code ligne 54 tu es sur qu'il faut mettre des 1 et non des 0 ?



  • Non, en fait cela défini l'apparence, et elle est parfaitement comme je le veux, c'est le premier code qui influe les hitbox mais j'ai mis les deux par précaution



  • Up  :interrogation:



  • C'est la hitbox ou le rendu qui est bugué pour toi ?



  • C'est uniquement la hitbox, le rendu est impeccable, la hitbox se déplace selon ma position mais se place correctement de base, c'est uniquement une fois un déplacement effectué…

        public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
        {
            int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
            world.setBlockMetadataWithNotify(x, y, z, direction, 2);
    

    j'imagine que c'est ces lignes qui sont à la base du problème, étant donné que une fois que je supprime ces lignes, la hitbox ne bouge plus mais alors le bloc n'a qu'une seule position (donc plus de metadatas reconnues)

    La seule solution que j'ai trouvée est pas très agréable pour les joueurs (4 blocs différents) et on s'y perdrait un peu..

    Merci de me venir en aide, vraiment !

    Bonne soirée, Kylian



  • Donc si j'ai compris ton block est orientable selon l'orientation où on le pose, mais la hitbox ne suit pas. Pour faire en sorte qu'elle s'adapter, il faut l'adapter à la metadata (hitbox) du block, il suffit d'implémenter cette fonction ```java
    @Override
    public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z)
    {

    }

    PS : à vérifier mais tu devrais pouvoir retirer "addCollisionBoxesToList" par la même occasion.


  • [Edité]

    Voilà, alors Aymeric, c'est la deuxième fois que tu m'aides à résoudre un souci et sincèrement, merci ! Cela faisait plusieurs semaines que je bloquais sur l'affaire .. 😛

    Si l'on retire le "addCollisionBoxesToList", il y a des bugs où l'on peut passer au travers, en le laissant, tout fonctionne comme je le souhaite 😉

    Pour ceux que ça intéresse:

    package com.mod.trillium.blocks;
    
    import java.util.List;
    
    import com.mod.trillium.proxy.ClientProxy;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.ItemStack;
    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;
    
    public class BlockRenduIS extends Block {
    public BlockRenduIS(Material p_i45394_1_) {
    super(p_i45394_1_);
    }
    
    @SideOnly(Side.CLIENT)
    public float getAmbientOcclusionLightValue() {
    return 1.0F;
    }
    
    public boolean renderAsNormalBlock() {
    return false;
    }
    
    public boolean isOpaqueCube() {
    return false;
    }
    
    @SideOnly(Side.CLIENT)
    public int getRenderType() {
    return ClientProxy.renderIsbrh;
    }
    
    @SideOnly(Side.CLIENT)
    public boolean shouldSideBeRendered(IBlockAccess state, int x, int y, int z, int side) {
    return true;
    }
        public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB axisAlignedBB, List list, Entity entity)
        {
            if(world.getBlockMetadata(x, y, z) == 0)
            {
            this.setBlockBounds(0.25F, 0.0F, 0.50F, 0.75F, 1.0F, 1.0F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
            }
    
            if(world.getBlockMetadata(x, y, z) == 1)
            {
            this.setBlockBounds(0.0F, 0.0F, 0.25F, 0.50F, 1.0F, 0.75F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
            }
    
            if(world.getBlockMetadata(x, y, z) == 2)
            {
            this.setBlockBounds(0.25F, 0.0F, 0.0F, 0.75F, 1.0F, 0.50F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
            }
    
            if(world.getBlockMetadata(x, y, z) == 3)
            {
            this.setBlockBounds(0.50F, 0.0F, 0.25F, 1.0F, 1.0F, 0.75F);
                super.addCollisionBoxesToList(world, x, y, z, axisAlignedBB, list, entity);
            }
        }
    
        @Override
    public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) 
    {
          if(world.getBlockMetadata(x, y, z) == 0)
               {
                this.setBlockBounds(0.25F, 0.0F, 0.50F, 0.75F, 1.0F, 1.0F);
               }
    
          if(world.getBlockMetadata(x, y, z) == 1)
               {
                this.setBlockBounds(0.0F, 0.0F, 0.25F, 0.50F, 1.0F, 0.75F);
               }
    
          if(world.getBlockMetadata(x, y, z) == 2)
               {
                this.setBlockBounds(0.25F, 0.0F, 0.0F, 0.75F, 1.0F, 0.50F);
               }
    
          if(world.getBlockMetadata(x, y, z) == 3)
               {
                this.setBlockBounds(0.50F, 0.0F, 0.25F, 1.0F, 1.0F, 0.75F);
               }  
    }
    
        public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
        {
            int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
            world.setBlockMetadataWithNotify(x, y, z, direction, 2);
        }
    
    }
    ``` 
    
    Merci encore !