• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

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

    1.16.x
    1.16.x
    3
    4
    158
    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.
    • D
      Debility.Kheops dernière édition par

      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 réponse Dernière réponse Répondre Citer 0
      • Ama
        Ama @Debility.Kheops dernière édition par 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 réponse Dernière réponse Répondre Citer 1
        • R
          Remingusu dernière édition par

          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 réponse Dernière réponse Répondre Citer 1
          • D
            Debility.Kheops dernière édition par

            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 réponse Dernière réponse Répondre Citer 0
            • Déplacé de Support pour les moddeurs par  robin4002 robin4002 
            • 1 / 1
            • Premier message
              Dernier message
            Design by Woryk
            Contact / Mentions Légales

            MINECRAFT FORGE FRANCE © 2018

            Powered by NodeBB