CommandBlock Système de capture de drapeaux

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
Suite à la requête de @Ganondorf629 ✔️ , voici un tutoriel pour faire un système de capture de drapeaux pour deux équipes. ^^

Bon, commençons !

Nous pourrons décomposer notre système en 6 parties :
- La première s'occupera de l'installation des drapeaux, il s'agit d'une sorte de API afin de simplifier la chose. Il ne sera utiliser qu'au début et pourra être supprimé ensuite (à l'exception de deux command blocks).
- Le deuxième va gérer la prise du drapeau par un joueur de l'équipe opposée.
- Le troisième gère le drop du drapeau lors de la mort du joueur possesseur (des deux équipes, en effet, un rouge peut très bien récupérer le drapeau rouge pour le ramener dans sa base).
- La quatrième partie aura l'effet inverse, donc la récupération du drapeau par un joueur de n'importe quelle équipe.
- La cinquième partie s'occupera de reposer le drapeau lorsqu'il sera ramener dans sa base.
- Puis la dernière gérera la capture d'un drapeau par une équipe.

Premier système : Initialisation de notre système.

Ici, nous nous occuperons de tous ce qui est initialisation de notre système, c'est à dire la création des scoreboards, des teams et la création de notre drapeau.
Je vous laisse donc designer vos piedestals mais je ne peux que vous conseiller de rester dans des formes assez simple (tout du moins pour la détection).

JxV1k6G.png


Définissons nos deux zones :
Ma première zone, celle du drapeau bleu, est une zone ronde de rayon 2 blocs.
Ma seconde zone, celle du drapeau rouge, est une zone carré de 3 blocs de côté.

Voilà qui est fait ! Maintenant, les scorebards :
Nous aurons donc de teams, les rouges, et les bleus (je ne met les commandes que pour une seules) :
Code:
/scoreboard teams add Rouge
On lui donne sa couleur :
Code:
/scoreboard teams option Rouge color red
Ensuite, nous auront un seul scoreboard. Il détectera la mort des joueurs et sera utiliser lors du drop du drapeau :
Code:
/scoreboard objectives add mort deathCount

Passons maintenant à notre petite API pour les drapeaux, voici à quoi ressemble notre système :

LyCY2Z2.png


Pas grand chose, comme vous pouvez le voir :p
Chacune de mes colonnes correspond à un drapeau.
Voilà comment ce système fonctionne :
On se give un oeuf de mob modifié de façon à ce que ce dernier nous fasse spawn une entité en NoAI, invisible et en Silent. On détecte cette entité, on spawn un ArmorStand, puis on kill l'entité initial. L'ArmorStand sera donc la position de notre drapeau. Ce système permet ainsi de poser les drapeaux facilement et rapidement sans avoir à craindre une erreur dans un /kill ayant pour conséquence la perte de nos ArmorStands.

Voici déjà la commande pour l'oeuf :
/give @p minecraft:spawn_egg 1 129 {display:{Name:"Drapeau Rouge"},EntityTag:{id:"minecraft:slime",Size:0,CustomName:"drapeauRouge",CustomNameVisible:false,NoGravity:1,NoAI:1,Silent:1,DeathLootTable:"entities/silverfish",ActiveEffects:[{Id:14,Amplifier:0,Duration:19980,ShowParticles:0b}]}}
Petite explication :
Ce qui est en rouge concerne l'item en lui-même, il s'agit juste d'un nom que l'on donne à l'oeuf de façon à pouvoir le différencier de l'autre drapeau.
Les trois autres couleurs concernent notre entité. Le vert représente tout les tags de ce dernier :
- "id" pour le type d'entité.
- "Size" pour la taille (seulement pour les slimes/magma_cube).
- "CustomName" étant le nom de notre entité.
- "NoGravity" afin d'empêcher l'action de la gravité sur notre entité.
- "Silent" permet de mute notre entité.
La partie violette est un "confort" nous permettant de retirer les drops de notre slime. Pour cela, on lui attribue la LootTable d'un silverfish (qui ne drop rien).
En bleu, c'est notre effet d'invisibilité.
Code:
/give @p minecraft:spawn_egg 1 129 {display:{Name:"Drapeau Bleu"},EntityTag:{id:"minecraft:slime",Size:0b,CustomName:"drapeauBleu",CustomNameVisible:false,NoGravity:1b,NoAI:1,Silent:1,DeathLootTable:"entities/silverfish",ActiveEffects:[{Id:14,Amplifier:0,Duration:19980,ShowParticles:0b}]}}

