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 : si vous… débutez, les exercices sont très simples et très guidés, n’admettent généralement qu’une seule solution qui est clairement explicitée. Ils font d’avantage appel aux connaissances qu’à la réflexion.
- Intermédiaire : si vous trouvez le premier trop simple, vous pouvez vous attaquer à ce niveau, qui vous demande de raisonner un peu plus en utilisant ce que vous connaissez. Vous disposerez également d’une ou plusieurs aides, mais pas de correction car les problèmes de ce niveau commencent à avoir une multitude de solutions. Vous donner une correction impliquerait de vous conseiller une façon de penser, ce qui n’est pas l’objectif. Si vous souhaitez faire valider votre système, envoyez le via un lien dans l’espace commentaire ou partagez-le nous sur notre Discord.
- Expert : si vous êtes déjà Mapmaker, nous vous proposons quelques exercices qui peuvent mettre votre cerveau à ébullition. Vous devrez exploiter certaines mécaniques particulière des commandes, demandant ainsi de raisonner en profondeur avec une parfaite maîtrise des commandes. Pour certains des problèmes, vous aurez la possibilité de vous aider (lorsque ce sera indiqué) de la Gunivers-Lib, qui résoudra une partie du problème. Vous n’aurez pas d’aide supplémentaire ni de correction. Si vous souhaitez vraiment montrer que vous êtes le patron, vous devrez vous débrouiller pour recréer les outils que cette Lib vous offre ;)
Débutant : informations & prise de décision
Objectif
- Avertir le joueur qu’un ennemi à été repéré via un message dans le chat.
- Proposer des options:
- Inviter le joueur à vous rejoindre (indique votre position)
- Avertir que le joueur est repéré
- Envoyer une somation avec un avertissement que sa présence est considérée comme une attaque à laquelle vous allez répondre et ajoutez-y un timer de 10 secondes. Si vous avez fait l’exercice niveau Expert de l’entrainement #1, vous pourrez également déclencher l’activation des tourelles automatique à la fin de ce timer. Sinon, on se contentera de donner un effet de poison.
- Le joueur ennemi devra recevoir les alertes correspondantes via un titre sur son écran
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 if score Radar = [limit=1,sort=nearest] Radar run tag [limit=1,sort=nearest] add Processed | at [tag=Radar,tag=TargetFound,tag=!Processed]Permet d’éviter au tellraw de s’afficher plus de fois que nécessaire. |
tag | [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
- Créer une représentation d’un joueur donné si ce dernier se trouve à proximité d’un radar (créé via les exercices débutants)
- Doit montrer la tête, l’armure et le ou les items que tient le joueur en main.
- Le nom du joueur devra être placé dans un panneau
- Les informations comme la position, l’orientation et la vie du joueur devront également être affichées à coté de cette représentation
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
- Créer un drone téléguidé
- Se met en vol stationnaire lorsqu’il n’est pas contrôlé
- Se contrôle via une salle spéciale d’une taille inférieur ou à égal à 32*32*32 blocs qui reproduit l’environnement à proximité du drone.
- Le joueur se placera au centre de cette zone, posé sur un bloc barrier, sa tête sera alors au niveau de la caméra du drone (voir image ci-dessous).
- Les entités devront être visible dans cette reproduction de l’environnement proche. Les joueurs devront également être représenté via la méthode utilisée dans l’exercice Intermédiaire
- Se contrôle avec les touches z, q, s, d, shift, space ainsi que via la molette de la souris (vitesse du drone).
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: |
Superbe ces tutoriels.