mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 09:50:43 -05:00
While continuing mod development with SPT 3.7.4 (namely for Questing Bots and SAIN), I found that the API I added to SPT 3.7.4 is unintuitive and clunky to use after the raid is done loading but before the countdown timer expires. With the current SPT code, calling `GetRemainingRaidSeconds()` or `GetRaidTimeRemainingFraction()` will result in an exception during this time unless you check `HasRaidStarted()` first. These changes will prevent those methods from throwing an exception unless you try calling them before a raid has finished loading (which should rarely happen). This allows mods to more easily do things using `GetRemainingRaidSeconds()` or `GetRaidTimeRemainingFraction()` before the countdown timer expires (i.e. cache bots). These changes only improve the robustness of the existing code and will not break any mods that use the existing API. Co-authored-by: dwesterwick <dwesterwick@yahoo.com> Co-authored-by: chomp <chomp@noreply.dev.sp-tarkov.com> Reviewed-on: SPT-AKI/Modules#45 Co-authored-by: DanW <danw@noreply.dev.sp-tarkov.com> Co-committed-by: DanW <danw@noreply.dev.sp-tarkov.com>
113 lines
4.9 KiB
C#
113 lines
4.9 KiB
C#
using Aki.SinglePlayer.Patches.ScavMode;
|
|
using EFT;
|
|
using System;
|
|
|
|
namespace Aki.SinglePlayer.Utils.InRaid
|
|
{
|
|
/// <summary>
|
|
/// Allow modders to access changes made to the current (or most recent) raid
|
|
/// </summary>
|
|
public static class RaidChangesUtil
|
|
{
|
|
/// <summary>
|
|
/// The UTC time when raid changes were last applied
|
|
/// </summary>
|
|
public static DateTime RaidChangesAppliedUtcTime { get; private set; } = DateTime.MinValue;
|
|
|
|
/// <summary>
|
|
/// If raid changes have been completed
|
|
/// </summary>
|
|
public static bool HaveChangesBeenApplied => RaidChangesAppliedUtcTime != DateTime.MinValue;
|
|
|
|
/// <summary>
|
|
/// If the most recent raid was a Scav run
|
|
/// </summary>
|
|
public static bool IsScavRaid { get; private set; } = false;
|
|
|
|
/// <summary>
|
|
/// The location ID of the map for the current (or most recent) raid
|
|
/// </summary>
|
|
public static string LocationId { get; private set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// The original escape time for the current (or most recent) raid, in minutes
|
|
/// </summary>
|
|
public static int OriginalEscapeTimeMinutes { get; private set; } = int.MaxValue;
|
|
|
|
/// <summary>
|
|
/// The original escape time for the current (or most recent) raid, in seconds
|
|
/// </summary>
|
|
public static int OriginalEscapeTimeSeconds => OriginalEscapeTimeMinutes * 60;
|
|
|
|
/// <summary>
|
|
/// The updated escape time for the current (or most recent) raid, in minutes
|
|
/// </summary>
|
|
public static int NewEscapeTimeMinutes { get; private set; } = int.MaxValue;
|
|
|
|
/// <summary>
|
|
/// The updated escape time for the current (or most recent) raid, in seconds
|
|
/// </summary>
|
|
public static int NewEscapeTimeSeconds => NewEscapeTimeMinutes * 60;
|
|
|
|
/// <summary>
|
|
/// The reduction in the escape time for the current (or most recent) raid, in minutes
|
|
/// </summary>
|
|
public static int RaidTimeReductionMinutes => OriginalEscapeTimeMinutes - NewEscapeTimeMinutes;
|
|
|
|
/// <summary>
|
|
/// The reduction in the escape time for the current (or most recent) raid, in seconds
|
|
/// </summary>
|
|
public static int RaidTimeReductionSeconds => RaidTimeReductionMinutes * 60;
|
|
|
|
/// <summary>
|
|
/// The fraction of raid time that will be remaining when you spawn into the map
|
|
/// </summary>
|
|
public static float RaidTimeRemainingFraction => (float)NewEscapeTimeMinutes / OriginalEscapeTimeMinutes;
|
|
|
|
/// <summary>
|
|
/// The original minimum time (in seconds) you must stay in the raid to get a "Survived" status (unless your XP is high enough) for the current (or most recent) raid
|
|
/// </summary>
|
|
public static int OriginalSurvivalTimeSeconds { get; private set; } = int.MaxValue;
|
|
|
|
/// <summary>
|
|
/// The updated minimum time (in seconds) you must stay in the raid to get a "Survived" status (unless your XP is high enough) for the current (or most recent) raid
|
|
/// </summary>
|
|
public static int NewSurvivalTimeSeconds { get; private set; } = int.MaxValue;
|
|
|
|
/// <summary>
|
|
/// The reduction in the minimum time you must stay in the raid to get a "Survived" status (unless your XP is high enough) for the current (or most recent) raid
|
|
/// </summary>
|
|
public static int SurvivalTimeReductionSeconds => OriginalSurvivalTimeSeconds - NewSurvivalTimeSeconds;
|
|
|
|
/// <summary>
|
|
/// Update the changes that will be made for the raid. This should be called just before applying changes.
|
|
/// </summary>
|
|
/// <param name="raidSettings">The raid settings for the raid that will be altered</param>
|
|
/// <param name="raidChanges">The changes that will be made to the raid</param>
|
|
internal static void UpdateRaidChanges(RaidSettings raidSettings, RaidTimeResponse raidChanges)
|
|
{
|
|
// Reset so HaveChangesBeenApplied=false while changes are being applied
|
|
RaidChangesAppliedUtcTime = DateTime.MinValue;
|
|
|
|
IsScavRaid = raidSettings.IsScav;
|
|
|
|
LocationId = raidSettings.SelectedLocation.Id;
|
|
|
|
OriginalEscapeTimeMinutes = raidSettings.SelectedLocation.EscapeTimeLimit;
|
|
NewEscapeTimeMinutes = raidChanges.RaidTimeMinutes;
|
|
|
|
OriginalSurvivalTimeSeconds = raidChanges.OriginalSurvivalTimeSeconds;
|
|
NewSurvivalTimeSeconds = raidChanges.NewSurviveTimeSeconds ?? OriginalSurvivalTimeSeconds;
|
|
}
|
|
|
|
/// <summary>
|
|
/// This should be called just after all raid changes have been completed
|
|
/// </summary>
|
|
internal static void ConfirmRaidChanges()
|
|
{
|
|
// This will also set HaveChangesBeenApplied=true
|
|
RaidChangesAppliedUtcTime = DateTime.UtcNow;
|
|
}
|
|
}
|
|
}
|