diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2021-01-25 21:27:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-25 21:27:57 +0100 |
commit | 7d6f7e4d19b298632deeb27830b876b12c490a03 (patch) | |
tree | 07bea5ccdb45c0346ccb6f891445e2237c5480c8 /src/server/game/AI | |
parent | 28353e920b531b7dd221ac926049f5a68b75e7ec (diff) |
Core/SAI: Add new action SMART_ACTION_SET_HEALTH_PCT (#25932)
* Core/SAI: Add new action SMART_ACTION_SET_HEALTH_PCT
Add new action SMART_ACTION_SET_HEALTH_PCT (142) with one single parameter "percent" to set the Unit health.
Close #25317
* Do not allow 0%
Diffstat (limited to 'src/server/game/AI')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 18 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 8 |
3 files changed, 34 insertions, 2 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 261a73d4bd9..c1420c09968 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1621,15 +1621,19 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; } case SMART_ACTION_TRIGGER_TIMED_EVENT: + { ProcessEventsFor((SMART_EVENT)SMART_EVENT_TIMED_EVENT_TRIGGERED, nullptr, e.action.timeEvent.id); // remove this event if not repeatable if (e.event.event_flags & SMART_EVENT_FLAG_NOT_REPEATABLE) mRemIDs.push_back(e.action.timeEvent.id); break; + } case SMART_ACTION_REMOVE_TIMED_EVENT: + { mRemIDs.push_back(e.action.timeEvent.id); break; + } case SMART_ACTION_OVERRIDE_SCRIPT_BASE_OBJECT: { for (WorldObject* target : targets) @@ -1658,12 +1662,16 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; } case SMART_ACTION_RESET_SCRIPT_BASE_OBJECT: + { ResetBaseObject(); break; + } case SMART_ACTION_CALL_SCRIPT_RESET: + { SetPhase(0); OnReset(); break; + } case SMART_ACTION_SET_RANGED_MOVEMENT: { if (!IsSmart()) @@ -2303,7 +2311,6 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u ProcessEventsFor((SMART_EVENT)SMART_EVENT_TIMED_EVENT_TRIGGERED, nullptr, eventId); break; } - case SMART_ACTION_REMOVE_ALL_GAMEOBJECTS: { for (WorldObject* const target : targets) @@ -2376,10 +2383,19 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; } case SMART_ACTION_SET_HOVER: + { for (WorldObject* target : targets) if (IsUnit(target)) target->ToUnit()->SetHover(e.action.setHover.enable != 0); break; + } + case SMART_ACTION_SET_HEALTH_PCT: + { + for (WorldObject* target : targets) + if (Unit* targetUnit = target->ToUnit()) + targetUnit->SetHealth(targetUnit->CountPctFromMaxHealth(e.action.setHealthPct.percent)); + break; + } default: TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 05e84332717..e50f8014ee1 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1589,6 +1589,16 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; } + case SMART_ACTION_SET_HEALTH_PCT: + { + if (e.action.setHealthPct.percent > 100 || !e.action.setHealthPct.percent) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u is trying to set invalid HP percent %u, skipped.", + e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.setHealthPct.percent); + return false; + } + break; + } case SMART_ACTION_FOLLOW: case SMART_ACTION_SET_ORIENTATION: case SMART_ACTION_STORE_TARGET_LIST: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index f2c387de5f2..c12e20db8b6 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -598,8 +598,9 @@ enum SMART_ACTION SMART_ACTION_OVERRIDE_WEATHER = 139, // zoneId, weatherId, intensity SMART_ACTION_SET_AI_ANIM_KIT = 140, // don't use on 3.3.5a SMART_ACTION_SET_HOVER = 141, // 0/1 + SMART_ACTION_SET_HEALTH_PCT = 142, // percent - SMART_ACTION_END = 142 + SMART_ACTION_END = 143 }; struct SmartAction @@ -1190,6 +1191,11 @@ struct SmartAction uint32 toRespawnPosition; } evade; + struct + { + uint32 percent; + } setHealthPct; + //! Note for any new future actions //! All parameters must have type uint32 |