refactor(Core/SmartScripts): Clean up validation logic by replacing A… (#21184)

This commit is contained in:
Kitzunu
2025-01-16 20:49:26 +01:00
committed by GitHub
parent e2981cbbc9
commit 2aa8c8aa80
2 changed files with 42 additions and 98 deletions

View File

@@ -27,14 +27,15 @@
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "SpellMgr.h" #include "SpellMgr.h"
#define AC_SAI_IS_BOOLEAN_VALID(e, value) \ bool SmartAIMgr::IsSAIBoolValid(SmartScriptHolder const& e, SAIBool value)
{ \ {
if (value > 1) \ 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.", \ 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); \ e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), STRINGIZE(value), value);
return false; \ return false;
} \ }
return true;
} }
SmartWaypointMgr* SmartWaypointMgr::instance() SmartWaypointMgr* SmartWaypointMgr::instance()
@@ -513,23 +514,22 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
case SMART_TARGET_HOSTILE_LAST_AGGRO: case SMART_TARGET_HOSTILE_LAST_AGGRO:
case SMART_TARGET_HOSTILE_RANDOM: case SMART_TARGET_HOSTILE_RANDOM:
case SMART_TARGET_HOSTILE_RANDOM_NOT_TOP: case SMART_TARGET_HOSTILE_RANDOM_NOT_TOP:
AC_SAI_IS_BOOLEAN_VALID(e, e.target.hostileRandom.playerOnly); return IsSAIBoolValid(e, e.target.hostileRandom.playerOnly);
break;
case SMART_TARGET_FARTHEST: case SMART_TARGET_FARTHEST:
AC_SAI_IS_BOOLEAN_VALID(e, e.target.farthest.playerOnly); return IsSAIBoolValid(e, e.target.farthest.playerOnly) &&
AC_SAI_IS_BOOLEAN_VALID(e, e.target.farthest.isInLos); IsSAIBoolValid(e, e.target.farthest.isInLos);
break; break;
case SMART_TARGET_CLOSEST_CREATURE: case SMART_TARGET_CLOSEST_CREATURE:
AC_SAI_IS_BOOLEAN_VALID(e, e.target.unitClosest.dead); return IsSAIBoolValid(e, e.target.unitClosest.dead);
break; break;
case SMART_TARGET_CLOSEST_ENEMY: case SMART_TARGET_CLOSEST_ENEMY:
AC_SAI_IS_BOOLEAN_VALID(e, e.target.closestAttackable.playerOnly); return IsSAIBoolValid(e, e.target.closestAttackable.playerOnly);
break; break;
case SMART_TARGET_CLOSEST_FRIENDLY: case SMART_TARGET_CLOSEST_FRIENDLY:
AC_SAI_IS_BOOLEAN_VALID(e, e.target.closestFriendly.playerOnly); return IsSAIBoolValid(e, e.target.closestFriendly.playerOnly);
break; break;
case SMART_TARGET_OWNER_OR_SUMMONER: case SMART_TARGET_OWNER_OR_SUMMONER:
AC_SAI_IS_BOOLEAN_VALID(e, e.target.owner.useCharmerOrOwner); return IsSAIBoolValid(e, e.target.owner.useCharmerOrOwner);
break; break;
case SMART_TARGET_STORED: case SMART_TARGET_STORED:
case SMART_TARGET_PLAYER_WITH_AURA: case SMART_TARGET_PLAYER_WITH_AURA:
@@ -1079,9 +1079,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_EVENT_OOC_LOS: case SMART_EVENT_OOC_LOS:
case SMART_EVENT_IC_LOS: case SMART_EVENT_IC_LOS:
if (!IsMinMaxValid(e, e.event.los.cooldownMin, e.event.los.cooldownMax)) if (!IsMinMaxValid(e, e.event.los.cooldownMin, e.event.los.cooldownMax))
{
return false; return false;
}
if (e.event.los.hostilityMode >= AsUnderlyingType(SmartEvent::LOSHostilityMode::End)) if (e.event.los.hostilityMode >= AsUnderlyingType(SmartEvent::LOSHostilityMode::End))
{ {
@@ -1090,8 +1088,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false; return false;
} }
AC_SAI_IS_BOOLEAN_VALID(e, e.event.los.playerOnly); return IsSAIBoolValid(e, e.event.los.playerOnly);
break;
case SMART_EVENT_RESPAWN: case SMART_EVENT_RESPAWN:
if (e.event.respawn.type == SMART_SCRIPT_RESPAWN_CONDITION_MAP && !sMapStore.LookupEntry(e.event.respawn.map)) 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)) if (e.event.kill.creature && !IsCreatureValid(e, e.event.kill.creature))
return false; return false;
AC_SAI_IS_BOOLEAN_VALID(e, e.event.kill.playerOnly); return IsSAIBoolValid(e, e.event.kill.playerOnly);
break;
case SMART_EVENT_VICTIM_CASTING: case SMART_EVENT_VICTIM_CASTING:
if (e.event.targetCasting.spellId > 0 && !sSpellMgr->GetSpellInfo(e.event.targetCasting.spellId)) 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_ACCEPTED_QUEST:
case SMART_EVENT_REWARD_QUEST: case SMART_EVENT_REWARD_QUEST:
if (e.event.quest.quest && !IsQuestValid(e, e.event.quest.quest)) if (e.event.quest.quest && !IsQuestValid(e, e.event.quest.quest))
{
return false; return false;
}
if (!IsMinMaxValid(e, e.event.quest.cooldownMin, e.event.quest.cooldownMax)) if (!IsMinMaxValid(e, e.event.quest.cooldownMin, e.event.quest.cooldownMax))
{
return false; return false;
}
break; break;
case SMART_EVENT_RECEIVE_EMOTE: case SMART_EVENT_RECEIVE_EMOTE:
{ {
@@ -1464,8 +1456,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_SOUND: case SMART_ACTION_SOUND:
if (!IsSoundValid(e, e.action.sound.sound)) if (!IsSoundValid(e, e.action.sound.sound))
return false; return false;
AC_SAI_IS_BOOLEAN_VALID(e, e.action.sound.onlySelf); return IsSAIBoolValid(e, e.action.sound.onlySelf);
break;
case SMART_ACTION_RANDOM_SOUND: case SMART_ACTION_RANDOM_SOUND:
if (e.action.randomSound.sound1 && !IsSoundValid(e, e.action.randomSound.sound1)) if (e.action.randomSound.sound1 && !IsSoundValid(e, e.action.randomSound.sound1))
return false; return false;
@@ -1505,8 +1496,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
if (!IsQuestValid(e, e.action.questOffer.questID)) if (!IsQuestValid(e, e.action.questOffer.questID))
return false; return false;
AC_SAI_IS_BOOLEAN_VALID(e, e.action.questOffer.directAdd); return IsSAIBoolValid(e, e.action.questOffer.directAdd);
break;
case SMART_ACTION_FAIL_QUEST: case SMART_ACTION_FAIL_QUEST:
if (!IsQuestValid(e, e.action.quest.quest)) if (!IsQuestValid(e, e.action.quest.quest))
return false; return false;
@@ -1651,8 +1641,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false; return false;
} }
AC_SAI_IS_BOOLEAN_VALID(e, e.action.summonCreature.attackInvoker); return IsSAIBoolValid(e, e.action.summonCreature.attackInvoker);
break;
case SMART_ACTION_CALL_KILLEDMONSTER: case SMART_ACTION_CALL_KILLEDMONSTER:
if (!IsCreatureValid(e, e.action.killedMonster.creature)) if (!IsCreatureValid(e, e.action.killedMonster.creature))
return false; return false;
@@ -1660,8 +1649,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_UPDATE_TEMPLATE: case SMART_ACTION_UPDATE_TEMPLATE:
if (!IsCreatureValid(e, e.action.updateTemplate.creature)) if (!IsCreatureValid(e, e.action.updateTemplate.creature))
return false; return false;
AC_SAI_IS_BOOLEAN_VALID(e, e.action.updateTemplate.updateLevel); return IsSAIBoolValid(e, e.action.updateTemplate.updateLevel);
break;
case SMART_ACTION_SET_SHEATH: case SMART_ACTION_SET_SHEATH:
if (e.action.setSheath.sheath && e.action.setSheath.sheath >= MAX_SHEATH_STATE) 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: case SMART_ACTION_WP_STOP:
if (e.action.wpStop.quest && !IsQuestValid(e, e.action.wpStop.quest)) if (e.action.wpStop.quest && !IsQuestValid(e, e.action.wpStop.quest))
return false; return false;
AC_SAI_IS_BOOLEAN_VALID(e, e.action.wpStop.fail); return IsSAIBoolValid(e, e.action.wpStop.fail);
break;
case SMART_ACTION_WP_START: case SMART_ACTION_WP_START:
{ {
if (!sSmartWaypointMgr->GetPath(e.action.wpStart.pathID)) if (!sSmartWaypointMgr->GetPath(e.action.wpStart.pathID))
@@ -1729,9 +1716,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false; return false;
} }
AC_SAI_IS_BOOLEAN_VALID(e, e.action.wpStart.run); return IsSAIBoolValid(e, e.action.wpStart.run) &&
AC_SAI_IS_BOOLEAN_VALID(e, e.action.wpStart.repeat); IsSAIBoolValid(e, e.action.wpStart.repeat);
break;
} }
case SMART_ACTION_CREATE_TIMED_EVENT: case SMART_ACTION_CREATE_TIMED_EVENT:
{ {
@@ -1872,85 +1858,42 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
break; break;
} }
case SMART_ACTION_AUTO_ATTACK: case SMART_ACTION_AUTO_ATTACK:
{ return IsSAIBoolValid(e, e.action.autoAttack.attack);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.autoAttack.attack);
break;
}
case SMART_ACTION_ALLOW_COMBAT_MOVEMENT: case SMART_ACTION_ALLOW_COMBAT_MOVEMENT:
{ return IsSAIBoolValid(e, e.action.combatMove.move);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.combatMove.move);
break;
}
case SMART_ACTION_CALL_FOR_HELP: case SMART_ACTION_CALL_FOR_HELP:
{ return IsSAIBoolValid(e, e.action.callHelp.withEmote);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.callHelp.withEmote);
break;
}
case SMART_ACTION_SET_VISIBILITY: case SMART_ACTION_SET_VISIBILITY:
{ return IsSAIBoolValid(e, e.action.visibility.state);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.visibility.state);
break;
}
case SMART_ACTION_SET_RUN: case SMART_ACTION_SET_RUN:
{ return IsSAIBoolValid(e, e.action.setRun.run);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setRun.run);
break;
}
case SMART_ACTION_SET_CAN_FLY: case SMART_ACTION_SET_CAN_FLY:
{ return IsSAIBoolValid(e, e.action.setFly.fly);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setFly.fly);
break;
}
case SMART_ACTION_SET_SWIM: case SMART_ACTION_SET_SWIM:
{ return IsSAIBoolValid(e, e.action.setSwim.swim);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setSwim.swim);
break;
}
case SMART_ACTION_SET_COUNTER: case SMART_ACTION_SET_COUNTER:
{ return IsSAIBoolValid(e, e.action.setCounter.reset);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setCounter.reset);
break;
}
case SMART_ACTION_INTERRUPT_SPELL: case SMART_ACTION_INTERRUPT_SPELL:
{ return IsSAIBoolValid(e, e.action.interruptSpellCasting.withDelayed) &&
AC_SAI_IS_BOOLEAN_VALID(e, e.action.interruptSpellCasting.withDelayed); IsSAIBoolValid(e, e.action.interruptSpellCasting.withInstant);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.interruptSpellCasting.withInstant);
break;
}
case SMART_ACTION_SET_ROOT: case SMART_ACTION_SET_ROOT:
{ return IsSAIBoolValid(e, e.action.setRoot.root);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setRoot.root);
break;
}
case SMART_ACTION_DISABLE_EVADE: case SMART_ACTION_DISABLE_EVADE:
{ return IsSAIBoolValid(e, e.action.disableEvade.disable);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.disableEvade.disable);
break;
}
case SMART_ACTION_LOAD_EQUIPMENT: case SMART_ACTION_LOAD_EQUIPMENT:
{ return IsSAIBoolValid(e, e.action.loadEquipment.force);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.loadEquipment.force);
break;
}
case SMART_ACTION_TALK: case SMART_ACTION_TALK:
AC_SAI_IS_BOOLEAN_VALID(e, e.action.talk.useTalkTarget);
if (!IsTextValid(e, e.action.talk.textGroupID)) if (!IsTextValid(e, e.action.talk.textGroupID))
return false; return false;
break; return IsSAIBoolValid(e, e.action.talk.useTalkTarget);
case SMART_ACTION_SIMPLE_TALK: case SMART_ACTION_SIMPLE_TALK:
if (!IsTextValid(e, e.action.simpleTalk.textGroupID)) if (!IsTextValid(e, e.action.simpleTalk.textGroupID))
return false; return false;
break; break;
case SMART_ACTION_SET_HEALTH_REGEN: case SMART_ACTION_SET_HEALTH_REGEN:
{ return IsSAIBoolValid(e, e.action.setHealthRegen.regenHealth);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.setHealthRegen.regenHealth);
break;
}
case SMART_ACTION_CALL_TIMED_ACTIONLIST: case SMART_ACTION_CALL_TIMED_ACTIONLIST:
{ return IsSAIBoolValid(e, e.action.timedActionList.allowOverride);
AC_SAI_IS_BOOLEAN_VALID(e, e.action.timedActionList.allowOverride);
break;
}
case SMART_ACTION_FLEE_FOR_ASSIST: case SMART_ACTION_FLEE_FOR_ASSIST:
case SMART_ACTION_MOVE_TO_POS: case SMART_ACTION_MOVE_TO_POS:
case SMART_ACTION_EVADE: case SMART_ACTION_EVADE:

View File

@@ -2219,6 +2219,7 @@ private:
return true; return true;
} }
static bool IsSAIBoolValid(SmartScriptHolder const& e, SAIBool value);
static bool IsTextValid(SmartScriptHolder const& e, uint32 id); static bool IsTextValid(SmartScriptHolder const& e, uint32 id);
static bool CheckUnusedEventParams(SmartScriptHolder const& e); static bool CheckUnusedEventParams(SmartScriptHolder const& e);
static bool CheckUnusedActionParams(SmartScriptHolder const& e); static bool CheckUnusedActionParams(SmartScriptHolder const& e);