Ensuite, il faut bien que nos ArmorStands se posent. Pour cela, c'est les deux command blocks violets en bas de la petite tour.
Code:
/execute @e[type=slime,name=drapeauRouge] ~ ~ ~ summon Armor_Stand ~ ~ ~ {Invisible:1b,Marker:1b,NoGravity:1b,Small:1b,CustomName:"rouge"}
On exécute donc à notre slime ayant le nom drapeauRouge le summon d'un ArmorStand ayant le nom "rouge".
Le tag "Small" permet de mettre notre ArmorStand à la petite taille.
Le tag "Marker" permet de "désactiver" sa hitbox.

Le command block vert juste au dessus s'occupe de kill notre slime :
Code:
/kill @e[type=Slime,name=drapeauRouge]

Il nous reste plus qu'un command block à voir pour ce système, le repeat de derrière !
Celui-ci pose le drapeau :)

/execute @e[type=armor_stand,name=rouge,[COLOR=#ff0080]tag=!pris[/COLOR]] ~ ~ ~ setblock ~ ~ ~ standing_banner 12 replace {Base:1,Patterns:[]}

Explications :
Premièrement, la partie verte s'occupe de la couleur de votre drapeau :

- 0 noir
- 1 rouge
- 2 vert foncé
- 3 marron
- 4 bleu foncé
- 5 violet
- 6 cyan
- 7 gris clair
- 8 gris foncé
- 9 rose
- 10 vert clair
- 11 jaune
- 12 bleu clair
- 13 magenta
- 14 orange
- 15 blanc

La partie rouge défini l'orientation :

- 0 sud
- 1 sud-sud-ouest
- 2 sud-ouest
- 3 ouest-sud-ouest
- 4 ouest
- 5 ouest-nord-ouest
- 6 nord-ouest
- 7 nord-nord-ouest
- 8 nord
- 9 nord-nord-ouest
- 10 nord-est
- 11 est-nord-est
- 12 est
- 13 est-sud-est
- 14 sud-est
- 15 sud-sud-est

La partie magenta, dit au sélecteur de ne pas prendre en compte l'ArmorStand si il a le tag "pris". Ce tag dira à l'ArmorStand que le drapeau a été pris par une équipe (on y reviendra plus tard). Ce command block (tout comme celui qui gère le drapeau bleu) n'est donc pas à cassé car il s'occupera de refaire apparaître le drapeau si celui-ci est ramené à sa base.

Code:
/execute @e[type=slime,name=drapeauBleu] ~ ~ ~ summon Armor_Stand ~ ~ ~ {Invisible:1b,Marker:1b,NoGravity:1b,Small:1b,CustomName:"bleu"}
Code:
/kill @e[type=Slime,name=drapeauBleu]
Code:
/execute @e[type=armor_stand,name=bleu,tag=!pris] ~ ~ ~ setblock ~ ~ ~ standing_banner 4 replace {Base:4,Patterns:[]}

Une fois tout ceci fait, vous allez pouvoir placer vos deux drapeaux grâce aux oeufs ;)
Nous allons donc pouvoir passer à la seconde partie.

Deuxième système : Récupération du drapeau par l'équipe adverse.

Voici le système :

15k8bqk.png


Comme tout à l'heure, je ne ferai qu'une seule colonne, la seconde sera en spoiler vu que le contenu est globalement le même ;)

