Les sources de dégâts (DamageSource)



  • Sommaire

    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 :

    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



  • GG 😄 Cool l'update du tuto 😄



  • Merci! 🙂



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



  • 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 😛


  • Correcteurs

    J'ai bien aimé tomber sur ce tuto 😃

    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.



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


Log in to reply