Handle color in area effect cloud

This commit is contained in:
Nassim Jahnke 2024-04-08 14:21:11 +02:00
parent 9f1ee27afc
commit d04aaeb926
No known key found for this signature in database
GPG Key ID: EF6771C01F6EF02F
3 changed files with 59 additions and 4 deletions

View File

@ -73,6 +73,18 @@ public final class Particle implements IdHolder {
arguments.add(index, new ParticleData<>(type, value));
}
public <T> void set(final int index, final Type<T> type, final T value) {
arguments.set(index, new ParticleData<>(type, value));
}
@Override
public String toString() {
return "Particle{" +
"arguments=" + arguments +
", id=" + id +
'}';
}
public static final class ParticleData<T> {
private final Type<T> type;
private T value;

View File

@ -26,6 +26,7 @@ import com.viaversion.viaversion.api.minecraft.Particle;
import com.viaversion.viaversion.api.minecraft.RegistryEntry;
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes1_20_5;
import com.viaversion.viaversion.api.minecraft.metadata.Metadata;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.type.Type;
@ -285,6 +286,30 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
});
filter().type(EntityTypes1_20_5.LLAMA).removeIndex(20); // Carpet color
filter().type(EntityTypes1_20_5.AREA_EFFECT_CLOUD).handler((event, meta) -> {
// Color removed - Now put into the actual particle
final int metaIndex = event.index();
if (metaIndex == 9) {
// If the color is found first
final Metadata particleData = event.metaAtIndex(11);
addColor(particleData, meta.value());
event.cancel();
return;
}
if (metaIndex > 9) {
event.setIndex(metaIndex - 1);
}
if (metaIndex == 11) {
// If the particle is found first
final Metadata colorData = event.metaAtIndex(9);
if (colorData != null) {
addColor(meta, colorData.value());
}
}
});
filter().type(EntityTypes1_20_5.MINECART_ABSTRACT).index(11).handler((event, meta) -> {
final int blockState = meta.value();
@ -292,11 +317,22 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
});
}
private void addColor(@Nullable final Metadata particleMeta, final int color) {
if (particleMeta == null) {
return;
}
final Particle particle = particleMeta.value();
if (particle.id() == protocol.getMappingData().getParticleMappings().mappedId("entity_effect")) {
particle.getArgument(0).setValue(color);
}
}
@Override
public void rewriteParticle(final Particle particle) {
super.rewriteParticle(particle);
if (particle.id() == protocol.getMappingData().getParticleMappings().mappedId("entity_effect")) {
particle.add(Type.INT, 0); // rgb // TODO
particle.add(Type.INT, 0); // Default color, changed in the area effect handler
}
}

View File

@ -40,6 +40,7 @@ import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType;
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
import com.viaversion.viaversion.api.rewriter.ItemRewriter;
import com.viaversion.viaversion.api.rewriter.RewriterBase;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.data.entity.DimensionDataImpl;
@ -586,14 +587,20 @@ public abstract class EntityRewriter<C extends ClientboundPacketType, T extends
public void rewriteParticle(Particle particle) {
ParticleMappings mappings = protocol.getMappingData().getParticleMappings();
int id = particle.getId();
int id = particle.id();
if (mappings.isBlockParticle(id)) {
Particle.ParticleData<Integer> data = particle.getArgument(0);
data.setValue(protocol.getMappingData().getNewBlockStateId(data.getValue()));
} else if (mappings.isItemParticle(id) && protocol.getItemRewriter() != null) {
Particle.ParticleData<Item> data = particle.getArgument(0);
Item item = data.getValue();
protocol.getItemRewriter().handleItemToClient(item);
ItemRewriter<?> itemRewriter = protocol.getItemRewriter();
Item item = itemRewriter.handleItemToClient(data.getValue());
if (itemRewriter.mappedItemType() != null && itemRewriter.itemType() != itemRewriter.mappedItemType()) {
// Replace the type
particle.set(0, itemRewriter.mappedItemType(), item);
} else {
data.setValue(item);
}
}
particle.setId(protocol.getMappingData().getNewParticleId(id));