Résolu Falling Block : condition
-
Bonsoir, c’est (encore) moi
Plutôt que de me dégouter du modding avec mon problème toujours pas entièrement résolus sur l’interface, j’ai décidé de m’attaquer à une autre partie de mon arme : les attaque de zones.
Pour cela, je me suis créer plusieurs classes (qui ne sont pas encore totalement optimisé, surtout sur les grosses zone) : Cliquez ici (GitHub)
Jusque la ça allais. Puis arrive le premier problème. Dans ma classe : JScythe (GitHub), je créer un dôme creux, puis je remplace chaque position autorisé par un block de feu que j’ai créer.
C’est la tous le problème.
Pour créer ma classe Fire Block (GitHub), je créer une entends de la classe FallingBlock (GitHub). la classe FallingBlock (GitHub) ne me servant qu’a rajouter mes fonctions pour assisté la création de la texture/oreDictionnary, on peu considérer que Fire Block (GitHub) est une extension directe de de la classe Minecraft “BlockFalling”.
Le problème est que justement, je veux rendre cette classe spécial. Tous d’abors, elle doit, lorsqu’elle touche le sol, se transformer en un object de la classe “Fire” de Minecraft.
Celle partie est faite grâce à :public void onEndFalling(World worldIn, BlockPos pos) { worldIn.setBlockState(pos, Blocks.fire.getDefaultState()); }
La deuxième partie (la chute) est gerer par cette partie :
public static boolean canFallInto(World worldIn, BlockPos pos) { boolean canFall = false; if (worldIn.isAirBlock(pos)) { Block block = worldIn.getBlockState(pos).getBlock(); Material material = block.getMaterial(); if(material == Material.fire || material == Material.air) { canFall = true; } else { if(block instanceof BlockBush || block instanceof BlockStaticLiquid || block instanceof JFireBlock) { canFall = true; } } } return canFall;
Les problèmes sont donc les suivants :
- Si le block ne peu pas bouger dès sa création, alors il reste en l’état. Le problème est que “canFallInto” est une fonction statique, il n’est donc pas possible de faire appel a la fonction “onEndFalling”.
- Ma condition pour vérifier si le bloc peu bouger ( if( (block instanceof BlockBush || block instanceof JFireBlock) && !(block instanceof BlockStaticLiquid) ) ) ne semble fonctionner qu’en partie. Les block instance de “Bush” sont correctement écrasé. En revanche, si il s’agit d’un block instance de lui même, il n’en a strictement rien a faire. De même, si il s’agit d’un block instance de liquide (eau/lave). Dans le premier cas, il considère qu’il ne peu pas bouger, et dans le second cas, il considère qu’il peu (alors que cela devrai être l’inverse).
- Si mon bloque chute sur une torche, alors il réagit comme le sable/gravier : il deviens un block. Et ceux malgré le fait que la quantité dropé soit régler sur 0. De plus, je ne vois aucune portion du code qui gère ce cas… Du coup je ne sais pas comment l’en empêcher…
Mici les gens pour votre aide passé, et futur je l’espère
-
Il me semble que le drop est directement géré dans la classe EntityFalling
Pour ton autre problème, comme la fonction canFallInto est static tu ne peux pas l’override, c’est pour ça qu’elle n’a aucun effet. -
Pour le drop, je verrai avec ton indication demain.
Pour le canFallInto, je savais que le static empêcher de l’override, du coup j’ai copier/coller (et modifier aussi) la seul fonction qui utilisai “canFallInto”. Il me semblais que l’ordre de priorité faisais que ma fonction situer dans ma classe fasse appelle à la fonction situer dans sa propre classe. Malheureusement, il semblerai que cela ne fonctionne pas
:::
package fr.Jodge.jodgeLibrary.common.block; import java.util.Map; import java.util.Random; import com.google.common.collect.Maps; import fr.Jodge.jodgeLibrary.common.Main; import fr.Jodge.jodgeLibrary.common.function.JFunction; import net.minecraft.block.Block; import net.minecraft.block.BlockBush; import net.minecraft.block.BlockFalling; import net.minecraft.block.BlockFire; import net.minecraft.block.BlockStaticLiquid; import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.init.Blocks; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.oredict.OreDictionary; public class JFireBlock extends JFallingBlock { private String oreDictionnaryName; private final Map encouragements = Maps.newIdentityHashMap(); private final Map flammabilities = Maps.newIdentityHashMap(); public JFireBlock() { super(Material.fire, "Fall Fire", Main.MODID, "firefall"); } public int tickRate(World worldIn) { return 30; } // – FALLING --- // public boolean canFallIntoBlock(World worldIn, BlockPos pos) { boolean canFall = false; if (worldIn.isAirBlock(pos)) { Block block = worldIn.getBlockState(pos).getBlock(); Material material = block.getMaterial(); if(material == Material.fire || material == Material.air) { canFall = true; } else { if( (block instanceof BlockBush || block instanceof JFireBlock) && !(block instanceof BlockStaticLiquid) ) { canFall = true; } } } return canFall; } public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) { if (!worldIn.isRemote) { this.checkFallable(worldIn, pos); } } private void checkFallable(World worldIn, BlockPos pos) { if (canFallIntoBlock(worldIn, pos.down()) && pos.getY() >= 0) { byte b0 = 32; if (!fallInstantly && worldIn.isAreaLoaded(pos.add(-b0, -b0, -b0), pos.add(b0, b0, b0))) { if (!worldIn.isRemote) { EntityFallingBlock entityfallingblock = new EntityFallingBlock(worldIn, (double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D, worldIn.getBlockState(pos)); this.onStartFalling(entityfallingblock); worldIn.spawnEntityInWorld(entityfallingblock); } } else { worldIn.setBlockToAir(pos); BlockPos blockpos1 = pos.down(); Block blockWhereFall; while (true) { blockpos1 = blockpos1.down(); blockWhereFall = worldIn.getBlockState(blockpos1).getBlock(); if ( !(canFallIntoBlock(worldIn, blockpos1) && blockpos1.getY() > 0)) { break; } try { wait(15); } catch (InterruptedException e) { ; } } if (blockpos1.getY() > 0) { worldIn.setBlockState(blockpos1.up(), this.getDefaultState()); } } } } public void onEndFalling(World worldIn, BlockPos pos) { worldIn.setBlockState(pos, Blocks.fire.getDefaultState()); } // -- FIRE --- // public boolean isCollidable() { return false; } public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state) { return null; } public boolean isOpaqueCube() { return false; } public boolean isFullCube() { return false; } public int quantityDropped(Random random) { return 0; } public MapColor getMapColor(IBlockState state) { return MapColor.tntColor; } }
:::
-
Si cette méthode est static elle est surement appelé autre part. Sélectionnes la méthode canFallIntoBlock de la classe BlockFalling et fait une recherche Java.
-
En effet, tous mes problèmes se concentre sur la même classe EntityFallingBlock. C’est la qu’est ré-utilisé la fonction, et c’est justement cette partie qui entre en jeux dans mes autres problèmes.
Je n’ai donc pas le choix, je vais devoir m’attaquer a cette classeJe mettrai la balise résolus demain dans la soirée si je n’ai pas eu d’autre problème significatif sur la fonction
sur ceux, bonne nuit, et merci
-
Bon je triche, double post avec moins de 24h
J’ai régler l’intégralité des problèmes avec un bon vieux copier/coller des classes Minecraft (et des adaptation évidemment)
ha un problème près… Impossible de faire appel a une texture de minecraft… X) m’enfin bon, je dois aussi revoir mes classe pour ajouter ce détaille important ^^"