157 lines
7.6 KiB
Java
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);
|
|
}
|
|
}
|