Résolu Création d'item mangeable qui vous tue quand vous le mangez !
-
Bonjour, depuis quelques jour je me suis mis au défis de créer un mod Hunger Games. Je voulais recréer les baies qui vous tuent quand vous les mangez…!
-
Bonjour.
Saches que l’excuse d’avoir commencé le modding, ne t’empêches en rien de te documenter.
Et ce que tu souhaite faire est trouvable très facilement dans le code de base de Minecraft.Donc avant de demander de l’aide, balades toi dans le code du jeu, s’il te plait.
La documentation et la recherche c’est 90% de la réussite de n’importe quel projet simplistes présents sur ce forum.Mais il fait beau aujourd’hui, c’est une belle journée.
Alors voilà un bout de code.A déclarer dans la classe principale du mod:
DamageSource POISONOUS_BERRY = new DamageSource("poisonous_berry").bypassArmor();
Classe, modulaire, de la nouriture:
public class KillingFood extends Item { private final UseAction itemUseAnimation; private final int animationLength; private final DamageSource damageSource; private final float damageAmount; /** * @param itemUseAnimationIn Custom UseAction animation * @param animationLengthIn Animation length in ticks * @param damageSourceIn Custom or not DamageSource for custom death messages * @param damageAmountIn Amount of damage dealt to the entity */ public KillingFood(UseAction itemUseAnimationIn, int animationLengthIn, DamageSource damageSourceIn, float damageAmountIn) { super(new Item.Properties().tab(ItemGroup.TAB_FOOD)); this.animationLength = animationLengthIn; this.itemUseAnimation = itemUseAnimationIn; this.damageSource = damageSourceIn; this.damageAmount = damageAmountIn; } /** * On exécute les différentes actions à la fin de l'utilisation de l'item * Donc une fois mangé * * @param stack This ItemStack instance * @param world World instance * @param livingEntity LivingEntity instance * @return Final ItemStack result */ @Override public ItemStack finishUsingItem(ItemStack stack, World world, LivingEntity livingEntity) { //Application des dégâts sur l'entité //Ne pas utiliser la fonction `livingEntity.kill()` il n'y aura pas de message de mort custom dans le chat sinon. if (!world.isClientSide) //Si on défini les dégâts sur -1.0F on tue instantanément l'entité. //C'est une condition ternaire livingEntity.hurt(this.damageSource, this.damageAmount == -1.0F ? livingEntity.getMaxHealth() : this.damageAmount); //On met à jour les statistiques du joueur if (livingEntity instanceof ServerPlayerEntity) { ServerPlayerEntity serverplayerentity = (ServerPlayerEntity)livingEntity; CriteriaTriggers.CONSUME_ITEM.trigger(serverplayerentity, stack); serverplayerentity.awardStat(Stats.ITEM_USED.get(this)); } //Si le joueur n'est pas en mode créatif, on enlève un item du stack, même après la mort if (livingEntity instanceof PlayerEntity && !((PlayerEntity)livingEntity).abilities.instabuild) stack.shrink(1); return stack; } /** * Définition du temps de l'animation de l'action * * @param stack ItemStack informations * @return The duration of the animation */ @Override public int getUseDuration(ItemStack stack) { return this.animationLength; } /** * On défini l'animation pour l'item, manger ou boire, ici manger * * @param stack ItemStack informations * @return Custom UseAction for the animation */ @Override public UseAction getUseAnimation(ItemStack stack) { return this.itemUseAnimation; } /** * Quand le joueur utilise l'item on lance de ce fait l'animation de l'action {@link KillingFood#getUseAnimation(net.minecraft.item.ItemStack)} * * @param world World instance * @param player Player instance * @param hand Get held item hand * @return Action Result */ @Override public ActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) { player.startUsingItem(hand); return ActionResult.consume(player.getItemInHand(hand)); } }
Lors de l’enregistrement de l’item:
RegistryObject<Item> KILLING_FOOD = ITEMS.register("killing_food", () -> new KillingFood(UseAction.EAT, 32, POISONOUS_BERRY, -1.0F));
Le code est fonctionnel, mais si tu sais créer un item tu ne devrait pas avoir trop de problème à l’utiliser.
Bonne journée. -
Sinon je pense qu’il y a plus simple.
Tu créer une classe d’initialisation (par exemple: BaieInit)
Initialise avec DeferedRegister puis enregistre avec RegistryObject<Item>.
Ensuite tu le met en type .food.
Et enfin tu donne l’effet InstantDamage au niveau qui permet de one shot même avec une armure.
Le code juste en dessous
public class BaieInit { public static final DeferredRegister<Item> ITEM = DeferredRegister.create(ForgeRegistries.ITEMS, /*modid*/.MODID); public static final RegistryObject<Item> BAIE = ITEM.register("Baie", () -> new Item(new Item.Properties().food(new Food.Builder().effect(() -> new EffectInstance(Effects.DAMAGE_BOOST, 20*60, 10), 1f).build()))); }
Et enfin dans ta classe principale HUNGERGAMESMOD tu es censé avoir créer un IEventBus, et donc enregistré ton item dans la classe principale. Le code en dessous.
public /*modid*/ { /*(FMLJavaModLoadingContext... FMLJavaModLoadingContext...)*/ IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); BaieInit.ITEM.register(bus); }
-
Merci tout d’abord pour vos réponses.
@Ama c’est compris je ne referais pas deux fois la même erreur, je te remercie.
Et @Remingusu merci, je ne savais pas que la fonction InstantDamage existait.
Je met donc le post en Résolu.
-