]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/commitdiff
Handle destruction of mob spawners
authorIrtimaled <irtimaled@gmail.com>
Tue, 26 Feb 2019 23:26:08 +0000 (15:26 -0800)
committerIrtimaled <irtimaled@gmail.com>
Tue, 5 Mar 2019 08:09:23 +0000 (00:09 -0800)
src/main/java/com/irtimaled/bbor/common/CommonProxy.java
src/main/java/com/irtimaled/bbor/common/events/MobSpawnerBroken.java [new file with mode: 0644]
src/main/java/com/irtimaled/bbor/mixin/server/management/MixinPlayerInteractionManager.java [new file with mode: 0644]
src/main/resources/mixins.bbor.json

index cd7b3d216f78d77de3925c7294a81bd020ec267d..de9baff5bff457182373aa7570d78bf7e523589e 100644 (file)
@@ -2,8 +2,12 @@ package com.irtimaled.bbor.common;
 
 import com.irtimaled.bbor.Logger;
 import com.irtimaled.bbor.common.events.ChunkLoaded;
+import com.irtimaled.bbor.common.events.MobSpawnerBroken;
 import com.irtimaled.bbor.common.events.WorldLoaded;
+import com.irtimaled.bbor.common.models.BoundingBox;
+import com.irtimaled.bbor.common.models.BoundingBoxMobSpawner;
 import com.irtimaled.bbor.config.ConfigManager;
+import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraft.world.chunk.Chunk;
 import net.minecraft.world.chunk.IChunkProvider;
@@ -25,6 +29,7 @@ public class CommonProxy {
     protected void registerEventHandlers() {
         EventBus.subscribe(WorldLoaded.class, e -> worldLoaded(e.getWorld()));
         EventBus.subscribe(ChunkLoaded.class, e -> chunkLoaded(e.getChunk()));
+        EventBus.subscribe(MobSpawnerBroken.class, e -> mobSpawnerBroken(e.getDimensionType(), e.getPos()));
     }
 
     private void worldLoaded(World world) {
@@ -52,4 +57,12 @@ public class CommonProxy {
     protected void tick() {
         villageProcessors.forEach(VillageProcessor::process);
     }
+
+    private void mobSpawnerBroken(DimensionType dimensionType, BlockPos pos) {
+        BoundingBox boundingBox = BoundingBoxMobSpawner.from(pos);
+        BoundingBoxCache cache = dimensionCache.getBoundingBoxes(dimensionType);
+        if (cache != null) {
+            cache.removeBoundingBox(boundingBox);
+        }
+    }
 }
diff --git a/src/main/java/com/irtimaled/bbor/common/events/MobSpawnerBroken.java b/src/main/java/com/irtimaled/bbor/common/events/MobSpawnerBroken.java
new file mode 100644 (file)
index 0000000..32a5810
--- /dev/null
@@ -0,0 +1,22 @@
+package com.irtimaled.bbor.common.events;
+
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.dimension.DimensionType;
+
+public class MobSpawnerBroken {
+    private final DimensionType dimensionType;
+    private final BlockPos pos;
+
+    public MobSpawnerBroken(DimensionType dimensionType, BlockPos pos) {
+        this.dimensionType = dimensionType;
+        this.pos = pos;
+    }
+
+    public DimensionType getDimensionType() {
+        return dimensionType;
+    }
+
+    public BlockPos getPos() {
+        return pos;
+    }
+}
diff --git a/src/main/java/com/irtimaled/bbor/mixin/server/management/MixinPlayerInteractionManager.java b/src/main/java/com/irtimaled/bbor/mixin/server/management/MixinPlayerInteractionManager.java
new file mode 100644 (file)
index 0000000..c430a1e
--- /dev/null
@@ -0,0 +1,28 @@
+package com.irtimaled.bbor.mixin.server.management;
+
+import com.irtimaled.bbor.common.EventBus;
+import com.irtimaled.bbor.common.events.MobSpawnerBroken;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockMobSpawner;
+import net.minecraft.server.management.PlayerInteractionManager;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+@Mixin(PlayerInteractionManager.class)
+public class MixinPlayerInteractionManager {
+    @Shadow
+    public World world;
+
+    @Inject(method = "tryHarvestBlock", at = @At("HEAD"))
+    private void tryHarvestBlock(BlockPos pos, CallbackInfoReturnable<Boolean> cir) {
+        Block block = this.world.getBlockState(pos).getBlock();
+        if (block instanceof BlockMobSpawner) {
+            EventBus.publish(new MobSpawnerBroken(this.world.dimension.getType(), pos));
+        }
+    }
+}
index 762424fc86fec3722e33c40b742e9366c73915aa..6b2b68ae98257239228e85dee631051275a4b4cb 100644 (file)
@@ -7,6 +7,7 @@
   "refmap": "mixins.bbor.refmap.json",
   "mixins": [
     "world.chunk.MixinChunk",
+    "server.management.MixinPlayerInteractionManager",
     "server.MixinMinecraftServer"
   ],
   "client": [