Probleme mit Npc.setPosition() und Player.raycast()

  • Ich werkel gerade an einem "Vieh-Züchter"-Plugin. Auf einfache und interaktive Weise soll man in der Lage sein, Kühe, Schweine etc. zu "domestizieren",
    zu füttern und zur Vermehrung ^^ anzuregen.


    Und dabei bin ich auf einige Probleme mit der API gestoßen:



    1. Unter anderem sollen Tiere einem folgen können, dazu verwende ich setPosition().


    Mir ist aufgefallen, dass der Npc zwar brav zu der gewünschten Position hingeht, aber sobald die Position erreicht ist,
    scheint in der Engine - vllt. aufgrund eines "KI-Bewegungsmusters" - diese wieder rückgängig gemacht zu werden.


    Der Npc scheint wieder zum Ursprungsort zurückzukehren. Dabei kommt es oft vor, dass das 3D-Modell aber an Ort und Stelle verharrt.
    (dies kann man wunderbar sehen, wenn man per Timer sich jede Sekunde die Position mit getPosition() plus Distanz ausgeben lässt)


    Die "logische" Position weicht zunehmens von der "visuellen" ab.
    Unter anderem hat dies auch Auswirkungen auf ein Player.raycast() mit CollisionType.NPCS:
    es wird keine Kollision festgestellt, das anvisierte 3D-Modell ist schlichtweg unsichtbar.


    Um das wieder auf Spur zu bringen, muss gegebenenfalls der Chunk komplett verlassen oder die Welt neu geladen werden.
    Es wäre super, wenn setPosition() praktisch ein Reset auslösen würde beim Path-Finding oder welche Macht da sonst am Werk ist! :)


    2. Dies ist eher ein Wunsch: Ein RayCastResult stellt nur Vektoren und so bereit.


    Ich wünsche mir noch eine Referenz auf das getroffene Objekt, also z.B. RayCastResult.getHitNpc() (natürlich nur bei CollisionType.NPCS).



    3. Verwendung von Definitions.ObjectDefiniton erfordert die commons.jar


    Eine Quelle mit Aufruf von Definitions.getObjectDefinition() kann nur erfolgreich kompiliert werden,
    wenn die "commons.jar" bekannt gemacht wurde.



    Das war's erstmal, in diesem Sinne:
    "Eine Kuh macht muh, viele Kühe machen ....!" :D

  • 1. Unter anderem sollen Tiere einem folgen können, dazu verwende ich setPosition().

    setPosition() ist tatsächlich fehlerhaft =O Das wird im heutigen Hotfix korrigiert! Allerdings wird diese Methode dann nur noch zum Teleportieren von NPCs dienen. Gleichzeitig wird aber eine neue Methode moveTo() eingeführt, mit welcher ein NPC angewiesen werden kann, zu einer bestimmten Position hinzugehen ;)


    2. Dies ist eher ein Wunsch: Ein RayCastResult stellt nur Vektoren und so bereit.

    Mit dem nächsten Hotfix wird es die Möglichkeit geben, auf das Kollisionsobjekt zuzugreifen. Momentan funktioniert das aber nur für Player und Npc


    3. Verwendung von Definitions.ObjectDefiniton erfordert die commons.jar

    Hmm... ich konnte das leider nicht reproduzieren 8| Kannst du ggf. mal den Codeausschnitt hier posten? Lädst du das Projekt als fertige jar ins Spiel, oder lässt du es automatisch vom Spiel/Server zur Laufzeit kompilieren?

  • Nur Beispiel, selbst verwende ich es nicht. War aber trotzdem drübergestolpert...


    Definitions.ItemDefinition xyz = Definitions.getItemDefinition("carrot");
    Definitions.ObjectDefiniton abc = Definitions.getObjectDefinition("objectkit");


    ergibt:


    Error:(528, 16) java: cannot access commons.definitions.Items
    class file for commons.definitions.Items not found
    Error:(529, 16) java: cannot access commons.definitions.Objects
    class file for commons.definitions.Objects not found


    Jetzt während der Entwicklung nutze ich die "load class files"-Methode mit classinfo.txt. (ist echt eine super Methode, erleichtert alles ungemein! :thumbup: )



    Aber dass du bereits eine setPosition()-Lösung mit dem kommenden Hotfix auf Tasche hast,
    und obendrauf noch eine RayCastResult-Erweiterung, ist ja mal oberhammergeil!


    Vielen lieben Dank, @red51!

  • Danke für den Hinweis bzgl. der Definitions :) Das Problem sollte jetzt *eigentlich* nicht mehr auftreten (also die PluginAPI sollte auch ohne commons.jar kompilierbar sein).


    Das neue Update hat nun auch die neuen Funktionen reingebracht, ich habe sie grob getestet und alles schien soweit zu funktionieren. Falls es dennoch Probleme gibt, lass es mich bitte wissen ;)


    PS: Anstatt die class-files zu laden, kannst du auch den Server das Projekt direkt kompilieren lassen. Du gibst dann nur den Pfad zu deinem Projekt an, und bei Serverstart (oder bei Eingabe des "reloadplugins" Commands) kompiliert der Server das Projekt automatisch neu (so kannst du jederzeit Änderungen im Sourcecode vornehmen und die Plugins neuladen, ohne, dass du den Server neustarten oder irgendwas hin- und herkopieren musst)^^

  • Eben alles schnell durchgetestet, funktioniert alles! :thumbup:
    Habe allerdings einen halben Herzkasper gekriegt, als ich meinem 50m entfernten Elefanten gesagt habe, mir zu folgen
    und urplötzlich direkt vor mir stand! 8o (hatte setPosition() noch nicht in moveTo() umgeändert :) )


    Und RayCastResult.getCollisionObject() bringt mich richtig weiter! Danke nochmals!


    Drück' mir die Daumen, dass das Plugin gelingt (zumal es auf Anhieb multiplayer-fähig sein soll, obwohl ich grundsätzlich nur in singleplayer teste/ spiele).

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!