• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Solved Création d'item mangeable qui vous tue quand vous le mangez !

    1.16.x
    1.16.x
    3
    4
    85
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      Debility.Kheops last edited by

      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…!Voici la classe qui extends de mon Item, mais après, je suis perdu! Aidez moi ! (J'ai commencé le modding Minecraft il y a 2 semaines)

      Ama 1 Reply Last reply Reply Quote 0
      • Ama
        Ama @Debility.Kheops last edited by Ama

        @debility-kheops

        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.

        Si je t'ai filé un coup de main n'oublie pas le + / -
        Par contre évite les demandes d'aides en MP, tu sera sympa'

        La JavaDoc c'est comme le PQ, ça sert à ce démerder tous seul. -Victor Hugo- 2017

        Une superbe API pour animer vos super modèles CraftStudio dans Minecraft !

        1 Reply Last reply Reply Quote 1
        • R
          Remingusu last edited by

          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);
          }
          
          1 Reply Last reply Reply Quote 1
          • D
            Debility.Kheops last edited by

            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.

            1 Reply Last reply Reply Quote 0
            • Moved from Support pour les moddeurs by  robin4002 robin4002 
            • 1 / 1
            • First post
              Last post
            Design by Woryk
            Contact / Mentions Légales

            MINECRAFT FORGE FRANCE © 2018

            Powered by NodeBB