Donner de l'xp pour un coup porté

Clen

pessimiste repenti
22 Février 2016
1 507
286
167
21
Lille
La petite histoire : (dispensable)
Je travaille sur un MMORPG et avait organisé la gestion de l'expérience tel que si une entité meurt, le loot est partagé entre les personnes l'ayant frappé selon cette équation :
xp donné à un joueur A=loot initial du mob ÷ nombre de coups reçus par le mob x nombre de coups donnés au mob par le joueur A
L'objectif correspondant au loot initial est défini lors de la création du mob.
L'objectif des coups reçus est incrémenté de 1 chaque fois qu'un second objectif de type stat.damage.taken est différent de 0. Ce dernier objectif est ensuite réinitialisé.
Le problème survient pour le dernier objectif : en effet, si j'utilise un banal "stat.damage.dealt", le joueur A pourra effectuer ce glitch :
-Frapper des cochons (sans les tuer)
-Tuer un Boss
-Gagner l'xp correspondant au loot initial du Boss ÷ nombre de coups reçus par le Boss x nombre de coups donnés par le joueur A au Boss et au cochon
Pour éviter ce bug, j'ai pour l'instant trouvé cela :
1.Détecter des dommages :
-Je crée un objectif de type stat.damage.taken pour le mob.
-Je crée un
objectif de type stat.damage.dealt pour le joueur A.
-Si ces deux objectifs sont égaux, je sais que le mob a reçu des dommages du joueur A.
2. Étiqueter les entités :
-Heu...c'est là que je bloque et c'est pourquoi je demande votre aide...pour infos, chaque joueur aura un numéro d'id unique via scoreboard.
-après l'étiquetage, on réinitialise
les objectifs de l'étape 1

En bref : je connais la victime, je connais l'attaquant. Comment ajouter un NBTag à l'attaquant de façon à ce que lorsqu'il frappe une autre entité, son score à l'objectif stat.damage.dealt soit mis à 0 ?
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Tu donnes un tag à l'entité victime, puis, si le joueur tape un mob n'ayant pas le tag, alors c'est remis à 0 ^^
 

Gaël Erhlich

Installateur de radiateurs
21 Décembre 2014
1 544
382
217
Ici-même
Tu donnes un tag à l'entité victime, puis, si le joueur tape un mob n'ayant pas le tag, alors c'est remis à 0 ^^

Le problème, c'est que si tu mets des sbires avec un boss, que tu dois taper deux monstres en même temps, t'as plus tellement d'expérience à la fin.
 

Clen

pessimiste repenti
22 Février 2016
1 507
286
167
21
Lille
Tu donnes un tag à l'entité victime, puis, si le joueur tape un mob n'ayant pas le tag, alors c'est remis à 0 ^^
Le problème est que le jeu est en multijoueur :
Le joueur A frappe le Boss, il aura le tag. Un joueur B frappe beaucoup de cochons (sans les tuer), ce qui fait que son objectif Damage.dealt augmente. Le joueur B frappe ensuite le Boss. Comme le Boss a le tag, les dégâts donnés aux cochons ne sont pas remis à 0 et le joueur B gagne beaucoup d'xp.
Je cherche donc un moyen de "relier" l'attaqué et l'attaquant. Peut-être est-il possible d'utiliser l'UUID des mobs pour les différencier ?
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Donc tu veux reset le score que si un mob n'ayant pas le tag est frappé ?
 

Clen

pessimiste repenti
22 Février 2016
1 507
286
167
21
Lille
Donc tu veux reset le score que si un mob n'ayant pas le tag est frappé ?
C'est ça. En solo, ce serait simple, mais en multijoueur, il faut différencier les joueurs (voir exemple du glitch ci-dessous)
Le problème est que le jeu est en multijoueur :
Le joueur A frappe le Boss, il aura le tag. Un joueur B frappe beaucoup de cochons (sans les tuer), ce qui fait que son objectif Damage.dealt augmente. Le joueur B frappe ensuite le Boss. Comme le Boss a le tag, les dégâts donnés aux cochons ne sont pas remis à 0 et le joueur B gagne beaucoup d'xp.
Je cherche donc un moyen de "relier" l'attaqué et l'attaquant. Peut-être est-il possible d'utiliser l'UUID des mobs pour les différencier ?
Je pense que l'on peut créer un objectif "iddel'attaquant qui définirait l'attaquant du mob. Mais un mob doit pouvoir être attaqué par plusieurs joueurs et un joueur doit pouvoir attaquer plusieurs mobs, ce qui complique les choses.
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Le plus simple serait de faire un scoreboard pour chaque entité mais malheureusement... :/
 

Clen

pessimiste repenti
22 Février 2016
1 507
286
167
21
Lille
Conclusion : ce projet est impossible ou très compliqué.
Je pense à une solution de remplacement : créer plusieurs modes de jeu :
-défaut où l'xp est looté comme en survie classique (en donjon solo ou en absence de donjon et de bataille)
-guilde où l'xp est partagé selon cette règle :
loot de base du mob : nombre de joueurs dans la guilde (en donjon joué en guilde)
-bataille où l'xp est donné en fonction de la victoire ou de la défaite de notre camp (en bataille)

Je teste !