Core/SAI: Implemented new event type SMART_EVENT_AREATRIGGER_EXIT (88) (#30367)

(cherry picked from commit 0d5242daae)

# Conflicts:
#	sql/updates/world/cata_classic/2024_10_22_03_world.sql
This commit is contained in:
Meji
2024-10-22 04:01:37 +02:00
committed by Ovahlord
parent d07a7592de
commit fb56b63171
6 changed files with 35 additions and 48 deletions

View File

@@ -0,0 +1 @@
UPDATE `smart_scripts` SET `event_param1`=0, `event_param2`=0, `event_param3`=0 WHERE `event_type`=46;

View File

@@ -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 {} is using SmartTrigger script", trigger->ID);
TC_LOG_DEBUG("scripts.ai", "AreaTrigger {} enter 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_ENTER, player);
return true;
}
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_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)

View File

@@ -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);

View File

@@ -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))

View File

@@ -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:

View File

@@ -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
@@ -347,11 +348,6 @@ struct SmartEvent
uint32 cooldownMax;
} instancePlayerEnter;
struct
{
uint32 id;
} areatrigger;
struct
{
uint32 textGroupID;
@@ -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);