Résolu Drop de mon minerais par une variable
-
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. -
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 .
-
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"); } }
-
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’eventBlockEvent.HarvestDropsEvent
pour réaliser ce que tu veux faire. -
Ce message a été supprimé ! -
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
-
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 .
-
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
-
Ce message a été supprimé ! -
@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 -
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)); } }
-
Ce message a été supprimé ! -
merci beaucoup maintenant tout fonctionne, merci a vous deux