Pour simuler une faible gravité, j'ai utilisé la commande /effect @p minecraft:levitation 1000000 254
. Vous pouvez modifier l'audace de l'effet pour vous faire sauter plus haut ou planer plus rapidement vers le sol. Mon problème est que cela vous fait sauter très haut dans le ciel lorsque vous planez vers le sol depuis une surface élevée. Existe-t-il un moyen de résoudre ce problème ?
Réponse
Trop de publicités?Mise à jour dans 19w37a (pour 1.15) : La lévitation 254 fonctionne simplement maintenant, je n'ai pas pu reproduire le comportement de rebondissement. Donc la solution ci-dessous n'est utile que pour les anciennes versions. Je vais la garder dans la syntaxe 1.12 à moins que quelqu'un me demande de la mettre à jour.
Je n'ai pas de véritable solution pour arrêter le rebond (et je ne pense pas qu'il y en ait une), mais il est possible de le détecter lorsqu'un joueur est d'abord hors du sol puis de nouveau au sol. Et il est possible de donner au joueur beaucoup d'élan vers le bas pour le forcer à revenir au sol, toujours avec une lévitation négative. Je ne sais pas exactement pourquoi cela fonctionne et ne produit pas une boucle sans fin de rebonds, mais cela fonctionne et c'est tout ce qui compte. Bien sûr, cela semble très ridicule lorsqu'un joueur glisse élégamment vers le sol, puis fait soudainement un saut très haut et très rapide et est ensuite repoussé sur le sol. Mais ce n'est qu'une solution de rechange. Je pense qu'un vrai correctif ne viendra pas avant longtemps si vous n'écrivez pas votre propre mod, parce que c'est un bug dans une fonctionnalité non supportée (niveau d'effet supérieur à 4).
Mise en place :
/scoreboard objectives add antiJump dummy
Boucle :
execute @a[score_antiJump_min=0,score_antiJump=0] ~ ~ ~ detect ~ ~-.1 ~ air 0 scoreboard players set @s antiJump 1
scoreboard players add @a[score_antiJump_min=1] antiJump 1
execute @a ~ ~ ~ detect ~ ~-.1 ~ air 0 scoreboard players set @s antiJump 1
effect @a[score_antiJump_min=2,score_antiJump=2] levitation 0
effect @a[score_antiJump_min=2,score_antiJump=2] levitation 1 128
scoreboard players set @a[score_antiJump_min=9] antiJump 0
effect @a[score_antiJump=0] levitation 1000000 254
Ainsi, chaque joueur au sol a par défaut l'état 0. Lorsqu'il est en l'air (il y a un bloc aérien 0,1 blocs en dessous de lui), il a l'état 1. Lorsqu'ils sont à nouveau au sol, ils bénéficient d'un effet de lévitation négatif élevé (128) qui les pousse vers le bas contre le rebond, de sorte qu'ils volent toujours à environ 5 blocs, mais ils sont de retour au sol après seulement 0,4 seconde. Leur état commence également à augmenter. Lorsqu'il atteint 9, il est remis à 0 et ils bénéficient à nouveau de l'effet de lévitation 254.
Ce système ne vérifie que l'air sous le joueur, pas les autres petits blocs (comme les dalles, les tapis, les coffres, etc.), mais je l'ai testé et il fonctionne tout aussi bien avec eux. La seule exception est si vous construisez de très grandes tours à partir de blocs sans hitbox (panneaux, bannières, boutons, ...) et que le joueur tombe au travers. Dans ce cas, il peut toujours rebondir à la hauteur normale. Pour résoudre ce problème, vous pouvez simplement dupliquer tous les blocs de la tour. execute detect
commande (maintien de l'ordre) avec standing_sign
ou similaire à la place de l'air, ou vous pouvez régler le paramètre 9
dans l'avant-dernière commande à un nombre plus élevé, mais cela pourrait, si c'est trop élevé, empêcher les joueurs de sauter pendant un certain temps après avoir été rebondis.
Ce système est presque imperceptible lorsque vous marchez/sautez normalement. Il y a quelques mouvements avec des escaliers ou de l'eau qui se comportent différemment de ce à quoi on pourrait s'attendre, mais ils devraient être assez rares. J'ai d'abord créé un système où un bloc était placé sur le joueur pour l'empêcher de monter, mais ce système était très inélégant en comparaison de celui-ci et avait beaucoup de potentiel pour des effets secondaires indésirables. Ce système ne devrait pas avoir cela. Il n'est pas parfait, mais c'est (à ma connaissance) le meilleur qui puisse être fait avec des commandes.