CommandBlock Commande donner xp a la mort d'un joueur

Azrod_06

Aventurier
18 Mars 2020
3
0
1
23
Bonjours, n'ayant pas le level pour les commandes, j'aimerais trouver une commande a mettre dans un commande block pour qu'il augmente l'exp des joueur a chaque kill sachant que le keep inventory est actif donc il ne peut pas drop d'exp.
Donc si on résume cela donne :

1) Un joueur A est tué par le joueur B
2) Le joueur B a 1 level d'exp en plus

Mais le keep inventory dois rester actif.

Je pense qu'il faut utiliser des scores boards et des /execute ds des commandes blocs.

Merci beaucoup d'avance,

Un noob en commande.
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Hey !
Déjà, je vais partir du principe que tu es dans une version supérieur ou égal à la 1.13 vu que tu n'as pas indiqué ta version de jeu.
Donc c'est assez simple, ça tient en 2 command-blocks !
Voici déjà l'algorithme que l'on va appliquer :
Code:
Si joueur tue joueur :
    Passer score "Kill" à 1
Si "Kill" est à 1 pour joueur :
    Donner 1 niveau d'XP à joueur
    Mettre score "Kill" de joueur à 0
Commençons par le premier "si", l'idée est d'incrémenter le score Kill du joueur dans il en tue un autre, les deux instructions (détection de la mort, et incrémentation du score) se font automatiquement !
Pour cela, il faut préalablement créer un scoreboard ayant pour objectif "PlayerKillCount", ce scoreboard aura pour particularité de s'incrémenter automatiquement lorsqu'un joueur en tue un autre.
Il faut donc exécuter cette commande une seule fois pour créer le scoreboard :
Code:
/scoreboard objectives add Kill playerKillCount
Ensuite, il faut détecter le passage du score à 1 (signifiant que le joueur a tué une personne) et donner de l'XP si c'est le cas. Pour des questions de sûreté, on ne va pas détecter quand le score est égal à 1 mais quand il est supérieur ou égal à 1 (sinon, si le score devenait plus grand que 1, le système aurait un bug) :
Code:
execute as @a[score={Kill=1..}] run xp add @s 1 levels
Je traduis la commande :
Code:
exécuter sur tous les ayant un score Kill supérieur ou égal à 1 un don à eux-même de 1 niveau d'XP
Il faut que cette commande se trouve dans un command-block en mode "repeat" (ceux qui sont violet), qu'il soit continuellement alimenté par de la redstone (ou en mode "always active") et pointe vers le haut.
Les command-blocks repeat ont pour avantage d'éxécuter la commande qu'ils possèdent à chaque tick (donc 20 fois par secondes).
Le problème maintenant, c'est que comme le score vaudra toujours un ou plus, la commande s'exécutera à chaque tick donnant donc 1 niveau d'XP à chaque tick, ce que l'on ne veut pas, d'où la dernière instruction "Mettre score "Kill" de joueur à 0".
Pour cela, on va remettre le score de toutes personnes ayant son score à 1 ou plus à 0, ce qui se traduit par cela :
Code:
scoreboard players set @a[score={Kill=1..}] Kill 0
Qu'il faut mettre dans un command-block en mode "chain" (ceux en vert), au-dessus du précédent command-block.
Les command-blocks chain s'activent lorsque le command-block qui pointe sur eux (ici le repeat donc) s'active, donc ici à chaque tick comme le violet !

En espérant avoir répondu à ta question !
 

alex4419

Aventurier
18 Avril 2020
1
0
1
24
Bonjour,
Merci pour ce tutoriel, j'ai réalisé celui-ci mais pour un son lors de la mort mais celui-ci ne fonctionne pas:

Quand je me fait tuer par quelqu'un le son se répète l’infini, j'ai essayé avec scoreboard players reset @a Kill sur le Block en "Chain" mais cette fois sa me répète sans arrêt le reset du scoreboard.

Block en mode "Repeat", "Always active" : execute as @a[score={Kill=1..}] run playsound minecraft.entity.wither.spawn master alex4419
Block du dessus en mode "Chain": scoreboard players set @[scores={Kill=1..}] Kill 0
Je ne vois pas ou peux se situer mon erreur :/

Merci pour ton retour.
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Normal que ça te répète la commande en boucle si le comman-block est dans une chaine dont le premier command-block est un repeat ^^'
Il faut que tu n'appliques ton reset que sur les joueurs ayant un score supérieur à 1, comme ça, ça ne se fera pas en boucle :
Code:
scoreboard players reset @a[score={Kill=1..}]  Kill
Il faut que cette commande se trouve tout à la fin de la chaîne