rise-of-blocks-mod/src/main/java/nl/kallestruik/riseofblocks/handlers/FlagEventHandler.java
Kalle Struik 9049d1b306
Some checks failed
Build / build (push) Has been cancelled
Colored flags, flags command, end portal tp fix
2025-07-21 17:09:22 +02:00

157 lines
7.6 KiB
Java

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<Level> 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<Level> 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);
}
}