248 lines
6.7 KiB
C#
248 lines
6.7 KiB
C#
using UnityEngine;
|
|
|
|
public class PoweredUmbrella : BasePart
|
|
{
|
|
private const float MinScale = 0.4f;
|
|
|
|
public float m_force;
|
|
|
|
public bool m_enabled;
|
|
|
|
private float m_maximumForce;
|
|
|
|
private bool m_isMotored;
|
|
|
|
private GameObject m_visualization;
|
|
|
|
private GameObject m_openSprite;
|
|
|
|
private GameObject m_closedSprite;
|
|
|
|
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_isConnected;
|
|
|
|
private float MaxScale = 1f;
|
|
|
|
public override bool CanBeEnabled()
|
|
{
|
|
return m_isConnected;
|
|
}
|
|
|
|
public override bool HasOnOffToggle()
|
|
{
|
|
return m_isMotored;
|
|
}
|
|
|
|
public override bool IsEnabled()
|
|
{
|
|
return m_enabled;
|
|
}
|
|
|
|
public override bool IsPowered()
|
|
{
|
|
return m_isMotored;
|
|
}
|
|
|
|
public override Direction EffectDirection()
|
|
{
|
|
return BasePart.Rotate(Direction.Up, m_gridRotation);
|
|
}
|
|
|
|
public override void Awake()
|
|
{
|
|
base.Awake();
|
|
m_visualization = base.transform.FindChild("UmbrellaVisualization").gameObject;
|
|
m_openSprite = m_visualization.transform.FindChild("OpenSprite").gameObject;
|
|
m_closedSprite = m_visualization.transform.FindChild("ClosedSprite").gameObject;
|
|
m_closedPosition = -0.05f * Vector3.up;
|
|
m_closedPosition.z = m_visualization.transform.localPosition.z;
|
|
m_openPosition = 0.25f * Vector3.up;
|
|
m_openPosition.z = m_visualization.transform.localPosition.z;
|
|
m_closedSprite.collider.enabled = false;
|
|
m_closedSprite.collider.isTrigger = true;
|
|
m_closedSprite.renderer.enabled = false;
|
|
}
|
|
|
|
public override void InitializeEngine()
|
|
{
|
|
m_isConnected = base.contraption.ComponentPartCount(base.ConnectedComponent) > 1;
|
|
float num = base.contraption.GetEnginePowerFactor(this);
|
|
if (num > 1f)
|
|
{
|
|
num = Mathf.Pow(num, 0.75f);
|
|
}
|
|
if (base.contraption.HasComponentEngine(base.ConnectedComponent))
|
|
{
|
|
m_isMotored = true;
|
|
m_openPosition = 0.25f * Vector3.up;
|
|
float num2 = 7f * num;
|
|
m_moveTime = 1f / num2;
|
|
MaxScale = 1.1f;
|
|
}
|
|
else
|
|
{
|
|
m_isMotored = true;
|
|
m_openPosition = 0.25f * Vector3.up;
|
|
float num3 = 7f * num;
|
|
m_moveTime = 1f / num3;
|
|
MaxScale = 1.1f;
|
|
num *= 0.5f;
|
|
}
|
|
if (m_open)
|
|
{
|
|
m_visualization.transform.localPosition = m_openPosition;
|
|
Vector3 localScale = m_visualization.transform.localScale;
|
|
localScale.x = MaxScale;
|
|
localScale.y = 1f;
|
|
m_visualization.transform.localScale = localScale;
|
|
if (m_isMotored)
|
|
{
|
|
m_timer = 0.45f * m_moveTime;
|
|
float a = m_timer / m_moveTime;
|
|
a = Mathf.Min(a, 1f);
|
|
a = Mathf.Min(a, 1f);
|
|
Vector3 localPosition = Vector3.Slerp(m_openPosition, m_closedPosition, a);
|
|
localScale = m_visualization.transform.localScale;
|
|
a = Mathf.Pow(a, 3f);
|
|
localScale.x = a * 0.4f + (1f - a) * MaxScale;
|
|
localScale.y = a * 2f + (1f - a) * 1f;
|
|
localPosition.y -= 0.45f * (localScale.y - 1f);
|
|
m_visualization.transform.localScale = localScale;
|
|
m_visualization.transform.localPosition = localPosition;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_visualization.transform.localPosition = m_closedPosition;
|
|
}
|
|
m_maximumForce = m_force * num;
|
|
}
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
if (!base.contraption || !base.contraption.isRunning)
|
|
{
|
|
return;
|
|
}
|
|
if (m_open)
|
|
{
|
|
Vector3 vector = base.transform.position + 0.2f * base.transform.up;
|
|
Vector3 vector2 = base.rigidbody.velocity - base.WindVelocity;
|
|
base.WindVelocity = Vector3.zero;
|
|
float num = Vector3.Dot(base.transform.up, vector2.normalized);
|
|
float magnitude = (num * vector2).magnitude;
|
|
float num2 = Mathf.Sign(Vector3.Cross(vector2, base.transform.right).z);
|
|
float num3 = num2 * 1f * magnitude * magnitude;
|
|
Vector3 up = base.transform.up;
|
|
base.rigidbody.AddForceAtPosition(num3 * up, vector, ForceMode.Force);
|
|
Debug.DrawRay(vector, 0.1f * num3 * up);
|
|
num = Vector3.Dot(base.transform.right, vector2.normalized);
|
|
magnitude = (num * vector2).magnitude;
|
|
num2 = Mathf.Sign(Vector3.Cross(base.transform.up, vector2).z);
|
|
num3 = num2 * 0.5f * magnitude * magnitude;
|
|
up = base.transform.right;
|
|
base.rigidbody.AddForceAtPosition(num3 * up, vector, ForceMode.Force);
|
|
Debug.DrawRay(vector, 0.1f * num3 * up);
|
|
}
|
|
if (!m_enabled)
|
|
{
|
|
return;
|
|
}
|
|
m_timer += Time.deltaTime;
|
|
if (m_open)
|
|
{
|
|
float a = m_timer / m_moveTime;
|
|
a = Mathf.Min(a, 1f);
|
|
Vector3 localPosition = Vector3.Slerp(m_openPosition, m_closedPosition, a);
|
|
Vector3 localScale = m_visualization.transform.localScale;
|
|
a = Mathf.Pow(a, 3f);
|
|
localScale.x = a * 0.4f + (1f - a) * MaxScale;
|
|
localScale.y = a * 2f + (1f - a) * 1f;
|
|
localPosition.y -= 0.45f * (localScale.y - 1f);
|
|
m_visualization.transform.localScale = localScale;
|
|
m_visualization.transform.localPosition = localPosition;
|
|
float maximumForce = m_maximumForce;
|
|
base.rigidbody.AddForce(maximumForce * base.transform.up, ForceMode.Force);
|
|
Debug.DrawRay(base.transform.position, maximumForce * base.transform.up);
|
|
}
|
|
else
|
|
{
|
|
float a2 = m_timer / m_moveTime;
|
|
a2 = Mathf.Min(a2, 1f);
|
|
Vector3 localPosition2 = Vector3.Slerp(m_closedPosition, m_openPosition, a2);
|
|
Vector3 localScale2 = m_visualization.transform.localScale;
|
|
a2 = Mathf.Pow(a2, 6f);
|
|
localScale2.x = a2 * MaxScale + (1f - a2) * 0.4f;
|
|
localScale2.y = a2 * 1f + (1f - a2) * 2f;
|
|
localPosition2.y -= 0.45f * (localScale2.y - 1f);
|
|
m_visualization.transform.localScale = localScale2;
|
|
m_visualization.transform.localPosition = localPosition2;
|
|
float num4 = -0.2f * m_maximumForce;
|
|
base.rigidbody.AddForce(num4 * base.transform.up, ForceMode.Force);
|
|
Debug.DrawRay(base.transform.position, 0.1f * num4 * base.transform.up);
|
|
}
|
|
if (m_timer > m_moveTime)
|
|
{
|
|
m_timer = 0f;
|
|
m_open = !m_open;
|
|
if (!m_isMotored)
|
|
{
|
|
m_enabled = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void ProcessTouch()
|
|
{
|
|
if (m_isConnected || m_enabled)
|
|
{
|
|
SetEnabled(!m_enabled);
|
|
}
|
|
}
|
|
|
|
public override void SetEnabled(bool enabled)
|
|
{
|
|
m_enabled = enabled;
|
|
if (m_isMotored)
|
|
{
|
|
base.contraption.UpdateEngineStates(base.ConnectedComponent);
|
|
}
|
|
}
|
|
|
|
private void Open(bool open)
|
|
{
|
|
if (m_open != open)
|
|
{
|
|
m_open = open;
|
|
if (open)
|
|
{
|
|
m_openSprite.renderer.enabled = true;
|
|
m_openSprite.collider.enabled = true;
|
|
m_openSprite.collider.isTrigger = false;
|
|
m_closedSprite.renderer.enabled = false;
|
|
m_closedSprite.collider.enabled = false;
|
|
m_closedSprite.collider.isTrigger = true;
|
|
m_visualization.transform.localPosition = m_openPosition;
|
|
}
|
|
else
|
|
{
|
|
m_openSprite.renderer.enabled = false;
|
|
m_openSprite.collider.enabled = false;
|
|
m_openSprite.collider.isTrigger = true;
|
|
m_closedSprite.renderer.enabled = true;
|
|
m_closedSprite.collider.enabled = true;
|
|
m_closedSprite.collider.isTrigger = false;
|
|
m_visualization.transform.localPosition = m_closedPosition;
|
|
}
|
|
}
|
|
}
|
|
}
|