Core/SAI: Implement waiting for actions on action list to finish before continuing the action list

Port From (https://github.com/TrinityCore/TrinityCore/commit/5dfac0ef142c1b59e41c51ab2cca48083be4cb9e)
This commit is contained in:
Hondacrx
2024-08-08 17:28:27 -04:00
parent 0b1f2fe34e
commit 2f71dbfda0
18 changed files with 335 additions and 79 deletions
@@ -0,0 +1,38 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
namespace Game.Scripting.v2
{
public class ActionResultSetter<T>
{
ActionBase _action;
T _result;
public ActionResultSetter(ActionBase action, T result)
{
_action = action;
_result = result;
}
public void SetResult(T result)
{
_result = result;
_action.MarkCompleted();
}
}
public class ActionResultSetter
{
ActionBase _action;
public ActionResultSetter(ActionBase action)
{
_action = action;
}
public void SetResult()
{
_action.MarkCompleted();
}
}
}
+75
View File
@@ -0,0 +1,75 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Linq;
namespace Game.Scripting.v2
{
public class ActionBase
{
bool _isReady;
public virtual bool IsReady()
{
return _isReady;
}
public void MarkCompleted()
{
_isReady = true;
}
}
public class WaitAction : ActionBase
{
DateTime _waitEnd;
public WaitAction(DateTime waitEnd)
{
_waitEnd = waitEnd;
}
public override bool IsReady()
{
return _waitEnd <= GameTime.Now();
}
}
public class ActionResult<T> : ActionBase
{
T _result;
public static ActionResultSetter<T> GetResultSetter(ActionResult<T> action)
{
T resultPtr = action._result;
return new ActionResultSetter<T>(action, resultPtr);
}
}
public class ActionResult : ActionBase
{
public static ActionResultSetter GetResultSetter(ActionResult action)
{
return new ActionResultSetter(action);
}
}
public class MultiActionResult<InnerResult> : ActionResult
{
public List<ActionResult<InnerResult>> Results = new();
public ActionResult<InnerResult> CreateAndGetResult()
{
ActionResult<InnerResult> result = new();
Results.Add(result);
return result;
}
public override bool IsReady()
{
return Results.All(result => result.IsReady());
}
}
}