package com.beemer.essentials.event import com.beemer.essentials.config.PlayerConfig import com.beemer.essentials.config.SpawnConfig import com.beemer.essentials.data.Location import com.beemer.essentials.util.ChatUtils import com.beemer.essentials.util.DimensionUtils import net.minecraft.server.level.ServerPlayer import net.neoforged.bus.api.SubscribeEvent import net.neoforged.neoforge.event.entity.player.PlayerEvent object PlayerEvents { @SubscribeEvent fun onPlayerRespawn(event: PlayerEvent.PlayerRespawnEvent) { val player = event.entity as? ServerPlayer ?: return val target = SpawnConfig.getCustomSpawn() ?: SpawnConfig.getDefaultSpawn() ?: return val level = DimensionUtils.getLevelById(player.server, target.dimension) ?: return player.teleportTo(level, target.x, target.y, target.z, player.yRot, player.xRot) } @SubscribeEvent fun onPlayerLoggedIn(event: PlayerEvent.PlayerLoggedInEvent) { val player = event.entity as? ServerPlayer ?: return val existing = PlayerConfig.getPlayer(player) val isFirstJoin = existing == null ChatUtils.broadcastJoin(player, isFirstJoin) PlayerConfig.recordLogin(player) if (isFirstJoin) { val spawn = SpawnConfig.getCustomSpawn() ?: SpawnConfig.getDefaultSpawn() ?: return val level = DimensionUtils.getLevelById(player.server, spawn.dimension) ?: return player.teleportTo(level, spawn.x, spawn.y, spawn.z, player.yRot, player.xRot) } } @SubscribeEvent fun onPlayerLoggedOut(event: PlayerEvent.PlayerLoggedOutEvent) { val player = event.entity as? ServerPlayer ?: return ChatUtils.broadcastQuit(player) PlayerConfig.recordLogout(player) } @SubscribeEvent fun onPlayerClone(event: PlayerEvent.Clone) { if (!event.isWasDeath) return val oldPlayer = event.original as? ServerPlayer ?: return val pos = oldPlayer.blockPosition() val dimension = oldPlayer.level().dimension().location().toString() val biome = oldPlayer.level().getBiome(pos) .unwrapKey() .map { it.location().toString() } .orElse("minecraft:plains") val lastLoc = Location( dimension = dimension, biome = biome, x = pos.x.toDouble(), y = pos.y.toDouble(), z = pos.z.toDouble() ) PlayerConfig.recordLastLocation(oldPlayer, lastLoc) } }