diff options
Diffstat (limited to 'src')
-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 |