Fluids 1.7.10



  • Introduction

    Dans ce tutoriel, vous allez apprendre à faire un fluid qui ressemblera à celà :

    text alternatif

    Pré-requis

    • Créer un block
    • Créer un Item

    Code

    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);
    

    Bonus

    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 :

    https://pastebin.com/xBEwcxUH

    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.


  • Moddeurs confirmés Rédacteurs Administrateurs

    Bonsoir,
    J'ai remis en forme le tutoriel (beaucoup de balise cassé dû au passage vers NodeBB), cela sera probablement mieux maintenant.



  • Merci.



  • This post is deleted!


  • @robin4002 Moi aussi je récupère de l'eau et pourtant g bien tout suivi


  • Moddeurs confirmés Rédacteurs Administrateurs

    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


  • Moddeurs confirmés Rédacteurs Administrateurs

    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


  • Moddeurs confirmés Rédacteurs Administrateurs

    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
    ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    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 ?


Log in to reply