implement dinnerbone property

This commit is contained in:
Pyrbu 2023-08-07 14:32:27 +02:00
parent fb95965ae6
commit 1dfb5ae541
3 changed files with 44 additions and 9 deletions

@ -232,7 +232,11 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
register(new EquipmentProperty(packetFactory, "hand", EquipmentSlot.MAIN_HAND)); register(new EquipmentProperty(packetFactory, "hand", EquipmentSlot.MAIN_HAND));
register(new EquipmentProperty(packetFactory, "offhand", EquipmentSlot.OFF_HAND)); register(new EquipmentProperty(packetFactory, "offhand", EquipmentSlot.OFF_HAND));
register(new NameProperty()); boolean legacyName = ver.isOlderThan(ServerVersion.V_1_9);
boolean optionalComponent = ver.isNewerThanOrEquals(ServerVersion.V_1_13);
register(new NameProperty(legacyName, optionalComponent));
register(new DinnerboneProperty(legacyName, optionalComponent));
register(new DummyProperty<>("look", false)); register(new DummyProperty<>("look", false));
register(new DummyProperty<>("skin", SkinDescriptor.class, false)); register(new DummyProperty<>("skin", SkinDescriptor.class, false));
@ -253,6 +257,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
register(new SimpleBitsetProperty("arms", armorStandIndex, 0x04)); register(new SimpleBitsetProperty("arms", armorStandIndex, 0x04));
register(new SimpleBitsetProperty("base_plate", armorStandIndex, 0x08, true)); register(new SimpleBitsetProperty("base_plate", armorStandIndex, 0x08, true));
linkProperties("small", "arms", "base_plate"); linkProperties("small", "arms", "base_plate");
} }
private void registerSerializer(PropertySerializer<?> serializer) { private void registerSerializer(PropertySerializer<?> serializer) {

@ -0,0 +1,33 @@
package lol.pyr.znpcsplus.entity.properties;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataType;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
import lol.pyr.znpcsplus.entity.EntityPropertyImpl;
import lol.pyr.znpcsplus.entity.PacketEntity;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
import java.util.Map;
import java.util.Optional;
public class DinnerboneProperty extends EntityPropertyImpl<Boolean> {
private final Object serialized;
private final EntityDataType<?> type;
public DinnerboneProperty(boolean legacy, boolean optional) {
super("dinnerbone", false, Boolean.class);
Component name = Component.text("Dinnerbone");
String serialized = legacy ?
AdventureSerializer.getLegacyGsonSerializer().serialize(name) :
AdventureSerializer.getGsonSerializer().serialize(name);
this.serialized = optional ? Optional.of(serialized) : serialized;
this.type = optional ? EntityDataTypes.OPTIONAL_COMPONENT : EntityDataTypes.STRING;
}
@Override
public void apply(Player player, PacketEntity entity, boolean isSpawned, Map<Integer, EntityData> properties) {
properties.put(2, new EntityData(2, type, entity.getProperty(this) ? serialized : null));
}
}

@ -1,7 +1,5 @@
package lol.pyr.znpcsplus.entity.properties; package lol.pyr.znpcsplus.entity.properties;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes; import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
import com.github.retrooper.packetevents.util.adventure.AdventureSerializer; import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
@ -15,14 +13,13 @@ import java.util.Optional;
public class NameProperty extends EntityPropertyImpl<Component> { public class NameProperty extends EntityPropertyImpl<Component> {
private final boolean legacy; private final boolean legacy;
private final boolean optionalComponent; private final boolean optional;
public NameProperty() { public NameProperty(boolean legacy, boolean optional) {
super("name", null, Component.class); super("name", null, Component.class);
ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion(); this.legacy = legacy;
legacy = version.isOlderThan(ServerVersion.V_1_9); this.optional = optional;
optionalComponent = version.isNewerThanOrEquals(ServerVersion.V_1_13);
} }
@Override @Override
@ -32,7 +29,7 @@ public class NameProperty extends EntityPropertyImpl<Component> {
String serialized = legacy ? String serialized = legacy ?
AdventureSerializer.getLegacyGsonSerializer().serialize(value) : AdventureSerializer.getLegacyGsonSerializer().serialize(value) :
AdventureSerializer.getGsonSerializer().serialize(value); AdventureSerializer.getGsonSerializer().serialize(value);
if (optionalComponent) properties.put(2, newEntityData(2, EntityDataTypes.OPTIONAL_COMPONENT, Optional.of(serialized))); if (optional) properties.put(2, newEntityData(2, EntityDataTypes.OPTIONAL_COMPONENT, Optional.of(serialized)));
else properties.put(2, newEntityData(2, EntityDataTypes.STRING, serialized)); else properties.put(2, newEntityData(2, EntityDataTypes.STRING, serialized));
} }