Résolu Transparence d'un bloc / Possibilité d'escalader un bloc
-
Absolument pas, ça ne suffit pas, essaie avec çà :
@Override public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { if (entity.onGround || entity.isCollidedVertically) { return; } if (entity.motionY >= 0.1) { entity.setPosition(entity.posX, entity.posY + 1.0F, entity.posZ); // Ici le + 1.0F correspond à la vitesse de l'échelle, 1.0F est très grand, je te laisse essayer avec tes valeurs } else if (entity.motionY <= -0.1) { Block blockUnder = world.getBlockState(new BlockPos(entity.posX, entity.posY - 3, entity.posZ)).getBlock(); if (blockUnder == null || blockUnder == this) { entity.setPosition(entity.posX, entity.posY - 1.0F, entity.posZ); // Même valeur ici mais en négatif } } }
-
Je ne grimpe toujours pas
Verification de la classepackage eryah.usefulthings.blocks; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumWorldBlockLayer; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import eryah.usefulthings.Reference; import eryah.usefulthings.UsefulthingsMod; public class Scaffolding extends Block { protected Scaffolding(Material materialIn) { super(materialIn); // TODO Auto-generated constructor stub } public static Block scaffolding; public static void init() { scaffolding = new Scaffolding(Material.wood).setUnlocalizedName("scaffolding").setCreativeTab(UsefulthingsMod.UTTab); } public static void register() { GameRegistry.registerBlock(scaffolding, scaffolding.getUnlocalizedName().substring(5)); } public static void registerRenders() { registerRender(scaffolding); } public static void registerRender(Block block) { Item item = Item.getItemFromBlock(block); Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory")); } public boolean renderAsNormalBlock() { return false; } @SideOnly(Side.CLIENT) public EnumWorldBlockLayer getBlockLayer() { return EnumWorldBlockLayer.CUTOUT; } public boolean shouldSideBeRendered(IBlockAccess worldIn, BlockPos pos, EnumFacing side ) { return true; } public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { return true; } @Override public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { if (entity.onGround || entity.isCollidedVertically) { return; } if (entity.motionY >= 0.1) { entity.setPosition(entity.posX, entity.posY + 1.0F, entity.posZ); } else if (entity.motionY <= -0.1) { Block blockUnder = world.getBlockState(new BlockPos(entity.posX, entity.posY - 3, entity.posZ)).getBlock(); if (blockUnder == null || blockUnder == this) { entity.setPosition(entity.posX, entity.posY - 1.0F, entity.posZ); } } } }
-
Mets un System.out.println(“quelque chose”) (ou utilise un logger si tu en as un) et place le dans la fonction onEntityCollidedWithBlock pour voir si la fonction est appellée lorsque tu te colles au block et que tu appuies sur la touche avancer.
-
Ça fonction ne sera jamais appelé car il n’a pas réduit la boite de collision du bloc …
-
Pour que le bloc soit transparent :
@Override @SideOnly(Side.CLIENT) public EnumWorldBlockLayer getBlockLayer() { return EnumWorldBlockLayer.CUTOUT_MIPPED; }
Dans cette première fonction tu peux remplacer CUTOUT_MIPPED par CUTOUT ou par TRANSLUCENT, le mieux c’est de les tester tous pour voir leur différente propriété.
@Override public boolean isVisuallyOpaque() { return false; //Si visuellement opaque } @Override public boolean isOpaqueCube() { return false; //Si effectivement opaque } @Override public boolean isFullCube() { return true; //Si complet }
Et ça c’est le reste des fonctions obligatoires, un peux de recherche par ci par là t’aurais vite conduit à ce résultat.
-
Plus de problème
Enfin… Si
Je peut monter uniquement si je saute contre le bloc, et je monte de 6 blocs max
Si il est possible de corriger le bug, voici ma classepackage eryah.usefulthings.blocks; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.Item; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumWorldBlockLayer; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import eryah.usefulthings.Reference; import eryah.usefulthings.UsefulthingsMod; public class Scaffolding extends Block { protected Scaffolding(Material materialIn) { super(materialIn); // TODO Auto-generated constructor stub } public static Block scaffolding; public static void init() { scaffolding = new Scaffolding(Material.wood).setUnlocalizedName("scaffolding").setCreativeTab(UsefulthingsMod.UTTab); } public static void register() { GameRegistry.registerBlock(scaffolding, scaffolding.getUnlocalizedName().substring(5)); } public static void registerRenders() { registerRender(scaffolding); } public static void registerRender(Block block) { Item item = Item.getItemFromBlock(block); Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory")); } public boolean renderAsNormalBlock() { return false; } @Override public boolean isVisuallyOpaque() { return false; //Si visuellement opaque } @Override public boolean isOpaqueCube() { return false; //Si effectivement opaque } @Override public boolean isFullCube() { return true; //Si complet } @SideOnly(Side.CLIENT) public EnumWorldBlockLayer getBlockLayer() { return EnumWorldBlockLayer.CUTOUT; } public boolean shouldSideBeRendered(IBlockAccess worldIn, BlockPos pos, EnumFacing side ) { switch(side) { case DOWN: return false; default: return true; } } public boolean isLadder(IBlockAccess world, int x, int y, int z, EntityLivingBase entity) { return true; } @Override public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity) { if (entity.onGround || entity.isCollidedVertically) { return; } if (entity.motionY >= 0.1) { entity.setPosition(entity.posX, entity.posY + 1.0F, entity.posZ); } else if (entity.motionY <= -0.1) { Block blockUnder = world.getBlockState(new BlockPos(entity.posX, entity.posY - 3, entity.posZ)).getBlock(); if (blockUnder == null || blockUnder == this) { entity.setPosition(entity.posX, entity.posY - 1.0F, entity.posZ); } } } public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state) { this.setBlockBoundsBasedOnState(worldIn, pos); return super.getCollisionBoundingBox(worldIn, pos, state); } @SideOnly(Side.CLIENT) public AxisAlignedBB getSelectedBoundingBox(World worldIn, BlockPos pos) { this.setBlockBoundsBasedOnState(worldIn, pos); return super.getSelectedBoundingBox(worldIn, pos); } public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos) { this.setBlockBounds(0.1F, 0.1F, 0.1F, 0.9F, 0.9F, 0.9F); } }
-
Need Help guys…
-
@‘Eryah’:
Need Help guys…
On a cours nous, inutile de presser les gens du jour au lendemain.
Le code que je t’ai donné fonctionne sur le fait que le joueur saute car sinon il faudrait regarder son motion sur les axes X et Z en regardant comment est situé le bloque par rapport à çà (libre à toi de le faire si çà te chante). Pour la vitesse de l’échelle, je t’ai dit qu’il fallait changer le “+ 1.0F” et le “- 1.0F” pour aller plus ou moins vite.
-
Surtout que le règlement dit qu’il doit avoir 24h entre deux messages postés à la suite par la même personne …
-
Pas de problème pour la vitesse, je veut pas faire un ascenceur qui monte jusqu’a la couche 256…
Je pense savoir comment faire. J’ai crée un bloc de route. Pour cela, j’ai simplement pris entièrement le code de la soulsand, et j’ai vu cette lignepublic void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) { entityIn.motionX *= 0.4D; entityIn.motionZ *= 0.4D; }
Puis j’ai ajouté la Eryah’s Touch ! ( J’ai simplement fait en sorte qu’on se déplace plus vite lorsque l’ont est en contact avec la route…)
public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn) { entityIn.motionX *= 1.2D; entityIn.motionZ *= 1.2D; }
Je vais tester donc de faire ceci, mais avec un motionY
Edit : Je suis déso de trop vous solliciter, mais je suis rester 1j sans rien faire, car je n’avais plus d’idée
Edit² : (J’ai écrit le message pendant que tu écrivais le tien robin ) Je m’en excuse -
Utiliser un multiplicateur est une TRES mauvaise idée car si en touchant le premier block, le motion du joueur est à 1, il sera ensuite à 1.2, puis 1.44, etc ce qui fera une boucle infinie, de plus essaie de mettre un bloque tout en haut pour t’empêcher de passer : vu que tu n’as pas de condition pour çà tu vas passer à travers ce block.
-
De toute façon, ça ne marche pas
Bon, je laisse le code comme il est.
Je passe le topic en résolu