Core/SAI: Added support for StringIds to creature and gameobject targets

Port From (https://github.com/TrinityCore/TrinityCore/commit/2ce40684595a0e49a7b2355012c2806952698ce4)
This commit is contained in:
Hondacrx
2024-08-05 17:23:37 -04:00
parent 54e6b02ffc
commit 5a9714a375
15 changed files with 149 additions and 118 deletions
+1 -1
View File
@@ -103,7 +103,7 @@ namespace Framework.Constants
/// <summary> /// <summary>
/// Smart AI Const /// Smart AI Const
/// </summary> /// </summary>
public const int SmartEventParamCount = 4; public const int SmartEventParamCount = 5;
public const int SmartActionParamCount = 7; public const int SmartActionParamCount = 7;
public const uint SmartSummonCounter = 0xFFFFFF; public const uint SmartSummonCounter = 0xFFFFFF;
public const uint SmartEscortTargets = 0xFFFFFF; public const uint SmartEscortTargets = 0xFFFFFF;
+7 -7
View File
@@ -321,7 +321,7 @@ namespace Framework.Constants
RemoveNpcFlag = 83, // Flags RemoveNpcFlag = 83, // Flags
SimpleTalk = 84, // Groupid, Can Be Used To Make Players Say Groupid, TextOver Event Is Not Triggered, Whisper Can Not Be Used (Target Units Will Say The Text) SimpleTalk = 84, // Groupid, Can Be Used To Make Players Say Groupid, TextOver Event Is Not Triggered, Whisper Can Not Be Used (Target Units Will Say The Text)
SelfCast = 85, // Spellid, Castflags SelfCast = 85, // Spellid, Castflags
CrossCast = 86, // Spellid, Castflags, Castertargettype, Castertarget Param1, Castertarget Param2, Castertarget Param3, ( + The Origonal Target Fields As Destination Target), Castertargets Will Cast Spellid On All Targets (Use With Caution If Targeting Multiple * Multiple Units) CrossCast = 86, // spellID, castFlags, CasterTargetType, CasterTarget param1, CasterTarget param2, CasterTarget param3, CasterTarget param4, CasterTarget ParamString ( + the original target fields as Destination target), CasterTargets will cast spellID on all Targets (use with caution if targeting multiple * multiple units)
CallRandomTimedActionlist = 87, // Script9 Ids 1-9 CallRandomTimedActionlist = 87, // Script9 Ids 1-9
CallRandomRangeTimedActionlist = 88, // Script9 Id Min, Max CallRandomRangeTimedActionlist = 88, // Script9 Id Min, Max
RandomMove = 89, // Maxdist RandomMove = 89, // Maxdist
@@ -401,18 +401,18 @@ namespace Framework.Constants
HostileRandomNotTop = 6, // Any random target except top threat, maxdist, playerOnly, powerType + 1 HostileRandomNotTop = 6, // Any random target except top threat, maxdist, playerOnly, powerType + 1
ActionInvoker = 7, // Unit Who Caused This Event To Occur ActionInvoker = 7, // Unit Who Caused This Event To Occur
Position = 8, // Use Xyz From Event Params Position = 8, // Use Xyz From Event Params
CreatureRange = 9, // Creatureentry(0any), Mindist, Maxdist CreatureRange = 9, // Creatureentry(0any), Mindist, Maxdist, maxSize, StringId
CreatureGuid = 10, // Guid, Entry CreatureGuid = 10, // Guid, Entry
CreatureDistance = 11, // Creatureentry(0any), Maxdist CreatureDistance = 11, // Creatureentry(0any), Maxdist, maxSize, StringId
Stored = 12, // Id, Uses Pre-Stored Target(List) Stored = 12, // Id, Uses Pre-Stored Target(List)
GameobjectRange = 13, // Entry(0any), Min, Max GameobjectRange = 13, // Entry(0any), minDist, maxDist, StringId
GameobjectGuid = 14, // Guid, Entry GameobjectGuid = 14, // Guid, Entry
GameobjectDistance = 15, // Entry(0any), Maxdist GameobjectDistance = 15, // Entry(0any), Maxdist, StringId
InvokerParty = 16, // Invoker'S Party Members InvokerParty = 16, // Invoker'S Party Members
PlayerRange = 17, // Min, Max PlayerRange = 17, // Min, Max
PlayerDistance = 18, // Maxdist PlayerDistance = 18, // Maxdist
ClosestCreature = 19, // Creatureentry(0any), Maxdist, Dead? ClosestCreature = 19, // Creatureentry(0any), Maxdist, Dead?, StringId
ClosestGameobject = 20, // Entry(0any), Maxdist ClosestGameobject = 20, // Entry(0any), Maxdist, StringId
ClosestPlayer = 21, // Maxdist ClosestPlayer = 21, // Maxdist
ActionInvokerVehicle = 22, // Unit'S Vehicle Who Caused This Event To Occur ActionInvokerVehicle = 22, // Unit'S Vehicle Who Caused This Event To Occur
OwnerOrSummoner = 23, // Unit's owner or summoner, Use Owner/Charmer of this unit OwnerOrSummoner = 23, // Unit's owner or summoner, Use Owner/Charmer of this unit
@@ -11,7 +11,7 @@ namespace Framework.Database
PrepareStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER, "DELETE FROM linked_respawn WHERE linkedGuid = ? AND linkType = ?"); PrepareStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER, "DELETE FROM linked_respawn WHERE linkedGuid = ? AND linkType = ?");
PrepareStatement(WorldStatements.REP_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid, linkType) VALUES (?, ?, ?)"); PrepareStatement(WorldStatements.REP_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid, linkType) VALUES (?, ?, ?)");
PrepareStatement(WorldStatements.SEL_CREATURE_TEXT, "SELECT CreatureID, GroupID, ID, Text, Type, Language, Probability, Emote, Duration, Sound, SoundPlayType, BroadcastTextId, TextRange FROM creature_text"); PrepareStatement(WorldStatements.SEL_CREATURE_TEXT, "SELECT CreatureID, GroupID, ID, Text, Type, Language, Probability, Emote, Duration, Sound, SoundPlayType, BroadcastTextId, TextRange FROM creature_text");
PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, Difficulties, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, action_param7, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link"); PrepareStatement(WorldStatements.SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, Difficulties, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param_string, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, action_param7, action_param_string, target_type, target_param1, target_param2, target_param3, target_param4, target_param_string, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link");
PrepareStatement(WorldStatements.DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?");
PrepareStatement(WorldStatements.DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?");
PrepareStatement(WorldStatements.INS_GRAVEYARD_ZONE, "INSERT INTO graveyard_zone (ID, GhostZone) VALUES (?, ?)"); PrepareStatement(WorldStatements.INS_GRAVEYARD_ZONE, "INSERT INTO graveyard_zone (ID, GhostZone) VALUES (?, ?)");
+71 -9
View File
@@ -244,16 +244,18 @@ namespace Game.AI
temp.Action.raw.param5 = result.Read<uint>(20); temp.Action.raw.param5 = result.Read<uint>(20);
temp.Action.raw.param6 = result.Read<uint>(21); temp.Action.raw.param6 = result.Read<uint>(21);
temp.Action.raw.param7 = result.Read<uint>(22); temp.Action.raw.param7 = result.Read<uint>(22);
temp.Action.param_string = result.Read<string>(23);
temp.Target.type = (SmartTargets)result.Read<byte>(23); temp.Target.type = (SmartTargets)result.Read<byte>(24);
temp.Target.raw.param1 = result.Read<uint>(24); temp.Target.raw.param1 = result.Read<uint>(25);
temp.Target.raw.param2 = result.Read<uint>(25); temp.Target.raw.param2 = result.Read<uint>(26);
temp.Target.raw.param3 = result.Read<uint>(26); temp.Target.raw.param3 = result.Read<uint>(27);
temp.Target.raw.param4 = result.Read<uint>(27); temp.Target.raw.param4 = result.Read<uint>(28);
temp.Target.x = result.Read<float>(28); temp.Target.param_string = result.Read<string>(29);
temp.Target.y = result.Read<float>(29); temp.Target.x = result.Read<float>(30);
temp.Target.z = result.Read<float>(30); temp.Target.y = result.Read<float>(31);
temp.Target.o = result.Read<float>(31); temp.Target.z = result.Read<float>(32);
temp.Target.o = result.Read<float>(33);
//check target //check target
if (!IsTargetValid(temp)) if (!IsTargetValid(temp))
@@ -657,6 +659,22 @@ namespace Game.AI
Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused event_param{index + 1} with value {value}, it should be 0."); Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused event_param{index + 1} with value {value}, it should be 0.");
} }
bool eventUsesStringParam()
{
switch (e.GetEventType())
{
case SmartEvents.SceneTrigger:
return true;
default:
break;
}
return false;
}
if (!eventUsesStringParam() && !e.Event.param_string.IsEmpty())
Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused event_param_string with value {e.Event.param_string}, it should be NULL.");
return true; return true;
} }
@@ -834,6 +852,22 @@ namespace Game.AI
Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused action_param{index + 1} with value {value}, it should be 0."); Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused action_param{index + 1} with value {value}, it should be 0.");
} }
bool actionUsesStringParam()
{
switch (e.GetActionType())
{
case SmartActions.CrossCast:
return true;
default:
break;
}
return false;
};
if (!actionUsesStringParam() && !e.Action.param_string.IsEmpty())
Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused action_param_string with value {e.Action.param_string}, it should be NULL.");
return true; return true;
} }
@@ -901,6 +935,27 @@ namespace Game.AI
Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused target_param{index + 1} with value {value}, it must be 0, skipped."); Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused target_param{index + 1} with value {value}, it must be 0, skipped.");
} }
bool targetUsesStringParam()
{
switch (e.GetTargetType())
{
case SmartTargets.CreatureRange:
case SmartTargets.CreatureDistance:
case SmartTargets.GameobjectRange:
case SmartTargets.GameobjectDistance:
case SmartTargets.ClosestCreature:
case SmartTargets.ClosestGameobject:
return true;
default:
break;
}
return false;
}
if (!targetUsesStringParam() && !e.Target.param_string.IsEmpty())
Log.outWarn(LogFilter.Sql, $"SmartAIMgr: {e} has unused target_param_string with value {e.Target.param_string}, it should be NULL.");
return true; return true;
} }
@@ -3172,6 +3227,9 @@ namespace Game.AI
[FieldOffset(4)] [FieldOffset(4)]
public Raw raw; public Raw raw;
[FieldOffset(32)]
public string param_string;
#region Stucts #region Stucts
public struct Talk public struct Talk
{ {
@@ -3241,6 +3299,7 @@ namespace Game.AI
public uint targetParam1; public uint targetParam1;
public uint targetParam2; public uint targetParam2;
public uint targetParam3; public uint targetParam3;
public uint targetParam4;
} }
public struct SummonCreature public struct SummonCreature
{ {
@@ -3807,6 +3866,9 @@ namespace Game.AI
[FieldOffset(20)] [FieldOffset(20)]
public Raw raw; public Raw raw;
[FieldOffset(36)]
public string param_string;
#region Structs #region Structs
public struct HostilRandom public struct HostilRandom
{ {
+46 -79
View File
@@ -1575,7 +1575,7 @@ namespace Game.AI
if (targets.Empty()) if (targets.Empty())
break; break;
List<WorldObject> casters = GetTargets(CreateSmartEvent(SmartEvents.UpdateIc, 0, 0, 0, 0, 0, 0, SmartActions.None, 0, 0, 0, 0, 0, 0, 0, (SmartTargets)e.Action.crossCast.targetType, e.Action.crossCast.targetParam1, e.Action.crossCast.targetParam2, e.Action.crossCast.targetParam3, 0, 0), unit); List<WorldObject> casters = GetTargets(CreateSmartEvent(SmartEvents.UpdateIc, 0, 0, 0, 0, 0, 0, SmartActions.None, 0, 0, 0, 0, 0, 0, 0, (SmartTargets)e.Action.crossCast.targetType, e.Action.crossCast.targetParam1, e.Action.crossCast.targetParam2, e.Action.crossCast.targetParam3, e.Action.crossCast.targetParam4, e.Action.param_string, 0), unit);
CastSpellExtraArgs args = new(); CastSpellExtraArgs args = new();
if (e.Action.crossCast.castFlags.HasAnyFlag((uint)SmartCastFlags.Triggered)) if (e.Action.crossCast.castFlags.HasAnyFlag((uint)SmartCastFlags.Triggered))
@@ -2515,7 +2515,7 @@ namespace Game.AI
SmartScriptHolder CreateSmartEvent(SmartEvents e, SmartEventFlags event_flags, uint event_param1, uint event_param2, uint event_param3, uint event_param4, uint event_param5, SmartScriptHolder CreateSmartEvent(SmartEvents e, SmartEventFlags event_flags, uint event_param1, uint event_param2, uint event_param3, uint event_param4, uint event_param5,
SmartActions action, uint action_param1, uint action_param2, uint action_param3, uint action_param4, uint action_param5, uint action_param6, uint action_param7, SmartActions action, uint action_param1, uint action_param2, uint action_param3, uint action_param4, uint action_param5, uint action_param6, uint action_param7,
SmartTargets t, uint target_param1, uint target_param2, uint target_param3, uint target_param4, uint phaseMask) SmartTargets t, uint target_param1, uint target_param2, uint target_param3, uint target_param4, string targetParamString, uint phaseMask)
{ {
SmartScriptHolder script = new(); SmartScriptHolder script = new();
script.Event.type = e; script.Event.type = e;
@@ -2542,6 +2542,7 @@ namespace Game.AI
script.Target.raw.param2 = target_param2; script.Target.raw.param2 = target_param2;
script.Target.raw.param3 = target_param3; script.Target.raw.param3 = target_param3;
script.Target.raw.param4 = target_param4; script.Target.raw.param4 = target_param4;
script.Target.param_string = targetParamString;
script.SourceType = SmartScriptType.Creature; script.SourceType = SmartScriptType.Creature;
InitTimer(script); InitTimer(script);
@@ -2694,18 +2695,9 @@ namespace Game.AI
break; break;
} }
List<WorldObject> units = GetWorldObjectsInDist(e.Target.unitRange.maxDist); List<Creature> creatures = refObj.GetCreatureListWithOptionsInGrid(e.Target.unitRange.maxDist,
foreach (var obj in units) new FindCreatureOptions() { CreatureId = e.Target.unitRange.creature != 0 ? e.Target.unitRange.creature : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null, });
{ targets.AddRange(creatures.Where(target => !refObj.IsWithinDist(target, e.Target.unitRange.minDist)));
if (!IsCreature(obj))
continue;
if (_me != null && _me == obj)
continue;
if ((e.Target.unitRange.creature == 0 || obj.ToCreature().GetEntry() == e.Target.unitRange.creature) && refObj.IsInRange(obj, e.Target.unitRange.minDist, e.Target.unitRange.maxDist))
targets.Add(obj);
}
if (e.Target.unitRange.maxSize != 0) if (e.Target.unitRange.maxSize != 0)
targets.RandomResize(e.Target.unitRange.maxSize); targets.RandomResize(e.Target.unitRange.maxSize);
@@ -2713,42 +2705,19 @@ namespace Game.AI
} }
case SmartTargets.CreatureDistance: case SmartTargets.CreatureDistance:
{ {
List<WorldObject> units = GetWorldObjectsInDist(e.Target.unitDistance.dist); if (baseObject == null)
foreach (var obj in units) break;
{
if (!IsCreature(obj))
continue;
if (_me != null && _me == obj) List<Creature> creatures = baseObject.GetCreatureListWithOptionsInGrid(e.Target.unitDistance.dist,
continue; new FindCreatureOptions() { CreatureId = e.Target.unitDistance.creature != 0 ? e.Target.unitDistance.creature : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null });
if (e.Target.unitDistance.creature == 0 || obj.ToCreature().GetEntry() == e.Target.unitDistance.creature) targets.Clear();
targets.Add(obj); targets.AddRange(creatures);
}
if (e.Target.unitDistance.maxSize != 0) if (e.Target.unitDistance.maxSize != 0)
targets.RandomResize(e.Target.unitDistance.maxSize); targets.RandomResize(e.Target.unitDistance.maxSize);
break; break;
} }
case SmartTargets.GameobjectDistance:
{
List<WorldObject> units = GetWorldObjectsInDist(e.Target.goDistance.dist);
foreach (var obj in units)
{
if (!IsGameObject(obj))
continue;
if (_go != null && _go == obj)
continue;
if (e.Target.goDistance.entry == 0 || obj.ToGameObject().GetEntry() == e.Target.goDistance.entry)
targets.Add(obj);
}
if (e.Target.goDistance.maxSize != 0)
targets.RandomResize(e.Target.goDistance.maxSize);
break;
}
case SmartTargets.GameobjectRange: case SmartTargets.GameobjectRange:
{ {
WorldObject refObj = baseObject; WorldObject refObj = baseObject;
@@ -2761,23 +2730,29 @@ namespace Game.AI
break; break;
} }
List<WorldObject> units = GetWorldObjectsInDist(e.Target.goRange.maxDist); List<GameObject> gameObjects = refObj.GetGameObjectListWithOptionsInGrid(e.Target.goRange.maxDist,
foreach (var obj in units) new FindGameObjectOptions() { GameObjectId = e.Target.goRange.entry != 0 ? e.Target.goRange.entry : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null });
{ targets.AddRange(gameObjects.Where(target => !refObj.IsWithinDist(target, e.Target.goRange.minDist)));
if (!IsGameObject(obj))
continue;
if (_go != null && _go == obj)
continue;
if ((e.Target.goRange.entry == 0 || obj.ToGameObject().GetEntry() == e.Target.goRange.entry) && refObj.IsInRange(obj, e.Target.goRange.minDist, e.Target.goRange.maxDist))
targets.Add(obj);
}
if (e.Target.goRange.maxSize != 0) if (e.Target.goRange.maxSize != 0)
targets.RandomResize(e.Target.goRange.maxSize); targets.RandomResize(e.Target.goRange.maxSize);
break; break;
} }
case SmartTargets.GameobjectDistance:
{
if (baseObject == null)
break;
List<GameObject> gameObjects = baseObject.GetGameObjectListWithOptionsInGrid(e.Target.goDistance.dist,
new FindGameObjectOptions() { GameObjectId = e.Target.goDistance.entry != 0 ? e.Target.goDistance.entry : null, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null });
targets.Clear();
targets.AddRange(gameObjects);
if (e.Target.goDistance.maxSize != 0)
targets.RandomResize(e.Target.goDistance.maxSize);
break;
}
case SmartTargets.CreatureGuid: case SmartTargets.CreatureGuid:
{ {
if (scriptTrigger == null && baseObject == null) if (scriptTrigger == null && baseObject == null)
@@ -2808,20 +2783,21 @@ namespace Game.AI
} }
case SmartTargets.PlayerRange: case SmartTargets.PlayerRange:
{ {
List<WorldObject> units = GetWorldObjectsInDist(e.Target.playerRange.maxDist); if (baseObject == null)
if (!units.Empty() && baseObject != null) break;
foreach (var obj in units)
if (IsPlayer(obj) && baseObject.IsInRange(obj, e.Target.playerRange.minDist, e.Target.playerRange.maxDist)) List<Player> players = baseObject.GetPlayerListInGrid(e.Target.playerRange.maxDist);
targets.Add(obj); targets.AddRange(players.Where(target => !baseObject.IsWithinDist(target, e.Target.playerRange.minDist)));
break; break;
} }
case SmartTargets.PlayerDistance: case SmartTargets.PlayerDistance:
{ {
List<WorldObject> units = GetWorldObjectsInDist(e.Target.playerDistance.dist); if (baseObject == null)
foreach (var obj in units) break;
if (IsPlayer(obj))
targets.Add(obj); List<Player> players = baseObject.GetPlayerListInGrid(e.Target.playerDistance.dist);
targets.AddRange(players);
break; break;
} }
case SmartTargets.Stored: case SmartTargets.Stored:
@@ -2854,7 +2830,9 @@ namespace Game.AI
break; break;
} }
Creature target = refObj.FindNearestCreature(e.Target.unitClosest.entry, e.Target.unitClosest.dist != 0 ? e.Target.unitClosest.dist : 100, e.Target.unitClosest.dead == 0); Creature target = refObj.FindNearestCreatureWithOptions(e.Target.unitClosest.dist != 0 ? e.Target.unitClosest.dist : 100,
new FindCreatureOptions() { CreatureId = e.Target.unitClosest.entry, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null, IsAlive = e.Target.unitClosest.dead == 0 });
if (target != null) if (target != null)
targets.Add(target); targets.Add(target);
break; break;
@@ -2871,7 +2849,9 @@ namespace Game.AI
break; break;
} }
GameObject target = refObj.FindNearestGameObject(e.Target.goClosest.entry, e.Target.goClosest.dist != 0 ? e.Target.goClosest.dist : 100); GameObject target = refObj.FindNearestGameObjectWithOptions(e.Target.goClosest.dist != 0 ? e.Target.goClosest.dist : 100,
new FindGameObjectOptions() { GameObjectId = e.Target.goClosest.entry, StringId = !e.Target.param_string.IsEmpty() ? e.Target.param_string : null });
if (target != null) if (target != null)
targets.Add(target); targets.Add(target);
break; break;
@@ -3010,19 +2990,6 @@ namespace Game.AI
return targets; return targets;
} }
List<WorldObject> GetWorldObjectsInDist(float dist)
{
List<WorldObject> targets = new();
WorldObject obj = GetBaseObject();
if (obj == null)
return targets;
var u_check = new AllWorldObjectsInRange(obj, dist);
var searcher = new WorldObjectListSearcher(obj, targets, u_check);
Cell.VisitAllObjects(obj, searcher, dist);
return targets;
}
void ProcessEvent(SmartScriptHolder e, Unit unit = null, uint var0 = 0, uint var1 = 0, bool bvar = false, SpellInfo spell = null, GameObject gob = null, string varString = "") void ProcessEvent(SmartScriptHolder e, Unit unit = null, uint var0 = 0, uint var1 = 0, bool bvar = false, SpellInfo spell = null, GameObject gob = null, string varString = "")
{ {
if (!e.Active && e.GetEventType() != SmartEvents.Link) if (!e.Active && e.GetEventType() != SmartEvents.Link)
+1 -1
View File
@@ -141,7 +141,7 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.NpcinfoArmor, target.GetArmor()); handler.SendSysMessage(CypherStrings.NpcinfoArmor, target.GetArmor());
handler.SendSysMessage(CypherStrings.NpcinfoPosition, target.GetPositionX(), target.GetPositionY(), target.GetPositionZ()); handler.SendSysMessage(CypherStrings.NpcinfoPosition, target.GetPositionX(), target.GetPositionY(), target.GetPositionZ());
handler.SendSysMessage(CypherStrings.ObjectinfoAiInfo, target.GetAIName(), target.GetScriptName()); handler.SendSysMessage(CypherStrings.ObjectinfoAiInfo, target.GetAIName(), target.GetScriptName());
handler.SendSysMessage(CypherStrings.ObjectinfoStringIds, target.GetStringIds()[0], target.GetStringIds()[1], target.GetStringIds()[2]); handler.SendSysMessage(CypherStrings.ObjectinfoStringIds, target.GetStringId(StringIdType.Template), target.GetStringId(StringIdType.Spawn), target.GetStringId(StringIdType.Script));
handler.SendSysMessage(CypherStrings.NpcinfoReactstate, target.GetReactState()); handler.SendSysMessage(CypherStrings.NpcinfoReactstate, target.GetReactState());
var ai = target.GetAI(); var ai = target.GetAI();
if (ai != null) if (ai != null)
@@ -609,8 +609,10 @@ namespace Game.Entities
var check = new AnyUnitInObjectRangeCheck(this, radius, check3D); var check = new AnyUnitInObjectRangeCheck(this, radius, check3D);
if (IsStaticSpawn()) if (IsStaticSpawn())
{ {
var searcher = new PlayerListSearcher(this, targetList, check); List<Player> temp = new List<Player>();
var searcher = new PlayerListSearcher(this, temp, check);
Cell.VisitWorldObjects(this, searcher, GetMaxSearchRadius()); Cell.VisitWorldObjects(this, searcher, GetMaxSearchRadius());
targetList.AddRange(temp);
} }
else else
{ {
@@ -2943,7 +2943,6 @@ namespace Game.Entities
} }
} }
public string[] GetStringIds() { return m_stringIds; }
public string GetStringId(StringIdType type) { return m_stringIds[(int)type]; } public string GetStringId(StringIdType type) { return m_stringIds[(int)type]; }
public VendorItemData GetVendorItems() public VendorItemData GetVendorItems()
@@ -2693,7 +2693,6 @@ namespace Game.Entities
} }
} }
public string[] GetStringIds() { return m_stringIds; }
public string GetStringId(StringIdType type) { return m_stringIds[(int)type]; } public string GetStringId(StringIdType type) { return m_stringIds[(int)type]; }
public override string GetName(Locale locale = Locale.enUS) public override string GetName(Locale locale = Locale.enUS)
@@ -4592,7 +4591,7 @@ namespace Game.Entities
void HandleHeartbeat() void HandleHeartbeat()
{ {
// update player list inside control zone // update player list inside control zone
List<Unit> targetList = new(); List<Player> targetList = new();
SearchTargets(targetList); SearchTargets(targetList);
int oldControllingTeam = GetControllingTeam(); int oldControllingTeam = GetControllingTeam();
@@ -4641,7 +4640,7 @@ namespace Game.Entities
player.SendUpdateWorldState(_owner.GetGoInfo().ControlZone.worldstate2, (uint)roundedValue); player.SendUpdateWorldState(_owner.GetGoInfo().ControlZone.worldstate2, (uint)roundedValue);
} }
void SearchTargets(List<Unit> targetList) void SearchTargets(List<Player> targetList)
{ {
AnyUnitInObjectRangeCheck check = new(_owner, _owner.GetGoInfo().ControlZone.radius, true); AnyUnitInObjectRangeCheck check = new(_owner, _owner.GetGoInfo().ControlZone.radius, true);
PlayerListSearcher searcher = new(_owner, targetList, check); PlayerListSearcher searcher = new(_owner, targetList, check);
@@ -4649,7 +4648,7 @@ namespace Game.Entities
HandleUnitEnterExit(targetList); HandleUnitEnterExit(targetList);
} }
float CalculatePointsPerSecond(List<Unit> targetList) float CalculatePointsPerSecond(List<Player> targetList)
{ {
int delta = 0; int delta = 0;
@@ -4683,7 +4682,7 @@ namespace Game.Entities
return percentageIncrease; return percentageIncrease;
} }
void HandleUnitEnterExit(List<Unit> newTargetList) void HandleUnitEnterExit(List<Player> newTargetList)
{ {
List<ObjectGuid> exitPlayers = new(_insidePlayers); List<ObjectGuid> exitPlayers = new(_insidePlayers);
+7 -5
View File
@@ -2887,15 +2887,17 @@ namespace Game.Entities
return gameobjectList; return gameobjectList;
} }
void GetGameObjectListWithOptionsInGrid(List<GameObject> gameObjectContainer, float maxSearchRange, FindGameObjectOptions options) public List<GameObject> GetGameObjectListWithOptionsInGrid(float maxSearchRange, FindGameObjectOptions options)
{ {
List<GameObject> gameobjectList = new();
InRangeCheckCustomizer checkCustomizer = new(this, maxSearchRange); InRangeCheckCustomizer checkCustomizer = new(this, maxSearchRange);
GameObjectWithOptionsInObjectRangeCheck<InRangeCheckCustomizer> check = new(this, checkCustomizer, options); GameObjectWithOptionsInObjectRangeCheck<InRangeCheckCustomizer> check = new(this, checkCustomizer, options);
GameObjectListSearcher searcher = new(this, gameObjectContainer, check); GameObjectListSearcher searcher = new(this, gameobjectList, check);
if (options.IgnorePhases) if (options.IgnorePhases)
searcher.i_phaseShift = PhasingHandler.GetAlwaysVisiblePhaseShift(); searcher.i_phaseShift = PhasingHandler.GetAlwaysVisiblePhaseShift();
Cell.VisitGridObjects(this, searcher, maxSearchRange); Cell.VisitGridObjects(this, searcher, maxSearchRange);
return gameobjectList;
} }
public List<Creature> GetCreatureListWithEntryInGrid(uint entry = 0, float maxSearchRange = 250.0f) public List<Creature> GetCreatureListWithEntryInGrid(uint entry = 0, float maxSearchRange = 250.0f)
@@ -2921,9 +2923,9 @@ namespace Game.Entities
return creatureList; return creatureList;
} }
public List<Unit> GetPlayerListInGrid(float maxSearchRange, bool alive = true) public List<Player> GetPlayerListInGrid(float maxSearchRange, bool alive = true)
{ {
List<Unit> playerList = new(); List<Player> playerList = new();
var checker = new AnyPlayerInObjectRangeCheck(this, maxSearchRange, alive); var checker = new AnyPlayerInObjectRangeCheck(this, maxSearchRange, alive);
var searcher = new PlayerListSearcher(this, playerList, checker); var searcher = new PlayerListSearcher(this, playerList, checker);
@@ -3015,7 +3017,7 @@ namespace Game.Entities
if (!IsInWorld) if (!IsInWorld)
return; return;
List<Unit> targets = new(); List<Player> targets = new();
var check = new AnyPlayerInObjectRangeCheck(this, GetVisibilityRange(), false); var check = new AnyPlayerInObjectRangeCheck(this, GetVisibilityRange(), false);
var searcher = new PlayerListSearcher(this, targets, check); var searcher = new PlayerListSearcher(this, targets, check);
+3 -3
View File
@@ -1830,16 +1830,16 @@ namespace Game.Maps
public class PlayerListSearcher : Notifier public class PlayerListSearcher : Notifier
{ {
PhaseShift i_phaseShift; PhaseShift i_phaseShift;
List<Unit> i_objects; List<Player> i_objects;
ICheck<Player> i_check; ICheck<Player> i_check;
public PlayerListSearcher(WorldObject searcher, List<Unit> objects, ICheck<Player> check) public PlayerListSearcher(WorldObject searcher, List<Player> objects, ICheck<Player> check)
{ {
i_phaseShift = searcher.GetPhaseShift(); i_phaseShift = searcher.GetPhaseShift();
i_objects = objects; i_objects = objects;
i_check = check; i_check = check;
} }
public PlayerListSearcher(PhaseShift phaseShift, List<Unit> objects, ICheck<Player> check) public PlayerListSearcher(PhaseShift phaseShift, List<Player> objects, ICheck<Player> check)
{ {
i_phaseShift = phaseShift; i_phaseShift = phaseShift;
i_objects = objects; i_objects = objects;
+1 -1
View File
@@ -51,7 +51,7 @@ namespace Scripts.Events.LoveIsInTheAir
bool foundSomeone = false; bool foundSomeone = false;
// For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123) // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123)
// required by achievement and "hearts" visual // required by achievement and "hearts" visual
List<Unit> playerList = new(); List<Player> playerList = new();
AnyPlayerInObjectRangeCheck checker = new(target, SharedConst.InteractionDistance * 2); AnyPlayerInObjectRangeCheck checker = new(target, SharedConst.InteractionDistance * 2);
PlayerListSearcher searcher = new(target, playerList, checker); PlayerListSearcher searcher = new(target, playerList, checker);
Cell.VisitWorldObjects(target, searcher, SharedConst.InteractionDistance * 2); Cell.VisitWorldObjects(target, searcher, SharedConst.InteractionDistance * 2);
+1 -1
View File
@@ -648,7 +648,7 @@ namespace Scripts.Spells.Azerite
{ {
Unit caster = GetCaster(); Unit caster = GetCaster();
// Check for player that is in 65 y range // Check for player that is in 65 y range
List<Unit> playerList = new(); List<Player> playerList = new();
AnyPlayerInObjectRangeCheck checker = new(caster, 65.0f); AnyPlayerInObjectRangeCheck checker = new(caster, 65.0f);
PlayerListSearcher searcher = new(caster, playerList, checker); PlayerListSearcher searcher = new(caster, playerList, checker);
Cell.VisitWorldObjects(caster, searcher, 65.0f); Cell.VisitWorldObjects(caster, searcher, 65.0f);
+2 -2
View File
@@ -451,7 +451,7 @@ namespace Scripts.World.GameObjects
break; break;
// Neurtal // Neurtal
case BrewfestMusicAreasIds.Shattrath: case BrewfestMusicAreasIds.Shattrath:
List<Unit> playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange()); List<Player> playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange());
foreach (Player player in playersNearby) foreach (Player player in playersNearby)
{ {
if (player.GetTeam() == Team.Horde) if (player.GetTeam() == Team.Horde)
@@ -517,7 +517,7 @@ namespace Scripts.World.GameObjects
if (!GameEventMgr.IsHolidayActive(HolidayIds.MidsummerFireFestival)) if (!GameEventMgr.IsHolidayActive(HolidayIds.MidsummerFireFestival))
return; return;
List<Unit> playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange()); List<Player> playersNearby = me.GetPlayerListInGrid(me.GetVisibilityRange());
foreach (Player player in playersNearby) foreach (Player player in playersNearby)
{ {
if (player.GetTeam() == Team.Horde) if (player.GetTeam() == Team.Horde)
+1 -1
View File
@@ -393,7 +393,7 @@ namespace Scripts.World.NpcsSpecial
bool checkNearbyPlayers() bool checkNearbyPlayers()
{ {
// Returns true if no nearby player has aura "Test Ribbon Pole Channel". // Returns true if no nearby player has aura "Test Ribbon Pole Channel".
List<Unit> players = new(); List<Player> players = new();
UnitAuraCheck check = new(true, SpellRibbonDanceCosmetic); UnitAuraCheck check = new(true, SpellRibbonDanceCosmetic);
PlayerListSearcher searcher = new(me, players, check); PlayerListSearcher searcher = new(me, players, check);
Cell.VisitWorldObjects(me, searcher, 10.0f); Cell.VisitWorldObjects(me, searcher, 10.0f);