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;
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) {
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);
+ }
+ }
}
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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));
+ }
+ }
+}
"refmap": "mixins.bbor.refmap.json",
"mixins": [
"world.chunk.MixinChunk",
+ "server.management.MixinPlayerInteractionManager",
"server.MixinMinecraftServer"
],
"client": [