diff options
author | Manuel Carrasco <manue.l@live.com.ar> | 2012-03-01 02:03:52 -0300 |
---|---|---|
committer | Kandera <KanderaDev@gmail.com> | 2012-08-20 13:36:37 -0400 |
commit | 3478f3e7b791c57e98be1496c3c96e97457c8e88 (patch) | |
tree | 4717234c9c8ca4c5721b75e37e9ce6742fa43a6f /src | |
parent | 82b49c7b84c5b6e8a14eceed1ee54d1a71d396c0 (diff) |
BF/Wintergrasp: Now graveyards use db spawned spirits.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlefield/Battlefield.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Battlefield/Battlefield.h | 18 | ||||
-rw-r--r-- | src/server/game/Battlefield/Zones/BattlefieldWG.cpp | 54 | ||||
-rw-r--r-- | src/server/game/Battlefield/Zones/BattlefieldWG.h | 16 |
4 files changed, 96 insertions, 29 deletions
diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index dab41b5c4b6..2e9e4607eec 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -717,30 +717,22 @@ BfGraveYard::BfGraveYard(Battlefield *Bf) m_ResurrectQueue.clear(); } -void BfGraveYard::Init(uint32 horde_entry, uint32 alliance_entry, float x, float y, float z, float o, TeamId startcontrol, uint32 gy) +void BfGraveYard::Initialize(TeamId startcontrol, uint32 gy) { m_ControlTeam = startcontrol; - if (Creature* cre = m_Bf->SpawnCreature(horde_entry, x, y, z, o, TEAM_HORDE)) - { - m_SpiritGuide[TEAM_HORDE] = cre; - m_SpiritGuide[TEAM_HORDE]->SetReactState(REACT_PASSIVE); - if (m_ControlTeam == TEAM_ALLIANCE) - m_SpiritGuide[TEAM_HORDE]->SetVisible(false); - } - else - sLog->outError("BfGraveYard::Init can't spawn horde spiritguide %u", horde_entry); + m_GraveyardId = gy; +} - if (Creature* cre = m_Bf->SpawnCreature(alliance_entry, x, y, z, o, TEAM_ALLIANCE)) +void BfGraveYard::SetSpirit(Creature* spirit, TeamId team) +{ + if (!spirit) { - m_SpiritGuide[TEAM_ALLIANCE] = cre; - m_SpiritGuide[TEAM_ALLIANCE]->SetReactState(REACT_PASSIVE); - if (m_ControlTeam == TEAM_HORDE) - m_SpiritGuide[TEAM_ALLIANCE]->SetVisible(false); + sLog->outError("<Error - Wintergrasp>: Invalid Spirit."); + return; } - else - sLog->outError("BfGraveYard::Init can't spawn alliance spiritguide %u", alliance_entry); - m_GraveyardId = gy; + m_SpiritGuide[team] = spirit->GetGUID(); + spirit->SetReactState(REACT_PASSIVE); } float BfGraveYard::GetDistance(Player *plr) @@ -782,8 +774,8 @@ void BfGraveYard::Resurrect() // Check player isinworld and player is on good graveyard if (plr->IsInWorld()) - if (m_SpiritGuide[m_ControlTeam]) - m_SpiritGuide[m_ControlTeam]->CastSpell(m_SpiritGuide[m_ControlTeam], SPELL_SPIRIT_HEAL, true); + if (Unit* spirit = sObjectAccessor->FindUnit(m_SpiritGuide[m_ControlTeam])) + spirit->CastSpell(spirit, SPELL_SPIRIT_HEAL, true); // Resurect player plr->CastSpell(plr, SPELL_RESURRECTION_VISUAL, true); @@ -801,10 +793,11 @@ void BfGraveYard::Resurrect() void BfGraveYard::ChangeControl(TeamId team) { // Guide switching - if (m_SpiritGuide[1 - team]) + // Note: Visiblity changes are made by phasing + /*if (m_SpiritGuide[1 - team]) m_SpiritGuide[1 - team]->SetVisible(false); if (m_SpiritGuide[team]) - m_SpiritGuide[team]->SetVisible(true); + m_SpiritGuide[team]->SetVisible(true);*/ m_ControlTeam = team; // Teleport to other graveyard, player witch were on this graveyard diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index 7617538285f..77c9aa42c5b 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -145,14 +145,26 @@ public: // use for found the nearest graveyard float GetDistance(Player * plr); - void Init(uint32 horde_entry, uint32 alliance_entry, float x, float y, float z, float o, TeamId startcontrol, uint32 gy); + void Initialize(TeamId startcontrol, uint32 gy); + void SetSpirit(Creature* spirit, TeamId team); void AddPlayer(uint64 player_guid); void RemovePlayer(uint64 player_guid); void Resurrect(); void RelocateDeadPlayers(); - bool HasNpc(uint64 guid) { return (m_SpiritGuide[0]->GetGUID() == guid || m_SpiritGuide[1]->GetGUID() == guid); } + bool HasNpc(uint64 guid) + { + // npcs could not be loaded in the map yet. + if (!m_SpiritGuide[0] || !m_SpiritGuide[1]) + return false; + + if (!sObjectAccessor->FindUnit(m_SpiritGuide[0]) || + !sObjectAccessor->FindUnit(m_SpiritGuide[1])) + return false; + + return (m_SpiritGuide[0] == guid || m_SpiritGuide[1] == guid); + } bool HasPlayer(uint64 guid) { return m_ResurrectQueue.find(guid) != m_ResurrectQueue.end(); } uint32 GetGraveYardId() { return m_GraveyardId; } @@ -160,7 +172,7 @@ protected: TeamId m_ControlTeam; uint32 m_GraveyardId; - Creature *m_SpiritGuide[2]; + uint64 m_SpiritGuide[2]; GuidSet m_ResurrectQueue; Battlefield *m_Bf; }; diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index cc4b4711b62..fdca7c0c520 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -88,10 +88,13 @@ bool BattlefieldWG::SetupBattlefield() for (uint8 i = 0; i < BATTLEFIELD_WG_GY_MAX; i++) { BfGraveYardWG *gy = new BfGraveYardWG(this); - if (WGGraveYard[i].startcontrol == TEAM_NEUTRAL) // When between games, the graveyard is controlled by the defending team - gy->Init(NPC_TAUNKA_SPIRIT_GUIDE, NPC_DWARVEN_SPIRIT_GUIDE, WGGraveYard[i].x, WGGraveYard[i].y, WGGraveYard[i].z, WGGraveYard[i].o, m_DefenderTeam, WGGraveYard[i].gyid); + + // When between games, the graveyard is controlled by the defending team + if (WGGraveYard[i].startcontrol == TEAM_NEUTRAL) + gy->Initialize(m_DefenderTeam, WGGraveYard[i].gyid); else - gy->Init(NPC_TAUNKA_SPIRIT_GUIDE, NPC_DWARVEN_SPIRIT_GUIDE, WGGraveYard[i].x, WGGraveYard[i].y, WGGraveYard[i].z, WGGraveYard[i].o, WGGraveYard[i].startcontrol, WGGraveYard[i].gyid); + gy->Initialize(WGGraveYard[i].startcontrol, WGGraveYard[i].gyid); + gy->SetTextId(WGGraveYard[i].textid); m_GraveYardList[i] = gy; } @@ -578,8 +581,53 @@ void BattlefieldWG::OnStartGrouping() SendWarningToAllInZone(BATTLEFIELD_WG_TEXT_WILL_START); } +uint8 BattlefieldWG::GetSpiritGraveyardId(uint32 areaId) +{ + uint8 graveyardId = 0; + + switch (areaId) + { + case AREA_WINTERGRASP_FORTRESS: + return BATTLEFIELD_WG_GY_KEEP; + case AREA_THE_SUNKEN_RING: + return BATTLEFIELD_WG_GY_WORKSHOP_NE; + case AREA_THE_BROKEN_TEMPLATE: + return BATTLEFIELD_WG_GY_WORKSHOP_NW; + case AREA_WESTPARK_WORKSHOP: + return BATTLEFIELD_WG_GY_WORKSHOP_SW; + case AREA_EASTPARK_WORKSHOP: + return BATTLEFIELD_WG_GY_WORKSHOP_SE; + case AREA_WINTERGRASP: + return BATTLEFIELD_WG_GY_ALLIANCE; + case AREA_THE_CHILLED_QUAGMIRE: + return BATTLEFIELD_WG_GY_HORDE; + default: + sLog->outError("<Error - Wintergrasp>: Unexpected Area Id %u", areaId); + break; + } + + return graveyardId; +} + void BattlefieldWG::OnCreatureCreate(Creature *creature) { + // Accessing to db spawned creatures + switch (creature->GetEntry()) + { + // Alliance Spirit + case NPC_DWARVEN_SPIRIT_GUIDE: + // Horde Spirit + case NPC_TAUNKA_SPIRIT_GUIDE: + { + TeamId teamId = creature->GetEntry() == NPC_DWARVEN_SPIRIT_GUIDE ? TEAM_ALLIANCE : TEAM_HORDE; + uint8 graveyardId = GetSpiritGraveyardId(creature->GetAreaId()); + if (m_GraveYardList[graveyardId]) + m_GraveYardList[graveyardId]->SetSpirit(creature, teamId); + } + break; + } + + // untested code - not sure if it is valid. if (IsWarTime()) { switch (creature->GetEntry()) diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h index 71a729f8ba7..d95b1bdab85 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.h +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h @@ -142,6 +142,18 @@ enum eWGWorldStates BATTLEFIELD_WG_WORLD_STATE_DEFENDER = 3802, BATTLEFIELD_WG_WORLD_STATE_ATTACKER = 3803, }; + +enum WGAreaIds +{ + AREA_WINTERGRASP_FORTRESS = 4575, + AREA_THE_SUNKEN_RING = 4538, + AREA_THE_BROKEN_TEMPLATE = 4539, + AREA_WESTPARK_WORKSHOP = 4611, + AREA_EASTPARK_WORKSHOP = 4612, + AREA_WINTERGRASP = 4197, + AREA_THE_CHILLED_QUAGMIRE = 4589, +}; + /*######################### *####### Graveyards ######* #########################*/ @@ -157,7 +169,7 @@ class BfGraveYardWG : public BfGraveYard uint32 m_GossipTextId; }; -enum eWGGraveyardId +enum WGGraveyardId { BATTLEFIELD_WG_GY_WORKSHOP_NE, BATTLEFIELD_WG_GY_WORKSHOP_NW, @@ -414,6 +426,8 @@ class BattlefieldWG : public Battlefield void UpdateTenacity(); void ProcessEvent(WorldObject *obj, uint32 eventId); + // returns the graveyardId in the specified area. + uint8 GetSpiritGraveyardId(uint32 areaId); protected: bool m_CanClickOnOrb; GameObject* m_relic; |