diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 12 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 6 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 17 |
3 files changed, 28 insertions, 7 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 1b2ffde6e15..06d381eff8a 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3179,9 +3179,11 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui //if range is ok and we are actually in LOS if (me->IsWithinDistInMap(unit, range) && me->IsWithinLOSInMap(unit)) { + SmartEvent::LOSHostilityMode hostilityMode = static_cast<SmartEvent::LOSHostilityMode>(e.event.los.hostilityMode); //if friendly event&&who is not hostile OR hostile event&&who is hostile - if ((e.event.los.noHostile && !me->IsHostileTo(unit)) || - (!e.event.los.noHostile && me->IsHostileTo(unit))) + if ((hostilityMode == SmartEvent::LOSHostilityMode::Any) || + (hostilityMode == SmartEvent::LOSHostilityMode::NotHostile && !me->IsHostileTo(unit)) || + (hostilityMode == SmartEvent::LOSHostilityMode::Hostile && me->IsHostileTo(unit))) { if (e.event.los.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) return; @@ -3201,9 +3203,11 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui //if range is ok and we are actually in LOS if (me->IsWithinDistInMap(unit, range) && me->IsWithinLOSInMap(unit)) { + SmartEvent::LOSHostilityMode hostilityMode = static_cast<SmartEvent::LOSHostilityMode>(e.event.los.hostilityMode); //if friendly event&&who is not hostile OR hostile event&&who is hostile - if ((e.event.los.noHostile && !me->IsHostileTo(unit)) || - (!e.event.los.noHostile && me->IsHostileTo(unit))) + if ((hostilityMode == SmartEvent::LOSHostilityMode::Any) || + (hostilityMode == SmartEvent::LOSHostilityMode::NotHostile && !me->IsHostileTo(unit)) || + (hostilityMode == SmartEvent::LOSHostilityMode::Hostile && me->IsHostileTo(unit))) { if (e.event.los.playerOnly && unit->GetTypeId() != TYPEID_PLAYER) return; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 2072393189a..394e0a56798 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -762,6 +762,12 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_EVENT_IC_LOS: if (!IsMinMaxValid(e, e.event.los.cooldownMin, e.event.los.cooldownMax)) return false; + if (e.event.los.hostilityMode >= AsUnderlyingType(SmartEvent::LOSHostilityMode::End)) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses hostilityMode with invalid value %u (max allowed value %u), skipped.", + e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.los.hostilityMode, AsUnderlyingType(SmartEvent::LOSHostilityMode::End) - 1); + return false; + } break; case SMART_EVENT_RESPAWN: if (e.event.respawn.type == SMART_SCRIPT_RESPAWN_CONDITION_MAP && !sMapStore.LookupEntry(e.event.respawn.map)) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 34835b2dde6..08626e9c1c6 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -107,7 +107,7 @@ enum SMART_EVENT SMART_EVENT_EVADE = 7, // NONE SMART_EVENT_SPELLHIT = 8, // SpellID, School, CooldownMin, CooldownMax SMART_EVENT_RANGE = 9, // MinDist, MaxDist, RepeatMin, RepeatMax - SMART_EVENT_OOC_LOS = 10, // NoHostile, MaxRnage, CooldownMin, CooldownMax + SMART_EVENT_OOC_LOS = 10, // HostilityMode, MaxRnage, CooldownMin, CooldownMax SMART_EVENT_RESPAWN = 11, // type, MapId, ZoneId SMART_EVENT_TARGET_HEALTH_PCT = 12, // HPMin%, HPMax%, RepeatMin, RepeatMax SMART_EVENT_VICTIM_CASTING = 13, // RepeatMin, RepeatMax, spellid @@ -123,7 +123,7 @@ enum SMART_EVENT SMART_EVENT_HAS_AURA = 23, // Param1 = SpellID, Param2 = Stack amount, Param3/4 RepeatMin, RepeatMax SMART_EVENT_TARGET_BUFFED = 24, // Param1 = SpellID, Param2 = Stack amount, Param3/4 RepeatMin, RepeatMax SMART_EVENT_RESET = 25, // Called after combat, when the creature respawn and spawn. - SMART_EVENT_IC_LOS = 26, // NoHostile, MaxRnage, CooldownMin, CooldownMax + SMART_EVENT_IC_LOS = 26, // HostilityMode, MaxRnage, CooldownMin, CooldownMax SMART_EVENT_PASSENGER_BOARDED = 27, // CooldownMin, CooldownMax SMART_EVENT_PASSENGER_REMOVED = 28, // CooldownMin, CooldownMax SMART_EVENT_CHARMED = 29, // onRemove (0 - on apply, 1 - on remove) @@ -218,7 +218,10 @@ struct SmartEvent struct { - uint32 noHostile; + /// <summary> + /// Hostility mode of the event. 0: hostile, 1: not hostile, 2: any + /// </summary> + uint32 hostilityMode; uint32 maxDist; uint32 cooldownMin; uint32 cooldownMax; @@ -445,6 +448,14 @@ struct SmartEvent uint32 param5; } raw; }; + + enum class LOSHostilityMode : uint32 + { + Hostile = 0, + NotHostile = 1, + Any = 2, + End + }; }; enum SMART_SCRIPT_RESPAWN_CONDITION |