aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp18
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp10
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h8
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