ThrowBack als Shield

  • Sehr geehrtes Techleague-Forum,


    ich schlage mich seit einigen Stunden mit einem Problem rum:


    In meinem Listener (EnterRegionListener) -> WorldGuard:



    Ich möchte, dass ein Spieler, wenn er die Region "spawn" betritt, mit zufälligen Werten zurrückgestossen wird. Ich sitze seit 4 Stunden an diesem "Problem". Entweder bin ich zu beschränkt oder doch zu blöd dafür.


    Wenn ich mal eine "Lösung" gefunden habe, dann wird ein Spieler zwar an zwei Seiten zurrückgestossen, aber an den anderen zwei Richtungen nicht. Ich weiss nicht warum. Kann mir vielleicht jemand dabei helfen, dass ein Spieler zurrückgestossen wird, wenn er von allen vier Seiten in diese Region möchte, egal ob vorwärts oder rückwärts oder im Fly-Mode. Ich bin leider mit meinem Latein am ende. Ich habe jetzt eine 30-Stunden Woche hinter mir und ich kann einfach nicht mehr. Wäre Suppi, wenn mir wer Helfen könnte.


    Mit freundlichen Grüssen,



    Play4Lif3.

  • Ich bin leider auch kein wirklicher Experte in Punkto 3D-Vektor-Mathematik / Vektor-Geometrie / Wie-auch-immer-das-in-Fachsprache-heißt,

    deswegen fällt es mir ein bisschen schwer dir das möglichst einfach zu erklären.


    Mit meinem bisschen Erfahrung habe ich mal diesen kleinen Befehl hier geschrieben.

    Er wirft den Spieler von der Start Position der Welt weg.




    Funktionsweise:


    Wenn du ihn ausführst, nimmt der einen Punkt (in meinem Fall hier den World Spawn) und die Spieler Position.

    Dann errechnet er die Richtung (in Anlage 1 dargestellt).


    Die Rechnung dabei ist Folgende:

    x = x1 - x2;

    z = z1 - z2;


    (Neben-Fakt: Wenn du den Spieler zum Mittelpunkt werfen möchtest, ist die Rechnung x = x2 - x1 und z = z2 - z1 )


    Y ist egal, da wir die horizontale Richtung wissen wollen.

    Die Höhe legen wir später fest.


    Mit diesem X und Z Wert konstruieren wir uns einen Richtungsvektor.

    Diesen normalisieren wir und multiplizieren ihn dann mit einem Faktor.

    Dadurch hat die Entfernung zum Punkt 1 keinen Einfluss auf die Kraft, des Wurfes.

    Der Faktor bestimmt wie stark der Wurf sein soll.


    Anschließend setzen wir den Y-Wert (Höhe), damit der Spieler auch nach oben

    katapultiert wird, und so nicht an irgendwelchen Blöcken am Boden hängenbleibt.


    Anschließend werfen wir den Spieler nur noch in die Richtung.




    Hier ist einmal der Quellcode:




    Ich habe dir noch ein Zitat rausgesucht, vielleicht verstehst du

    damit die Berechnung der Richtung ein bisschen besser.

    A nice way to remember which way the subtraction goes is to think of what the vector actually does. Imagine vector v resting at p1, pointing and connecting to p2. This means that p1 + v = p2. Therefore, v = p2-p1




    Auf dein Problem angewandt, könntest du den Code in dem RegionEnterEvent-Listener ausführen und statt
    dem Weltstartpunkt, den Mittelpunkt der Region wählen. Dann würde der Spieler immer beim betreten der

    Region von dessen Mittelpunkt weg- und ergo wieder aus der Region raus geworfen werden.

    Aber spiel am besten mal ein bisschen mit dem Befehl herum. Ich glaube irgendwann verstehst du so ein bisschen das Prinzip.


    Sollte irgendetwas unklar sein, zögere nicht zu fragen ;)

  • Soweit hatte ich das ganze leider auch schon...

    Ich kenne mich zwar ein wenig in 3D-Vector-Mathematik aus, aber ich bin anscheinend zu beschränkt gerade...

    Ich habe das jetzt mit der WorldGuard Region gemacht:


    Ich habe mal ein Video auf Youtube hochgeladen, damit du weisst, was ich meine.


    Link:


    Ich danke dir!

  • EurenikZ

    Hat den Titel des Themas von „ThrowBack als Shield.“ zu „ThrowBack als Shield“ geändert.

  • Ich verstehe leider nicht ganz, was du mit dem Code versuchst. ?(

    So wie er jetzt dasteht, könntest du es doch auch so kürzen:

    Java
    1. location = new Location(w,
    2.         e.getRegion().getMaximumPoint().getX(),
    3.         e.getRegion().getMaximumPoint().getY(),
    4.         e.getRegion().getMaximumPoint().getZ());
    5. // (wenn der MaximumPoint nicht schon bereits eine Location ist)




    Ich würde den Mittelpunkt der Region so einfach ausrechnen


    Und dann halt wie du es dann auch machst, so weiter arbeiten:

  • Okay. Das funktioniert schon besser. Leider habe ich auf einer Seite wieder einen Fehler:



    Hier nochmal ein Link:


    Was mich wundert, dass man je nach dem, wo man steht, einen drall nach links oder rechts hat. Kann man das irgendwie verhindern?


    Ich bedanke mich nochmal vielmals!

  • Da bin ich jetzt selber überfragt. ?(

    Ich installiere mir mal eben WorldGuard auf meinem lokalen Server

    und probiere es selber aus. Wenn ich eine Lösung finde, gebe ich dir Bescheid :)

  • Also.. folgender Code funktioniert bei mir Einwand frei:




    Zitat

    Was mich wundert, dass man je nach dem, wo man steht, einen drall nach links oder rechts hat. Kann man das irgendwie verhindern?

    Der Code ist jetzt darauf ausgerichtet, dass er dich immer vom Mittelpunkt der Region, und nicht der Kante der Region wegschleudert.

    Einen so starken rechts/links Drall wie in deinem Video sollte er allerdings nicht haben (hat er bei meinem EventListener auch nicht)

    Das heißt aber, je nachdem wo an der Kante der Spieler versucht die Region zu betreten, wird die Richtung ein bisschen beeinflusst.


    Vielleicht verstehst du mit meiner angehängten Grafik etwas besser was ich meine.

    Rot: Regions Mittelpunkt

    Grün: Regions Grenze

    Blau: Punkte an denen der Spieler versucht, die Region zu betreten

    Schwarz: Richtung, in die der Spieler geschleudert wird


    Man könnte das Plugin auch so programmieren, dass er von der Kante und nicht vom Mittelpunkt weggeschleudert wird,

    das wäre dann aber vermutlich aufwendiger und würde kein bisschen helfen, wenn es momentan bei dir noch nicht mit dem Mittelpunkt klappt.




    Falls du es doch probieren willst, hätte ich hier einen Ansatz:

    Mal erklärt:

    Bei diesem Ansatz schaust du, in welche Richtung er mehr geworfen wird (x oder z) und lässt dann die andere Richtung komplett weg.

    Aber das ist nur ein Ansatz. Es gibt vermutlich eine Menge besserer Lösungen, die auch andere Formen als nur ein Quadrat unterstützen. ;)




    Ich schreibe schon wieder viel zu viel, probiers mal mit meinem EventListener (musst ggf. die If-Abfrage abändern)

    und schau ob es funktioniert :)

  • Immer wieder gerne :S

  • Neu erstellte Beiträge unterliegen der Moderation und werden erst sichtbar, wenn sie durch einen Moderator geprüft und freigeschaltet wurden.

    • Windowstaste
    • :umleitung:
    • :moved:
    • :closed:
    • :)
    • :(
    • ;)
    • :P
    • ^^
    • :D
    • ;(
    • X(
    • :*
    • :|
    • 8o
    • =O
    • <X
    • ||
    • :/
    • :S
    • X/
    • 8)
    • ?(
    • :huh:
    • :rolleyes:
    • :love:
    • 8|
    • :cursing:
    • :thumbdown:
    • :thumbup:
    • :sleeping:
    • :whistling:
    • :evil:
    • :saint:
    • <3
    • :!:
    • :?:
    Maximale Anzahl an Dateianhängen: 10
    Maximale Dateigröße: 1 MB
    Erlaubte Dateiendungen: bmp, gif, jpeg, jpg, pdf, png, txt, zip