Game/AI: Implement new targettype SMART_TARGET_CLOSEST_UNSPAWNED_GAMEOBJECT

Port From (https://github.com/TrinityCore/TrinityCore/commit/db825c3221de16cdb757711781318d76b414213f)
This commit is contained in:
hondacrx
2022-02-18 13:35:32 -05:00
parent ed5648d8ac
commit 8126e7c6e1
6 changed files with 50 additions and 8 deletions
+1 -1
View File
@@ -435,7 +435,7 @@ namespace Framework.Constants
LootRecipients = 27, // all players that have tagged this creature (for kill credit)
Farthest = 28, // maxDist, playerOnly, isInLos
VehiclePassenger = 29, // seatMask (0 - all seats)
SpellTarget = 30,
ClosestUnspawnedGameobject = 30,
End = 31
}
+5 -5
View File
@@ -493,17 +493,17 @@ namespace Game.AI
public virtual void SpellHitTarget(Unit target, SpellInfo spellInfo) { }
public virtual void SpellHitTargetGameObject(GameObject target, SpellInfo spellInfo) { }
// Should return true if the NPC is currently being escorted
public virtual bool IsEscorted() { return false; }
public virtual void MovementInform(MovementGeneratorType type, uint id) { }
// Called when a spell cast gets interrupted
public virtual void OnSpellCastInterrupt(SpellInfo spell) { }
// Called when a spell cast has been successfully finished
public virtual void OnSuccessfulSpellCast(SpellInfo spell) { }
// Should return true if the NPC is currently being escorted
public virtual bool IsEscorted() { return false; }
public virtual void MovementInform(MovementGeneratorType type, uint id) { }
// Called at reaching home after evade
public virtual void JustReachedHome() { }
@@ -513,7 +513,7 @@ namespace Game.AI
case SmartTargets.LootRecipients:
case SmartTargets.Farthest:
case SmartTargets.VehiclePassenger:
case SmartTargets.SpellTarget:
case SmartTargets.ClosestUnspawnedGameobject:
break;
default:
Log.outError(LogFilter.ScriptsAi, "SmartAIMgr: Not handled target_type({0}), Entry {1} SourceType {2} Event {3} Action {4}, skipped.", e.GetTargetType(), e.EntryOrGuid, e.GetScriptType(), e.EventId, e.GetActionType());
+9 -1
View File
@@ -2006,7 +2006,8 @@ namespace Game.AI
e.GetTargetType() == SmartTargets.GameobjectGuid || e.GetTargetType() == SmartTargets.GameobjectDistance ||
e.GetTargetType() == SmartTargets.ClosestCreature || e.GetTargetType() == SmartTargets.ClosestGameobject ||
e.GetTargetType() == SmartTargets.OwnerOrSummoner || e.GetTargetType() == SmartTargets.ActionInvoker ||
e.GetTargetType() == SmartTargets.ClosestEnemy || e.GetTargetType() == SmartTargets.ClosestFriendly)
e.GetTargetType() == SmartTargets.ClosestEnemy || e.GetTargetType() == SmartTargets.ClosestFriendly ||
e.GetTargetType() == SmartTargets.ClosestUnspawnedGameobject)
{
target.ToCreature().SetHomePosition(target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), target.GetOrientation());
}
@@ -3089,6 +3090,13 @@ namespace Game.AI
}
break;
}
case SmartTargets.ClosestUnspawnedGameobject:
{
GameObject target = baseObject.FindNearestUnspawnedGameObject(e.Target.closest.entry, (float)(e.Target.closest.dist != 0 ? e.Target.closest.dist : 100));
if (target != null)
targets.Add(target);
break;
}
case SmartTargets.Position:
default:
break;
@@ -1540,6 +1540,15 @@ namespace Game.Entities
return searcher.GetTarget();
}
public GameObject FindNearestUnspawnedGameObject(uint entry, float range)
{
NearestUnspawnedGameObjectEntryInObjectRangeCheck checker = new(this, entry, range);
GameObjectLastSearcher searcher = new(this, checker);
Cell.VisitGridObjects(this, searcher, range);
return searcher.GetTarget();
}
public GameObject FindNearestGameObjectOfType(GameObjectTypes type, float range)
{
var checker = new NearestGameObjectTypeInObjectRangeCheck(this, type, range);
+25
View File
@@ -2772,6 +2772,31 @@ namespace Game.Maps
float i_range;
}
// Success at unit in range, range update for next check (this can be use with GameobjectLastSearcher to find nearest unspawned GO)
class NearestUnspawnedGameObjectEntryInObjectRangeCheck : ICheck<GameObject>
{
WorldObject i_obj;
uint i_entry;
float i_range;
public NearestUnspawnedGameObjectEntryInObjectRangeCheck(WorldObject obj, uint entry, float range)
{
i_obj = obj;
i_entry = entry;
i_range = range;
}
public bool Invoke(GameObject go)
{
if (!go.IsSpawned() && go.GetEntry() == i_entry && go.GetGUID() != i_obj.GetGUID() && i_obj.IsWithinDistInMap(go, i_range))
{
i_range = i_obj.GetDistance(go); // use found GO range as new range limit for next check
return true;
}
return false;
}
}
// Success at unit in range, range update for next check (this can be use with GameobjectLastSearcher to find nearest GO with a certain type)
class NearestGameObjectTypeInObjectRangeCheck : ICheck<GameObject>
{