aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2021-01-25 21:27:57 +0100
committerShauren <shauren.trinity@gmail.com>2022-03-06 01:43:57 +0100
commit4c30b2a1827b81774136d37cb521dbd5823c3423 (patch)
tree9fe4147ddc144c76b00aea2216501d04b7911965
parent23d77ecb8156fd1682649aa9913bb9cc173b60e9 (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% (cherry picked from commit 7d6f7e4d19b298632deeb27830b876b12c490a03)
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp66
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp10
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h6
3 files changed, 57 insertions, 25 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 4df54896558..faaacb46d84 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -1650,15 +1650,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)
@@ -1687,12 +1691,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())
@@ -2374,7 +2382,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)
@@ -2446,6 +2453,17 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
}
+ case SMART_ACTION_PLAY_CINEMATIC:
+ {
+ for (WorldObject* target : targets)
+ {
+ if (!IsPlayer(target))
+ continue;
+
+ target->ToPlayer()->SendCinematicStart(e.action.cinematic.entry);
+ }
+ break;
+ }
case SMART_ACTION_SET_MOVEMENT_SPEED:
{
uint32 speedInteger = e.action.movementSpeed.speedInteger;
@@ -2458,6 +2476,22 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
}
+ case SMART_ACTION_PLAY_SPELL_VISUAL_KIT:
+ {
+ for (WorldObject* const target : targets)
+ {
+ if (IsUnit(target))
+ {
+ target->ToUnit()->SendPlaySpellVisualKit(e.action.spellVisualKit.spellVisualKitId, e.action.spellVisualKit.kitType,
+ e.action.spellVisualKit.duration);
+
+ TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_PLAY_SPELL_VISUAL_KIT: target: %s (%s), SpellVisualKit: %u",
+ target->GetName().c_str(), target->GetGUID().ToString().c_str(), e.action.spellVisualKit.spellVisualKitId);
+ }
+ }
+
+ break;
+ }
case SMART_ACTION_OVERRIDE_LIGHT:
{
if (WorldObject* obj = GetBaseObject())
@@ -2479,24 +2513,17 @@ 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_PLAY_SPELL_VISUAL_KIT:
+ }
+ case SMART_ACTION_SET_HEALTH_PCT:
{
- for (WorldObject* const target : targets)
- {
- if (IsUnit(target))
- {
- target->ToUnit()->SendPlaySpellVisualKit(e.action.spellVisualKit.spellVisualKitId, e.action.spellVisualKit.kitType,
- e.action.spellVisualKit.duration);
-
- TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction:: SMART_ACTION_PLAY_SPELL_VISUAL_KIT: target: %s (%s), SpellVisualKit: %u",
- target->GetName().c_str(), target->GetGUID().ToString().c_str(), e.action.spellVisualKit.spellVisualKitId);
- }
- }
-
+ for (WorldObject* target : targets)
+ if (Unit* targetUnit = target->ToUnit())
+ targetUnit->SetHealth(targetUnit->CountPctFromMaxHealth(e.action.setHealthPct.percent));
break;
}
case SMART_ACTION_CREATE_CONVERSATION:
@@ -2517,17 +2544,6 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break;
}
- case SMART_ACTION_PLAY_CINEMATIC:
- {
- for (WorldObject* target : targets)
- {
- if (!IsPlayer(target))
- continue;
-
- target->ToPlayer()->SendCinematicStart(e.action.cinematic.entry);
- }
- break;
- }
case SMART_ACTION_ADD_TO_STORED_TARGET_LIST:
{
if (!targets.empty())
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index d5ed7dfa597..4cc7bb8609b 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -1767,6 +1767,16 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
TC_LOG_ERROR("sql.sql", "SmartAIMgr: Deprecated action_type(%u), event_type(%u), Entry " SI64FMTD " SourceType %u Event %u, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id);
break;
}
+ case SMART_ACTION_SET_HEALTH_PCT:
+ {
+ if (e.action.setHealthPct.percent > 100 || !e.action.setHealthPct.percent)
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " 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_CREATE_CONVERSATION:
{
if (!sConversationDataStore->GetConversationTemplate(e.action.conversation.id))
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index a36c70743b1..2cdc6d41bb3 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -611,6 +611,7 @@ enum SMART_ACTION
SMART_ACTION_OVERRIDE_WEATHER = 139, // zoneId, weatherId, intensity
SMART_ACTION_SET_AI_ANIM_KIT = 140, // DEPRECATED, DO REUSE (it was never used in any branch, treat as free action id)
SMART_ACTION_SET_HOVER = 141, // 0/1
+ SMART_ACTION_SET_HEALTH_PCT = 142, // percent
SMART_ACTION_CREATE_CONVERSATION = 143, // conversation_template.id
SMART_ACTION_SET_IMMUNE_PC = 144, // 0/1
SMART_ACTION_SET_IMMUNE_NPC = 145, // 0/1
@@ -1248,6 +1249,11 @@ struct SmartAction
struct
{
+ uint32 percent;
+ } setHealthPct;
+
+ struct
+ {
uint32 id;
} conversation;