package net.Chipperfluff.chipi; import net.Chipperfluff.chipi.advancement.ModCriteria; import net.Chipperfluff.chipi.block.ChipperPortalBlock; import net.Chipperfluff.chipi.block.ModBlocks; import net.Chipperfluff.chipi.command.ChpCommand; import net.Chipperfluff.chipi.effect.ChipiBlessingEvents; import net.Chipperfluff.chipi.effect.ChipiHungerHandler; import net.Chipperfluff.chipi.effect.ModEffects; import net.Chipperfluff.chipi.entity.ModEntities; import net.Chipperfluff.chipi.entity.custom.MepEntity; import net.Chipperfluff.chipi.item.ModItemGroups; import net.Chipperfluff.chipi.item.ModItems; import net.Chipperfluff.chipi.world.gen.ChipiDungeonGenerator; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; 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.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; 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.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; import net.minecraft.world.gen.GenerationStep; public class ChipiMod implements ModInitializer { public static final String MOD_ID = "chipi"; 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; @Override public void onInitialize() { ModBlocks.register(); ModItems.register(); ModItemGroups.register(); ModCriteria.register(); ModEntities.register(); ModEffects.register(); ChipiBlessingEvents.register(); ChipiHungerHandler.register(); FabricDefaultAttributeRegistry.register( ModEntities.MEP, MepEntity.createMepAttributes() ); BiomeModifications.addFeature( BiomeSelectors.foundInOverworld(), GenerationStep.Feature.UNDERGROUND_ORES, RegistryKey.of( RegistryKeys.PLACED_FEATURE, new Identifier("chipi", "chipper_ore") ) ); CommandRegistrationCallback.EVENT.register( (dispatcher, registryAccess, environment) -> { ChpCommand.register(dispatcher); } ); ServerLifecycleEvents.SERVER_STARTED.register(server -> { SERVER = server; }); ServerTickEvents.END_WORLD_TICK.register(world -> { if (!world.getRegistryKey().equals(CHIPI_DIMENSION_KEY)) { return; } for (PlayerEntity player : world.getPlayers()) { if (player.getBlockY() >= 50) { continue; } ChipperPortalBlock.teleportToChipiSpawn(world, player); } }); ServerWorldEvents.LOAD.register((server, 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 spawnTemplate = world.getStructureTemplateManager() .getTemplate(SPAWN_STRUCTURE) .orElse(null); if (spawnTemplate == null) { System.err.println("[CHIPI] spawn.nbt not found!"); return; } BlockPos spawnCenter = new BlockPos(0, 80, 0); spawnTemplate.place( world, spawnCenter, spawnCenter, new StructurePlacementData(), world.getRandom(), 2 ); world.setSpawnPos(spawnCenter.up(), 0.0f); ChipiDungeonGenerator.generateInitialLayout(world, spawnCenter); state.placed = true; state.markDirty(); System.out.println("[CHIPI] Spawn + initial dungeon generated"); }); } public static ServerWorld getChipiWorld() { if (SERVER == null) { return null; } return SERVER.getWorld(CHIPI_DIMENSION_KEY); } }