From 70f13400d516375407f7ffa33d853bc1402bb081 Mon Sep 17 00:00:00 2001
From: Draylar <samuelhimes@gmail.com>
Date: Fri, 11 Jun 2021 21:03:07 -0500
Subject: [PATCH] 1.17 update

---
 build.gradle                                  | 22 +++---
 gradle.properties                             | 15 ++--
 gradle/wrapper/gradle-wrapper.properties      |  4 +-
 .../java/draylar/identity/IdentityClient.java |  2 +-
 .../ability/AbilityOverlayRenderer.java       | 40 +---------
 .../ability/impl/EndermiteAbility.java        |  2 +-
 .../identity/ability/impl/GhastAbility.java   |  5 +-
 .../ability/impl/SnowGolemAbility.java        |  2 +-
 .../identity/ability/impl/WitchAbility.java   |  2 +-
 .../ability/impl/WitherEntityAbility.java     |  2 +-
 .../identity/api/model/EntityArms.java        | 28 +++----
 .../identity/api/model/EntityUpdaters.java    |  4 +-
 .../identity/cca/AbilityComponent.java        |  6 +-
 .../cca/FavoriteIdentitiesComponent.java      | 16 ++--
 .../identity/cca/HostilityComponent.java      |  6 +-
 .../identity/cca/IdentityComponent.java       | 21 +++--
 .../cca/UnlockedIdentitiesComponent.java      | 19 ++---
 .../identity/mixin/BipedEntityModelMixin.java |  9 +--
 .../identity/mixin/LivingEntityMixin.java     |  4 +-
 .../identity/mixin/PiglinBrainMixin.java      |  5 +-
 .../identity/mixin/PiglinBruteBrainMixin.java |  5 +-
 .../mixin/PlayerAdvancementTrackerMixin.java  |  2 +-
 .../mixin/PlayerEntityRendererMixin.java      | 16 ++--
 .../identity/mixin/PlayerManagerMixin.java    |  2 +-
 .../identity/mixin/RavagerEntityMixin.java    | 12 +--
 .../identity/mixin/ScreenAccessor.java        | 14 ++++
 .../mixin/ServerPlayerEntityMixin.java        |  4 +-
 .../identity/mixin/WitherEntityMixin.java     |  4 +-
 .../draylar/identity/registry/Components.java |  2 +-
 .../identity/screen/IdentityScreen.java       | 34 ++++----
 .../draylar/identity/screen/ScreenUtils.java  | 79 +++++++++----------
 .../identity/screen/widget/EntityWidget.java  | 21 +++--
 .../identity/screen/widget/PlayerWidget.java  | 13 ++-
 src/main/resources/identity.accesswidener     |  8 +-
 src/main/resources/identity.mixins.json       |  9 ++-
 35 files changed, 215 insertions(+), 224 deletions(-)
 create mode 100644 src/main/java/draylar/identity/mixin/ScreenAccessor.java

diff --git a/build.gradle b/build.gradle
index b948ffa..14531d2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,10 +1,10 @@
 plugins {
-    id 'fabric-loom' version '0.5.9'
+    id 'fabric-loom' version '0.8-SNAPSHOT'
     id 'maven-publish'
 }
 
-sourceCompatibility = JavaVersion.VERSION_1_8
-targetCompatibility = JavaVersion.VERSION_1_8
+sourceCompatibility = JavaVersion.VERSION_16
+targetCompatibility = JavaVersion.VERSION_16
 
 archivesBaseName = project.archives_base_name
 version = project.mod_version + "-" + project.minecraft_version
@@ -30,22 +30,23 @@ repositories {
 dependencies {
     minecraft "com.mojang:minecraft:${project.minecraft_version}"
     mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
-    modCompile "net.fabricmc:fabric-loader:${project.loader_version}"
-
-    modCompile "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
+    modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
+    modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
 
+    // Player Ability Lib: https://github.com/Ladysnake/PlayerAbilityLib
     include "io.github.ladysnake:PlayerAbilityLib:${project.pal_version}"
     modImplementation ("io.github.ladysnake:PlayerAbilityLib:${project.pal_version}") {
         exclude group: "net.fabricmc.fabric-api"
     }
 
+    // Cardinal Components: https://github.com/OnyxStudios/Cardinal-Components-API
     modImplementation "io.github.onyxstudios:Cardinal-Components-API:${project.cardinal_version}"
     include "io.github.onyxstudios:Cardinal-Components-API:${project.cardinal_version}"
     include "io.github.onyxstudios.Cardinal-Components-API:cardinal-components-base:${project.cardinal_version}"
     include "io.github.onyxstudios.Cardinal-Components-API:cardinal-components-entity:${project.cardinal_version}"
 
     // prevent log spam
-    modCompile 'com.github.Draylar:angerable-patch:1.0.0'
+    modImplementation 'com.github.Draylar:angerable-patch:1.0.0'
     include 'com.github.Draylar:angerable-patch:1.0.0'
 
     // config
@@ -56,14 +57,9 @@ dependencies {
 processResources {
     inputs.property "version", project.version
 
-    from(sourceSets.main.resources.srcDirs) {
-        include "fabric.mod.json"
+    filesMatching('fabric.mod.json') {
         expand "version": project.version
     }
-
-    from(sourceSets.main.resources.srcDirs) {
-        exclude "fabric.mod.json"
-    }
 }
 
 // ensure that the encoding is set to UTF-8, no matter what the system default is
diff --git a/gradle.properties b/gradle.properties
index 784292e..4086f1d 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -3,18 +3,17 @@ org.gradle.jvmargs=-Xmx1G
 
 # Fabric Properties
 # check these on https://fabricmc.net/use
-minecraft_version=1.16.5
-yarn_mappings=1.16.5+build.4
-loader_version=0.11.1
+minecraft_version=1.17
+yarn_mappings=1.17+build.9
+loader_version=.11.3
 
 # Mod Properties
-mod_version=1.13.2
+mod_version=1.14.0-beta
 maven_group=draylar
 archives_base_name=identity
 
 # Dependencies
 # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
-fabric_version=0.34.1+1.16
-auto_config_version=3.2.2
-cardinal_version=2.8.2
-pal_version=1.2.1
+fabric_version=0.35.0+1.17
+cardinal_version=3.0.0-nightly.1.17-pre2
+pal_version=1.3.0-nightly.1.17-rc1
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 622ab64..573fe49 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
 zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
+zipStorePath=wrapper/dists
\ No newline at end of file
diff --git a/src/main/java/draylar/identity/IdentityClient.java b/src/main/java/draylar/identity/IdentityClient.java
index ae15daa..1254ed8 100644
--- a/src/main/java/draylar/identity/IdentityClient.java
+++ b/src/main/java/draylar/identity/IdentityClient.java
@@ -13,7 +13,7 @@
 import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
 import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.options.KeyBinding;
+import net.minecraft.client.option.KeyBinding;
 import net.minecraft.client.util.InputUtil;
 import net.minecraft.entity.LivingEntity;
 import org.lwjgl.glfw.GLFW;
diff --git a/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java b/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java
index 178af76..d857b6d 100644
--- a/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java
+++ b/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java
@@ -116,8 +116,10 @@ else if (ticksSinceUpdate > fadingProgress) {
                 // TODO: cache ability stack?
 //                MinecraftClient.getInstance().getItemRenderer().renderGuiItemIcon(new ItemStack(identityAbility.getIcon()), (int) (width * .95f), (int) (height * .92f));
                 ItemStack stack = new ItemStack(identityAbility.getIcon());
-                BakedModel heldItemModel = MinecraftClient.getInstance().getItemRenderer().getHeldItemModel(stack, client.world, player);
-                renderGuiItemModel(matrices, stack, (int) (width * .95f), (int) (height * .92f), heldItemModel);
+//                BakedModel heldItemModel = MinecraftClient.getInstance().getItemRenderer().getHeldItemModel(stack, client.world, player);
+//                renderGuiItemModel(matrices, stack, (int) (width * .95f), (int) (height * .92f), heldItemModel);
+                MinecraftClient.getInstance().getItemRenderer()
+                        .renderGuiItemIcon(stack, (int) (width * .95f), (int) (height * .92f));
 
                 RenderSystem.disableScissor();
                 matrices.pop();
@@ -125,40 +127,6 @@ else if (ticksSinceUpdate > fadingProgress) {
         });
     }
 
-    protected static void renderGuiItemModel(MatrixStack matrices, ItemStack stack, int x, int y, BakedModel model) {
-        RenderSystem.pushMatrix();
-
-        MinecraftClient.getInstance().getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE);
-        MinecraftClient.getInstance().getTextureManager().getTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE).setFilter(false, false);
-
-        RenderSystem.enableRescaleNormal();
-        RenderSystem.enableAlphaTest();
-        RenderSystem.defaultAlphaFunc();
-        RenderSystem.enableBlend();
-        RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA);
-        RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
-        RenderSystem.translatef((float) x, (float) y, 100.0F);
-        RenderSystem.translatef(8.0F, 8.0F, 0.0F);
-        RenderSystem.scalef(1.0F, -1.0F, 1.0F);
-        RenderSystem.scalef(16.0F, 16.0F, 16.0F);
-        VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers();
-        boolean bl = !model.isSideLit();
-        if (bl) {
-            DiffuseLighting.disableGuiDepthLighting();
-        }
-
-        MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Mode.GUI, false, matrices, immediate, 15728880, OverlayTexture.DEFAULT_UV, model);
-        immediate.draw();
-        RenderSystem.enableDepthTest();
-        if (bl) {
-            DiffuseLighting.enableGuiDepthLighting();
-        }
-
-        RenderSystem.disableAlphaTest();
-        RenderSystem.disableRescaleNormal();
-        RenderSystem.popMatrix();
-    }
-
     private AbilityOverlayRenderer() {
         // NO-OP
     }
