Keine Items / Befehle beim Fallen nutzen

  • Die Lösung mit der besten Performance wäre sicherlich ein Aufruf von https://papermc.io/javadocs/pa…/Entity.html#isOnGround-- (Entity#isOnGround). Allerdings gab es zumindest in der Vergangenheit bei der Nutzung im Zusammenhang mit Spielern einige Warnungen in den Javadocs, weswegen der Aufruf der Methode beim Spieler auch als Deprecated markiert war. Hierbei war das Problem, dass der "OnGround"-Status vom Client gesendet wurde, und daher mit modifizierten Clients sehr leicht gefälscht werden konnte. Diese Hinweise gibt es in den neueren Versionen (1.12+) allerdings nicht mehr, auch wenn ich mir nicht sicher bin ob das nun bedeutet, dass der Status auch bei Spielern selbst berechnet wird, immerhin wird der Status nach wie vor vom Client als Teil des Protokolls übertragen: https://wiki.vg/Protocol#Player_Position


    Ich würde diese Methode dennoch erstmal probieren (insbesondere sofern es nicht sooo kritisch ist, wenn es mit einem manipulierten Client umgehbar wäre) und nur falls diese Methode nicht deinen Ansprüchen genügt auf diese einfache, eigene Implementation zurückgreifen. Die Performance unterscheidet sich zwar wirklich nur minimal, da hier ebenfalls ausschließlich einfache mathematische Vergleiche und sehr schnelle Lookups mit linearer Laufzeit durchgeführt werden, aber die andere Methode ist extra für diesen Fall gedacht und lässt sich deutlich besser lesen, zumindest wenn man mich fragt. Die alternative Lösung wäre eben:


    Code
    1. // hier muss selbstverständlich eine echte variable genutzt werden
    2. Player yourPlayer;
    3. // die unterscheidung bei .isSolid() kannst du auf deinen individuellen fall anpassen
    4. // ggf. möchtest du ja zum beispiel spinnenweben und co. als "auf dem boden" zählen
    5. return yourPlayer.getLocation().getBlock().getRelative(BlockFace.DOWN).getType().isSolid();


    Diese Abfrage packst du dann in eine eigene Methode und fragst sie beim PlayerCommandPreprocessEvent und PlayerInteractEvent ab. Sollten sie nicht "auf dem Boden" sein, so brichst du das Event ab (Event#setCancelled(Boolean)).