Skocz do zawartości
  • 0

Teleportowanie moba do miejsca względem gracza


Gość Usunięty#10777

Pytanie

Gość Usunięty#10777

Witam. Próbowałem napisać skrypt, który teleportuje moba o podanej nazwie 1.5 kratki na prawo od gracza.

every tick:
	loop all players:
		if loop-player's facing is north:
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] @p"
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] ~1.5 ~ ~"
		if loop-player's facing is south:
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] @p"
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] ~-1.5 ~ ~"
		if loop-player's facing is west:
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] @p"
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] ~ ~ ~1.5"
		if loop-player's facing is east:
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] @p"
			make loop-player execute command "/minecraft:tp @e[name=NazwaMoba] ~ ~ ~-1.5"

Generalnie ten skrypt wykrywa w którą stronę gracz się patrzy i na podstawie tego teleportuje moba do pozycji przesuniętej o 1.5 w odpowiednim kierunku.

Problem jest taki, że to działa na podstawie kierunku, w który gracz się patrzy (yaw & pitch), a chciałbym, żeby to działało również podczas np. jazdy wagonikiem/minecartem.

W wagoniku można się rozglądać na różne strony, mimo że cały czas jedziemy w jednym kierunku. To sprawia, że mob jest tepany, np za wagonikiem, przed wagonikiem, itd, a chciałbym, by pozostawał po "naszej" prawej stronie, czyli właściwie po lewej stronie wagoniku.

Z tego wynika, że najlepiej byłoby jakoś wykryć kierunek w jakim gracz się przemieszcza, a nie patrzy, i dopiero na tej podstawie ustalić przesunięcia w komendzie /tp. Czy ktoś mógłby z tym pomóc?

Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/
Udostępnij na innych stronach

10 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
#-----Event z dodatku Skellet
on vehicle move:

	#-----Przyszła i poprzednia lokalizacja wagonika trafia do zmiennej
	set {_} to past location
	set {_f} to future location

	#-----Tworzymy wektor z zapisanych współrzędnych
	set {_v} to vector from {_} to {_f}
	#-----Obracamy go o 90 stopni względem osi y aby tworzyło lokalizację po prawej stronie wagonika, lub o 270 stopni dla lewej
	rotate {_v} around y-axis by 90
	#-----Zmieniamy jego długość na 1.5 klocka
	set standard length of {_v} to 1.5

	#-----Dodajemy wartości wektora do współrzędnych przyszłej lokalizacji
	add x component of {_v} to x-loc of {_}
	add z component of {_v} to z-loc of {_}

	#-----Teraz w zmiennej {_} znajduje się już lokalizacja (1.5 klocka na prawo od wagonika), możesz do niej teleportować swojego moba, poniżej test z wełną
	set block at {_} to red wool block

@Aberforth

Edytowane przez ZiemniaQ
Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-223986
Udostępnij na innych stronach

  • 0
Gość Usunięty#10777

Nie do końca to działa. Same zmienne ustawiają się dobrze, ale wełna się nie pojawia. Nie wyświetla żadnych błędów.

 

EDIT: Wełna się stawia, ale nie w pożadanym miejscu obok wagonika, lecz na x=0, z=0 i y= y wagonika

Edytowane przez Aberforth
Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-224232
Udostępnij na innych stronach

  • 0
W dniu 9.09.2019 o 15:42, Aberforth napisał:

Nie do końca to działa. Same zmienne ustawiają się dobrze, ale wełna się nie pojawia. Nie wyświetla żadnych błędów.

EDIT: Wełna się stawia, ale nie w pożadanym miejscu obok wagonika, lecz na x=0, z=0 i y= y wagonika

Niewykluczone że przyszła i przeszła lokalizacja zwraca jedno i to samo więc wektor jest punktem...

W zasadzie żeby to naprawić wystarczy tylko pobrać sobie wagonik jako entity i z niego wyciągnąć kąt yaw, reszta idzie tak samo jak w przykładzie wyżej:

#Załóżmy że wagonik trzymasz w zmiennej {_wagonik}

set {_v} to vector from yaw (yaw of {_wagonik}) and pitch 0
rotate {_v} around y-axis by 90
set {_} to location of event-entity
set standard length of {_v} to 1.5
add x component of {_v} to x-loc of {_}
add z component of {_v} to z-loc of {_}

set block at {_} to yellow wool block

 

Edytowane przez ZiemniaQ
Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-224709
Udostępnij na innych stronach

  • 0
