diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index 73fe1797d..0667c5cea 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -130,7 +130,6 @@ BattleGround::BattleGround() m_Status = STATUS_NONE; m_ClientInstanceID = 0; m_EndTime = 0; - m_LastResurrectTime = 0; m_QueueId = QUEUE_ID_MAX_LEVEL_19; m_InvitedAlliance = 0; m_InvitedHorde = 0; @@ -260,62 +259,6 @@ void BattleGround::Update(uint32 diff) } } - /*********************************************************/ - /*** BATTLEGROUND RESSURECTION SYSTEM ***/ - /*********************************************************/ - - //this should be handled by spell system - m_LastResurrectTime += diff; - if (m_LastResurrectTime >= RESURRECTION_INTERVAL) - { - if (GetReviveQueueSize()) - { - for(std::map >::iterator itr = m_ReviveQueue.begin(); itr != m_ReviveQueue.end(); ++itr) - { - Creature *sh = NULL; - for(std::vector::const_iterator itr2 = (itr->second).begin(); itr2 != (itr->second).end(); ++itr2) - { - Player *plr = objmgr.GetPlayer(*itr2); - if (!plr) - continue; - - if (!sh && plr->IsInWorld()) - { - sh = plr->GetMap()->GetCreature(itr->first); - // only for visual effect - if (sh) - // Spirit Heal, effect 117 - sh->CastSpell(sh, SPELL_SPIRIT_HEAL, true); - } - - // Resurrection visual - plr->CastSpell(plr, SPELL_RESURRECTION_VISUAL, true); - m_ResurrectQueue.push_back(*itr2); - } - (itr->second).clear(); - } - - m_ReviveQueue.clear(); - m_LastResurrectTime = 0; - } - else - // queue is clear and time passed, just update last resurrection time - m_LastResurrectTime = 0; - } - else if (m_LastResurrectTime > 500) // Resurrect players only half a second later, to see spirit heal effect on NPC - { - for(std::vector::const_iterator itr = m_ResurrectQueue.begin(); itr != m_ResurrectQueue.end(); ++itr) - { - Player *plr = objmgr.GetPlayer(*itr); - if (!plr) - continue; - plr->ResurrectPlayer(1.0f); - plr->CastSpell(plr, SPELL_SPIRIT_HEAL_MANA, true); - ObjectAccessor::Instance().ConvertCorpseForPlayer(*itr); - } - m_ResurrectQueue.clear(); - } - /*********************************************************/ /*** BATTLEGROUND BALLANCE SYSTEM ***/ /*********************************************************/ @@ -972,8 +915,6 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac m_PlayerScores.erase(itr2); } - RemovePlayerFromResurrectQueue(guid); - Player *plr = objmgr.GetPlayer(guid); // should remove spirit of redemption @@ -1088,7 +1029,6 @@ void BattleGround::Reset() SetStatus(STATUS_WAIT_QUEUE); SetStartTime(0); SetEndTime(0); - SetLastResurrectTime(0); SetArenaType(0); SetRated(false); @@ -1119,7 +1059,6 @@ void BattleGround::Reset() void BattleGround::StartBattleGround() { SetStartTime(0); - SetLastResurrectTime(0); // add BG to free slot queue AddToBGFreeSlotQueue(); @@ -1351,39 +1290,6 @@ void BattleGround::UpdatePlayerScore(Player *Source, uint32 type, uint32 value) } } -void BattleGround::AddPlayerToResurrectQueue(uint64 npc_guid, uint64 player_guid) -{ - m_ReviveQueue[npc_guid].push_back(player_guid); - - Player *plr = objmgr.GetPlayer(player_guid); - if (!plr) - return; - - plr->CastSpell(plr, SPELL_WAITING_FOR_RESURRECT, true); -} - -void BattleGround::RemovePlayerFromResurrectQueue(uint64 player_guid) -{ - for(std::map >::iterator itr = m_ReviveQueue.begin(); itr != m_ReviveQueue.end(); ++itr) - { - for(std::vector::iterator itr2 =(itr->second).begin(); itr2 != (itr->second).end(); ++itr2) - { - if (*itr2 == player_guid) - { - (itr->second).erase(itr2); - - Player *plr = objmgr.GetPlayer(player_guid); - if (!plr) - return; - - plr->RemoveAurasDueToSpell(SPELL_WAITING_FOR_RESURRECT); - - return; - } - } - } -} - bool BattleGround::AddObject(uint32 type, uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime) { Map * map = MapManager::Instance().FindMap(GetMapId(),GetInstanceID()); diff --git a/src/game/BattleGround.h b/src/game/BattleGround.h index 0725a8f43..ebbc113c3 100644 --- a/src/game/BattleGround.h +++ b/src/game/BattleGround.h @@ -83,16 +83,12 @@ enum BattleGroundMarksCount enum BattleGroundSpells { SPELL_WAITING_FOR_RESURRECT = 2584, // Waiting to Resurrect - SPELL_SPIRIT_HEAL_CHANNEL = 22011, // Spirit Heal Channel - SPELL_SPIRIT_HEAL = 22012, // Spirit Heal - SPELL_RESURRECTION_VISUAL = 24171, // Resurrection Impact Visual SPELL_ARENA_PREPARATION = 32727, // use this one, 32728 not correct SPELL_ALLIANCE_GOLD_FLAG = 32724, SPELL_ALLIANCE_GREEN_FLAG = 32725, SPELL_HORDE_GOLD_FLAG = 35774, SPELL_HORDE_GREEN_FLAG = 35775, SPELL_PREPARATION = 44521, // Preparation - SPELL_SPIRIT_HEAL_MANA = 44535, // Spirit Heal SPELL_RECENTLY_DROPPED_FLAG = 42792, // Recently Dropped Flag SPELL_AURA_PLAYER_INACTIVE = 43681 // Inactive }; @@ -321,7 +317,6 @@ class BattleGround uint32 GetClientInstanceID() const { return m_ClientInstanceID; } uint32 GetStartTime() const { return m_StartTime; } uint32 GetEndTime() const { return m_EndTime; } - uint32 GetLastResurrectTime() const { return m_LastResurrectTime; } uint32 GetMaxPlayers() const { return m_MaxPlayers; } uint32 GetMinPlayers() const { return m_MinPlayers; } @@ -352,7 +347,6 @@ class BattleGround void SetClientInstanceID(uint32 InstanceID) { m_ClientInstanceID = InstanceID; } void SetStartTime(uint32 Time) { m_StartTime = Time; } void SetEndTime(uint32 Time) { m_EndTime = Time; } - void SetLastResurrectTime(uint32 Time) { m_LastResurrectTime = Time; } void SetMaxPlayers(uint32 MaxPlayers) { m_MaxPlayers = MaxPlayers; } void SetMinPlayers(uint32 MinPlayers) { m_MinPlayers = MinPlayers; } void SetLevelRange(uint32 min, uint32 max) { m_LevelMin = min; m_LevelMax = max; } @@ -395,11 +389,6 @@ class BattleGround BattleGroundScoreMap::const_iterator GetPlayerScoresEnd() const { return m_PlayerScores.end(); } uint32 GetPlayerScoresSize() const { return m_PlayerScores.size(); } - uint32 GetReviveQueueSize() const { return m_ReviveQueue.size(); } - - void AddPlayerToResurrectQueue(uint64 npc_guid, uint64 player_guid); - void RemovePlayerFromResurrectQueue(uint64 player_guid); - void StartBattleGround(); /* Location */ @@ -567,8 +556,6 @@ class BattleGround /* Player lists, those need to be accessible by inherited classes */ BattleGroundPlayerMap m_Players; - // Spirit Guide guid + Player list GUIDS - std::map > m_ReviveQueue; /* these are important variables used for starting messages @@ -589,7 +576,6 @@ class BattleGround uint32 m_StartTime; bool m_ArenaBuffSpawned; // to cache if arenabuff event is started (cause bool is faster than checking IsActiveEvent) int32 m_EndTime; // it is set to 120000 when bg is ending and it decreases itself - uint32 m_LastResurrectTime; BGQueueIdBasedOnLevel m_QueueId; uint8 m_ArenaType; // 2=2v2, 3=3v3, 5=5v5 bool m_InBGFreeSlotQueue; // used to make sure that BG is only once inserted into the BattleGroundMgr.BGFreeSlotQueue[bgTypeId] deque diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp index 9a080c53f..dd01b66f3 100644 --- a/src/game/BattleGroundHandler.cpp +++ b/src/game/BattleGroundHandler.cpp @@ -31,6 +31,7 @@ #include "BattleGround.h" #include "ArenaTeam.h" #include "Language.h" +#include "ScriptCalls.h" void WorldSession::HandleBattlemasterHelloOpcode( WorldPacket & recv_data ) { @@ -583,7 +584,7 @@ void WorldSession::HandleAreaSpiritHealerQueryOpcode( WorldPacket & recv_data ) if(!unit->isSpiritService()) // it's not spirit service return; - sBattleGroundMgr.SendAreaSpiritHealerQueryOpcode(_player, bg, guid); + unit->SendAreaSpiritHealerQueryOpcode(GetPlayer()); } void WorldSession::HandleAreaSpiritHealerQueueOpcode( WorldPacket & recv_data ) @@ -604,7 +605,7 @@ void WorldSession::HandleAreaSpiritHealerQueueOpcode( WorldPacket & recv_data ) if(!unit->isSpiritService()) // it's not spirit service return; - bg->AddPlayerToResurrectQueue(guid, _player->GetGUID()); + Script->GossipHello(GetPlayer(), unit); } void WorldSession::HandleBattlemasterJoinArena( WorldPacket & recv_data ) diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index fd9d677e6..3d3dfc501 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -1890,16 +1890,6 @@ void BattleGroundMgr::SendToBattleGround(Player *pl, uint32 instanceId, BattleGr } } -void BattleGroundMgr::SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *bg, const uint64& guid) -{ - WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 12); - uint32 time_ = 30000 - bg->GetLastResurrectTime(); // resurrect every 30 seconds - if (time_ == uint32(-1)) - time_ = 0; - data << guid << time_; - pl->GetSession()->SendPacket(&data); -} - bool BattleGroundMgr::IsArenaType(BattleGroundTypeId bgTypeId) { return ( bgTypeId == BATTLEGROUND_AA || diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h index fb9078d69..45199d8b6 100644 --- a/src/game/BattleGroundMgr.h +++ b/src/game/BattleGroundMgr.h @@ -193,7 +193,6 @@ class BattleGroundMgr void BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg); void BuildBattleGroundStatusPacket(WorldPacket *data, BattleGround *bg, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype); void BuildPlaySoundPacket(WorldPacket *data, uint32 soundid); - void SendAreaSpiritHealerQueryOpcode(Player *pl, BattleGround *bg, const uint64& guid); /* Battlegrounds */ BattleGround* GetBattleGroundThroughClientInstance(uint32 instanceId, BattleGroundTypeId bgTypeId); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index cef57906e..7e72e2b4d 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -37,6 +37,7 @@ #include "WaypointMovementGenerator.h" #include "InstanceData.h" #include "BattleGroundMgr.h" +#include "Spell.h" #include "Util.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" @@ -2325,3 +2326,13 @@ void Creature::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transi //float orientation = (float)atan2((double)dy, (double)dx); SendMonsterMove(x, y, z, 0, GetMonsterMoveFlags(), transitTime, player); } + +void Creature::SendAreaSpiritHealerQueryOpcode(Player *pl) +{ + uint32 next_resurrect = 0; + if (Spell* pcurSpell = GetCurrentSpell(CURRENT_CHANNELED_SPELL)) + next_resurrect = pcurSpell->GetCastedTime(); + WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 8 + 4); + data << GetGUID() << next_resurrect; + pl->SendDirectMessage(&data); +} diff --git a/src/game/Creature.h b/src/game/Creature.h index ede6c61dc..617b1fcbc 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -684,6 +684,8 @@ class MANGOS_DLL_SPEC Creature : public Unit bool isActiveObject() const { return m_isActiveObject || HasAuraType(SPELL_AURA_BIND_SIGHT) || HasAuraType(SPELL_AURA_FAR_SIGHT); } void SetActiveObjectState(bool on); + void SendAreaSpiritHealerQueryOpcode(Player *pl); + protected: bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL); bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL); diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index fd15a1d4e..8bb0be9b9 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -32,8 +32,6 @@ #include "ObjectAccessor.h" #include "Creature.h" #include "Pet.h" -#include "BattleGroundMgr.h" -#include "BattleGround.h" #include "Guild.h" void WorldSession::HandleTabardVendorActivateOpcode( WorldPacket & recv_data ) @@ -274,17 +272,8 @@ void WorldSession::HandleGossipHelloOpcode( WorldPacket & recv_data ) unit->StopMoving(); } - // If spiritguide, no need for gossip menu, just put player into resurrect queue if (unit->isSpiritGuide()) - { - BattleGround *bg = _player->GetBattleGround(); - if(bg) - { - bg->AddPlayerToResurrectQueue(unit->GetGUID(), _player->GetGUID()); - sBattleGroundMgr.SendAreaSpiritHealerQueryOpcode(_player, bg, unit->GetGUID()); - return; - } - } + unit->SendAreaSpiritHealerQueryOpcode(_player); if(!Script->GossipHello( _player, unit )) { diff --git a/src/game/Spell.h b/src/game/Spell.h index ca60136f7..4dbccc58a 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -408,6 +408,7 @@ class Spell SpellCastTargets m_targets; int32 GetCastTime() const { return m_casttime; } + uint32 GetCastedTime() { return m_timer; } bool IsAutoRepeat() const { return m_autoRepeat; } void SetAutoRepeat(bool rep) { m_autoRepeat = rep; } void ReSetTimer() { m_timer = m_casttime > 0 ? m_casttime : 0; } diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index aec5b58d7..4267fa26e 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2269,14 +2269,6 @@ void Aura::HandleAuraDummy(bool apply, bool Real) switch(GetId()) { - case 2584: // Waiting to Resurrect - { - // Waiting to resurrect spell cancel, we must remove player from resurrect queue - if(m_target->GetTypeId() == TYPEID_PLAYER) - if(BattleGround *bg = ((Player*)m_target)->GetBattleGround()) - bg->RemovePlayerFromResurrectQueue(m_target->GetGUID()); - return; - } case 36730: // Flame Strike { m_target->CastSpell(m_target, 36731, true, NULL, this); diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 9cc895c41..c8dcaa97c 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -6761,25 +6761,20 @@ void Spell::EffectSummonDemon(uint32 i) } } -/* There is currently no need for this effect. We handle it in BattleGround.cpp - If we would handle the resurrection here, the spiritguide would instantly disappear as the - player revives, and so we wouldn't see the spirit heal visual effect on the npc. - This is why we use a half sec delay between the visual effect and the resurrection itself */ void Spell::EffectSpiritHeal(uint32 /*i*/) { - /* - if(!unitTarget || unitTarget->isAlive()) + // TODO player can't see the heal-animation - he should respawn some ticks later + if (!unitTarget || unitTarget->isAlive()) return; - if(unitTarget->GetTypeId() != TYPEID_PLAYER) + if (unitTarget->GetTypeId() != TYPEID_PLAYER) return; - if(!unitTarget->IsInWorld()) + if (!unitTarget->IsInWorld()) + return; + if (m_spellInfo->Id == 22012 && !unitTarget->HasAura(2584)) return; - //m_spellInfo->EffectBasePoints[i]; == 99 (percent?) - //((Player*)unitTarget)->setResurrect(m_caster->GetGUID(), unitTarget->GetPositionX(), unitTarget->GetPositionY(), unitTarget->GetPositionZ(), unitTarget->GetMaxHealth(), unitTarget->GetMaxPower(POWER_MANA)); ((Player*)unitTarget)->ResurrectPlayer(1.0f); ((Player*)unitTarget)->SpawnCorpseBones(); - */ } // remove insignia spell effect diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 93ff03c0a..fa972b32f 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8552" + #define REVISION_NR "8553" #endif // __REVISION_NR_H__