mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-13 01:08:35 +00:00
refactor(Core/SmartScripts): Clean up validation logic by replacing A… (#21184)
This commit is contained in:
@@ -27,14 +27,15 @@
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellMgr.h"
|
||||
|
||||
#define AC_SAI_IS_BOOLEAN_VALID(e, value) \
|
||||
{ \
|
||||
if (value > 1) \
|
||||
{ \
|
||||
LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} uses param {} of type Boolean with value {}, valid values are 0 or 1, skipped.", \
|
||||
e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), STRINGIZE(value), value); \
|
||||
return false; \
|
||||
} \
|
||||
bool SmartAIMgr::IsSAIBoolValid(SmartScriptHolder const& e, SAIBool value)
|
||||
{
|
||||
if (value != 0 && value != 1)
|
||||
{
|
||||
LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} uses param {} of type Boolean with value {}, valid values are 0 or 1, skipped.",
|
||||
e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), STRINGIZE(value), value);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
SmartWaypointMgr* SmartWaypointMgr::instance()
|
||||
@@ -513,23 +514,22 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
|
||||
case SMART_TARGET_HOSTILE_LAST_AGGRO:
|
||||
case SMART_TARGET_HOSTILE_RANDOM:
|
||||
case SMART_TARGET_HOSTILE_RANDOM_NOT_TOP:
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.target.hostileRandom.playerOnly);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.target.hostileRandom.playerOnly);
|
||||
case SMART_TARGET_FARTHEST:
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.target.farthest.playerOnly);
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.target.farthest.isInLos);
|
||||
return IsSAIBoolValid(e, e.target.farthest.playerOnly) &&
|
||||
IsSAIBoolValid(e, e.target.farthest.isInLos);
|
||||
break;
|
||||
case SMART_TARGET_CLOSEST_CREATURE:
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.target.unitClosest.dead);
|
||||
return IsSAIBoolValid(e, e.target.unitClosest.dead);
|
||||
break;
|
||||
case SMART_TARGET_CLOSEST_ENEMY:
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.target.closestAttackable.playerOnly);
|
||||
return IsSAIBoolValid(e, e.target.closestAttackable.playerOnly);
|
||||
break;
|
||||
case SMART_TARGET_CLOSEST_FRIENDLY:
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.target.closestFriendly.playerOnly);
|
||||
return IsSAIBoolValid(e, e.target.closestFriendly.playerOnly);
|
||||
break;
|
||||
case SMART_TARGET_OWNER_OR_SUMMONER:
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.target.owner.useCharmerOrOwner);
|
||||
return IsSAIBoolValid(e, e.target.owner.useCharmerOrOwner);
|
||||
break;
|
||||
case SMART_TARGET_STORED:
|
||||
case SMART_TARGET_PLAYER_WITH_AURA:
|
||||
@@ -1079,9 +1079,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
case SMART_EVENT_OOC_LOS:
|
||||
case SMART_EVENT_IC_LOS:
|
||||
if (!IsMinMaxValid(e, e.event.los.cooldownMin, e.event.los.cooldownMax))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (e.event.los.hostilityMode >= AsUnderlyingType(SmartEvent::LOSHostilityMode::End))
|
||||
{
|
||||
@@ -1090,8 +1088,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
return false;
|
||||
}
|
||||
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.event.los.playerOnly);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.event.los.playerOnly);
|
||||
case SMART_EVENT_RESPAWN:
|
||||
if (e.event.respawn.type == SMART_SCRIPT_RESPAWN_CONDITION_MAP && !sMapStore.LookupEntry(e.event.respawn.map))
|
||||
{
|
||||
@@ -1134,8 +1131,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
if (e.event.kill.creature && !IsCreatureValid(e, e.event.kill.creature))
|
||||
return false;
|
||||
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.event.kill.playerOnly);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.event.kill.playerOnly);
|
||||
case SMART_EVENT_VICTIM_CASTING:
|
||||
if (e.event.targetCasting.spellId > 0 && !sSpellMgr->GetSpellInfo(e.event.targetCasting.spellId))
|
||||
{
|
||||
@@ -1164,14 +1160,10 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
case SMART_EVENT_ACCEPTED_QUEST:
|
||||
case SMART_EVENT_REWARD_QUEST:
|
||||
if (e.event.quest.quest && !IsQuestValid(e, e.event.quest.quest))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!IsMinMaxValid(e, e.event.quest.cooldownMin, e.event.quest.cooldownMax))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case SMART_EVENT_RECEIVE_EMOTE:
|
||||
{
|
||||
@@ -1464,8 +1456,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
case SMART_ACTION_SOUND:
|
||||
if (!IsSoundValid(e, e.action.sound.sound))
|
||||
return false;
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.sound.onlySelf);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.action.sound.onlySelf);
|
||||
case SMART_ACTION_RANDOM_SOUND:
|
||||
if (e.action.randomSound.sound1 && !IsSoundValid(e, e.action.randomSound.sound1))
|
||||
return false;
|
||||
@@ -1505,8 +1496,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
if (!IsQuestValid(e, e.action.questOffer.questID))
|
||||
return false;
|
||||
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.questOffer.directAdd);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.action.questOffer.directAdd);
|
||||
case SMART_ACTION_FAIL_QUEST:
|
||||
if (!IsQuestValid(e, e.action.quest.quest))
|
||||
return false;
|
||||
@@ -1651,8 +1641,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
return false;
|
||||
}
|
||||
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.summonCreature.attackInvoker);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.action.summonCreature.attackInvoker);
|
||||
case SMART_ACTION_CALL_KILLEDMONSTER:
|
||||
if (!IsCreatureValid(e, e.action.killedMonster.creature))
|
||||
return false;
|
||||
@@ -1660,8 +1649,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
case SMART_ACTION_UPDATE_TEMPLATE:
|
||||
if (!IsCreatureValid(e, e.action.updateTemplate.creature))
|
||||
return false;
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.updateTemplate.updateLevel);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.action.updateTemplate.updateLevel);
|
||||
case SMART_ACTION_SET_SHEATH:
|
||||
if (e.action.setSheath.sheath && e.action.setSheath.sheath >= MAX_SHEATH_STATE)
|
||||
{
|
||||
@@ -1707,8 +1695,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
case SMART_ACTION_WP_STOP:
|
||||
if (e.action.wpStop.quest && !IsQuestValid(e, e.action.wpStop.quest))
|
||||
return false;
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.wpStop.fail);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.action.wpStop.fail);
|
||||
case SMART_ACTION_WP_START:
|
||||
{
|
||||
if (!sSmartWaypointMgr->GetPath(e.action.wpStart.pathID))
|
||||
@@ -1729,9 +1716,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
return false;
|
||||
}
|
||||
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.wpStart.run);
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.wpStart.repeat);
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.action.wpStart.run) &&
|
||||
IsSAIBoolValid(e, e.action.wpStart.repeat);
|
||||
}
|
||||
case SMART_ACTION_CREATE_TIMED_EVENT:
|
||||
{
|
||||
@@ -1872,85 +1858,42 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
break;
|
||||
}
|
||||
case SMART_ACTION_AUTO_ATTACK:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.autoAttack.attack);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.autoAttack.attack);
|
||||
case SMART_ACTION_ALLOW_COMBAT_MOVEMENT:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.combatMove.move);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.combatMove.move);
|
||||
case SMART_ACTION_CALL_FOR_HELP:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.callHelp.withEmote);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.callHelp.withEmote);
|
||||
case SMART_ACTION_SET_VISIBILITY:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.visibility.state);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.visibility.state);
|
||||
case SMART_ACTION_SET_RUN:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setRun.run);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.setRun.run);
|
||||
case SMART_ACTION_SET_CAN_FLY:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setFly.fly);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.setFly.fly);
|
||||
case SMART_ACTION_SET_SWIM:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setSwim.swim);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.setSwim.swim);
|
||||
case SMART_ACTION_SET_COUNTER:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setCounter.reset);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.setCounter.reset);
|
||||
case SMART_ACTION_INTERRUPT_SPELL:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.interruptSpellCasting.withDelayed);
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.interruptSpellCasting.withInstant);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.interruptSpellCasting.withDelayed) &&
|
||||
IsSAIBoolValid(e, e.action.interruptSpellCasting.withInstant);
|
||||
case SMART_ACTION_SET_ROOT:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setRoot.root);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.setRoot.root);
|
||||
case SMART_ACTION_DISABLE_EVADE:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.disableEvade.disable);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.disableEvade.disable);
|
||||
case SMART_ACTION_LOAD_EQUIPMENT:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.loadEquipment.force);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.loadEquipment.force);
|
||||
case SMART_ACTION_TALK:
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.talk.useTalkTarget);
|
||||
if (!IsTextValid(e, e.action.talk.textGroupID))
|
||||
return false;
|
||||
break;
|
||||
return IsSAIBoolValid(e, e.action.talk.useTalkTarget);
|
||||
case SMART_ACTION_SIMPLE_TALK:
|
||||
if (!IsTextValid(e, e.action.simpleTalk.textGroupID))
|
||||
return false;
|
||||
break;
|
||||
case SMART_ACTION_SET_HEALTH_REGEN:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setHealthRegen.regenHealth);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.setHealthRegen.regenHealth);
|
||||
case SMART_ACTION_CALL_TIMED_ACTIONLIST:
|
||||
{
|
||||
AC_SAI_IS_BOOLEAN_VALID(e, e.action.timedActionList.allowOverride);
|
||||
break;
|
||||
}
|
||||
return IsSAIBoolValid(e, e.action.timedActionList.allowOverride);
|
||||
case SMART_ACTION_FLEE_FOR_ASSIST:
|
||||
case SMART_ACTION_MOVE_TO_POS:
|
||||
case SMART_ACTION_EVADE:
|
||||
|
||||
@@ -2219,6 +2219,7 @@ private:
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool IsSAIBoolValid(SmartScriptHolder const& e, SAIBool value);
|
||||
static bool IsTextValid(SmartScriptHolder const& e, uint32 id);
|
||||
static bool CheckUnusedEventParams(SmartScriptHolder const& e);
|
||||
static bool CheckUnusedActionParams(SmartScriptHolder const& e);
|
||||
|
||||
Reference in New Issue
Block a user