mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-13 17:19:07 +00:00
feat(Core/SmartAI): Implement AoE variants of VICTIM_CASTING and RANGE events (#16720)
* init * areaRange * Update SmartScript.cpp * error checks * update SAI for area range * areaCasting * more * Update rev_1689199652093827600.sql * typo * dont interrupt totems * Update SmartScriptMgr.cpp * target type needs to be 7 * Update rev_1689199652093827600.sql
This commit is contained in:
@@ -2875,6 +2875,18 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
|
||||
|
||||
break;
|
||||
}
|
||||
case SMART_ACTION_PLAY_SPELL_VISUAL:
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsUnit(target))
|
||||
{
|
||||
if (e.action.spellVisual.visualId)
|
||||
target->ToUnit()->SendPlaySpellVisual(e.action.spellVisual.visualId);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry {} SourceType {}, Event {}, Unhandled Action type {}", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
|
||||
break;
|
||||
@@ -3679,7 +3691,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
|
||||
ProcessTimedAction(e, e.event.rangeRepeat.repeatMin, e.event.rangeRepeat.repeatMax, me->GetVictim());
|
||||
}
|
||||
else
|
||||
RecalcTimer(e, 500, 500); // make it predictable
|
||||
RecalcTimer(e, 1200, 1200); // make it predictable
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -4240,7 +4252,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
|
||||
playerCount++;
|
||||
}
|
||||
|
||||
if (playerCount <= e.event.nearPlayerNegation.maxCount)
|
||||
if (playerCount < e.event.nearPlayerNegation.maxCount)
|
||||
ProcessAction(e, unit);
|
||||
}
|
||||
RecalcTimer(e, e.event.nearPlayerNegation.repeatMin, e.event.nearPlayerNegation.repeatMax);
|
||||
@@ -4277,6 +4289,37 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
|
||||
RecalcTimer(e, e.event.nearUnit.timer, e.event.nearUnit.timer);
|
||||
break;
|
||||
}
|
||||
case SMART_EVENT_NEAR_UNIT_NEGATION:
|
||||
{
|
||||
uint32 unitCount = 0;
|
||||
ObjectVector targets;
|
||||
GetWorldObjectsInDist(targets, static_cast<float>(e.event.nearUnitNegation.range));
|
||||
|
||||
if (!targets.empty())
|
||||
{
|
||||
if (e.event.nearUnitNegation.type)
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsGameObject(target) && target->GetEntry() == e.event.nearUnitNegation.entry)
|
||||
unitCount++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (WorldObject* target : targets)
|
||||
{
|
||||
if (IsCreature(target) && target->GetEntry() == e.event.nearUnitNegation.entry)
|
||||
unitCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (unitCount < e.event.nearUnitNegation.count)
|
||||
ProcessAction(e, unit);
|
||||
}
|
||||
RecalcTimer(e, e.event.nearUnitNegation.timer, e.event.nearUnitNegation.timer);
|
||||
break;
|
||||
}
|
||||
case SMART_EVENT_AREA_CASTING:
|
||||
{
|
||||
if (!me || !me->IsEngaged())
|
||||
@@ -4288,25 +4331,45 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
|
||||
{
|
||||
if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()))
|
||||
{
|
||||
if (!target || target->IsPet() || target->IsTotem() || !target->IsNonMeleeSpellCast(false, false, true))
|
||||
continue;
|
||||
|
||||
if (e.event.areaCasting.range && !me->IsWithinDistInMap(target, range))
|
||||
continue;
|
||||
|
||||
if (!target || !target->IsNonMeleeSpellCast(false, false, true))
|
||||
ProcessAction(e, target);
|
||||
RecalcTimer(e, e.event.areaCasting.repeatMin, e.event.areaCasting.repeatMax);
|
||||
return;
|
||||
}
|
||||
|
||||
// If no targets are found and it's off cooldown, check again in 1200ms
|
||||
RecalcTimer(e, 1200, 1200);
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case SMART_EVENT_AREA_RANGE:
|
||||
{
|
||||
if (!me || !me->IsEngaged())
|
||||
return;
|
||||
|
||||
ThreatContainer::StorageType threatList = me->GetThreatMgr().GetThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator i = threatList.begin(); i != threatList.end(); ++i)
|
||||
{
|
||||
if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()))
|
||||
{
|
||||
if (!(me->IsInRange(target, 0.f, (float)e.event.areaRange.range)))
|
||||
continue;
|
||||
|
||||
if (e.event.areaCasting.spellId > 0)
|
||||
if (Spell* currSpell = target->GetCurrentSpell(CURRENT_GENERIC_SPELL))
|
||||
if (currSpell->m_spellInfo->Id != e.event.areaCasting.spellId)
|
||||
continue;
|
||||
|
||||
ProcessAction(e, target);
|
||||
RecalcTimer(e, e.event.areaCasting.repeatMin, e.event.areaCasting.repeatMin);
|
||||
RecalcTimer(e, e.event.areaRange.repeatMin, e.event.areaRange.repeatMax);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If no targets are found and it's off cooldown, check again
|
||||
RecalcTimer(e, e.event.areaCasting.checkTimer, e.event.areaCasting.checkTimer);
|
||||
RecalcTimer(e, 1200, 1200);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -4325,7 +4388,10 @@ void SmartScript::InitTimer(SmartScriptHolder& e)
|
||||
if (e.event.rangeRepeat.onlyFireOnRepeat == 1)
|
||||
e.event.rangeRepeat.onlyFireOnRepeat = 2;
|
||||
// make it predictable
|
||||
RecalcTimer(e, 500, 500);
|
||||
RecalcTimer(e, 1200, 1200);
|
||||
break;
|
||||
case SMART_EVENT_AREA_RANGE:
|
||||
RecalcTimer(e, e.event.areaRange.min, e.event.areaRange.max);
|
||||
break;
|
||||
case SMART_EVENT_NEAR_PLAYERS:
|
||||
case SMART_EVENT_NEAR_PLAYERS_NEGATION:
|
||||
@@ -4346,10 +4412,11 @@ void SmartScript::InitTimer(SmartScriptHolder& e)
|
||||
RecalcTimer(e, e.event.distance.repeat, e.event.distance.repeat);
|
||||
break;
|
||||
case SMART_EVENT_NEAR_UNIT:
|
||||
case SMART_EVENT_NEAR_UNIT_NEGATION:
|
||||
RecalcTimer(e, e.event.nearUnit.timer, e.event.nearUnit.timer);
|
||||
break;
|
||||
case SMART_EVENT_AREA_CASTING:
|
||||
RecalcTimer(e, e.event.areaCasting.repeatMin, e.event.areaCasting.repeatMax);
|
||||
RecalcTimer(e, e.event.areaCasting.min, e.event.areaCasting.max);
|
||||
break;
|
||||
default:
|
||||
e.active = true;
|
||||
@@ -4405,6 +4472,7 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff)
|
||||
case SMART_EVENT_NEAR_PLAYERS:
|
||||
case SMART_EVENT_NEAR_PLAYERS_NEGATION:
|
||||
case SMART_EVENT_NEAR_UNIT:
|
||||
case SMART_EVENT_NEAR_UNIT_NEGATION:
|
||||
case SMART_EVENT_UPDATE:
|
||||
case SMART_EVENT_UPDATE_OOC:
|
||||
case SMART_EVENT_UPDATE_IC:
|
||||
@@ -4413,6 +4481,7 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff)
|
||||
case SMART_EVENT_MANA_PCT:
|
||||
case SMART_EVENT_TARGET_MANA_PCT:
|
||||
case SMART_EVENT_RANGE:
|
||||
case SMART_EVENT_AREA_RANGE:
|
||||
case SMART_EVENT_VICTIM_CASTING:
|
||||
case SMART_EVENT_AREA_CASTING:
|
||||
case SMART_EVENT_FRIENDLY_HEALTH:
|
||||
|
||||
Reference in New Issue
Block a user