diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2021-01-25 21:27:57 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-06 01:43:57 +0100 |
commit | 4c30b2a1827b81774136d37cb521dbd5823c3423 (patch) | |
tree | 9fe4147ddc144c76b00aea2216501d04b7911965 | |
parent | 23d77ecb8156fd1682649aa9913bb9cc173b60e9 (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.cpp | 66 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 6 |
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; |