La première chose à faire, est donc de détecter si un joueur de l'équipe adverse se trouve sur la zone de capture. C'est là où la forme de votre zone prend de l'importance. Pour une zone carré telle que notre zone rouge, il va falloir utiliser le dx et le dz afin de faire un prolongement en x et en z. Mais là, un problème s'offre à nous, effectivement, ces deux arguments ne peuvent pas être négatif, les coordonnées initiales de prolongation doivent donc partir d'un angle, mais pas n'importe lequel vu que ça doit être l'angle le plus négatif dans ces positions ! Mais heureusement, l'execute nous permet de faire ce que l'on souhaite, c'est à dire déplacer le point centrale de recherche par rapport à l'entité ! ;)
/execute @e[type=armor_stand,name=rouge,tag=!pris] ~-1 ~ ~-1 scoreboard players tag @p[dx=2,dz=2,team=Bleu,tag=!ownerRouge,tag=!ownerBleu] add ownerRouge
Vous voyez ces petits tilde '~' qui suit l'exécute et que l'on ne s'en sert presque jamais ? (Bleu)
Bah là, ils nous seront bien utile ! Ils vont nous permettre d'exécuter la commande non par sur l'entité mais à un bloc de recul en x et en z de l'entité ! (bien qu'elle soit exécuté par cette dernière) Nous allons donc pouvoir utiliser notre dx et notre dy plus facilement ! :)

Je ne sais pas si mes explications sont claires donc je vais vous faire un petit schéma ! :)

Si nous ne modifions pas les tildes de l'execute, voici ce que l'on aurait :

pyVmQFU.png


Mais avec nos modifications :

f8pMpq5.png


Ce qui est beaucoup mieux !

Pour ce qui est d'une zone ronde, un simple 'r=' suffit :

Code:
/execute @e[type=armor_stand,name=bleu,tag=!pris] ~ ~ ~ scoreboard players tag @p[r=2,team=Rouge,tag=!ownerRouge,tag=!ownerBleu] add ownerBleu

Nos deux tag que l'on ne souhaite pas permettent d'éviter qu'un joueur ayant déjà un drapeau puisse l'attraper.

Vous pouvez voir en suite que, le second command block de nos tour est un repeat conditionnal. Et là, la question que tout le monde se pose est : qu'est-ce qu'il contient ? Et la réponse est..................... Rien... Et oui, ce command block est vide... :p
Alors, à quoi sert-il ? Sa seule utilité est le conditional, en le mettant ici, ça nous évite de le mettre sur tout nos command block vert, bien que ça aie exactement le même fonctionnement que de mettre conditional sur tout nos verts ^^
Mais alors, pourquoi le placer ? Pour justement éviter de le mettre sur nos command blocks chain ! En effet, il suffit que l'un des command blocks du dessus ne s'exécute pas pour que le reste de la chaine ne s'active pas, ce qui peut créer des bugs ! Là, pas se problème, vu qu'ils s'exécuteront tous :p

Bref, continuons notre ascension !

Une fois que le joueur est détecté et identifié (par notre tag ownerRouge), il faut dire au drapeau qu'il n'est plus à sa place. Vous souvenez vous de notre détection de l'absence du tag "pris" tout à l'heure ? Bah c'est ici que l'on set se tag !
Code:
/scoreboard players tag @e[type=armor_stand,name=rouge,tag=!pris] add pris
Ainsi, notre système sait que le drapeau n'est plus dans sa zone.

Ensuite, il faut le faire apparaître sur le joueur, pour cela :
Code:
/replaceitem entity @a[team=Bleu,tag=ownerRouge] slot.armor.head banner 1 1
Ici, la couleur est défini par son tag mais ça reste les mêmes numéros que tout à l'heure.

Il nous reste plus qu'à faire disparaître le drapeau de son socle :

[code]/execute @e[type=armor_stand,name=rouge,tag=pris] ~ ~ ~ setblock ~ ~ ~ air

Une fois tout ceci fait, il nous reste tout de même un détail important. En effet, pour le prochain système (le loot du drapeau), il va bien falloir que l'on sache où le joueur meurt pour poser ce drapeau ! Pour cela, on va summon un ArmorStand que se téléportera constamment au joueur ayant le tag "ownerRouge" jusqu'à ce que celui-ci meurt et perdre son tag. À ce moment là, l'ArmorStand cessera de se téléporter et pourra setblock le drapeau. Mais tout ceci se trouve dans le prochain système, ici, on summon juste l'ArmorStand :
Code:
/summon armor_stand ~ ~2 ~ {CustomName:"drpRouge",Small:1,Marker:1b,Invisible:1,Invulnerable:1,NoGravity:1}

