256 lines
6.6 KiB
C#
256 lines
6.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
// Token: 0x0200004B RID: 75
|
|
public class Rope : MonoBehaviour
|
|
{
|
|
// Token: 0x060008CB RID: 2251 RVA: 0x000BED5C File Offset: 0x000BCF5C
|
|
private void OnEnable()
|
|
{
|
|
if (!this.line)
|
|
{
|
|
this.line = base.gameObject.transform.GetChild(0).gameObject.GetComponent<LineRenderer>();
|
|
}
|
|
if (!this.end)
|
|
{
|
|
this.meshes.Clear();
|
|
foreach (object obj in base.transform.GetChild(0))
|
|
{
|
|
Transform transform = (Transform)obj;
|
|
if (transform.gameObject.name.Contains("End") || transform.gameObject.name.Contains("end"))
|
|
{
|
|
this.end = transform;
|
|
}
|
|
if (transform.gameObject.name.Contains("Start") || transform.gameObject.name.Contains("start"))
|
|
{
|
|
this.start = transform;
|
|
}
|
|
MeshRenderer component = transform.gameObject.GetComponent<MeshRenderer>();
|
|
if (component)
|
|
{
|
|
this.meshes.Add(component);
|
|
}
|
|
}
|
|
}
|
|
if (!this.end || !this.start)
|
|
{
|
|
base.enabled = false;
|
|
this.on = false;
|
|
this.line.enabled = false;
|
|
return;
|
|
}
|
|
this.on = false;
|
|
this.line.enabled = false;
|
|
}
|
|
|
|
// Token: 0x060008CC RID: 2252 RVA: 0x000BEED8 File Offset: 0x000BD0D8
|
|
private void OnDisable()
|
|
{
|
|
this.canUpdate = false;
|
|
this.character = null;
|
|
}
|
|
|
|
// Token: 0x060008CD RID: 2253 RVA: 0x000BEEE8 File Offset: 0x000BD0E8
|
|
public void SetupCharacter(Character c, float leashDistance)
|
|
{
|
|
this.character = c;
|
|
this.neck = this.character.body.GetFoot();
|
|
this.character.leashed = true;
|
|
this.character.leashDistance = leashDistance;
|
|
this.character.leashCenter = this.start.position;
|
|
this.canUpdate = true;
|
|
}
|
|
|
|
// Token: 0x060008CE RID: 2254 RVA: 0x000BEF48 File Offset: 0x000BD148
|
|
private void LateUpdate()
|
|
{
|
|
if (this.canUpdate)
|
|
{
|
|
if (!this.character)
|
|
{
|
|
base.enabled = false;
|
|
this.line.enabled = false;
|
|
this.on = false;
|
|
return;
|
|
}
|
|
if (this.character.visible == 0 || !this.character.leashed || this.character.inactive)
|
|
{
|
|
if (!this.on)
|
|
{
|
|
goto IL_00FB;
|
|
}
|
|
this.line.enabled = false;
|
|
this.on = false;
|
|
using (List<MeshRenderer>.Enumerator enumerator = this.meshes.GetEnumerator())
|
|
{
|
|
while (enumerator.MoveNext())
|
|
{
|
|
MeshRenderer meshRenderer = enumerator.Current;
|
|
meshRenderer.enabled = false;
|
|
}
|
|
goto IL_00FB;
|
|
}
|
|
}
|
|
if (!this.on)
|
|
{
|
|
this.on = true;
|
|
this.line.enabled = true;
|
|
foreach (MeshRenderer meshRenderer2 in this.meshes)
|
|
{
|
|
meshRenderer2.enabled = true;
|
|
}
|
|
}
|
|
IL_00FB:
|
|
if (this.on)
|
|
{
|
|
this.end.position = this.neck.position;
|
|
this.line.positionCount = 2;
|
|
this.line.SetPosition(0, this.start.position);
|
|
this.line.SetPosition(1, this.end.position);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Token: 0x060008CF RID: 2255 RVA: 0x000BF0C4 File Offset: 0x000BD2C4
|
|
public void DrawArc(Vector3 arcEndPosition)
|
|
{
|
|
this.arcTarget = arcEndPosition;
|
|
this.arcPoints.Clear();
|
|
Vector3 position = this.start.position;
|
|
this.initialVelocity = 1f;
|
|
Quaternion quaternion = this.GetBearing(position, this.arcTarget);
|
|
this.start.rotation = quaternion;
|
|
this.CalculateTrajectory();
|
|
}
|
|
|
|
// Token: 0x060008D0 RID: 2256 RVA: 0x000BF11C File Offset: 0x000BD31C
|
|
public Quaternion GetBearing(Vector3 start, Vector3 targetPt)
|
|
{
|
|
this.bearing = Quaternion.Euler(Vector3.zero);
|
|
Vector3 vector = targetPt - start;
|
|
float num = Mathf.Sqrt(Mathf.Pow(vector.x, 2f) + Mathf.Pow(vector.z, 2f));
|
|
float num2 = -vector.y;
|
|
float num3 = this.gravity * (this.gravity * Mathf.Pow(num, 2f) + 2f * num2 * Mathf.Pow(this.initialVelocity, 2f));
|
|
float num4 = Mathf.Sqrt(Mathf.Pow(this.initialVelocity, 4f) - num3);
|
|
bool flag = float.IsNaN(num4);
|
|
if (!flag)
|
|
{
|
|
float num5 = (Mathf.Pow(this.initialVelocity, 2f) + (float)this.trajectoryModifier * num4) / (this.gravity * num);
|
|
float num6 = 57.29578f * Mathf.Atan(num5);
|
|
this.bearing = Quaternion.LookRotation(vector);
|
|
Vector3 eulerAngles = this.bearing.eulerAngles;
|
|
eulerAngles.x = num6;
|
|
this.bearing.eulerAngles = eulerAngles;
|
|
}
|
|
if (flag)
|
|
{
|
|
this.initialVelocity += 1f;
|
|
this.GetBearing(start, targetPt);
|
|
}
|
|
return this.bearing;
|
|
}
|
|
|
|
// Token: 0x060008D1 RID: 2257 RVA: 0x000BF250 File Offset: 0x000BD450
|
|
public void CalculateTrajectory()
|
|
{
|
|
RaycastHit raycastHit = default(RaycastHit);
|
|
this.line.positionCount = this.maximumIterations;
|
|
Vector3 position = this.start.position;
|
|
float num = -(1f / this.trajectoryPrecision);
|
|
bool flag = false;
|
|
Vector3 position2 = this.start.position;
|
|
for (int i = 0; i < this.maximumIterations; i++)
|
|
{
|
|
if (!flag)
|
|
{
|
|
num += 1f / this.trajectoryPrecision;
|
|
Vector3 vector = position + this.start.forward * this.initialVelocity * num + 0.5f * this.gravity2 * Mathf.Pow(num, 2f);
|
|
float num2 = vector.y - position2.y;
|
|
vector.y = position2.y - num2;
|
|
Vector3 vector2 = vector;
|
|
if (Physics.Raycast(new Vector3(vector.x, position2.y, vector.z), Vector3.up * -1f, out raycastHit, 5f, 4194449))
|
|
{
|
|
Vector3 point = raycastHit.point;
|
|
if (point.y > vector2.y)
|
|
{
|
|
vector2.y = point.y;
|
|
}
|
|
}
|
|
if ((vector - this.arcTarget).sqrMagnitude < 1f || vector2.y > position2.y)
|
|
{
|
|
flag = true;
|
|
this.line.SetPosition(i, this.end.position);
|
|
this.line.positionCount = i + 1;
|
|
}
|
|
else
|
|
{
|
|
this.line.SetPosition(i, vector2);
|
|
}
|
|
this.arcPoints.Add(vector);
|
|
}
|
|
}
|
|
this.arcPoints.Add(this.arcTarget);
|
|
}
|
|
|
|
// Token: 0x04000DEA RID: 3562
|
|
private LineRenderer line;
|
|
|
|
// Token: 0x04000DEB RID: 3563
|
|
public Transform end;
|
|
|
|
// Token: 0x04000DEC RID: 3564
|
|
public Transform start;
|
|
|
|
// Token: 0x04000DED RID: 3565
|
|
public Character character;
|
|
|
|
// Token: 0x04000DEE RID: 3566
|
|
private bool on;
|
|
|
|
// Token: 0x04000DEF RID: 3567
|
|
private bool canUpdate;
|
|
|
|
// Token: 0x04000DF0 RID: 3568
|
|
private Transform neck;
|
|
|
|
// Token: 0x04000DF1 RID: 3569
|
|
private List<MeshRenderer> meshes = new List<MeshRenderer>();
|
|
|
|
// Token: 0x04000DF2 RID: 3570
|
|
private float gravity = -9.81f;
|
|
|
|
// Token: 0x04000DF3 RID: 3571
|
|
public float initialVelocity = 1f;
|
|
|
|
// Token: 0x04000DF4 RID: 3572
|
|
private Quaternion bearing;
|
|
|
|
// Token: 0x04000DF5 RID: 3573
|
|
public int trajectoryModifier = -1;
|
|
|
|
// Token: 0x04000DF6 RID: 3574
|
|
private Vector3 projectileVelocity;
|
|
|
|
// Token: 0x04000DF7 RID: 3575
|
|
private Vector3 arcTarget;
|
|
|
|
// Token: 0x04000DF8 RID: 3576
|
|
public float trajectoryPrecision = 100f;
|
|
|
|
// Token: 0x04000DF9 RID: 3577
|
|
public int maximumIterations = 500;
|
|
|
|
// Token: 0x04000DFA RID: 3578
|
|
public Vector3 gravity2 = new Vector3(0f, -9.81f, 0f);
|
|
|
|
// Token: 0x04000DFB RID: 3579
|
|
private List<Vector3> arcPoints = new List<Vector3>();
|
|
|
|
// Token: 0x04000DFC RID: 3580
|
|
private int currentArcIndex;
|
|
|
|
// Token: 0x04000DFD RID: 3581
|
|
private Vector3 previousPosition;
|
|
}
|