rise-and-swine/Assets/Scripts/Assembly-CSharp/PoweredUmbrella.cs
2023-02-25 23:04:03 -05:00

209 lines
5.8 KiB
C#

using System;
using UnityEngine;
public class PoweredUmbrella : BasePart
{
public override bool CanBeEnabled()
{
return this.m_hasPower;
}
public override bool HasOnOffToggle()
{
return true;
}
public override bool IsEnabled()
{
return this.m_enabled;
}
public override bool IsPowered()
{
return true;
}
public override BasePart.Direction EffectDirection()
{
return BasePart.Rotate(BasePart.Direction.Up, this.m_gridRotation);
}
public override void Awake()
{
base.Awake();
this.m_visualization = base.transform.Find("UmbrellaVisualization").gameObject;
this.m_closedPosition = -0.05f * Vector3.up;
this.m_closedPosition.z = this.m_visualization.transform.localPosition.z;
this.m_openPosition = 0.25f * Vector3.up;
this.m_openPosition.z = this.m_visualization.transform.localPosition.z;
}
public override void InitializeEngine()
{
float num = base.contraption.GetEnginePowerFactor(this);
this.m_hasPower = (num > 0f);
if (num > 1f)
{
num = Mathf.Pow(num, 0.75f);
}
if (base.contraption.HasComponentEngine(base.ConnectedComponent))
{
this.m_openPosition = 0.25f * Vector3.up;
this.m_openPosition.z = this.m_visualization.transform.localPosition.z;
float num2 = 7f * num;
this.m_moveTime = 1f / num2;
this.MaxScale = 1.1f;
}
else
{
this.m_openPosition = 0.25f * Vector3.up;
this.m_openPosition.z = this.m_visualization.transform.localPosition.z;
float num3 = 7f * num;
this.m_moveTime = 1f / num3;
this.MaxScale = 1.1f;
num *= 0.5f;
}
this.m_maximumForce = this.m_force * num;
}
public override void Initialize()
{
base.Initialize();
if (this.m_open)
{
this.m_visualization.transform.localPosition = this.m_openPosition;
Vector3 localScale = this.m_visualization.transform.localScale;
localScale.x = this.MaxScale;
localScale.y = 1f;
this.m_visualization.transform.localScale = localScale;
this.m_timer = 0f;
float num = this.m_timer / this.m_moveTime;
num = Mathf.Min(num, 1f);
num = Mathf.Min(num, 1f);
Vector3 localPosition = Vector3.Lerp(this.m_openPosition, this.m_closedPosition, num);
localScale = this.m_visualization.transform.localScale;
num = Mathf.Pow(num, 3f);
localScale.x = num * 0.4f + (1f - num) * this.MaxScale;
localScale.y = num * 2f + (1f - num) * 1f;
localPosition.y -= 0.45f * (localScale.y - 1f);
this.m_visualization.transform.localScale = localScale;
this.m_visualization.transform.localPosition = localPosition;
}
else
{
this.m_visualization.transform.localPosition = this.m_closedPosition;
}
}
private void FixedUpdate()
{
if (!base.contraption || !base.contraption.IsRunning)
{
return;
}
if (this.m_open)
{
Vector3 position = base.transform.position + 0.2f * base.transform.up;
Vector3 vector = base.rigidbody.velocity - base.WindVelocity;
base.WindVelocity = Vector3.zero;
float d = Vector3.Dot(base.transform.up, vector.normalized);
float magnitude = (d * vector).magnitude;
float num = Mathf.Sign(Vector3.Cross(vector, base.transform.right).z);
float num2 = num * 1f * magnitude * magnitude;
if (Mathf.Abs(num2) > 60f)
{
num2 = 60f * Mathf.Sign(num2);
}
Vector3 a = base.transform.up;
base.rigidbody.AddForceAtPosition(num2 * a, position, ForceMode.Force);
d = Vector3.Dot(base.transform.right, vector.normalized);
magnitude = (d * vector).magnitude;
num = Mathf.Sign(Vector3.Cross(base.transform.up, vector).z);
num2 = num * 0.5f * magnitude * magnitude;
if (Mathf.Abs(num2) > 60f)
{
num2 = 60f * Mathf.Sign(num2);
}
a = base.transform.right;
base.rigidbody.AddForceAtPosition(num2 * a, position, ForceMode.Force);
}
if (this.m_enabled)
{
this.m_timer += Time.deltaTime;
if (this.m_open)
{
float num3 = this.m_timer / this.m_moveTime;
num3 = Mathf.Min(num3, 1f);
Vector3 localPosition = Vector3.Lerp(this.m_openPosition, this.m_closedPosition, num3);
Vector3 localScale = this.m_visualization.transform.localScale;
num3 = Mathf.Pow(num3, 3f);
localScale.x = num3 * 0.4f + (1f - num3) * this.MaxScale;
localScale.y = num3 * 2f + (1f - num3) * 1f;
localPosition.y -= 0.45f * (localScale.y - 1f);
this.m_visualization.transform.localScale = localScale;
this.m_visualization.transform.localPosition = localPosition;
float maximumForce = this.m_maximumForce;
base.rigidbody.AddForce(maximumForce * base.transform.up, ForceMode.Force);
}
else
{
float num4 = this.m_timer / this.m_moveTime;
num4 = Mathf.Min(num4, 1f);
Vector3 localPosition2 = Vector3.Lerp(this.m_closedPosition, this.m_openPosition, num4);
Vector3 localScale2 = this.m_visualization.transform.localScale;
num4 = Mathf.Pow(num4, 6f);
localScale2.x = num4 * this.MaxScale + (1f - num4) * 0.4f;
localScale2.y = num4 * 1f + (1f - num4) * 2f;
localPosition2.y -= 0.45f * (localScale2.y - 1f);
this.m_visualization.transform.localScale = localScale2;
this.m_visualization.transform.localPosition = localPosition2;
float d2 = -0.2f * this.m_maximumForce;
base.rigidbody.AddForce(d2 * base.transform.up, ForceMode.Force);
}
if (this.m_timer > this.m_moveTime)
{
this.m_timer = 0f;
this.m_open = !this.m_open;
}
}
}
protected override void OnTouch()
{
if (!this.m_hasPower && !this.m_enabled)
{
return;
}
this.SetEnabled(!this.m_enabled);
}
public override void SetEnabled(bool enabled)
{
this.m_enabled = enabled;
base.contraption.UpdateEngineStates(base.ConnectedComponent);
}
public float m_force;
public bool m_enabled;
private float m_maximumForce;
private GameObject m_visualization;
private bool m_open = true;
private float m_timer;
private float m_moveTime = 0.25f;
private Vector3 m_closedPosition;
private Vector3 m_openPosition;
private bool m_hasPower;
private const float MinScale = 0.4f;
private float MaxScale = 1f;
}