0
0
mirror of https://github.com/sp-tarkov/modules.git synced 2025-02-13 09:50:43 -05:00
modules/project/SPT.Custom/Airdrops/AirdropsManager.cs

138 lines
4.6 KiB
C#
Raw Normal View History

2024-05-21 19:10:17 +01:00
using SPT.Custom.Airdrops.Models;
using SPT.Custom.Airdrops.Utils;
2023-03-03 18:52:31 +00:00
using Comfort.Common;
using EFT;
using UnityEngine;
2024-05-21 19:10:17 +01:00
namespace SPT.Custom.Airdrops
2023-03-03 18:52:31 +00:00
{
public class AirdropsManager : MonoBehaviour
{
private AirdropPlane airdropPlane;
private AirdropBox airdropBox;
private ItemFactoryUtil factory;
public bool isFlareDrop;
private AirdropParametersModel airdropParameters;
2023-10-11 18:25:38 +01:00
public async void Start()
2023-03-03 18:52:31 +00:00
{
try
2023-05-26 21:18:30 +01:00
{
var gameWorld = Singleton<GameWorld>.Instance;
2023-05-26 21:18:30 +01:00
if (gameWorld == null)
{
Destroy(this);
}
2023-03-03 18:52:31 +00:00
airdropParameters = AirdropUtil.InitAirdropParams(gameWorld, isFlareDrop);
if (!airdropParameters.AirdropAvailable)
{
Destroy(this);
return;
}
}
catch
2023-03-03 18:52:31 +00:00
{
Debug.LogError("[SPT-AIRDROPS]: Unable to get config from server, airdrop won't occur");
2023-03-03 18:52:31 +00:00
Destroy(this);
throw;
2023-03-03 18:52:31 +00:00
}
try
{
2023-05-26 21:18:30 +01:00
airdropPlane = await AirdropPlane.Init(
airdropParameters.RandomAirdropPoint,
airdropParameters.DropHeight,
airdropParameters.Config.PlaneVolume,
airdropParameters.Config.PlaneSpeed);
2023-03-03 18:52:31 +00:00
airdropBox = await AirdropBox.Init(airdropParameters.Config.CrateFallSpeed);
factory = new ItemFactoryUtil();
}
catch
{
Debug.LogError("[SPT-AIRDROPS]: Unable to create plane or crate, airdrop won't occur");
2023-03-03 18:52:31 +00:00
Destroy(this);
throw;
}
SetDistanceToDrop();
}
public void FixedUpdate()
{
if (airdropParameters == null || airdropPlane == null || airdropBox == null) return;
2023-03-03 18:52:31 +00:00
try
2023-03-03 18:52:31 +00:00
{
airdropParameters.Timer += 0.02f;
2023-03-03 18:52:31 +00:00
if (airdropParameters.Timer >= airdropParameters.TimeToStart && !airdropParameters.PlaneSpawned)
{
StartPlane();
}
2023-05-26 21:18:30 +01:00
if (!airdropParameters.PlaneSpawned)
{
return;
}
2023-05-26 21:18:30 +01:00
if (airdropParameters.DistanceTraveled >= airdropParameters.DistanceToDrop && !airdropParameters.BoxSpawned)
{
StartBox();
BuildLootContainer(airdropParameters.Config);
}
if (airdropParameters.DistanceTraveled < airdropParameters.DistanceToTravel)
{
airdropParameters.DistanceTraveled += Time.deltaTime * airdropParameters.Config.PlaneSpeed;
var distanceToDrop = airdropParameters.DistanceToDrop - airdropParameters.DistanceTraveled;
airdropPlane.ManualUpdate(distanceToDrop);
}
else
{
Destroy(airdropPlane.gameObject);
Destroy(this);
}
2023-03-03 18:52:31 +00:00
}
catch
2023-03-03 18:52:31 +00:00
{
Debug.LogError("[SPT-AIRDROPS]: An error occurred during the airdrop FixedUpdate process");
Destroy(airdropBox.gameObject);
2023-03-03 18:52:31 +00:00
Destroy(airdropPlane.gameObject);
Destroy(this);
throw;
2023-03-03 18:52:31 +00:00
}
}
private void StartPlane()
{
airdropPlane.gameObject.SetActive(true);
airdropParameters.PlaneSpawned = true;
}
private void StartBox()
{
airdropParameters.BoxSpawned = true;
var pointPos = airdropParameters.RandomAirdropPoint;
var dropPos = new Vector3(pointPos.x, airdropParameters.DropHeight, pointPos.z);
airdropBox.gameObject.SetActive(true);
airdropBox.StartCoroutine(airdropBox.DropCrate(dropPos));
}
private void BuildLootContainer(AirdropConfigModel config)
2023-03-03 18:52:31 +00:00
{
var lootData = factory.GetLoot();
factory.BuildContainer(airdropBox.container, config, lootData.DropType);
factory.AddLoot(airdropBox.container, lootData);
2023-03-03 18:52:31 +00:00
}
private void SetDistanceToDrop()
{
airdropParameters.DistanceToDrop = Vector3.Distance(
2023-05-26 21:18:30 +01:00
new Vector3(airdropParameters.RandomAirdropPoint.x, airdropParameters.DropHeight, airdropParameters.RandomAirdropPoint.z),
2023-03-03 18:52:31 +00:00
airdropPlane.transform.position);
}
}
}