Core/SmartAI: allow AreaTrigger SAI scripts to use the player triggering it as base object for actions and targeting
Port From (https://github.com/TrinityCore/TrinityCore/commit/1ddde5ca3cac8ac03239882778af3702b59d582d)
This commit is contained in:
@@ -119,7 +119,7 @@ namespace Game.AI
|
|||||||
/// - Has aura with ID <aura> (if aura > 0)
|
/// - Has aura with ID <aura> (if aura > 0)
|
||||||
/// - Does not have aura with ID -<aura> (if aura < 0)
|
/// - Does not have aura with ID -<aura> (if aura < 0)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Unit SelectTarget(SelectAggroTarget targetType, uint offset = 0, float dist = 0.0f, bool playerOnly = false, bool withTank = true, int aura = 0)
|
public Unit SelectTarget(SelectTargetMethod targetType, uint offset = 0, float dist = 0.0f, bool playerOnly = false, bool withTank = true, int aura = 0)
|
||||||
{
|
{
|
||||||
return SelectTarget(targetType, offset, new DefaultTargetSelector(me, dist, playerOnly, withTank, aura));
|
return SelectTarget(targetType, offset, new DefaultTargetSelector(me, dist, playerOnly, withTank, aura));
|
||||||
}
|
}
|
||||||
@@ -128,7 +128,7 @@ namespace Game.AI
|
|||||||
/// Select the best target (in <targetType> order) satisfying <predicate> from the threat list.
|
/// Select the best target (in <targetType> order) satisfying <predicate> from the threat list.
|
||||||
/// If <offset> is nonzero, the first <offset> entries in <targetType> order (or MAXTHREAT order, if <targetType> is RANDOM) are skipped.
|
/// If <offset> is nonzero, the first <offset> entries in <targetType> order (or MAXTHREAT order, if <targetType> is RANDOM) are skipped.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Unit SelectTarget(SelectAggroTarget targetType, uint offset, ICheck<Unit> selector)
|
public Unit SelectTarget(SelectTargetMethod targetType, uint offset, ICheck<Unit> selector)
|
||||||
{
|
{
|
||||||
ThreatManager mgr = GetThreatManager();
|
ThreatManager mgr = GetThreatManager();
|
||||||
// shortcut: if we ignore the first <offset> elements, and there are at most <offset> elements, then we ignore ALL elements
|
// shortcut: if we ignore the first <offset> elements, and there are at most <offset> elements, then we ignore ALL elements
|
||||||
@@ -143,8 +143,8 @@ namespace Game.AI
|
|||||||
|
|
||||||
return targetType switch
|
return targetType switch
|
||||||
{
|
{
|
||||||
SelectAggroTarget.MaxThreat or SelectAggroTarget.MinThreat or SelectAggroTarget.MaxDistance or SelectAggroTarget.MinDistance => targetList[0],
|
SelectTargetMethod.MaxThreat or SelectTargetMethod.MinThreat or SelectTargetMethod.MaxDistance or SelectTargetMethod.MinDistance => targetList[0],
|
||||||
SelectAggroTarget.Random => targetList.SelectRandom(),
|
SelectTargetMethod.Random => targetList.SelectRandom(),
|
||||||
_ => null,
|
_ => null,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,7 @@ namespace Game.AI
|
|||||||
/// - Does not have aura with ID -<aura> (if aura < 0)
|
/// - Does not have aura with ID -<aura> (if aura < 0)
|
||||||
/// The resulting targets are stored in <targetList> (which is cleared first).
|
/// The resulting targets are stored in <targetList> (which is cleared first).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<Unit> SelectTargetList(uint num, SelectAggroTarget targetType, uint offset = 0, float dist = 0f, bool playerOnly = false, bool withTank = true, int aura = 0)
|
public List<Unit> SelectTargetList(uint num, SelectTargetMethod targetType, uint offset = 0, float dist = 0f, bool playerOnly = false, bool withTank = true, int aura = 0)
|
||||||
{
|
{
|
||||||
return SelectTargetList(num, targetType, offset, new DefaultTargetSelector(me, dist, playerOnly, withTank, aura));
|
return SelectTargetList(num, targetType, offset, new DefaultTargetSelector(me, dist, playerOnly, withTank, aura));
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ namespace Game.AI
|
|||||||
/// Select the best (up to) <num> targets (in <targetType> order) satisfying <predicate> from the threat list and stores them in <targetList> (which is cleared first).
|
/// Select the best (up to) <num> targets (in <targetType> order) satisfying <predicate> from the threat list and stores them in <targetList> (which is cleared first).
|
||||||
/// If <offset> is nonzero, the first <offset> entries in <targetType> order (or MAXTHREAT order, if <targetType> is RANDOM) are skipped.
|
/// If <offset> is nonzero, the first <offset> entries in <targetType> order (or MAXTHREAT order, if <targetType> is RANDOM) are skipped.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<Unit> SelectTargetList(uint num, SelectAggroTarget targetType, uint offset, ICheck<Unit> selector)
|
public List<Unit> SelectTargetList(uint num, SelectTargetMethod targetType, uint offset, ICheck<Unit> selector)
|
||||||
{
|
{
|
||||||
var targetList = new List<Unit>();
|
var targetList = new List<Unit>();
|
||||||
|
|
||||||
@@ -178,7 +178,7 @@ namespace Game.AI
|
|||||||
if (mgr.GetThreatListSize() <= offset)
|
if (mgr.GetThreatListSize() <= offset)
|
||||||
return targetList;
|
return targetList;
|
||||||
|
|
||||||
if (targetType == SelectAggroTarget.MaxDistance || targetType == SelectAggroTarget.MinDistance)
|
if (targetType == SelectTargetMethod.MaxDistance || targetType == SelectTargetMethod.MinDistance)
|
||||||
{
|
{
|
||||||
foreach (ThreatReference refe in mgr.GetSortedThreatList())
|
foreach (ThreatReference refe in mgr.GetSortedThreatList())
|
||||||
{
|
{
|
||||||
@@ -213,11 +213,11 @@ namespace Game.AI
|
|||||||
}
|
}
|
||||||
|
|
||||||
// right now, list is unsorted for DISTANCE types - re-sort by MAXDISTANCE
|
// right now, list is unsorted for DISTANCE types - re-sort by MAXDISTANCE
|
||||||
if (targetType == SelectAggroTarget.MaxDistance || targetType == SelectAggroTarget.MinDistance)
|
if (targetType == SelectTargetMethod.MaxDistance || targetType == SelectTargetMethod.MinDistance)
|
||||||
SortByDistance(targetList, targetType == SelectAggroTarget.MinDistance);
|
SortByDistance(targetList, targetType == SelectTargetMethod.MinDistance);
|
||||||
|
|
||||||
// now the list is MAX sorted, reverse for MIN types
|
// now the list is MAX sorted, reverse for MIN types
|
||||||
if (targetType == SelectAggroTarget.MinThreat)
|
if (targetType == SelectTargetMethod.MinThreat)
|
||||||
targetList.Reverse();
|
targetList.Reverse();
|
||||||
|
|
||||||
// ignore the first <offset> elements
|
// ignore the first <offset> elements
|
||||||
@@ -233,7 +233,7 @@ namespace Game.AI
|
|||||||
if (targetList.Count <= num)
|
if (targetList.Count <= num)
|
||||||
return targetList;
|
return targetList;
|
||||||
|
|
||||||
if (targetType == SelectAggroTarget.Random)
|
if (targetType == SelectTargetMethod.Random)
|
||||||
targetList = targetList.SelectRandom(num).ToList();
|
targetList = targetList.SelectRandom(num).ToList();
|
||||||
else
|
else
|
||||||
targetList.Resize(num);
|
targetList.Resize(num);
|
||||||
@@ -265,7 +265,7 @@ namespace Game.AI
|
|||||||
if (spellInfo != null)
|
if (spellInfo != null)
|
||||||
{
|
{
|
||||||
bool playerOnly = spellInfo.HasAttribute(SpellAttr3.OnlyTargetPlayers);
|
bool playerOnly = spellInfo.HasAttribute(SpellAttr3.OnlyTargetPlayers);
|
||||||
target = SelectTarget(SelectAggroTarget.Random, 0, spellInfo.GetMaxRange(false), playerOnly);
|
target = SelectTarget(SelectTargetMethod.Random, 0, spellInfo.GetMaxRange(false), playerOnly);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -286,7 +286,7 @@ namespace Game.AI
|
|||||||
&& targetSelector.Invoke(me.GetVictim()))
|
&& targetSelector.Invoke(me.GetVictim()))
|
||||||
target = me.GetVictim();
|
target = me.GetVictim();
|
||||||
else
|
else
|
||||||
target = SelectTarget(SelectAggroTarget.Random, 0, targetSelector);
|
target = SelectTarget(SelectTargetMethod.Random, 0, targetSelector);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -515,7 +515,7 @@ namespace Game.AI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum SelectAggroTarget
|
public enum SelectTargetMethod
|
||||||
{
|
{
|
||||||
Random = 0, // just pick a random target
|
Random = 0, // just pick a random target
|
||||||
MaxThreat, // prefer targets higher in the threat list
|
MaxThreat, // prefer targets higher in the threat list
|
||||||
|
|||||||
@@ -711,7 +711,7 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
UnitAI charmerAI = charmer.GetAI();
|
UnitAI charmerAI = charmer.GetAI();
|
||||||
if (charmerAI != null)
|
if (charmerAI != null)
|
||||||
return charmerAI.SelectTarget(SelectAggroTarget.Random, 0, new ValidTargetSelectPredicate(this));
|
return charmerAI.SelectTarget(SelectTargetMethod.Random, 0, new ValidTargetSelectPredicate(this));
|
||||||
|
|
||||||
return charmer.GetVictim();
|
return charmer.GetVictim();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -706,7 +706,7 @@ namespace Game.AI
|
|||||||
|
|
||||||
void _JustEngagedWith()
|
void _JustEngagedWith()
|
||||||
{
|
{
|
||||||
Unit target = SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true);
|
Unit target = SelectTarget(SelectTargetMethod.Random, 0, 0.0f, true);
|
||||||
if (target)
|
if (target)
|
||||||
AttackStart(target);
|
AttackStart(target);
|
||||||
}
|
}
|
||||||
@@ -714,7 +714,7 @@ namespace Game.AI
|
|||||||
public override void JustSummoned(Creature summon)
|
public override void JustSummoned(Creature summon)
|
||||||
{
|
{
|
||||||
summons.Summon(summon);
|
summons.Summon(summon);
|
||||||
Unit target = SelectTarget(SelectAggroTarget.Random, 0, 0.0f, true);
|
Unit target = SelectTarget(SelectTargetMethod.Random, 0, 0.0f, true);
|
||||||
if (target)
|
if (target)
|
||||||
summon.GetAI().AttackStart(target);
|
summon.GetAI().AttackStart(target);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ namespace Game.AI
|
|||||||
ObjectGuid _meOrigGUID;
|
ObjectGuid _meOrigGUID;
|
||||||
GameObject _go;
|
GameObject _go;
|
||||||
ObjectGuid _goOrigGUID;
|
ObjectGuid _goOrigGUID;
|
||||||
|
Player _atPlayer;
|
||||||
AreaTriggerRecord _trigger;
|
AreaTriggerRecord _trigger;
|
||||||
AreaTrigger _areaTrigger;
|
AreaTrigger _areaTrigger;
|
||||||
SceneTemplate _sceneTemplate;
|
SceneTemplate _sceneTemplate;
|
||||||
@@ -1181,7 +1182,7 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
SmartActionSummonCreatureFlags flags = (SmartActionSummonCreatureFlags)e.Action.summonCreature.flags;
|
SmartActionSummonCreatureFlags flags = (SmartActionSummonCreatureFlags)e.Action.summonCreature.flags;
|
||||||
bool preferUnit = flags.HasAnyFlag(SmartActionSummonCreatureFlags.PreferUnit);
|
bool preferUnit = flags.HasAnyFlag(SmartActionSummonCreatureFlags.PreferUnit);
|
||||||
WorldObject summoner = preferUnit ? unit : GetBaseObjectOrUnit(unit);
|
WorldObject summoner = preferUnit ? unit : GetBaseObjectOrPlayerTrigger() ?? unit;
|
||||||
if (summoner == null)
|
if (summoner == null)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2654,7 +2655,7 @@ namespace Game.AI
|
|||||||
scriptTrigger = tempLastInvoker;
|
scriptTrigger = tempLastInvoker;
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldObject baseObject = GetBaseObject();
|
WorldObject baseObject = GetBaseObjectOrPlayerTrigger();
|
||||||
|
|
||||||
List<WorldObject> targets = new();
|
List<WorldObject> targets = new();
|
||||||
switch (e.GetTargetType())
|
switch (e.GetTargetType())
|
||||||
@@ -2672,13 +2673,13 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
if (e.Target.hostilRandom.powerType != 0)
|
if (e.Target.hostilRandom.powerType != 0)
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.MaxThreat, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.MaxThreat, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.MaxThreat, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.MaxThreat, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
@@ -2689,13 +2690,13 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
if (e.Target.hostilRandom.powerType != 0)
|
if (e.Target.hostilRandom.powerType != 0)
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.MinThreat, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.MinThreat, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.MinThreat, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.MinThreat, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
@@ -2706,13 +2707,13 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
if (e.Target.hostilRandom.powerType != 0)
|
if (e.Target.hostilRandom.powerType != 0)
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.Random, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.Random, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.Random, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.Random, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
@@ -2723,13 +2724,13 @@ namespace Game.AI
|
|||||||
{
|
{
|
||||||
if (e.Target.hostilRandom.powerType != 0)
|
if (e.Target.hostilRandom.powerType != 0)
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.Random, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.Random, 1, new PowerUsersSelector(_me, (PowerType)(e.Target.hostilRandom.powerType - 1), (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0));
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.Random, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.Random, 1, (float)e.Target.hostilRandom.maxDist, e.Target.hostilRandom.playerOnly != 0);
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
@@ -2738,7 +2739,7 @@ namespace Game.AI
|
|||||||
case SmartTargets.Farthest:
|
case SmartTargets.Farthest:
|
||||||
if (_me)
|
if (_me)
|
||||||
{
|
{
|
||||||
Unit u = _me.GetAI().SelectTarget(SelectAggroTarget.MaxDistance, 0, new FarthestTargetSelector(_me, (float)e.Target.farthest.maxDist, e.Target.farthest.playerOnly != 0, e.Target.farthest.isInLos != 0));
|
Unit u = _me.GetAI().SelectTarget(SelectTargetMethod.MaxDistance, 0, new FarthestTargetSelector(_me, (float)e.Target.farthest.maxDist, e.Target.farthest.playerOnly != 0, e.Target.farthest.isInLos != 0));
|
||||||
if (u != null)
|
if (u != null)
|
||||||
targets.Add(u);
|
targets.Add(u);
|
||||||
}
|
}
|
||||||
@@ -3118,7 +3119,7 @@ namespace Game.AI
|
|||||||
List<WorldObject> GetWorldObjectsInDist(float dist)
|
List<WorldObject> GetWorldObjectsInDist(float dist)
|
||||||
{
|
{
|
||||||
List<WorldObject> targets = new();
|
List<WorldObject> targets = new();
|
||||||
WorldObject obj = GetBaseObject();
|
WorldObject obj = GetBaseObjectOrPlayerTrigger();
|
||||||
if (obj == null)
|
if (obj == null)
|
||||||
return targets;
|
return targets;
|
||||||
|
|
||||||
@@ -4039,7 +4040,7 @@ namespace Game.AI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnInitialize(WorldObject obj)
|
public void OnInitialize(WorldObject obj, AreaTriggerRecord at = null, SceneTemplate scene = null, Quest qst = null)
|
||||||
{
|
{
|
||||||
if (obj != null)
|
if (obj != null)
|
||||||
{
|
{
|
||||||
@@ -4048,12 +4049,23 @@ namespace Game.AI
|
|||||||
case TypeId.Unit:
|
case TypeId.Unit:
|
||||||
_scriptType = SmartScriptType.Creature;
|
_scriptType = SmartScriptType.Creature;
|
||||||
_me = obj.ToCreature();
|
_me = obj.ToCreature();
|
||||||
Log.outDebug(LogFilter.Scripts, "SmartScript.OnInitialize: source is Creature {0}", _me.GetEntry());
|
Log.outDebug(LogFilter.Scripts, $"SmartScript.OnInitialize: source is Creature {_me.GetEntry()}");
|
||||||
break;
|
break;
|
||||||
case TypeId.GameObject:
|
case TypeId.GameObject:
|
||||||
_scriptType = SmartScriptType.GameObject;
|
_scriptType = SmartScriptType.GameObject;
|
||||||
_go = obj.ToGameObject();
|
_go = obj.ToGameObject();
|
||||||
Log.outDebug(LogFilter.Scripts, "SmartScript.OnInitialize: source is GameObject {0}", _go.GetEntry());
|
Log.outDebug(LogFilter.Scripts, $"SmartScript.OnInitialize: source is GameObject {_go.GetEntry()}");
|
||||||
|
break;
|
||||||
|
case TypeId.Player:
|
||||||
|
if (at != null)
|
||||||
|
{
|
||||||
|
_scriptType = SmartScriptType.AreaTrigger;
|
||||||
|
_trigger = at;
|
||||||
|
_atPlayer = obj.ToPlayer();
|
||||||
|
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript::OnInitialize: source is AreaTrigger {_trigger.Id}, triggered by player {_atPlayer.GetGUID()}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Log.outError(LogFilter.Misc, "SmartScript::OnInitialize: !WARNING! Player TypeID is only allowed for AreaTriggers");
|
||||||
break;
|
break;
|
||||||
case TypeId.AreaTrigger:
|
case TypeId.AreaTrigger:
|
||||||
_areaTrigger = obj.ToAreaTrigger();
|
_areaTrigger = obj.ToAreaTrigger();
|
||||||
@@ -4065,76 +4077,13 @@ namespace Game.AI
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (scene != null)
|
||||||
{
|
|
||||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized WorldObject is Null.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetScript();//load copy of script
|
|
||||||
|
|
||||||
foreach (var holder in _events)
|
|
||||||
InitTimer(holder);//calculate timers for first time use
|
|
||||||
|
|
||||||
ProcessEventsFor(SmartEvents.AiInit);
|
|
||||||
InstallEvents();
|
|
||||||
ProcessEventsFor(SmartEvents.JustCreated);
|
|
||||||
_counterList.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnInitialize(AreaTriggerRecord at)
|
|
||||||
{
|
|
||||||
if (at != null)
|
|
||||||
{
|
|
||||||
_scriptType = SmartScriptType.AreaTrigger;
|
|
||||||
_trigger = at;
|
|
||||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.OnInitialize: AreaTrigger {0}", _trigger.Id);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized AreaTrigger is Null.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetScript();//load copy of script
|
|
||||||
|
|
||||||
foreach (var holder in _events)
|
|
||||||
InitTimer(holder);//calculate timers for first time use
|
|
||||||
|
|
||||||
ProcessEventsFor(SmartEvents.AiInit);
|
|
||||||
InstallEvents();
|
|
||||||
ProcessEventsFor(SmartEvents.JustCreated);
|
|
||||||
_counterList.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnInitialize(SceneTemplate scene)
|
|
||||||
{
|
|
||||||
if (scene != null)
|
|
||||||
{
|
{
|
||||||
_scriptType = SmartScriptType.Scene;
|
_scriptType = SmartScriptType.Scene;
|
||||||
_sceneTemplate = scene;
|
_sceneTemplate = scene;
|
||||||
Log.outDebug(LogFilter.ScriptsAi, "SmartScript.OnInitialize: Scene with id {0}", scene.SceneId);
|
Log.outDebug(LogFilter.ScriptsAi, $"SmartScript.OnInitialize: Scene with id {scene.SceneId}");
|
||||||
}
|
}
|
||||||
else
|
else if (qst != null)
|
||||||
{
|
|
||||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized Scene is Null.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetScript();//load copy of script
|
|
||||||
|
|
||||||
foreach (var holder in _events)
|
|
||||||
InitTimer(holder);//calculate timers for first time use
|
|
||||||
|
|
||||||
ProcessEventsFor(SmartEvents.AiInit);
|
|
||||||
InstallEvents();
|
|
||||||
ProcessEventsFor(SmartEvents.JustCreated);
|
|
||||||
_counterList.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnInitialize(Quest qst)
|
|
||||||
{
|
|
||||||
if (qst != null)
|
|
||||||
{
|
{
|
||||||
_scriptType = SmartScriptType.Quest;
|
_scriptType = SmartScriptType.Quest;
|
||||||
_quest = qst;
|
_quest = qst;
|
||||||
@@ -4142,7 +4091,7 @@ namespace Game.AI
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized quest is Null.");
|
Log.outError(LogFilter.ScriptsAi, "SmartScript.OnInitialize: !WARNING! Initialized WorldObject is Null.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4280,7 +4229,11 @@ namespace Game.AI
|
|||||||
|
|
||||||
return summoner;
|
return summoner;
|
||||||
}
|
}
|
||||||
|
WorldObject GetBaseObjectOrPlayerTrigger()
|
||||||
|
{
|
||||||
|
return _trigger != null ? _atPlayer : GetBaseObject();
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsUnit(WorldObject obj) { return obj != null && (obj.IsTypeId(TypeId.Unit) || obj.IsTypeId(TypeId.Player)); }
|
public bool IsUnit(WorldObject obj) { return obj != null && (obj.IsTypeId(TypeId.Unit) || obj.IsTypeId(TypeId.Player)); }
|
||||||
public bool IsPlayer(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Player); }
|
public bool IsPlayer(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Player); }
|
||||||
public bool IsCreature(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Unit); }
|
public bool IsCreature(WorldObject obj) { return obj != null && obj.IsTypeId(TypeId.Unit); }
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace Scripts.Smart
|
|||||||
|
|
||||||
Log.outDebug(LogFilter.ScriptsAi, "AreaTrigger {0} is using SmartTrigger script", trigger.Id);
|
Log.outDebug(LogFilter.ScriptsAi, "AreaTrigger {0} is using SmartTrigger script", trigger.Id);
|
||||||
SmartScript script = new();
|
SmartScript script = new();
|
||||||
script.OnInitialize(trigger);
|
script.OnInitialize(player, trigger);
|
||||||
script.ProcessEventsFor(SmartEvents.AreatriggerOntrigger, player, trigger.Id);
|
script.ProcessEventsFor(SmartEvents.AreatriggerOntrigger, player, trigger.Id);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -61,28 +61,28 @@ namespace Scripts.Smart
|
|||||||
public override void OnSceneStart(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
public override void OnSceneStart(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
||||||
{
|
{
|
||||||
SmartScript smartScript = new();
|
SmartScript smartScript = new();
|
||||||
smartScript.OnInitialize(sceneTemplate);
|
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||||
smartScript.ProcessEventsFor(SmartEvents.SceneStart, player);
|
smartScript.ProcessEventsFor(SmartEvents.SceneStart, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnSceneTriggerEvent(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate, string triggerName)
|
public override void OnSceneTriggerEvent(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate, string triggerName)
|
||||||
{
|
{
|
||||||
SmartScript smartScript = new();
|
SmartScript smartScript = new();
|
||||||
smartScript.OnInitialize(sceneTemplate);
|
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||||
smartScript.ProcessEventsFor(SmartEvents.SceneTrigger, player, 0, 0, false, null, null, triggerName);
|
smartScript.ProcessEventsFor(SmartEvents.SceneTrigger, player, 0, 0, false, null, null, triggerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnSceneCancel(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
public override void OnSceneCancel(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
||||||
{
|
{
|
||||||
SmartScript smartScript = new();
|
SmartScript smartScript = new();
|
||||||
smartScript.OnInitialize(sceneTemplate);
|
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||||
smartScript.ProcessEventsFor(SmartEvents.SceneCancel, player);
|
smartScript.ProcessEventsFor(SmartEvents.SceneCancel, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
public override void OnSceneComplete(Player player, uint sceneInstanceID, SceneTemplate sceneTemplate)
|
||||||
{
|
{
|
||||||
SmartScript smartScript = new();
|
SmartScript smartScript = new();
|
||||||
smartScript.OnInitialize(sceneTemplate);
|
smartScript.OnInitialize(null, null, sceneTemplate);
|
||||||
smartScript.ProcessEventsFor(SmartEvents.SceneComplete, player);
|
smartScript.ProcessEventsFor(SmartEvents.SceneComplete, player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,7 @@ namespace Scripts.Smart
|
|||||||
public override void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus)
|
public override void OnQuestStatusChange(Player player, Quest quest, QuestStatus oldStatus, QuestStatus newStatus)
|
||||||
{
|
{
|
||||||
SmartScript smartScript = new();
|
SmartScript smartScript = new();
|
||||||
smartScript.OnInitialize(quest);
|
smartScript.OnInitialize(null, null, null, quest);
|
||||||
switch (newStatus)
|
switch (newStatus)
|
||||||
{
|
{
|
||||||
case QuestStatus.Incomplete:
|
case QuestStatus.Incomplete:
|
||||||
@@ -124,7 +124,7 @@ namespace Scripts.Smart
|
|||||||
if (slot < SharedConst.MaxQuestLogSize && player.IsQuestObjectiveComplete(slot, quest, objective))
|
if (slot < SharedConst.MaxQuestLogSize && player.IsQuestObjectiveComplete(slot, quest, objective))
|
||||||
{
|
{
|
||||||
SmartScript smartScript = new();
|
SmartScript smartScript = new();
|
||||||
smartScript.OnInitialize(quest);
|
smartScript.OnInitialize(null, null, null, quest);
|
||||||
smartScript.ProcessEventsFor(SmartEvents.QuestObjCompletion, player, objective.Id);
|
smartScript.ProcessEventsFor(SmartEvents.QuestObjCompletion, player, objective.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user