]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/common/CommonProxy.java
Handle destruction of mob spawners
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / common / CommonProxy.java
1 package com.irtimaled.bbor.common;
2
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;
16
17 import java.util.HashSet;
18 import java.util.Set;
19
20 public class CommonProxy {
21     protected DimensionCache dimensionCache;
22     protected Set<VillageProcessor> villageProcessors = new HashSet<>();
23
24     public void init() {
25         dimensionCache = new DimensionCache();
26         registerEventHandlers();
27     }
28
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()));
33     }
34
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));
45             }
46         }
47     }
48
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);
54         }
55     }
56
57     protected void tick() {
58         villageProcessors.forEach(VillageProcessor::process);
59     }
60
61     private void mobSpawnerBroken(DimensionType dimensionType, BlockPos pos) {
62         BoundingBox boundingBox = BoundingBoxMobSpawner.from(pos);
63         BoundingBoxCache cache = dimensionCache.getBoundingBoxes(dimensionType);
64         if (cache != null) {
65             cache.removeBoundingBox(boundingBox);
66         }
67     }
68 }