mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2025-11-29 17:38:24 +08:00
feat(Core/SmartScripts): Add support to friendly+hostile to SMART_EVENT_OOC_LOS and SMART_EVENT_IC_LOS (#10037)
* . * .
This commit is contained in:
committed by
GitHub
parent
7fb6b7e15f
commit
c377c62c7a
@@ -0,0 +1,4 @@
|
||||
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1641446334563754297');
|
||||
|
||||
--
|
||||
UPDATE `smart_scripts` SET `event_type` = 1, `event_param1` = 6000, `event_param2` = 11000, `target_type` = 19, `target_param1` = 24042, `target_param2` = 40 WHERE `entryorguid` = 23760 AND `source_type` = 0 AND `id` = 3;
|
||||
@@ -4229,9 +4229,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;
|
||||
@@ -4251,9 +4253,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;
|
||||
|
||||
@@ -494,6 +494,12 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (e.event.los.hostilityMode >= AsUnderlyingType(SmartEvent::LOSHostilityMode::End))
|
||||
{
|
||||
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))
|
||||
|
||||
@@ -112,7 +112,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, PlayerOnly
|
||||
SMART_EVENT_OOC_LOS = 10, // HostilityMode, MaxRnage, CooldownMin, CooldownMax, PlayerOnly
|
||||
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
|
||||
@@ -128,7 +128,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, PlayerOnly
|
||||
SMART_EVENT_IC_LOS = 26, // HostilityMode, MaxRnage, CooldownMin, CooldownMax, PlayerOnly
|
||||
SMART_EVENT_PASSENGER_BOARDED = 27, // CooldownMin, CooldownMax
|
||||
SMART_EVENT_PASSENGER_REMOVED = 28, // CooldownMin, CooldownMax
|
||||
SMART_EVENT_CHARMED = 29, // NONE
|
||||
@@ -228,7 +228,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;
|
||||
@@ -458,6 +461,14 @@ struct SmartEvent
|
||||
uint32 param5;
|
||||
} raw;
|
||||
};
|
||||
|
||||
enum class LOSHostilityMode : uint32
|
||||
{
|
||||
Hostile = 0,
|
||||
NotHostile = 1,
|
||||
Any = 2,
|
||||
End
|
||||
};
|
||||
};
|
||||
|
||||
enum SMART_SCRIPT_RESPAWN_CONDITION
|
||||
|
||||
Reference in New Issue
Block a user