CommandBlock Résolu Infliger des dégâts précis par commande? (1.14+)

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
24
Ben oui, l'éternelle question...


Donc je commence à voir le bout de mes exams et j'ai un projet de pack en tête (je reste avec mon pack market)...

En fait, je voudrais créer une classe de joueurs qui ont "plusieurs vies"...
Plus simplement, je voudrais simuler l'effet d'un totem d'immortalité, mais sans en tenir un...

Mais c'est pas si simple... Le principe même du totem étant d'éviter la mort, j'ai pensé à un système en trois parties :
1. Donner un effet de résistance max aux joueurs concernés
2. Stocker les dégats réçus réduits via scoreboard
3. Transférer les dégâts stockés au joueur, sauf s'ils sont supérieurs à sa santé actuelle, auquel cas il sera "ressuscité".

Tout va bien, sauf la partie "infliger les dégâts". Improbable par /effect, incertain par flêches custom,... Je veux que les joueurs immortalisés puissent bénéficier de la régénération naturelle comme les autres joueurs; pas de barre de vie en scoreboard.

J'avais pensé donner une armure avec malédiction de lien éternel aux "immortels", dont je pourrais me servir pour ajouter des attributs MaxHealth, mais rien de concret...


Bref, ce que je veux :
-imiter l'effet du totem d'immortalité
Ou
-Infliger des dégâts précis au joueur

Merci!
 

FunkyToc

Map Baker
26 Mars 2013
511
112
155
33
France, Paris
funkytoc.fr
J'ai l'impression que tu choisis le chemin étriqué et dangereux en passant par une gestion complète du scoreboard !
Le top serait de détecter a l'avance la mort du joueur, ce qui est a ma connaissance impossible de manière stricte. Ou comparer les dégâts reçu au score santé actuel... sauf que le joueur est déjà mort au moment de la détection.
Effectivement, infliger des dégâts précis est compliqué, sauf via l'effet poison, mais c'est sur plusieurs secondes du coup, donc non.

Quand tu dis imiter le totem d'immortalité, tu veux : un effet d'absorption et de la regen au lieu de la mort ?

Très franchement, je pense que tu vas devoir faire des compromis. Tu as tester plein de méthode pour détecter les dégâts avant la mort ?
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
24
Ben dans le fond, par "imiter le totem", j'entends "réduire le score [vies] de 1 et régénérer complêtement la santé, et ce sans mourir"...

Je sais que passer par l'effet de résistance et simuler les dégâts reçus semble hasardeux, mais je pense qu'il n'y a pas d'alternative...
 

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
24
Je pense que je suis sur la bonne voie!

J'ai peaufiné un petit truc et ça donne pas mal : c'est un exemple vite fait pour infliger 5 dégâts...

Ce que j'utilise :
Code:
###Exécuté chaque tick

#Partie 1 (Application)
scoreboard players add @a[scores={ticks=0..3}] ticks 1
replaceitem entity @a[scores={ticks=1}] weapon.mainhand brick{AttributeModifiers:[{AttributeName:"generic.maxHealth",Name:"generic.maxHealth",Amount:-5,Operation:0,UUIDLeast:894654,UUIDMost:2872,Slot:"mainhand"}]}
#Partie 2 (Reset)
effect give @a[scores={ticks=2}] minecraft:health_boost 1 1
clear @a[scores={ticks=2}] minecraft:brick
effect clear @a[scores={ticks=2}] minecraft:health_boost

ça dure 2 ticks, mais sachant qu'on peut se prendre des dégâts au minimum à un tick d'intervalle, je pourrais mettre la partie 2 du premier tick de dégâts en même temps que la partie 1 du second tick de dégâts...


Donc le premier tick, ça me donne une brique en main avec attribut maxHealth -5. ça baisse ma santé comme prévu, mais quand je clear l'item le tick suivant, ma santé remonte direct à 20...
C'est un bug d'actualisation, j'imagine vu que si on se give un -20 maxHealth, on peut survivre sans aucun coeur jusqu'à ce qu'on prenne des dommages...

Bref, j'ai rajouté un effet health_boost et la santé s'actualise correctement! (D'ailleurs, ça suffit même quand je clear l'effet le même tick que quand je le donne)


Comme je disais, j'avais prévu donner une armure non-retirable aux joueurs concernés, je m'en servirai pour appliquer l'attribut...
Du coup, il me reste plus qu'à faire une fonction à part qui met un attribut plus ou moins grand et je devrais pouvoir convertir le score de dégâts en dégâts réels...
Par contre, vu que les dégâts sont convertis en attribut maxHealth, un effet d'absorption de pomme d'or ne peut pas être réduit; je vais devoir clear cet effet mais bon, c'est pas si grave...
 
  • J'aime
Reactions: FunkyToc

Eglaios

Crétin de la commu
14 Avril 2018
310
42
89
24
J'ai pris le temps de faire un système plus structuré et sérieux, c'est parfaitement ce qu'il me fallait!!!

À noter que je reste résistance max toute la vidéo...
Après, si je ressuscite lors de l'activation du pack, c'est que j'avais emmagasiné des dégâts entretemps, comme on peut voir sur le scoreboard


C'est le même principe que les commandes de ma réponse précédente sauf que ça soustrait les scores de dégâts résistés à celui de la vie actuelle du joueur, ce qui résulte en le nombre de coeurs du joueur après les dégâts.
Une fois cette valeur obtenue, je remplace les bottes du joueur avec un attribut maxHealth négatif de valeur correspondante (évidemment, hardcodées, y en a que 19)

Bien sûr, si les dégâts reçus sont supérieurs à la vie actuelle du joueur, ils sont reset et le joueur est soigné.


C'est dingue... le joueur reçoit de vrais dégâts, convertis en faux dégâts, eux-même reconvertis en vrais dégâts! Mais ça me permet de les filtrer...
 
  • J'aime
Reactions: FunkyToc