aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMitchesD <majklprofik@seznam.cz>2015-04-02 18:02:34 +0200
committerMitchesD <majklprofik@seznam.cz>2015-04-02 18:02:34 +0200
commit23b1c042adbe3a460457aa11f017c90e6600bfa2 (patch)
treed5451c8d276ba293a9d640ea95d347c71c9a65e5 /src
parent06b75d8fa74dea0c35a81619125ae8a47d9b0651 (diff)
Core/SmartScripts: added SMART_ACTION_SET_COUNTER and SMART_EVENT_COUNTER_SET
as per request of DB developers
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h32
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp30
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h21
4 files changed, 92 insertions, 2 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 08025fd1de1..05a5441e3a0 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -61,6 +61,7 @@ SmartScript::~SmartScript()
delete itr->second;
delete mTargetStorage;
+ mCounterList.clear();
}
void SmartScript::OnReset()
@@ -77,6 +78,7 @@ void SmartScript::OnReset()
}
ProcessEventsFor(SMART_EVENT_RESET);
mLastInvoker.Clear();
+ mCounterList.clear();
}
void SmartScript::ProcessEventsFor(SMART_EVENT e, Unit* unit, uint32 var0, uint32 var1, bool bvar, const SpellInfo* spell, GameObject* gob)
@@ -1351,6 +1353,11 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
ENSURE_AI(SmartAI, me->AI())->SetSwim(e.action.setSwim.swim != 0);
break;
}
+ case SMART_ACTION_SET_COUNTER:
+ {
+ StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset);
+ break;
+ }
case SMART_ACTION_WP_START:
{
if (!IsSmart())
@@ -3239,6 +3246,10 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
break;
}
+ case SMART_EVENT_COUNTER_SET:
+ if (GetCounterId(e.event.counter.id) != 0 && GetCounterValue(e.event.counter.id) == e.event.counter.value)
+ ProcessTimedAction(e, e.event.counter.cooldownMax, e.event.counter.cooldownMax);
+ break;
default:
TC_LOG_ERROR("sql.sql", "SmartScript::ProcessEvent: Unhandled Event type %u", e.GetEventType());
break;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 3809e243040..f13bcf3050b 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -145,6 +145,36 @@ class SmartScript
return NULL;
}
+ void StoreCounter(uint32 id, uint32 value, uint32 reset)
+ {
+ CounterMap::const_iterator itr = mCounterList.find(id);
+ if (itr != mCounterList.end())
+ {
+ if (reset == 0)
+ value += GetCounterValue(id);
+ mCounterList.erase(id);
+ }
+
+ mCounterList.insert(std::make_pair(id, value));
+ ProcessEventsFor(SMART_EVENT_COUNTER_SET);
+ }
+
+ uint32 GetCounterId(uint32 id)
+ {
+ CounterMap::iterator itr = mCounterList.find(id);
+ if (itr != mCounterList.end())
+ return itr->first;
+ return 0;
+ }
+
+ uint32 GetCounterValue(uint32 id)
+ {
+ CounterMap::iterator itr = mCounterList.find(id);
+ if (itr != mCounterList.end())
+ return itr->second;
+ return 0;
+ }
+
GameObject* FindGameObjectNear(WorldObject* searchObject, ObjectGuid::LowType guid) const
{
GameObject* gameObject = NULL;
@@ -205,6 +235,8 @@ class SmartScript
void SetScript9(SmartScriptHolder& e, uint32 entry);
Unit* GetLastInvoker();
ObjectGuid mLastInvoker;
+ typedef std::unordered_map<uint32, uint32> CounterMap;
+ CounterMap mCounterList;
private:
void IncPhase(int32 p = 1)
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index e499381ac3c..a665b9e09ae 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -695,6 +695,22 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
}
break;
+ case SMART_EVENT_COUNTER_SET:
+ if (!IsMinMaxValid(e, e.event.counter.cooldownMin, e.event.counter.cooldownMax))
+ return false;
+
+ if (e.event.counter.id == 0)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Event SMART_EVENT_COUNTER_SET using invalid counter id %u, skipped.", e.event.counter.id);
+ return false;
+ }
+
+ if (e.event.counter.value == 0)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Event SMART_EVENT_COUNTER_SET using invalid value %u, skipped.", e.event.counter.value);
+ return false;
+ }
+ break;
case SMART_EVENT_LINK:
case SMART_EVENT_GO_STATE_CHANGED:
case SMART_EVENT_GO_EVENT_INFORM:
@@ -998,6 +1014,20 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
return false;
}
break;
+ case SMART_ACTION_SET_COUNTER:
+ if (e.action.setCounter.counterId == 0)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses wrong counterId %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.setCounter.counterId);
+ return false;
+ }
+
+ if (e.action.setCounter.value == 0)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u uses wrong value %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.setCounter.value);
+ return false;
+ }
+
+ break;
case SMART_ACTION_INSTALL_AI_TEMPLATE:
if (e.action.installTtemplate.id >= SMARTAI_TEMPLATE_END)
{
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index db91646e629..0c16b02c33a 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -168,8 +168,9 @@ enum SMART_EVENT
SMART_EVENT_FRIENDLY_HEALTH_PCT = 74, // minHpPct, maxHpPct, repeatMin, repeatMax
SMART_EVENT_DISTANCE_CREATURE = 75, // guid, entry, distance, repeat
SMART_EVENT_DISTANCE_GAMEOBJECT = 76, // guid, entry, distance, repeat
+ SMART_EVENT_COUNTER_SET = 77, // id, value, cooldownMin, cooldownMax
- SMART_EVENT_END = 77
+ SMART_EVENT_END = 78
};
struct SmartEvent
@@ -399,6 +400,14 @@ struct SmartEvent
struct
{
+ uint32 id;
+ uint32 value;
+ uint32 cooldownMin;
+ uint32 cooldownMax;
+ } counter;
+
+ struct
+ {
uint32 param1;
uint32 param2;
uint32 param3;
@@ -480,7 +489,7 @@ enum SMART_ACTION
SMART_ACTION_SET_FLY = 60, // 0/1
SMART_ACTION_SET_SWIM = 61, // 0/1
SMART_ACTION_TELEPORT = 62, // mapID,
- // 63 unused
+ SMART_ACTION_SET_COUNTER = 63, // id, value, reset (0/1)
SMART_ACTION_STORE_TARGET_LIST = 64, // varID,
SMART_ACTION_WP_RESUME = 65, // none
SMART_ACTION_SET_ORIENTATION = 66, //
@@ -832,6 +841,13 @@ struct SmartAction
struct
{
+ uint32 counterId;
+ uint32 value;
+ uint32 reset;
+ } setCounter;
+
+ struct
+ {
uint32 id;
uint32 number;
} storeVar;
@@ -1302,6 +1318,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_FRIENDLY_HEALTH_PCT, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_DISTANCE_CREATURE, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_DISTANCE_GAMEOBJECT, SMART_SCRIPT_TYPE_MASK_CREATURE },
+ {SMART_EVENT_COUNTER_SET, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT }
};
enum SmartEventFlags