fix(Core/Creature): Fire Elemental Invasion changes (#9372)

* fix(DB): Blazing elemental invasion event

- Fixed Elemental Invader's SmartAI;
- Re-arranged Elemental Rifts SmartAI for controlled spawning of
  Invaders.

* SmartAI: SetCounter to be able to subtract

* Target unit or summoner changed for worldobjects

* extra checks and last sql file

* Codestyle

* codestyle

* adding Baron to elemental invasions

* changed owner or summoner target (SmartAI)

* codestyle
This commit is contained in:
Cláudio Costa
2022-01-06 18:30:23 +00:00
committed by GitHub
parent cb7e355291
commit 5d45c52c3e
6 changed files with 61 additions and 19 deletions

View File

@@ -1705,24 +1705,24 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsCreature(*itr))
{
if (SmartAI* ai = CAST_AI(SmartAI, (*itr)->ToCreature()->AI()))
ai->GetScript()->StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset);
ai->GetScript()->StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset, e.action.setCounter.subtract);
else
LOG_ERROR("scripts.ai.sai", "SmartScript: Action target for SMART_ACTION_SET_COUNTER is not using SmartAI, skipping");
}
else if (IsGameObject(*itr))
{
if (SmartGameObjectAI* ai = CAST_AI(SmartGameObjectAI, (*itr)->ToGameObject()->AI()))
ai->GetScript()->StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset);
ai->GetScript()->StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset, e.action.setCounter.subtract);
else
LOG_ERROR("scripts.ai.sai", "SmartScript: Action target for SMART_ACTION_SET_COUNTER is not using SmartGameObjectAI, skipping");
}
}
delete targets;
}
else
StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset);
{
StoreCounter(e.action.setCounter.counterId, e.action.setCounter.value, e.action.setCounter.reset, e.action.setCounter.subtract);
}
break;
}
case SMART_ACTION_WP_START:
@@ -3792,29 +3792,39 @@ ObjectList* SmartScript::GetTargets(SmartScriptHolder const& e, Unit* invoker /*
break;
}
case SMART_TARGET_OWNER_OR_SUMMONER:
/*
* Owners/Summoners should be WorldObjects. This allows to have other objects
* such as gameobjects to execute SmartScripts using this type of target.
* Otherwise, only Units like creatures can summon other creatures.
*/
{
if (me)
{
if (Unit* owner = ObjectAccessor::GetUnit(*me, me->GetCharmerOrOwnerGUID()))
if (WorldObject* owner = ObjectAccessor::GetWorldObject(*me, me->GetCharmerOrOwnerGUID()))
{
l->push_back(owner);
// Xinef: dont add same unit twice
else if (me->IsSummon() && me->ToTempSummon()->GetSummonerUnit())
l->push_back(me->ToTempSummon()->GetSummonerUnit());
}
}
else if (go)
{
if (Unit* owner = ObjectAccessor::GetUnit(*go, go->GetOwnerGUID()))
if (WorldObject* owner = ObjectAccessor::GetWorldObject(*go, go->GetOwnerGUID()))
{
l->push_back(owner);
}
}
// xinef: Get owner of owner
if (e.target.owner.useCharmerOrOwner && !l->empty())
{
Unit* owner = l->front()->ToUnit();
l->clear();
if (Unit* owner = l->front()->ToUnit())
{
l->clear();
if (Unit* base = ObjectAccessor::GetUnit(*owner, owner->GetCharmerOrOwnerGUID()))
l->push_back(base);
if (Unit* base = ObjectAccessor::GetUnit(*owner, owner->GetCharmerOrOwnerGUID()))
{
l->push_back(base);
}
}
}
break;
}

View File

@@ -143,18 +143,28 @@ public:
return nullptr;
}
void StoreCounter(uint32 id, uint32 value, uint32 reset)
void StoreCounter(uint32 id, uint32 value, uint32 reset, uint32 subtract)
{
CounterMap::iterator itr = mCounterList.find(id);
if (itr != mCounterList.end())
{
if (reset == 0)
if (!reset && !subtract)
{
itr->second += value;
}
else if (subtract)
{
itr->second -= value;
}
else
{
itr->second = value;
}
}
else
{
mCounterList.insert(std::make_pair(id, value));
}
ProcessEventsFor(SMART_EVENT_COUNTER_SET, nullptr, id);
}

View File

@@ -1005,6 +1005,7 @@ struct SmartAction
uint32 counterId;
uint32 value;
uint32 reset;
uint32 subtract;
} setCounter;
struct