Code:
/execute @e[type=armor_stand,name=bleu,tag=!pris] ~ ~ ~ scoreboard players tag @p[r=2,team=Rouge,tag=!ownerRouge,tag=!ownerBleu] add ownerBleu
Code:
Vide
Code:
/scoreboard players tag @e[type=armor_stand,name=bleu,tag=!pris] add pris
Code:
/replaceitem entity @a[team=Rouge,tag=ownerBleu] slot.armor.head banner 1 4
Code:
/execute @e[type=armor_stand,name=bleu,tag=pris] ~ ~ ~ setblock ~ ~ ~ air
Code:
/summon armor_stand ~ ~2 ~ {CustomName:"drpBleu",Small:1,Marker:1b,Invisible:1,Invulnerable:1,NoGravity:1}

Cela étant fait, passons à la troisième partie !

Troisième système : Loot du drapeau.

Comme tout bon capture de drapeau, le drapeau se loot à la mort d'un joueur. Nous allons donc nous attaquer à ce système ! :)

Comme d'habitude, voici son apparence :

cUZJbYT.png


Tout d'abord, intéressons-nous aux deux command blocks du devant.
Ces deux là s'occupe simplement de la téléportation de notre entité au joueur possesseur du drapeau :
Code:
/tp @e[name=drpRouge,type=armor_stand] @a[tag=ownerRouge]

Nous allons donc pouvoir nous attaquer à la tour ! :)

La première chose à faire, est de détecter la mort du joueur possesseur du drapeau, pour cela, nous allons utiliser le scoreboard que l'on a créée au début du tutoriel.
Code:
/scoreboard players set @a[tag=ownerRouge,score_mort_min=1] mort 0
Comme vous pouvez le voir, la détection se fait en tant qu'argument, on reset par la suite immédiatement son score. L'output positive de ce commande block permettra d'alimenter le reste de la chain (qui elle, est en conditional).
Nous allons en suite demander à notre ArmorStand qui se téléporte constamment au joueur de poser notre drapeau au sol :
Code:
/execute @e[name=drpRouge] ~ ~ ~ setblock ~ ~ ~ standing_banner 1 replace {Base:1,Patterns:[]}
Il nous ne reste plus qu'à reset le joueur mort, c'est à dire lui retirer le drapeau de la tête, et lui retirer le tag "ownerRouge". Ce qui va avoir pour conséquence la cessation de la téléportation.
Code:
/replaceitem entity @a[tag=!ownerBleu] slot.armor.head air 1 0
Code:
/scoreboard players tag @a[tag=ownerRouge] remove ownerRouge
Pour finir, nous allons donner un tag à notre ArmorStand afin que l'on sache que le drapeau est au sol :
Code:
/scoreboard players tag @e[name=drpRouge] add solR

Le petit command block :
Code:
/tp @e[name=drpBleu,type=armor_stand] @a[tag=ownerBleu]

La chaîne :

Code:
/scoreboard players set @a[tag=ownerBleu,score_mort_min=1] mort 0
Code:
/execute @e[name=drpBleu] ~ ~ ~ setblock ~ ~ ~ standing_banner 4 replace {Base:4,Patterns:[]}
Code:
/replaceitem entity @a[tag=!ownerRouge] slot.armor.head air 1 0
Code:
/scoreboard players tag @a[tag=ownerBleu] remove ownerBleu
Code:
/scoreboard players tag @e[name=drpBleu] add solB

Nous allons pouvoir passer au quatrième système.

Quatrième système : Reprise du drapeau.

0deOF7J.png