Gość Usunięty#10777
on vehicle move:
	set {_wagonik} to event-entity

	set {_v} to vector from yaw (yaw of {_wagonik}) and pitch 0
	rotate {_v} around y-axis by 90
	set {_} to location of event-entity
	set standard length of {_v} to 5
	add x component of {_v} to x-loc of {_}
	add z component of {_v} to z-loc of {_}

	set block at {_} to yellow wool block

Działa, ale wełna stawia się idealnie w miejscu wagonika, a nie 1,5 na prawo. Chyba ustawianie długości wektora nie działa. Ustawiłem na 5 żeby mieć pewność, i dalej stawia się w miejscu wagonika.

Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-224722
Udostępnij na innych stronach

  • 0
W dniu 18.09.2019 o 13:34, Aberforth napisał:

Działa, ale wełna stawia się idealnie w miejscu wagonika, a nie 1,5 na prawo. Chyba ustawianie długości wektora nie działa. Ustawiłem na 5 żeby mieć pewność, i dalej stawia się w miejscu wagonika.

on vehicle enter:
	set {entity::%player%} to targeted entity of player
on vehicle exit:
	delete {entity::%player%}

on vehicle move:
	set {_v} to vector from yaw (yaw of {entity::%player%}) and pitch 0
	rotate {_v} around y-axis by 90
	set {_} to location of event-entity
	set standard length of {_v} to 1.5
	add x component of {_v} to x-loc of {_}
	add z component of {_v} to z-loc of {_}

	set block at {_} to cyan wool block

Dobra, ostatnie podejście... Sprawdziłem dokładnie - event-entity nie zwraca pojazdu tylko stworzenie w nim siedzące, zatem trzeba trochę nakombinować. Nie miałem jak tego przetestować, ale mam nadzieję że kod zadziała.

Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-224779
Udostępnij na innych stronach

  • 0
Gość Usunięty#10777

Nie wyrzuca błędu, ale dalej stawia blok w miejscu wagonika. 

Powiem dokładnie do czego mi to potrzebne, może uda się znaleźć lepsze rozwiązanie.

Mamy niewidzialny wagonik z nałożonym modelem 3D samochodu. Wagonik to "siedzenie kierowcy". Model 3D jest zawsze obracany odpowiednio do wagonika, by zawsze przód był przodem itp.

Teraz potrzebujemy umieścić moba w "siedzeniu pasażera", więc szukamy tego miejsca na prawo od wagonika, a moba nieprzerwanie teleportujemy do tego miejsca, aby pozostawał na siedzeniu pasażera podczas jazdy (za jazdę minecartem nie po torach odpowiada plugin)

Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-224804
Udostępnij na innych stronach

  • 0

Ugh... Liczyłem na to że yaw jest jednakowy i zawsze zwraca kierunek w którym jedzie pojazd. Niestety ustawia się jakoś dziwnie losowo.

Cytat

Model 3D jest zawsze obracany odpowiednio do wagonika

Najlepiej by było pobrać sobie ten kąt względem którego jest obracany i dopiero z niego generować lokalizację.

 

Ja mogę zaproponować coś takiego, co niby powinno już działać. (wymaga Skript-mirror):

import:
	org.bukkit.event.vehicle.VehicleMoveEvent

on VehicleMoveEvent:
	set {_v} to vector from event.getFrom() to event.getTo()
	rotate {_v} around y-axis by 270
	set {_} to event.getTo()
	set vector length of {_v} to 1.5
	add x component of {_v} to x-loc of {_}
	add z component of {_v} to z-loc of {_}

Czyli tak samo jak na początku, ale ręcznie ustawiane... I u mnie to działa (prawdopodobnie) tak jak powinno.

Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-224859
Udostępnij na innych stronach

  • 0
W dniu 22.09.2019 o 10:39, Aberforth napisał:

Działa bardzo dobrze, dzięki wielkie.

Chociaż tyle... po takiej ilości prób i poświęconego czasu XDD

W dniu 22.09.2019 o 10:39, Aberforth napisał:

Jeśli mogę to jeszcze ostatnie pytanie, jak teraz teleportować do {_} moba o określonej nazwie?

Szczerze nie mam pojęcia jak to zgrać z pluginem i na jakiej zasadzie wszystko działa.
Będziesz musiał pewnie przy spawnowaniu tego moba wrzucić go do zmiennej gracza i potem tylko tą zmienną 'teleportować'

set {mob::%player%} to %entity%
teleport {mob::%player%} to {_}

name of %entity% - zwraca nazwę moba

I tak samo przy kasowaniu moba trzeba zmienną usuwać.
Czy to będzie działać - tak.
Czy będzie działać idealnie - nie.

Odnośnik do komentarza
https://skript.pl/temat/34745-teleportowanie-moba-do-miejsca-wzgl%C4%99dem-gracza/#findComment-224958
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...