Dust particle rgb values are now written as doubles

This commit is contained in:
KennyTV 2020-12-09 12:41:26 +01:00
parent 72205a5414
commit 459e3e68b8
No known key found for this signature in database
GPG Key ID: 6BE3B555EBC5982B
10 changed files with 80 additions and 29 deletions

View File

@ -85,7 +85,7 @@ public abstract class Type<T> implements ByteBufReader<T>, ByteBufWriter<T> {
@Deprecated
public static final Type<Integer[]> INT_ARRAY = new ArrayType<>(Type.INT);
public static final Type<Double> DOUBLE = new DoubleType();
public static final DoubleType DOUBLE = new DoubleType();
/**
* @deprecated unreasonable overhead
*/

View File

@ -5,20 +5,37 @@ import us.myles.ViaVersion.api.type.Type;
import us.myles.ViaVersion.api.type.TypeConverter;
public class DoubleType extends Type<Double> implements TypeConverter<Double> {
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) {

View File

@ -31,15 +31,15 @@ public class Particle1_17Type extends Type<Particle> {
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<Particle> {
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);
}

View File

@ -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());
}
}

View File

@ -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)) {

View File

@ -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());
}
}

View File

@ -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());
}
}
}

View File

@ -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) {

View File

@ -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<Metadata> 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;

View File

@ -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) {