diff --git a/build.gradle.kts b/build.gradle.kts index 4a2899d..c7581d1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,6 +9,8 @@ surfPaperPluginApi { mainClass("dev.slne.surf.essentials.PaperMain") generateLibraryLoader(false) foliaSupported(true) + + useCanvasMc() authors.addAll("twisti", "red") } \ No newline at end of file diff --git a/src/main/kotlin/dev/slne/surf/essentials/PaperMain.kt b/src/main/kotlin/dev/slne/surf/essentials/PaperMain.kt index f2b100a..babc473 100644 --- a/src/main/kotlin/dev/slne/surf/essentials/PaperMain.kt +++ b/src/main/kotlin/dev/slne/surf/essentials/PaperMain.kt @@ -1,7 +1,10 @@ package dev.slne.surf.essentials import com.github.shynixn.mccoroutine.folia.SuspendingJavaPlugin +import dev.slne.surf.essentials.listener.CanvasListener +import dev.slne.surf.surfapi.bukkit.api.event.register import dev.slne.surf.surfapi.bukkit.api.extensions.pluginManager +import dev.slne.surf.surfapi.bukkit.api.surfBukkitApi import org.bukkit.plugin.java.JavaPlugin val plugin get() = JavaPlugin.getPlugin(PaperMain::class.java) @@ -14,6 +17,10 @@ class PaperMain : SuspendingJavaPlugin() { override fun onEnable() { PaperCommandManager.registerAll() PaperListenerManager.registerAll() + + if (surfBukkitApi.isCanvasMc) { + CanvasListener.register() + } } override fun onDisable() { diff --git a/src/main/kotlin/dev/slne/surf/essentials/command/WorldCommand.kt b/src/main/kotlin/dev/slne/surf/essentials/command/WorldCommand.kt index f1b769a..7015f4c 100644 --- a/src/main/kotlin/dev/slne/surf/essentials/command/WorldCommand.kt +++ b/src/main/kotlin/dev/slne/surf/essentials/command/WorldCommand.kt @@ -8,6 +8,7 @@ import dev.slne.surf.essentials.command.argument.world.worldsArgument import dev.slne.surf.essentials.service.worldService import dev.slne.surf.essentials.util.permission.EssentialsPermissionRegistry import dev.slne.surf.essentials.util.util.isFolia +import dev.slne.surf.surfapi.bukkit.api.surfBukkitApi import dev.slne.surf.surfapi.core.api.font.toSmallCaps import dev.slne.surf.surfapi.core.api.messages.adventure.buildText import dev.slne.surf.surfapi.core.api.messages.adventure.sendText @@ -28,10 +29,10 @@ fun worldCommand() = commandTree("world") { anyExecutor { executor, args -> val world: World by args - if (Bukkit.getServer().isFolia()) { + if (Bukkit.getServer().isFolia() && !surfBukkitApi.isCanvasMc) { executor.sendText { appendErrorPrefix() - error("Dieser Befehl wird auf Folia-Servern nicht unterstützt.") + error("Dieser Befehl wird auf Folia-Non-Canvas-Servern nicht unterstützt.") } return@anyExecutor } @@ -61,10 +62,10 @@ fun worldCommand() = commandTree("world") { anyExecutor { executor, args -> val world: World by args - if (Bukkit.getServer().isFolia()) { + if (Bukkit.getServer().isFolia() && !surfBukkitApi.isCanvasMc) { executor.sendText { appendErrorPrefix() - error("Dieser Befehl wird auf Folia-Servern nicht unterstützt.") + error("Dieser Befehl wird auf Folia-Non-Canvas-Servern nicht unterstützt.") } return@anyExecutor } diff --git a/src/main/kotlin/dev/slne/surf/essentials/listener/CanvasListener.kt b/src/main/kotlin/dev/slne/surf/essentials/listener/CanvasListener.kt new file mode 100644 index 0000000..400e54b --- /dev/null +++ b/src/main/kotlin/dev/slne/surf/essentials/listener/CanvasListener.kt @@ -0,0 +1,58 @@ +package dev.slne.surf.essentials.listener + +import dev.slne.surf.essentials.service.lastLocationService +import dev.slne.surf.essentials.service.worldService +import dev.slne.surf.essentials.util.permission.EssentialsPermissionRegistry +import dev.slne.surf.surfapi.bukkit.api.event.cancel +import dev.slne.surf.surfapi.core.api.messages.adventure.sendText +import io.canvasmc.canvas.event.EntityPortalAsyncEvent +import io.canvasmc.canvas.event.EntityTeleportAsyncEvent +import org.bukkit.World +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerTeleportEvent + +object CanvasListener : Listener { + @EventHandler + fun onPortal(event: EntityPortalAsyncEvent) { + val player = event.entity as? Player ?: return + val world = event.to + + if (worldService.isLocked(world)) { + if (!player.hasPermission(EssentialsPermissionRegistry.WORLD_BYPASS)) { + event.cancel() + player.sendText { + appendErrorPrefix() + + when (world.environment) { + World.Environment.NETHER -> error("Der Nether ist zurzeit deaktiviert.") + World.Environment.THE_END -> error("Das End ist zurzeit deaktiviert.") + else -> error("Du kannst dieses Portal nicht benutzen!") + } + } + } else { + player.sendText { + appendSuccessPrefix() + success("Du hast die Portal-Sperre umgangen.") + } + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + fun onPlayerTeleport(event: EntityTeleportAsyncEvent) { + val player = event.entity as? Player ?: return + + if (event.isCancelled) { + return + } + + if (event.cause != PlayerTeleportEvent.TeleportCause.COMMAND && event.cause != PlayerTeleportEvent.TeleportCause.PLUGIN) { + return + } + + lastLocationService.setLatestLocation(player.uniqueId, event.from) + } +} \ No newline at end of file