aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Carrasco <manue.l@live.com.ar>2012-03-04 01:24:00 -0300
committerKandera <KanderaDev@gmail.com>2012-08-20 13:48:47 -0400
commit27bfafe0e15ab07b98f3684c6f3ae98100cab1c2 (patch)
tree876b9cc41a079082c05c0ac6dd249f61b6716f51
parentd7a7a9800b734f71074da84338ba29a93009a198 (diff)
BF/Wintergrasp: Removed harcoded Workshops related spawns, db data is used now.
-rw-r--r--Wintergrasp_temp/Spawns.sql10
-rw-r--r--src/server/game/Battlefield/Battlefield.cpp48
-rw-r--r--src/server/game/Battlefield/Battlefield.h4
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.cpp103
-rw-r--r--src/server/game/Battlefield/Zones/BattlefieldWG.h327
5 files changed, 213 insertions, 279 deletions
diff --git a/Wintergrasp_temp/Spawns.sql b/Wintergrasp_temp/Spawns.sql
index ab061598df7..3464ed3ee0a 100644
--- a/Wintergrasp_temp/Spawns.sql
+++ b/Wintergrasp_temp/Spawns.sql
@@ -1,3 +1,13 @@
+-- Before pushing to master check if guids are free.
+-- Spawns Workshop Capture Points
+SET @GUID := 4594;
+DELETE FROM gameobject WHERE guid IN (@GUID+1,@GUID+2,@GUID+3,@GUID+4);
+INSERT INTO gameobject (guid,id,position_x,position_y,position_z,orientation,map) VALUES
+(@GUID+1, 190475, 4949.344238, 2432.585693, 320.176971, 1.386214, 571), -- ne
+(@GUID+2, 190487, 4948.524414, 3342.337891, 376.875366, 4.400566, 571), -- nw
+(@GUID+3, 194959, 4398.076660, 2356.503662, 376.190491, 0.525406, 571), -- se
+(@GUID+4, 194962, 4390.776367, 3304.094482, 372.429077, 6.097023, 571); -- sw
+
-- EVERYTHING UNDER HERE IS WIP
/*
SET @OGUID := XXXXX;
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
{