From 6be5f00f53e4b2964aa50406942d44966cd07905 Mon Sep 17 00:00:00 2001 From: filoghost Date: Sun, 25 Jul 2021 19:02:48 +0200 Subject: [PATCH] Improve NMS implementation --- .../nms/v1_17_R1/DataWatcherEntry.java | 26 ------ .../nms/v1_17_R1/DataWatcherKey.java | 10 +-- .../nms/v1_17_R1/EntityMetadataNMSPacket.java | 67 +++++++++++++-- .../nms/v1_17_R1/PacketByteBuffer.java | 15 ++-- .../nms/v1_17_R1/VersionNMSManager.java | 2 +- .../nms/v1_17_R1/VersionNMSPacketList.java | 84 ++++++++----------- 6 files changed, 107 insertions(+), 97 deletions(-) delete mode 100644 nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherEntry.java diff --git a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherEntry.java b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherEntry.java deleted file mode 100644 index f023848c..00000000 --- a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherEntry.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) filoghost and contributors - * - * SPDX-License-Identifier: GPL-3.0-or-later - */ -package me.filoghost.holographicdisplays.nms.v1_17_R1; - -class DataWatcherEntry { - - private final DataWatcherKey key; - private final T value; - - DataWatcherEntry(DataWatcherKey key, T value) { - this.key = key; - this.value = value; - } - - DataWatcherKey getKey() { - return key; - } - - T getValue() { - return value; - } - -} diff --git a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherKey.java b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherKey.java index be0f809a..76c3fc13 100644 --- a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherKey.java +++ b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/DataWatcherKey.java @@ -26,12 +26,12 @@ class DataWatcherKey { static DataWatcherKey ITEM_STACK = new DataWatcherKey<>(8, ITEM_STACK_SERIALIZER); static DataWatcherKey ARMOR_STAND_STATUS = new DataWatcherKey<>(15, BYTE_SERIALIZER); - private final int keyIndex; + private final int index; private final DataWatcherSerializer serializer; private final int serializerTypeID; - private DataWatcherKey(int keyIndex, DataWatcherSerializer serializer) { - this.keyIndex = keyIndex; + private DataWatcherKey(int index, DataWatcherSerializer serializer) { + this.index = index; this.serializer = serializer; this.serializerTypeID = DataWatcherRegistry.b(serializer); if (serializerTypeID < 0) { @@ -39,8 +39,8 @@ class DataWatcherKey { } } - int getKeyIndex() { - return keyIndex; + int getIndex() { + return index; } DataWatcherSerializer getSerializer() { diff --git a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/EntityMetadataNMSPacket.java b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/EntityMetadataNMSPacket.java index 2d882984..3102626d 100644 --- a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/EntityMetadataNMSPacket.java +++ b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/EntityMetadataNMSPacket.java @@ -5,20 +5,22 @@ */ package me.filoghost.holographicdisplays.nms.v1_17_R1; +import me.filoghost.fcommons.Strings; import me.filoghost.holographicdisplays.common.nms.EntityID; +import net.minecraft.network.chat.IChatBaseComponent; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage; +import org.bukkit.inventory.ItemStack; + +import java.util.Optional; class EntityMetadataNMSPacket extends VersionNMSPacket { private final Packet rawPacket; - EntityMetadataNMSPacket(EntityID entityID, DataWatcherEntry... dataWatcherEntries) { - PacketByteBuffer packetByteBuffer = PacketByteBuffer.get(); - - packetByteBuffer.writeVarInt(entityID.getNumericID()); - packetByteBuffer.writeDataWatcherEntries(dataWatcherEntries); - + private EntityMetadataNMSPacket(PacketByteBuffer packetByteBuffer) { this.rawPacket = new PacketPlayOutEntityMetadata(packetByteBuffer); } @@ -27,4 +29,57 @@ class EntityMetadataNMSPacket extends VersionNMSPacket { return rawPacket; } + public static Builder builder(EntityID entityID) { + return new Builder(entityID); + } + + + static class Builder { + + private final PacketByteBuffer packetByteBuffer; + + private Builder(EntityID entityID) { + this.packetByteBuffer = PacketByteBuffer.get(); + + packetByteBuffer.writeVarInt(entityID.getNumericID()); + } + + Builder setInvisible() { + packetByteBuffer.writeDataWatcherEntry(DataWatcherKey.ENTITY_STATUS, (byte) 0x20); // Invisible + return this; + } + + Builder setMarkerArmorStand() { + setInvisible(); + packetByteBuffer.writeDataWatcherEntry(DataWatcherKey.ARMOR_STAND_STATUS, (byte) (0x01 | 0x08 | 0x10)); // Small, no base plate, marker + return this; + } + + Builder setCustomName(String customName) { + packetByteBuffer.writeDataWatcherEntry(DataWatcherKey.CUSTOM_NAME, getCustomNameDataWatcherValue(customName)); + packetByteBuffer.writeDataWatcherEntry(DataWatcherKey.CUSTOM_NAME_VISIBILITY, !Strings.isEmpty(customName)); + return this; + } + + private Optional getCustomNameDataWatcherValue(String customName) { + customName = Strings.truncate(customName, 300); + if (!Strings.isEmpty(customName)) { + return Optional.of(CraftChatMessage.fromString(customName, false, true)[0]); + } else { + return Optional.empty(); + } + } + + Builder setItemStack(ItemStack itemStack) { + packetByteBuffer.writeDataWatcherEntry(DataWatcherKey.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack)); + return this; + } + + EntityMetadataNMSPacket build() { + packetByteBuffer.writeDataWatcherEntriesEnd(); + return new EntityMetadataNMSPacket(packetByteBuffer); + } + + } + } diff --git a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/PacketByteBuffer.java b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/PacketByteBuffer.java index ff15aad4..902f0f73 100644 --- a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/PacketByteBuffer.java +++ b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/PacketByteBuffer.java @@ -37,17 +37,14 @@ class PacketByteBuffer extends PacketDataSerializer { super.a(array); } - void writeDataWatcherEntries(DataWatcherEntry... dataWatcherEntries) { - for (DataWatcherEntry dataWatcherItem : dataWatcherEntries) { - writeDataWatcherEntry(dataWatcherItem); - } - writeByte(255); // End of data watcher entries + void writeDataWatcherEntry(DataWatcherKey key, T value) { + writeByte(key.getIndex()); + writeVarInt(key.getSerializerTypeID()); + key.getSerializer().a(this, value); } - private void writeDataWatcherEntry(DataWatcherEntry dataWatcherItem) { - writeByte(dataWatcherItem.getKey().getKeyIndex()); - writeVarInt(dataWatcherItem.getKey().getSerializerTypeID()); - dataWatcherItem.getKey().getSerializer().a(this, dataWatcherItem.getValue()); + void writeDataWatcherEntriesEnd() { + writeByte(255); } } diff --git a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSManager.java b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSManager.java index fad79eb5..0f162599 100644 --- a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSManager.java +++ b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSManager.java @@ -26,7 +26,7 @@ public class VersionNMSManager implements NMSManager { this.entityIDGenerator = getEntityIDGenerator(errorCollector); // Force initialization of class to eventually throw exceptions early - DataWatcherKey.ENTITY_STATUS.getKeyIndex(); + DataWatcherKey.ENTITY_STATUS.getIndex(); } private Supplier getEntityIDGenerator(ErrorCollector errorCollector) { diff --git a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSPacketList.java b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSPacketList.java index 8ecc7fa5..cb281882 100644 --- a/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSPacketList.java +++ b/nms/v1_17_r1/src/main/java/me/filoghost/holographicdisplays/nms/v1_17_R1/VersionNMSPacketList.java @@ -5,106 +5,90 @@ */ package me.filoghost.holographicdisplays.nms.v1_17_R1; -import me.filoghost.fcommons.Strings; import me.filoghost.fcommons.logging.Log; import me.filoghost.holographicdisplays.common.nms.AbstractNMSPacketList; import me.filoghost.holographicdisplays.common.nms.EntityID; import me.filoghost.holographicdisplays.common.nms.IndividualCustomName; import me.filoghost.holographicdisplays.common.nms.IndividualNMSPacket; -import net.minecraft.network.chat.IChatBaseComponent; import net.minecraft.network.protocol.game.PacketPlayOutEntityDestroy; import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.ints.IntList; -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_17_R1.util.CraftChatMessage; import org.bukkit.inventory.ItemStack; import java.lang.reflect.Field; -import java.util.Optional; class VersionNMSPacketList extends AbstractNMSPacketList { - private static final DataWatcherEntry ENTITY_STATUS_INVISIBLE = new DataWatcherEntry<>(DataWatcherKey.ENTITY_STATUS, (byte) 0x20); - private static final DataWatcherEntry CUSTOM_NAME_VISIBLE = new DataWatcherEntry<>(DataWatcherKey.CUSTOM_NAME_VISIBILITY, true); - private static final DataWatcherEntry CUSTOM_NAME_INVISIBLE = new DataWatcherEntry<>(DataWatcherKey.CUSTOM_NAME_VISIBILITY, false); - private static final DataWatcherEntry ARMOR_STAND_STATUS_MARKER = new DataWatcherEntry<>(DataWatcherKey.ARMOR_STAND_STATUS, (byte) (0x01 | 0x08 | 0x10)); // Small, no base plate, marker - private static final boolean USE_ENTITY_LIST_DESTROY_PACKET = useEntityListDestroyPacket(); @Override public void addArmorStandSpawnPackets(EntityID entityID, double locationX, double locationY, double locationZ) { add(new EntityLivingSpawnNMSPacket(entityID, EntityTypeID.ARMOR_STAND, locationX, locationY, locationZ)); - add(new EntityMetadataNMSPacket(entityID, - ENTITY_STATUS_INVISIBLE, - ARMOR_STAND_STATUS_MARKER - )); + add(EntityMetadataNMSPacket.builder(entityID) + .setMarkerArmorStand() + .build() + ); } @Override public void addArmorStandSpawnPackets(EntityID entityID, double locationX, double locationY, double locationZ, String customName) { add(new EntityLivingSpawnNMSPacket(entityID, EntityTypeID.ARMOR_STAND, locationX, locationY, locationZ)); - add(createFullArmorStandMetadataPacket(entityID, customName)); + add(EntityMetadataNMSPacket.builder(entityID) + .setMarkerArmorStand() + .setCustomName(customName) + .build() + ); } @Override public void addArmorStandSpawnPackets(EntityID entityID, double locationX, double locationY, double locationZ, IndividualCustomName individualCustomName) { add(new EntityLivingSpawnNMSPacket(entityID, EntityTypeID.ARMOR_STAND, locationX, locationY, locationZ)); - add(new IndividualNMSPacket(player -> createFullArmorStandMetadataPacket(entityID, individualCustomName.get(player)))); - } - - private EntityMetadataNMSPacket createFullArmorStandMetadataPacket(EntityID entityID, String customName) { - return new EntityMetadataNMSPacket(entityID, - ENTITY_STATUS_INVISIBLE, - new DataWatcherEntry<>(DataWatcherKey.CUSTOM_NAME, getCustomNameDataWatcherValue(customName)), - Strings.isEmpty(customName) ? CUSTOM_NAME_INVISIBLE : CUSTOM_NAME_VISIBLE, - ARMOR_STAND_STATUS_MARKER - ); + add(new IndividualNMSPacket(player -> EntityMetadataNMSPacket.builder(entityID) + .setMarkerArmorStand() + .setCustomName(individualCustomName.get(player)) + .build() + )); } @Override public void addArmorStandNameChangePackets(EntityID entityID, String customName) { - add(createPartialArmorStandMetadataPacket(entityID, customName)); + add(EntityMetadataNMSPacket.builder(entityID) + .setCustomName(customName) + .build() + ); } @Override public void addArmorStandNameChangePackets(EntityID entityID, IndividualCustomName individualCustomName) { - add(new IndividualNMSPacket(player -> createPartialArmorStandMetadataPacket(entityID, individualCustomName.get(player)))); - } - - private EntityMetadataNMSPacket createPartialArmorStandMetadataPacket(EntityID entityID, String customName) { - return new EntityMetadataNMSPacket(entityID, - new DataWatcherEntry<>(DataWatcherKey.CUSTOM_NAME, getCustomNameDataWatcherValue(customName)), - Strings.isEmpty(customName) ? CUSTOM_NAME_INVISIBLE : CUSTOM_NAME_VISIBLE - ); - } - - private Optional getCustomNameDataWatcherValue(String customName) { - customName = Strings.truncate(customName, 300); - if (!Strings.isEmpty(customName)) { - return Optional.of(CraftChatMessage.fromString(customName, false, true)[0]); - } else { - return Optional.empty(); - } + add(new IndividualNMSPacket(player -> EntityMetadataNMSPacket.builder(entityID) + .setCustomName(individualCustomName.get(player)) + .build() + )); } @Override public void addItemSpawnPackets(EntityID entityID, double locationX, double locationY, double locationZ, ItemStack itemStack) { add(new EntitySpawnNMSPacket(entityID, EntityTypeID.ITEM, locationX, locationY, locationZ)); - add(new EntityMetadataNMSPacket(entityID, - new DataWatcherEntry<>(DataWatcherKey.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack)) - )); + add(EntityMetadataNMSPacket.builder(entityID) + .setItemStack(itemStack) + .build() + ); } @Override public void addItemStackChangePackets(EntityID entityID, ItemStack itemStack) { - add(new EntityMetadataNMSPacket(entityID, - new DataWatcherEntry<>(DataWatcherKey.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack)) - )); + add(EntityMetadataNMSPacket.builder(entityID) + .setItemStack(itemStack) + .build() + ); } @Override public void addSlimeSpawnPackets(EntityID entityID, double locationX, double locationY, double locationZ) { add(new EntityLivingSpawnNMSPacket(entityID, EntityTypeID.SLIME, locationX, locationY, locationZ)); - add(new EntityMetadataNMSPacket(entityID, ENTITY_STATUS_INVISIBLE)); + add(EntityMetadataNMSPacket.builder(entityID) + .setInvisible() + .build() + ); } @Override