From 01f1723b71bdfe1a52c59b1f3dc88f8636714dca Mon Sep 17 00:00:00 2001
From: Pyrbu <pyrmcserver@gmail.com>
Date: Fri, 16 Jun 2023 12:33:52 +0200
Subject: [PATCH] lay out most of the possible properties

---
 .../entity/EntityPropertyRegistryImpl.java    | 161 +++++++++++++++++-
 1 file changed, 155 insertions(+), 6 deletions(-)

diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
index 780825c..92ac7bf 100644
--- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
+++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
@@ -31,6 +31,21 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
         registerType("name", Component.class);
         registerType("look", false);
 
+        registerType("helmet", ItemStack.class);
+        registerType("chestplate", ItemStack.class);
+        registerType("leggings", ItemStack.class);
+        registerType("boots", ItemStack.class);
+        registerType("hand", ItemStack.class);
+        registerType("offhand", ItemStack.class);
+
+        registerType("crouched", false); // TODO
+        registerType("using_item", false); // TODO: Eating/Drinking/Blocking with sword/etc
+        registerType("potion_color", 0xFFFFFF); // TODO
+        registerType("potion_ambient", false); // TODO
+        registerType("shaking", false); // TODO: Set the "ticks frozen in powdered snow" meta to 140 to get the entity to shake
+        registerType("baby", false); // TODO
+
+        // Player
         registerType("skin_cape", true);
         registerType("skin_jacket", true);
         registerType("skin_left_sleeve", true);
@@ -39,12 +54,145 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
         registerType("skin_right_leg", true);
         registerType("skin_hat", true);
 
-        registerType("helmet", ItemStack.class);
-        registerType("chestplate", ItemStack.class);
-        registerType("leggings", ItemStack.class);
-        registerType("boots", ItemStack.class);
-        registerType("hand", ItemStack.class);
-        registerType("offhand", ItemStack.class);
+        // End Crystal
+        registerType("beam_target", null); // TODO: Make a block pos class for this
+        registerType("show_base", true); // TODO
+
+        // Armor Stand
+        registerType("small", false); // TODO
+        registerType("arms", false); // TODO
+        registerType("base_plate", true); // TODO
+
+        // TODO: Make a vector3f class for all of these
+        registerType("head_rotation", null); // TODO
+        registerType("body_rotation", null); // TODO
+        registerType("left_arm_rotation", null); // TODO
+        registerType("right_arm_rotation", null); // TODO
+        registerType("left_leg_rotation", null); // TODO
+        registerType("right_leg_rotation", null); // TODO
+
+        // Bat
+        registerType("hanging", false); // TODO
+
+        // Pufferfish
+        registerType("puff_state", null); // TODO: Make a puff state enum class
+
+        // Tropical Fish
+        registerType("tropical_fish_variant", null); // TODO: Maybe make an enum class for this? its just an int on wiki.vg
+
+        // Sniffer
+        registerType("sniffer_state", null); // TODO: Nothing on wiki.vg, look in mc source
+
+        // Horse
+        registerType("horse_style", 0); // TODO: Figure this out
+        registerType("horse_chest", false); // TODO
+        registerType("horse_saddle", false); // TODO
+
+        // LLama
+        registerType("carpet_color", -1); // TODO
+        registerType("llama_variant", 0); // TODO
+
+        // Axolotl
+        registerType("axolotl_variant", 0); // TODO
+        registerType("playing_dead", false); // TODO
+
+        // Bee
+        registerType("angry", false); // TODO
+        registerType("has_nectar", false); // TODO
+
+        // Fox
+        registerType("fox_variant", 0); // TODO: 0 = red, 1 = snow
+        registerType("fox_sitting", false); // TODO
+        registerType("fox_crouching", false); // TODO
+        registerType("fox_sleeping", false); // TODO
+        registerType("fox_faceplanting", false); // TODO
+
+        // Frog
+        registerType("frog_type", null); // TODO: It has a custom type read on wiki.vg
+
+        // Panda
+        registerType("panda_sneezing", false); // TODO
+        registerType("panda_rolling", false); // TODO
+        registerType("panda_sitting", false); // TODO
+        registerType("panda_on_back", false); // TODO
+
+        // Pig
+        registerType("pig_saddle", false); // TODO
+
+        // Rabbit
+        registerType("rabbit_type", 0); // TODO: Figure this out
+
+        // Polar Bear
+        registerType("polar_bear_standing", false); // TODO
+
+        // Sheep
+        registerType("sheep_color", 0); // TODO: Figure this out
+        registerType("sheep_sheared", false); // TODO
+
+        // Strider
+        registerType("strider_shaking", false); // TODO
+        registerType("strider_saddle", false); // TODO
+
+        // Cat
+        registerType("cat_variant", null); // TODO: Custom type
+        registerType("cat_laying", false); // TODO
+        registerType("cat_collar_color", 14); // TODO
+
+        // Wolf
+        registerType("wolf_collar_color", 14); // TODO
+        registerType("wolf_angry", false); // TODO
+
+        // Parrot
+        registerType("parrot_variant", 0); // TODO
+
+        // Villager
+        registerType("villager_ethnicity", 1); // TODO: how tf does this work? probably need to look in mc src
+        registerType("villager_job", null); // TODO
+
+        // Show Golem
+        registerType("pumpkin", true); // TODO
+
+        // Shulker
+        registerType("attach_direction", null); // TODO: make a direction enum
+        registerType("shield_height", 0); // TODO: figure this out
+        registerType("shulker_color", 10); // TODO
+
+        // Piglin / Hoglin
+        registerType("immune_to_zombification", false); // TODO
+
+        // Piglin
+        registerType("piglin_dancing", false); // TODO
+        registerType("piglin_charging_crossbow", false); // TODO
+
+        // Blaze
+        registerType("blaze_is_on_fire", false); // TODO
+
+        // Creeper
+        registerType("creeper_state", null); // TODO: -1 = idle, 1 = fuse
+        registerType("creeper_charged", false); // TODO
+
+        // Goat
+        registerType("has_left_horn", true); // TODO
+        registerType("has_right_horn", true); // TODO
+
+        // Vindicator
+        registerType("celebrating", false); // TODO
+
+        // Wither
+        registerType("invulnerable_time", 0); // TODO
+
+        // Enderman
+        registerType("enderman_held_block", null); // TODO: figure out the type on this
+        registerType("enderman_screaming", false); // TODO
+
+        // Ghast
+        registerType("attacking", false); // TODO
+
+        // Phantom
+        registerType("phantom_size", 0); // TODO
+
+        // Slime
+        registerType("slime_size", 0); // TODO
     }
 
     private void registerSerializer(PropertySerializer<?> serializer) {
@@ -60,6 +208,7 @@ public class EntityPropertyRegistryImpl implements EntityPropertyRegistry {
     }
 
     private <T> void registerType(String name, T defaultValue, Class<T> clazz) {
+        if (clazz == null) return;
         EntityPropertyImpl<T> property = new EntityPropertyImpl<>(name, defaultValue, clazz, (PropertySerializer<T>) serializerMap.get(clazz));
         byName.put(name.toLowerCase(), property);
     }