DRE2N / DungeonsXL

Create custom dungeons and adventure maps with ease!
https://www.spigotmc.org/resources/dungeonsxl.9488/
GNU General Public License v3.0
154 stars 83 forks source link

Players keep edit-mode permissions after leaving edit-mode #900

Open Malfrador opened 3 years ago

Malfrador commented 3 years ago

Description

Edit-mode permissions are kept after leaving the edit mode with /dxl leave. Paper 1.16.3 LuckPerms 5.2.7

Reproduce

(List steps to reproduce, e.g.:

  1. Have some edit-permissions set-up, e.g. WorldEdit
  2. Enter the edit-mode of a dungeon with /dxl edit
  3. Leave the dungeon with /dxl leave
  4. Have fun with your WorldEdit permissions in the normal world.

Expected behavior

Edit-mode permissions should get removed after leaving edit-mode

PS: Ich weiß das du aufm Discord gefragt hattest ob das noch ein Bug ist und das verneint wurde. ist aber leider wohl doch noch ein Bug :/

Sataniel98 commented 3 years ago

Ich hab es mir schon während der Hausarbeitsphase angeschaut und hab auf den ersten Blick eher geglaubt, dass es gar nicht DXLs Problem ist:

https://github.com/DRE2N/DungeonsXL/blob/master/core/src/main/java/de/erethon/dungeonsxl/player/DEditPlayer.java#L66

https://github.com/DRE2N/DungeonsXL/blob/master/core/src/main/java/de/erethon/dungeonsxl/player/DEditPlayer.java#L94

DXL benutzt Permission#playerAdd/RemoveTransient(String world, Player player, String permission) was LuckPerms nicht implementiert: https://github.com/lucko/LuckPerms/blob/master/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/LuckPermsVaultPermission.java

In der Standard-Implementierung callt das einfach die playerAddTransient(Player player, String permission)-Methode ohne Welt, und in deren Standard-Implementierung erkenne ich nicht unbedingt, ob die Permission darin überhaupt noch "transient" wäre.

https://github.com/MilkBowl/VaultAPI/blob/master/src/main/java/net/milkbowl/vault/permission/Permission.java#L227

Wieso das nicht auf dieselbe Weise dann auch entfernt wird, weiß ich nicht. Wenn es an DXL liegt, wird DEditPlayer#delete() aus irgendeinem Grund nicht gecallt, aber das müsste noch tausend andere Probleme machen.

Ich denke, dass LuckPerms zumindest selbst die Transient-Methoden implementieren müsste oder Vault vielleicht sogar besser gar keine komischen Defaults sondern einfach absrakte Methoden oder Exceptions haben sollte.

"We've been tricked, we've been backstabbed, and we've been, quite possibly, bamboozled"

Malfrador commented 3 years ago

Habs ausprobiert, in dem ich den Weltnamen im Chat ausgegeben habe.

[14:34:39 INFO]: [DungeonsXL] Added Perm for CraftPlayer{name=BlacKroma} in Test: worldedit.* // Name des Dungeons
[14:34:39 INFO]: [DungeonsXL] Added Perm for CraftPlayer{name=BlacKroma} in Test: essentials.broadcast
[14:34:45 INFO]: BlacKroma issued server command: /dxl leave
[14:34:45 INFO]: [DungeonsXL] Removed Perm for CraftPlayer{name=BlacKroma} in DXL_Edit_0: worldedit.*
[14:34:45 INFO]: [DungeonsXL] Removed Perm for CraftPlayer{name=BlacKroma} in DXL_Edit_0: essentials.broadcast

Anscheinend gibt es einen Unterschied zwischen worldund getWorld . getWorld gibt einem die EditWorld (auch wenn ich erwartet hätte, das dafür getEditWorldgut ist, aber na gut). Hab das gefixt weil das denke ich mal ziemlicher sicher falsch ist. Eine Welt mit dem Dungeonnamen existiert ja zu keinem Zeitpunkt. PR: https://github.com/DRE2N/DungeonsXL/pull/902 Aber: Löst das Problem nicht. Permissions werden jetzt zwar korrekt entfernt und hinzugefügt für die richtige Welt, aber man behält sie trotzdem. Eventuell wäre es doch am einfachsten, einfach direkt die LP-API zu nutzen? Dann könnte man auch Dungeons als Context implementieren und sich das Permission adden/entfernen sparen.

LP hat btw eine vault-ignore-world-Config-Option. Ich gehe also eigentlich davon aus, das es immer die Welt ignoriert - außer die Option ist nur fürs gute Gewissen.

Sataniel98 commented 3 years ago

Es ist andersrum. getWorld() gibt einem die Bukkit-World und world ist der Parameter des Constructors, auf den editWorld / getEditWorld() gesetzt wird.

Permissions werden jetzt zwar korrekt entfernt und hinzugefügt für die richtige Welt, aber man behält sie trotzdem.

Wie muss ich mir das vorstellen? Die Methode zum Entfernen wird gecallt, aber nichts passiert? Oder die Permission wird auf der Disc entfernt, aber nicht im Spiel?

Malfrador commented 3 years ago

Die Methode wird gecalled und wird für Vault auch gegeben/entfernt. LP hatte mal eine vault-debug-Funktion, die aber leider entfernt wurde. Ob es auch wirklich bei LP ankommt kann man daher nicht sagen, denn transient-Permissions werden auch bei Befehlen nicht angezeigt. Also wirklich viel schlauer als vorher sind wir dadurch auch nicht.