L'idée ici est que le drapeau, une fois looté, puisse être récupéré par n'importe quelle joueur, sa team incluse.
Pour cela, nous allons pouvoir nous servir du tag que nous lui avons un peu plus tôt (solR) afin de faire une détection sur l'ArmorStand drpRouge. Nous allons donc donné le tag "ownerRouge" au joueur étant sur le drapeau :
Code:
/execute @e[name=drpRouge,tag=solR] ~ ~ ~ scoreboard players tag @a[r=1] add ownerRouge
Ensuite, nous retrouvons notre command block vide, permettant d'éviter le mod conditional au dessus.
Le troisième command block retire le tag "solR" à l'ArmorStand afin qu'il puisse arrêter les condition :
Code:
/scoreboard players tag @e[name=drpRouge] remove solR
L'avant dernier command block s'occupe de retirer tout simplement le drapeau du sol :
Code:
/execute @e[name=drpRouge] ~ ~ ~ setblock ~ ~ ~ air 0
Puis le dernier pose le drapeau sur le tête du joueur le possédant :
Code:
/replaceitem entity @a[tag=ownerRouge] slot.armor.head banner 1 1 {BlockEntityTag:{Base:1,Patterns:[]}}

Code:
/execute @e[name=drpBleu,tag=solB] ~ ~ ~ scoreboard players tag @a[r=1] add ownerBleu
Code:
Vide
Code:
/scoreboard players tag @e[name=drpBleu] remove solB
Code:
/execute @e[name=drpBleu] ~ ~ ~ setblock ~ ~ ~ air 0
Code:
/replaceitem entity @a[tag=ownerBleu] slot.armor.head banner 1 4 {BlockEntityTag:{Base:4,Patterns:[]}}

Nous allons pouvoir passer à la cinquième partie, celle qui gère le retour du drapeau sur son piédestal.

Cinquième partie : Retour du drapeau.

Si le drapeau est récupéré par un joueur de l'équipe adverse, alors aucun soucis, l’étendard continu à circuler; mais si c'est un joueur de l'équipe rouge, alors il va falloir le ramener dans son camps pour le protéger !

Voici le système :

Mw35xRp.png


Ici, nous allons repartir de notre entité sur le socle rouge afin de lancer la détection du joueur de son équipe ayant le tag ownerRouge. Ce qui signifie donc qu'il ramène le drapeau :
Code:
/execute @e[type=armor_stand,name=rouge,tag=pris] ~ ~ ~ scoreboard players tag @a[dx=2,dz=2,team=Rouge,tag=ownerRouge] remove ownerRouge
On en profite pour lui retirer son tag.
Au dessus, plus besoin de vous expliquer que le command block est vide ;)
Le premier command block vert va s'occuper de retirer le tag "pris" à notre ArmorStand, de façon à ce que le drapeau puisse être de nouveau pris (ça va aussi avoir pour effet de le remettre automatiquement grâce au tout premier système) :
Code:
/scoreboard players tag @e[name=rouge] remove pris
Celui du dessus retire le drapeau de la tête du joueur :
Code:
/execute @e[type=armor_stand,name=rouge,tag=!pris] ~ ~ ~ replaceitem entity @a[dx=2,dz=2,team=Rouge] slot.armor.head air 1 0
Ensuite, on kill l'ArmorStand drpRouge qui ne nous est plus utile :
Code:
/kill @e[name=drpRouge]
Puis, pour finir, un pitit message pour annoncer le retour du drapeau !
Code:
/tellraw @a {"text":"Le drapeau rouge a été remis à sa place !","color":"red"}

Code:
/execute @e[type=armor_stand,name=bleu,tag=pris] ~ ~ ~ scoreboard players tag @a[r=2,team=Bleu,tag=ownerBleu] remove ownerBleu
Code:
Vide
Code:
/scoreboard players tag @e[name=bleu] remove pris
Code:
/execute @e[type=armor_stand,name=bleu,tag=!pris] ~ ~ ~ replaceitem entity @a[r=2,team=Bleu] slot.armor.head air 1 0
Code:
/kill @e[name=drpBleu]
Code:
/tellraw @a {"text":"Le drapeau bleu a été remis à sa place !","color":"blue"}

Sixième système : Capture du drapeau.

La petite screenshot :

hz0wGqp.png


