Mon objectif est de faire pivoter une entité autour d'un point fixe de 180 degrés. Voici ce que j'ai essayé jusqu'à présent :
Rotation d'une entité par x
autour d'un point situé à une distance connue est assez facile :
execute positioned ~ ~ ~10 facing entity @s feet rotated ~x ~ positioned ^ ^ ^10 run teleport @s ~ ~ ~
Si, comme dans mon cas, vous voulez vous téléporter à 180 degrés exactement, c'est encore plus facile :
teleport @s ~ ~ ~20
Cependant, je n'ai pas réussi à trouver une méthode simple pour faire pivoter une entité autour d'une fixe point dans l'espace. Les méthodes ci-dessus reposent sur la connaissance de la distance entre l'entité et le point autour duquel effectuer la rotation (dans ce cas, exactement 10 blocs en z, par rapport à l'entité). Pour simplifier les choses, je me suis contenté de la méthode xz
plan.
La seule méthode de travail que j'ai trouvée utilise une approche systématique utilisant les AEC (toujours dans le même ordre d'idées). 30.5 ~ 30.5
) :
#> the following is not optimized, purely for clarity's sake
summon area_effect_cloud 30.5 ~ 30.5 {Duration:2,Tags:["rot.origin"]}
# Calculate offset on each axis from Entity E to the AEC (looking down from above):
# E-------------
# | |
# |-----------AEC------------|
# | |
# |-------------E*
# Then move the AEC by the offset amount on each axis so it ends up at E*
# Finally, teleport E to E*
# get the offset from the entity to the AEC
execute store result score @s pos.x run data get entity @s Pos[0] 1000
execute store result score @s pos.z run data get entity @s Pos[2] 1000
scoreboard players set @e[tag=rot.origin] pos.x 30500
scoreboard players set @e[tag=rot.origin] pos.z 30500
scoreboard players set @e[tag=rot.origin] offset.x 30500
scoreboard players set @e[tag=rot.origin] offset.z 30500
scoreboard players operation @e[tag=rot.origin] offset.x -= @s pos.x
scoreboard players operation @e[tag=rot.origin] offset.z -= @s pos.z
# move AEC and teleport
scoreboard players operation @e[tag=rot.origin] pos.x += @s offset.x
scoreboard players operation @e[tag=rot.origin] pos.z += @s offset.z
execute as @e[tag=rot.origin] store result entity @s Pos[0] 0.001 run scoreboard players get @s pos.x
execute as @e[tag=rot.origin] store result entity @s Pos[2] 0.001 run scoreboard players get @s pos.z
teleport @s @e[tag=rot.origin,limit=1]
kill @e[tag=rot.origin]
Cette approche est sans aucun doute lent même après avoir optimisé les sélecteurs en fonctions distinctes.
Le plus proche simple La solution que j'ai trouvée est la suivante : l'entité tourne autour du point 30.5 ~ 30.5
mais elle repose à nouveau sur la connaissance de la distance par rapport au joueur (notez le décalage de 10 blocs) :
execute positioned 30.5 ~ 30.5 facing entity @s feet run teleport @s ^10 ^ ^
J'ai fait de mon mieux pour partager tout ce que j'ai essayé jusqu'à présent. Si quelqu'un a des idées sur la façon de simplifier cette méthode, je serais ravi d'entendre ce que vous en pensez. Voici un bref résumé de mes intentions : Faire pivoter l'entité...
- ...autour d'un point fixe et connu ; comme
30.5 ~ 30.5
- ...lorsque l'entité se trouve à une distance arbitraire de ce point, qu'il s'agisse de 5, 10 ou 1412,2222 blocs.