package net.Chipperfluff.chipi.server; import net.Chipperfluff.chipi.SpawnPlacedState; import net.Chipperfluff.chipi.armor.ProtectionAuraHandler; import net.Chipperfluff.chipi.block.ChipperPortalBlock; import net.Chipperfluff.chipi.world.gen.ChipiDungeonGenerator; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.structure.StructurePlacementData; import net.minecraft.structure.StructureTemplate; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.world.GameRules; import net.minecraft.world.World; public final class ChipiServerEvents { public static final RegistryKey CHIPI_DIMENSION_KEY = RegistryKey.of(RegistryKeys.WORLD, new Identifier("chipi", "chipi_dimension")); private static final Identifier SPAWN_STRUCTURE = new Identifier("chipi", "spawn"); private static MinecraftServer SERVER; private ChipiServerEvents() {} public static void register() { ServerLifecycleEvents.SERVER_STARTED.register(server -> SERVER = server); ServerTickEvents.END_SERVER_TICK.register(ChipiServerEvents::tickPlayers); ServerTickEvents.END_WORLD_TICK.register(ChipiServerEvents::handleVoidFailsafe); ServerWorldEvents.LOAD.register(ChipiServerEvents::onWorldLoad); } private static void tickPlayers(MinecraftServer server) { for (ServerPlayerEntity player : server.getPlayerManager().getPlayerList()) { ProtectionAuraHandler.tick(player); } } private static void handleVoidFailsafe(ServerWorld world) { if (!world.getRegistryKey().equals(CHIPI_DIMENSION_KEY)) return; for (PlayerEntity player : world.getPlayers()) { if (player.getBlockY() < 50) { ChipperPortalBlock.teleportToChipiSpawn(world, player); } } } private static void onWorldLoad(MinecraftServer server, ServerWorld world) { if (!world.getRegistryKey().equals(CHIPI_DIMENSION_KEY)) return; world.setTimeOfDay(18000); world.getGameRules().get(GameRules.DO_DAYLIGHT_CYCLE).set(false, server); SpawnPlacedState state = world.getPersistentStateManager().getOrCreate( SpawnPlacedState::fromNbt, SpawnPlacedState::new, "chipi_spawn" ); if (state.placed) return; StructureTemplate template = world.getStructureTemplateManager().getTemplate(SPAWN_STRUCTURE).orElse(null); if (template == null) return; BlockPos spawn = new BlockPos(0, 80, 0); template.place(world, spawn, spawn, new StructurePlacementData(), world.getRandom(), 2); world.setSpawnPos(spawn.up(), 0f); ChipiDungeonGenerator.generateInitialLayout(world, spawn); state.placed = true; state.markDirty(); } public static ServerWorld getChipiWorld() { return SERVER == null ? null : SERVER.getWorld(CHIPI_DIMENSION_KEY); } }