Mir ist gerade aufgefallen, dass du eine Spieler einfach teleportieren kannst. Mit
setVelocity gibts du dem Spieler (meine ich) nur einen Schubs in eine bestimmte Richtung. Willst du also einen Spieler
p um den Abstand
a in der X-Achse bewegen holst du dir die Location des Spieler
p, addierst
a auf den X-Wert und teleportierst den Spieler an diese Location:
double a = 4;
Player player = /*...*/
Location playersLocation = player.getLocation();
playersLocation.add(a,0,0);
player.teleport(playersLocation);
//Bewegt den Spieler um 4 auf der X-Achse
Du kannst die playersLocation ohne weiteres modifiziere,da:
Location getLocation()
Gets the entity's current position
Returns:
a new copy of Location containing the position of this entity
Quelle:
JavaDoc
(Ich empfehle dir an dieser Stelle, falls noch nicht geschehen, dir ein wenig Grundwissen zum Thema Vektoren an zu eigenen. Dazu gibt es u.A. auf Youtube eine Menge deutscher Videos)
Willst du einen Spieler aber relativ zu seiner Blickrichtung teleportieren (also zum Beispiel nach rechts oder links), musst diese mit einberechnen.
Dazu kannst du mit
player.getLocation().getDirection(); die Blickrichtung als
Einheitsvektor b auslesen:
playersLocation = player.getLocation();
Vector b = playersLocation.getDirection();
b.setZ(0);
Als nächstes musst du den Einheitsvektor
d finden, der
orthogonal (und parallel zur X & Y Achse , also z=0) zu der Blickrichtung ist. Rechnerisch erreichst das indem du
d so wählst, so dass das
Skalarprodukt von
b und
d 0 ist. Da das ganze aber recht blöd zu implementieren ist (jedes mal nach x und y auflösen...) , gibt es da einen kleinen Trick:
Du nimmst
b und vertauschst den x mit dem y Wert. Je nach dem ob die nun nach links oder rechts willst multiplizierst du den y bzw. x-Wert mit -1:
double x = b.getX();
double y = b.getY();
Vector d;
/*Nach links*/
d = new Vector(y * -1, x, 0);
/*oder nach rechts*/
d = new Vector(y , x * - 1, 0);
/*oder vielleicht doch nach hinten*/
d = new Vector(y *- 1, x* -1, 0);
Anschließen multiplizierst du
d mit der Anzahl der Blöcke, um die der Spieler bewegt werden soll
/*Bewege den Spieler um 5 Blöcke*/
d.multiply(5);
und zu guter Letzt addierst du diesen Vektor zur playersLocation und teleportierst den Spieler dort hin:
playersLocation.add(d);
player.teleport(playersLocation);
Zum Abschluss ein Beispiel das den Spieler 42 Blöcke nach links teleportiert:
Player player = /*...*/
Location playersLocation = player.getLocation();
Vector b = playersLocation.getDirection();
double x = b.getX();
double y = b.getY();
b.setX(y * -1);
b.setY(x);
b.setZ(0);
b.multiply(42);
playersLocation.add(b);
player.teleport(playersLocation);