diff options
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 37 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.h | 17 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 28 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 25 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 39 |
6 files changed, 130 insertions, 18 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 734795d0a66..4efc142e480 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -16,6 +16,7 @@ */ #include "SmartAI.h" +#include "AreaTrigger.h" #include "Creature.h" #include "CreatureGroups.h" #include "DB2Structure.h" @@ -1094,6 +1095,41 @@ class SmartTrigger : public AreaTriggerScript } }; +void SmartAreaTriggerAI::OnInitialize() +{ + GetScript()->OnInitialize(at); +} + +void SmartAreaTriggerAI::OnUpdate(uint32 diff) +{ + GetScript()->OnUpdate(diff); +} + +void SmartAreaTriggerAI::OnUnitEnter(Unit* unit) +{ + GetScript()->ProcessEventsFor(SMART_EVENT_AREATRIGGER_ONTRIGGER, unit); +} + +void SmartAreaTriggerAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker) +{ + if (invoker) + GetScript()->mLastInvoker = invoker->GetGUID(); + GetScript()->SetScript9(e, entry); +} + +class SmartAreaTriggerEntityScript : public AreaTriggerEntityScript +{ +public: + SmartAreaTriggerEntityScript() : AreaTriggerEntityScript("SmartAreaTriggerAI") + { + } + + AreaTriggerAI* GetAI(AreaTrigger* areaTrigger) const override + { + return new SmartAreaTriggerAI(areaTrigger); + } +}; + class SmartScene : public SceneScript { public: @@ -1131,5 +1167,6 @@ public: void AddSC_SmartScripts() { new SmartTrigger(); + new SmartAreaTriggerEntityScript(); new SmartScene(); } diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 3c7dc4015c8..acf22d94295 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -19,6 +19,7 @@ #define TRINITY_SMARTAI_H #include "Define.h" +#include "AreaTriggerAI.h" #include "CreatureAI.h" #include "GameObjectAI.h" #include "Position.h" @@ -286,6 +287,22 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI bool _gossipReturn; }; +class TC_GAME_API SmartAreaTriggerAI : public AreaTriggerAI +{ +public: + using AreaTriggerAI::AreaTriggerAI; + + void OnInitialize() override; + void OnUpdate(uint32 diff) override; + void OnUnitEnter(Unit* unit) override; + + SmartScript* GetScript() { return &mScript; } + void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker); + +private: + SmartScript mScript; +}; + /// Registers scripts required by the SAI scripting system void AddSC_SmartScripts(); diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index ad93b8f8a19..89650d5274f 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -48,6 +48,7 @@ SmartScript::SmartScript() go = nullptr; me = nullptr; trigger = nullptr; + areaTrigger = nullptr; sceneTemplate = nullptr; mEventPhase = 0; mPathId = 0; @@ -170,6 +171,7 @@ void SmartScript::ResetBaseObject() { me = m; go = nullptr; + areaTrigger = nullptr; } } @@ -179,6 +181,7 @@ void SmartScript::ResetBaseObject() { me = nullptr; go = o; + areaTrigger = nullptr; } } } @@ -1618,6 +1621,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (IsSmartGO(goTarget)) ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); } + else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger()) + if (SmartAreaTriggerAI* atSAI = CAST_AI(SmartAreaTriggerAI, areaTriggerTarget->AI())) + atSAI->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); } break; } @@ -1705,6 +1711,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (IsSmartGO(goTarget)) ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); } + else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger()) + if (SmartAreaTriggerAI* atSAI = CAST_AI(SmartAreaTriggerAI, areaTriggerTarget->AI())) + atSAI->SetScript9(e, id, GetLastInvoker()); } break; } @@ -1729,6 +1738,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (IsSmartGO(goTarget)) ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); } + else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger()) + if (SmartAreaTriggerAI* atSAI = CAST_AI(SmartAreaTriggerAI, areaTriggerTarget->AI())) + atSAI->SetScript9(e, id, GetLastInvoker()); } break; } @@ -3608,7 +3620,11 @@ bool SmartScript::IsGameObject(WorldObject* obj) void SmartScript::OnUpdate(uint32 const diff) { - if ((mScriptType == SMART_SCRIPT_TYPE_CREATURE || mScriptType == SMART_SCRIPT_TYPE_GAMEOBJECT) && !GetBaseObject()) + if ((mScriptType == SMART_SCRIPT_TYPE_CREATURE + || mScriptType == SMART_SCRIPT_TYPE_GAMEOBJECT + || mScriptType == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY + || mScriptType == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE) + && !GetBaseObject()) return; InstallEvents();//before UpdateTimers @@ -3743,6 +3759,11 @@ void SmartScript::GetScript() e = sSmartScriptMgr->GetScript((int32)trigger->ID, mScriptType); FillScript(std::move(e), nullptr, trigger, nullptr); } + else if (areaTrigger) + { + e = sSmartScriptMgr->GetScript((int32)areaTrigger->GetEntry(), mScriptType); + FillScript(std::move(e), areaTrigger, nullptr, nullptr); + } else if (sceneTemplate) { e = sSmartScriptMgr->GetScript(sceneTemplate->SceneId, mScriptType); @@ -3766,6 +3787,11 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, Sce go = obj->ToGameObject(); TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is GameObject %u", go->GetEntry()); break; + case TYPEID_AREATRIGGER: + areaTrigger = obj->ToAreaTrigger(); + mScriptType = areaTrigger->IsServerSide() ? SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE : SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY; + TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is AreaTrigger %u, IsServerSide %u", areaTrigger->GetEntry(), uint32(areaTrigger->IsServerSide())); + break; default: TC_LOG_ERROR("misc", "SmartScript::OnInitialize: Unhandled TypeID !WARNING!"); return; diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index cb573d79809..0da9a6dc1a8 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -21,6 +21,7 @@ #include "Define.h" #include "SmartScriptMgr.h" +class AreaTrigger; class Creature; class GameObject; class Player; @@ -122,6 +123,7 @@ class TC_GAME_API SmartScript GameObject* go; ObjectGuid goOrigGUID; AreaTriggerEntry const* trigger; + AreaTrigger* areaTrigger; SceneTemplate const* sceneTemplate; SmartScriptType mScriptType; uint32 mEventPhase; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 2e120c1862d..0a0ad9aa821 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -16,6 +16,8 @@ */ #include "SmartScriptMgr.h" +#include "AreaTriggerDataStore.h" +#include "AreaTriggerTemplate.h" #include "CreatureTextMgr.h" #include "DB2Stores.h" #include "DatabaseEnv.h" @@ -194,6 +196,24 @@ void SmartAIMgr::LoadSmartAIFromDB() } case SMART_SCRIPT_TYPE_TIMED_ACTIONLIST: break;//nothing to check, really + case SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY: + { + if (!sAreaTriggerDataStore->GetAreaTriggerTemplate({ (uint32)temp.entryOrGuid, false })) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: AreaTrigger entry (%u IsServerSide false) does not exist, skipped loading.", uint32(temp.entryOrGuid)); + continue; + } + break; + } + case SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE: + { + if (!sAreaTriggerDataStore->GetAreaTriggerTemplate({ (uint32)temp.entryOrGuid, true })) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: AreaTrigger entry (%u IsServerSide true) does not exist, skipped loading.", uint32(temp.entryOrGuid)); + continue; + } + break; + } default: TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: not yet implemented source_type %u", (uint32)source_type); continue; @@ -840,6 +860,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } case SMART_EVENT_AREATRIGGER_ONTRIGGER: { + if (e.event.areatrigger.id && (e.GetScriptType() == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY || e.GetScriptType() == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE)) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u areatrigger param not supported for SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY and SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE, 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; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index a09c84c9072..edae385acb7 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1381,7 +1381,9 @@ enum SmartScriptType SMART_SCRIPT_TYPE_INSTANCE = 8, // SMART_SCRIPT_TYPE_TIMED_ACTIONLIST = 9, // SMART_SCRIPT_TYPE_SCENE = 10, //done - SMART_SCRIPT_TYPE_MAX = 11 + SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY = 11, + SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE = 12, + SMART_SCRIPT_TYPE_MAX }; enum SmartAITypeMaskId @@ -1396,28 +1398,31 @@ enum SmartAITypeMaskId SMART_SCRIPT_TYPE_MASK_TRANSPORT = 128, SMART_SCRIPT_TYPE_MASK_INSTANCE = 256, SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST = 512, - SMART_SCRIPT_TYPE_MASK_SCENE = 1024 + SMART_SCRIPT_TYPE_MASK_SCENE = 1024, + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY = 2048 }; const uint32 SmartAITypeMask[SMART_SCRIPT_TYPE_MAX][2] = { - {SMART_SCRIPT_TYPE_CREATURE, SMART_SCRIPT_TYPE_MASK_CREATURE }, - {SMART_SCRIPT_TYPE_GAMEOBJECT, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, - {SMART_SCRIPT_TYPE_AREATRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER }, - {SMART_SCRIPT_TYPE_EVENT, SMART_SCRIPT_TYPE_MASK_EVENT }, - {SMART_SCRIPT_TYPE_GOSSIP, SMART_SCRIPT_TYPE_MASK_GOSSIP }, - {SMART_SCRIPT_TYPE_QUEST, SMART_SCRIPT_TYPE_MASK_QUEST }, - {SMART_SCRIPT_TYPE_SPELL, SMART_SCRIPT_TYPE_MASK_SPELL }, - {SMART_SCRIPT_TYPE_TRANSPORT, SMART_SCRIPT_TYPE_MASK_TRANSPORT }, - {SMART_SCRIPT_TYPE_INSTANCE, SMART_SCRIPT_TYPE_MASK_INSTANCE }, - {SMART_SCRIPT_TYPE_TIMED_ACTIONLIST, SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST }, - {SMART_SCRIPT_TYPE_SCENE, SMART_SCRIPT_TYPE_MASK_SCENE } + {SMART_SCRIPT_TYPE_CREATURE, SMART_SCRIPT_TYPE_MASK_CREATURE }, + {SMART_SCRIPT_TYPE_GAMEOBJECT, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, + {SMART_SCRIPT_TYPE_AREATRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER }, + {SMART_SCRIPT_TYPE_EVENT, SMART_SCRIPT_TYPE_MASK_EVENT }, + {SMART_SCRIPT_TYPE_GOSSIP, SMART_SCRIPT_TYPE_MASK_GOSSIP }, + {SMART_SCRIPT_TYPE_QUEST, SMART_SCRIPT_TYPE_MASK_QUEST }, + {SMART_SCRIPT_TYPE_SPELL, SMART_SCRIPT_TYPE_MASK_SPELL }, + {SMART_SCRIPT_TYPE_TRANSPORT, SMART_SCRIPT_TYPE_MASK_TRANSPORT }, + {SMART_SCRIPT_TYPE_INSTANCE, SMART_SCRIPT_TYPE_MASK_INSTANCE }, + {SMART_SCRIPT_TYPE_TIMED_ACTIONLIST, SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST }, + {SMART_SCRIPT_TYPE_SCENE, SMART_SCRIPT_TYPE_MASK_SCENE }, + {SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY, SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }, + {SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE, SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY } }; const uint32 SmartAIEventMask[SMART_EVENT_END][2] = { {SMART_EVENT_UPDATE_IC, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST}, - {SMART_EVENT_UPDATE_OOC, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_INSTANCE }, + {SMART_EVENT_UPDATE_OOC, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_INSTANCE + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }, {SMART_EVENT_HEALT_PCT, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_MANA_PCT, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_AGGRO, SMART_SCRIPT_TYPE_MASK_CREATURE }, @@ -1462,7 +1467,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_EVENT_AREATRIGGER_ONTRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }, {SMART_EVENT_QUEST_ACCEPTED, SMART_SCRIPT_TYPE_MASK_QUEST }, {SMART_EVENT_QUEST_OBJ_COPLETETION, SMART_SCRIPT_TYPE_MASK_QUEST }, {SMART_EVENT_QUEST_REWARDED, SMART_SCRIPT_TYPE_MASK_QUEST }, @@ -1476,8 +1481,8 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] = {SMART_EVENT_WAYPOINT_STOPPED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_WAYPOINT_ENDED, SMART_SCRIPT_TYPE_MASK_CREATURE }, {SMART_EVENT_TIMED_EVENT_TRIGGERED, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, - {SMART_EVENT_UPDATE, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, - {SMART_EVENT_LINK, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_EVENT + SMART_SCRIPT_TYPE_MASK_GOSSIP + SMART_SCRIPT_TYPE_MASK_QUEST + SMART_SCRIPT_TYPE_MASK_SPELL + SMART_SCRIPT_TYPE_MASK_TRANSPORT + SMART_SCRIPT_TYPE_MASK_INSTANCE }, + {SMART_EVENT_UPDATE, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }, + {SMART_EVENT_LINK, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_EVENT + SMART_SCRIPT_TYPE_MASK_GOSSIP + SMART_SCRIPT_TYPE_MASK_QUEST + SMART_SCRIPT_TYPE_MASK_SPELL + SMART_SCRIPT_TYPE_MASK_TRANSPORT + SMART_SCRIPT_TYPE_MASK_INSTANCE + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }, {SMART_EVENT_GOSSIP_SELECT, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_JUST_CREATED, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, {SMART_EVENT_GOSSIP_HELLO, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }, |