diff --git a/src/main/java/draylar/identity/ability/impl/EndermiteAbility.java b/src/main/java/draylar/identity/ability/impl/EndermiteAbility.java
index 79bbfaa..133791b 100644
--- a/src/main/java/draylar/identity/ability/impl/EndermiteAbility.java
+++ b/src/main/java/draylar/identity/ability/impl/EndermiteAbility.java
@@ -23,7 +23,7 @@ public void onUse(PlayerEntity player, EndermiteEntity identity, World world) {
         for(int i = 0; i < 16; ++i) {
             // Pick a random location nearby to teleport to.
             double g = player.getX() + (player.getRandom().nextDouble() - 0.5D) * 16.0D;
-            double h = MathHelper.clamp(player.getY() + (double)(player.getRandom().nextInt(16) - 8), 0.0D, world.getDimensionHeight() - 1);
+            double h = MathHelper.clamp(player.getY() + (double)(player.getRandom().nextInt(16) - 8), 0.0D, world.getHeight() - 1);
             double j = player.getZ() + (player.getRandom().nextDouble() - 0.5D) * 16.0D;
 
             // Cancel vehicle/riding mechanics.
diff --git a/src/main/java/draylar/identity/ability/impl/GhastAbility.java b/src/main/java/draylar/identity/ability/impl/GhastAbility.java
index e20d64e..e5b7c10 100644
--- a/src/main/java/draylar/identity/ability/impl/GhastAbility.java
+++ b/src/main/java/draylar/identity/ability/impl/GhastAbility.java
@@ -20,10 +20,11 @@ public void onUse(PlayerEntity player, GhastEntity identity, World world) {
                 player,
                 player.getRotationVector().x,
                 player.getRotationVector().y,
-                player.getRotationVector().z
+                player.getRotationVector().z,
+                2
         );
 
-        fireball.refreshPositionAndAngles(fireball.getX(), fireball.getY() + 1.75, fireball.getZ(), fireball.yaw, fireball.pitch);
+        fireball.refreshPositionAndAngles(fireball.getX(), fireball.getY() + 1.75, fireball.getZ(), fireball.getYaw(), fireball.getPitch());
         fireball.updatePosition(fireball.getX(), fireball.getY(), fireball.getZ());
         world.spawnEntity(fireball);
         world.playSoundFromEntity(null, player, SoundEvents.ENTITY_GHAST_SHOOT, SoundCategory.HOSTILE, 10.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F);
diff --git a/src/main/java/draylar/identity/ability/impl/SnowGolemAbility.java b/src/main/java/draylar/identity/ability/impl/SnowGolemAbility.java
index dabdc47..c7a1667 100644
--- a/src/main/java/draylar/identity/ability/impl/SnowGolemAbility.java
+++ b/src/main/java/draylar/identity/ability/impl/SnowGolemAbility.java
@@ -22,7 +22,7 @@ public void onUse(PlayerEntity player, SnowGolemEntity identity, World world) {
             for(int i = 0; i < 10; i++) {
                 SnowballEntity snowballEntity = new SnowballEntity(world, player);
                 snowballEntity.setItem(new ItemStack(Items.SNOWBALL));
-                snowballEntity.setProperties(player, player.pitch + world.random.nextInt(10) - 5, player.yaw + world.random.nextInt(10) - 5, 0.0F, 1.5F, 1.0F);
+                snowballEntity.setProperties(player, player.getPitch() + world.random.nextInt(10) - 5, player.getYaw() + world.random.nextInt(10) - 5, 0.0F, 1.5F, 1.0F);
                 world.spawnEntity(snowballEntity);
             }
         }
diff --git a/src/main/java/draylar/identity/ability/impl/WitchAbility.java b/src/main/java/draylar/identity/ability/impl/WitchAbility.java
index ffc7eb5..2dfe60a 100644
--- a/src/main/java/draylar/identity/ability/impl/WitchAbility.java
+++ b/src/main/java/draylar/identity/ability/impl/WitchAbility.java
@@ -25,7 +25,7 @@ public class WitchAbility extends IdentityAbility<WitchEntity> {
     public void onUse(PlayerEntity player, WitchEntity identity, World world) {
         PotionEntity potionEntity = new PotionEntity(world, player);
         potionEntity.setItem(PotionUtil.setPotion(new ItemStack(Items.SPLASH_POTION), VALID_POTIONS.get(world.random.nextInt(VALID_POTIONS.size()))));
-        potionEntity.pitch -= -20.0F;
+        potionEntity.setPitch(-20.0F);
         Vec3d rotation = player.getRotationVector();
         potionEntity.setVelocity(rotation.getX(), rotation.getY(), rotation.getZ(), 0.75F, 8.0F);
 
diff --git a/src/main/java/draylar/identity/ability/impl/WitherEntityAbility.java b/src/main/java/draylar/identity/ability/impl/WitherEntityAbility.java
index 21a68cd..1c2d807 100644
--- a/src/main/java/draylar/identity/ability/impl/WitherEntityAbility.java
+++ b/src/main/java/draylar/identity/ability/impl/WitherEntityAbility.java
@@ -22,7 +22,7 @@ public void onUse(PlayerEntity player, WitherEntity identity, World world) {
             Vec3d lookDirection = player.getRotationVector();
             WitherSkullEntity skull = new WitherSkullEntity(world, player, lookDirection.x, lookDirection.y, lookDirection.z);
             skull.setPos(player.getX(), player.getY() + 2, player.getZ());
-            skull.setProperties(player, player.pitch, player.yaw, 0.0F, 1.5F, 1.0F);
+            skull.setProperties(player, player.getPitch(), player.getYaw(), 0.0F, 1.5F, 1.0F);
             world.spawnEntity(skull);
         }
     }
diff --git a/src/main/java/draylar/identity/api/model/EntityArms.java b/src/main/java/draylar/identity/api/model/EntityArms.java
index d4d976d..f43a764 100644
--- a/src/main/java/draylar/identity/api/model/EntityArms.java
+++ b/src/main/java/draylar/identity/api/model/EntityArms.java
@@ -3,17 +3,13 @@
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 import net.minecraft.client.model.ModelPart;
-import net.minecraft.client.render.entity.EvokerEntityRenderer;
 import net.minecraft.client.render.entity.model.*;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.client.util.math.Vector3f;
 import net.minecraft.entity.EntityType;
 import net.minecraft.entity.LivingEntity;
-import net.minecraft.entity.mob.PillagerEntity;
 import net.minecraft.util.Pair;
+import net.minecraft.util.math.Vec3f;
 import org.jetbrains.annotations.Nullable;
 
-import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -72,26 +68,26 @@ public static <T extends LivingEntity> EntityArmProvider<T> get(Class<EntityMode
     public static void init() {
         // specific
         register(LlamaEntityModel.class, (llama, model) -> model.rightFrontLeg, (stack, model) -> {});
-        register(PandaEntityModel.class, (llama, model) -> model.frontRightLeg, (stack, model) -> stack.translate(0, -0.5, 0));
+        register(PandaEntityModel.class, (llama, model) -> model.rightFrontLeg, (stack, model) -> stack.translate(0, -0.5, 0));
         register(BlazeEntityModel.class, (llama, model) -> model.rods[10], (stack, model) -> {
-            stack.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(45));
-            stack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-15));
-            stack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-25));
+            stack.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(45));
+            stack.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(-15));
+            stack.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(-25));
             stack.translate(0, 0, -.25);
         });
         register(OcelotEntityModel.class, (ocelot, model) -> model.rightFrontLeg, (stack, model) -> {});
         register(SpiderEntityModel.class, (spider, model) -> model.rightFrontLeg, (stack, model) -> {
-            stack.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(-15));
-            stack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(15));
+            stack.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(-15));
+            stack.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(15));
             stack.translate(0, 0, 0);
         });
         register(IronGolemEntityModel.class, (golem, model) -> model.getRightArm(), (stack, model) -> {
             stack.translate(0, 0, -.5);
         });
