aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp18
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp445
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h5
3 files changed, 192 insertions, 276 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index de5fbddfb5a..ca10757769b 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -191,7 +191,7 @@ void SmartAI::EndPath(bool fail)
ObjectVector const* targets = GetScript()->GetStoredTargetVector(SMART_ESCORT_TARGETS, *me);
if (targets && _escortQuestId)
{
- if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin())))
+ if (targets->size() == 1 && targets->front()->IsPlayer())
{
Player* player = targets->front()->ToPlayer();
if (!fail && player->IsAtGroupRewardDistance(me) && !player->HasCorpse())
@@ -219,9 +219,8 @@ void SmartAI::EndPath(bool fail)
{
for (WorldObject* target : *targets)
{
- if (GetScript()->IsPlayer(target))
+ if (Player* player = target->ToPlayer())
{
- Player* player = target->ToPlayer();
if (!fail && player->IsAtGroupRewardDistance(me) && !player->HasCorpse())
player->AreaExploredOrEventHappens(_escortQuestId);
else if (fail)
@@ -298,9 +297,9 @@ bool SmartAI::IsEscortInvokerInRange()
if (ObjectVector const* targets = GetScript()->GetStoredTargetVector(SMART_ESCORT_TARGETS, *me))
{
float checkDist = me->GetInstanceScript() ? SMART_ESCORT_MAX_PLAYER_DIST * 2 : SMART_ESCORT_MAX_PLAYER_DIST;
- if (targets->size() == 1 && GetScript()->IsPlayer((*targets->begin())))
+ if (targets->size() == 1 && targets->front()->IsPlayer())
{
- Player* player = (*targets->begin())->ToPlayer();
+ Player* player = targets->front()->ToPlayer();
if (me->GetDistance(player) <= checkDist)
return true;
@@ -317,13 +316,8 @@ bool SmartAI::IsEscortInvokerInRange()
else
{
for (WorldObject* target : *targets)
- {
- if (GetScript()->IsPlayer(target))
- {
- if (me->GetDistance(target->ToPlayer()) <= checkDist)
- return true;
- }
- }
+ if (target->IsPlayer() && me->GetDistance(target) <= checkDist)
+ return true;
}
// no valid target found
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 97e98502e3b..12243ac4aff 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -327,21 +327,19 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsCreature(target) && !target->ToCreature()->IsPet()) // Prevented sending text to pets.
+ if (Unit* targetUnit = target->ToUnit())
{
- if (e.action.talk.useTalkTarget)
+ if (targetUnit->IsPet()) // Prevented sending text to pets.
+ continue;
+
+ if (targetUnit->IsPlayer() || e.action.talk.useTalkTarget)
{
talker = me;
- talkTarget = target->ToCreature();
+ talkTarget = targetUnit;
}
else
- talker = target->ToCreature();
- break;
- }
- else if (IsPlayer(target))
- {
- talker = me;
- talkTarget = target->ToPlayer();
+ talker = targetUnit->ToCreature();
+
break;
}
}
@@ -367,13 +365,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
uint32 duration = 0;
for (WorldObject* target : targets)
{
- if (IsCreature(target))
- duration = std::max(sCreatureTextMgr->SendChat(target->ToCreature(), uint8(e.action.simpleTalk.textGroupID), IsPlayer(GetLastInvoker()) ? GetLastInvoker() : nullptr), duration);
- else if (IsPlayer(target) && me)
- {
- Unit* templastInvoker = GetLastInvoker();
- duration = std::max(sCreatureTextMgr->SendChat(me, uint8(e.action.simpleTalk.textGroupID), IsPlayer(templastInvoker) ? templastInvoker : nullptr, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, SoundKitPlayType::Normal, TEAM_OTHER, false, target->ToPlayer()), duration);
- }
+ if (Creature* creatureTarget = target->ToCreature())
+ duration = std::max(sCreatureTextMgr->SendChat(creatureTarget, uint8(e.action.simpleTalk.textGroupID), Object::ToPlayer(GetLastInvoker())), duration);
+ else if (Player* playerTarget = target->ToPlayer(); playerTarget && me)
+ duration = std::max(sCreatureTextMgr->SendChat(me, uint8(e.action.simpleTalk.textGroupID), Object::ToPlayer(GetLastInvoker()), CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, SoundKitPlayType::Normal, TEAM_OTHER, false, playerTarget), duration);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SIMPLE_TALK: talker: {} {}, textGroupId: {}",
target->GetName(), target->GetGUID(), uint8(e.action.simpleTalk.textGroupID));
}
@@ -384,9 +379,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
- target->ToUnit()->HandleEmoteCommand(static_cast<Emote>(e.action.emote.emote));
+ unitTarget->HandleEmoteCommand(static_cast<Emote>(e.action.emote.emote));
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_PLAY_EMOTE: target: {} {}, emote: {}",
target->GetName(), target->GetGUID(), e.action.emote.emote);
}
@@ -397,16 +392,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsUnit(target))
- {
- if (e.action.sound.distance == 1)
- target->PlayDistanceSound(e.action.sound.sound, e.action.sound.onlySelf ? target->ToPlayer() : nullptr);
- else
- target->PlayDirectSound(e.action.sound.sound, e.action.sound.onlySelf ? target->ToPlayer() : nullptr, e.action.sound.keyBroadcastTextId);
+ if (e.action.sound.distance == 1)
+ target->PlayDistanceSound(e.action.sound.sound, e.action.sound.onlySelf ? target->ToPlayer() : nullptr);
+ else
+ target->PlayDirectSound(e.action.sound.sound, e.action.sound.onlySelf ? target->ToPlayer() : nullptr, e.action.sound.keyBroadcastTextId);
- TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SOUND: target: {} {}, sound: {}, onlyself: {}",
- target->GetName(), target->GetGUID(), e.action.sound.sound, e.action.sound.onlySelf);
- }
+ TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SOUND: target: {} {}, sound: {}, onlyself: {}",
+ target->GetName(), target->GetGUID(), e.action.sound.sound, e.action.sound.onlySelf);
}
break;
}
@@ -414,25 +406,19 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsCreature(target))
+ if (Creature* creatureTarget = target->ToCreature())
{
if (e.action.faction.factionID)
{
- target->ToCreature()->SetFaction(e.action.faction.factionID);
+ creatureTarget->SetFaction(e.action.faction.factionID);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SET_FACTION: Creature {} set faction to {}",
target->GetGUID(), e.action.faction.factionID);
}
else
{
- if (CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(target->ToCreature()->GetEntry()))
- {
- if (target->ToCreature()->GetFaction() != ci->faction)
- {
- target->ToCreature()->SetFaction(ci->faction);
- TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SET_FACTION: Creature {} set faction to {}",
- target->GetGUID(), ci->faction);
- }
- }
+ creatureTarget->RestoreFaction();
+ TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SET_FACTION: Creature {} set faction to {}",
+ target->GetGUID(), creatureTarget->GetFaction());
}
}
}
@@ -442,7 +428,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (!IsCreature(target))
+ Creature* creatureTarget = target->ToCreature();
+ if (!creatureTarget)
continue;
if (e.action.morphOrMount.creature || e.action.morphOrMount.model)
@@ -453,7 +440,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(e.action.morphOrMount.creature))
{
CreatureModel const* model = ObjectMgr::ChooseDisplayId(ci);
- target->ToCreature()->SetDisplayId(model->CreatureDisplayID);
+ creatureTarget->SetDisplayId(model->CreatureDisplayID);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL: Creature {} set displayid to {}",
target->GetGUID(), model->CreatureDisplayID);
}
@@ -461,14 +448,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
//if no param1, then use value from param2 (modelId)
else
{
- target->ToCreature()->SetDisplayId(e.action.morphOrMount.model);
+ creatureTarget->SetDisplayId(e.action.morphOrMount.model);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL: Creature {} set displayid to {}",
target->GetGUID(), e.action.morphOrMount.model);
}
}
else
{
- target->ToCreature()->DeMorph();
+ creatureTarget->DeMorph();
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_MORPH_TO_ENTRY_OR_MODEL: Creature {} demorphs.",
target->GetGUID());
}
@@ -479,9 +466,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsPlayer(target))
+ if (Player* playerTarget = target->ToPlayer())
{
- target->ToPlayer()->FailQuest(e.action.quest.quest);
+ playerTarget->FailQuest(e.action.quest.quest);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_FAIL_QUEST: Player {} fails quest {}",
target->GetGUID(), e.action.quest.quest);
}
@@ -518,12 +505,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_SET_REACT_STATE:
{
for (WorldObject* target : targets)
- {
- if (!IsCreature(target))
- continue;
-
- target->ToCreature()->SetReactState(ReactStates(e.action.react.state));
- }
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->SetReactState(ReactStates(e.action.react.state));
break;
}
case SMART_ACTION_RANDOM_EMOTE:
@@ -533,10 +516,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
Emote emote = static_cast<Emote>(Trinity::Containers::SelectRandomContainerElement(Trinity::IteratorPair(emotes.begin(), emotesEnd)));
- target->ToUnit()->HandleEmoteCommand(emote);
+ unitTarget->HandleEmoteCommand(emote);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_RANDOM_EMOTE: Creature {} handle random emote {}",
target->GetGUID(), emote);
}
@@ -563,9 +546,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
- me->GetThreatManager().ModifyThreatByPercent(target->ToUnit(), std::max<int32>(-100, int32(e.action.threatPCT.threatINC) - int32(e.action.threatPCT.threatDEC)));
+ me->GetThreatManager().ModifyThreatByPercent(unitTarget, std::max<int32>(-100, int32(e.action.threatPCT.threatINC) - int32(e.action.threatPCT.threatDEC)));
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_THREAT_SINGLE_PCT: Creature {} modify threat for unit {}, value {}",
me->GetGUID(), target->GetGUID(), int32(e.action.threatPCT.threatINC) - int32(e.action.threatPCT.threatDEC));
}
@@ -737,11 +720,11 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsGameObject(target))
+ if (GameObject* gameObject = target->ToGameObject())
{
// Activate
- target->ToGameObject()->SetLootState(GO_READY);
- target->ToGameObject()->UseDoorOrButton(0, false, unit);
+ gameObject->SetLootState(GO_READY);
+ gameObject->UseDoorOrButton(0, false, unit);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_ACTIVATE_GOBJECT. Gameobject {} activated",
target->GetGUID());
}
@@ -752,9 +735,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsGameObject(target))
+ if (GameObject* gameObject = target->ToGameObject())
{
- target->ToGameObject()->ResetDoorOrButton();
+ gameObject->ResetDoorOrButton();
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_RESET_GOBJECT. Gameobject {} reset",
target->GetGUID());
}
@@ -765,9 +748,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
- target->ToUnit()->SetEmoteState(Emote(e.action.emote.emote));
+ unitTarget->SetEmoteState(Emote(e.action.emote.emote));
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_SET_EMOTE_STATE. Unit {} set emotestate to {}",
target->GetGUID(), e.action.emote.emote);
}
@@ -858,7 +841,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (!IsUnit(target))
+ Unit* unitTarget = target->ToUnit();
+ if (!unitTarget)
continue;
if (e.action.removeAura.spell)
@@ -873,14 +857,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (e.action.removeAura.charges)
{
- if (Aura* aur = target->ToUnit()->GetAura(e.action.removeAura.spell, casterGUID))
+ if (Aura* aur = unitTarget->GetAura(e.action.removeAura.spell, casterGUID))
aur->ModCharges(-static_cast<int32>(e.action.removeAura.charges), AURA_REMOVE_BY_EXPIRE);
}
else
- target->ToUnit()->RemoveAurasDueToSpell(e.action.removeAura.spell, casterGUID);
+ unitTarget->RemoveAurasDueToSpell(e.action.removeAura.spell, casterGUID);
}
else
- target->ToUnit()->RemoveAllAuras();
+ unitTarget->RemoveAllAuras();
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_REMOVEAURASFROMSPELL: Unit {}, spell {}",
target->GetGUID(), e.action.removeAura.spell);
@@ -900,10 +884,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
float angle = e.action.follow.angle > 6 ? (e.action.follow.angle * M_PI / 180.0f) : e.action.follow.angle;
- ENSURE_AI(SmartAI, me->AI())->SetFollow(target->ToUnit(), float(e.action.follow.dist) + 0.1f, angle, e.action.follow.credit, e.action.follow.entry, e.action.follow.creditType);
+ ENSURE_AI(SmartAI, me->AI())->SetFollow(unitTarget, float(e.action.follow.dist) + 0.1f, angle, e.action.follow.credit, e.action.follow.entry, e.action.follow.creditType);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_FOLLOW: Creature {} following target {}",
me->GetGUID(), target->GetGUID());
break;
@@ -957,14 +941,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsPlayer(target))
+ if (Player* playerTarget = target->ToPlayer())
{
- target->ToPlayer()->KilledMonsterCredit(e.action.killedMonster.creature);
+ playerTarget->KilledMonsterCredit(e.action.killedMonster.creature);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_CALL_KILLEDMONSTER: Player {}, Killcredit: {}",
target->GetGUID(), e.action.killedMonster.creature);
}
- else if (IsUnit(target)) // Special handling for vehicles
- if (Vehicle* vehicle = target->ToUnit()->GetVehicleKit())
+ else if (Unit* unitTarget = target->ToUnit()) // Special handling for vehicles
+ if (Vehicle* vehicle = unitTarget->GetVehicleKit())
for (std::pair<int8 const, VehicleSeat>& seat : vehicle->Seats)
if (Player* player = ObjectAccessor::GetPlayer(*target, seat.second.Passenger.Guid))
player->KilledMonsterCredit(e.action.killedMonster.creature);
@@ -1032,8 +1016,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_UPDATE_TEMPLATE:
{
for (WorldObject* target : targets)
- if (IsCreature(target))
- target->ToCreature()->UpdateEntry(e.action.updateTemplate.creature, nullptr, e.action.updateTemplate.updateLevel != 0);
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->UpdateEntry(e.action.updateTemplate.creature, nullptr, e.action.updateTemplate.updateLevel != 0);
break;
}
case SMART_ACTION_DIE:
@@ -1122,7 +1106,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (!IsUnit(target))
+ Unit* unitTarget = target->ToUnit();
+ if (!unitTarget)
continue;
if (e.action.morphOrMount.creature || e.action.morphOrMount.model)
@@ -1130,13 +1115,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (e.action.morphOrMount.creature > 0)
{
if (CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(e.action.morphOrMount.creature))
- target->ToUnit()->Mount(ObjectMgr::ChooseDisplayId(cInfo)->CreatureDisplayID);
+ unitTarget->Mount(ObjectMgr::ChooseDisplayId(cInfo)->CreatureDisplayID);
}
else
- target->ToUnit()->Mount(e.action.morphOrMount.model);
+ unitTarget->Mount(e.action.morphOrMount.model);
}
else
- target->ToUnit()->Dismount();
+ unitTarget->Dismount();
}
break;
}
@@ -1144,14 +1129,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsCreature(target))
+ if (Creature* creatureTarget = target->ToCreature())
{
- SmartAI* ai = CAST_AI(SmartAI, target->ToCreature()->AI());
+ SmartAI* ai = CAST_AI(SmartAI, creatureTarget->AI());
if (!ai)
continue;
if (e.action.invincHP.percent)
- ai->SetInvincibilityHpLevel(target->ToCreature()->CountPctFromMaxHealth(e.action.invincHP.percent));
+ ai->SetInvincibilityHpLevel(creatureTarget->CountPctFromMaxHealth(e.action.invincHP.percent));
else
ai->SetInvincibilityHpLevel(e.action.invincHP.minHP);
}
@@ -1194,10 +1179,11 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (!IsCreature(target))
+ Creature* creatureTarget = target->ToCreature();
+ if (creatureTarget)
continue;
- if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && IsCharmedCreature(target))
+ if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && creatureTarget->IsCharmed())
continue;
Position pos = target->GetPosition();
@@ -1213,7 +1199,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (waitEvent)
scriptResult = Scripting::v2::ActionResult<MovementStopReason>::GetResultSetter({ waitEvent, &waitEvent->Results.emplace_back() });
- target->ToCreature()->GetMotionMaster()->MovePoint(e.action.moveOffset.PointId, x, y, z,
+ creatureTarget->GetMotionMaster()->MovePoint(e.action.moveOffset.PointId, x, y, z,
true, {}, {}, MovementWalkRunSpeedSelectionMode::Default, {}, std::move(scriptResult));
}
if (waitEvent && !waitEvent->Results.empty())
@@ -1223,8 +1209,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_SET_VISIBILITY:
{
for (WorldObject* target : targets)
- if (IsUnit(target))
- target->ToUnit()->SetVisible(e.action.visibility.state ? true : false);
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->SetVisible(e.action.visibility.state ? true : false);
break;
}
case SMART_ACTION_SET_ACTIVE:
@@ -1314,34 +1300,22 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_KILL_UNIT:
{
for (WorldObject* target : targets)
- {
- if (!IsUnit(target))
- continue;
-
- target->ToUnit()->KillSelf();
- }
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->KillSelf();
break;
}
case SMART_ACTION_ADD_ITEM:
{
for (WorldObject* target : targets)
- {
- if (!IsPlayer(target))
- continue;
-
- target->ToPlayer()->AddItem(e.action.item.entry, e.action.item.count);
- }
+ if (Player* playerTarget = target->ToPlayer())
+ playerTarget->AddItem(e.action.item.entry, e.action.item.count);
break;
}
case SMART_ACTION_REMOVE_ITEM:
{
for (WorldObject* target : targets)
- {
- if (!IsPlayer(target))
- continue;
-
- target->ToPlayer()->DestroyItemCount(e.action.item.entry, e.action.item.count, true);
- }
+ if (Player* playerTarget = target->ToPlayer())
+ playerTarget->DestroyItemCount(e.action.item.entry, e.action.item.count, true);
break;
}
case SMART_ACTION_STORE_TARGET_LIST:
@@ -1353,18 +1327,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsPlayer(target))
- target->ToPlayer()->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
- else if (IsCreature(target))
- target->ToCreature()->NearTeleportTo(e.target.x, e.target.y, e.target.z, e.target.o);
+ if (Player* playerTarget = target->ToPlayer())
+ playerTarget->TeleportTo(e.action.teleport.mapID, e.target.x, e.target.y, e.target.z, e.target.o);
+ else if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->NearTeleportTo(e.target.x, e.target.y, e.target.z, e.target.o);
}
break;
}
case SMART_ACTION_SET_DISABLE_GRAVITY:
{
for (WorldObject* target : targets)
- if (IsCreature(target))
- target->ToCreature()->SetFloating(e.action.setDisableGravity.disable != 0);
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->SetFloating(e.action.setDisableGravity.disable != 0);
break;
}
case SMART_ACTION_SET_RUN:
@@ -1381,16 +1355,16 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsCreature(target))
+ if (Creature* creatureTarget = target->ToCreature())
{
- if (SmartAI* ai = CAST_AI(SmartAI, target->ToCreature()->AI()))
+ if (SmartAI* ai = CAST_AI(SmartAI, creatureTarget->AI()))
ai->GetScript()->StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset);
else
TC_LOG_ERROR("sql.sql", "SmartScript: Action target for SMART_ACTION_SET_COUNTER is not using SmartAI, skipping");
}
- else if (IsGameObject(target))
+ else if (GameObject* gameObject = target->ToGameObject())
{
- if (SmartGameObjectAI* ai = CAST_AI(SmartGameObjectAI, target->ToGameObject()->AI()))
+ if (SmartGameObjectAI* ai = CAST_AI(SmartGameObjectAI, gameObject->AI()))
ai->GetScript()->StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset);
else
TC_LOG_ERROR("sql.sql", "SmartScript: Action target for SMART_ACTION_SET_COUNTER is not using SmartGameObjectAI, skipping");
@@ -1411,7 +1385,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsPlayer(target))
+ if (target->IsPlayer())
{
StoreTargetList(targets, SMART_ESCORT_TARGETS);
break;
@@ -1478,12 +1452,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_PLAYMOVIE:
{
for (WorldObject* target : targets)
- {
- if (!IsPlayer(target))
- continue;
-
- target->ToPlayer()->SendMovieStart(e.action.movie.entry);
- }
+ if (Player* playerTarget = target->ToPlayer())
+ playerTarget->SendMovieStart(e.action.movie.entry);
break;
}
case SMART_ACTION_MOVE_TO_POS:
@@ -1529,14 +1499,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsCreature(target))
+ if (target->IsCreature())
TC_LOG_WARN("sql.sql", "Invalid creature target '{}' (entry {}, spawnId {}) specified for SMART_ACTION_ENABLE_TEMP_GOBJ", target->GetName(), target->GetEntry(), target->ToCreature()->GetSpawnId());
- else if (IsGameObject(target))
+ else if (GameObject* gameObject = target->ToGameObject())
{
- if (target->ToGameObject()->isSpawnedByDefault())
- TC_LOG_WARN("sql.sql", "Invalid gameobject target '{}' (entry {}, spawnId {}) for SMART_ACTION_ENABLE_TEMP_GOBJ - the object is spawned by default", target->GetName(), target->GetEntry(), target->ToGameObject()->GetSpawnId());
+ if (gameObject->isSpawnedByDefault())
+ TC_LOG_WARN("sql.sql", "Invalid gameobject target '{}' (entry {}, spawnId {}) for SMART_ACTION_ENABLE_TEMP_GOBJ - the object is spawned by default", target->GetName(), target->GetEntry(), gameObject->GetSpawnId());
else
- target->ToGameObject()->SetRespawnTime(e.action.enableTempGO.duration);
+ gameObject->SetRespawnTime(e.action.enableTempGO.duration);
}
}
break;
@@ -1544,8 +1514,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_CLOSE_GOSSIP:
{
for (WorldObject* target : targets)
- if (IsPlayer(target))
- target->ToPlayer()->PlayerTalkClass->SendCloseGossip();
+ if (Player* playerTarget = target->ToPlayer())
+ playerTarget->PlayerTalkClass->SendCloseGossip();
break;
}
case SMART_ACTION_EQUIP:
@@ -1674,22 +1644,22 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_SET_NPC_FLAG:
{
for (WorldObject* target : targets)
- if (IsCreature(target))
- target->ToUnit()->ReplaceAllNpcFlags(NPCFlags(e.action.flag.flag));
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->ReplaceAllNpcFlags(NPCFlags(e.action.flag.flag));
break;
}
case SMART_ACTION_ADD_NPC_FLAG:
{
for (WorldObject* target : targets)
- if (IsCreature(target))
- target->ToUnit()->SetNpcFlag(NPCFlags(e.action.flag.flag));
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->SetNpcFlag(NPCFlags(e.action.flag.flag));
break;
}
case SMART_ACTION_REMOVE_NPC_FLAG:
{
for (WorldObject* target : targets)
- if (IsCreature(target))
- target->ToUnit()->RemoveNpcFlag(NPCFlags(e.action.flag.flag));
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->RemoveNpcFlag(NPCFlags(e.action.flag.flag));
break;
}
case SMART_ACTION_CROSS_CAST:
@@ -1804,13 +1774,13 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsPlayer(target))
+ if (Player* playerTarget = target->ToPlayer())
{
Optional<Scripting::v2::ActionResultSetter<MovementStopReason>> scriptResult;
if (waitEvent)
scriptResult = Scripting::v2::ActionResult<MovementStopReason>::GetResultSetter({ waitEvent, &waitEvent->Results.emplace_back() });
- if (!target->ToPlayer()->ActivateTaxiPathTo(e.action.taxi.id, 0, {}, scriptResult))
+ if (!playerTarget->ActivateTaxiPathTo(e.action.taxi.id, 0, {}, scriptResult))
if (scriptResult)
scriptResult->SetResult(MovementStopReason::Interrupted);
}
@@ -1825,18 +1795,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsCreature((target)))
+ if (Creature* creatureTarget = target->ToCreature())
{
foundTarget = true;
if (e.action.moveRandom.distance)
- target->ToCreature()->GetMotionMaster()->MoveRandom(float(e.action.moveRandom.distance));
+ creatureTarget->GetMotionMaster()->MoveRandom(float(e.action.moveRandom.distance));
else
- target->ToCreature()->GetMotionMaster()->MoveIdle();
+ creatureTarget->GetMotionMaster()->MoveIdle();
}
}
- if (!foundTarget && me && IsCreature(me))
+ if (!foundTarget && me && me->IsCreature())
{
if (e.action.moveRandom.distance)
me->GetMotionMaster()->MoveRandom(float(e.action.moveRandom.distance));
@@ -1894,8 +1864,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_INTERRUPT_SPELL:
{
for (WorldObject* target : targets)
- if (IsUnit(target))
- target->ToUnit()->InterruptNonMeleeSpells(e.action.interruptSpellCasting.withDelayed != 0, e.action.interruptSpellCasting.spell_id, e.action.interruptSpellCasting.withInstant != 0);
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->InterruptNonMeleeSpells(e.action.interruptSpellCasting.withDelayed != 0, e.action.interruptSpellCasting.spell_id, e.action.interruptSpellCasting.withInstant != 0);
break;
}
case SMART_ACTION_JUMP_TO_POS:
@@ -1938,15 +1908,15 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_GO_SET_LOOT_STATE:
{
for (WorldObject* target : targets)
- if (IsGameObject(target))
- target->ToGameObject()->SetLootState((LootState)e.action.setGoLootState.state);
+ if (GameObject* gameObject = target->ToGameObject())
+ gameObject->SetLootState((LootState)e.action.setGoLootState.state);
break;
}
case SMART_ACTION_GO_SET_GO_STATE:
{
for (WorldObject* target : targets)
- if (IsGameObject(target))
- target->ToGameObject()->SetGoState((GOState)e.action.goState.state);
+ if (GameObject* gameObject = target->ToGameObject())
+ gameObject->SetGoState((GOState)e.action.goState.state);
break;
}
case SMART_ACTION_SEND_TARGET_TO_TARGET:
@@ -1964,16 +1934,16 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
for (WorldObject* target : targets)
{
- if (IsCreature(target))
+ if (Creature* creatureTarget = target->ToCreature())
{
- if (SmartAI* ai = CAST_AI(SmartAI, target->ToCreature()->AI()))
+ if (SmartAI* ai = CAST_AI(SmartAI, creatureTarget->AI()))
ai->GetScript()->StoreTargetList(ObjectVector(*storedTargets), e.action.sendTargetToTarget.id); // store a copy of target list
else
TC_LOG_ERROR("sql.sql", "SmartScript: Action target for SMART_ACTION_SEND_TARGET_TO_TARGET is not using SmartAI, skipping");
}
- else if (IsGameObject(target))
+ else if (GameObject* gameObject = target->ToGameObject())
{
- if (SmartGameObjectAI* ai = CAST_AI(SmartGameObjectAI, target->ToGameObject()->AI()))
+ if (SmartGameObjectAI* ai = CAST_AI(SmartGameObjectAI, gameObject->AI()))
ai->GetScript()->StoreTargetList(ObjectVector(*storedTargets), e.action.sendTargetToTarget.id); // store a copy of target list
else
TC_LOG_ERROR("sql.sql", "SmartScript: Action target for SMART_ACTION_SEND_TARGET_TO_TARGET is not using SmartGameObjectAI, skipping");
@@ -2017,12 +1987,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsCreature(target))
+ if (Creature* creatureTarget = target->ToCreature())
{
if (e.GetTargetType() == SMART_TARGET_SELF)
- target->ToCreature()->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ creatureTarget->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
else if (e.GetTargetType() == SMART_TARGET_POSITION)
- target->ToCreature()->SetHomePosition(e.target.x, e.target.y, e.target.z, e.target.o);
+ creatureTarget->SetHomePosition(e.target.x, e.target.y, e.target.z, e.target.o);
else if (e.GetTargetType() == SMART_TARGET_CREATURE_RANGE || e.GetTargetType() == SMART_TARGET_CREATURE_GUID ||
e.GetTargetType() == SMART_TARGET_CREATURE_DISTANCE || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_RANGE ||
e.GetTargetType() == SMART_TARGET_GAMEOBJECT_GUID || e.GetTargetType() == SMART_TARGET_GAMEOBJECT_DISTANCE ||
@@ -2031,7 +2001,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
e.GetTargetType() == SMART_TARGET_CLOSEST_ENEMY || e.GetTargetType() == SMART_TARGET_CLOSEST_FRIENDLY ||
e.GetTargetType() == SMART_TARGET_CLOSEST_UNSPAWNED_GAMEOBJECT)
{
- target->ToCreature()->SetHomePosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation());
+ creatureTarget->SetHomePosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation());
}
else
TC_LOG_ERROR("sql.sql", "SmartScript: Action target for SMART_ACTION_SET_HOME_POS is invalid, skipping");
@@ -2042,15 +2012,15 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_SET_HEALTH_REGEN:
{
for (WorldObject* target : targets)
- if (IsCreature(target))
- target->ToCreature()->SetRegenerateHealth(e.action.setHealthRegen.regenHealth != 0);
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->SetRegenerateHealth(e.action.setHealthRegen.regenHealth != 0);
break;
}
case SMART_ACTION_SET_ROOT:
{
for (WorldObject* target : targets)
- if (IsCreature(target))
- target->ToCreature()->SetSessile(e.action.setRoot.root != 0);
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->SetSessile(e.action.setRoot.root != 0);
break;
}
case SMART_ACTION_SUMMON_CREATURE_GROUP:
@@ -2066,22 +2036,22 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_SET_POWER:
{
for (WorldObject* target : targets)
- if (IsUnit(target))
- target->ToUnit()->SetPower(Powers(e.action.power.powerType), e.action.power.newPower);
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->SetPower(Powers(e.action.power.powerType), e.action.power.newPower);
break;
}
case SMART_ACTION_ADD_POWER:
{
for (WorldObject* target : targets)
- if (IsUnit(target))
- target->ToUnit()->SetPower(Powers(e.action.power.powerType), target->ToUnit()->GetPower(Powers(e.action.power.powerType)) + e.action.power.newPower);
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->ModifyPower(Powers(e.action.power.powerType), e.action.power.newPower);
break;
}
case SMART_ACTION_REMOVE_POWER:
{
for (WorldObject* target : targets)
- if (IsUnit(target))
- target->ToUnit()->SetPower(Powers(e.action.power.powerType), target->ToUnit()->GetPower(Powers(e.action.power.powerType)) - e.action.power.newPower);
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->ModifyPower(Powers(e.action.power.powerType), -int32(e.action.power.newPower));
break;
}
case SMART_ACTION_GAME_EVENT_STOP:
@@ -2161,29 +2131,23 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
bool onlySelf = e.action.randomSound.onlySelf != 0;
for (WorldObject* const target : targets)
{
- if (IsUnit(target))
- {
- uint32 sound = Trinity::Containers::SelectRandomContainerElement(Trinity::IteratorPair(sounds.begin(), soundsEnd));
+ uint32 sound = Trinity::Containers::SelectRandomContainerElement(Trinity::IteratorPair(sounds.begin(), soundsEnd));
- if (e.action.randomSound.distance == 1)
- target->PlayDistanceSound(sound, onlySelf ? target->ToPlayer() : nullptr);
- else
- target->PlayDirectSound(sound, onlySelf ? target->ToPlayer() : nullptr);
+ if (e.action.randomSound.distance == 1)
+ target->PlayDistanceSound(sound, onlySelf ? target->ToPlayer() : nullptr);
+ else
+ target->PlayDirectSound(sound, onlySelf ? target->ToPlayer() : nullptr);
- TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_RANDOM_SOUND: target: {} ({}), sound: {}, onlyself: {}",
- target->GetName(), target->GetGUID(), sound, onlySelf ? "true" : "false");
- }
+ TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_RANDOM_SOUND: target: {} ({}), sound: {}, onlyself: {}",
+ target->GetName(), target->GetGUID(), sound, onlySelf ? "true" : "false");
}
break;
}
case SMART_ACTION_SET_CORPSE_DELAY:
{
for (WorldObject* const target : targets)
- {
- if (IsCreature(target))
- target->ToCreature()->SetCorpseDelay(e.action.corpseDelay.timer, !e.action.corpseDelay.includeDecayRatio);
- }
-
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->SetCorpseDelay(e.action.corpseDelay.timer, !e.action.corpseDelay.includeDecayRatio);
break;
}
case SMART_ACTION_SPAWN_SPAWNGROUP:
@@ -2276,15 +2240,15 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (!me->CanHaveThreatList())
break;
for (WorldObject* const target : targets)
- if (IsUnit(target))
- me->GetThreatManager().AddThreat(target->ToUnit(), float(e.action.threat.threatINC) - float(e.action.threat.threatDEC), nullptr, true, true);
+ if (Unit* unitTarget = target->ToUnit())
+ me->GetThreatManager().AddThreat(unitTarget, float(e.action.threat.threatINC) - float(e.action.threat.threatDEC), nullptr, true, true);
break;
}
case SMART_ACTION_LOAD_EQUIPMENT:
{
for (WorldObject* const target : targets)
- if (IsCreature(target))
- target->ToCreature()->LoadEquipment(e.action.loadEquipment.id, e.action.loadEquipment.force != 0);
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->LoadEquipment(e.action.loadEquipment.id, e.action.loadEquipment.force != 0);
break;
}
case SMART_ACTION_TRIGGER_RANDOM_TIMED_EVENT:
@@ -2296,8 +2260,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_PAUSE_MOVEMENT:
{
for (WorldObject* const target : targets)
- if (IsUnit(target))
- target->ToUnit()->PauseMovement(e.action.pauseMovement.pauseTimer, e.action.pauseMovement.movementSlot, e.action.pauseMovement.force);
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->PauseMovement(e.action.pauseMovement.pauseTimer, e.action.pauseMovement.movementSlot, e.action.pauseMovement.force);
break;
}
case SMART_ACTION_RESPAWN_BY_SPAWNID:
@@ -2318,29 +2282,29 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* const target : targets)
{
- if (IsCreature(target))
+ if (Creature* creatureTarget = target->ToCreature())
{
if (e.action.animKit.type == 0)
- target->ToCreature()->PlayOneShotAnimKitId(e.action.animKit.animKit);
+ creatureTarget->PlayOneShotAnimKitId(e.action.animKit.animKit);
else if (e.action.animKit.type == 1)
- target->ToCreature()->SetAIAnimKitId(e.action.animKit.animKit);
+ creatureTarget->SetAIAnimKitId(e.action.animKit.animKit);
else if (e.action.animKit.type == 2)
- target->ToCreature()->SetMeleeAnimKitId(e.action.animKit.animKit);
+ creatureTarget->SetMeleeAnimKitId(e.action.animKit.animKit);
else if (e.action.animKit.type == 3)
- target->ToCreature()->SetMovementAnimKitId(e.action.animKit.animKit);
+ creatureTarget->SetMovementAnimKitId(e.action.animKit.animKit);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_PLAY_ANIMKIT: target: {} ({}), AnimKit: {}, Type: {}",
target->GetName(), target->GetGUID(), e.action.animKit.animKit, e.action.animKit.type);
}
- else if (IsGameObject(target))
+ else if (GameObject* gameObject = target->ToGameObject())
{
switch (e.action.animKit.type)
{
case 0:
- target->ToGameObject()->SetAnimKitId(e.action.animKit.animKit, true);
+ gameObject->SetAnimKitId(e.action.animKit.animKit, true);
break;
case 1:
- target->ToGameObject()->SetAnimKitId(e.action.animKit.animKit, false);
+ gameObject->SetAnimKitId(e.action.animKit.animKit, false);
break;
default:
break;
@@ -2372,12 +2336,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_PLAY_CINEMATIC:
{
for (WorldObject* target : targets)
- {
- if (!IsPlayer(target))
- continue;
-
- target->ToPlayer()->SendCinematicStart(e.action.cinematic.entry);
- }
+ if (Player* playerTarget = target->ToPlayer())
+ playerTarget->SendCinematicStart(e.action.cinematic.entry);
break;
}
case SMART_ACTION_SET_MOVEMENT_SPEED:
@@ -2387,8 +2347,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
float speed = float(speedInteger) + float(speedFraction) / std::pow(10, std::floor(std::log10(float(speedFraction ? speedFraction : 1)) + 1));
for (WorldObject* const target : targets)
- if (IsCreature(target))
- target->ToCreature()->SetSpeed(UnitMoveType(e.action.movementSpeed.movementType), speed);
+ if (Creature* creatureTarget = target->ToCreature())
+ creatureTarget->SetSpeed(UnitMoveType(e.action.movementSpeed.movementType), speed);
break;
}
@@ -2396,9 +2356,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* const target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
- target->ToUnit()->SendPlaySpellVisualKit(e.action.spellVisualKit.spellVisualKitId, e.action.spellVisualKit.kitType,
+ unitTarget->SendPlaySpellVisualKit(e.action.spellVisualKit.spellVisualKitId, e.action.spellVisualKit.kitType,
e.action.spellVisualKit.duration);
TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_PLAY_SPELL_VISUAL_KIT: target: {} ({}), SpellVisualKit: {}",
@@ -2431,8 +2391,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_SET_HOVER:
{
for (WorldObject* target : targets)
- if (IsUnit(target))
- target->ToUnit()->SetHover(e.action.setHover.enable != 0);
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->SetHover(e.action.setHover.enable != 0);
break;
}
case SMART_ACTION_SET_HEALTH_PCT:
@@ -2464,12 +2424,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
if (e.action.setImmunePC.immunePC)
- target->ToUnit()->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
+ unitTarget->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
else
- target->ToUnit()->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
+ unitTarget->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_PC);
}
}
break;
@@ -2478,12 +2438,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsUnit(target))
+ if (Unit* unitTarget = target->ToUnit())
{
if (e.action.setImmuneNPC.immuneNPC)
- target->ToUnit()->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC);
+ unitTarget->SetUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC);
else
- target->ToUnit()->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC);
+ unitTarget->RemoveUnitFlag(UNIT_FLAG_IMMUNE_TO_NPC);
}
}
break;
@@ -2491,12 +2451,8 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
case SMART_ACTION_SET_UNINTERACTIBLE:
{
for (WorldObject* target : targets)
- {
- if (IsUnit(target))
- {
- target->ToUnit()->SetUninteractible(e.action.setUninteractible.uninteractible != 0);
- }
- }
+ if (Unit* unitTarget = target->ToUnit())
+ unitTarget->SetUninteractible(e.action.setUninteractible.uninteractible != 0);
break;
}
case SMART_ACTION_ACTIVATE_GAMEOBJECT:
@@ -3116,7 +3072,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
if ((e.event.event_phase_mask && !IsInPhase(e.event.event_phase_mask)) || ((e.event.event_flags & SMART_EVENT_FLAG_NOT_REPEATABLE) && e.runOnce))
return;
- if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && IsCharmedCreature(me))
+ if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && me && me->IsCreature() && me->ToCreature()->IsCharmed())
return;
switch (e.GetEventType())
@@ -3404,7 +3360,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
case SMART_EVENT_SUMMONED_UNIT:
case SMART_EVENT_SUMMONED_UNIT_DIES:
{
- if (!IsCreature(unit))
+ if (!unit->IsCreature())
return;
if (e.event.summoned.creature && unit->GetEntry() != e.event.summoned.creature)
return;
@@ -3565,18 +3521,20 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
ObjectVector targets;
GetTargets(targets, e);
- for (WorldObject* target : targets)
+ auto unitTargetItr = std::ranges::find_if(targets, [this, &e](WorldObject* target)
{
- if (IsUnit(target) && me->IsFriendlyTo(target->ToUnit()) && target->ToUnit()->IsAlive() && target->ToUnit()->IsInCombat())
+ Unit* unit = target->ToUnit();
+ if (unit && me->IsFriendlyTo(unit) && unit->IsAlive() && unit->IsInCombat())
{
- uint32 healthPct = uint32(target->ToUnit()->GetHealthPct());
- if (healthPct > e.event.friendlyHealthPct.maxHpPct || healthPct < e.event.friendlyHealthPct.minHpPct)
- continue;
-
- unitTarget = target->ToUnit();
- break;
+ uint32 healthPct = uint32(unit->GetHealthPct());
+ if (e.event.friendlyHealthPct.minHpPct <= healthPct && healthPct <= e.event.friendlyHealthPct.maxHpPct)
+ return true;
}
- }
+ return false;
+ });
+
+ if (unitTargetItr != targets.end())
+ unitTarget = (*unitTargetItr)->ToUnit();
break;
}
case SMART_TARGET_ACTION_INVOKER:
@@ -3853,37 +3811,6 @@ WorldObject* SmartScript::GetBaseObjectOrUnitInvoker(Unit* invoker)
return Coalesce<WorldObject>(GetBaseObject(), invoker);
}
-bool SmartScript::IsUnit(WorldObject* obj)
-{
- return obj && (obj->GetTypeId() == TYPEID_UNIT || obj->GetTypeId() == TYPEID_PLAYER);
-}
-
-bool SmartScript::IsPlayer(WorldObject* obj)
-{
- return obj && obj->GetTypeId() == TYPEID_PLAYER;
-}
-
-bool SmartScript::IsCreature(WorldObject* obj)
-{
- return obj && obj->GetTypeId() == TYPEID_UNIT;
-}
-
-bool SmartScript::IsCharmedCreature(WorldObject* obj)
-{
- if (!obj)
- return false;
-
- if (Creature* creatureObj = obj->ToCreature())
- return creatureObj->IsCharmed();
-
- return false;
-}
-
-bool SmartScript::IsGameObject(WorldObject* obj)
-{
- return obj && obj->GetTypeId() == TYPEID_GAMEOBJECT;
-}
-
void SmartScript::OnUpdate(uint32 const diff)
{
if ((mScriptType == SMART_SCRIPT_TYPE_CREATURE
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 5a5a5ca3ce0..e4c4c8d3907 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -67,11 +67,6 @@ class TC_GAME_API SmartScript
WorldObject* GetBaseObject() const;
WorldObject* GetBaseObjectOrUnitInvoker(Unit* invoker);
bool HasAnyEventWithFlag(uint32 flag) const { return mAllEventFlags & flag; }
- static bool IsUnit(WorldObject* obj);
- static bool IsPlayer(WorldObject* obj);
- static bool IsCreature(WorldObject* obj);
- static bool IsCharmedCreature(WorldObject* obj);
- static bool IsGameObject(WorldObject* obj);
void OnUpdate(const uint32 diff);
void OnMoveInLineOfSight(Unit* who);