/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef BATTLEFIELD_WG_ #define BATTLEFIELD_WG_ #include "Battlefield.h" namespace WorldPackets { namespace WorldState { class InitWorldStates; } } class Group; class BattlefieldWG; class WintergraspCapturePoint; struct BfWGGameObjectBuilding; struct WintergraspWorkshop; struct StaticWintergraspTowerInfo; struct StaticWintergraspWorkshopInfo; struct WintergraspObjectPositionData; typedef std::vector GameObjectBuildingVect; typedef std::vector WorkshopVect; enum WintergraspSpells { // Wartime auras SPELL_RECRUIT = 37795, SPELL_CORPORAL = 33280, SPELL_LIEUTENANT = 55629, SPELL_TENACITY = 58549, SPELL_TENACITY_VEHICLE = 59911, SPELL_TOWER_CONTROL = 62064, SPELL_SPIRITUAL_IMMUNITY = 58729, SPELL_GREAT_HONOR = 58555, SPELL_GREATER_HONOR = 58556, SPELL_GREATEST_HONOR = 58557, SPELL_ALLIANCE_FLAG = 14268, SPELL_HORDE_FLAG = 14267, SPELL_GRAB_PASSENGER = 61178, // Reward spells SPELL_VICTORY_REWARD = 56902, SPELL_DEFEAT_REWARD = 58494, SPELL_DAMAGED_TOWER = 59135, SPELL_DESTROYED_TOWER = 59136, SPELL_DAMAGED_BUILDING = 59201, SPELL_INTACT_BUILDING = 59203, SPELL_TELEPORT_BRIDGE = 59096, SPELL_TELEPORT_FORTRESS = 60035, SPELL_TELEPORT_DALARAN = 53360, SPELL_VICTORY_AURA = 60044, // Other spells SPELL_WINTERGRASP_WATER = 36444, SPELL_ESSENCE_OF_WINTERGRASP = 58045, SPELL_WINTERGRASP_RESTRICTED_FLIGHT_AREA = 58730, // Phasing spells SPELL_HORDE_CONTROLS_FACTORY_PHASE_SHIFT = 56618, // ADDS PHASE 16 SPELL_ALLIANCE_CONTROLS_FACTORY_PHASE_SHIFT = 56617, // ADDS PHASE 32 SPELL_HORDE_CONTROL_PHASE_SHIFT = 55773, // ADDS PHASE 64 SPELL_ALLIANCE_CONTROL_PHASE_SHIFT = 55774 // ADDS PHASE 128 }; enum WintergraspData { BATTLEFIELD_WG_DATA_DAMAGED_TOWER_DEF, BATTLEFIELD_WG_DATA_BROKEN_TOWER_DEF, BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT, BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT, BATTLEFIELD_WG_DATA_MAX_VEHICLE_A, BATTLEFIELD_WG_DATA_MAX_VEHICLE_H, BATTLEFIELD_WG_DATA_VEHICLE_A, BATTLEFIELD_WG_DATA_VEHICLE_H, BATTLEFIELD_WG_DATA_WON_A, BATTLEFIELD_WG_DATA_DEF_A, BATTLEFIELD_WG_DATA_WON_H, BATTLEFIELD_WG_DATA_DEF_H, BATTLEFIELD_WG_DATA_MAX, BATTLEFIELD_WG_MAPID = 571 // Northrend }; enum WintergraspAchievements { ACHIEVEMENTS_WIN_WG = 1717, ACHIEVEMENTS_WIN_WG_100 = 1718, /// @todo: Has to be implemented ACHIEVEMENTS_WG_GNOMESLAUGHTER = 1723, /// @todo: Has to be implemented ACHIEVEMENTS_WG_TOWER_DESTROY = 1727, ACHIEVEMENTS_DESTRUCTION_DERBY_A = 1737, /// @todo: Has to be implemented ACHIEVEMENTS_WG_TOWER_CANNON_KILL = 1751, /// @todo: Has to be implemented ACHIEVEMENTS_WG_MASTER_A = 1752, /// @todo: Has to be implemented ACHIEVEMENTS_WIN_WG_TIMER_10 = 1755, ACHIEVEMENTS_STONE_KEEPER_50 = 2085, /// @todo: Has to be implemented ACHIEVEMENTS_STONE_KEEPER_100 = 2086, /// @todo: Has to be implemented ACHIEVEMENTS_STONE_KEEPER_250 = 2087, /// @todo: Has to be implemented ACHIEVEMENTS_STONE_KEEPER_500 = 2088, /// @todo: Has to be implemented ACHIEVEMENTS_STONE_KEEPER_1000 = 2089, /// @todo: Has to be implemented ACHIEVEMENTS_WG_RANGER = 2199, /// @todo: Has to be implemented ACHIEVEMENTS_DESTRUCTION_DERBY_H = 2476, /// @todo: Has to be implemented ACHIEVEMENTS_WG_MASTER_H = 2776 /// @todo: Has to be implemented }; enum WintergraspQuests { QUEST_VICTORY_WINTERGRASP_A = 13181, QUEST_VICTORY_WINTERGRASP_H = 13183, QUEST_CREDIT_TOWERS_DESTROYED = 35074, QUEST_CREDIT_DEFEND_SIEGE = 31284 }; /*######################### *####### Graveyards ###### *#########################*/ class BfGraveyardWG : public BfGraveyard { public: BfGraveyardWG(BattlefieldWG* Bf); void SetTextId(uint32 textId) { m_GossipTextId = textId; } uint32 GetTextId() const { return m_GossipTextId; } protected: uint32 m_GossipTextId; }; enum WGGraveyardId { BATTLEFIELD_WG_GY_WORKSHOP_NE, BATTLEFIELD_WG_GY_WORKSHOP_NW, BATTLEFIELD_WG_GY_WORKSHOP_SE, BATTLEFIELD_WG_GY_WORKSHOP_SW, BATTLEFIELD_WG_GY_KEEP, BATTLEFIELD_WG_GY_HORDE, BATTLEFIELD_WG_GY_ALLIANCE, BATTLEFIELD_WG_GRAVEYARD_MAX }; enum WGGossipText { BATTLEFIELD_WG_GOSSIPTEXT_GY_NE = 20071, BATTLEFIELD_WG_GOSSIPTEXT_GY_NW = 20072, BATTLEFIELD_WG_GOSSIPTEXT_GY_SE = 20074, BATTLEFIELD_WG_GOSSIPTEXT_GY_SW = 20073, BATTLEFIELD_WG_GOSSIPTEXT_GY_KEEP = 20070, BATTLEFIELD_WG_GOSSIPTEXT_GY_HORDE = 20075, BATTLEFIELD_WG_GOSSIPTEXT_GY_ALLIANCE = 20076 }; enum WintergraspNpcs { BATTLEFIELD_WG_NPC_GUARD_H = 30739, BATTLEFIELD_WG_NPC_GUARD_A = 30740, BATTLEFIELD_WG_NPC_STALKER = 15214, NPC_TAUNKA_SPIRIT_GUIDE = 31841, // Horde spirit guide for Wintergrasp NPC_DWARVEN_SPIRIT_GUIDE = 31842, // Alliance spirit guide for Wintergrasp NPC_WINTERGRASP_SIEGE_ENGINE_ALLIANCE = 28312, NPC_WINTERGRASP_SIEGE_ENGINE_HORDE = 32627, NPC_WINTERGRASP_CATAPULT = 27881, NPC_WINTERGRASP_DEMOLISHER = 28094, NPC_WINTERGRASP_TOWER_CANNON = 28366 }; /* ######################### * * WintergraspCapturePoint * * ######################### */ class WintergraspCapturePoint : public BfCapturePoint { public: WintergraspCapturePoint(BattlefieldWG* battlefield, TeamId teamInControl); void LinkToWorkshop(WintergraspWorkshop* workshop) { m_Workshop = workshop; } void ChangeTeam(TeamId oldteam) override; TeamId GetTeam() const { return m_team; } protected: WintergraspWorkshop* m_Workshop; }; /* ######################### * * WinterGrasp Battlefield * * ######################### */ class BattlefieldWG : public Battlefield { public: ~BattlefieldWG(); /** * \brief Called when the battle start * - Spawn relic and turret * - Rebuild tower and wall * - Invite player to war */ void OnBattleStart() override; /** * \brief Called when battle end * - Remove relic and turret * - Change banner/npc in keep if it needed * - Saving battlestate * - Reward honor/mark to player * - Remove vehicle * \param endByTimer : true if battle ended when timer is at 00:00, false if battle ended by clicking on relic */ void OnBattleEnd(bool endByTimer) override; /** * \brief Called when grouping starts (15 minutes before battlestart) * - Invite all player in zone to join queue */ void OnStartGrouping() override; /** * \brief Called when player accept invite to join battle * - Update aura * - Teleport if it needed * - Update worldstate * - Update tenacity * \param player: Player who accepted invite */ void OnPlayerJoinWar(Player* player) override; /** * \brief Called when player left the battle * - Update player aura * \param player : Player who left the battle */ void OnPlayerLeaveWar(Player* player) override; /** * \brief Called when player left the WG zone * \param player : Player who left the zone */ void OnPlayerLeaveZone(Player* player) override; /** * \brief Called when player enters in WG zone * - Update aura * - Update worldstate * \param player : Player who enters the zone */ void OnPlayerEnterZone(Player* player) override; /** * \brief Called for update battlefield data * - Save battle timer in database every minutes * - Update imunity aura from graveyard * \param diff : time elapsed since the last call (in ms) */ bool Update(uint32 diff) override; /** * \brief Called when a creature is created * - Update vehicle count */ void OnCreatureCreate(Creature* creature) override; /** * \brief Called when a creature is removed * - Update vehicle count */ void OnCreatureRemove(Creature* creature) override; /** * \brief Called when a gameobject is created */ void OnGameObjectCreate(GameObject* go) override; /** * \brief Called when a wall/tower is broken * - Update quest */ void BrokenWallOrTower(TeamId team, BfWGGameObjectBuilding* building); /** * \brief Called when a tower is damaged * - Update tower count (for reward calcul) */ void UpdateDamagedTowerCount(TeamId team); /** * \brief Called when tower is broken * - Update tower buff * - check if three south tower is down for remove 10 minutes to wg */ void UpdatedDestroyedTowerCount(TeamId team); void DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 incrementNumber = 1) override; void RemoveAurasFromPlayer(Player* player); /** * \brief Called when battlefield is setup, at server start */ bool SetupBattlefield() override; /// Return pointer to relic object GameObject* GetRelic() { return GetGameObject(m_titansRelicGUID); } /// Define relic object void SetRelic(ObjectGuid relicGUID) { m_titansRelicGUID = relicGUID; } /// Check if players can interact with the relic (Only if the last door has been broken) bool CanInteractWithRelic() { return m_isRelicInteractible; } /// Define if player can interact with the relic void SetRelicInteractible(bool allow) { m_isRelicInteractible = allow; } void UpdateVehicleCountWG(); void UpdateCounterVehicle(bool init); void SendInitWorldStatesToAll() override; void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet) override; void HandleKill(Player* killer, Unit* victim) override; void OnUnitDeath(Unit* unit) override; void HandlePromotion(Player* killer, Unit* killed); void PromotePlayer(Player* killer); void UpdateTenacity(); void ProcessEvent(WorldObject* obj, uint32 eventId) override; bool FindAndRemoveVehicleFromList(Unit* vehicle); // returns the graveyardId in the specified area. uint8 GetSpiritGraveyardId(uint32 areaId) const; uint32 GetData(uint32 data) const override; protected: bool m_isRelicInteractible; WorkshopVect Workshops; GuidVector DefenderPortalList[PVP_TEAMS_COUNT]; GameObjectBuildingVect BuildingsInZone; GuidUnorderedSet m_vehicles[PVP_TEAMS_COUNT]; GuidVector CanonList; TeamId m_tenacityTeam; uint32 m_tenacityStack; uint32 m_saveTimer; ObjectGuid m_titansRelicGUID; }; enum WintergraspGameObjectBuildingType { BATTLEFIELD_WG_OBJECTTYPE_DOOR, BATTLEFIELD_WG_OBJECTTYPE_TITANRELIC, BATTLEFIELD_WG_OBJECTTYPE_WALL, BATTLEFIELD_WG_OBJECTTYPE_DOOR_LAST, BATTLEFIELD_WG_OBJECTTYPE_KEEP_TOWER, BATTLEFIELD_WG_OBJECTTYPE_TOWER }; enum WintergraspGameObjectState { BATTLEFIELD_WG_OBJECTSTATE_NONE, BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_INTACT, BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_DAMAGE, BATTLEFIELD_WG_OBJECTSTATE_NEUTRAL_DESTROY, BATTLEFIELD_WG_OBJECTSTATE_HORDE_INTACT, BATTLEFIELD_WG_OBJECTSTATE_HORDE_DAMAGE, BATTLEFIELD_WG_OBJECTSTATE_HORDE_DESTROY, BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT, BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DAMAGE, BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DESTROY }; enum WintergraspTowerIds { BATTLEFIELD_WG_TOWER_FORTRESS_NW, BATTLEFIELD_WG_TOWER_FORTRESS_SW, BATTLEFIELD_WG_TOWER_FORTRESS_SE, BATTLEFIELD_WG_TOWER_FORTRESS_NE, BATTLEFIELD_WG_TOWER_SHADOWSIGHT, BATTLEFIELD_WG_TOWER_WINTER_S_EDGE, BATTLEFIELD_WG_TOWER_FLAMEWATCH }; enum WintergraspWorkshopIds { BATTLEFIELD_WG_WORKSHOP_SE, BATTLEFIELD_WG_WORKSHOP_SW, BATTLEFIELD_WG_WORKSHOP_NE, BATTLEFIELD_WG_WORKSHOP_NW, BATTLEFIELD_WG_WORKSHOP_KEEP_WEST, BATTLEFIELD_WG_WORKSHOP_KEEP_EAST }; enum WintergraspTeamControl { BATTLEFIELD_WG_TEAM_ALLIANCE, BATTLEFIELD_WG_TEAM_HORDE, BATTLEFIELD_WG_TEAM_NEUTRAL }; enum WintergraspText { // Invisible Stalker BATTLEFIELD_WG_TEXT_SOUTHERN_TOWER_DAMAGE = 1, BATTLEFIELD_WG_TEXT_SOUTHERN_TOWER_DESTROY = 2, BATTLEFIELD_WG_TEXT_EASTERN_TOWER_DAMAGE = 3, BATTLEFIELD_WG_TEXT_EASTERN_TOWER_DESTROY = 4, BATTLEFIELD_WG_TEXT_WESTERN_TOWER_DAMAGE = 5, BATTLEFIELD_WG_TEXT_WESTERN_TOWER_DESTROY = 6, BATTLEFIELD_WG_TEXT_NW_KEEPTOWER_DAMAGE = 7, BATTLEFIELD_WG_TEXT_NW_KEEPTOWER_DESTROY = 8, BATTLEFIELD_WG_TEXT_SE_KEEPTOWER_DAMAGE = 9, BATTLEFIELD_WG_TEXT_SE_KEEPTOWER_DESTROY = 10, BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_ATTACK_ALLIANCE = 11, BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_CAPTURE_ALLIANCE = 12, BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_ATTACK_HORDE = 13, BATTLEFIELD_WG_TEXT_BROKEN_TEMPLE_CAPTURE_HORDE = 14, BATTLEFIELD_WG_TEXT_EASTSPARK_ATTACK_ALLIANCE = 15, BATTLEFIELD_WG_TEXT_EASTSPARK_CAPTURE_ALLIANCE = 16, BATTLEFIELD_WG_TEXT_EASTSPARK_ATTACK_HORDE = 17, BATTLEFIELD_WG_TEXT_EASTSPARK_CAPTURE_HORDE = 18, BATTLEFIELD_WG_TEXT_SUNKEN_RING_ATTACK_ALLIANCE = 19, BATTLEFIELD_WG_TEXT_SUNKEN_RING_CAPTURE_ALLIANCE = 20, BATTLEFIELD_WG_TEXT_SUNKEN_RING_ATTACK_HORDE = 21, BATTLEFIELD_WG_TEXT_SUNKEN_RING_CAPTURE_HORDE = 22, BATTLEFIELD_WG_TEXT_WESTSPARK_ATTACK_ALLIANCE = 23, BATTLEFIELD_WG_TEXT_WESTSPARK_CAPTURE_ALLIANCE = 24, BATTLEFIELD_WG_TEXT_WESTSPARK_ATTACK_HORDE = 25, BATTLEFIELD_WG_TEXT_WESTSPARK_CAPTURE_HORDE = 26, BATTLEFIELD_WG_TEXT_START_GROUPING = 27, BATTLEFIELD_WG_TEXT_START_BATTLE = 28, BATTLEFIELD_WG_TEXT_FORTRESS_DEFEND_ALLIANCE = 29, BATTLEFIELD_WG_TEXT_FORTRESS_CAPTURE_ALLIANCE = 30, BATTLEFIELD_WG_TEXT_FORTRESS_DEFEND_HORDE = 31, BATTLEFIELD_WG_TEXT_FORTRESS_CAPTURE_HORDE = 32, BATTLEFIELD_WG_TEXT_NE_KEEPTOWER_DAMAGE = 33, BATTLEFIELD_WG_TEXT_NE_KEEPTOWER_DESTROY = 34, BATTLEFIELD_WG_TEXT_SW_KEEPTOWER_DAMAGE = 35, BATTLEFIELD_WG_TEXT_SW_KEEPTOWER_DESTROY = 36, BATTLEFIELD_WG_TEXT_RANK_CORPORAL = 37, BATTLEFIELD_WG_TEXT_RANK_FIRST_LIEUTENANT = 38 }; enum WintergraspGameObject { GO_WINTERGRASP_FACTORY_BANNER_NE = 190475, GO_WINTERGRASP_FACTORY_BANNER_NW = 190487, GO_WINTERGRASP_FACTORY_BANNER_SE = 194959, GO_WINTERGRASP_FACTORY_BANNER_SW = 194962, GO_WINTERGRASP_TITAN_S_RELIC = 192829, GO_WINTERGRASP_FORTRESS_TOWER_1 = 190221, GO_WINTERGRASP_FORTRESS_TOWER_2 = 190373, GO_WINTERGRASP_FORTRESS_TOWER_3 = 190377, GO_WINTERGRASP_FORTRESS_TOWER_4 = 190378, GO_WINTERGRASP_SHADOWSIGHT_TOWER = 190356, GO_WINTERGRASP_WINTER_S_EDGE_TOWER = 190357, GO_WINTERGRASP_FLAMEWATCH_TOWER = 190358, GO_WINTERGRASP_FORTRESS_GATE = 190375, GO_WINTERGRASP_VAULT_GATE = 191810, GO_WINTERGRASP_KEEP_COLLISION_WALL = 194323 }; // ******************************************************************** // * Structs using for Building, Graveyard, Workshop * // ******************************************************************** // Structure for different buildings that can be destroyed during battle struct BfWGGameObjectBuilding { private: // WG object BattlefieldWG* _wg; // Linked gameobject ObjectGuid _buildGUID; // the team that controls this point TeamId _teamControl; WintergraspGameObjectBuildingType _type; uint32 _worldState; WintergraspGameObjectState _state; StaticWintergraspTowerInfo const* _staticTowerInfo; // GameObject associations GuidVector m_GameObjectList[PVP_TEAMS_COUNT]; // Creature associations GuidVector m_CreatureBottomList[PVP_TEAMS_COUNT]; GuidVector m_CreatureTopList[PVP_TEAMS_COUNT]; GuidVector m_TowerCannonBottomList; GuidVector m_TurretTopList; public: BfWGGameObjectBuilding(BattlefieldWG* wg, WintergraspGameObjectBuildingType type, uint32 worldState); void Init(GameObject* go); ObjectGuid const& GetGUID() const { return _buildGUID; } void Rebuild(); void RebuildGate(); // Called when associated gameobject is damaged void Damaged(); // Called when associated gameobject is destroyed void Destroyed(); void UpdateCreatureAndGo(); void UpdateTurretAttack(bool disable); void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet); void Save(); }; // Structure for the 6 workshop struct WintergraspWorkshop { private: BattlefieldWG* _wg; // Pointer to wintergrasp ObjectGuid _buildGUID; WintergraspGameObjectState _state; // For worldstate TeamId _teamControl; // Team witch control the workshop StaticWintergraspWorkshopInfo const* _staticInfo; public: WintergraspWorkshop(BattlefieldWG* wg, uint8 type); uint8 GetId() const; TeamId GetTeamControl() const { return _teamControl; } // Called on change faction in CapturePoint class void GiveControlTo(TeamId teamId, bool init = false); void UpdateGraveyardAndWorkshop(); void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates& packet); void Save(); }; #endif