Donner de l'xp pour un coup porté

Clen

pessimiste repenti
22 Février 2016
1 507
286
167
22
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 ?
 
Tu donnes un tag à l'entité victime, puis, si le joueur tape un mob n'ayant pas le tag, alors c'est remis à 0 ^^
 
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 ?
 
Donc tu veux reset le score que si un mob n'ayant pas le tag est frappé ?
 
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.
 
Le plus simple serait de faire un scoreboard pour chaque entité mais malheureusement... :/
 
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 !