Tu as vérifié que l’événement est bien appelé en mettant un point d’arrêt ou un print dedans ?
Et sinon un message ça suffit, inutile de spammer. Il y a l’option éditer pour ajouter du contenu à un message.
Dans ce tutoriel, vous allez apprendre à faire un fluid qui ressemblera à celà :
Classe Principale
public static Block poisenouswaterb; public static Fluid poison; public static Item poisonbucket;
Il faudra déclarer cela dans ta classe principale,
Ensuite on va aller dans PreInit de ta classe principale et mettre :
@EventHandler public void preInit(FMLPreInitializationEvent event) { poison = new Fluid("poison").setDensity(4000).setViscosity(500).setTemperature(286).setLuminosity(10).setUnlocalizedName("poison"); //on cree notre fluid que l'on nomme poison FluidRegistry.registerFluid(poison); // on register notre fluid poison = FluidRegistry.getFluid("poison"); poisenouswaterb = new BlockFluidPoison(poison, Material.water).setBlockTextureName(Reference.MOD_ID + ":poison"); // on crée notre block GameRegistry.registerBlock(poisenouswaterb, poisenouswaterb.getUnlocalizedName().substring(5)); //puis on le register poisonbucket = new ItemBucketPoison(CiolMod.poisenouswaterb).setUnlocalizedName("poisonbucket").setCreativeTab(CreativeTabs.tabMisc).setContainerItem(Items.bucket).setTextureName(Reference.MOD_ID + ":poisonbucket"); //on definit notre sceau de poison GameRegistry.registerItem(poisonbucket , "poisonbucket "); // on register l'item FluidContainerRegistry.registerFluidContainer(FluidRegistry.getFluidStack("poison", FluidContainerRegistry.BUCKET_VOLUME), new ItemStack(ItemMod.poisonbucket), FluidContainerRegistry.EMPTY_BUCKET); }
Classe de notre block de poison :
public class BlockFluidPoison extends BlockFluidClassic { public boolean canDisplace(IBlockAccess world, int x, int y, int z) { if(world.getBlock(x, y, z).getMaterial().isLiquid()) { return false; } return super.canDisplace(world, x, y, z); } public boolean displaceIfPossible(World world, int x, int y, int z) { if(world.getBlock(x, y, z).getMaterial().isLiquid()) { return false; } return super.displaceIfPossible(world, x, y, z); } public BlockFluidPoison(Fluid fluid, Material material) { super(fluid, material); } }
La class de notre sceau :
public class ItemBucketPoison extends ItemBucket { public ItemBucketPoison(Block p_i45331_1_) { super(p_i45331_1_); } }
Les event :
Retournons dans notre class principale :
ajoutons-y :
@SubscribeEvent public void onBucketFill(FillBucketEvent event) { Block id = event.world.getBlock(event.target.blockX, event.target.blockY, event.target.blockZ); int metadata = event.world.getBlockMetadata(event.target.blockX, event.target.blockY, event.target.blockZ); if(id == this.poisenouswaterb && metadata == 0) { event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); if (!event.world.isRemote){ event.entityPlayer.inventory.consumeInventoryItem(Items.bucket); EntityItem itemsc = new EntityItem(event.world, event.entityPlayer.posX, event.entityPlayer.posY, event.entityPlayer.posZ, new ItemStack(this.poisonbucket, 1)); event.world.spawnEntityInWorld(itemsc); } } }
Pour terminer on va register l’event dans la class principale dans postInit :
MinecraftForge.EVENT_BUS.register(this);
Si vous voulez ajouter des dégats à votre liquide, il suffit d’ajouter celà à la class de votre block :
public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { if (((entity instanceof EntityLivingBase)) && (!world.isRemote)) { ((EntityLivingBase)entity).attackEntityFrom(DamageSource.drown, 1.0F); } }
Merci d’avoir suivi mon tutoriel, si il vous à aidé n’hésitez pas a me donner 1 point positif
Si vous trouvez une erreur dans le tutoriel, merci de me le signaler
Ce tutoriel de Ciolgaming publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International
@Ciolgaming problème, quand on récupère le fluide avec un seau on reçois de l’eau. normal? ma classe principale : https://pastebin.com/xBEwcxUH
@whartokx a dit dans Fluids 1.7.10 :
A mon avis tu as oubié de register l’event, regarde le tuto sur les events
C’est un truc du genre FMLRegisterEvent.register(this);
Je suis plus ^sûr en 1.7 déso
@Ciolgaming a dit dans Fluids 1.7.10 :
@SubscribeEvent public void onBucketFill(FillBucketEvent event) { Block id = event.world.getBlock(event.target.blockX, event.target.blockY, event.target.blockZ); int metadata = event.world.getBlockMetadata(event.target.blockX, event.target.blockY, event.target.blockZ); if(id == this.poisenouswaterb && metadata == 0) { event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); if (!event.world.isRemote){ event.entityPlayer.inventory.consumeInventoryItem(Items.bucket); EntityItem itemsc = new EntityItem(event.world, event.entityPlayer.posX, event.entityPlayer.posY, event.entityPlayer.posZ, new ItemStack(this.poisonbucket, 1)); event.world.spawnEntityInWorld(itemsc); } } }
en 1.8 ca marche a moitié le code pour recup bucket ne marche pas
Refais ton tutoriel ou alors quelqu’un le refais je n’ai pas tous compris s’il vous plait.
Bonsoir,
J’ai remis en forme le tutoriel (beaucoup de balise cassé dû au passage vers NodeBB), cela sera probablement mieux maintenant.
Merci.
@robin4002 Moi aussi je récupère de l’eau et pourtant g bien tout suivi
Vérifies ton event FillBucketEvent
@robin4002 Je viens de le faire
Et tjrs rien. Tu veux mon code ?
tiens ma classe principale
https://pastebin.com/cPdDV3BV
Tu as vérifié que l’événement est bien appelé en mettant un point d’arrêt ou un print dedans ?
Et sinon un message ça suffit, inutile de spammer. Il y a l’option éditer pour ajouter du contenu à un message.
Et mon print il s’affichera où @robin4002 ?
@robin4002 Je viens de tester et quand mon event et censé sa déclencher. Il ne se passe rien
En effet et j’ai trouvé pourquoi, il te manque @Mod.EventHandler au-dessus de init
et postInit
.
Merci Bcp !
@robin4002 Connais-tu une méthode pour rajouter de la vie à la place d’en enlever
?
Donner l’effet de régénération. Ou juste appeler la méthode setHealth
de l’entité.
mrc
@robin4002 Juste comment tu add un effet ?