aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2024_10_22_03_world.sql1
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp21
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h1
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp31
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h16
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);