registerProvider(new BeaconProvider());
registerProvider(new CustomBoxProvider());
registerProvider(new BiomeBorderProvider());
+ registerProvider(new MobSpawnerProvider());
}
public static <T extends AbstractBoundingBox> void registerProvider(IBoundingBoxProvider<T> provider) {
--- /dev/null
+package com.irtimaled.bbor.client.providers;
+
+import com.irtimaled.bbor.client.interop.TileEntitiesHelper;
+import com.irtimaled.bbor.common.models.BoundingBoxMobSpawner;
+import com.irtimaled.bbor.common.models.Coords;
+import net.minecraft.tileentity.TileEntityMobSpawner;
+
+public class MobSpawnerProvider implements IBoundingBoxProvider<BoundingBoxMobSpawner> {
+ public Iterable<BoundingBoxMobSpawner> get(int dimensionId) {
+ return TileEntitiesHelper.map(TileEntityMobSpawner.class, spawner -> {
+ Coords coords = new Coords(spawner.getPos());
+ return BoundingBoxMobSpawner.from(coords);
+ });
+ }
+}
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
-import com.irtimaled.bbor.common.models.BoundingBoxMobSpawner;
import com.irtimaled.bbor.common.models.Coords;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.tileentity.TileEntityMobSpawner;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.gen.feature.structure.StructurePiece;
import net.minecraft.world.gen.feature.structure.StructureStart;
-import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
return BoundingBoxCuboid.from(min, max, type);
}
- private void addMobSpawners(Chunk chunk) {
- Collection<TileEntity> tileEntities = chunk.getTileEntityMap().values();
- for (TileEntity tileEntity : tileEntities) {
- TileEntityMobSpawner spawner = TypeHelper.as(tileEntity, TileEntityMobSpawner.class);
- if (spawner != null) {
- Coords coords = new Coords(spawner.getPos());
- boundingBoxCache.addBoundingBox(BoundingBoxMobSpawner.from(coords));
- }
- }
- }
-
void process(Chunk chunk) {
Map<String, StructureStart> structureMap = chunk.getStructureStarts();
if (structureMap.size() > 0) {
supportedStructures.forEach(type -> addStructures(type, structureMap));
}
- addMobSpawners(chunk);
}
}
import com.irtimaled.bbor.common.messages.PayloadBuilder;
import com.irtimaled.bbor.common.messages.RemoveBoundingBox;
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
-import com.irtimaled.bbor.common.models.BoundingBoxMobSpawner;
import com.irtimaled.bbor.common.models.ServerPlayer;
import java.util.HashMap;
public void init() {
EventBus.subscribe(WorldLoaded.class, this::worldLoaded);
EventBus.subscribe(ChunkLoaded.class, this::chunkLoaded);
- EventBus.subscribe(MobSpawnerBroken.class, this::mobSpawnerBroken);
EventBus.subscribe(PlayerLoggedIn.class, this::playerLoggedIn);
EventBus.subscribe(PlayerLoggedOut.class, this::playerLoggedOut);
EventBus.subscribe(PlayerSubscribed.class, this::onPlayerSubscribed);
cache.removeBoundingBox(key);
}
- private void mobSpawnerBroken(MobSpawnerBroken event) {
- int dimensionId = event.getDimensionId();
- AbstractBoundingBox boundingBox = BoundingBoxMobSpawner.from(event.getPos());
- removeBoundingBox(dimensionId, boundingBox);
- sendRemoveBoundingBox(dimensionId, boundingBox);
- }
-
private void serverTick() {
for (Map.Entry<Integer, ServerPlayer> playerEntry : players.entrySet()) {
int playerId = playerEntry.getKey();
+++ /dev/null
-package com.irtimaled.bbor.common.events;
-
-import com.irtimaled.bbor.common.models.Coords;
-
-public class MobSpawnerBroken {
- private final int dimensionId;
- private final Coords pos;
-
- public MobSpawnerBroken(int dimensionId, Coords pos) {
- this.dimensionId = dimensionId;
- this.pos = pos;
- }
-
- public int getDimensionId() {
- return dimensionId;
- }
-
- public Coords getPos() {
- return pos;
- }
-}
import com.irtimaled.bbor.common.EventBus;
import com.irtimaled.bbor.common.events.*;
-import com.irtimaled.bbor.common.models.Coords;
import com.irtimaled.bbor.common.models.ServerPlayer;
import com.irtimaled.bbor.config.ConfigManager;
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockMobSpawner;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.NetHandlerPlayServer;
import net.minecraft.network.NetworkManager;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraft.world.chunk.Chunk;
public static void playerSubscribed(EntityPlayerMP player) {
EventBus.publish(new PlayerSubscribed(player.getEntityId(), new ServerPlayer(player)));
}
-
- public static void tryHarvestBlock(Block block, BlockPos pos, World world) {
- if (block instanceof BlockMobSpawner) {
- EventBus.publish(new MobSpawnerBroken(world.dimension.getType().getId(), new Coords(pos)));
- }
- }
}
package com.irtimaled.bbor.common.messages;
import com.irtimaled.bbor.common.BoundingBoxType;
-import com.irtimaled.bbor.common.models.*;
+import com.irtimaled.bbor.common.models.AbstractBoundingBox;
+import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
+import com.irtimaled.bbor.common.models.BoundingBoxVillage;
+import com.irtimaled.bbor.common.models.Coords;
import java.awt.*;
import java.util.HashSet;
return deserializeVillage(reader);
case 'S':
return deserializeStructure(reader);
- case 'M':
- return deserializeMobSpawner(reader);
}
return null;
}
}
return BoundingBoxVillage.from(center, radius, color, spawnsIronGolems, doors);
}
-
- private static AbstractBoundingBox deserializeMobSpawner(PayloadReader reader) {
- return BoundingBoxMobSpawner.from(reader.readCoords());
- }
}
package com.irtimaled.bbor.common.messages;
-import com.irtimaled.bbor.common.models.*;
+import com.irtimaled.bbor.common.models.AbstractBoundingBox;
+import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
+import com.irtimaled.bbor.common.models.BoundingBoxVillage;
+import com.irtimaled.bbor.common.models.Coords;
import java.util.HashMap;
import java.util.Map;
static {
serializers.put(BoundingBoxVillage.class, (bb, pb) -> serializeVillage((BoundingBoxVillage) bb, pb));
serializers.put(BoundingBoxCuboid.class, (bb, pb) -> serializeStructure((BoundingBoxCuboid)bb, pb));
- serializers.put(BoundingBoxMobSpawner.class, (bb, pb) -> serializeMobSpawner((BoundingBoxMobSpawner) bb, pb));
}
static boolean canSerialize(AbstractBoundingBox key) {
.writeCoords(boundingBox.getMinCoords())
.writeCoords(boundingBox.getMaxCoords());
}
-
- private static void serializeMobSpawner(BoundingBoxMobSpawner boundingBox, PayloadBuilder builder) {
- builder.writeChar('M')
- .writeCoords(boundingBox.getCoords());
- }
}
+++ /dev/null
-package com.irtimaled.bbor.mixin.server.management;
-
-import com.irtimaled.bbor.common.interop.CommonInterop;
-import net.minecraft.block.Block;
-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();
- CommonInterop.tryHarvestBlock(block, pos, world);
- }
-}
"mixins": [
"network.play.client.MixinCPacketCustomPayload",
"server.MixinMinecraftServer",
- "server.management.MixinPlayerInteractionManager",
"server.management.MixinPlayerList",
"world.MixinWorldServer",
"world.chunk.MixinChunk"