MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Drop de mon minerais par une variable

    Planifier Épinglé Verrouillé Déplacé Résolu 1.12.x
    1.12.2
    12 Messages 3 Publieurs 513 Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • I Hors-ligne
      ImperoMaximo
      dernière édition par

      Bonjour,
      Je code actuellement un bloc qui seras le minerais principal de mon mod, ce minerais donneras un drop différent selon s’il fait jour ou nuit, j’utilise donc une variable qui dans une première méthode est sensée prendre comme valeur l’item adéquat, ensuite avec la variable obtenue, j’utilise el famoso méthode getItemdropped() pour mettre un return de ma variable et être sensé obtenir l’item en question, résultat, le bloc ne drop rien du tout (hors xp mais c’est une autre méthode, en essayant de voir ou étais le soucis j’ai remarqué que ma variable était nulle lorsque je l’appelais 😞 et j’ai l’impression que ma méthode sensée donner la valeur a ma variable ne fonctionne pas, je viens donc vers vous pour avoir des conseils/solutions potentielles merci d’avance,
      cordialement.

      1 réponse Dernière réponse Répondre Citer 0
      • I Hors-ligne
        ImperoMaximo
        dernière édition par

        Voici la solution, j’ai juste fais une boucle do while, en espérant que cela serve a quelqu’un:

        package fr.minecraftforgefrance.tutorial.blocks;
        
        import java.util.Random;
        
        import fr.minecraftforgefrance.tutorial.items.TutorialItems;
        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.item.Item;
        import net.minecraft.util.math.BlockPos;
        import net.minecraft.world.IBlockAccess;
        
        public class SolariumOre extends Block
        {
        	public SolariumOre(Material materialIn) {
        		super (Material.IRON);
        		this.setUnlocalizedName("solarium_ore");
        	}
        	
        	public int getExpDrop(IBlockState state, IBlockAccess world, BlockPos pos, int fortune) {return 30;}
        	
        	public long time() {return Minecraft.getMinecraft().world.getWorldTime();}
        
        	public long algorythmeTime() {
        		long time = time();
        		if(time < 24000) return time;
        		else {
        			do time = time - 24000;
        			while(time > 23999);
        			return time;
        		}
        	}
        	
        	public boolean day() {
        		if(algorythmeTime() < 13000) return true;
        		else return false;
        	}
        	
        	@Override
        	public Item getItemDropped(IBlockState state, Random rand, int fortune) {
        		if(day() == true) return TutorialItems.SOLARIUMSHARD;
        		else return TutorialItems.LUNARIUMSHARD;
        	}
        
        	
        
        }
        

        Voila merci encore @robin4002 .

        1 réponse Dernière réponse Répondre Citer 0
        • I Hors-ligne
          ImperoMaximo
          dernière édition par

          J’avais oublié mon code mdr
          Voici mon code:

          package fr.minecraftforgefrance.tutorial.blocks;
          
          import java.util.Random;
          
          import fr.minecraftforgefrance.tutorial.items.TutorialItems;
          import net.minecraft.block.Block;
          import net.minecraft.block.material.Material;
          import net.minecraft.block.state.IBlockState;
          import net.minecraft.item.Item;
          import net.minecraft.util.math.BlockPos;
          import net.minecraft.world.IBlockAccess;
          import net.minecraft.world.World;
          import net.minecraftforge.event.world.WorldEvent;
          
          public class SolariumOre extends Block
          {
          	public Item drop;
          	public Item getDrop() {return drop;}
          	public void setDrop(Item drop) {this.drop = drop;}
          
          	public void itemdrop(WorldEvent event, World event1) {
          		if(event1.isDaytime() == true) this.setDrop(TutorialItems.SOLARIUMSHARD);
          		else if(event1.isDaytime() == false) this.setDrop(TutorialItems.LUNARIUMSHARD);
          	}
          
          	public int getExpDrop(IBlockState state, IBlockAccess world, BlockPos pos, int fortune) {
          		return 30;
          	}
          
          	public Item getItemDropped(IBlockState state, Random rand, int fortune) {
          		return this.getDrop();
          	}
          
          		public SolariumOre(Material materialIn) {
          		super (Material.IRON);
          		this.setUnlocalizedName("solarium_ore");
          	}
          }
          
          1 réponse Dernière réponse Répondre Citer 0
          • robin4002R Hors-ligne
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs
            dernière édition par

            Bonsoir,

            Cela ne peut pas fonctionner de cette manière.
            Regardes dans la classe bloc s’il y a une méthode pour obtenir le drop ayant world en argument. Si ce n’est pas le cas, il faudra passer par l’event BlockEvent.HarvestDropsEvent pour réaliser ce que tu veux faire.

            1 réponse Dernière réponse Répondre Citer 0
            • I Hors-ligne
              ImperoMaximo
              dernière édition par ImperoMaximo

              Ce message a été supprimé !
              1 réponse Dernière réponse Répondre Citer 0
              • I Hors-ligne
                ImperoMaximo
                dernière édition par ImperoMaximo

                J’ai réussi merci de m’avoir mis sur la voie, j’ai fais autrement et en utilisant ce code:

                	 public long time() {return Minecraft.getMinecraft().world.getWorldTime();}
                	 public boolean day() {
                		 if(time() < 13000) return true;
                		 else return false;
                	 }
                
                	@Override
                	public Item getItemDropped(IBlockState state, Random rand, int fortune) {
                		//System.out.println(day());
                		if(day() == true) return TutorialItems.SOLARIUMSHARD;
                		else return TutorialItems.LUNARIUMSHARD;
                	}
                

                Cela fonctionne, il me reste un dernier soucis peut être idiot ou déjà résolu, avec la méthode getWorldTme() je suis sensé obtenir une valeureinférieure a 23999 et supérieure à 0, or quand je fais In Game /time set 26 000 par exemple, la valeur de day est false, c’est a dire que le jeu considère qu’il fais nuit alors qu’il fais jour, vous ne connaîtriez pas un moyen de régler ce léger soucis? En tout cas merci bcp @robin4002 .

                Edit: lorsque je dors dans un lit puis que je casse le minerais j’obtiens uniquement du lunarium et je ne sais pas trop pourquoi

                1 réponse Dernière réponse Répondre Citer 0
                • I Hors-ligne
                  ImperoMaximo
                  dernière édition par

                  Voici la solution, j’ai juste fais une boucle do while, en espérant que cela serve a quelqu’un:

                  package fr.minecraftforgefrance.tutorial.blocks;
                  
                  import java.util.Random;
                  
                  import fr.minecraftforgefrance.tutorial.items.TutorialItems;
                  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.item.Item;
                  import net.minecraft.util.math.BlockPos;
                  import net.minecraft.world.IBlockAccess;
                  
                  public class SolariumOre extends Block
                  {
                  	public SolariumOre(Material materialIn) {
                  		super (Material.IRON);
                  		this.setUnlocalizedName("solarium_ore");
                  	}
                  	
                  	public int getExpDrop(IBlockState state, IBlockAccess world, BlockPos pos, int fortune) {return 30;}
                  	
                  	public long time() {return Minecraft.getMinecraft().world.getWorldTime();}
                  
                  	public long algorythmeTime() {
                  		long time = time();
                  		if(time < 24000) return time;
                  		else {
                  			do time = time - 24000;
                  			while(time > 23999);
                  			return time;
                  		}
                  	}
                  	
                  	public boolean day() {
                  		if(algorythmeTime() < 13000) return true;
                  		else return false;
                  	}
                  	
                  	@Override
                  	public Item getItemDropped(IBlockState state, Random rand, int fortune) {
                  		if(day() == true) return TutorialItems.SOLARIUMSHARD;
                  		else return TutorialItems.LUNARIUMSHARD;
                  	}
                  
                  	
                  
                  }
                  

                  Voila merci encore @robin4002 .

                  1 réponse Dernière réponse Répondre Citer 0
                  • LeBossMax2L Hors-ligne
                    LeBossMax2
                    dernière édition par

                    Bonjour, ceci est une mauvaise solution car la classe Minecraft n’est pas disponible sur serveur. Donc le jeu va crash sur serveur. Il faut utiliser un fonction qui prend un World en paramètre pour pouvoir récupérer son gametime

                    1 réponse Dernière réponse Répondre Citer 0
                    • I Hors-ligne
                      ImperoMaximo
                      dernière édition par

                      Ce message a été supprimé !
                      1 réponse Dernière réponse Répondre Citer 0
                      • I Hors-ligne
                        ImperoMaximo
                        dernière édition par

                        @LeBossMax2 bonjour,
                        Est ce que vous sauriez comment faire pour régler le soucis dont vous parlez ? Mettre un solde only client devant ou autre, merci d’avance

                        1 réponse Dernière réponse Répondre Citer 0
                        • robin4002R Hors-ligne
                          robin4002 Moddeurs confirmés Rédacteurs Administrateurs
                          dernière édition par robin4002

                          Il faut passer par une fonction qui donne accès à world. Si tu cherches où getItemDropped est appelé tu vas tomber sur la fonction getDrops dans la classe Block :

                              public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
                              {
                                  Random rand = world instanceof World ? ((World)world).rand : RANDOM;
                          
                                  int count = quantityDropped(state, fortune, rand);
                                  for (int i = 0; i < count; i++)
                                  {
                                      Item item = this.getItemDropped(state, rand, fortune);
                                      if (item != Items.AIR)
                                      {
                                          drops.add(new ItemStack(item, 1, this.damageDropped(state)));
                                      }
                                  }
                              }
                          

                          Il suffit donc de l’override dans la classe de ton bloc et d’en changer le comportement :

                              @Override
                              public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
                              {
                                  boolean isDay = world instanceof World ? (((World)world).getWorldTime() % 24000 < 13000) : true;
                                  if (isDay)
                                  {
                                      drops.add(new ItemStack(TutorialItems.SOLARIUMSHARD , 1));
                                  }
                                  else
                                  {
                                      drops.add(new ItemStack(TutorialItems.LUNARIUMSHARD, 1));
                                  }
                              }
                          
                          1 réponse Dernière réponse Répondre Citer 1
                          • I Hors-ligne
                            ImperoMaximo
                            dernière édition par

                            Ce message a été supprimé !
                            1 réponse Dernière réponse Répondre Citer 0
                            • I Hors-ligne
                              ImperoMaximo
                              dernière édition par

                              merci beaucoup maintenant tout fonctionne, merci a vous deux

                              1 réponse Dernière réponse Répondre Citer 0
                              • 1 / 1
                              • Premier message
                                Dernier message
                              Design by Woryk
                              ContactMentions Légales

                              MINECRAFT FORGE FRANCE © 2024

                              Powered by NodeBB