aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2021_09_27_00_world.sql7
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp42
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp34
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h20
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