package com.irtimaled.bbor.common.messages;
-import com.irtimaled.bbor.common.models.BoundingBox;
-import com.irtimaled.bbor.common.models.BoundingBoxMobSpawner;
-import com.irtimaled.bbor.common.models.BoundingBoxStructure;
-import com.irtimaled.bbor.common.models.BoundingBoxVillage;
-import net.minecraft.network.PacketBuffer;
-import net.minecraft.util.math.BlockPos;
+import com.irtimaled.bbor.common.models.AbstractBoundingBox;
+import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
-import java.awt.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.BiConsumer;
class BoundingBoxSerializer {
- static void serialize(BoundingBox boundingBox, PacketBuffer buf) {
- if (boundingBox instanceof BoundingBoxVillage) {
- serializeVillage((BoundingBoxVillage) boundingBox, buf);
- }
- if (boundingBox instanceof BoundingBoxStructure) {
- serializeStructure((BoundingBoxStructure) boundingBox, buf);
- }
- if (boundingBox instanceof BoundingBoxMobSpawner) {
- serializeMobSpawner((BoundingBoxMobSpawner) boundingBox, buf);
- }
- }
-
- private static void serializeVillage(BoundingBoxVillage boundingBox, PacketBuffer buf) {
- buf.writeChar('V');
- serializeBlockPos(boundingBox.getCenter(), buf);
- buf.writeVarInt(boundingBox.getRadius());
- buf.writeBoolean(boundingBox.getSpawnsIronGolems());
- serializeColor(boundingBox.getColor(), buf);
- for (BlockPos door : boundingBox.getDoors()) {
- serializeBlockPos(door, buf);
- }
- }
+ private static final Map<Class, BiConsumer<AbstractBoundingBox, PayloadBuilder>> serializers = new HashMap<>();
- private static void serializeStructure(BoundingBoxStructure boundingBox, PacketBuffer buf) {
- buf.writeChar('S');
- buf.writeInt(boundingBox.getTypeName().hashCode());
- serializeCuboid(boundingBox, buf);
+ static {
+ serializers.put(BoundingBoxCuboid.class, (bb, pb) -> serializeStructure((BoundingBoxCuboid)bb, pb));
}
- private static void serializeMobSpawner(BoundingBoxMobSpawner boundingBox, PacketBuffer buf) {
- buf.writeChar('M');
- serializeBlockPos(boundingBox.getCenter(), buf);
+ static boolean canSerialize(AbstractBoundingBox key) {
+ return serializers.containsKey(key.getClass());
}
- private static void serializeColor(Color color, PacketBuffer buf) {
- buf.writeVarInt(color.getRGB());
- }
+ static void serialize(AbstractBoundingBox boundingBox, PayloadBuilder builder) {
+ BiConsumer<AbstractBoundingBox, PayloadBuilder> serializer = serializers.get(boundingBox.getClass());
+ if (serializer == null) return;
- private static void serializeCuboid(BoundingBox boundingBox, PacketBuffer buf) {
- serializeBlockPos(boundingBox.getMinBlockPos(), buf);
- serializeBlockPos(boundingBox.getMaxBlockPos(), buf);
+ serializer.accept(boundingBox, builder);
}
- private static void serializeBlockPos(BlockPos blockPos, PacketBuffer buf) {
- buf.writeVarInt(blockPos.getX());
- buf.writeVarInt(blockPos.getY());
- buf.writeVarInt(blockPos.getZ());
+ private static void serializeStructure(BoundingBoxCuboid boundingBox, PayloadBuilder builder) {
+ builder.writeChar('S')
+ .writeInt(boundingBox.getType().hashCode())
+ .writeCoords(boundingBox.getMinCoords())
+ .writeCoords(boundingBox.getMaxCoords());
}
}