| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | using Fort23.Core;#if !COMBAT_SERVERusing UnityEngine;#endifpublic class ParabolaPath : CObject{    public Vector2 startPos;    public Vector2 targetPos;    private Vector2 posOff;    private float gravity = (float)(-19);    public float addH;    public ParabolaPath()    {    }    public ParabolaPath(Vector2 startPos, Vector2 targetPos)    {        SetPos(startPos, targetPos);    }    // public void SetPos(Vector2 startPos, Vector2 targetPos)    // {    //     SetPos(new Vector2(startPos), new Vector2(targetPos));    // }    public void SetPos(Vector3 startPos, Vector3 targetPos)    {        SetPos(startPos, targetPos);    }    public void SetPos(Vector2 startPos, Vector2 targetPos)    {        this.startPos = startPos;        this.targetPos = targetPos;        posOff = this.targetPos - this.startPos;    }    public Vector2 GetPos(float t)    {        t = Mathf.Clamp(t, 0, 1);        float h = posOff.y + posOff.magnitude / 2 + addH;        float v0;        float angle;        float time;        CalculatePathWithHeight(posOff, h, out v0, out angle, out time);        return CalculatePath(v0, angle, time, t);    }    private Vector2 CalculatePath(float v0, float angle, float step, float t)    {        float v = step * t;        float x = v0 * v * Mathf.Cos(angle);        float y = v0 * v * Mathf.Sin(angle) - 0.5f * -gravity * Mathf.Pow(v, (float)2);        return new Vector2(x, y) + startPos;    }    private float QuadraticEquation(float a, float b, float c, float sign)    {        float v = b * b - 4 * a * c;        v = Mathf.Max((float)0.01f, v);        return (-b + sign * Mathf.Sqrt(v)) / (2 * a);    }    private void CalculatePathWithHeight(Vector2 targetPos, float h, out float v0, out float angle, out float time)    {        h = Mathf.Max((float)0.01f, h) * 0.5f;        float xt = targetPos.x;        float yt = targetPos.y;        float g = -gravity;        float a = (-0.5f * g);        float c = -yt;        float b = Mathf.Sqrt(2 * g * h);        float tplus = QuadraticEquation(a, b, c, (float)1);        float tmin = QuadraticEquation(a, b, c, (float)(-1));        time = tplus > tmin ? tplus : tmin;        angle = Mathf.Atan(b * time / xt);        v0 = b / Mathf.Sin(angle);    }    public override void ActiveObj()    {            }    public override void DormancyObj()    {          }}
 |