437 lines
11 KiB
C#
437 lines
11 KiB
C#
using System;
|
|
using RootMotion.FinalIK;
|
|
using UnityEngine;
|
|
|
|
// Token: 0x02000037 RID: 55
|
|
public class LookAtController : MonoBehaviour
|
|
{
|
|
// Token: 0x060007DA RID: 2010 RVA: 0x000ADC8D File Offset: 0x000ABE8D
|
|
private void Awake()
|
|
{
|
|
this.Setup();
|
|
}
|
|
|
|
// Token: 0x060007DB RID: 2011 RVA: 0x000ADC98 File Offset: 0x000ABE98
|
|
private void Setup()
|
|
{
|
|
this.body = base.gameObject.GetComponent<Body>();
|
|
this.lookIK = this.body.GetLookIK();
|
|
if (!this.lookIK)
|
|
{
|
|
base.enabled = false;
|
|
}
|
|
if (!this.thisTarget && this.lookIK)
|
|
{
|
|
GameObject gameObject = new GameObject("Aim IK Target");
|
|
this.thisTarget = gameObject.transform;
|
|
if (Links.x.fellowship)
|
|
{
|
|
this.thisTarget.transform.SetParent(Links.x.fellowship.transform);
|
|
}
|
|
}
|
|
if (this.lookIK)
|
|
{
|
|
this.lookIK.solver.IKPositionWeight = 0f;
|
|
}
|
|
}
|
|
|
|
// Token: 0x060007DC RID: 2012 RVA: 0x000ADD5E File Offset: 0x000ABF5E
|
|
private void Start()
|
|
{
|
|
}
|
|
|
|
// Token: 0x060007DD RID: 2013 RVA: 0x000ADD60 File Offset: 0x000ABF60
|
|
public void SetAsActive(bool state)
|
|
{
|
|
if (this.lookIK)
|
|
{
|
|
base.enabled = state;
|
|
if (state)
|
|
{
|
|
return;
|
|
}
|
|
this.lookIK.enabled = false;
|
|
}
|
|
}
|
|
|
|
// Token: 0x060007DE RID: 2014 RVA: 0x000ADD88 File Offset: 0x000ABF88
|
|
public void EndLook()
|
|
{
|
|
this.target = null;
|
|
this.hasTarget = false;
|
|
if (this.body.headAnim)
|
|
{
|
|
if (this.body.character && (this.body.character.sleeping || this.body.character.stunned || this.body.character.downed))
|
|
{
|
|
return;
|
|
}
|
|
this.body.headAnim.PlayAnimation(FaceAnimations.AnimationNames.Blink);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060007DF RID: 2015 RVA: 0x000ADE10 File Offset: 0x000AC010
|
|
public void EndLookFast(bool playFace)
|
|
{
|
|
this.target = null;
|
|
this.hasTarget = false;
|
|
if (this.body.headAnim && playFace)
|
|
{
|
|
if (this.body.character && (this.body.character.sleeping || this.body.character.stunned || this.body.character.downed))
|
|
{
|
|
return;
|
|
}
|
|
this.body.headAnim.PlayAnimation(FaceAnimations.AnimationNames.Blink);
|
|
}
|
|
if (this.lookIK)
|
|
{
|
|
this.lookIK.solver.IKPositionWeight = 0f;
|
|
}
|
|
}
|
|
|
|
// Token: 0x060007E0 RID: 2016 RVA: 0x000ADEBC File Offset: 0x000AC0BC
|
|
public void SetNewTargetTestForCloser(Transform newTarget, float targetTime, float newDelay, bool useHand)
|
|
{
|
|
if (!this.hasTarget || !this.target)
|
|
{
|
|
this.SetNewTarget(newTarget, targetTime, newDelay, false);
|
|
return;
|
|
}
|
|
if ((newTarget.position - this.body.transform.position).sqrMagnitude < (this.target.position - this.body.transform.position).sqrMagnitude)
|
|
{
|
|
this.SetNewTarget(newTarget, targetTime, newDelay, false);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060007E1 RID: 2017 RVA: 0x000ADF40 File Offset: 0x000AC140
|
|
public void SetNewTarget(Transform newTarget, float targetTime, float newDelay, bool useHand)
|
|
{
|
|
if (!this.lookIK)
|
|
{
|
|
return;
|
|
}
|
|
if (!this.body.character && !this.body.inMenu)
|
|
{
|
|
return;
|
|
}
|
|
if (newTarget == this.target && this.hasTarget && targetTime == this.targetTimer)
|
|
{
|
|
return;
|
|
}
|
|
this.target;
|
|
if (Records.x.inMenus)
|
|
{
|
|
this.lastDialogueUpdateTime = Time.realtimeSinceStartup;
|
|
}
|
|
else
|
|
{
|
|
this.lastDialogueUpdateTime = Time.timeSinceLevelLoad;
|
|
}
|
|
if (this.body.character)
|
|
{
|
|
if (this.body.character.sleeping || this.body.character.stunned || this.body.character.downed)
|
|
{
|
|
return;
|
|
}
|
|
if (this.body.character.stats.animal)
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
this.SetAsActive(true);
|
|
this.target = newTarget;
|
|
this.speedTarget = 1f;
|
|
this.speedWeight = 2f;
|
|
this.speedFall = 2f;
|
|
if (!this.body.inMenu)
|
|
{
|
|
if (newTarget == this.body.character.lookAtTurnTarget)
|
|
{
|
|
this.speedTarget = 2f;
|
|
this.speedWeight = 2f;
|
|
this.speedFall = 2f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (Links.x.questEnd.enabled)
|
|
{
|
|
this.speedTarget = 5f;
|
|
}
|
|
else if (base.enabled)
|
|
{
|
|
this.speedTarget = 0.5f;
|
|
}
|
|
else
|
|
{
|
|
this.speedTarget = 1.5f;
|
|
}
|
|
this.speedFall = 0.5f;
|
|
}
|
|
this.lookIK.solver.target = this.thisTarget;
|
|
this.lookIK.enabled = true;
|
|
this.delay = newDelay;
|
|
if (this.thisTarget && this.target && !this.hasTarget)
|
|
{
|
|
this.thisTarget.position = this.target.position;
|
|
this.SetTargetYToHeadBone();
|
|
}
|
|
this.left = false;
|
|
this.right = false;
|
|
Vector3 vector = new Vector3(this.thisTarget.position.x, this.body.tr.position.y, this.thisTarget.position.z) - this.body.tr.position;
|
|
if (this.AngleDir(this.body.tr.forward, Vector3.Normalize(vector), this.body.tr.up) < 0f)
|
|
{
|
|
this.left = true;
|
|
}
|
|
else
|
|
{
|
|
this.right = true;
|
|
}
|
|
if (this.left && this.body.headAnim)
|
|
{
|
|
this.body.headAnim.PlayAnimation(FaceAnimations.AnimationNames.LookLeftLoop);
|
|
}
|
|
if (this.right && this.body.headAnim)
|
|
{
|
|
this.body.headAnim.PlayAnimation(FaceAnimations.AnimationNames.LookRightLoop);
|
|
}
|
|
this.hasTarget = true;
|
|
this.startTime = Time.timeSinceLevelLoad;
|
|
if (targetTime > 0f)
|
|
{
|
|
this.targetTimer = targetTime;
|
|
return;
|
|
}
|
|
this.targetTimer = 0f;
|
|
}
|
|
|
|
// Token: 0x060007E2 RID: 2018 RVA: 0x000AE278 File Offset: 0x000AC478
|
|
public void SetTargetYToHeadBone()
|
|
{
|
|
Vector3 position = this.thisTarget.position;
|
|
if (this.body.headBone)
|
|
{
|
|
this.thisTarget.position = new Vector3(position.x, this.body.headBone.position.y - 1f, position.z);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060007E3 RID: 2019 RVA: 0x000AE2DC File Offset: 0x000AC4DC
|
|
private void Update()
|
|
{
|
|
float num = Time.deltaTime;
|
|
if (Records.x.paused)
|
|
{
|
|
num = Time.unscaledDeltaTime;
|
|
if (Records.x.filming)
|
|
{
|
|
num /= Records.x.filmingAnimatorSpeed;
|
|
}
|
|
}
|
|
if (this.hasTarget)
|
|
{
|
|
if (!this.target)
|
|
{
|
|
this.hasTarget = false;
|
|
}
|
|
if (this.hasTarget)
|
|
{
|
|
this.dot = 0.5f;
|
|
bool flag = false;
|
|
if (Records.x.dialogue || Records.x.inMenus)
|
|
{
|
|
if ((this.body.gameObject.layer == 4 || this.body.gameObject.layer == 25) && Links.x.dialogue.npcTalking)
|
|
{
|
|
this.dot = 1f;
|
|
if ((Records.x.dialogue && Time.timeSinceLevelLoad > this.lastDialogueUpdateTime + 0.08f) || (Records.x.inMenus && Time.realtimeSinceStartup > this.lastDialogueUpdateTime + 0.15f))
|
|
{
|
|
Vector3 vector = this.body.headBone.position + this.body.headBone.forward * 10f;
|
|
if (Records.x.inMenus)
|
|
{
|
|
vector.y -= 1f;
|
|
}
|
|
if (this.body.headBone.position.y - this.body.tr.position.y < 2.7f)
|
|
{
|
|
vector.y += 2f;
|
|
}
|
|
else
|
|
{
|
|
vector.y -= 1f;
|
|
}
|
|
float num2 = -1f;
|
|
float num3 = 0.5f;
|
|
this.thisTarget.position = vector + new Vector3(Random.Range(num2, num3), Random.Range(num2, num3), Random.Range(num2, num3));
|
|
Vector3 position = this.thisTarget.position;
|
|
if (Mathf.Abs(position.x - vector.x) > 6f)
|
|
{
|
|
position.x = this.target.position.x;
|
|
}
|
|
if (Mathf.Abs(position.y - vector.y) > 6f)
|
|
{
|
|
position.y = this.target.position.y;
|
|
}
|
|
if (Mathf.Abs(position.z - vector.z) > 6f)
|
|
{
|
|
position.z = this.target.position.z;
|
|
}
|
|
this.thisTarget.position = position;
|
|
if (Records.x.inMenus)
|
|
{
|
|
this.lastDialogueUpdateTime = Time.realtimeSinceStartup;
|
|
}
|
|
else
|
|
{
|
|
this.lastDialogueUpdateTime = Time.timeSinceLevelLoad;
|
|
}
|
|
}
|
|
flag = true;
|
|
}
|
|
else if (this.body.gameObject.layer == 25 && !Links.x.dialogue.npcTalking)
|
|
{
|
|
Vector3 vector2 = this.body.headBone.position + this.body.headBone.forward * 10f;
|
|
vector2.y -= 1f;
|
|
if (this.body.headBone.position.y - this.body.tr.position.y < 2.7f)
|
|
{
|
|
vector2.y += 2f;
|
|
}
|
|
this.thisTarget.position = vector2;
|
|
}
|
|
if (Links.x.dialogue.noBobbling)
|
|
{
|
|
this.dot = -1f;
|
|
}
|
|
}
|
|
if (this.body.character)
|
|
{
|
|
Vector3 vector3 = Vector3.Lerp(this.thisTarget.position, new Vector3(this.target.position.x, this.body.headBone.position.y, this.target.position.z), num * this.speedTarget);
|
|
Vector3 forward = this.body.character.tr.forward;
|
|
Vector3 vector4 = Vector3.Normalize(new Vector3(vector3.x, this.body.character.tr.position.y, vector3.z) - this.body.character.tr.position);
|
|
this.dot = Vector3.Dot(forward, vector4);
|
|
if (this.dot < -0.5f)
|
|
{
|
|
Vector3 vector5 = this.body.character.tr.right;
|
|
vector3 += vector5 * 2f;
|
|
vector4 = Vector3.Normalize(new Vector3(vector3.x, this.body.character.tr.position.y, vector3.z) - this.body.character.tr.position);
|
|
this.dot = Vector3.Dot(forward, vector4);
|
|
if (!flag)
|
|
{
|
|
this.thisTarget.position = vector3;
|
|
}
|
|
}
|
|
else if (!flag)
|
|
{
|
|
this.thisTarget.position = vector3;
|
|
}
|
|
if ((this.body.character.animID != 0 && !Records.x.dialogue) || this.body.character.animator.GetBool("Combat"))
|
|
{
|
|
this.dot = -1f;
|
|
}
|
|
if (this.body.character.IsWalking())
|
|
{
|
|
this.dot = -1f;
|
|
}
|
|
}
|
|
else if (!flag)
|
|
{
|
|
this.thisTarget.position = Vector3.Lerp(this.thisTarget.position, new Vector3(this.target.position.x, this.body.headBone.position.y, this.target.position.z), num * this.speedTarget);
|
|
}
|
|
if (!flag)
|
|
{
|
|
this.SetTargetYToHeadBone();
|
|
}
|
|
if (this.delay == 0f || Time.timeSinceLevelLoad > this.startTime + this.delay)
|
|
{
|
|
float num4 = 1f;
|
|
if (this.dot < 0.25f)
|
|
{
|
|
num4 = this.lookIK.solver.IKPositionWeight;
|
|
}
|
|
if (this.dot == -1f)
|
|
{
|
|
num4 = 0f;
|
|
}
|
|
if (this.body.inMenu)
|
|
{
|
|
num4 *= 0.8f;
|
|
}
|
|
this.lookIK.solver.IKPositionWeight = Mathf.Lerp(this.lookIK.solver.IKPositionWeight, num4, num * this.speedWeight);
|
|
}
|
|
if (this.targetTimer > 0f && Time.timeSinceLevelLoad > this.startTime + this.targetTimer + this.delay)
|
|
{
|
|
this.hasTarget = false;
|
|
}
|
|
}
|
|
}
|
|
if (!this.hasTarget && this.lookIK.solver.IKPositionWeight > 0.01f)
|
|
{
|
|
this.lookIK.solver.IKPositionWeight = Mathf.Lerp(this.lookIK.solver.IKPositionWeight, 0f, num * this.speedFall);
|
|
return;
|
|
}
|
|
if (!this.hasTarget)
|
|
{
|
|
this.SetAsActive(false);
|
|
}
|
|
}
|
|
|
|
// Token: 0x060007E4 RID: 2020 RVA: 0x000AEA1C File Offset: 0x000ACC1C
|
|
public float AngleDir(Vector3 fwd, Vector3 targetDir, Vector3 up)
|
|
{
|
|
float num = Vector3.Dot(Vector3.Cross(fwd, targetDir), up);
|
|
if ((double)num > 0.0)
|
|
{
|
|
return 1f;
|
|
}
|
|
if ((double)num < 0.0)
|
|
{
|
|
return -1f;
|
|
}
|
|
return 0f;
|
|
}
|
|
|
|
// Token: 0x04000C3F RID: 3135
|
|
private Body body;
|
|
|
|
// Token: 0x04000C40 RID: 3136
|
|
private LookAtIK lookIK;
|
|
|
|
// Token: 0x04000C41 RID: 3137
|
|
public Transform target;
|
|
|
|
// Token: 0x04000C42 RID: 3138
|
|
public bool hasTarget;
|
|
|
|
// Token: 0x04000C43 RID: 3139
|
|
public float targetTimer;
|
|
|
|
// Token: 0x04000C44 RID: 3140
|
|
private float startTime;
|
|
|
|
// Token: 0x04000C45 RID: 3141
|
|
public float delay;
|
|
|
|
// Token: 0x04000C46 RID: 3142
|
|
public Transform thisTarget;
|
|
|
|
// Token: 0x04000C47 RID: 3143
|
|
public Transform bodyTarget;
|
|
|
|
// Token: 0x04000C48 RID: 3144
|
|
private float speedTarget;
|
|
|
|
// Token: 0x04000C49 RID: 3145
|
|
private float speedWeight;
|
|
|
|
// Token: 0x04000C4A RID: 3146
|
|
private float speedFall;
|
|
|
|
// Token: 0x04000C4B RID: 3147
|
|
private bool left;
|
|
|
|
// Token: 0x04000C4C RID: 3148
|
|
private bool right;
|
|
|
|
// Token: 0x04000C4D RID: 3149
|
|
public float dot;
|
|
|
|
// Token: 0x04000C4E RID: 3150
|
|
private float lastDialogueUpdateTime;
|
|
}
|