diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlefield/Battlefield.cpp | 48 | ||||
-rw-r--r-- | src/server/game/Battlefield/Battlefield.h | 4 | ||||
-rw-r--r-- | src/server/game/Battlefield/Zones/BattlefieldWG.cpp | 103 | ||||
-rw-r--r-- | src/server/game/Battlefield/Zones/BattlefieldWG.h | 327 |
4 files changed, 203 insertions, 279 deletions
diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index f9c4e4736d4..b0bf1a41669 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -944,40 +944,40 @@ void BfCapturePoint::SendChangePhase() SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct); } -bool BfCapturePoint::SetCapturePointData(uint32 entry, uint32 /*map */ , float x, float y, float z, float o) +bool BfCapturePoint::SetCapturePointData(GameObject* capturePoint) { - sLog->outDebug(LOG_FILTER_BATTLEFIELD, "Creating capture point %u", entry); + ASSERT(capturePoint); + + sLog->outDebug(LOG_FILTER_BATTLEFIELD, "Creating capture point %u", capturePoint->GetEntry()); + + m_capturePoint = capturePoint; // check info existence - GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry); + GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(capturePoint->GetEntry()); if (!goinfo || goinfo->type != GAMEOBJECT_TYPE_CAPTURE_POINT) { - sLog->outError("OutdoorPvP: GO %u is not capture point!", entry); + sLog->outError("OutdoorPvP: GO %u is not capture point!", capturePoint->GetEntry()); return false; } - m_capturePoint = m_Bf->SpawnGameObject(entry, x, y, z, o); - if (m_capturePoint) + + // get the needed values from goinfo + m_maxValue = goinfo->capturePoint.maxTime; + m_maxSpeed = m_maxValue / (goinfo->capturePoint.minTime ? goinfo->capturePoint.minTime : 60); + m_neutralValuePct = goinfo->capturePoint.neutralPercent; + m_minValue = m_maxValue * goinfo->capturePoint.neutralPercent / 100; + m_capturePointEntry = capturePoint->GetEntry(); + if (m_team == TEAM_ALLIANCE) { - // get the needed values from goinfo - m_maxValue = goinfo->capturePoint.maxTime; - m_maxSpeed = m_maxValue / (goinfo->capturePoint.minTime ? goinfo->capturePoint.minTime : 60); - m_neutralValuePct = goinfo->capturePoint.neutralPercent; - m_minValue = m_maxValue * goinfo->capturePoint.neutralPercent / 100; - m_capturePointEntry = entry; - if (m_team == TEAM_ALLIANCE) - { - m_value = m_maxValue; - m_State = BF_CAPTUREPOINT_OBJECTIVESTATE_ALLIANCE; - } - else - { - m_value = -m_maxValue; - m_State = BF_CAPTUREPOINT_OBJECTIVESTATE_HORDE; - } - return true; + m_value = m_maxValue; + m_State = BF_CAPTUREPOINT_OBJECTIVESTATE_ALLIANCE; + } + else + { + m_value = -m_maxValue; + m_State = BF_CAPTUREPOINT_OBJECTIVESTATE_HORDE; } - return false; + return true; } bool BfCapturePoint::DelCapturePoint() diff --git a/src/server/game/Battlefield/Battlefield.h b/src/server/game/Battlefield/Battlefield.h index 77c9aa42c5b..ba34e07a4e4 100644 --- a/src/server/game/Battlefield/Battlefield.h +++ b/src/server/game/Battlefield/Battlefield.h @@ -100,8 +100,8 @@ public: virtual void ChangeTeam(TeamId /*oldTeam */ ) {} virtual void SendChangePhase(); - bool SetCapturePointData(uint32 entry, uint32 map, float x, float y, float z, float o); - GameObject *GetCapturePointGo() { return m_capturePoint; } + bool SetCapturePointData(GameObject* capturePoint); + GameObject* GetCapturePointGo() { return m_capturePoint; } TeamId GetTeamId() {return m_team;} protected: diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp index 3e64894a8ed..4c39f75938c 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.cpp +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.cpp @@ -99,37 +99,21 @@ bool BattlefieldWG::SetupBattlefield() m_GraveYardList[i] = gy; } + // Spawn workshop creatures and gameobjects for (uint8 i = 0; i < WG_MAX_WORKSHOP; i++) { - BfWGWorkShopData *ws = new BfWGWorkShopData(this); // Create new object - // Init:setup variable - ws->Init(WGWorkShopDataBase[i].worldstate, WGWorkShopDataBase[i].type, WGWorkShopDataBase[i].nameid); - // Spawn associate npc on this point (Guard/Engineer) - for (uint8 c = 0; c < WGWorkShopDataBase[i].nbcreature; c++) - ws->AddCreature(WGWorkShopDataBase[i].CreatureData[c]); - - // Spawn associate gameobject on this point (Horde/Alliance flags) - for (uint8 g = 0; g < WGWorkShopDataBase[i].nbgob; g++) - ws->AddGameObject(WGWorkShopDataBase[i].GameObjectData[g]); - - // Create PvPCapturePoint - if (WGWorkShopDataBase[i].type < BATTLEFIELD_WG_WORKSHOP_KEEP_WEST) - { - ws->ChangeControl(GetAttackerTeam(), true); // Update control of this point - // Create Object - BfCapturePointWG *workshop = new BfCapturePointWG(this, GetAttackerTeam()); - // Spawn gameobject associate (see in OnGameObjectCreate, of OutdoorPvP for see association) - workshop->SetCapturePointData(WGWorkShopDataBase[i].CapturePoint.entryh, 571, - WGWorkShopDataBase[i].CapturePoint.x, WGWorkShopDataBase[i].CapturePoint.y, WGWorkShopDataBase[i].CapturePoint.z, 0); - workshop->LinkToWorkShop(ws); // Link our point to the capture point (for faction changement) - AddCapturePoint(workshop); // Add this capture point to list for update this (view in Update() of OutdoorPvP) - } + WGWorkshop* workshop = new WGWorkshop(this, i); + if (i < BATTLEFIELD_WG_WORKSHOP_KEEP_WEST) + workshop->ChangeControl(GetAttackerTeam(), true); else - ws->ChangeControl(GetDefenderTeam(), true); // Update control of this point (Keep workshop= to deffender team) + workshop->ChangeControl(GetDefenderTeam(), true); + + //Note: Capture point is added once the gameobject is created. - WorkShopList.insert(ws); + WorkshopsList.insert(workshop); } + // Spawning npc in keep for (uint8 i = 0; i < WG_MAX_KEEP_NPC; i++) { @@ -285,7 +269,7 @@ void BattlefieldWG::OnBattleStart() m_Data32[BATTLEFIELD_WG_DATA_DAMAGED_TOWER_DEF] = 0; // Update graveyard (in no war time all graveyard is to deffender, in war time, depend of base) - for (WorkShop::const_iterator itr = WorkShopList.begin(); itr != WorkShopList.end(); ++itr) + for (Workshop::const_iterator itr = WorkshopsList.begin(); itr != WorkshopsList.end(); ++itr) { if (*itr) (*itr)->UpdateGraveYardAndWorkshop(); @@ -320,13 +304,13 @@ void BattlefieldWG::UpdateCounterVehicle(bool init) m_Data32[BATTLEFIELD_WG_DATA_MAX_VEHICLE_H] = 0; m_Data32[BATTLEFIELD_WG_DATA_MAX_VEHICLE_A] = 0; - for (WorkShop::const_iterator itr = WorkShopList.begin(); itr != WorkShopList.end(); ++itr) + for (Workshop::const_iterator itr = WorkshopsList.begin(); itr != WorkshopsList.end(); ++itr) { - if (BfWGWorkShopData* workshop = *itr) + if (WGWorkshop* workshop = (*itr)) { - if (workshop->m_TeamControl == TEAM_ALLIANCE) + if (workshop->teamControl == TEAM_ALLIANCE) m_Data32[BATTLEFIELD_WG_DATA_MAX_VEHICLE_A] = m_Data32[BATTLEFIELD_WG_DATA_MAX_VEHICLE_A] + 4; - else if (workshop->m_TeamControl == TEAM_HORDE) + else if (workshop->teamControl == TEAM_HORDE) m_Data32[BATTLEFIELD_WG_DATA_MAX_VEHICLE_H] = m_Data32[BATTLEFIELD_WG_DATA_MAX_VEHICLE_H] + 4; } } @@ -408,7 +392,7 @@ void BattlefieldWG::OnBattleEnd(bool endbytimer) // Saving data for (GameObjectBuilding::const_iterator itr = BuildingsInZone.begin(); itr != BuildingsInZone.end(); ++itr) (*itr)->Save(); - for (WorkShop::const_iterator itr = WorkShopList.begin(); itr != WorkShopList.end(); ++itr) + for (Workshop::const_iterator itr = WorkshopsList.begin(); itr != WorkshopsList.end(); ++itr) (*itr)->Save(); uint32 WinHonor = 0; @@ -702,6 +686,52 @@ void BattlefieldWG::OnCreatureRemove(Creature* creature) } } +void BattlefieldWG::OnGameObjectCreate(GameObject* go) +{ + bool isWorkshop = false; + uint8 workshopId = 0; + + switch (go->GetEntry()) + { + case BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_NE: + isWorkshop = true; + workshopId = BATTLEFIELD_WG_WORKSHOP_NE; + break; + case BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_NW: + isWorkshop = true; + workshopId = BATTLEFIELD_WG_WORKSHOP_NW; + break; + case BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_SE: + isWorkshop = true; + workshopId = BATTLEFIELD_WG_WORKSHOP_SE; + break; + case BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_SW: + isWorkshop = true; + workshopId = BATTLEFIELD_WG_WORKSHOP_SW; + break; + + } + + if (isWorkshop) + { + for (Workshop::const_iterator itr = WorkshopsList.begin(); itr != WorkshopsList.end(); ++itr) + { + if (WGWorkshop* workshop = (*itr)) + { + if (workshop->workshopId == workshopId) + { + BfCapturePointWG* capturePoint = new BfCapturePointWG(this, GetAttackerTeam()); + + capturePoint->SetCapturePointData(go); + capturePoint->LinkToWorkShop(workshop); + AddCapturePoint(capturePoint); + break; + } + } + } + } +} + // Called when player kill a unit in wg zone void BattlefieldWG::HandleKill(Player* killer, Unit* victim) { @@ -924,12 +954,12 @@ uint32 BattlefieldWG::GetData(uint32 data) // Method sending worldsate to player WorldPacket BattlefieldWG::BuildInitWorldStates() { - WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (BuildingsInZone.size() * 8) + (WorkShopList.size() * 8))); + WorldPacket data(SMSG_INIT_WORLD_STATES, (4 + 4 + 4 + 2 + (BuildingsInZone.size() * 8) + (WorkshopsList.size() * 8))); data << uint32(m_MapId); data << uint32(m_ZoneId); data << uint32(0); - data << uint16(4 + 2 + 4 + BuildingsInZone.size() + WorkShopList.size()); + data << uint16(4 + 2 + 4 + BuildingsInZone.size() + WorkshopsList.size()); data << uint32(BATTLEFIELD_WG_WORLD_STATE_ATTACKER) << uint32(GetAttackerTeam()); data << uint32(BATTLEFIELD_WG_WORLD_STATE_DEFENDER) << uint32(GetDefenderTeam()); @@ -948,9 +978,12 @@ WorldPacket BattlefieldWG::BuildInitWorldStates() { data << (*itr)->m_WorldState << (*itr)->m_State; } - for (WorkShop::const_iterator itr = WorkShopList.begin(); itr != WorkShopList.end(); ++itr) + for (Workshop::const_iterator itr = WorkshopsList.begin(); itr != WorkshopsList.end(); ++itr) { - data << (*itr)->m_WorldState << (*itr)->m_State; + if (!*itr) + continue; + + data << WorkshopsData[(*itr)->workshopId].worldstate << (*itr)->state; } return data; } diff --git a/src/server/game/Battlefield/Zones/BattlefieldWG.h b/src/server/game/Battlefield/Zones/BattlefieldWG.h index 94210dd3fd3..9d70d0b5ce4 100644 --- a/src/server/game/Battlefield/Zones/BattlefieldWG.h +++ b/src/server/game/Battlefield/Zones/BattlefieldWG.h @@ -36,11 +36,11 @@ class BattlefieldWG; class BfCapturePointWG; struct BfWGGameObjectBuilding; -struct BfWGWorkShopData; +struct WGWorkshop; typedef std::set<GameObject *>GameObjectSet; typedef std::set<BfWGGameObjectBuilding *> GameObjectBuilding; -typedef std::set<BfWGWorkShopData *> WorkShop; +typedef std::set<WGWorkshop*> Workshop; //typedef std::set<BfCapturePointWG *> CapturePointSet; unused ? typedef std::set<Group *> GroupSet; @@ -260,9 +260,9 @@ const BfWGCoordGY WGGraveYard[BATTLEFIELD_WG_GY_MAX] = { class BfCapturePointWG : public BfCapturePoint { public: - BfCapturePointWG(BattlefieldWG *bf, TeamId control); + BfCapturePointWG(BattlefieldWG* bf, TeamId control); - void LinkToWorkShop(BfWGWorkShopData *ws) + void LinkToWorkShop(WGWorkshop* ws) { m_WorkShop = ws; } @@ -274,7 +274,7 @@ class BfCapturePointWG : public BfCapturePoint } protected: - BfWGWorkShopData *m_WorkShop; + WGWorkshop *m_WorkShop; }; /*######################### @@ -361,6 +361,8 @@ class BattlefieldWG : public Battlefield */ void OnCreatureRemove(Creature* creature); + void OnGameObjectCreate(GameObject* go); + /** * \brief Called when a wall/tower is broken * -Update quest @@ -436,7 +438,7 @@ class BattlefieldWG : public Battlefield GameObjectBuilding BuildingsInZone; GuidSet KeepCreature[2]; GuidSet OutsideCreature[2]; - WorkShop WorkShopList; + Workshop WorkshopsList; GuidSet CanonList; GameObjectSet DefenderPortalList; GameObjectSet m_KeepGameObject[2]; @@ -471,7 +473,7 @@ enum eWGGameObjectState BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_DESTROY, }; -enum eWGWorkShopType +enum WGWorkshopId { BATTLEFIELD_WG_WORKSHOP_NE, BATTLEFIELD_WG_WORKSHOP_NW, @@ -481,6 +483,15 @@ enum eWGWorkShopType BATTLEFIELD_WG_WORKSHOP_KEEP_EAST, }; +enum WGWorldstate +{ + WORLDSTATE_WORKSHOP_NE = 3701, + WORLDSTATE_WORKSHOP_NW = 3700, + WORLDSTATE_WORKSHOP_SE = 3703, + WORLDSTATE_WORKSHOP_SW = 3702, + WORLDSTATE_WORKSHOP_K_W = 3698, + WORLDSTATE_WORKSHOP_K_E = 3699 +}; enum eWGTeamControl { BATTLEFIELD_WG_TEAM_ALLIANCE, @@ -518,7 +529,7 @@ enum eWGText // *INDENT-ON* }; -enum eWGObject +enum WGObject { // *INDENT-OFF* BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_NE = 190475, @@ -1100,219 +1111,29 @@ const BfWGTurretData TowerTurret[WG_MAX_TOWERTURRET] = // *****************WorkShop Data & Element***************** // ********************************************************* -struct BfWGWorkShopDataBase +#define WG_MAX_WORKSHOP 6 + +struct WGWorkshopData { - uint32 entry; + uint8 id; uint32 worldstate; - uint32 type; - uint32 nameid; - BfWGObjectPosition CapturePoint; - uint8 nbcreature; - BfWGObjectPosition CreatureData[10]; - uint8 nbgob; - BfWGObjectPosition GameObjectData[10]; + uint32 text; }; -// 6 engineer per faction in sql / 6 engineer per faction in header -#define WG_MAX_WORKSHOP 6 -const BfWGWorkShopDataBase WGWorkShopDataBase[WG_MAX_WORKSHOP] = { - { - 192031, - 3701, - BATTLEFIELD_WG_WORKSHOP_NE, - BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_NE, - { 4949.344238f, 2432.585693f, 320.176971f, 1.386214f, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_NE, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_NE }, - 1, - { - { 4939.759766f, 2389.060059f, 326.153015f, 3.263770f, 30400, 30499 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - }, - 6, - { - { 4778.189f, 2438.060f, 345.644f, -2.940f, 192280, 192274 }, - { 5024.569f, 2532.750f, 344.023f, -1.937f, 192280, 192274 }, - { 4811.399f, 2441.899f, 358.207f, -2.003f, 192435, 192406 }, - { 4805.669f, 2407.479f, 358.191f, 1.780f, 192435, 192406 }, - { 5004.350f, 2486.360f, 358.449f, 2.172f, 192435, 192406 }, - { 4983.279f, 2503.090f, 358.177f, -0.427f, 192435, 192406 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - } - }, - { - 192030, - 3700, - BATTLEFIELD_WG_WORKSHOP_NW, - BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_NW, - { 4948.524414f, 3342.337891f, 376.875366f, 4.400566f, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_NW, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_NW }, - 1, - { - { 4964.890137f, 3383.060059f, 382.911011f, 6.126110f, 30400, 30499 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - }, - 4, - { - { 5006.339f, 3280.399f, 371.162f, 2.225f, 192280, 192274 }, - { 5041.609f, 3294.399f, 382.149f, -1.631f, 192434, 192406 }, - { 4857.970f, 3335.439f, 368.881f, -2.945f, 192280, 192274 }, - { 4855.629f, 3297.620f, 376.739f, -3.132f, 192435, 192406 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - } - }, - { - 192033, - 3703, - BATTLEFIELD_WG_WORKSHOP_SE, - BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_SE, - { 4398.076660f, 2356.503662f, 376.190491f, 0.525406f, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_SE, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_SE }, - 9, - { - { 4417.919922f, 2331.239990f, 370.919006f, 5.846850f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4418.609863f, 2355.290039f, 372.490997f, 6.021390f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4391.669922f, 2300.610107f, 374.743011f, 4.921830f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4349.120117f, 2299.280029f, 374.743011f, 4.904380f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4333.549805f, 2333.909912f, 376.156006f, 0.973007f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4413.430176f, 2393.449951f, 376.359985f, 1.064650f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4388.129883f, 2411.979980f, 374.743011f, 1.640610f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4349.540039f, 2411.260010f, 374.743011f, 2.059490f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4357.669922f, 2357.989990f, 382.006989f, 1.675520f, 30400, 30499 }, - { 0, 0, 0, 0, 0, 0 } - }, - 2, - { - { 4417.250f, 2301.139f, 377.213f, 0.026f, 192435, 192406 }, - { 4417.939f, 2324.810f, 371.576f, 3.080f, 192280, 192274 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - } - }, - { - 192032, - 3702, - BATTLEFIELD_WG_WORKSHOP_SW, - BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_SW, - { 4390.776367f, 3304.094482f, 372.429077f, 6.097023f, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_SW, BATTLEFIELD_WG_GAMEOBJECT_FACTORY_BANNER_SW }, - 9, - { - { 4425.290039f, 3291.510010f, 370.773987f, 0.122173f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4424.609863f, 3321.100098f, 369.800995f, 0.034907f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4392.399902f, 3354.610107f, 369.597992f, 1.570800f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4370.979980f, 3355.020020f, 371.196991f, 1.675520f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4394.660156f, 3231.989990f, 369.721985f, 4.625120f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4366.979980f, 3233.560059f, 371.584991f, 4.939280f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4337.029785f, 3261.659912f, 373.524994f, 3.263770f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4323.779785f, 3287.100098f, 378.894989f, 2.862340f, BATTLEFIELD_WG_NPC_GUARD_H, BATTLEFIELD_WG_NPC_GUARD_A }, - { 4354.149902f, 3312.820068f, 378.045990f, 1.675520f, 30400, 30499 }, - { 0, 0, 0, 0, 0, 0 } - }, - 3, - { - { 4438.299f, 3361.080f, 371.567f, -0.017f, 192435, 192406 }, - { 4448.169f, 3235.629f, 370.411f, -1.562f, 192435, 192406 }, - { 4424.149f, 3286.540f, 371.545f, 3.124f, 192280, 192274 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - } - }, - { - 192028, - 3698, - BATTLEFIELD_WG_WORKSHOP_KEEP_WEST, - 0, - { 0, 0, 0, 0, 0, 0 }, - 1, - { - { 5392.910156f, 2975.260010f, 415.222992f, 4.555310f, 30400, 30499 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - }, - 0, - { - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - } - }, - { - 192029, - 3699, - BATTLEFIELD_WG_WORKSHOP_KEEP_EAST, - 0, - { 0, 0, 0, 0, 0, 0 }, - 1, - { - { 5391.609863f, 2707.719971f, 415.050995f, 4.555310f, 30400, 30499 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - }, - 0, - { - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } - } - } + +const WGWorkshopData WorkshopsData[WG_MAX_WORKSHOP] = +{ + // NE + {BATTLEFIELD_WG_WORKSHOP_NE, WORLDSTATE_WORKSHOP_NE, BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_NE}, + // NW + {BATTLEFIELD_WG_WORKSHOP_NW, WORLDSTATE_WORKSHOP_NW, BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_NW}, + // SE + {BATTLEFIELD_WG_WORKSHOP_SE, WORLDSTATE_WORKSHOP_SE, BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_SE}, + // SW + {BATTLEFIELD_WG_WORKSHOP_SW, WORLDSTATE_WORKSHOP_SW, BATTLEFIELD_WG_TEXT_WORKSHOP_NAME_SW}, + // KEEP WEST - It can't be taken, so it doesn't have a textid + {BATTLEFIELD_WG_WORKSHOP_KEEP_WEST, WORLDSTATE_WORKSHOP_K_W, NULL}, + // KEEP EAST - It can't be taken, so it doesn't have a textid + {BATTLEFIELD_WG_WORKSHOP_KEEP_EAST, WORLDSTATE_WORKSHOP_K_E, NULL} }; // ******************************************************************** @@ -1771,6 +1592,76 @@ struct BfWGGameObjectBuilding } }; +struct WGWorkshop +{ + // pointer to the battlefield that the workshop belongs to + BattlefieldWG* bf; + // id of the workshop, useful to retrieve data of the WorkshopsData array + uint8 workshopId; + // team that controls the node + uint8 teamControl; + // for worldstate + uint32 state; + + WGWorkshop(BattlefieldWG* _bf, uint8 _workshopId) + { + ASSERT(bf); + ASSERT(_workshopId < WG_MAX_WORKSHOP); + + bf = _bf; + workshopId = _workshopId; + } + + void ChangeControl(uint8 team, bool init /* for first call in setup */ ) + { + switch (team) + { + case BATTLEFIELD_WG_TEAM_NEUTRAL: + { + // Send warning message to all player to inform a faction attack to a workshop + // alliance / horde attacking a workshop + bf->SendWarningToAllInZone(teamControl ? WorkshopsData[workshopId].text : WorkshopsData[workshopId].text + 1); + break; + } + case BATTLEFIELD_WG_TEAM_ALLIANCE: + case BATTLEFIELD_WG_TEAM_HORDE: + { + // Updating worldstate + state = team == BATTLEFIELD_WG_TEAM_ALLIANCE ? BATTLEFIELD_WG_OBJECTSTATE_ALLIANCE_INTACT : BATTLEFIELD_WG_OBJECTSTATE_HORDE_INTACT; + bf->SendUpdateWorldState(WorkshopsData[workshopId].worldstate, state); + + // Warning message + if (!init) // workshop taken - alliance + bf->SendWarningToAllInZone(team == BATTLEFIELD_WG_TEAM_ALLIANCE ? WorkshopsData[workshopId].text : WorkshopsData[workshopId].text+1); + + // Found associate graveyard and update it + if (workshopId < BATTLEFIELD_WG_WORKSHOP_KEEP_WEST) + if (bf->GetGraveYardById(workshopId)) + bf->GetGraveYardById(workshopId)->ChangeControl(team == BATTLEFIELD_WG_TEAM_ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE); + + teamControl = team; + break; + } + } + + if (!init) + bf->UpdateCounterVehicle(false); + } + + void UpdateGraveYardAndWorkshop() + { + if (workshopId < BATTLEFIELD_WG_WORKSHOP_KEEP_WEST) + bf->GetGraveYardById(workshopId)->ChangeControl(TeamId(teamControl)); + else + ChangeControl(bf->GetDefenderTeam(), true); + } + + void Save() + { + sWorld->setWorldState(WorkshopsData[workshopId].worldstate, state); + } +}; + // Structure for the 6 workshop struct BfWGWorkShopData { |