Trzeba mieć na uwadze to, że wyrażenie `blocks around %location% in radius %number%` bierze pod uwagę wszystkie bloki, których środki są odległe o nie więcej niż zadany promień. W konsekwencji, jeśli zadana lokacja do zapętlania bloków nie leży w środku bloku, powstała sfera (czyli, jak to ująłeś, kula pusta w środku) nie będzie symetryczna. Jednym z możliwych rozwiązań jest wykorzystanie `location of block at %location%` jako środka sfery, którą chcesz utworzyć. Wtedy masz gwarancję symetrii.
Inny sposób stworzenia sfery to wykorzystanie promienia wodzącego, który wskazuje miejsce utworzenia bloku. Tworzysz wektor o długości promienia sfery, którego yaw (obrót lewo/prawo) i pitch (obrót góra/dół) są modyfikowane z pewnym krokiem, dostosowanym do promienia sfery (im większy promień, tym mniejszy musi być krok, ponieważ powstaną dziury w powierzchni). Przykład implementacji takiego rozwiązania podałem poniżej.
set {_r} to 5
set {_centerLoc} to location(100, 100, 100, "world")
set {_rotationStep} to 10
set {_v} to vector(0, -{_r}, 0)
loop ceil(180 / {_rotationStep}) times:
loop ceil(360 / {_rotationStep}) times:
set block at {_centerLoc} ~ {_v} to obsidian
add {_rotationStep} to yaw of {_v}
remove {_rotationStep} from pitch of {_v}
Nie jest to optymalne rozwiązanie, ponieważ ustawia ono te same bloki wielokrotnie, szczególnie bliżej "spodu" i "szczytu" sfery. Dobrze napisany kod powinien brać to pod uwagę i modyfikować `yaw` ze zmiennym krokiem. Niemniej jednak, jest to i tak lepsze rozwiązanie niż zapętlanie wszystkich bloków, włącznie z tymi wewnątrz sfery.
Mogłem także użyć wektorów sferycznych, ale uznałem składnię zwykłych wektorów za czytelniejszą.
Pozdrawiam.