0
0
mirror of https://github.com/sp-tarkov/modules.git synced 2025-02-13 09:10:44 -05:00
2024-05-21 19:10:17 +01:00

137 lines
5.2 KiB
C#

using System.Collections;
using System.Threading.Tasks;
using Comfort.Common;
using EFT;
using EFT.SynchronizableObjects;
using UnityEngine;
namespace SPT.Custom.Airdrops
{
public class AirdropPlane : MonoBehaviour
{
private const string PLANE_PATH = "assets/content/location_objects/lootable/prefab/il76md-90.prefab";
private const float RADIUS_TO_PICK_RANDOM_POINT = 3000f;
private AirplaneSynchronizableObject airplaneSync;
private float speed;
private float distanceToDrop;
private float flaresCooldown;
private bool flaresDeployed;
private bool headingChanged;
public static async Task<AirdropPlane> Init(Vector3 airdropPoint, int dropHeight, float planeVolume, float speed)
{
var instance = (await LoadPlane()).AddComponent<AirdropPlane>();
instance.airplaneSync = instance.GetComponent<AirplaneSynchronizableObject>();
instance.airplaneSync.SetLogic(new AirplaneLogicClass());
instance.SetPosition(dropHeight, airdropPoint);
instance.SetAudio(planeVolume);
instance.speed = speed;
instance.gameObject.SetActive(false);
return instance;
}
private static async Task<GameObject> LoadPlane()
{
var easyAssets = Singleton<PoolManager>.Instance.EasyAssets;
await easyAssets.Retain(PLANE_PATH, null, null).LoadingJob;
var plane = Instantiate(easyAssets.GetAsset<GameObject>(PLANE_PATH));
return plane;
}
private void SetAudio(float planeVolume)
{
var airplaneAudio = gameObject.AddComponent<AudioSource>();
airplaneAudio.clip = airplaneSync.soundClip.Clip;
airplaneAudio.dopplerLevel = 1f;
airplaneAudio.outputAudioMixerGroup = Singleton<BetterAudio>.Instance.VeryStandartMixerGroup;
airplaneAudio.loop = true;
airplaneAudio.maxDistance = 2000;
airplaneAudio.minDistance = 1;
airplaneAudio.pitch = 0.5f;
airplaneAudio.priority = 128;
airplaneAudio.reverbZoneMix = 1;
airplaneAudio.rolloffMode = AudioRolloffMode.Custom;
airplaneAudio.spatialBlend = 1;
airplaneAudio.spread = 60;
airplaneAudio.volume = planeVolume;
airplaneAudio.Play();
}
private void SetPosition(int dropHeight, Vector3 airdropPoint)
{
var pointOnCircle = Random.insideUnitCircle.normalized * RADIUS_TO_PICK_RANDOM_POINT;
transform.position = new Vector3(pointOnCircle.x, dropHeight, pointOnCircle.y);
transform.LookAt(new Vector3(airdropPoint.x, dropHeight, airdropPoint.z));
}
public void ManualUpdate(float distance)
{
transform.Translate(Vector3.forward * (Time.deltaTime * speed));
distanceToDrop = distance;
UpdateFlaresLogic();
if (distance - 200f > 0f || headingChanged) return;
StartCoroutine(ChangeHeading());
headingChanged = true;
}
private void UpdateFlaresLogic()
{
if (flaresDeployed) return;
if (distanceToDrop > 0f && flaresCooldown <= Time.unscaledTime)
{
flaresCooldown = Time.unscaledTime + 4f;
StartCoroutine(DeployFlares(Random.Range(0.2f, 0.4f)));
}
if (distanceToDrop > 0f) return;
flaresDeployed = true;
StartCoroutine(DeployFlares(5f));
}
private IEnumerator DeployFlares(float emissionTime)
{
var projectile = Instantiate(airplaneSync.infraredCountermeasureParticles, transform);
projectile.transform.localPosition = new Vector3(0f, -5f, 0f);
var flares = projectile.GetComponentsInChildren<ParticleSystem>();
var endTime = Time.unscaledTime + emissionTime;
Singleton<GameWorld>.Instance.SynchronizableObjectLogicProcessor.AirdropManager.AddProjectile(projectile,
endTime + flares[0].main.duration + flares[0].main.startLifetime.Evaluate(1f));
while (endTime > Time.unscaledTime)
yield return null;
projectile.transform.parent = null;
foreach (var particleSystem in flares)
particleSystem.Stop();
}
private IEnumerator ChangeHeading()
{
var startingRotation = transform.eulerAngles;
var middleRotation = startingRotation + new Vector3(0f, 40f, -200f);
var endRotation = middleRotation + new Vector3(0f, 40f, 200f);
for (float i = 0; i < 1; i += Time.deltaTime / 25f)
{
var finalRotation = Vector3.Lerp(middleRotation, endRotation, EasingSmoothSquared(i));
transform.eulerAngles = Vector3.Lerp(startingRotation, finalRotation, EasingSmoothSquared(i));
yield return null;
}
}
private float EasingSmoothSquared(float x)
{
return x < 0.5 ? x * x * 2 : (1 - (1 - x) * (1 - x) * 2);
}
}
}