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

    Les sources de dégâts (DamageSource)

    Autres
    1.7.x
    5
    7
    4097
    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.
    • utybo
      utybo dernière édition par robin4002

      Sommaire

      • Introduction
      • Pré-requis
      • Code
        • Classe principale
        • Utilisation
        • Fichier .lang
      • Aller plus loin
        • Modifier l’impact sur la faim
      • Résultat
      • Crédits

      Introduction

      Les sources de dégâts… Le nom français ne vous dit peut-être rien (le nom anglais non plus!), mais ces petites choses sont bien pratiques. Il s’agit ni plus ni moins des différents types de dégâts, tels que le feu, la lave, le void (*** fell out of the world)… Les DamageSource gèrent les dégâts et leurs altérations, notamment si le joueur a une enchantement, l’effet Résistance…

      Pré-requis

      • La classe principale
      • Quelque chose qui a un paramètre étant une entitée (event, méthode héritée d’une classe mère…)

      Code

      Classe principale

      Nous allons instancier la classe DamageSource dans notre classe principale. Ajoutez ceci :

      public static damageSourceTuto
      ``` avec vos déclarations d'items et de blocs (l'ordre n'a pas d'importance).
      Ajoutez dans la partie pré-init ceci : ```java
      damageSourceTuto = new DamageSource("damageSourceTuto");
      

      Ce code instancie la classe DamageSource. Le String est le nom non localisé de votre source de dégâts

      :huh: Mais on ne crée pas de nouvelle classe? Pourquoi?
      ❗ Tout simplement car la classe DamageSource contient déjà tout ce qu’il faut pour personnaliser notre DamageSource! Si vous voulez personnaliser votre DamageSource plus en profondeur, référez vous à la partie Aller plus loin!

      Voici quelque méthodes que vous pouvez utiliser. Je les ais classées en catégories, bien qu’il n’y ait pas de catégories “officielles”. Ajouter ces méthodes entre le ) et le ;
      **
      Les types de dégâts**
      Ces méthodes permettent de déclarer le type de dégat infligé : par exemple, un dégât ayant pour source un DamageSource avec .setFireDamage() sera moins important si le joueur a un enchatement Fire Resistance!

      .setExplosion() // Votre source sera considérée comme provenant d'une explosion. N'utilisez pas la méthode setExplosionSource, il s'agit en réalité d'un accesseur!
      .setFireDamage() // Votre source sera considérée comme provenant du feu
      .setMagicDamage() // Votre source sera considérée comme provenant de la magie (utilisé par l'enchantement Thorns en vanilla)
      .setProjectile() // Votre source sera considérée comme provenant d'un projectile, comme une flèche
      

      **
      Les réactions de la source de dégâts face à l’armure, aux potions, à la difficulté…**

      .setDamageAllowedInCreativeMode() // Votre source de dégâts pourra infliger des dégâts même si le joueur est en créatif
      .setDamageBypassesArmor() // Votre source de dégâts ne prendra pas en compte l'armure de l'entité. Enlève tout impact sur la faim
      .setDamageIsAbsolute() // Votre source de dégâts ne prendra pas en compte les effets de potion et les enchantements Protection du joueur adverse. Enlève tout impact sur la faim
      .setDifficultyScaled() // Les dégâts ayant pour source votre source de dégâts seront adaptés en fonction de la difficulté
      // En Peaceful, votre dégât ne sera pas pris en compte
      // En Easy, votre dégât sera divisé par 2
      // En Normal, aucune modification ne sera appliquée à votre source de dégâts
      // En Hard, votre dégât sera multiplié par 1.5
      

      Utilisation :

      Utiliser votre source est très simple! Il suffit d’avoir une entité en paramètre d’une méthode ou d’un event!

      entity.attackEntityFrom(ClassePrinicipale.damageSourceTuto, 2.0F);
      

      Le premier paramètre est l’instance de DamageSource, et le float est le nombre de demi-coeurs qui sera retiré à l’entité

      Fichier .lang :

      :huh: Hein? Il y a besoin nde mettre quelque chose dans le fichier .lang?
      ❗ Oui! En cas de mort d’un joueur/de l’animal (nommé) d’un joueur à cause de votre source, il y aura un message de mort n’est-ce pas?

      Voici ce qu’il faut mettre dans votre fichier .lang

      death.attack.damageSourceTuto=%s was killed by the power of the MFF community!
      

      %s est le nom du joueur qui a été tué.

      Aller plus loin

      Si vous voulez modifier votre DamageSource, il va falloir créer une nouvelle classe qui a pour classe mère DamageSource. On crée notre constructeur avec un String en paramètre!
      Traduction en code Java :

      public class DamageSourceTuto extends DamageSource
      {
          public DamageSourceTuto(String name)
          {
              super(name);
          }
      }
      

      Voici quelques exemples de personnalisations :

      Modifier l’impact sur la faim :

      Je l’ai dit plus haut et je le redis : certaines méthodes modifient l’impact sur la faim. Il est impossible de le modifier via une méthode. Comment faire?
      Il faut simplement redéfinir l’accesseur de cette valeur.

      :huh: Mais je ne peux pas juste redéfinir cette valeur dans le constructeur?
      ❗ Non, car le field de cette valeur est privé, et non protected. Rappel Java : une valeur protected est accessible dans la classe mère et ses classes filles, et une valeur private est accessible par la classe possédant cette valeur uniquement.

      Voici le code à mettre dans la classe:

          @Override
          public float getHungerDamage()
          {
              return 1.0F;
          }
      

      Remplacez 1.0F par la valeur que vous voulez.

      Ceci dit, créer une classe qui extends DamageSource a très peu d’intêret, la classe DamageSource ayant déjà tout ce qu’il faut!

      Résultat


      (Dans cette image, l’objet tenu en main est mangeable et inflige 5.0F demi-coeurs de dégâts lorsqu’on le mange)

      Crédits

      Rédaction :

      • utybo

      Correction :

      Creative Commons
      Ce tutoriel de Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

      retourRetour vers le sommaire des tutoriels

      Moddeur à la retraite et développeur de trucs en Java.

      J'aide les gens comme je peux, alors si mon message v…

      1 réponse Dernière réponse Répondre Citer 0
      • Überfap
        Überfap dernière édition par

        GG 😄 Cool l’update du tuto 😄

        Si je t'ai aidé, n'hésites pas à mettre un point de réputation positif !
        Si tu m'as aidé, je n'hésiterais pas à t'en donner à mon tour !

        1 réponse Dernière réponse Répondre Citer 0
        • utybo
          utybo dernière édition par

          Merci! 🙂

          Moddeur à la retraite et développeur de trucs en Java.

          J'aide les gens comme je peux, alors si mon message v…

          1 réponse Dernière réponse Répondre Citer 0
          • Diangle
            Diangle dernière édition par

            Moi, j’aime bien. Je pense que un modo ou un admin devrais venir par ici :P.

            1 réponse Dernière réponse Répondre Citer 0
            • mindany2
              mindany2 dernière édition par

              Intéressant ^^(, on peut peut-être approfondir en bonus comment faire un damagesource en fonction de l’arme (si on veut qu’un message spécial s’affiche))

              Je ne nous pensais pas si puissant 😛

              ^^

              1 réponse Dernière réponse Répondre Citer 0
              • Folgansky
                Folgansky Correcteurs dernière édition par

                J’ai bien aimé tomber sur ce tuto =D

                Petite remarque (en 1.7.10 en tout cas) dans la classe principale il faut mettre:

                public static DamageSource damageSourceTuto;
                

                Par exemple, sinon on a une erreur.

                1 réponse Dernière réponse Répondre Citer 0
                • utybo
                  utybo dernière édition par

                  Réponse TRÈS tardive, mais pour ton commentaire Toutoune1008, ce passage me semblait évidemment car il relève du Java de base.

                  Moddeur à la retraite et développeur de trucs en Java.

                  J'aide les gens comme je peux, alors si mon message v…

                  1 réponse Dernière réponse Répondre Citer 0
                  • Référencé par  robin4002 robin4002 
                  • Référencé par  robin4002 robin4002 
                  • Référencé par  robin4002 robin4002 
                  • 1 / 1
                  • Premier message
                    Dernier message
                  Design by Woryk
                  Contact / Mentions Légales

                  MINECRAFT FORGE FRANCE © 2018

                  Powered by NodeBB