mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-17 10:55:43 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -1005,6 +1005,7 @@ struct SmartAction
|
||||
uint32 counterId;
|
||||
uint32 value;
|
||||
uint32 reset;
|
||||
uint32 subtract;
|
||||
} setCounter;
|
||||
|
||||
struct
|
||||
|
||||
Reference in New Issue
Block a user