diff options
-rw-r--r-- | sql/updates/world/master/2024_10_22_03_world.sql | 1 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 21 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.h | 1 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 11 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 31 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 16 |
6 files changed, 34 insertions, 47 deletions
diff --git a/sql/updates/world/master/2024_10_22_03_world.sql b/sql/updates/world/master/2024_10_22_03_world.sql new file mode 100644 index 00000000000..697d82f7bd7 --- /dev/null +++ b/sql/updates/world/master/2024_10_22_03_world.sql @@ -0,0 +1 @@ +UPDATE `smart_scripts` SET `event_param1`=0, `event_param2`=0, `event_param3`=0 WHERE `event_type`=46; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 0620d231a87..dcaa2d85c74 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -1114,13 +1114,19 @@ class SmartTrigger : public AreaTriggerScript bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) override { - if (!player->IsAlive()) - return false; + TC_LOG_DEBUG("scripts.ai", "AreaTrigger {} enter is using SmartTrigger script", trigger->ID); + SmartScript script; + script.OnInitialize(player, trigger); + script.ProcessEventsFor(SMART_EVENT_AREATRIGGER_ENTER, player); + return true; + } - TC_LOG_DEBUG("scripts.ai", "AreaTrigger {} is using SmartTrigger script", trigger->ID); + bool OnExit(Player* player, AreaTriggerEntry const* trigger) override + { + TC_LOG_DEBUG("scripts.ai", "AreaTrigger {} exit is using SmartTrigger script", trigger->ID); SmartScript script; script.OnInitialize(player, trigger); - script.ProcessEventsFor(SMART_EVENT_AREATRIGGER_ONTRIGGER, player, trigger->ID); + script.ProcessEventsFor(SMART_EVENT_AREATRIGGER_EXIT, player); return true; } }; @@ -1137,7 +1143,12 @@ void SmartAreaTriggerAI::OnUpdate(uint32 diff) void SmartAreaTriggerAI::OnUnitEnter(Unit* unit) { - GetScript()->ProcessEventsFor(SMART_EVENT_AREATRIGGER_ONTRIGGER, unit); + GetScript()->ProcessEventsFor(SMART_EVENT_AREATRIGGER_ENTER, unit); +} + +void SmartAreaTriggerAI::OnUnitExit(Unit* unit) +{ + GetScript()->ProcessEventsFor(SMART_EVENT_AREATRIGGER_EXIT, unit); } void SmartAreaTriggerAI::SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker) diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index b6d71be9c91..3c49a361740 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -343,6 +343,7 @@ public: void OnInitialize() override; void OnUpdate(uint32 diff) override; void OnUnitEnter(Unit* unit) override; + void OnUnitExit(Unit* unit) override; SmartScript* GetScript() { return &mScript; } void SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index f1294299752..b046c62e423 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3235,17 +3235,19 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui case SMART_EVENT_DEATH: case SMART_EVENT_EVADE: case SMART_EVENT_REACHED_HOME: + case SMART_EVENT_RESET: case SMART_EVENT_CORPSE_REMOVED: case SMART_EVENT_AI_INIT: case SMART_EVENT_TRANSPORT_ADDPLAYER: case SMART_EVENT_TRANSPORT_REMOVE_PLAYER: + case SMART_EVENT_AREATRIGGER_ENTER: case SMART_EVENT_JUST_SUMMONED: - case SMART_EVENT_RESET: case SMART_EVENT_JUST_CREATED: case SMART_EVENT_FOLLOW_COMPLETED: case SMART_EVENT_ON_SPELLCLICK: case SMART_EVENT_ON_DESPAWN: case SMART_EVENT_SEND_EVENT_TRIGGER: + case SMART_EVENT_AREATRIGGER_EXIT: ProcessAction(e, unit, var0, var1, bvar, spell, gob); break; case SMART_EVENT_GOSSIP_HELLO: @@ -3454,13 +3456,6 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui ProcessAction(e, unit, var0); break; } - case SMART_EVENT_AREATRIGGER_ONTRIGGER: - { - if (e.event.areatrigger.id && var0 != e.event.areatrigger.id) - return; - ProcessAction(e, unit, var0); - break; - } case SMART_EVENT_TEXT_OVER: { if (var0 != e.event.textOver.textGroupID || (e.event.textOver.creatureEntry && e.event.textOver.creatureEntry != var1)) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 49b61246894..ba8d1a1386b 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -171,7 +171,7 @@ void SmartAIMgr::LoadSmartAIFromDB() { if (!sAreaTriggerDataStore->GetAreaTriggerTemplate({ (uint32)temp.entryOrGuid, false })) { - TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: AreaTrigger entry ({} IsServerSide false) does not exist, skipped loading.", uint32(temp.entryOrGuid)); + TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: AreaTrigger entry ({} IsCustom false) does not exist, skipped loading.", uint32(temp.entryOrGuid)); continue; } break; @@ -467,7 +467,7 @@ SmartScriptHolder& SmartAIMgr::FindLinkedEvent(SmartAIEventList& list, uint32 li case SMART_EVENT_FOLLOW_COMPLETED: case SMART_EVENT_ON_SPELLCLICK: case SMART_EVENT_GO_LOOT_STATE_CHANGED: - case SMART_EVENT_AREATRIGGER_ONTRIGGER: + case SMART_EVENT_AREATRIGGER_ENTER: case SMART_EVENT_IC_LOS: case SMART_EVENT_OOC_LOS: case SMART_EVENT_DISTANCE_CREATURE: @@ -491,6 +491,7 @@ SmartScriptHolder& SmartAIMgr::FindLinkedEvent(SmartAIEventList& list, uint32 li case SMART_EVENT_SCENE_CANCEL: case SMART_EVENT_SCENE_COMPLETE: case SMART_EVENT_SEND_EVENT_TRIGGER: + case SMART_EVENT_AREATRIGGER_EXIT: return true; default: return false; @@ -717,16 +718,6 @@ bool SmartAIMgr::IsEmoteValid(SmartScriptHolder const& e, uint32 entry) return true; } -bool SmartAIMgr::IsAreaTriggerValid(SmartScriptHolder const& e, uint32 entry) -{ - if (!sAreaTriggerStore.LookupEntry(entry)) - { - TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} uses non-existent AreaTrigger entry {}, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry); - return false; - } - return true; -} - bool SmartAIMgr::IsSoundValid(SmartScriptHolder const& e, uint32 entry) { if (!sSoundKitStore.LookupEntry(entry)) @@ -805,7 +796,7 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) case SMART_EVENT_TRANSPORT_REMOVE_PLAYER: return NO_PARAMS; case SMART_EVENT_TRANSPORT_RELOCATE: return sizeof(SmartEvent::transportRelocate); case SMART_EVENT_INSTANCE_PLAYER_ENTER: return sizeof(SmartEvent::instancePlayerEnter); - case SMART_EVENT_AREATRIGGER_ONTRIGGER: return sizeof(SmartEvent::areatrigger); + case SMART_EVENT_AREATRIGGER_ENTER: return NO_PARAMS; case SMART_EVENT_QUEST_ACCEPTED: return NO_PARAMS; case SMART_EVENT_QUEST_OBJ_COMPLETION: return NO_PARAMS; case SMART_EVENT_QUEST_COMPLETION: return NO_PARAMS; @@ -845,6 +836,7 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e) case SMART_EVENT_ON_SPELL_START: return sizeof(SmartEvent::spellCast); case SMART_EVENT_ON_DESPAWN: return NO_PARAMS; case SMART_EVENT_SEND_EVENT_TRIGGER: return NO_PARAMS; + case SMART_EVENT_AREATRIGGER_EXIT: return NO_PARAMS; default: TC_LOG_WARN("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} is using an event with no unused params specified in SmartAIMgr::CheckUnusedEventParams(), please report this.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); @@ -1378,17 +1370,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; break; } - case SMART_EVENT_AREATRIGGER_ONTRIGGER: - { - if (e.event.areatrigger.id && (e.GetScriptType() == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY || e.GetScriptType() == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_CUSTOM)) - { - TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} areatrigger param not supported for SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY and SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_CUSTOM, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); - return false; - } - if (e.event.areatrigger.id && !IsAreaTriggerValid(e, e.event.areatrigger.id)) - return false; - break; - } case SMART_EVENT_TEXT_OVER: if (!IsTextValid(e, e.event.textOver.textGroupID)) return false; @@ -1540,6 +1521,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_EVENT_WAYPOINT_RESUMED: case SMART_EVENT_WAYPOINT_STOPPED: case SMART_EVENT_WAYPOINT_ENDED: + case SMART_EVENT_AREATRIGGER_ENTER: + case SMART_EVENT_AREATRIGGER_EXIT: case SMART_EVENT_GOSSIP_SELECT: case SMART_EVENT_GOSSIP_HELLO: case SMART_EVENT_JUST_CREATED: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 23c449ab34e..d4dd76d201c 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -146,7 +146,7 @@ enum SMART_EVENT SMART_EVENT_TRANSPORT_REMOVE_PLAYER = 43, // NONE SMART_EVENT_TRANSPORT_RELOCATE = 44, // PointId SMART_EVENT_INSTANCE_PLAYER_ENTER = 45, // Team (0 any), CooldownMin, CooldownMax - SMART_EVENT_AREATRIGGER_ONTRIGGER = 46, // TriggerId(0 any) + SMART_EVENT_AREATRIGGER_ENTER = 46, // NONE SMART_EVENT_QUEST_ACCEPTED = 47, // none SMART_EVENT_QUEST_OBJ_COMPLETION = 48, // none SMART_EVENT_QUEST_COMPLETION = 49, // none @@ -188,8 +188,9 @@ enum SMART_EVENT SMART_EVENT_ON_SPELL_START = 85, // SpellID, CooldownMin, CooldownMax SMART_EVENT_ON_DESPAWN = 86, // NONE SMART_EVENT_SEND_EVENT_TRIGGER = 87, // NONE + SMART_EVENT_AREATRIGGER_EXIT = 88, // NONE - SMART_EVENT_END = 88 + SMART_EVENT_END = 89 }; struct SmartEvent @@ -349,11 +350,6 @@ struct SmartEvent struct { - uint32 id; - } areatrigger; - - struct - { uint32 textGroupID; uint32 creatureEntry; } textOver; @@ -1549,7 +1545,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = {SMART_EVENT_TRANSPORT_REMOVE_PLAYER, SMART_SCRIPT_TYPE_MASK_TRANSPORT }, {SMART_EVENT_TRANSPORT_RELOCATE, SMART_SCRIPT_TYPE_MASK_TRANSPORT }, {SMART_EVENT_INSTANCE_PLAYER_ENTER, SMART_SCRIPT_TYPE_MASK_INSTANCE }, - {SMART_EVENT_AREATRIGGER_ONTRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }, + {SMART_EVENT_AREATRIGGER_ENTER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }, {SMART_EVENT_QUEST_ACCEPTED, SMART_SCRIPT_TYPE_MASK_QUEST }, {SMART_EVENT_QUEST_OBJ_COMPLETION, SMART_SCRIPT_TYPE_MASK_QUEST }, {SMART_EVENT_QUEST_REWARDED, SMART_SCRIPT_TYPE_MASK_QUEST }, @@ -1590,7 +1586,8 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = {SMART_EVENT_ON_SPELL_FAILED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_ON_SPELL_START, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_ON_DESPAWN, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_EVENT_SEND_EVENT_TRIGGER, SMART_SCRIPT_TYPE_MASK_EVENT } + {SMART_EVENT_SEND_EVENT_TRIGGER, SMART_SCRIPT_TYPE_MASK_EVENT }, + {SMART_EVENT_AREATRIGGER_EXIT, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY } }; enum SmartEventFlags @@ -1746,7 +1743,6 @@ class TC_GAME_API SmartAIMgr static bool IsItemValid(SmartScriptHolder const& e, uint32 entry); static bool IsTextEmoteValid(SmartScriptHolder const& e, uint32 entry); static bool IsEmoteValid(SmartScriptHolder const& e, uint32 entry); - static bool IsAreaTriggerValid(SmartScriptHolder const& e, uint32 entry); static bool IsSoundValid(SmartScriptHolder const& e, uint32 entry); static bool IsAnimKitValid(SmartScriptHolder const& e, uint32 entry); static bool IsSpellVisualKitValid(SmartScriptHolder const& e, uint32 entry); |