mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-21 12:47:07 +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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user