diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2018-02-10 16:43:01 -0300 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-08-28 15:59:11 +0200 |
| commit | 962f6d7988b9003e550f6745be7cff812e9d8efa (patch) | |
| tree | ee6ab5872b947afb00f4ca99e87c7dddea35bdb3 /src/server/game/Entities/GameObject | |
| parent | 65dca120d34febdaa84a63e17f638ab0fa59b3df (diff) | |
Core/Spells: rework part 5: GameObject casting
Closes #21330
Closes #18885
Ref #18752
(cherry picked from commit 45c5e1b9d63796d168339a44f63418f220cf2403)
Diffstat (limited to 'src/server/game/Entities/GameObject')
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 101 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 13 |
2 files changed, 23 insertions, 91 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 821dc454323..6a13100d63d 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -517,6 +517,8 @@ GameObject* GameObject::CreateGameObjectFromDB(ObjectGuid::LowType spawnId, Map* void GameObject::Update(uint32 diff) { + m_Events.Update(diff); + if (AI()) AI()->UpdateAI(diff); else if (!AIM_Initialize()) @@ -825,8 +827,10 @@ void GameObject::Update(uint32 diff) else if (Unit* target = ObjectAccessor::GetUnit(*this, m_lootStateUnitGUID)) { // Some traps do not have a spell but should be triggered + CastSpellExtraArgs args; + args.SetOriginalCaster(GetOwnerGUID()); if (goInfo->trap.spell) - CastSpell(target, goInfo->trap.spell); + CastSpell(target, goInfo->trap.spell, args); // Template value or 4 seconds m_cooldownTime = GameTime::GetGameTimeMS() + (goInfo->trap.cooldown ? goInfo->trap.cooldown : uint32(4)) * IN_MILLISECONDS; @@ -1307,11 +1311,6 @@ bool GameObject::IsDestructibleBuilding() const return gInfo->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING; } -Unit* GameObject::GetOwner() const -{ - return ObjectAccessor::GetUnit(*this, GetOwnerGUID()); -} - void GameObject::SaveRespawnTime(uint32 forceDelay, bool savetodb) { if (m_goData && (forceDelay || m_respawnTime > GameTime::GetGameTime()) && m_spawnedByDefault) @@ -2211,68 +2210,6 @@ void GameObject::Use(Unit* user) CastSpell(user, spellId); } -void GameObject::CastSpell(Unit* target, uint32 spellId, bool triggered /* = true*/) -{ - CastSpell(target, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); -} - -void GameObject::CastSpell(Unit* target, uint32 spellId, TriggerCastFlags triggered) -{ - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetMap()->GetDifficultyID()); - if (!spellInfo) - return; - - bool self = false; - for (SpellEffectInfo const* effect : spellInfo->GetEffects()) - { - if (effect && effect->TargetA.GetTarget() == TARGET_UNIT_CASTER) - { - self = true; - break; - } - } - - if (self) - { - if (target) - target->CastSpell(target, spellInfo->Id, triggered); - return; - } - - //summon world trigger - Creature* trigger = SummonTrigger(GetPositionX(), GetPositionY(), GetPositionZ(), 0, spellInfo->CalcCastTime() + 100); - if (!trigger) - return; - - // remove immunity flags, to allow spell to target anything - trigger->SetImmuneToAll(false); - PhasingHandler::InheritPhaseShift(trigger, this); - - CastSpellExtraArgs args; - args.TriggerFlags = triggered; - if (Unit* owner = GetOwner()) - { - trigger->SetFaction(owner->GetFaction()); - if (owner->HasUnitFlag(UNIT_FLAG_PVP_ATTACKABLE)) - trigger->AddUnitFlag(UNIT_FLAG_PVP_ATTACKABLE); - // copy pvp state flags from owner - trigger->SetPvpFlags(owner->GetPvpFlags()); - // needed for GO casts for proper target validation checks - trigger->SetOwnerGUID(owner->GetGUID()); - - args.OriginalCaster = owner->GetGUID(); - trigger->CastSpell(target ? target : trigger, spellInfo->Id, args); - } - else - { - trigger->SetFaction(spellInfo->IsPositive() ? FACTION_FRIENDLY : FACTION_MONSTER); - // Set owner guid for target if no owner available - needed by trigger auras - // - trigger gets despawned and there's no caster avalible (see AuraEffect::TriggerSpell()) - args.OriginalCaster = target ? target->GetGUID() : ObjectGuid::Empty; - trigger->CastSpell(target ? target : trigger, spellInfo->Id, args); - } -} - void GameObject::SendCustomAnim(uint32 anim) { WorldPackets::GameObject::GameObjectCustomAnim customAnim; @@ -2380,7 +2317,7 @@ void GameObject::SetWorldRotationAngles(float z_rot, float y_rot, float x_rot) SetWorldRotation(quat.x, quat.y, quat.z, quat.w); } -void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= nullptr*/, uint32 spellId /*= 0*/) +void GameObject::ModifyHealth(int32 change, WorldObject* attackerOrHealer /*= nullptr*/, uint32 spellId /*= 0*/) { if (!m_goValue.Building.MaxHealth || !change) return; @@ -2399,10 +2336,8 @@ void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= nullptr*/ // Set the health bar, value = 255 * healthPct; SetGoAnimProgress(m_goValue.Building.Health * 255 / m_goValue.Building.MaxHealth); - Player* player = attackerOrHealer ? attackerOrHealer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr; - // dealing damage, send packet - if (player) + if (Player* player = attackerOrHealer ? attackerOrHealer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr) { WorldPackets::GameObject::DestructibleBuildingDamage packet; packet.Caster = attackerOrHealer->GetGUID(); // todo: this can be a GameObject @@ -2425,11 +2360,10 @@ void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= nullptr*/ if (newState == GetDestructibleState()) return; - /// @todo: pass attackerOrHealer instead of player - SetDestructibleState(newState, player, false); + SetDestructibleState(newState, attackerOrHealer, false); } -void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* eventInvoker /*= nullptr*/, bool setHealth /*= false*/) +void GameObject::SetDestructibleState(GameObjectDestructibleState state, WorldObject* attackerOrHealer /*= nullptr*/, bool setHealth /*= false*/) { // the user calling this must know he is already operating on destructible gameobject ASSERT(GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING); @@ -2448,8 +2382,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* break; case GO_DESTRUCTIBLE_DAMAGED: { - EventInform(m_goInfo->destructibleBuilding.DamagedEvent, eventInvoker); - AI()->Damaged(eventInvoker, m_goInfo->destructibleBuilding.DamagedEvent); + EventInform(m_goInfo->destructibleBuilding.DamagedEvent, attackerOrHealer); + AI()->Damaged(attackerOrHealer, m_goInfo->destructibleBuilding.DamagedEvent); RemoveFlag(GO_FLAG_DESTROYED); AddFlag(GO_FLAG_DAMAGED); @@ -2473,11 +2407,12 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* } case GO_DESTRUCTIBLE_DESTROYED: { - EventInform(m_goInfo->destructibleBuilding.DestroyedEvent, eventInvoker); - AI()->Destroyed(eventInvoker, m_goInfo->destructibleBuilding.DestroyedEvent); - if (eventInvoker) - if (Battleground* bg = eventInvoker->GetBattleground()) - bg->DestroyGate(eventInvoker, this); + EventInform(m_goInfo->destructibleBuilding.DestroyedEvent, attackerOrHealer); + AI()->Destroyed(attackerOrHealer, m_goInfo->destructibleBuilding.DestroyedEvent); + + if (attackerOrHealer && attackerOrHealer->GetTypeId() == TYPEID_PLAYER) + if (Battleground* bg = attackerOrHealer->ToPlayer()->GetBattleground()) + bg->DestroyGate(attackerOrHealer->ToPlayer(), this); RemoveFlag(GO_FLAG_DAMAGED); AddFlag(GO_FLAG_DESTROYED); @@ -2498,7 +2433,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* } case GO_DESTRUCTIBLE_REBUILDING: { - EventInform(m_goInfo->destructibleBuilding.RebuildingEvent, eventInvoker); + EventInform(m_goInfo->destructibleBuilding.RebuildingEvent, attackerOrHealer); RemoveFlag(GameObjectFlags(GO_FLAG_DAMAGED | GO_FLAG_DESTROYED)); uint32 modelId = m_goInfo->displayId; diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index bb1efe37da0..d16120e0edc 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -140,8 +140,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> m_spawnedByDefault = false; // all object with owner is despawned after delay SetUpdateFieldValue(m_values.ModifyValue(&GameObject::m_gameObjectData).ModifyValue(&UF::GameObjectData::CreatedBy), owner); } - ObjectGuid GetOwnerGUID() const { return m_gameObjectData->CreatedBy; } - Unit* GetOwner() const; + ObjectGuid GetOwnerGUID() const override { return m_gameObjectData->CreatedBy; } void SetSpellId(uint32 id) { @@ -249,14 +248,12 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> GameObject* LookupFishingHoleAround(float range); - void CastSpell(Unit* target, uint32 spell, bool triggered = true); - void CastSpell(Unit* target, uint32 spell, TriggerCastFlags triggered); void SendCustomAnim(uint32 anim); bool IsInRange(float x, float y, float z, float radius) const; - void ModifyHealth(int32 change, Unit* attackerOrHealer = nullptr, uint32 spellId = 0); + void ModifyHealth(int32 change, WorldObject* attackerOrHealer = nullptr, uint32 spellId = 0); // sets GameObject type 33 destruction flags and optionally default health for that state - void SetDestructibleState(GameObjectDestructibleState state, Player* eventInvoker = nullptr, bool setHealth = false); + void SetDestructibleState(GameObjectDestructibleState state, WorldObject* attackerOrHealer = nullptr, bool setHealth = false); GameObjectDestructibleState GetDestructibleState() const { if ((*m_gameObjectData->Flags & GO_FLAG_DESTROYED)) @@ -280,8 +277,8 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> uint32 GetDisplayId() const { return m_gameObjectData->DisplayID; } uint8 GetNameSetId() const; - uint32 GetFaction() const { return m_gameObjectData->FactionTemplate; } - void SetFaction(uint32 faction) { SetUpdateFieldValue(m_values.ModifyValue(&GameObject::m_gameObjectData).ModifyValue(&UF::GameObjectData::FactionTemplate), faction); } + uint32 GetFaction() const override { return m_gameObjectData->FactionTemplate; } + void SetFaction(uint32 faction) override { SetUpdateFieldValue(m_values.ModifyValue(&GameObject::m_gameObjectData).ModifyValue(&UF::GameObjectData::FactionTemplate), faction); } GameObjectModel* m_model; void GetRespawnPosition(float &x, float &y, float &z, float* ori = nullptr) const; |