-        register(PigEntityModel.class, (pig, model) -> model.frontRightLeg, (stack, model) -> {
+        register(PigEntityModel.class, (pig, model) -> model.rightFrontLeg, (stack, model) -> {
             stack.translate(0, 0, .6);
         });
-        register(PolarBearEntityModel.class, (bear, model) -> model.frontRightLeg, (stack, model) -> {
+        register(PolarBearEntityModel.class, (bear, model) -> model.rightFrontLeg, (stack, model) -> {
             stack.translate(0, 0, .3);
         });
         register(RavagerEntityModel.class, (bear, model) -> model.rightFrontLeg, (stack, model) -> { });
@@ -100,11 +96,11 @@ public static void init() {
         });
 
         // generic
-        register(QuadrupedEntityModel.class, (quad, model) -> model.frontRightLeg, (stack, model) -> {});
+        register(QuadrupedEntityModel.class, (quad, model) -> model.rightFrontLeg, (stack, model) -> {});
 
         // types
-        register(EntityType.PILLAGER, (pillager, model) -> ((IllagerEntityModel) model).rightAttackingArm, (stack, model) -> {
-            stack.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(-10));
+        register(EntityType.PILLAGER, (pillager, model) -> ((IllagerEntityModel) model).rightArm, (stack, model) -> {
+            stack.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(-10));
             stack.translate(0, .5, -.3);
         });
     }
diff --git a/src/main/java/draylar/identity/api/model/EntityUpdaters.java b/src/main/java/draylar/identity/api/model/EntityUpdaters.java
index 86d3b52..4970483 100644
--- a/src/main/java/draylar/identity/api/model/EntityUpdaters.java
+++ b/src/main/java/draylar/identity/api/model/EntityUpdaters.java
@@ -95,7 +95,7 @@ public static void init() {
             // setting yaw without +180 making tail faces front, for some reason
             if (dragon.latestSegment < 0) {
                 for (int l = 0; l < dragon.segmentCircularBuffer.length; ++l) {
-                    dragon.segmentCircularBuffer[l][0] = (double) player.yaw + 180;
+                    dragon.segmentCircularBuffer[l][0] = (double) player.getYaw() + 180;
                     dragon.segmentCircularBuffer[l][1] = player.getY();
                 }
             }
@@ -104,7 +104,7 @@ public static void init() {
                 (dragon).latestSegment = 0;
             }
 
-            dragon.segmentCircularBuffer[dragon.latestSegment][0] = (double) player.yaw + 180;
+            dragon.segmentCircularBuffer[dragon.latestSegment][0] = (double) player.getYaw() + 180;
             dragon.segmentCircularBuffer[dragon.latestSegment][1] = player.getY();
         });
 
diff --git a/src/main/java/draylar/identity/cca/AbilityComponent.java b/src/main/java/draylar/identity/cca/AbilityComponent.java
index c1a4bab..4455ffc 100644
--- a/src/main/java/draylar/identity/cca/AbilityComponent.java
+++ b/src/main/java/draylar/identity/cca/AbilityComponent.java
@@ -4,7 +4,7 @@
 import dev.onyxstudios.cca.api.v3.component.tick.ServerTickingComponent;
 import draylar.identity.registry.Components;
 import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.NbtCompound;
 
 public class AbilityComponent implements AutoSyncedComponent, ServerTickingComponent {
 
@@ -18,12 +18,12 @@ public AbilityComponent(PlayerEntity player) {
     }
 
     @Override
-    public void readFromNbt(CompoundTag tag) {
+    public void readFromNbt(NbtCompound tag) {
         this.cooldown = tag.getInt(ABILITY_COOLDOWN_KEY);
     }
 
     @Override
-    public void writeToNbt(CompoundTag tag) {
+    public void writeToNbt(NbtCompound tag) {
         tag.putInt(ABILITY_COOLDOWN_KEY, cooldown);
     }
 
diff --git a/src/main/java/draylar/identity/cca/FavoriteIdentitiesComponent.java b/src/main/java/draylar/identity/cca/FavoriteIdentitiesComponent.java
index b0c56f6..74e5c3a 100644
--- a/src/main/java/draylar/identity/cca/FavoriteIdentitiesComponent.java
+++ b/src/main/java/draylar/identity/cca/FavoriteIdentitiesComponent.java
@@ -5,9 +5,9 @@
 import net.fabricmc.fabric.api.util.NbtType;
 import net.minecraft.entity.EntityType;
 import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.nbt.ListTag;
-import net.minecraft.nbt.StringTag;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtList;
+import net.minecraft.nbt.NbtString;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.registry.Registry;
 
@@ -53,16 +53,16 @@ public void unfavorite(Identifier id) {
     }
 
     @Override
-    public void readFromNbt(CompoundTag tag) {
+    public void readFromNbt(NbtCompound tag) {
         favorites.clear();
-        ListTag idList = tag.getList("FavoriteIdentities", NbtType.STRING);
+        NbtList idList = tag.getList("FavoriteIdentities", NbtType.STRING);
         idList.forEach(idTag -> favorites.add(new Identifier(idTag.asString())));
     }
 
     @Override
-    public void writeToNbt(CompoundTag tag) {
-        ListTag idList = new ListTag();
-        favorites.forEach(entityId -> idList.add(StringTag.of(entityId.toString())));
+    public void writeToNbt(NbtCompound tag) {
+        NbtList idList = new NbtList();
+        favorites.forEach(entityId -> idList.add(NbtString.of(entityId.toString())));
         tag.put("FavoriteIdentities", idList);
     }
 }
diff --git a/src/main/java/draylar/identity/cca/HostilityComponent.java b/src/main/java/draylar/identity/cca/HostilityComponent.java
index e724ec2..4b4dbaf 100644
--- a/src/main/java/draylar/identity/cca/HostilityComponent.java
+++ b/src/main/java/draylar/identity/cca/HostilityComponent.java
@@ -1,7 +1,7 @@
 package draylar.identity.cca;
 
 import dev.onyxstudios.cca.api.v3.component.tick.ServerTickingComponent;
-import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.NbtCompound;
 
 public class HostilityComponent implements ServerTickingComponent {
 
@@ -12,12 +12,12 @@ public HostilityComponent() {
     }
 
     @Override
-    public void readFromNbt(CompoundTag tag) {
+    public void readFromNbt(NbtCompound tag) {
         this.remainingTime = tag.getInt("RemainingTime");
     }
 
     @Override
-    public void writeToNbt(CompoundTag tag) {
+    public void writeToNbt(NbtCompound tag) {
         tag.putInt("RemainingTime", remainingTime);
     }
 
diff --git a/src/main/java/draylar/identity/cca/IdentityComponent.java b/src/main/java/draylar/identity/cca/IdentityComponent.java
index f11ef59..a7ccf7e 100644
--- a/src/main/java/draylar/identity/cca/IdentityComponent.java
+++ b/src/main/java/draylar/identity/cca/IdentityComponent.java
@@ -19,9 +19,8 @@
 import net.minecraft.entity.passive.TameableEntity;
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.vehicle.BoatEntity;
-import net.minecraft.item.AirBlockItem;
 import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.CompoundTag;
+import net.minecraft.nbt.NbtCompound;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.math.BlockPos;
@@ -87,11 +86,11 @@ public boolean setIdentity(LivingEntity identity) {
         // update flight properties on player depending on identity
         if (Identity.hasFlyingPermissions((ServerPlayerEntity) player)) {
             Identity.ABILITY_SOURCE.grantTo(player, VanillaAbilities.ALLOW_FLYING);
-            player.abilities.flySpeed = Identity.CONFIG.flySpeed;
+            player.getAbilities().flySpeed = Identity.CONFIG.flySpeed;
             player.sendAbilitiesUpdate();
         } else {
             Identity.ABILITY_SOURCE.revokeFrom(player, VanillaAbilities.ALLOW_FLYING);
-            player.abilities.flySpeed = 0.05f;
+            player.getAbilities().flySpeed = 0.05f;
             player.sendAbilitiesUpdate();
         }
 
@@ -223,8 +222,8 @@ private void tickTemperature() {
     }
 
     @Override
-    public void readFromNbt(CompoundTag tag) {
-        Optional<EntityType<?>> type = EntityType.fromTag(tag);
+    public void readFromNbt(NbtCompound tag) {
+        Optional<EntityType<?>> type = EntityType.fromNbt(tag);
 
         // set identity to null (no identity) if the entity id is "minecraft:empty"
         if (tag.getString("id").equals("minecraft:empty")) {
@@ -234,7 +233,7 @@ public void readFromNbt(CompoundTag tag) {
 
         // if entity type was valid, deserialize entity data from tag
         else if (type.isPresent()) {
-            CompoundTag entityTag = tag.getCompound("EntityData");
+            NbtCompound entityTag = tag.getCompound("EntityData");
 
             // ensure entity data exists
             if (entityTag != null) {
@@ -245,18 +244,18 @@ else if (type.isPresent()) {
                     ((DimensionsRefresher) player).identity_refreshDimensions();
                 }
 
-                identity.fromTag(entityTag);
+                identity.readNbt(entityTag);
             }
         }
     }
 
     @Override
-    public void writeToNbt(CompoundTag tag) {
-        CompoundTag entityTag = new CompoundTag();
+    public void writeToNbt(NbtCompound tag) {
+        NbtCompound entityTag = new NbtCompound();
 
         // serialize current identity data to tag if it exists
         if (identity != null) {
-            identity.toTag(entityTag);
+            identity.writeNbt(entityTag);
         }
 
         // put entity type ID under the key "id", or "minecraft:empty" if no identity is equipped (or the identity entity type is invalid)
diff --git a/src/main/java/draylar/identity/cca/UnlockedIdentitiesComponent.java b/src/main/java/draylar/identity/cca/UnlockedIdentitiesComponent.java
index e2b939c..87ab549 100644
--- a/src/main/java/draylar/identity/cca/UnlockedIdentitiesComponent.java
+++ b/src/main/java/draylar/identity/cca/UnlockedIdentitiesComponent.java
@@ -3,15 +3,12 @@
 import dev.onyxstudios.cca.api.v3.component.sync.AutoSyncedComponent;
 import draylar.identity.api.event.UnlockIdentityCallback;
 import draylar.identity.registry.Components;
-import nerdhub.cardinal.components.api.ComponentType;
-import nerdhub.cardinal.components.api.util.sync.EntitySyncedComponent;
 import net.fabricmc.fabric.api.util.NbtType;
-import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityType;
 import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.nbt.ListTag;
-import net.minecraft.nbt.StringTag;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtList;
+import net.minecraft.nbt.NbtString;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.Identifier;
@@ -64,11 +61,11 @@ public void revoke(Identifier id) {
     }
 
     @Override
-    public void readFromNbt(CompoundTag tag) {
+    public void readFromNbt(NbtCompound tag) {
         unlocked.clear();
 
         // reminder: do not change this tag
-        ListTag idList = tag.getList("UnlockedMorphs", NbtType.STRING);
+        NbtList idList = tag.getList("UnlockedMorphs", NbtType.STRING);
 
         idList.forEach(idTag -> {
             unlocked.add(new Identifier(idTag.asString()));
@@ -76,11 +73,11 @@ public void readFromNbt(CompoundTag tag) {
     }
 
     @Override
-    public void writeToNbt(CompoundTag tag) {
-        ListTag idList = new ListTag();
+    public void writeToNbt(NbtCompound tag) {
+        NbtList idList = new NbtList();
 
         unlocked.forEach(entityId -> {
-            idList.add(StringTag.of(entityId.toString()));
+            idList.add(NbtString.of(entityId.toString()));
         });
 
         // reminder: do not change this tag
diff --git a/src/main/java/draylar/identity/mixin/BipedEntityModelMixin.java b/src/main/java/draylar/identity/mixin/BipedEntityModelMixin.java
index 170bd9f..6a1e68d 100644
--- a/src/main/java/draylar/identity/mixin/BipedEntityModelMixin.java
+++ b/src/main/java/draylar/identity/mixin/BipedEntityModelMixin.java
@@ -1,10 +1,7 @@
 package draylar.identity.mixin;
 
 import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.entity.BipedEntityRenderer;
-import net.minecraft.client.render.entity.EntityRenderDispatcher;
-import net.minecraft.client.render.entity.LivingEntityRenderer;
-import net.minecraft.client.render.entity.MobEntityRenderer;
+import net.minecraft.client.render.entity.*;
 import net.minecraft.client.render.entity.model.BipedEntityModel;
 import net.minecraft.client.render.entity.model.DrownedEntityModel;
 import net.minecraft.client.render.entity.model.EntityModel;
@@ -20,8 +17,8 @@
 @Mixin(MobEntityRenderer.class)
 public abstract class BipedEntityModelMixin extends LivingEntityRenderer {
 
-    public BipedEntityModelMixin(EntityRenderDispatcher dispatcher, EntityModel model, float shadowRadius) {
-        super(dispatcher, model, shadowRadius);
+    private BipedEntityModelMixin(EntityRendererFactory.Context ctx, EntityModel model, float shadowRadius) {
+        super(ctx, model, shadowRadius);
     }
 
     @Inject(
diff --git a/src/main/java/draylar/identity/mixin/LivingEntityMixin.java b/src/main/java/draylar/identity/mixin/LivingEntityMixin.java
index 276151d..66e1d84 100644
--- a/src/main/java/draylar/identity/mixin/LivingEntityMixin.java
+++ b/src/main/java/draylar/identity/mixin/LivingEntityMixin.java
@@ -114,12 +114,12 @@ private boolean applyWaterCreatureSwimSpeedBoost(LivingEntity livingEntity, Stat
             at = @At(value = "HEAD"),
             cancellable = true
     )
-    private void handleFallDamage(float fallDistance, float damageMultiplier, CallbackInfoReturnable<Boolean> cir) {
+    private void handleFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource, CallbackInfoReturnable<Boolean> cir) {
         if((Object) this instanceof PlayerEntity) {
             LivingEntity identity = Components.CURRENT_IDENTITY.get(this).getIdentity();
 
             if (identity != null) {
-                boolean takesFallDamage = identity.handleFallDamage(fallDistance, damageMultiplier);
+                boolean takesFallDamage = identity.handleFallDamage(fallDistance, damageMultiplier, damageSource);
                 int damageAmount = ((LivingEntityAccessor) identity).callComputeFallDamage(fallDistance, damageMultiplier);
 
                 if (takesFallDamage && damageAmount > 0) {
diff --git a/src/main/java/draylar/identity/mixin/PiglinBrainMixin.java b/src/main/java/draylar/identity/mixin/PiglinBrainMixin.java
index 557423d..1ff4053 100644
--- a/src/main/java/draylar/identity/mixin/PiglinBrainMixin.java
+++ b/src/main/java/draylar/identity/mixin/PiglinBrainMixin.java
@@ -6,6 +6,7 @@
 import net.minecraft.entity.LivingEntity;
 import net.minecraft.entity.mob.Monster;
 import net.minecraft.entity.mob.PiglinBrain;
+import net.minecraft.entity.mob.PiglinEntity;
 import net.minecraft.entity.player.PlayerEntity;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
@@ -16,11 +17,11 @@
 public class PiglinBrainMixin {
 
     @Inject(
-            method = "shouldAttack",
+            method = "isPreferredAttackTarget",
             at = @At("RETURN"),
             cancellable = true
     )
-    private static void shouldAttackIdentity(LivingEntity target, CallbackInfoReturnable<Boolean> cir) {
+    private static void shouldAttackIdentity(PiglinEntity piglin, LivingEntity target, CallbackInfoReturnable<Boolean> cir) {
         boolean shouldAttack = cir.getReturnValue();
 
         if(shouldAttack && target instanceof PlayerEntity) {
diff --git a/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java b/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java
index 7f9c3bf..b42ba0d 100644
--- a/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java
+++ b/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java
@@ -18,8 +18,9 @@ public class PiglinBruteBrainMixin {
 
     /**
      * @author Draylar
-     * method_30249 searches for a nearby player to aggro on.
-     * This mixin modifies the search logic to exclude players digsuised as anything besides a Wither Skeleton or Wither.
+     *
+     * @reason method_30249 searches for a nearby player to aggro on.
+     * This mixin modifies the search logic to exclude players disguised as anything besides a Wither Skeleton or Wither.
      */
     @Overwrite
     private static Optional<? extends LivingEntity> method_30249(AbstractPiglinEntity abstractPiglinEntity, MemoryModuleType<? extends LivingEntity> memoryModuleType) {
diff --git a/src/main/java/draylar/identity/mixin/PlayerAdvancementTrackerMixin.java b/src/main/java/draylar/identity/mixin/PlayerAdvancementTrackerMixin.java
index 509970a..c2e121c 100644
--- a/src/main/java/draylar/identity/mixin/PlayerAdvancementTrackerMixin.java
+++ b/src/main/java/draylar/identity/mixin/PlayerAdvancementTrackerMixin.java
@@ -23,7 +23,7 @@ public class PlayerAdvancementTrackerMixin {
     private void refreshFlight(Advancement advancement, String criterionName, CallbackInfoReturnable<Boolean> cir) {
         if(Identity.hasFlyingPermissions(owner)) {
             Identity.ABILITY_SOURCE.grantTo(owner, VanillaAbilities.ALLOW_FLYING);
-            owner.abilities.flySpeed = Identity.CONFIG.flySpeed;
+            owner.getAbilities().flySpeed = Identity.CONFIG.flySpeed;
             owner.sendAbilitiesUpdate();
         }
     }
diff --git a/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java b/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java
index 01a0dd6..928d841 100644
--- a/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java
+++ b/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java
@@ -40,12 +40,12 @@
 public abstract class PlayerEntityRendererMixin extends LivingEntityRenderer<AbstractClientPlayerEntity, PlayerEntityModel<AbstractClientPlayerEntity>> {
 
     @Shadow
-    protected static BipedEntityModel.ArmPose getArmPose(AbstractClientPlayerEntity abstractClientPlayerEntity, Hand hand) {
+    protected static BipedEntityModel.ArmPose getArmPose(AbstractClientPlayerEntity player, Hand hand) {
         return null;
     }
 
-    private PlayerEntityRendererMixin(EntityRenderDispatcher dispatcher, PlayerEntityModel<AbstractClientPlayerEntity> model, float shadowSize) {
-        super(dispatcher, model, shadowSize);
+    private PlayerEntityRendererMixin(EntityRendererFactory.Context ctx, PlayerEntityModel<AbstractClientPlayerEntity> model, float shadowRadius) {
+        super(ctx, model, shadowRadius);
     }
 
     @Redirect(
@@ -76,10 +76,10 @@ private void redirectRender(LivingEntityRenderer renderer, LivingEntity player,
 
             // phantoms' pitch is inverse for whatever reason
             if(identity instanceof PhantomEntity) {
-                identity.pitch = -player.pitch;
+                identity.setPitch(-player.getPitch());
                 identity.prevPitch = -player.prevPitch;
             } else {
-                identity.pitch = player.pitch;
+                identity.setPitch(player.getPitch());
                 identity.prevPitch = player.prevPitch;
             }
 
@@ -142,16 +142,16 @@ private void identity_setBipedIdentityModelPose(AbstractClientPlayerEntity playe
         if (identity.isSpectator()) {
             identityBipedModel.setVisible(false);
             identityBipedModel.head.visible = true;
-            identityBipedModel.helmet.visible = true;
+            identityBipedModel.hat.visible = true;
         } else {
             identityBipedModel.setVisible(true);
-            identityBipedModel.helmet.visible = player.isPartVisible(PlayerModelPart.HAT);
+            identityBipedModel.hat.visible = player.isPartVisible(PlayerModelPart.HAT);
             identityBipedModel.sneaking = identity.isInSneakingPose();
 
             BipedEntityModel.ArmPose mainHandPose = getArmPose(player, Hand.MAIN_HAND);
             BipedEntityModel.ArmPose offHandPose = getArmPose(player, Hand.OFF_HAND);
 
-            if (mainHandPose.method_30156()) {
+            if (mainHandPose.isTwoHanded()) {
                 offHandPose = identity.getOffHandStack().isEmpty() ? BipedEntityModel.ArmPose.EMPTY : BipedEntityModel.ArmPose.ITEM;
             }
 
diff --git a/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java b/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java
index f2df9fc..151c700 100644
--- a/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java
+++ b/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java
@@ -43,7 +43,7 @@ private void onRespawn(ServerPlayerEntity player, boolean alive, CallbackInfoRet
         if (identity != null && Identity.CONFIG.scalingHealth) {
             player.setHealth(Math.min(player.getHealth(), identity.getMaxHealth()));
             player.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH).setBaseValue(Math.min(Identity.CONFIG.maxHealth, identity.getMaxHealth()));
-            ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, new EntityAttributesS2CPacket(player.getEntityId(), player.getAttributes().getAttributesToSend()));
+            ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, new EntityAttributesS2CPacket(player.getId(), player.getAttributes().getAttributesToSend()));
         }
     }
 }
diff --git a/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java b/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java
index 2cddf2d..5b1ac37 100644
--- a/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java
+++ b/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java
@@ -32,11 +32,11 @@ public void travel(Vec3d movementInput) {
                 // Only players should be able to control Ravager
                 if (rider instanceof PlayerEntity) {
                     // Assign rider properties to ravager
-                    this.yaw = rider.yaw;
-                    this.prevYaw = this.yaw;
-                    this.pitch = rider.pitch * 0.5F;
-                    this.setRotation(this.yaw, this.pitch);
-                    this.bodyYaw = this.yaw;
+                    this.setYaw(rider.getYaw());
+                    this.prevYaw = this.getYaw();
+                    this.setPitch(rider.getPitch() * 0.5F);
+                    this.setRotation(this.getYaw(), this.getPitch());
+                    this.bodyYaw = this.getYaw();
                     this.headYaw = this.bodyYaw;
                     float sidewaysSpeed = rider.sidewaysSpeed * 0.5F;
                     float forwardSpeed = rider.forwardSpeed;
@@ -56,7 +56,7 @@ public void travel(Vec3d movementInput) {
                     }
 
                     // Limb updates for movement
-                    this.method_29242(this, false);
+                    this.updateLimbs(this, false);
                     return;
                 }
             }
diff --git a/src/main/java/draylar/identity/mixin/ScreenAccessor.java b/src/main/java/draylar/identity/mixin/ScreenAccessor.java
new file mode 100644
index 0000000..b46e6f0
--- /dev/null
+++ b/src/main/java/draylar/identity/mixin/ScreenAccessor.java
@@ -0,0 +1,14 @@
+package draylar.identity.mixin;
+
+import net.minecraft.client.gui.Selectable;
+import net.minecraft.client.gui.screen.Screen;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import java.util.List;
+
+@Mixin(Screen.class)
+public interface ScreenAccessor {
+    @Accessor
+    List<Selectable> getSelectables();
+}
diff --git a/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java b/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java
index 3ddfb93..0abc2ef 100644
--- a/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java
+++ b/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java
@@ -53,14 +53,14 @@ private void revokeIdentityOnDeath(DamageSource source, CallbackInfo ci) {
     }
 
     @Inject(
-            method = "onSpawn",
+            method = "onSpawn()V",
             at = @At("HEAD")
     )
     private void onSpawn(CallbackInfo ci) {
         if(Identity.hasFlyingPermissions((ServerPlayerEntity) (Object) this)) {
             if(!Identity.ABILITY_SOURCE.grants((ServerPlayerEntity) (Object) this, VanillaAbilities.ALLOW_FLYING)) {
                 Identity.ABILITY_SOURCE.grantTo((ServerPlayerEntity) (Object) this, VanillaAbilities.ALLOW_FLYING);
-                ((ServerPlayerEntity) (Object) this).abilities.flySpeed = Identity.CONFIG.flySpeed;
+                ((ServerPlayerEntity) (Object) this).getAbilities().flySpeed = Identity.CONFIG.flySpeed;
                 ((ServerPlayerEntity) (Object) this).sendAbilitiesUpdate();
             }
 
diff --git a/src/main/java/draylar/identity/mixin/WitherEntityMixin.java b/src/main/java/draylar/identity/mixin/WitherEntityMixin.java
index e5badfc..c53af69 100644
--- a/src/main/java/draylar/identity/mixin/WitherEntityMixin.java
+++ b/src/main/java/draylar/identity/mixin/WitherEntityMixin.java
@@ -28,8 +28,8 @@ private WitherEntityMixin(EntityType<? extends HostileEntity> entityType, World
             at = @At(value = "INVOKE", target = "Ljava/util/List;isEmpty()Z"),
             locals = LocalCapture.CAPTURE_FAILHARD
     )
-    private void removeInvalidPlayerTargets(CallbackInfo ci, int j, List<LivingEntity> list, int l) {
-        List<LivingEntity> toRemove = new ArrayList();
+    private void removeInvalidPlayerTargets(CallbackInfo ci, int j, List<LivingEntity> list) {
+        List<LivingEntity> toRemove = new ArrayList<>();
 
         list.forEach(entity -> {
             if(entity instanceof PlayerEntity) {
diff --git a/src/main/java/draylar/identity/registry/Components.java b/src/main/java/draylar/identity/registry/Components.java
index a8baca3..e3c5f82 100644
--- a/src/main/java/draylar/identity/registry/Components.java
+++ b/src/main/java/draylar/identity/registry/Components.java
@@ -4,9 +4,9 @@
 import dev.onyxstudios.cca.api.v3.component.ComponentRegistry;
 import dev.onyxstudios.cca.api.v3.entity.EntityComponentFactoryRegistry;
 import dev.onyxstudios.cca.api.v3.entity.EntityComponentInitializer;
+import dev.onyxstudios.cca.api.v3.entity.RespawnCopyStrategy;
 import draylar.identity.Identity;
 import draylar.identity.cca.*;
-import nerdhub.cardinal.components.api.util.RespawnCopyStrategy;
 
 public class Components implements EntityComponentInitializer {
 
diff --git a/src/main/java/draylar/identity/screen/IdentityScreen.java b/src/main/java/draylar/identity/screen/IdentityScreen.java
index ccca49f..ac31eed 100644
--- a/src/main/java/draylar/identity/screen/IdentityScreen.java
+++ b/src/main/java/draylar/identity/screen/IdentityScreen.java
@@ -4,15 +4,17 @@
 import draylar.identity.cca.FavoriteIdentitiesComponent;
 import draylar.identity.cca.IdentityComponent;
 import draylar.identity.cca.UnlockedIdentitiesComponent;
+import draylar.identity.mixin.ScreenAccessor;
 import draylar.identity.registry.Components;
 import draylar.identity.screen.widget.EntityWidget;
 import draylar.identity.screen.widget.HelpWidget;
 import draylar.identity.screen.widget.PlayerWidget;
 import draylar.identity.screen.widget.SearchWidget;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.Selectable;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.AbstractButtonWidget;
 import net.minecraft.client.gui.widget.ButtonWidget;
+import net.minecraft.client.gui.widget.PressableWidget;
 import net.minecraft.client.util.Window;
 import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.entity.Entity;
@@ -41,9 +43,9 @@ public IdentityScreen() {
         super.init(MinecraftClient.getInstance(), MinecraftClient.getInstance().getWindow().getScaledWidth(), MinecraftClient.getInstance().getWindow().getScaledHeight());
 
         populateRenderEntities();
-        addButton(searchBar);
-        addButton(playerButton);
-        addButton(helpButton);
+        addDrawableChild(searchBar);
+        addDrawableChild(playerButton);
+        addDrawableChild(helpButton);
 
         // get identity components from player
         UnlockedIdentitiesComponent unlockedComponent = Components.UNLOCKED_IDENTITIES.get(MinecraftClient.getInstance().player);
@@ -77,8 +79,8 @@ public IdentityScreen() {
 
             // Only re-filter if the text contents changed
             if(!lastSearchContents.equals(text)) {
-                buttons.removeIf(button -> button instanceof EntityWidget);
-                children.removeIf(button -> button instanceof EntityWidget);
+                ((ScreenAccessor) this).getSelectables().removeIf(button -> button instanceof EntityWidget);
+                children().removeIf(button -> button instanceof EntityWidget);
                 entityWidgets.clear();
 
                 List<LivingEntity> filtered = unlocked
@@ -103,6 +105,8 @@ public void init(MinecraftClient client, int width, int height) {
         this.setFocused(null);
     }
 
+
+
     @Override
     public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
         renderBackground(matrices);
@@ -116,10 +120,12 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
         }
 
         // tooltips
-        for (AbstractButtonWidget abstractButtonWidget : this.buttons) {
-            if (abstractButtonWidget.isHovered()) {
-                abstractButtonWidget.renderToolTip(matrices, mouseX, mouseY);
-                break;
+        for (Selectable selectable : ((ScreenAccessor) this).getSelectables()) {
+            if(selectable instanceof PressableWidget button) {
+                if (button.isHovered()) {
+                    button.renderToolTip(matrices, mouseX, mouseY);
+                    break;
+                }
             }
         }
 
@@ -158,9 +164,9 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
             return false;
         }
 
-        buttons.forEach(button -> {
-            if(button instanceof EntityWidget) {
-                button.y = (int) (button.y + amount * 10);
+        ((ScreenAccessor) this).getSelectables().forEach(button -> {
+            if(button instanceof EntityWidget widget) {
+                widget.y = (int) (widget.y + amount * 10);
             }
         });
 
@@ -198,7 +204,7 @@ private void populateEntityWidgets(List<LivingEntity> unlocked, FavoriteIdentiti
                             isCurrent
                     );
 
-                    addButton(entityWidget);
+                    addDrawableChild(entityWidget);
                     entityWidgets.add(entityWidget);
                 }
             }
diff --git a/src/main/java/draylar/identity/screen/ScreenUtils.java b/src/main/java/draylar/identity/screen/ScreenUtils.java
index adf5d41..fdd7835 100644
--- a/src/main/java/draylar/identity/screen/ScreenUtils.java
+++ b/src/main/java/draylar/identity/screen/ScreenUtils.java
@@ -7,7 +7,6 @@
 import net.minecraft.client.render.VertexConsumerProvider;
 import net.minecraft.client.render.entity.EntityRenderDispatcher;
 import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.client.util.math.Vector3f;
 import net.minecraft.entity.LivingEntity;
 import net.minecraft.util.math.Quaternion;
 
@@ -15,45 +14,45 @@
 public class ScreenUtils {
 
     public static void drawEntity(int x, int y, int size, float mouseX, float mouseY, LivingEntity entity) {
-        drawEntity(x, y, size, mouseX, mouseY, entity, 15728880);
+//        drawEntity(x, y, size, mouseX, mouseY, entity, 15728880);
     }
 
-    public static void drawEntity(int x, int y, int size, float mouseX, float mouseY, LivingEntity entity, int light) {
-        float f = (float)Math.atan((double)(mouseX / 40.0F));
-        float g = (float)Math.atan((double)(mouseY / 40.0F));
-        RenderSystem.pushMatrix();
-        RenderSystem.translatef((float)x, (float)y, 1050.0F);
-        RenderSystem.scalef(1.0F, 1.0F, -1.0F);
-        MatrixStack matrixStack = new MatrixStack();
-        matrixStack.translate(0.0D, 0.0D, 1000.0D);
-        matrixStack.scale((float)size, (float)size, (float)size);
-        Quaternion quaternion = Vector3f.POSITIVE_Z.getDegreesQuaternion(180.0F);
-        Quaternion quaternion2 = Vector3f.POSITIVE_X.getDegreesQuaternion(g * 20.0F);
-        quaternion.hamiltonProduct(quaternion2);
-        matrixStack.multiply(quaternion);
-        float h = entity.bodyYaw;
-        float i = entity.yaw;
-        float j = entity.pitch;
-        float k = entity.prevHeadYaw;
-        float l = entity.headYaw;
-        entity.bodyYaw = 180.0F + f * 20.0F;
-        entity.yaw = 180.0F + f * 40.0F;
-        entity.pitch = -g * 20.0F;
-        entity.headYaw = entity.yaw;
-        entity.prevHeadYaw = entity.yaw;
-        EntityRenderDispatcher entityRenderDispatcher = MinecraftClient.getInstance().getEntityRenderDispatcher();
-        quaternion2.conjugate();
-        entityRenderDispatcher.setRotation(quaternion2);
-        entityRenderDispatcher.setRenderShadows(false);
-        VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers();
-        entityRenderDispatcher.render(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, matrixStack, immediate, light);
-        immediate.draw();
-        entityRenderDispatcher.setRenderShadows(true);
-        entity.bodyYaw = h;
-        entity.yaw = i;
-        entity.pitch = j;
-        entity.prevHeadYaw = k;
-        entity.headYaw = l;
-        RenderSystem.popMatrix();
-    }
+//    public static void drawEntity(int x, int y, int size, float mouseX, float mouseY, LivingEntity entity, int light) {
+//        float f = (float)Math.atan((double)(mouseX / 40.0F));
+//        float g = (float)Math.atan((double)(mouseY / 40.0F));
+//        RenderSystem.pushMatrix();
+//        RenderSystem.translatef((float)x, (float)y, 1050.0F);
+//        RenderSystem.scalef(1.0F, 1.0F, -1.0F);
+//        MatrixStack matrixStack = new MatrixStack();
+//        matrixStack.translate(0.0D, 0.0D, 1000.0D);
+//        matrixStack.scale((float)size, (float)size, (float)size);
+//        Quaternion quaternion = Vector3f.POSITIVE_Z.getDegreesQuaternion(180.0F);
+//        Quaternion quaternion2 = Vector3f.POSITIVE_X.getDegreesQuaternion(g * 20.0F);
+//        quaternion.hamiltonProduct(quaternion2);
+//        matrixStack.multiply(quaternion);
+//        float h = entity.bodyYaw;
+//        float i = entity.yaw;
+//        float j = entity.pitch;
+//        float k = entity.prevHeadYaw;
+//        float l = entity.headYaw;
+//        entity.bodyYaw = 180.0F + f * 20.0F;
+//        entity.yaw = 180.0F + f * 40.0F;
+//        entity.pitch = -g * 20.0F;
+//        entity.headYaw = entity.yaw;
+//        entity.prevHeadYaw = entity.yaw;
+//        EntityRenderDispatcher entityRenderDispatcher = MinecraftClient.getInstance().getEntityRenderDispatcher();
+//        quaternion2.conjugate();
+//        entityRenderDispatcher.setRotation(quaternion2);
+//        entityRenderDispatcher.setRenderShadows(false);
+//        VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers();
+//        entityRenderDispatcher.render(entity, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F, matrixStack, immediate, light);
+//        immediate.draw();
+//        entityRenderDispatcher.setRenderShadows(true);
+//        entity.bodyYaw = h;
+//        entity.yaw = i;
+//        entity.pitch = j;
+//        entity.prevHeadYaw = k;
+//        entity.headYaw = l;
+//        RenderSystem.popMatrix();
+//    }
 }
diff --git a/src/main/java/draylar/identity/screen/widget/EntityWidget.java b/src/main/java/draylar/identity/screen/widget/EntityWidget.java
index ab82c3b..7026b14 100644
--- a/src/main/java/draylar/identity/screen/widget/EntityWidget.java
+++ b/src/main/java/draylar/identity/screen/widget/EntityWidget.java
@@ -1,15 +1,17 @@
 package draylar.identity.screen.widget;
 
+import com.mojang.blaze3d.systems.RenderSystem;
 import draylar.identity.Identity;
 import draylar.identity.network.ClientNetworking;
 import draylar.identity.screen.IdentityScreen;
-import draylar.identity.screen.ScreenUtils;
 import io.netty.buffer.Unpooled;
 import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
+import net.minecraft.client.gui.screen.ingame.InventoryScreen;
+import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
+import net.minecraft.client.gui.widget.PressableWidget;
 import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.entity.LivingEntity;
 import net.minecraft.network.PacketByteBuf;
@@ -17,10 +19,9 @@
 import net.minecraft.text.TranslatableText;
 import net.minecraft.util.registry.Registry;
 
-import java.util.Arrays;
 import java.util.Collections;
 
-public class EntityWidget extends AbstractPressableButtonWidget {
+public class EntityWidget extends PressableWidget {
 
     private final LivingEntity entity;
     private final int size;
@@ -80,17 +81,18 @@ else if (button == 1) {
     public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
         super.render(matrices, mouseX, mouseY, delta);
 
-        ScreenUtils.drawEntity(x + this.getWidth() / 2, (int) (y + this.getHeight() * .75f), size, -10, -10, entity, 15728880);
+//        ScreenUtils.drawEntity(x + this.getWidth() / 2, (int) (y + this.getHeight() * .75f), size, -10, -10, entity, 15728880);
+        InventoryScreen.drawEntity(x + this.getWidth() / 2, (int) (y + this.getHeight() * .75f), size, -10, -10, entity);
 
         // Render selected outline
         if(active) {
-            MinecraftClient.getInstance().getTextureManager().bindTexture(Identity.id("textures/gui/selected.png"));
+            RenderSystem.setShaderTexture(0, Identity.id("textures/gui/selected.png"));
             DrawableHelper.drawTexture(matrices, x, y, getWidth(), getHeight(), 0, 0, 48, 32, 48, 32);
         }
 
         // Render favorite star
         if(starred) {
-            MinecraftClient.getInstance().getTextureManager().bindTexture(Identity.id("textures/gui/star.png"));
+            RenderSystem.setShaderTexture(0, Identity.id("textures/gui/star.png"));
             DrawableHelper.drawTexture(matrices, x, y, 0, 0, 15, 15, 15, 15);
         }
 
@@ -128,4 +130,9 @@ public void renderToolTip(MatrixStack matrices, int mouseX, int mouseY) {
             currentScreen.renderTooltip(matrices, Collections.singletonList(new TranslatableText(entity.getType().getTranslationKey())), mouseX, mouseY);
         }
     }
+
+    @Override
+    public void appendNarrations(NarrationMessageBuilder builder) {
+
+    }
 }
diff --git a/src/main/java/draylar/identity/screen/widget/PlayerWidget.java b/src/main/java/draylar/identity/screen/widget/PlayerWidget.java
index de59677..0d8d73d 100644
--- a/src/main/java/draylar/identity/screen/widget/PlayerWidget.java
+++ b/src/main/java/draylar/identity/screen/widget/PlayerWidget.java
@@ -1,5 +1,6 @@
 package draylar.identity.screen.widget;
 
+import com.mojang.blaze3d.systems.RenderSystem;
 import draylar.identity.Identity;
 import draylar.identity.network.ClientNetworking;
 import draylar.identity.screen.IdentityScreen;
@@ -7,14 +8,15 @@
 import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.DrawableHelper;
-import net.minecraft.client.gui.widget.AbstractPressableButtonWidget;
+import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
+import net.minecraft.client.gui.widget.PressableWidget;
 import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.entity.EntityType;
 import net.minecraft.network.PacketByteBuf;
 import net.minecraft.text.LiteralText;
 import net.minecraft.util.registry.Registry;
 
-public class PlayerWidget extends AbstractPressableButtonWidget {
+public class PlayerWidget extends PressableWidget {
 
     private final IdentityScreen parent;
 
@@ -35,7 +37,7 @@ public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
 //        }
 //
 
-        MinecraftClient.getInstance().getTextureManager().bindTexture(Identity.id("textures/gui/player.png"));
+        RenderSystem.setShaderTexture(0, Identity.id("textures/gui/player.png"));
         DrawableHelper.drawTexture(matrices, x, y, 16, 16, 0, 0, 8, 8, 8, 8);
 
         super.render(matrices, mouseX, mouseY, delta);
@@ -53,4 +55,9 @@ public void onPress() {
         ClientSidePacketRegistry.INSTANCE.sendToServer(ClientNetworking.IDENTITY_REQUEST, packet);
         parent.disableAll();
     }
+
+    @Override
+    public void appendNarrations(NarrationMessageBuilder builder) {
+
+    }
 }
diff --git a/src/main/resources/identity.accesswidener b/src/main/resources/identity.accesswidener
index 8e8656b..f65c7d9 100644
--- a/src/main/resources/identity.accesswidener
+++ b/src/main/resources/identity.accesswidener
@@ -5,13 +5,15 @@ accessible method net/minecraft/entity/LivingEntity getEyeHeight (Lnet/minecraft
 extendable method net/minecraft/entity/Entity getStandingEyeHeight ()F
 accessible method net/minecraft/client/render/entity/LivingEntityRenderer getRenderLayer (Lnet/minecraft/entity/LivingEntity;ZZZ)Lnet/minecraft/client/render/RenderLayer;
 
-accessible field net/minecraft/client/render/entity/model/QuadrupedEntityModel frontRightLeg Lnet/minecraft/client/model/ModelPart;
+accessible field net/minecraft/client/render/entity/model/QuadrupedEntityModel rightFrontLeg Lnet/minecraft/client/model/ModelPart;
 accessible field net/minecraft/client/render/entity/model/LlamaEntityModel rightFrontLeg Lnet/minecraft/client/model/ModelPart;
 accessible field net/minecraft/client/render/entity/model/BlazeEntityModel rods [Lnet/minecraft/client/model/ModelPart;
 accessible field net/minecraft/client/render/entity/model/OcelotEntityModel rightFrontLeg Lnet/minecraft/client/model/ModelPart;
 accessible field net/minecraft/client/render/entity/model/SpiderEntityModel rightFrontLeg Lnet/minecraft/client/model/ModelPart;
-accessible field net/minecraft/client/render/entity/model/IllagerEntityModel rightAttackingArm Lnet/minecraft/client/model/ModelPart;
+accessible field net/minecraft/client/render/entity/model/IllagerEntityModel rightArm Lnet/minecraft/client/model/ModelPart;
 accessible field net/minecraft/client/render/entity/model/RavagerEntityModel rightFrontLeg Lnet/minecraft/client/model/ModelPart;
 accessible field net/minecraft/client/render/entity/model/SquidEntityModel tentacles [Lnet/minecraft/client/model/ModelPart;
 
-accessible field net/minecraft/entity/player/PlayerAbilities flySpeed F
\ No newline at end of file
+accessible field net/minecraft/entity/player/PlayerAbilities flySpeed F
+
+extendable method net/minecraft/client/gui/screen/Screen init (Lnet/minecraft/client/MinecraftClient;II)V
\ No newline at end of file
diff --git a/src/main/resources/identity.mixins.json b/src/main/resources/identity.mixins.json
index 7e868e9..395eb4f 100644
--- a/src/main/resources/identity.mixins.json
+++ b/src/main/resources/identity.mixins.json
@@ -23,6 +23,7 @@
     "PlayerManagerMixin",
     "PlayerSwimmingMixin",
     "RavagerEntityMixin",
+    "ScreenAccessor",
     "ServerPlayerEntityMixin",
     "SweetBerryBushBlockMixin",
     "TrackTargetGoalMixin",
@@ -32,13 +33,13 @@
     "WolfEntityMixin"
   ],
   "client": [
-    "PlayerEntityRendererMixin",
-    "ShadowMixin",
-    "StrayOverlayMixin",
     "BipedEntityModelMixin",
     "DrownedOverlayMixin",
     "EntityShadowAccessor",
-    "InGameHudMixin"
+    "InGameHudMixin",
+    "PlayerEntityRendererMixin",
+    "ShadowMixin",
+    "StrayOverlayMixin"
   ],
   "injectors": {
     "defaultRequire": 1