[Tutoriel] Guide Mapmaking: Entraînement #3

Cet article fait partie d’une série servant à enseigner l’art du développement sur Minecraft. Vous pourrez retrouver l’introduction et le sommaire en cliquant ici.

Nous avons vu dernièrement comment fonctionnaient les scores, les tags et les teams. Ça peut ne pas paraître grand chose mais c’est en réalité essentiel à l’immense majorité des systèmes. Nous allons donc ici faire quelques exercices qui consolideront vos connaissances et vous laisseront entrevoir les possibilités qu’apporte la maîtrise des nombres et des groupes. Pour rappel, à chaque entraînement, vous disposerez de 3 niveaux:

Débutant : informations & prise de décision

Objectif

Aide

Résumé de l’exercice 2: L’armor_stand de radar porte le tag « Radar » et possède un score « Radar » égal à celui du joueur qui l’a posé. Le Radar met en glowing les ennemis jusqu’à 30 blocs de distance

Pour cet exercice vous êtes invité à utiliser des générateurs de JSON comme minecraftjson car les tellraws demandés ne sont pas évidents pour qui n’a jamais manipulé ces commandes.

Cet exercice va nécessiter une réflexion soutenue sur la gestion des tags ou autre marqueurs pouvant vous servir à identifier une entité (ici, un joueur) à différentes étapes de votre système. Il est généralement recommandé d’essayer de se représenter les choses dans la tête ou sur un papier avant de toucher aux commandes.

Les points les plus complexes de cet exercice étant la gestion de ces dits « marqueurs » ainsi que l’écriture du JSON, nous ne pouvons pas vous fournir une plus grande aide que ça, désolé … et bonne chance !

Correction

Normalement, deux chaines se sont ajouté à la chaine créé lors de l’entrainement #2. Ceci dit, selon votre façon de faire, il est possible que vous ayez ajouté plus de chaines, ou même que vous n’en ayant ajouté qu’une seule ! Nous commençons à atteindre ici un niveau suffisamment élevé pour voir émerge différents raisonnements possibles pour réaliser un même système. Aucun d’eux n’est « le bon » raisonnement à avoir, et la correction qui suit n’en est qu’une parmi tant d’autres, répondant aux objectifs sans aller plus loin. De ce fait, la correction que nous vous apportons contient une multitude de défauts dû à sa simplicité. Vous pouvez néanmoins essayer d’améliorer les défauts que vous trouverez par vos propres mayens, vous avez désormais tous les outils en main ! 

Chaine #1: Amélioration du radar