Ici, nous allons réaliser le système d'ajout de point à la capture du drapeau. Les conditions nécessaires pour la capture sont, pour l'équipe rouge :
- Être dans l'équipe rouge (accessoirement)
- Avoir le tag ownerBleu
- Arriver sur le piédestal rouge
Toutes ces conditions nécessaire vont être détectée par le premier command block :
/execute @e[type=armor_stand,name=rouge] ~ ~ ~ scoreboard players tag @a[dx=2,dz=2,team=Rouge,tag=ownerBleu] remove ownerBleu
Nous avons encore notre traditionnel command block vide.
Le premier conditional retirera le drapeau de la tête du joueur :
/execute @e[type=armor_stand,name=rouge] ~ ~ ~ replaceitem entity @a[dx=2,dz=2,team=Rouge] slot.armor.head air 1 0
Ensuite, on kill l'ArmorStand drpBleu :
Code:
/kill @e[name=drpBleu]
On affiche un petit message :
Code:
/tellraw @a {"text":"Le drapeau bleu a été capturé !","color":"red"}
On incrémente le score de la team :
Code:
/scoreboard players add Rouge Capture 1
Puis on retire le tag "pris" du drapeau bleu afin de reposer le drapeau dans le camps adverse :
Code:
/scoreboard players tag @e[name=bleu] remove pris

Code:
/execute @e[type=armor_stand,name=bleu] ~ ~ ~ scoreboard players tag @a[r=2,team=Bleu,tag=ownerRouge] remove ownerRouge
Code:
Vide
Code:
/execute @e[type=armor_stand,name=bleu] ~ ~ ~ replaceitem entity @a[r=2,team=Bleu] slot.armor.head air 1 0
Code:
/kill @e[name=drpRouge]
Code:
/tellraw @a {"text":"Le drapeau rouge a été capturé !","color":"blue"}
Code:
/scoreboard players add Bleu Capture 1
Code:
/scoreboard players tag @e[name=rouge] remove pris
Voilà ! Rien de bien compliqué ! Ah ? Pourquoi j'ai mis des passage au rose ? C'est au cas où vous vouliez ajouter une autre condition que l'on retrouve régulièrement dans les Captures de Drapeau, celle de la présence obligatoire de son drapeau pour pouvoir en capturer un ! Pour cela, il faut juste ajouter avec les arguments en rose, la condition "tag=!pris" afin de savoir si le drapeau est à sa place ! ;)




Ce tutoriel est presque fini ! Il nous reste plus qu'à le pimper un peu en ajoutant un petit message lors de la prise du drapeau. Pour cela, un petit système basique où l'on détecte la présence du tag "ownerRouge" parmi tout les joueurs !

8re3vTC.png


Les violets contiennent la détection :
Code:
/testfor @a[tag=ownerRouge]
Puis, en sortie, nous avons notre message :
Code:
/tellraw @p ["",{"text":"Le drapeau rouge a été pris par ","color":"red"},{"selector":"@a[tag=ownerRouge]","color":"none"},{"text":" !","color":"red"}]

Code:
/testfor @a[tag=ownerBleu]
Code:
/tellraw @p ["",{"text":"Le drapeau bleu a été pris par ","color":"blue"},{"selector":"@a[tag=ownerBleu]","color":"none"},{"text":" !","color":"blue"}]

Voilà ! Le système est entièrement fini !
Bon... Le tutoriel est assez long mais j'espère qu'il vous a plus !
Si vous ne comprenez pas quelque chose, n'hésitez pas à me le demander, j'aurai plaisir à vous répondre ;)

Merci d'avoir lu ! :p
 

Oromis

Command-blocker slimesque
Staff
Modérateur
Support
11 Février 2014
3 345
2
1 053
297
24
Bretagne
C'est un peu simple ça non ? le principe d'un tuto étant d'apprendre et non tout récupérer ^^"
 

compte inactif

Architecte en herbe
9 Juin 2014
1 382
132
187
25
Belgique
C'est pas pour tout récupérer mais lancer le navigateur web et minecraft en même temps est mauvais pour le processeur... J'ai fait ça sur mon vieux pc, et voilà ce que j'ai eu:
j'avais des bas fps quand je ne lançais pas youtube