Bloc TESR / Collision
-
Bonjour les gens,
Petit soucis de collision avec des blocs à rendus spéciaux, ça arrive assez aléatoirement je pense et en cassant/reposant le bloc le soucis se règle (du moins temporairement)
Le soucis est que le joueur peut rester bloquer en étant déplacé de haut en bas ou d’avant en arrière suivant la collision.
Je pensais que régler les bordures de blocs suffisait pour régler les collisions avec celui-ci mais ça n’est peut-être pas la cas.
Voici une classe d’un bloc TESR:package fr.folgansky.powerdeco.common; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import fr.folgansky.powerdeco.client.TileEntityBorne; import fr.folgansky.powerdeco.proxy.ClientProxy; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class BlockBorne extends Block { protected BlockBorne(Material mat) { super(mat); } @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { this.setBlockBounds(0.2F, 0.0F, 0.2F, 0.8F, 0.9F, 0.8F); } @Override public int damageDropped(int metadata) { return metadata; } @Override public boolean hasTileEntity(int metadata) { return true; } @Override public TileEntity createTileEntity(World world, int metadata) { return new TileEntityBorne(); } @Override 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 TileEntityBorne) { int direction = MathHelper.floor_double(living.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; ((TileEntityBorne) 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 TileEntityBorne) { TileEntityBorne tileDirectional = (TileEntityBorne) tile; byte direction = tileDirectional.getDirection(); direction++; if (direction > 3) direction = 0; tileDirectional.setDirection(direction); return true; } } return false; } @Override 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; } @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } public boolean canBeCollidedWith() { return true; } @Override @SideOnly(Side.CLIENT) public int getRenderType() { return ClientProxy.tesrRenderId; } }
Un avis sur ce soucis et/ou il n’y a rien à y faire?
-
Et un ```java
this.setBlockBounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ)EDIT : Sinon essai ```java @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB box, List list, Entity entity) { list.add(new AxisAlignedBB(0.2F, 0.0F, 0.2F, 0.8F, 0.9F, 0.8F)); } }
Ou encore ```java
@Override
public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) {}
{
world.getBlock(x, y, z).setBlockBounds(0.2F, 0.0F, 0.2F, 0.8F, 0.9F, 0.8F);
} -
C’quoi la différence entre “world.getBlock(x, y, z)” et “this” au final?
Ce n’est pas plus lourd de checker le bloc?
-
Je sais pas, tu as testé la solution avec addCollisionBoxesToList ?
-
Eclipse réclame un constructeur pour AxisAlignedBB
-
Remplace par AxisAlignedBB.getBoundingBox(0.2F, 0.0F, 0.2F, 0.8F, 0.9F, 0.8F)
-
Là il dit que ça ne correspond à rien en fait. “fix setup” pour seule proposition.
-
Bah je sais pas, moi il connait xD. En fait je ne vois pas pourquoi mettre this.this.setBlockBounds(0.2F, 0.0F, 0.2F, 0.8F, 0.9F, 0.8F); dans le constructeur ne fonctionne pas, ça devrait, après je sais pas si cette fonction change la boite collision
-
AxisAlignedBB n’a pas de constructeur publique, il faut utiliser la méthode statique AxisAlignedBB.getBoundingBox, tu as différentes fonctions pour les collisions : regarde le tutoriel sur les TESR pour voir quelles fonctions modifier
-
@‘Toutoune1008’:
C’quoi la différence entre “world.getBlock(x, y, z)” et “this” au final?
Ce n’est pas plus lourd de checker le bloc?
Aucune car c’est toujours la même instance du block pour tous les blocks de ce type dans le monde.
-
Il n’y a aucune mention de “collision” dans le tuto de robin sur un rendu par TESR
-
-
Ok ok, je rectifie mon propos:
Il n’y a rien de nouveau à mes yeux concernant la collision dans ce tuto.
Justement je fais exactement comme ça actuellement.J’ai testé le conseil de le mettre dans le constructeur, ce qui ne pose pas de problème nouveau mais le problème qui m’amène ici persiste.
Problème:
Le joueur glitch dans mes blocs à rendu par TESR (bien que/alors que mon code résulte du tuto)
Pas tous, pas tout le temps, remplacer le bloc réduit temporairement le problème -
Personnellement j’ai aucun problème alors que le code est le même :
http://puu.sh/psI2b.jpg -
Cela doit dépendre de la version de Forge.
-
J’ai testé ce code sur une “vieille” version de forge : 1.7.10-10.13.4.1492
-
Ouki, je suis un peu plus en arrière, j’utilise la 1448 mais c’est pareil je suppose.
Est ce que bloquer l’update du tileEntity pourrait jouer? (Il est sur false en gros)
-
La seule chose que j’ai modifié dans ton code c’est que j’ai retiré la TileEntity et donc la direction, en sachant que ton bloc n’a pas une boîte de collision différente pour chaque direction je ne voit pas d’où pourrait venir le problème, envoi une photo ou une vidéo parce que là je comprends pas comment c’est possible
-
Le problème n’arrive pas systématiquement sur chaque bloc posé.
Par contre maintenant que tu en parles j’ai des blocs dont la hitbox dépend de la direction qui lui cause problème relativement “plus souvent” que les autres.
package fr.folgansky.powerdeco.common; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import fr.folgansky.powerdeco.client.TileEntityWoodPlank; import fr.folgansky.powerdeco.proxy.ClientProxy; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public class BlockWoodPlank extends Block { protected BlockWoodPlank(Material mat) { super(mat); } @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { TileEntity tile = world.getTileEntity(x, y, z); if(tile instanceof TileEntityWoodPlank) { TileEntityWoodPlank tileEntityWoodPlank = (TileEntityWoodPlank)tile; switch(tileEntityWoodPlank.getDirection()) { case 0: world.getBlock(x, y, z).setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 0.1F); break; case 1: world.getBlock(x, y, z).setBlockBounds(0.9F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); break; case 2: world.getBlock(x, y, z).setBlockBounds(0.0F, 0.0F, 0.9F, 1.0F, 2.0F, 1.0F); break; case 3: world.getBlock(x, y, z).setBlockBounds(0.0F, 0.0F, 0.0F, 0.1F, 2.0F, 1.0F); break; } } } @Override public int damageDropped(int metadata) { return metadata; } @Override public boolean hasTileEntity(int metadata) { return true; } @Override public TileEntity createTileEntity(World world, int metadata) { return new TileEntityWoodPlank(); } @Override 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 TileEntityWoodPlank) { int direction = MathHelper.floor_double(living.rotationYaw * 4.0F / 360.0F + 2.5D) & 3; ((TileEntityWoodPlank) 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 TileEntityWoodPlank) { TileEntityWoodPlank tileDirectional = (TileEntityWoodPlank) tile; byte direction = tileDirectional.getDirection(); direction++; if (direction > 3) direction = 0; tileDirectional.setDirection(direction); return true; } } return false; } @Override 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; } @Override public boolean isOpaqueCube() { return false; } @Override public boolean renderAsNormalBlock() { return false; } public boolean canBeCollidedWith() { return true; } @Override @SideOnly(Side.CLIENT) public int getRenderType() { return ClientProxy.tesrRenderId; } }
Mais j’ai simplement suivi le tuto encore une fois.
Le problème pourrait provenir de la tileEntity qui est “mal” update?
-
Rajoute un System.out.prinln pour vérifier la direction, ça peut aussi venir d’une mauvaise synchro client-serveur