diff options
| author | joschiwald <joschiwald.trinity@gmail.com> | 2016-03-20 19:50:11 +0100 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2016-03-20 19:50:11 +0100 |
| commit | c498966d23933e323685c3a767d3fe334a60af22 (patch) | |
| tree | df7f0e4b049bb506fcd0d5d8f6b365f32e7c1d46 /src/server/game | |
| parent | df7554b6ea4dee16853811fe02b4e70fe2c9e957 (diff) | |
Core/Spells: cleanup raise ally code
(partial cherry picked from commit 312e8509dddf910a5ab199d646c5a4d237d5fda9)
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 91 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 52 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 8 |
5 files changed, 68 insertions, 95 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4c3f7289b11..b66b62f0aaf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -332,8 +332,6 @@ Player::Player(WorldSession* session): Unit(true) m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); - clearResurrectRequestData(); - memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT); m_social = nullptr; @@ -1565,7 +1563,7 @@ void Player::setDeathState(DeathState s) // lost combo points at any target (targeted combo points clear in Unit::setDeathState) ClearComboPoints(); - clearResurrectRequestData(); + ClearResurrectRequestData(); //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD) RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true); @@ -2056,24 +2054,7 @@ void Player::ProcessDelayedOperations() return; if (m_DelayedOperations & DELAYED_RESURRECT_PLAYER) - { - ResurrectPlayer(0.0f, false); - - if (GetMaxHealth() > m_resurrectHealth) - SetHealth(m_resurrectHealth); - else - SetFullHealth(); - - if (GetMaxPower(POWER_MANA) > m_resurrectMana) - SetPower(POWER_MANA, m_resurrectMana); - else - SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); - - SetPower(POWER_RAGE, 0); - SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY)); - - SpawnCorpseBones(); - } + ResurrectUsingRequestDataImpl(); if (m_DelayedOperations & DELAYED_SAVE_PLAYER) SaveToDB(); @@ -4758,30 +4739,9 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) } } -void Player::SendGhoulResurrectRequest(Player* target) -{ - target->m_ghoulResurrectPlayerGUID = GetGUID(); - - WorldPacket data(SMSG_RESURRECT_REQUEST, 8 + 4 + 1 + 1); - data << uint64(GetGUID()); - data << uint32(0); - data << uint8(0); - data << uint8(0); - target->GetSession()->SendPacket(&data); -} - -void Player::GhoulResurrect() -{ - CastSpell(this, 46619 /*SPELL_DK_RAISE_ALLY*/, true, nullptr, nullptr, m_ghoulResurrectPlayerGUID); - - m_ghoulResurrectPlayerGUID = ObjectGuid::Empty; -} - void Player::RemoveGhoul() { - if (IsGhouled()) - if (Creature* ghoul = ObjectAccessor::GetCreature(*this, m_ghoulResurrectGhoulGUID)) - ghoul->DespawnOrUnsummon(); // Raise Ally aura will handle unauras + RemoveAura(SPELL_DK_RAISE_ALLY); } void Player::KillPlayer() @@ -7010,6 +6970,7 @@ void Player::SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type) SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId); SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, type); } + void Player::SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value) { SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * ARENA_TEAM_END) + type, value); @@ -21664,24 +21625,17 @@ void Player::UpdatePotionCooldown(Spell* spell) m_lastPotionId = 0; } -void Player::setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana) +void Player::SetResurrectRequestData(Unit* caster, uint32 health, uint32 mana, uint32 appliedAura) { - m_resurrectGUID = guid; - m_resurrectMap = mapId; - m_resurrectX = X; - m_resurrectY = Y; - m_resurrectZ = Z; - m_resurrectHealth = health; - m_resurrectMana = mana; + ASSERT(!IsResurrectRequested()); + _resurrectionData.reset(new ResurrectionData()); + _resurrectionData->GUID = caster->GetGUID(); + _resurrectionData->Location.WorldRelocate(*caster); + _resurrectionData->Health = health; + _resurrectionData->Mana = mana; + _resurrectionData->Aura = appliedAura; } -void Player::clearResurrectRequestData() -{ - setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); - - m_ghoulResurrectPlayerGUID = ObjectGuid::Empty; - m_ghoulResurrectGhoulGUID = ObjectGuid::Empty; -} //slot to be excluded while counting bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) const { @@ -23588,8 +23542,14 @@ void Player::ResurrectUsingRequestData() { RemoveGhoul(); + if (uint32 aura = _resurrectionData->Aura) + { + CastSpell(this, _resurrectionData->Aura, true, nullptr, nullptr, _resurrectionData->GUID); + return; + } + /// Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse - TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation()); + TeleportTo(_resurrectionData->Location); if (IsBeingTeleported()) { @@ -23597,15 +23557,20 @@ void Player::ResurrectUsingRequestData() return; } + ResurrectUsingRequestDataImpl(); +} + +void Player::ResurrectUsingRequestDataImpl() +{ ResurrectPlayer(0.0f, false); - if (GetMaxHealth() > m_resurrectHealth) - SetHealth(m_resurrectHealth); + if (GetMaxHealth() > _resurrectionData->Health) + SetHealth(_resurrectionData->Health); else SetFullHealth(); - if (GetMaxPower(POWER_MANA) > m_resurrectMana) - SetPower(POWER_MANA, m_resurrectMana); + if (GetMaxPower(POWER_MANA) > _resurrectionData->Mana) + SetPower(POWER_MANA, _resurrectionData->Mana); else SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b2cb2aed226..33b345cc5af 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1014,6 +1014,20 @@ struct TradeStatusInfo uint8 Slot; }; +struct ResurrectionData +{ + ObjectGuid GUID; + WorldLocation Location; + uint32 Health; + uint32 Mana; + uint32 Aura; +}; + +enum Spells +{ + SPELL_DK_RAISE_ALLY = 46619 +}; + class Player : public Unit, public GridObject<Player> { friend class WorldSession; @@ -1590,11 +1604,24 @@ class Player : public Unit, public GridObject<Player> void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; } void UpdatePotionCooldown(Spell* spell = nullptr); - void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana); - void clearResurrectRequestData(); - bool isResurrectRequestedBy(ObjectGuid guid) const { return !m_resurrectGUID.IsEmpty() && m_resurrectGUID == guid; } - bool isResurrectRequested() const { return !m_resurrectGUID.IsEmpty(); } + void SetResurrectRequestData(Unit* caster, uint32 health, uint32 mana, uint32 appliedAura); + + void ClearResurrectRequestData() + { + _resurrectionData.reset(); + } + + bool IsResurrectRequestedBy(uint64 guid) const + { + if (!IsResurrectRequested()) + return false; + + return !_resurrectionData->GUID.IsEmpty() && _resurrectionData->GUID == guid; + } + + bool IsResurrectRequested() const { return _resurrectionData.get() != nullptr; } void ResurrectUsingRequestData(); + void ResurrectUsingRequestDataImpl(); uint8 getCinematic() const { return m_cinematic; } void setCinematic(uint8 cine) { m_cinematic = cine; } @@ -1785,14 +1812,7 @@ class Player : public Unit, public GridObject<Player> void ResurrectPlayer(float restore_percent, bool applySickness = false); void BuildPlayerRepop(); void RepopAtGraveyard(); - void SendGhoulResurrectRequest(Player* target); - bool IsValidGhoulResurrectRequest(ObjectGuid guid) - { - return !m_ghoulResurrectPlayerGUID.IsEmpty() && m_ghoulResurrectPlayerGUID == guid; - } - void GhoulResurrect(); - void SetGhoulResurrectGhoulGUID(ObjectGuid guid) { m_ghoulResurrectGhoulGUID = guid; } - ObjectGuid GetGhoulResurrectGhoulGUID() { return m_ghoulResurrectGhoulGUID; } + void RemoveGhoul(); void DurabilityLossAll(double percent, bool inventory); @@ -2422,13 +2442,7 @@ class Player : public Unit, public GridObject<Player> void ResetTimeSync(); void SendTimeSync(); - ObjectGuid m_resurrectGUID; - uint32 m_resurrectMap; - float m_resurrectX, m_resurrectY, m_resurrectZ; - uint32 m_resurrectHealth, m_resurrectMana; - - ObjectGuid m_ghoulResurrectPlayerGUID; - ObjectGuid m_ghoulResurrectGhoulGUID; + std::unique_ptr<ResurrectionData> _resurrectionData; WorldSession* m_session; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 0c4ee979748..38caa43598a 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1602,7 +1602,7 @@ class Unit : public WorldObject bool IsAlive() const { return (m_deathState == ALIVE); } bool isDying() const { return (m_deathState == JUST_DIED); } bool isDead() const { return (m_deathState == DEAD || m_deathState == CORPSE); } - bool IsGhouled() const { return HasAura(46619 /*SPELL_DK_RAISE_ALLY*/); } + bool IsGhouled() const { return HasAura(SPELL_DK_RAISE_ALLY); } DeathState getDeathState() const { return m_deathState; } virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 4fa5e2f848d..91df877e936 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -773,17 +773,11 @@ void WorldSession::HandleResurrectResponseOpcode(WorldPacket& recvData) if (status == 0) { - GetPlayer()->clearResurrectRequestData(); // reject + GetPlayer()->ClearResurrectRequestData(); // reject return; } - if (GetPlayer()->IsValidGhoulResurrectRequest(guid)) - { - GetPlayer()->GhoulResurrect(); - return; - } - - if (!GetPlayer()->isResurrectRequestedBy(guid)) + if (!GetPlayer()->IsResurrectRequestedBy(guid)) return; GetPlayer()->ResurrectUsingRequestData(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index f9bf33553cc..2a9db6f0449 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -250,13 +250,13 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) Player* target = unitTarget->ToPlayer(); - if (target->isResurrectRequested()) // already have one active request + if (target->IsResurrectRequested()) // already have one active request return; uint32 health = damage; uint32 mana = m_spellInfo->Effects[effIndex].MiscValue; ExecuteLogEffectResurrect(effIndex, target); - target->setResurrectRequestData(m_caster->GetGUID(), m_caster->GetMapId(), m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ(), health, mana); + target->SetResurrectRequestData(m_caster, health, mana, 0); SendResurrectRequest(target); } @@ -4536,7 +4536,7 @@ void Spell::EffectResurrect(SpellEffIndex effIndex) Player* target = unitTarget->ToPlayer(); - if (target->isResurrectRequested()) // already have one active request + if (target->IsResurrectRequested()) // already have one active request return; uint32 health = target->CountPctFromMaxHealth(damage); @@ -4544,7 +4544,7 @@ void Spell::EffectResurrect(SpellEffIndex effIndex) ExecuteLogEffectResurrect(effIndex, target); - target->setResurrectRequestData(m_caster->GetGUID(), m_caster->GetMapId(), m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ(), health, mana); + target->SetResurrectRequestData(m_caster, health, mana, 0); SendResurrectRequest(target); } |
