Spieler bewegen

Dieses Thema im Forum "Programmierung" wurde erstellt von Munkel, 29. November 2016.

  1. Munkel
    Offline

    Munkel

    Registriert seit:
    27. März 2013
    Beiträge:
    138
    Hallo,
    ich hatte die Idee für ein Plugin Spieler mit Items zu bewegen.
    Nach vorne und hinten bekomme ich sie mit.

    otherpl.setVelocity(otherpl.getLocation().getDirection().normalize().setX(-1));

    Meine Überlegung war Yaw und Pitch zu ändern und dann X oder Z zu setzen.
    Dazu finde ich leider nicht hilfreiches, würde mich über ein Beispiel freuen.
     
    #1
  2. TheSimufreak
    Offline

    TheSimufreak

    Registriert seit:
    28. Juni 2012
    Beiträge:
    42
    #2
  3. Munkel
    Offline

    Munkel

    Registriert seit:
    27. März 2013
    Beiträge:
    138
    Ich habs mit dem Tutorial probiert bloß beim Get wird er halt dahin gesetzt wo er hinguckt und nicht gesetzt wo ich ihn hinhaben möchte dabei kann man das get durch set nicht ersetzen es funktioniert nicht so wie ich mir das gedacht hatte, hast du vielleicht noch eine Hilfestellung

    So sah das aus
    Code (Text):
    1.           Location loc = otherpl.getLocation();
    2.                 double pitch = ((loc.getPitch() + 90) * Math.PI) / 180;
    3.                 double yaw  = ((loc.getYaw() + 90)  * Math.PI) / 180;
    4.                 double x = Math.sin(pitch) * Math.cos(yaw);
    5.                 double y = Math.sin(pitch) * Math.sin(yaw);
    6.                 double z = Math.cos(pitch);
    7.                 Vector vector = new Vector(x, z, y);
    8.                 otherpl.setVelocity(vector);
    Habs btw so gefixt

    Code (Text):
    1. Location loc = otherpl.getLocation();
    2.                 loc.setYaw((float) 0);
    3.                 loc.setPitch((float) 0);
    4.                 loc.setY(loc.getY() + 0.5);
    5.  
    6.                 otherpl.teleport(loc);
    7.                 otherpl.setVelocity(otherpl.getLocation().getDirection().setZ(+ 1));
    8.  
     
    #3
  4. TheSimufreak
    Offline

    TheSimufreak

    Registriert seit:
    28. Juni 2012
    Beiträge:
    42
    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:
    Code (Text):
    1. double a = 4;
    2. Player player = /*...*/
    3. Location playersLocation = player.getLocation();
    4. playersLocation.add(a,0,0);
    5. player.teleport(playersLocation);
    6. //Bewegt den Spieler um 4 auf der X-Achse
    Du kannst die playersLocation ohne weiteres modifiziere,da:
    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:
    Code (Text):
    1. playersLocation = player.getLocation();
    2. Vector b = playersLocation.getDirection();
    3. 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:
    Code (Text):
    1. double x = b.getX();
    2. double y = b.getY();
    3. Vector d;
    4. /*Nach links*/
    5. d =  new Vector(y * -1, x, 0);
    6. /*oder nach rechts*/
    7. d =  new Vector(y , x * - 1, 0);
    8. /*oder vielleicht doch nach hinten*/
    9. d = new Vector(y *- 1, x* -1, 0);
    10.  
    Anschließen multiplizierst du d mit der Anzahl der Blöcke, um die der Spieler bewegt werden soll
    Code (Text):
    1. /*Bewege den Spieler um 5 Blöcke*/
    2. d.multiply(5);
    und zu guter Letzt addierst du diesen Vektor zur playersLocation und teleportierst den Spieler dort hin:
    Code (Text):
    1. playersLocation.add(d);
    2. player.teleport(playersLocation);
    Zum Abschluss ein Beispiel das den Spieler 42 Blöcke nach links teleportiert:
    Code (Text):
    1. Player player = /*...*/
    2. Location playersLocation = player.getLocation();
    3. Vector b = playersLocation.getDirection();
    4. double x = b.getX();
    5. double y = b.getY();
    6. b.setX(y * -1);
    7. b.setY(x);
    8. b.setZ(0);
    9. b.multiply(42);
    10. playersLocation.add(b);
    11. player.teleport(playersLocation);
     
    #4
    PrimitiverTyp gefällt das.