2024-05-21 19:10:17 +01:00
using SPT.Common.Http ;
using SPT.Custom.Airdrops.Models ;
2023-03-03 18:52:31 +00:00
using EFT ;
using EFT.Airdrop ;
using Newtonsoft.Json ;
using System ;
using System.Collections.Generic ;
using System.Linq ;
using UnityEngine ;
using Random = UnityEngine . Random ;
2024-05-21 19:10:17 +01:00
namespace SPT.Custom.Airdrops.Utils
2023-03-03 18:52:31 +00:00
{
public static class AirdropUtil
{
public static AirdropConfigModel GetConfigFromServer ( )
{
string json = RequestHandler . GetJson ( "/singleplayer/airdrop/config" ) ;
return JsonConvert . DeserializeObject < AirdropConfigModel > ( json ) ;
}
public static int ChanceToSpawn ( GameWorld gameWorld , AirdropConfigModel config , bool isFlare )
{
// Flare summoned airdrops are guaranteed
if ( isFlare )
{
return 100 ;
}
2023-07-07 10:37:47 +01:00
// Get players current location
string playerLocation = gameWorld . MainPlayer . Location ;
2023-03-03 18:52:31 +00:00
2023-07-07 10:37:47 +01:00
int result = 0 ;
switch ( playerLocation . ToLower ( ) )
2023-03-03 18:52:31 +00:00
{
case "bigmap" :
2023-07-07 10:37:47 +01:00
{
result = config . AirdropChancePercent . Bigmap ;
break ;
}
2023-03-03 18:52:31 +00:00
case "interchange" :
2023-07-07 10:37:47 +01:00
{
result = config . AirdropChancePercent . Interchange ;
break ;
}
2023-03-03 18:52:31 +00:00
case "rezervbase" :
2023-07-07 10:37:47 +01:00
{
result = config . AirdropChancePercent . Reserve ;
break ;
}
2023-03-03 18:52:31 +00:00
case "shoreline" :
2023-07-07 10:37:47 +01:00
{
result = config . AirdropChancePercent . Shoreline ;
break ;
}
2023-03-03 18:52:31 +00:00
case "woods" :
2023-07-07 10:37:47 +01:00
{
result = config . AirdropChancePercent . Woods ;
break ;
}
2023-03-03 18:52:31 +00:00
case "lighthouse" :
2023-07-07 10:37:47 +01:00
{
result = config . AirdropChancePercent . Lighthouse ;
break ;
}
2023-03-03 18:52:31 +00:00
case "tarkovstreets" :
2023-07-07 10:37:47 +01:00
{
result = config . AirdropChancePercent . TarkovStreets ;
break ;
}
default :
2024-05-20 13:51:52 +01:00
Debug . LogError ( $"[SPT-AIRDROPS]: Map with name {playerLocation} not handled, defaulting spawn chance to 25%" ) ;
2023-07-07 10:37:47 +01:00
result = 25 ;
2023-03-03 18:52:31 +00:00
break ;
}
return result ;
}
2023-07-07 10:37:47 +01:00
private static bool ShouldAirdropOccur ( int dropChance , List < AirdropPoint > airdropPoints )
2023-03-03 18:52:31 +00:00
{
return airdropPoints . Count > 0 & & Random . Range ( 0 , 100 ) < = dropChance ;
}
public static AirdropParametersModel InitAirdropParams ( GameWorld gameWorld , bool isFlare )
{
var serverConfig = GetConfigFromServer ( ) ;
var allAirdropPoints = LocationScene . GetAll < AirdropPoint > ( ) . ToList ( ) ;
2024-01-15 19:27:59 +02:00
var playerPosition = ( ( IPlayer ) gameWorld . MainPlayer ) . Position ;
2023-03-03 18:52:31 +00:00
var flareAirdropPoints = new List < AirdropPoint > ( ) ;
var dropChance = ChanceToSpawn ( gameWorld , serverConfig , isFlare ) ;
2023-07-07 10:37:47 +01:00
var flareSpawnRadiusDistance = 100f ;
2023-03-03 18:52:31 +00:00
if ( isFlare & & allAirdropPoints . Count > 0 )
{
foreach ( AirdropPoint point in allAirdropPoints )
{
2023-07-07 10:37:47 +01:00
if ( Vector3 . Distance ( playerPosition , point . transform . position ) < = flareSpawnRadiusDistance )
2023-03-03 18:52:31 +00:00
{
flareAirdropPoints . Add ( point ) ;
}
}
}
if ( flareAirdropPoints . Count = = 0 & & isFlare )
{
2024-05-20 13:51:52 +01:00
Debug . LogError ( $"[SPT-AIRDROPS]: Airdrop called in by flare, Unable to find an airdropPoint within {flareSpawnRadiusDistance}m, defaulting to normal drop" ) ;
2023-03-03 18:52:31 +00:00
flareAirdropPoints . Add ( allAirdropPoints . OrderBy ( _ = > Guid . NewGuid ( ) ) . FirstOrDefault ( ) ) ;
}
return new AirdropParametersModel ( )
{
Config = serverConfig ,
AirdropAvailable = ShouldAirdropOccur ( dropChance , allAirdropPoints ) ,
DistanceTraveled = 0f ,
DistanceToTravel = 8000f ,
Timer = 0 ,
PlaneSpawned = false ,
BoxSpawned = false ,
DropHeight = Random . Range ( serverConfig . PlaneMinFlyHeight , serverConfig . PlaneMaxFlyHeight ) ,
TimeToStart = isFlare
? 5
: Random . Range ( serverConfig . AirdropMinStartTimeSeconds , serverConfig . AirdropMaxStartTimeSeconds ) ,
RandomAirdropPoint = isFlare & & allAirdropPoints . Count > 0
? flareAirdropPoints . OrderBy ( _ = > Guid . NewGuid ( ) ) . First ( ) . transform . position
: allAirdropPoints . OrderBy ( _ = > Guid . NewGuid ( ) ) . First ( ) . transform . position
} ;
}
}
}