From fc004bc09e53d1fa13d0f498b2e173f951aab0ed Mon Sep 17 00:00:00 2001 From: Hare Date: Thu, 9 Apr 2026 23:01:43 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=91=E3=83=BC=E3=83=9F=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=81=AE=E9=80=80=E5=87=BA=E6=99=82=E4=BF=9D?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/net/hareworks/on_join_spawn/App.kt | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/net/hareworks/on_join_spawn/App.kt b/src/main/kotlin/net/hareworks/on_join_spawn/App.kt index d43595c..846ee88 100644 --- a/src/main/kotlin/net/hareworks/on_join_spawn/App.kt +++ b/src/main/kotlin/net/hareworks/on_join_spawn/App.kt @@ -1,13 +1,20 @@ package net.hareworks.on_join_spawn +import io.papermc.paper.event.player.AsyncPlayerSpawnLocationEvent import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener -import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.plugin.java.JavaPlugin +import java.io.File +import java.util.UUID class App : JavaPlugin(), Listener { + private lateinit var ignoredDir: File + override fun onEnable() { + ignoredDir = File(dataFolder, "ignored") + ignoredDir.mkdirs() server.pluginManager.registerEvents(this, this) logger.info("on-join-spawn plugin enabled") } @@ -16,32 +23,36 @@ class App : JavaPlugin(), Listener { logger.info("on-join-spawn plugin disabled") } - @EventHandler(priority = EventPriority.HIGHEST) - fun onPlayerJoin(event: PlayerJoinEvent) { + @EventHandler + fun onPlayerQuit(event: PlayerQuitEvent) { val player = event.player - - // Check if player has ignore permission + val file = File(ignoredDir, "${player.uniqueId}") if (player.hasPermission("onjoinspawn.ignore")) { - return + file.createNewFile() + } else { + file.delete() } + } + + @EventHandler(priority = EventPriority.HIGHEST) + fun onPlayerSpawnLocation(event: AsyncPlayerSpawnLocationEvent) { + val uuid = event.connection.profile.id ?: return + if (isIgnored(uuid)) return + + val spawnLocation = event.spawnLocation.world.spawnLocation.clone() - // Get the world's spawn location - val spawnLocation = player.world.spawnLocation.clone() - - // Add 0.5 to X and Z coordinates if they are whole numbers - // This centers the player on the block val x = spawnLocation.x val z = spawnLocation.z - + if (x == x.toInt().toDouble()) { spawnLocation.x = x + 0.5 } if (z == z.toInt().toDouble()) { spawnLocation.z = z + 0.5 } - - // Teleport player to spawn immediately - // This happens before the player is fully loaded into the world - player.teleportAsync(spawnLocation) + + event.spawnLocation = spawnLocation } + + private fun isIgnored(uuid: UUID): Boolean = File(ignoredDir, "$uuid").exists() }