package nl.kallestruik.riseofblocks.handlers; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.scores.Team; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.level.BlockEvent; import nl.kallestruik.riseofblocks.RiseOfBlocks; import nl.kallestruik.riseofblocks.blockentities.FlagBlockEntity; import nl.kallestruik.riseofblocks.commands.FlagCommand; import nl.kallestruik.riseofblocks.registry.FlagRegistry; import nl.kallestruik.riseofblocks.registry.ItemRegistry; @EventBusSubscriber(modid = RiseOfBlocks.MODID) public class FlagEventHandler { @SubscribeEvent public static void onRegisterCommands(RegisterCommandsEvent event) { FlagCommand.registerCommands(event.getDispatcher(), event.getBuildContext(), event.getCommandSelection()); } @SubscribeEvent public static void onPlayerRespawn(PlayerEvent.Clone event) { if (!event.isWasDeath()) return; // Only handle actual death-respawns ServerPlayer player = (ServerPlayer) event.getEntity(); ServerLevel world = player.serverLevel(); MinecraftServer server = world.getServer(); // Get player's team Team team = player.getScoreboard().getPlayersTeam(player.getScoreboardName()); if (team == null) return; // Get position from registry FlagRegistry.FlagPosition flagPos = FlagRegistry.get(server).get(team.getName()); if (flagPos == null || flagPos.getPos() == null) return; BlockPos pos = flagPos.getPos(); ResourceKey dimensionKey = ResourceKey.create(Registries.DIMENSION, flagPos.getDimension()); ServerLevel dimension = server.getLevel(dimensionKey); if (dimension == null) return; // Teleport after short delay (avoid spawn conflict) server.execute(() -> { player.teleportTo(dimension, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.getYRot(), player.getXRot()); }); } @SubscribeEvent public static void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer serverPlayer) { // Don't ever play end credits, this fixes not teleporting to the flag the first time serverPlayer.seenCredits = true; } } @SubscribeEvent public static void onPlayerChangedDimension(PlayerEvent.PlayerChangedDimensionEvent event) { System.out.println("from: " + event.getFrom() + ", to: " + event.getTo()); if (event.getFrom() != Level.END || event.getTo() != Level.OVERWORLD) { return; } ServerPlayer player = (ServerPlayer) event.getEntity(); ServerLevel world = player.serverLevel(); MinecraftServer server = world.getServer(); // Get player's team Team team = player.getScoreboard().getPlayersTeam(player.getScoreboardName()); if (team == null) return; // Get position from registry FlagRegistry.FlagPosition flagPos = FlagRegistry.get(server).get(team.getName()); if (flagPos == null || flagPos.getPos() == null) return; BlockPos pos = flagPos.getPos(); ResourceKey dimensionKey = ResourceKey.create(Registries.DIMENSION, flagPos.getDimension()); ServerLevel dimension = server.getLevel(dimensionKey); if (dimension == null) return; // Teleport after short delay (avoid spawn conflict) server.execute(() -> { player.teleportTo(dimension, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, player.getYRot(), player.getXRot()); }); } @SubscribeEvent public static void onBlockPlace(BlockEvent.EntityPlaceEvent event) { if (!(event.getLevel() instanceof ServerLevel world)) return; if (event.getEntity() instanceof Player player) { BlockPos pos = event.getPos(); world.getServer().tell(new TickTask(1, () -> { BlockEntity be = world.getBlockEntity(pos); if (be instanceof FlagBlockEntity flagBe) { Team team = player.getScoreboard().getPlayersTeam(player.getScoreboardName()); if (team != null) { FlagRegistry flagRegistry = FlagRegistry.get(world.getServer()); FlagRegistry.FlagPosition oldFlagPos = flagRegistry.get(team.getName()); if (oldFlagPos != null) { // Break the old flag if it exists world.destroyBlock(oldFlagPos.getPos(), false, player); } flagBe.setTeamName(team.getName()); FlagRegistry.FlagPosition flagPos = new FlagRegistry.FlagPosition(pos, world.dimension().location()); flagRegistry.put(team.getName(), flagPos); } } })); } } @SubscribeEvent public static void onBlockBreak(BlockEvent.BreakEvent event) { if (!(event.getLevel() instanceof ServerLevel world)) return; BlockPos pos = event.getPos(); BlockEntity be = world.getBlockEntity(pos); if (!(be instanceof FlagBlockEntity flagBe)) return; Player player = event.getPlayer(); Team playerTeam = player.getTeam(); Team flagTeam = world.getServer().getScoreboard().getPlayerTeam(flagBe.getTeamName()); if (flagTeam == null) return; Component flagTeamComponent = Component.literal(flagBe.getTeamName()).withStyle(flagTeam.getColor()); if (playerTeam == null) { world.getServer().sendSystemMessage(Component.literal("Flag for team ").append(flagTeamComponent).append(" was destroyed by an unassigned player!")); world.getServer().sendSystemMessage(Component.literal("Player: ").append(player.getName())); return; } if (flagTeam.equals(playerTeam)) { world.getServer().sendSystemMessage(Component.literal("Flag for team ").append(flagTeamComponent).append(" was destroyed by a member of the team!")); world.getServer().sendSystemMessage(Component.literal("Player: ").append(player.getName())); // Spawn the flag item in the world if it was broken by the same team. ItemStack stack = new ItemStack(ItemRegistry.FLAG.get()); ItemEntity itemEntity = new ItemEntity(world, pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, stack); world.addFreshEntity(itemEntity); return; } Component playerTeamComponent = Component.literal(playerTeam.getName()).withStyle(playerTeam.getColor()); world.getServer().getPlayerList().broadcastSystemMessage(Component.empty().append(Component.literal("[Rise of Blocks] ").withStyle(ChatFormatting.GOLD)).append("Flag for team ").append(flagTeamComponent).append(" has been broken by ").append(player.getName().copy().withStyle(playerTeam.getColor())).append(" from team ").append(playerTeamComponent).append("!"), false); } }