diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java index e17bc4008..9680a9a68 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/Type.java @@ -85,7 +85,7 @@ public abstract class Type implements ByteBufReader, ByteBufWriter { @Deprecated public static final Type INT_ARRAY = new ArrayType<>(Type.INT); - public static final Type DOUBLE = new DoubleType(); + public static final DoubleType DOUBLE = new DoubleType(); /** * @deprecated unreasonable overhead */ diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java index 72389c14c..40a3e9ecd 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/DoubleType.java @@ -5,20 +5,37 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.TypeConverter; public class DoubleType extends Type implements TypeConverter { + public DoubleType() { super(Double.class); } + /** + * @deprecated use {@link #readPrimitive(ByteBuf)} for manual reading to avoid wrapping + */ @Override + @Deprecated public Double read(ByteBuf buffer) { return buffer.readDouble(); } + public double readPrimitive(ByteBuf buffer) { + return buffer.readDouble(); + } + + /** + * @deprecated use {@link #writePrimitive(ByteBuf, double)} for manual reading to avoid wrapping + */ @Override + @Deprecated public void write(ByteBuf buffer, Double object) { buffer.writeDouble(object); } + public void writePrimitive(ByteBuf buffer, double object) { + buffer.writeDouble(object); + } + @Override public Double from(Object o) { if (o instanceof Number) { diff --git a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/Particle1_17Type.java b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/Particle1_17Type.java index 8593ecce6..e7cf47a16 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/Particle1_17Type.java +++ b/common/src/main/java/us/myles/ViaVersion/api/type/types/minecraft/Particle1_17Type.java @@ -31,15 +31,15 @@ public class Particle1_17Type extends Type { break; case 14: // Dust case 15: // Dust transition - particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.readPrimitive(buffer))); // Red 0 - 1 - particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.readPrimitive(buffer))); // Green 0 - 1 - particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.readPrimitive(buffer))); // Blue 0 - 1 + particle.getArguments().add(new Particle.ParticleData(Type.DOUBLE, Type.DOUBLE.readPrimitive(buffer))); // Red 0 - 1 + particle.getArguments().add(new Particle.ParticleData(Type.DOUBLE, Type.DOUBLE.readPrimitive(buffer))); // Green 0 - 1 + particle.getArguments().add(new Particle.ParticleData(Type.DOUBLE, Type.DOUBLE.readPrimitive(buffer))); // Blue 0 - 1 particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.readPrimitive(buffer))); // Scale 0.01 - 4 if (type == 15) { // Transition to color - particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.readPrimitive(buffer))); // Red - particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.readPrimitive(buffer))); // Green - particle.getArguments().add(new Particle.ParticleData(Type.FLOAT, Type.FLOAT.readPrimitive(buffer))); // Blue + particle.getArguments().add(new Particle.ParticleData(Type.DOUBLE, Type.DOUBLE.readPrimitive(buffer))); // Red + particle.getArguments().add(new Particle.ParticleData(Type.DOUBLE, Type.DOUBLE.readPrimitive(buffer))); // Green + particle.getArguments().add(new Particle.ParticleData(Type.DOUBLE, Type.DOUBLE.readPrimitive(buffer))); // Blue } break; case 33: // Item @@ -51,7 +51,7 @@ public class Particle1_17Type extends Type { if (resourceLocation.equals("block")) { particle.getArguments().add(new Particle.ParticleData(Type.POSITION1_14, Type.POSITION1_14.read(buffer))); // Target block pos } else if (resourceLocation.equals("entity")) { - particle.getArguments().add(new Particle.ParticleData(Type.VAR_INT, Type.VAR_INT.read(buffer))); // Target entity + particle.getArguments().add(new Particle.ParticleData(Type.VAR_INT, Type.VAR_INT.readPrimitive(buffer))); // Target entity } else { Via.getPlatform().getLogger().warning("Unknown vibration path position source type: " + resourceLocation); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/metadata/MetadataRewriter1_13_1To1_13.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/metadata/MetadataRewriter1_13_1To1_13.java index 41b78d140..d5ad83d3b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/metadata/MetadataRewriter1_13_1To1_13.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13_1to1_13/metadata/MetadataRewriter1_13_1To1_13.java @@ -29,6 +29,8 @@ public class MetadataRewriter1_13_1To1_13 extends MetadataRewriter { // Convert to new block id int data = (int) metadata.getValue(); metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); + } else if (metadata.getMetaType() == MetaType1_13.PARTICLE) { + rewriteParticle((Particle) metadata.getValue()); } if (type == null) return; @@ -39,8 +41,6 @@ public class MetadataRewriter1_13_1To1_13 extends MetadataRewriter { metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); } else if (type.isOrHasParent(Entity1_13Types.EntityType.ABSTRACT_ARROW) && metadata.getId() >= 7) { metadata.setId(metadata.getId() + 1); // New shooter UUID - } else if (type.is(Entity1_13Types.EntityType.AREA_EFFECT_CLOUD) && metadata.getId() == 10) { - rewriteParticle((Particle) metadata.getValue()); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java index fdc261ca7..e0319e6c8 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/metadata/MetadataRewriter1_14To1_13_2.java @@ -39,6 +39,8 @@ public class MetadataRewriter1_14To1_13_2 extends MetadataRewriter { // Convert to new block id int data = (int) metadata.getValue(); metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); + } else if (metadata.getMetaType() == MetaType1_14.PARTICLE) { + rewriteParticle((Particle) metadata.getValue()); } if (type == null) return; @@ -146,10 +148,6 @@ public class MetadataRewriter1_14To1_13_2 extends MetadataRewriter { metadatas.remove(metadata); // "Is swinging arms" metadatas.add(new Metadata(13, MetaType1_14.Byte, tracker.getInsentientData(entityId))); } - } else if (type.is(Entity1_14Types.EntityType.AREA_EFFECT_CLOUD)) { - if (metadata.getId() == 10) { - rewriteParticle((Particle) metadata.getValue()); - } } if (type.isOrHasParent(Entity1_14Types.EntityType.ABSTRACT_ILLAGER_BASE)) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/metadata/MetadataRewriter1_15To1_14_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/metadata/MetadataRewriter1_15To1_14_4.java index 7d3de4683..fe85f5a89 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/metadata/MetadataRewriter1_15To1_14_4.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/metadata/MetadataRewriter1_15To1_14_4.java @@ -5,6 +5,7 @@ import us.myles.ViaVersion.api.entities.Entity1_15Types; import us.myles.ViaVersion.api.entities.EntityType; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_13; import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_14; import us.myles.ViaVersion.api.rewriters.MetadataRewriter; import us.myles.ViaVersion.api.type.types.Particle; @@ -29,6 +30,8 @@ public class MetadataRewriter1_15To1_14_4 extends MetadataRewriter { // Convert to new block id int data = (int) metadata.getValue(); metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); + } else if (metadata.getMetaType() == MetaType1_13.PARTICLE) { + rewriteParticle((Particle) metadata.getValue()); } if (type == null) return; @@ -48,8 +51,6 @@ public class MetadataRewriter1_15To1_14_4 extends MetadataRewriter { } else if (metadata.getId() > 18) { metadata.setId(metadata.getId() - 1); } - } else if (type == Entity1_15Types.EntityType.AREA_EFFECT_CLOUD && metadata.getId() == 10) { - rewriteParticle((Particle) metadata.getValue()); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/metadata/MetadataRewriter1_16_2To1_16_1.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/metadata/MetadataRewriter1_16_2To1_16_1.java index 13d3700c5..298fc5e68 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/metadata/MetadataRewriter1_16_2To1_16_1.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16_2to1_16_1/metadata/MetadataRewriter1_16_2To1_16_1.java @@ -29,6 +29,8 @@ public class MetadataRewriter1_16_2To1_16_1 extends MetadataRewriter { } else if (metadata.getMetaType() == MetaType1_14.BlockID) { int data = (int) metadata.getValue(); metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); + } else if (metadata.getMetaType() == MetaType1_14.PARTICLE) { + rewriteParticle((Particle) metadata.getValue()); } if (type == null) return; @@ -39,10 +41,6 @@ public class MetadataRewriter1_16_2To1_16_1 extends MetadataRewriter { } else if (metadata.getId() == 16) { metadata.setId(15); } - } else if (type.is(Entity1_16_2Types.EntityType.AREA_EFFECT_CLOUD)) { - if (metadata.getId() == 10) { - rewriteParticle((Particle) metadata.getValue()); - } } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/metadata/MetadataRewriter1_16To1_15_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/metadata/MetadataRewriter1_16To1_15_2.java index c3a174699..ccbcc8420 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/metadata/MetadataRewriter1_16To1_15_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_16to1_15_2/metadata/MetadataRewriter1_16To1_15_2.java @@ -30,15 +30,13 @@ public class MetadataRewriter1_16To1_15_2 extends MetadataRewriter { } else if (metadata.getMetaType() == MetaType1_14.BlockID) { int data = (int) metadata.getValue(); metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); + } else if (metadata.getMetaType() == MetaType1_14.PARTICLE) { + rewriteParticle((Particle) metadata.getValue()); } if (type == null) return; - if (type == Entity1_16Types.EntityType.AREA_EFFECT_CLOUD) { - if (metadata.getId() == 10) { - rewriteParticle((Particle) metadata.getValue()); - } - } else if (type.isOrHasParent(Entity1_16Types.EntityType.ABSTRACT_ARROW)) { + if (type.isOrHasParent(Entity1_16Types.EntityType.ABSTRACT_ARROW)) { if (metadata.getId() == 8) { metadatas.remove(metadata); } else if (metadata.getId() > 8) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/metadata/MetadataRewriter1_17To1_16_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/metadata/MetadataRewriter1_17To1_16_4.java index 9fe967a5b..f78bbd213 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/metadata/MetadataRewriter1_17To1_16_4.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/metadata/MetadataRewriter1_17To1_16_4.java @@ -5,8 +5,10 @@ import us.myles.ViaVersion.api.entities.Entity1_16_2Types; import us.myles.ViaVersion.api.entities.EntityType; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; -import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_14; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_17; import us.myles.ViaVersion.api.rewriters.MetadataRewriter; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.Particle; import us.myles.ViaVersion.protocols.protocol1_17to1_16_4.Protocol1_17To1_16_4; import us.myles.ViaVersion.protocols.protocol1_17to1_16_4.packets.InventoryPackets; import us.myles.ViaVersion.protocols.protocol1_17to1_16_4.storage.EntityTracker1_17; @@ -21,11 +23,23 @@ public class MetadataRewriter1_17To1_16_4 extends MetadataRewriter { @Override public void handleMetadata(int entityId, EntityType type, Metadata metadata, List metadatas, UserConnection connection) throws Exception { - if (metadata.getMetaType() == MetaType1_14.Slot) { + metadata.setMetaType(MetaType1_17.byId(metadata.getMetaType().getTypeID())); + if (metadata.getMetaType() == MetaType1_17.Slot) { InventoryPackets.toClient((Item) metadata.getValue()); - } else if (metadata.getMetaType() == MetaType1_14.BlockID) { + } else if (metadata.getMetaType() == MetaType1_17.BlockID) { int data = (int) metadata.getValue(); metadata.setValue(protocol.getMappingData().getNewBlockStateId(data)); + } else if (metadata.getMetaType() == MetaType1_17.PARTICLE) { + Particle particle = (Particle) metadata.getValue(); + if (particle.getId() == 14) { + // RGB is now encoded as doubles + for (int i = 0; i < 3; i++) { + Particle.ParticleData data = particle.getArguments().get(i); + data.setValue(((Number) data.getValue()).doubleValue()); + data.setType(Type.DOUBLE); + } + } + rewriteParticle(particle); } if (type == null) return; diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/packets/InventoryPackets.java index 6ae6bf7ce..eace47286 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_17to1_16_4/packets/InventoryPackets.java @@ -33,7 +33,32 @@ public class InventoryPackets { } }); - itemRewriter.registerSpawnParticle(ClientboundPackets1_16_2.SPAWN_PARTICLE, Type.FLAT_VAR_INT_ITEM, Type.DOUBLE); + protocol.registerOutgoing(ClientboundPackets1_16_2.SPAWN_PARTICLE, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.INT); // Particle id + map(Type.BOOLEAN); // Long distance + map(Type.DOUBLE); // X + map(Type.DOUBLE); // Y + map(Type.DOUBLE); // Z + map(Type.FLOAT); // Offset X + map(Type.FLOAT); // Offset Y + map(Type.FLOAT); // Offset Z + map(Type.FLOAT); // Particle data + map(Type.INT); // Particle count + handler(wrapper -> { + int id = wrapper.get(Type.INT, 0); + if (id == 14) { // Dust + // RGB now written as doubles + wrapper.write(Type.DOUBLE, wrapper.read(Type.FLOAT).doubleValue()); // R + wrapper.write(Type.DOUBLE, wrapper.read(Type.FLOAT).doubleValue()); // G + wrapper.write(Type.DOUBLE, wrapper.read(Type.FLOAT).doubleValue()); // B + wrapper.passthrough(Type.FLOAT); // Scale + } + }); + handler(itemRewriter.getSpawnParticleHandler(Type.FLAT_VAR_INT_ITEM, Type.DOUBLE)); + } + }); } public static void toClient(Item item) {