using Harmony.XUiC; using HarmonyLib; using UnityEngine; namespace Harmony.Animation { /// /// Fixes the head twist that NPCs have that are not code-corrected in vanilla. /// [HarmonyPatch(typeof(EModelBase))] [HarmonyPatch("LookAtUpdate")] public class EModelBaseLookAtUpdate { public static bool Prefix(EModelBase __instance, Entity ___entity, Transform ___neckParentTransform, Transform ___headTransform, ref Vector3 ___lookAtPos, float ___lookAtMaxAngle, ref Quaternion ___lookAtRot, Transform ___neckTransform, ref float ___lookAtBlendPer, ref float ___lookAtBlendPerTarget, bool ___lookAtIsPos) { var entityAlive = ___entity as EntityAliveSDX; if (entityAlive == null) return true; // Disable this check for any entity that has UMA2 as a tag if (entityAlive.HasAnyTags(FastTags.Parse("UMA2"))) return true; var currentStun = entityAlive.bodyDamage.CurrentStun; var deltaTime = Time.deltaTime; if (entityAlive.IsDead() || currentStun != EnumEntityStunType.None && currentStun != EnumEntityStunType.Getup) ___lookAtBlendPerTarget = 0f; // If the entity has an attack target, look at them, instead of hte player. var target = EntityUtilities.GetAttackOrRevengeTarget(entityAlive.entityId); if (target != null) { ___lookAtBlendPerTarget -= deltaTime; if (target.IsAlive() && entityAlive.CanSee(target as global::EntityAlive)) { ___lookAtPos = target.getHeadPosition(); ___lookAtBlendPerTarget = 1f; } else { ___lookAtPos = entityAlive.getHeadPosition() + Vector3.forward; } } if (___lookAtBlendPer <= 0f && ___lookAtBlendPerTarget <= 0f) return true; ___lookAtBlendPer = Mathf.MoveTowards(___lookAtBlendPer, ___lookAtBlendPerTarget, deltaTime * 2f); if (___neckParentTransform == null) return true; var rotation3 = ___neckParentTransform.rotation; var transform = ___headTransform; var quaternion = Quaternion.LookRotation(___lookAtPos - Origin.position - transform.position); quaternion *= Quaternion.Slerp(Quaternion.identity, transform.localRotation, 0.5f); var b = Quaternion.RotateTowards(rotation3, quaternion, ___lookAtMaxAngle); ___lookAtRot = Quaternion.Slerp(___lookAtRot, b, 0.16f); var num = ___lookAtBlendPer; ___neckTransform.rotation = Quaternion.Slerp(___neckTransform.rotation, ___lookAtRot, num * 0.4f); var rotation2 = transform.rotation; transform.rotation = Quaternion.Slerp(rotation2, ___lookAtRot, num); return false; } } }