mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 08:50:43 -05:00
Fix LightKeeper tasks not progressing correctly (!91)
To handle in-raid LK task unlocking, when a task is switched from AvailableAfter to Locked, instead switch it to AvailableForStart This handles the lack of `status` values for tasks, where the target state would normally be read from, without risking breaking non-LK tasks by adding that data. Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com> Reviewed-on: SPT-AKI/Modules#91 Co-authored-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com> Co-committed-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
This commit is contained in:
parent
b87b569ece
commit
f1a7a0cb99
@ -42,6 +42,7 @@ namespace Aki.SinglePlayer
|
|||||||
new SpawnPmcPatch().Enable();
|
new SpawnPmcPatch().Enable();
|
||||||
new PostRaidHealingPricePatch().Enable();
|
new PostRaidHealingPricePatch().Enable();
|
||||||
new EndByTimerPatch().Enable();
|
new EndByTimerPatch().Enable();
|
||||||
|
new InRaidQuestAvailablePatch().Enable();
|
||||||
new PostRaidHealScreenPatch().Enable();
|
new PostRaidHealScreenPatch().Enable();
|
||||||
new VoIPTogglerPatch().Enable();
|
new VoIPTogglerPatch().Enable();
|
||||||
new MidRaidQuestChangePatch().Enable();
|
new MidRaidQuestChangePatch().Enable();
|
||||||
|
@ -0,0 +1,58 @@
|
|||||||
|
using Aki.Reflection.Patching;
|
||||||
|
using Aki.Reflection.Utils;
|
||||||
|
using EFT.Quests;
|
||||||
|
using HarmonyLib;
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace Aki.SinglePlayer.Patches.Quests
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Lightkeeper quests change their state in-raid, and will change to the `AppearStatus` of the quest once
|
||||||
|
* the AvailableAfter time has been hit. This defaults to `Locked`, but should actually be `AvailableForStart`
|
||||||
|
*
|
||||||
|
* So if we get a quest state change from `AvailableAfter` to `Locked`, we should actually change to `AvailableForStart`
|
||||||
|
*/
|
||||||
|
public class InRaidQuestAvailablePatch : ModulePatch
|
||||||
|
{
|
||||||
|
private static PropertyInfo _questStatusProperty;
|
||||||
|
|
||||||
|
protected override MethodBase GetTargetMethod()
|
||||||
|
{
|
||||||
|
var targetType = PatchConstants.EftTypes.FirstOrDefault(IsTargetType);
|
||||||
|
var targetMethod = AccessTools.Method(targetType, "SetStatus");
|
||||||
|
|
||||||
|
_questStatusProperty = AccessTools.Property(targetType, "QuestStatus");
|
||||||
|
|
||||||
|
Logger.LogDebug($"{this.GetType().Name} Type: {targetType?.Name}");
|
||||||
|
Logger.LogDebug($"{this.GetType().Name} Method: {targetMethod?.Name}");
|
||||||
|
Logger.LogDebug($"{this.GetType().Name} QuestStatus: {_questStatusProperty?.Name}");
|
||||||
|
|
||||||
|
return targetMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsTargetType(Type type)
|
||||||
|
{
|
||||||
|
if (type.GetProperty("StatusTransition") != null &&
|
||||||
|
type.GetProperty("IsChangeAllowed") != null &&
|
||||||
|
type.GetProperty("NeedCountdown") == null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
[PatchPrefix]
|
||||||
|
private static void PatchPrefix(object __instance, ref EQuestStatus status)
|
||||||
|
{
|
||||||
|
var currentStatus = (EQuestStatus)_questStatusProperty.GetValue(__instance);
|
||||||
|
|
||||||
|
if (currentStatus == EQuestStatus.AvailableAfter && status == EQuestStatus.Locked)
|
||||||
|
{
|
||||||
|
status = EQuestStatus.AvailableForStart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user