diff options
-rw-r--r-- | sql/updates/world/3.3.5/2021_09_27_00_world.sql | 7 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 42 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 34 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 20 |
4 files changed, 102 insertions, 1 deletions
diff --git a/sql/updates/world/3.3.5/2021_09_27_00_world.sql b/sql/updates/world/3.3.5/2021_09_27_00_world.sql new file mode 100644 index 00000000000..1ded1133260 --- /dev/null +++ b/sql/updates/world/3.3.5/2021_09_27_00_world.sql @@ -0,0 +1,7 @@ +-- +UPDATE `smart_scripts` SET `action_type` = 144, `action_param1` = 1 WHERE `action_type` = 18 AND `action_param1` = 256; +UPDATE `smart_scripts` SET `action_type` = 144, `action_param1` = 0 WHERE `action_type` = 19 AND `action_param1` = 256; +UPDATE `smart_scripts` SET `action_type` = 145, `action_param1` = 1 WHERE `action_type` = 18 AND `action_param1` = 512; +UPDATE `smart_scripts` SET `action_type` = 145, `action_param1` = 0 WHERE `action_type` = 19 AND `action_param1` = 512; +UPDATE `smart_scripts` SET `action_type` = 146, `action_param1` = 1 WHERE `action_type` = 18 AND `action_param1` = 33554432; +UPDATE `smart_scripts` SET `action_type` = 146, `action_param1` = 0 WHERE `action_type` = 19 AND `action_param1` = 33554432; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 7ff4a5a9d46..c642701c1ae 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2379,6 +2379,48 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u targetUnit->SetHealth(targetUnit->CountPctFromMaxHealth(e.action.setHealthPct.percent)); break; } + case SMART_ACTION_SET_IMMUNE_PC: + { + for (WorldObject* target : targets) + { + if (IsUnit(target)) + { + if (e.action.setImmunePC.immunePC) + target->ToUnit()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + else + target->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + } + } + break; + } + case SMART_ACTION_SET_IMMUNE_NPC: + { + for (WorldObject* target : targets) + { + if (IsUnit(target)) + { + if (e.action.setImmuneNPC.immuneNPC) + target->ToUnit()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + else + target->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); + } + } + break; + } + case SMART_ACTION_SET_UNINTERACTIBLE: + { + for (WorldObject* target : targets) + { + if (IsUnit(target)) + { + if (e.action.setUninteractible.uninteractible) + target->ToUnit()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE); + else + target->ToUnit()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE); + } + } + 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 27bfe137e58..b57f2867569 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -956,6 +956,9 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e) case SMART_ACTION_SET_HOVER: return sizeof(SmartAction::setHover); case SMART_ACTION_SET_HEALTH_PCT: return sizeof(SmartAction::setHealthPct); //case SMART_ACTION_CREATE_CONVERSATION: return sizeof(SmartAction::raw); + case SMART_ACTION_SET_IMMUNE_PC: return sizeof(SmartAction::setImmunePC); + case SMART_ACTION_SET_IMMUNE_NPC: return sizeof(SmartAction::setImmuneNPC); + case SMART_ACTION_SET_UNINTERACTIBLE: return sizeof(SmartAction::setUninteractible); default: TC_LOG_WARN("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u is using an action with no unused params specified in SmartAIMgr::CheckUnusedActionParams(), please report this.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); @@ -1462,6 +1465,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_EVENT_FRIENDLY_HEALTH: case SMART_EVENT_TARGET_HEALTH_PCT: case SMART_EVENT_IS_BEHIND_TARGET: + case SMART_EVENT_TARGET_MANA_PCT: TC_LOG_WARN("sql.sql.deprecation", "SmartAIMgr: Deprecated event_type(%u), Entry %d SourceType %u Event %u Action %u, it might be removed in the future, loaded for now.", e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); break; default: @@ -2129,6 +2133,21 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) TC_SAI_IS_BOOLEAN_VALID(e, e.action.setHealthRegen.regenHealth); break; } + case SMART_ACTION_SET_IMMUNE_PC: + { + TC_SAI_IS_BOOLEAN_VALID(e, e.action.setImmunePC.immunePC); + break; + } + case SMART_ACTION_SET_IMMUNE_NPC: + { + TC_SAI_IS_BOOLEAN_VALID(e, e.action.setImmuneNPC.immuneNPC); + break; + } + case SMART_ACTION_SET_UNINTERACTIBLE: + { + TC_SAI_IS_BOOLEAN_VALID(e, e.action.setUninteractible.uninteractible); + break; + } case SMART_ACTION_FOLLOW: case SMART_ACTION_SET_ORIENTATION: case SMART_ACTION_STORE_TARGET_LIST: @@ -2199,6 +2218,21 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) return false; } + // Additional check for deprecated + switch (e.GetActionType()) + { + // Deprecated + case SMART_ACTION_SET_UNIT_FLAG: + case SMART_ACTION_REMOVE_UNIT_FLAG: + case SMART_ACTION_ADD_ITEM: + case SMART_ACTION_ADD_DYNAMIC_FLAG: + case SMART_ACTION_REMOVE_DYNAMIC_FLAG: + TC_LOG_WARN("sql.sql.deprecation", "SmartAIMgr: Deprecated action_type(%u), Entry %d SourceType %u Event %u, it might be removed in the future, loaded for now.", e.GetActionType(), e.entryOrGuid, e.GetScriptType(), e.event_id); + break; + default: + break; + } + if (!CheckUnusedActionParams(e)) return false; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 77df54c1a30..8e2ecf9be5e 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -599,8 +599,11 @@ enum SMART_ACTION SMART_ACTION_SET_HOVER = 141, // 0/1 SMART_ACTION_SET_HEALTH_PCT = 142, // percent SMART_ACTION_CREATE_CONVERSATION = 143, // don't use on 3.3.5a + SMART_ACTION_SET_IMMUNE_PC = 144, // 0/1 + SMART_ACTION_SET_IMMUNE_NPC = 145, // 0/1 + SMART_ACTION_SET_UNINTERACTIBLE = 146, // 0/1 - SMART_ACTION_END = 144 + SMART_ACTION_END = 147 }; enum class SmartActionSummonCreatureFlags @@ -1197,6 +1200,21 @@ struct SmartAction uint32 percent; } setHealthPct; + struct + { + SAIBool immunePC; + } setImmunePC; + + struct + { + SAIBool immuneNPC; + } setImmuneNPC; + + struct + { + SAIBool uninteractible; + } setUninteractible; + //! Note for any new future actions //! All parameters must have type uint32 |