Fluids 1.7.10



  • %(#483ac4)[Introduction 🙂

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

    text alternatif

    %(#483ac4)[Pré-requis 🙂

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

    %(#4537c4)[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);
    }
    

    %(#4537c4)[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);
    	}
    }
    

    %(#4537c4)[La class de notre sceau 🙂

    public class ItemBucketPoison extends ItemBucket {
    
    	public ItemBucketPoison(Block p_i45331_1_) {
    		super(p_i45331_1_);
    	}
    
    }
    

    Les event :

    %(#4537c4)[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);
                }
            }
        }
    

    %(#4537c4)[Pour terminer on va register l'event dans la class principale dans postInit 🙂

    MinecraftForge.EVENT_BUS.register(this);
    

    Bonus

    %(#ff0000)[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


Log in to reply