aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp41
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h24
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp21
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h9
4 files changed, 72 insertions, 23 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 8edd17ca2ba..969dc87faba 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -81,7 +81,7 @@ void SmartScript::ProcessEventsFor(SMART_EVENT e, Unit* unit, uint32 var0, uint3
if (eventType == SMART_EVENT_LINK)//special handling
continue;
- if (eventType == e /*&& (!i->event.event_phase_mask || IsInPhase(i->event.event_phase_mask)) && !(i->event.event_flags & SMART_EVENT_FLAG_NOT_REPEATABLE && i->runOnce)*/)
+ if (eventType == e)
if (sConditionMgr->IsObjectMeetingSmartEventConditions(i->entryOrGuid, i->event_id, i->source_type, unit, GetBaseObject()))
ProcessEvent(*i, unit, var0, var1, bvar, spell, gob);
}
@@ -2907,6 +2907,14 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
ProcessAction(e, unit, var0, var1);
break;
}
+ case SMART_EVENT_EVENT_PHASE_CHANGE:
+ {
+ if (!IsInPhase(e.event.eventPhaseChange.phasemask))
+ return;
+
+ ProcessAction(e, GetLastInvoker());
+ break;
+ }
case SMART_EVENT_GAME_EVENT_START:
case SMART_EVENT_GAME_EVENT_END:
{
@@ -3427,3 +3435,34 @@ Unit* SmartScript::GetLastInvoker(Unit* invoker) const
return nullptr;
}
+
+void SmartScript::IncPhase(uint32 p)
+{
+ // protect phase from overflowing
+ SetPhase(std::min<uint32>(SMART_EVENT_PHASE_12, mEventPhase + p));
+}
+
+void SmartScript::DecPhase(uint32 p)
+{
+ if (p >= mEventPhase)
+ SetPhase(0);
+ else
+ SetPhase(mEventPhase - p);
+}
+
+void SmartScript::SetPhase(uint32 p)
+{
+ uint32 oldPhase = mEventPhase;
+
+ mEventPhase = p;
+
+ if (oldPhase != mEventPhase)
+ ProcessEventsFor(SMART_EVENT_EVENT_PHASE_CHANGE);
+}
+
+bool SmartScript::IsInPhase(uint32 p) const
+{
+ if (mEventPhase == 0)
+ return false;
+ return ((1 << (mEventPhase - 1)) & p) != 0;
+}
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 203d1d0b996..cf10f7d15f4 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -232,28 +232,12 @@ class TC_GAME_API SmartScript
CounterMap mCounterList;
private:
- void IncPhase(uint32 p)
- {
- // protect phase from overflowing
- mEventPhase = std::min<uint32>(SMART_EVENT_PHASE_12, mEventPhase + p);
- }
- void DecPhase(uint32 p)
- {
- if (p >= mEventPhase)
- mEventPhase = 0;
- else
- mEventPhase -= p;
- }
-
- bool IsInPhase(uint32 p) const
- {
- if (mEventPhase == 0)
- return false;
- return ((1 << (mEventPhase - 1)) & p) != 0;
- }
+ void IncPhase(uint32 p);
+ void DecPhase(uint32 p);
- void SetPhase(uint32 p = 0) { mEventPhase = p; }
+ void SetPhase(uint32 p);
+ bool IsInPhase(uint32 p) const;
SmartAIEventList mEvents;
SmartAIEventList mInstallEvents;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 139826f8efb..d2910208155 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -676,6 +676,27 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
if (!IsTextValid(e, e.event.textOver.textGroupID))
return false;
break;
+ case SMART_EVENT_EVENT_PHASE_CHANGE:
+ {
+ if (!e.event.eventPhaseChange.phasemask)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u has no param set, event won't be executed!.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
+ return false;
+ }
+
+ if (e.event.eventPhaseChange.phasemask > SMART_EVENT_PHASE_ALL)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses invalid phasemask %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.eventPhaseChange.phasemask);
+ return false;
+ }
+
+ if (e.event.event_phase_mask && !(e.event.event_phase_mask & e.event.eventPhaseChange.phasemask))
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses event phasemask %u and incompatible event_param1 %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.event_phase_mask, e.event.eventPhaseChange.phasemask);
+ return false;
+ }
+ break;
+ }
case SMART_EVENT_IS_BEHIND_TARGET:
{
if (!IsMinMaxValid(e, e.event.behindTarget.cooldownMin, e.event.behindTarget.cooldownMax))
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 02c7b3c550f..29b76ae0dd9 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -177,7 +177,7 @@ enum SMART_EVENT
SMART_EVENT_JUST_CREATED = 63, // none
SMART_EVENT_GOSSIP_HELLO = 64, // noReportUse (for GOs)
SMART_EVENT_FOLLOW_COMPLETED = 65, // none
- // 66 unused
+ SMART_EVENT_EVENT_PHASE_CHANGE = 66, // event phase mask (<= SMART_EVENT_PHASE_ALL)
SMART_EVENT_IS_BEHIND_TARGET = 67, // cooldownMin, CooldownMax
SMART_EVENT_GAME_EVENT_START = 68, // game_event.Entry
SMART_EVENT_GAME_EVENT_END = 69, // game_event.Entry
@@ -388,6 +388,11 @@ struct SmartEvent
struct
{
+ uint32 phasemask;
+ } eventPhaseChange;
+
+ struct
+ {
uint32 cooldownMin;
uint32 cooldownMax;
} behindTarget;
@@ -1417,7 +1422,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{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 },
{SMART_EVENT_FOLLOW_COMPLETED, SMART_SCRIPT_TYPE_MASK_CREATURE },
- {66, 0 }, // unused
+ {SMART_EVENT_EVENT_PHASE_CHANGE, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },