Files
Nitrox/NitroxPatcher/Patches/Dynamic/StoryGoalScheduler_Schedule_Patch.cs
2025-07-06 00:23:46 +02:00

45 lines
1.5 KiB
C#

using System.Linq;
using System.Reflection;
using NitroxClient.Communication.Abstract;
using NitroxClient.MonoBehaviours;
using NitroxModel.Helper;
using NitroxModel.Packets;
using Story;
namespace NitroxPatcher.Patches.Dynamic;
public sealed partial class StoryGoalScheduler_Schedule_Patch : NitroxPatch, IDynamicPatch
{
private static readonly MethodInfo TARGET_METHOD = Reflect.Method((StoryGoalScheduler t) => t.Schedule(default));
// __state is true if the entry was already scheduled before, in which case we cancel the scheduling
public static bool Prefix(StoryGoal goal, out bool __state)
{
__state = StoryGoalScheduler.main.schedule.Any(scheduledGoal => scheduledGoal.goalKey == goal.key) ||
(goal.goalType == Story.GoalType.Radio && StoryGoalManager.main.pendingRadioMessages.Contains(goal.key)) ||
StoryGoalManager.main.completedGoals.Contains(goal.key);
if (__state)
{
Log.Debug($"Prevented a goal from being scheduled: {goal}");
}
else
{
Log.Debug($"A goal was scheduled: {goal}");
}
return !__state;
}
public static void Postfix(StoryGoal goal, bool __state)
{
if (__state || goal.delay == 0f || !Multiplayer.Main || !Multiplayer.Main.InitialSyncCompleted)
{
return;
}
float timeExecute = StoryGoalScheduler.main.schedule.GetLast().timeExecute;
Resolve<IPacketSender>().Send(new Schedule(timeExecute, goal.key, (int)goal.goalType));
}
}