1 package com.irtimaled.bbor.common;
3 import com.irtimaled.bbor.Logger;
4 import com.irtimaled.bbor.common.events.ChunkLoaded;
5 import com.irtimaled.bbor.common.events.MobSpawnerBroken;
6 import com.irtimaled.bbor.common.events.WorldLoaded;
7 import com.irtimaled.bbor.common.models.BoundingBox;
8 import com.irtimaled.bbor.common.models.BoundingBoxMobSpawner;
9 import com.irtimaled.bbor.config.ConfigManager;
10 import net.minecraft.util.math.BlockPos;
11 import net.minecraft.world.World;
12 import net.minecraft.world.chunk.Chunk;
13 import net.minecraft.world.chunk.IChunkProvider;
14 import net.minecraft.world.dimension.DimensionType;
15 import net.minecraft.world.gen.ChunkProviderServer;
17 import java.util.HashSet;
20 public class CommonProxy {
21 protected DimensionCache dimensionCache;
22 protected Set<VillageProcessor> villageProcessors = new HashSet<>();
25 dimensionCache = new DimensionCache();
26 registerEventHandlers();
29 protected void registerEventHandlers() {
30 EventBus.subscribe(WorldLoaded.class, e -> worldLoaded(e.getWorld()));
31 EventBus.subscribe(ChunkLoaded.class, e -> chunkLoaded(e.getChunk()));
32 EventBus.subscribe(MobSpawnerBroken.class, e -> mobSpawnerBroken(e.getDimensionType(), e.getPos()));
35 private void worldLoaded(World world) {
36 IChunkProvider chunkProvider = world.getChunkProvider();
37 if (chunkProvider instanceof ChunkProviderServer) {
38 dimensionCache.setWorldData(world.getSeed(), world.getWorldInfo().getSpawnX(), world.getWorldInfo().getSpawnZ());
39 DimensionType dimensionType = world.dimension.getType();
40 Logger.info("create world dimension: %s, %s (seed: %d)", dimensionType, world.getClass().toString(), world.getSeed());
41 DimensionProcessor boundingBoxCache = new DimensionProcessor(dimensionType);
42 dimensionCache.put(dimensionType, boundingBoxCache);
43 if (ConfigManager.drawVillages.getBoolean()) {
44 villageProcessors.add(new VillageProcessor(world, boundingBoxCache));
49 private void chunkLoaded(Chunk chunk) {
50 DimensionType dimensionType = chunk.getWorld().dimension.getType();
51 BoundingBoxCache cache = dimensionCache.get(dimensionType);
52 if (cache instanceof DimensionProcessor) {
53 ((DimensionProcessor) cache).processChunk(chunk);
57 protected void tick() {
58 villageProcessors.forEach(VillageProcessor::process);
61 private void mobSpawnerBroken(DimensionType dimensionType, BlockPos pos) {
62 BoundingBox boundingBox = BoundingBoxMobSpawner.from(pos);
63 BoundingBoxCache cache = dimensionCache.getBoundingBoxes(dimensionType);
65 cache.removeBoundingBox(boundingBox);