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

View File

@@ -2271,7 +2271,7 @@ void WorldObject::AddObjectToRemoveList()
map->AddObjectToRemoveList(this);
}
TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, Unit* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties /*= nullptr*/, uint32 duration /*= 0*/, WorldObject* summoner /*= nullptr*/, uint32 spellId /*= 0*/, uint32 vehId /*= 0*/)
{
uint32 mask = UNIT_MASK_SUMMON;
if (properties)
@@ -2451,7 +2451,7 @@ TempSummon* WorldObject::SummonCreature(uint32 entry, const Position& pos, TempS
{
if (Map* map = FindMap())
{
if (TempSummon* summon = map->SummonCreature(entry, pos, properties, duration, isType(TYPEMASK_UNIT) ? (Unit*)this : nullptr))
if (TempSummon* summon = map->SummonCreature(entry, pos, properties, duration, (WorldObject*) this))
{
summon->SetTempSummonType(spwtype);
return summon;

View File

@@ -490,7 +490,7 @@ public:
void UpdateIteratorBack(Player* player);
TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, Unit* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0);
TempSummon* SummonCreature(uint32 entry, Position const& pos, SummonPropertiesEntry const* properties = nullptr, uint32 duration = 0, WorldObject* summoner = nullptr, uint32 spellId = 0, uint32 vehId = 0);
GameObject* SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport = true);
void SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list = nullptr);