Aujourd’hui, nous allons étudier la récupération des items par plusieurs entités comme les joueurs, les créatures et les wagonnets à entonnoir.
Mise en contexte :
Tout joueur sait qu’il dispose d’un inventaire depuis qu’il a appuyé sur la touche E de son clavier, où il peut disposer du matériel mais également 4 emplacements pour ses pièces d’armure. Mais ce n’est pas propre au joueur : vous pouvez rencontrer des monstres portant des armures ou des outils.
Zombies dans une faille ayant récupérés des sacs d’encre
Certaines entités sont capables de récupérer les items : les joueurs évidemment, mais également certains monstres et les wagonnets à entonnoirs. Ces derniers sont utilisés dans beaucoup de systèmes. Nous allons nous intéresser à la zone où chaque type de créature peut récupérer un item.
Montages expérimentaux :
L’objet ici est de déterminer une zone où une entité peut récupérer un item. Potentiellement, cette zone est une boite rectangulaire (un parallélépipède rectangle pour parler géométrie dans l’espace), il faudra donc définir cette zone selon les trois directions spatiales.
Le principe est le suivant : nous allons recouvrir la plateforme en bas avec des items et nous allons faire apparaître la créature au milieu de la plateforme (au niveau du bloc noir). L’entité récupérera les items qu’elle peut atteindre : il restera donc une zone vide délimitée par les items restants.
- Recycler les créatures
- Génération des grilles d'items
- Augmenter la précision
- Dimension verticale : principe des mesures
- Première approche
- Seconde approche
- lorsque nous allons recouvrir la plateforme, les items seront très proches et il y a donc un fort risque qu’ils forment des stacks. En utilisant des items non stackables (comme les casques), on limite ce problème.
- une entité récupérant une pièce d’armure ne peut pas en récupérer une autre : nous allons donc évacuer les créatures hors de la zone de test et en invoquer une autre.
Note : on choisit la téléportation à cause notamment des zombies chevauchant des poulets qui auraient tendance à s’accumuler et à perturber l’apparition des prochaines créatures.
- 36 = 6×6 casques séparés de 1 bloc (ligne blanche)
- 121 = 7×7 casques séparés de 0.5 bloc (ligne orange)
- 441 = 21×21 casques séparés de 0.25 bloc (ligne magenta)
- 676 = 26×26 casques séparés de 0.2 bloc (ligne bleu ciel)
- 2 601 = 51×51 casques séparés de 0.1 bloc (ligne jaune)
- un ArmorStand est invoqué au milieu. Il invoque à son niveau un Item.
- il avance de +1 en x jusqu’à ce que la créature ne puisse plus récupérer l’item.
- il retourne dans la zone de récupération en reculant de 1.
- on recommence le cycle en avançant de +0.1.
Le cycle est reproduit jusqu’à la précision désirée (ici, notre montage peut descendre à une précision proche de 10-9).
Donc nos expériences précédentes ne sont qu’une petite fraction de la zone de récupération, il va falloir trouver des méthodes pour balayer la dimension verticale.
Remarque : on peut empêcher les monstres de tomber en enlevant l’IA de la créature, mais c’est chose impossible pour les wagonnets à entonnoir par exemple.
Maintenant que nous avons les outils, il ne reste plus qu’à faire les mesures des différentes zones de récupération.
Analyse des résultats :
Nous allons tenter de rationaliser la récupération d’objets : on va étudier dans un premier temps les entités pouvant naturellement récupérer les items, puis généraliser les résultats avec d’autres créatures. Les cas particuliers seront étudiés dans un dernier temps.
Entités concernées par la récupération d’items naturellement
Certaines créatures, en plus du joueur, possèdent naturellement la capacité de récupérer des items :
Globalement, cette probabilité va de 0 à plus de 50% si vous avez une très grande difficulté locale.
Tout comme les zombies, la proportion de créatures capables de récupérer des items est très dépendante de la difficulté locale : des tests préliminaires ne montrent pas de différence avec celle des zombies.
L’apparition avec une armure et la capacité à récupérer les objets ne semblent pas corrélées.
Lien entre hitbox et zone de récupération horizontale
La hitbox est une caractéristique de chaque entité, il serait intéressant de voir s’il existe une corrélation avec notre sujet :
- Définition de la hitbox
- Comparaison des largeurs théoriques et pratiques des hitbox
- Modèle choisi : les Slimes
- Tests préliminaires
- Généralisation aux autres entités
- la zone de collision : si vous frappez la zone de collision, vous infligerez des dégâts à l’entité correspondante.
- la zone de pénétration : l’entité reste coincée si la zone de pénétration rentre en contact avec la zone de pénétration d’un bloc ou d’une autre entité.
Ces deux zones sont confondues en partie. Pour afficher la hitbox, on utilise le raccourci F3+B qui affiche la zone en blanc.
- rapprocher l’entité le plus près d’une paroi et déduire la valeur à partir de ses coordonnées x et z.
- regarder directement dans le code du jeu la valeur setSize de l’entité.
Comme vous pouvez le constater, les valeurs expérimentales et théoriques sont très proches. L’égalité n’est pas parfaite et les mesures ne sont pas forcément reproductibles. Nous nous limiterons donc à une précision de 10-5 chiffres significatifs pour les mesures par la suite. [table id=50 /]
- on peut l’immobiliser facilement : il suffit de d’activer le tag NoAI avec la valeur 1b.
- on peut activer la capacité à récupérer les items : on met le tag CanPickUpLoot à 1b.
- on peut modifier sa taille et donc sa hitbox : elle est déterminée par la valeur du tag Size.
Dans un monde classique, les Slimes sont entre la taille 0 (minuscule) et la taille 2 (moyens). Mais rien n’empêche d’aller plus haut avec les commandes, ce que nous ferons pour les mesures.
$$\left [ \text{largeur de la zone} \right ] = 0.5100 \times \left [ \text{taille du Slime} \right ] + 2.7600$$
[table id=51 /]
- une relation qui lie la largeur de la hitbox et de la zone de récupération varie de manière affine :
$$\left [ \text{largeur de la zone} \right ] = \left [ \text{largeur de la hitbox} \right ] + 2.2500$$
- la zone de récupération horizontale est centrée sur la créature. La zone de récupération, tout comme la hitbox sont des prismes à base carrée, contrairement à ce que l’affichage pourrait faire croire.
- mais le résultat le plus important, c’est que le coefficient directeur est de 1. Cela signifie que la zone de récupération est calculée comme une couche sur la hitbox d’épaisseur constante (ici, c’est une épaisseur de 1.125, puisque l’épaisseur est présente deux fois dans la largeur totale de la zone).[table id=52 /]
Lien entre hitbox et zone de récupération verticale
Nous avons fait le travail pour 2 dimensions sur 3 du jeu. Si on a trouvé une bonne correspondance entre la hitbox et la largeur de la zone de récupération, nous ne sommes pas intéressés à la hauteur de cette zone.
$$\left [ \text{hauteur de la zone} \right ] = 0.5100 \times \left [ \text{taille du Slime} \right ] + 0.7600$$
[table id=53 /]
$$\left [ \text{hauteur de la zone} \right ] = 0.5100 \times \left [ \text{hauteur du Slime} \right ] + 0.2500$$
Si on regarde le détail, on constate qu’on ne semble pas avoir un modèle avec une épaisseur constante : en bas, nous avons un espace fixe de 0.25 entre la hitbox et la fin de la zone de récupération alors que ces deux zones coïncident sur la partie haute.[table id=54 /]
- la différence entre un zombie et un bébé zombie est un tag nommé IsBaby, choisi au moment de l’apparition.
- le bébé zombie et le zombie ont la même hitbox : le contour en blanc est le même. Vous pouvez vérifier qu’on peut infliger des dégâts à un bébé zombie même si vous tapez visuellement au-dessus de sa tête.
Si on commence à faire les mesures, on se rend compte que les zones de récupération diffèrent :[table id=55 /] Dans la pratique, la zone de récupération a diminué dans toutes les directions, surtout verticale, alors que la zone de collision n’a pas bougé.
C’est un des cas où distinguer les zones de collision et de pénétration est important et peut se faire visuellement grâce aux marques rouges, même si elle est grandement trompeuse.
Remarque : les expériences ont été faites en version 1.8. En version 1.9, le bébé zombie a une hitbox différente qui correspond, comme pour les autres bébés animaux, à la diminution de moitié selon chacune des directions.
Le cas du wagonnet à entonnoir
Puisqu’il s’agit d’un objet spécialement créé pour la récupération des items, le wagonnet à entonnoir se révèle être une exception très intéressante dans la récupération d’items.
- une première zone en pavé droit au niveau du wagonnet.
- une seconde zone, également en pavé droit, au-dessus du wagonnet.
Voilà ce qui fait du wagonnet à entonnoir une entité particulière dans la récupération d’items.
Conséquences et applications
Il est bien beau de faire des expériences et de découvrir des lois, mais il est encore plus intéressant de leur trouver une utilité, que ce soit pour le jeu en lui-même pour fonctionner ou pour le joueur qui veut exploiter ces mécanismes à son avantage.
- la moitié de la hitbox de la créature.
- la largeur du bloc, soit 1 précisément.
- la moitié de la hitbox d’un item, soit 0,25/2=0,125.
Ce qui correspond exactement à l’épaisseur de 1,125 autour de la hitbox mesurée : l’item n’est pas à l’intérieur de la zone (la surface ne compte pas, c’est en mathématiques ce que l’on nomme un ouvert), la créature ne le récupère donc pas.
La zone de récupération a donc été définie précisément pour ne pas récupérer d’item à travers un bloc. Sauf bien sûr si le bloc fait moins d’un bloc, comme un coffre par exemple (largeur totale de 0,876).
- posé sur le sol, le wagonnet à entonnoir ne peut pas aspirer un item situé 2 blocs au-dessus de lui.
- posé sur un rail, on surélève de 0,0625 bloc la zone de récupération, ce qui donne 1,96+0,0625=2,0225. L’item situé sur le bloc supérieur peut donc être récupéré.
On peut alors faire deux remarques :
- si vous voulez aspirer un item sans rail, il faudra utiliser des blocs ayant une hitbox de hauteur inférieure à 0,96 bloc, ce qui est le cas par exemple du sable des âmes (0,875).
- si on pose un tapis sur le bloc supérieur, on ajoute une épaisseur de 0.0625 bloc, ce qui annule le gain donné par le rail : l’item ne sera pas aspiré s’il est sur un tapis.
- dès qu’un joueur passe, l’item est récupéré dans son inventaire (si c’est possible)
- la disparition de l’item relâche la pression sur la plaque, arrêtant le courant qui rétracte les pistons. Le sol va alors se dérober sous les pieds du joueur.
- Une fois activé (où lorsque l’item disparait naturellement), le distributeur va remettre un item à sa place et réamorcer le piège.
Conclusion :
Nous avons terminé nos expérimentations sur les zones de récupération. Nous avons montré le lien étroit entre la hitbox de la créature et sa zone de récupération, ainsi que le cas très particulier du wagonnet à entonnoir. J’espère que cet article vous aura intéressé et que vous avez eu autant de plaisir à le lire que moi à l’écrire. N’hésitez pas à donner vos retours dans les commentaires, ainsi que des expériences que vous voudriez tester sur les mécaniques de jeu dans Minecraft. A bientôt dans la TestZone.
Téléchargement :
Pour tester par vous-même, voici le monde de test utilisé pour obtenir les résultats présentés :
Merci ! Je note l’idée, cela pourrait être un bon complément à l’article sur la canne à sucre.
La 1.9 prévoit de nouvelles plantes, ce sera l’occasion de faire des analyses détaillées sur le sujet.
J’adore tes articles : je suis fan ! Tu fais de plus en plus complexe mais j’ai un sujet simple à te proposer : les graines poussent plus vite lorsqu’elle sont plantées en ligne (j’ai testé sur 20 000 blés), pourrais-tu faire le test à ton tour ? Il est possible de parler également de la relation vitesse de pousse/lumière.
Encore un grand merci pour tes articles :)
Enorme ! Continue, c’est super intéressant et bien fait !
(mais j’avais calculé la zone pour un joueur avant toi gnagnagnananère :p)
Encore un article très détaillé et bien expliqué.
Merci Brusi pour cette magnifique étude qui, je pense, servira à plus d’un.