From e5a62ed9529eb65f9f783d8458bc4bb87e69bc36 Mon Sep 17 00:00:00 2001
From: Pyrbu <pyrmcserver@gmail.com>
Date: Mon, 26 Jun 2023 17:50:32 +0200
Subject: [PATCH] split name metadata to avoid creating unnecessary lists

---
 .../znpcsplus/metadata/MetadataFactory.java   |  5 ++---
 .../metadata/V1_13MetadataFactory.java        |  8 ++------
 .../metadata/V1_8MetadataFactory.java         | 20 +++++++------------
 .../metadata/V1_9MetadataFactory.java         | 14 ++++++-------
 .../znpcsplus/packets/V1_8PacketFactory.java  |  9 ++++-----
 5 files changed, 22 insertions(+), 34 deletions(-)

diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java
index af709a2..588ebd2 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/MetadataFactory.java
@@ -4,8 +4,6 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityData;
 import com.github.retrooper.packetevents.protocol.entity.pose.EntityPose;
 import net.kyori.adventure.text.Component;
 
-import java.util.Collection;
-
 /**
  * 1.8  <a href="https://wiki.vg/index.php?title=Entity_metadata&oldid=7415">...</a>
  * 1.9  <a href="https://wiki.vg/index.php?title=Entity_metadata&oldid=7968">...</a>
@@ -23,7 +21,8 @@ public interface MetadataFactory {
     EntityData skinLayers(boolean cape, boolean jacket, boolean leftSleeve, boolean rightSleeve, boolean leftLeg, boolean rightLeg, boolean hat);
     EntityData effects(boolean onFire, boolean glowing, boolean invisible, boolean usingElytra);
     EntityData silent(boolean enabled);
-    Collection<EntityData> name(Component name);
+    EntityData name(Component name);
+    EntityData nameShown();
     EntityData noGravity();
     EntityData pose(EntityPose pose);
     EntityData shaking(boolean enabled);
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_13MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_13MetadataFactory.java
index 9b9ae39..10606f0 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_13MetadataFactory.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_13MetadataFactory.java
@@ -5,16 +5,12 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
 import net.kyori.adventure.text.Component;
 
-import java.util.Collection;
 import java.util.Optional;
 
 public class V1_13MetadataFactory extends V1_11MetadataFactory {
     @Override
-    public Collection<EntityData> name(Component name) {
-        return list(
-                newEntityData(2, EntityDataTypes.OPTIONAL_COMPONENT, Optional.of(AdventureSerializer.getGsonSerializer().serialize(name))),
-                newEntityData(3, EntityDataTypes.BOOLEAN, true)
-        );
+    public EntityData name(Component name) {
+        return newEntityData(2, EntityDataTypes.OPTIONAL_COMPONENT, Optional.of(AdventureSerializer.getGsonSerializer().serialize(name)));
     }
 
     @Override
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java
index 1d0b7c8..9a433a5 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_8MetadataFactory.java
@@ -8,7 +8,6 @@ import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
 import net.kyori.adventure.text.Component;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 public class V1_8MetadataFactory implements MetadataFactory {
@@ -23,11 +22,13 @@ public class V1_8MetadataFactory implements MetadataFactory {
     }
 
     @Override
-    public Collection<EntityData> name(Component name) {
-        return list(
-                newEntityData(2, EntityDataTypes.STRING, AdventureSerializer.getLegacyGsonSerializer().serialize(name)),
-                newEntityData(3, EntityDataTypes.BYTE, (byte) 1)
-        );
+    public EntityData name(Component name) {
+        return newEntityData(2, EntityDataTypes.STRING, AdventureSerializer.getLegacyGsonSerializer().serialize(name));
+    }
+
+    @Override
+    public EntityData nameShown() {
+        return newEntityData(3, EntityDataTypes.BYTE, (byte) 1);
     }
 
     @Override
@@ -80,11 +81,4 @@ public class V1_8MetadataFactory implements MetadataFactory {
     protected <T> EntityData newEntityData(int index, EntityDataType<T> type, T value) {
         return new EntityData(index, type, value);
     }
-
-    @SafeVarargs
-    protected final <T> List<T> list(T... items) {
-        ArrayList<T> list = new ArrayList<>(items.length);
-        for (int i = 0; i < items.length; i++) list.add(i, items[i]);
-        return list;
-    }
 }
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java
index ad4d3c7..5ea2213 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/metadata/V1_9MetadataFactory.java
@@ -5,8 +5,6 @@ import com.github.retrooper.packetevents.protocol.entity.data.EntityDataTypes;
 import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
 import net.kyori.adventure.text.Component;
 
-import java.util.Collection;
-
 public class V1_9MetadataFactory extends V1_8MetadataFactory {
     @Override
     public EntityData skinLayers(boolean cape, boolean jacket, boolean leftSleeve, boolean rightSleeve, boolean leftLeg, boolean rightLeg, boolean hat) {
@@ -24,11 +22,13 @@ public class V1_9MetadataFactory extends V1_8MetadataFactory {
     }
 
     @Override
-    public Collection<EntityData> name(Component name) {
-        return list(
-                newEntityData(2, EntityDataTypes.STRING, AdventureSerializer.getGsonSerializer().serialize(name)),
-                newEntityData(3, EntityDataTypes.BOOLEAN, true)
-        );
+    public EntityData name(Component name) {
+        return newEntityData(2, EntityDataTypes.STRING, AdventureSerializer.getGsonSerializer().serialize(name));
+    }
+
+    @Override
+    public EntityData nameShown() {
+        return newEntityData(3, EntityDataTypes.BOOLEAN, true);
     }
 
     @Override
diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java
index 4aaa6eb..883a969 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java
@@ -145,7 +145,10 @@ public class V1_8PacketFactory implements PacketFactory {
         add(data, metadataFactory.usingItem(properties.getProperty(propertyRegistry.getByName("using_item", Boolean.class)), false, false));
         add(data, metadataFactory.potionColor(properties.getProperty(propertyRegistry.getByName("potion_color", Color.class)).asRGB()));
         add(data, metadataFactory.potionAmbient(properties.getProperty(propertyRegistry.getByName("potion_ambient", Boolean.class))));
-        if (properties.hasProperty(propertyRegistry.getByName("name"))) addAll(data, metadataFactory.name(PapiUtil.set(player, properties.getProperty(propertyRegistry.getByName("name", Component.class)))));
+        if (properties.hasProperty(propertyRegistry.getByName("name"))) {
+            add(data, metadataFactory.name(PapiUtil.set(player, properties.getProperty(propertyRegistry.getByName("name", Component.class)))));
+            add(data, metadataFactory.nameShown());
+        }
         return data;
     }
 
@@ -205,8 +208,4 @@ public class V1_8PacketFactory implements PacketFactory {
     protected void add(Map<Integer, EntityData> map, EntityData data) {
         map.put(data.getIndex(), data);
     }
-
-    protected void addAll(Map<Integer, EntityData> map, Collection<EntityData> data) {
-        for (EntityData d : data) add(map, d);
-    }
 }