Résolu [1.12.2] Faire une rotation de la hitbox
-
Bonjour je vien vers vous pour savoir si ses possible de faire une rotation selon la position du bock (hit box personnaliser)
voici le code java de ma class:
package fr.********.*********.Block; import java.util.Random; import fr.********.*********.Main; import fr.********.*********.Blocks.BlockBase; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.Mirror; import net.minecraft.util.Rotation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class SignalBar extends BlockBase { public SignalBar(String name, Material material) { super(name, material); this.setCreativeTab(Main.tabfamilygame); this.setSoundType(getSoundType().STONE); this.setHardness(3.0F); this.setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH)); } public static final AxisAlignedBB SIGNALBARE_AABB = new AxisAlignedBB(0.0625 * 2, 0, 0.0625 * 2, 0.0625 * 14, 0.0625 * 13, 0.0625 * 14); public boolean isOpaqueCube(IBlockState state) { return false; } public static final PropertyDirection FACING = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL); public IBlockState withRotation(IBlockState state, Rotation rot) { return state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); } public IBlockState withMirror(IBlockState state, Mirror mirrorIn) { return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))); } public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) { return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite()); } public IBlockState getStateFromMeta(int meta) { return this.getDefaultState().withProperty(FACING, EnumFacing.getHorizontal(meta)); } public int getMetaFromState(IBlockState state) { return ((EnumFacing)state.getValue(FACING)).getHorizontalIndex(); } protected BlockStateContainer createBlockState() { return new BlockStateContainer(this, new IProperty[] {FACING}); } public boolean isFullCube(IBlockState state) { return false; } public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return SIGNALBARE_AABB; } }
-
Il n’y a pas de fonction qui fait directement la rotation d’un AABB, donc ce que tu peux faire c’est créer 4 AABB, une par direction et dans getBoundingBox retourner l’AABB qui correspond à la rotation du block.
-
tu peux me fair un exemple ou pas ?
-
Sur quoi tu bloque ?
-
Les 4 AABB je sais pas comment faire
-
Pour les AABB, il faut juste mettre les bonnes valeurs pour que ça corresponde à ce que tu veux. Voici un exemple, c’est pour qu block plat accroché au mur (Un peu comme un item frame ou une peinture, mais c’est un bloc) :
protected static final AxisAlignedBB[] MY_AABB_ARRAY = {new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.1875D), //South new AxisAlignedBB(0.8125D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D), //West new AxisAlignedBB(0.0D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D), //North new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.1875D, 1.0D, 1.0D)};//East
Et dans ton getBoundingBox, tu peux récupérer l’AABB dans le tableau à partir de l’indice horizontal du facing.
-
@lebossmax2 a dit dans [1.12.2] Faire une rotation de la hitbox :
protected static final AxisAlignedBB[] MY_AABB_ARRAY = {new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.1875D), //South
new AxisAlignedBB(0.8125D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D), //West
new AxisAlignedBB(0.0D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D), //North
new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.1875D, 1.0D, 1.0D)};protected static final AxisAlignedBB[] SIGNALBARE_AABB = {new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.1875D), //South new AxisAlignedBB(0.8125D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D), //West new AxisAlignedBB(0.0D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D), //North new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.1875D, 1.0D, 1.0D)};
la je changerais les valeur plus tard.
public AxisAlignedBB[] getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return SIGNALBARE_AABB; }
J’ais mie comme tu a dit mes la je planche ay niveaux du AxisAlignedBB[] qui est souligner en rouge
-
Alors non, getBoundingBox doit toujours retourner un AxisAlignedBB, pas un AxisAlignedBB[]. (D’ailleurs, tu devrais utiliser l’annotation @Override pour être sûr de ne pas te tromper dans la déclaration de la fonction). Et il ne faut pas retourner le tableau en entier, mais seulement l’élément qui t’intéresse en fonction de la rotation. (Tu peux obtenir la rotation du block en faisant
state.getValue(FACING)
) -
@lebossmax2 a dit dans [1.12.2] Faire une rotation de la hitbox :
state.getValue(FACING)
@Override public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return SIGNALBARE_AABB; }
le SIGNALBARE_AABB est en rouge
-
C’est pour ça que j’ai dit qu’il faut pas retourner le tableau en entier
-
comment sa ?
-
tu retourne le bon item dans le tableau
exemple : un tableau ou array en englais c’est une liste d’objets que tu peut recupérer grace a leur index
ARRAY[0] = le premier objet dans ton tableaudans ton cas le tableau contient 4 items
donc tu a les index de 0 a 3 (soit 4 valeurs)
note : en informatique on commence toujours de 0donc en fonction de la rotation tu recup le bon objet avec le bon index dans le tableau
0 = south
1 = west
2 = north
3 = eastvoila les index pour chaque boudingbox de ton tableau
tu a plus qu’a recup le bon bon AxisAlignedBB en fonction de l’orientation de ton block
-
Pourrais tu me donner mes Code d’exemple ? stp
-
plus personne repond a mes publication ?
-
La fonction qu’il te faut est déjà utilisé dans ta classe.
C’est la fonctionstate.getValue(FACING)).getHorizontalIndex()
-
@robin4002 oui mes comment je doit formuler le code mois je ses pas du tous coder
-
tous le monde me dit d’utiliser le state mes je ses pas comment lorganiser
-
@Override public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return SIGNALBARE_AABB[state.getValue(FACING)).getHorizontalIndex()]; }
-
@robin4002 a dit dans [1.12.2] Faire une rotation de la hitbox :
@Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
{
return SIGNALBARE_AABB[state.getValue(FACING)).getHorizontalIndex()];
}merci !! beaucoup