execute at @e[tag=Radar,tag=!Processed] as @a[tag=!Authorized,distance=..30] unless score @s Radar = @e[tag=Radar,limit=1,sort=nearest] Radar run tag @e[tag=Radar,tag=!Processed,limit=1,sort=nearest] add TargetFound Permet de détecter un intrus non-autorisé et place un score sur le Radar si c’est le cas
execute at @e[tag=Radar,tag=TargetFound] as @a[tag=!Authorized,distance=..30] unless score @s Radar = @e[tag=Radar,tag=TargetFound,limit=1,sort=nearest] Radar run tag @s add Target Place un tag « Target » sur le joueur intrus. On vérifie alors que ce joueur ne possède pas le même score « Radar » que celui du radar.
execute as @a[tag=Target] store result score @s PosX run data get entity @s Pos[0] Permet de récupérer la position du joueur et la stocker dans les scores PosX, PosY et PosZ
execute as @a[tag=Target] store result score @s PosY run data get entity @s Pos[1]
execute as @a[tag=Target] store result score @s PosZ run data get entity @s Pos[2]
execute as @a at @e[tag=Radar,tag=TargetFound,tag=!Processed] if score @s Radar = @e[limit=1,sort=nearest] Radar run tellraw @p [{« text« : »\u00a76Intruder detected! [« },{« selector »: »@e[tag=Target,tag=!Authorized,distance=..30]« },{« text »: »\u00a76] Nearest @ x:« },{« score« :{« name« : »@e[tag=Target,tag=!Authorized,limit=1,sort=nearest]« , »objective« : »PosX« }},{« text« : »\u00a76 y:« },{« score« :{« name« : »@e[tag=Target,tag=!Authorized,limit=2,sort=nearest]« , »objective« : »PosY« }},{« text« : »\u00a76 z:« },{« score« :{« name« : »@e[tag=Target,tag=!Authorized,limit=1,sort=nearest]« , »objective« : »PosZ« }}] Affiche le message dans le chat via un tellraw indiquant le nom et la position du joueur intrus
execute as @a at @e[tag=Radar,tag=TargetFound,tag=!Processed] if score @s Radar = @e[limit=1,sort=nearest] Radar run tellraw @p [«  »,{« text »: » • »,« color »:« gold »},{« text »: » « ,« color »:« dark_green »},{« text »:« Autoriser »,« color »:« dark_green »,« clickEvent »:{« action »:« run_command »,« value »:« /execute at @p as @e[tag=Radar,tag=TargetFound,tag=!Processed] if score @s Radar = @p Radar at @s run tag @e[tag=Target,distance=..30] add Authorized »}},{« text »:« \n »},{« text »: » • »,« color »:« gold »},{« text »: » « ,« color »:« dark_green »},{« text »:« Prévenir »,« color »:« dark_green »,« clickEvent »:{« action »:« run_command »,« value »:« /execute at @p as @e[tag=Radar,tag=TargetFound,tag=!Processed] if score @s Radar = @p Radar at @s run tellraw @a[tag=Target, tag=!Authorized, distance=..30] [\ »\\\u00a74Je t’ai vu !\ »]\ »] »}},{« text »:« \n »},{« text »: » \u2022″,« color »:« gold »},{« text »: » « ,« color »:« dark_green »},{« text »:« Attaquer »,« color »:« dark_green »,« clickEvent »:{« action »:« run_command »,« value »:« /execute at @p as @e[tag=Radar,tag=TargetFound,tag=!Processed] if score @s Radar = @p Radar at @s run scoreboard players set @e[tag=Target,tag=!Authorized,distance=..30] Timer 1 »}},{« text »:« \n »},{« text »:« -> « ,« color »:« dark_red »},{« text »:« Valider »,« color »:« aqua »,« clickEvent »:{« action »:« run_command »,« value »:« /execute as @a at @e[tag=Radar,tag=Processed] if score @s Radar = @e[limit=1,sort=nearest] Radar run tag @e[limit=1,sort=nearest] remove Processed »}}] Affiche le tellraw qui va permettre au joueur d’effectuer des actions. Par soucis de clarté, nous l’avons séparé du premier tellraw, mais tout peu être fait en 1 seul. Ici, inutile de vous casser les yeux à lire cette énorme commande si vous n’avez pas l’habitude du JSON. Utilisez plutôt un générateur comme https://minecraftjson.com
execute as @a at @e[tag=Radar,tag=TargetFound,tag=!Processed] if score @s Radar = @e[limit=1,sort=nearest] Radar run tag @e[limit=1,sort=nearest] add Processed Permet d’éviter au tellraw de s’afficher plus de fois que nécessaire.
tag @e[tag=Radar,tag=Processed,tag=TargetFound] remove TargetFound  

Chaine #2: Timer et attaque

scoreboard players add @e[tag=!Radar,tag=Target,tag=!Authorized,scores={Timer=1..}] Timer 1 Incrémente le timer de 10 secondes qui donnera un effet de poison au joueur intrus
effect give @e[tag=!Radar,tag=Target,tag=!Authorized,scores={Timer=200}] minecraft:poison 10 1 Donne l’effet de poison au bout de 10 secondes, pour une durée de 10 secondes
scoreboard players set @e[tag=!Radar,tag=Target,scores={Timer=200..}] Timer 0 Remet le timer à 0

Intermédiaire : visualisation de l’ennemi

Objectif

Aide

Afin de représenter le joueur, vous allez avoir énormément recours à la commande /data. Si vous n’êtes pas à l’aise avec cette dernière, nous vous invitons à relire les précédents articles du guide qui décortiquent la commande.

Vous rencontrerez sans doute un problème pour afficher la tête du joueur. Pour cela, nous vous invitons à passer par le panneau sur lequel vous avez renseigné le nom du joueur, et non via le joueur lui même car l’objet NBT stockant le nom de ce dernier est différent et ne pourra pas être manipulé directement.

Si le joueur possède un casque, créez une nouvelle armor_stand afin de superposer ce dernier avec la tête du joueur.

Cet exercice ne contient aucun piège si ce n’est la légère complexité à récupérer la tête du joueur. Vous êtes invité à écrire toutes vos commandes à la main, sans utiliser aucun outil de génération de JSON. Vous êtes en revanche invité à visiter le site Minecraft Wiki sur Gamepedia afin de vous renseigné sur les différents objets NBT que vous allez être amenés à manipuler.

Expert : drone téléguidé & visualisation en réalité augmenté

Objectif

Indication

Si votre système utilise des Structure_Blocks (recommandé), vous devrez faire usage de la Gunivers-Lib pour ne pas dégrader l’environnement proche du drone à l’endroit où le structure_block sera placé. Vous devrez pour cela détecter le bloc présent avant de placer le structure_block, puis replacer ce dernier une fois que le structure_block n’est plus utile.

Drone se baladant dans la map
Salle de contrôle (le joueur vient se placer sur le bloc de verra blanc)
Lorsque le drone ne sera pas contrôlé, la salle devra se désactiver et ressembler à ceci: 

 

Notez le contenu de cet article.
Quitter la version mobile