aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/DBCStores.cpp2
-rw-r--r--src/game/DBCStores.h1
-rw-r--r--src/game/DBCStructure.h18
-rw-r--r--src/game/DBCfmt.h1
-rw-r--r--src/game/Wintergrasp.cpp18
-rw-r--r--src/game/Wintergrasp.h36
6 files changed, 76 insertions, 0 deletions
diff --git a/src/game/DBCStores.cpp b/src/game/DBCStores.cpp
index 4f09e039f3e..ff193abaad6 100644
--- a/src/game/DBCStores.cpp
+++ b/src/game/DBCStores.cpp
@@ -33,6 +33,7 @@ typedef std::map<uint32,uint32> AreaFlagByMapID;
DBCStorage <AreaTableEntry> sAreaStore(AreaTableEntryfmt);
DBCStorage <AreaGroupEntry> sAreaGroupStore(AreaGroupEntryfmt);
+DBCStorage <AreaPOIEntry> sAreaPOIStore(AreaPOIEntryfmt);
static AreaFlagByAreaID sAreaFlagByAreaID;
static AreaFlagByMapID sAreaFlagByMapID; // for instances without generated *.map files
@@ -233,6 +234,7 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAchievementCriteriaStore, dbcPath,"Achievement_Criteria.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAreaTriggerStore, dbcPath,"AreaTrigger.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAreaGroupStore, dbcPath,"AreaGroup.dbc");
+ LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAreaPOIStore, dbcPath,"AreaPOI.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAuctionHouseStore, dbcPath,"AuctionHouse.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBankBagSlotPricesStore, dbcPath,"BankBagSlotPrices.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBattlemasterListStore, dbcPath,"BattlemasterList.dbc");
diff --git a/src/game/DBCStores.h b/src/game/DBCStores.h
index 5952d12ec71..4da1911a0b7 100644
--- a/src/game/DBCStores.h
+++ b/src/game/DBCStores.h
@@ -62,6 +62,7 @@ extern DBCStorage <AchievementEntry> sAchievementStore;
extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore;
extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions
extern DBCStorage <AreaGroupEntry> sAreaGroupStore;
+extern DBCStorage <AreaPOIEntry> sAreaPOIStore;
extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore;
extern DBCStorage <AuctionHouseEntry> sAuctionHouseStore;
extern DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore;
diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h
index a4a5d040ac1..6862e0aa26d 100644
--- a/src/game/DBCStructure.h
+++ b/src/game/DBCStructure.h
@@ -516,6 +516,24 @@ struct AreaGroupEntry
uint32 nextGroup; // 7 index of next group
};
+struct AreaPOIEntry
+{
+ uint32 id; //0
+ //uint32 icon[11]; //1-11
+ float x; //12
+ float y; //13
+ float z; //14
+ uint32 mapId; //15
+ //uint32 val1; //16
+ uint32 zoneId; //17
+ //char* name[16]; //18-33
+ //uint32 name_flag; //34
+ //char* name2[16]; //35-50
+ //uint32 name_flag2; //51
+ uint32 worldState; //52
+ //uint32 val2; //53
+};
+
struct AreaTriggerEntry
{
uint32 id; // 0 m_ID
diff --git a/src/game/DBCfmt.h b/src/game/DBCfmt.h
index ab41fbe37d4..77f01edb5a2 100644
--- a/src/game/DBCfmt.h
+++ b/src/game/DBCfmt.h
@@ -25,6 +25,7 @@ const char Achievementfmt[]="niixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiixixxxxxxxxx
const char AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixix";
const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx";
const char AreaGroupEntryfmt[]="niiiiiii";
+const char AreaPOIEntryfmt[]="nxxxxxxxxxxxfffixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
const char AreaTriggerEntryfmt[]="niffffffff";
const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx";
const char BankBagSlotPricesEntryfmt[]="ni";
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index a2cbb3d7cf5..b5e808e1251 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -23,6 +23,17 @@
bool OPvPWintergrasp::SetupOutdoorPvP()
{
RegisterZone(ZONE_WINTERGRASP);
+
+ for(uint32 i = 0; i < sAreaPOIStore.GetNumRows(); ++i)
+ {
+ const AreaPOIEntry * poiInfo = sAreaPOIStore.LookupEntry(i);
+ if(poiInfo && poiInfo->zoneId == ZONE_WINTERGRASP)
+ areaPOIs.push_back(poiInfo);
+ }
+
+ m_defender = TeamId(rand()%2);
+ m_attacker = (m_defender == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE);
+
return true;
}
@@ -31,6 +42,13 @@ void OPvPWintergrasp::HandlePlayerEnterZone(Player * plr, uint32 zone)
if(!plr->HasAura(SPELL_RECRUIT) && !plr->HasAura(SPELL_CORPORAL)
&& !plr->HasAura(SPELL_LIEUTENANT))
plr->CastSpell(plr, SPELL_RECRUIT, true);
+
+ for(AreaPOIList::iterator itr = areaPOIs.begin(); itr != areaPOIs.end(); ++itr)
+ {
+ TeamId team = ((*itr)->x > POS_X_CENTER ? m_defender : m_attacker);
+ plr->SendUpdateWorldState((*itr)->worldState, AreaPOIIconId[team][DAMAGE_INTACT]);
+ }
+
OutdoorPvP::HandlePlayerEnterZone(plr, zone);
}
diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h
index 1a698c4c1cf..40b908ea74d 100644
--- a/src/game/Wintergrasp.h
+++ b/src/game/Wintergrasp.h
@@ -23,6 +23,8 @@
#define ZONE_WINTERGRASP 4197
+#define POS_X_CENTER 4700
+
#define SPELL_RECRUIT 37795
#define SPELL_CORPORAL 33280
#define SPELL_LIEUTENANT 55629
@@ -30,13 +32,47 @@
#define SPELL_TENICITY 58549
#define SPELL_TENICITY_VEHICLE 59911
+enum TeamId
+{
+ TEAM_ALLIANCE = 0,
+ TEAM_HORDE,
+ TEAM_NEUTRAL,
+};
+
+enum DamageState
+{
+ DAMAGE_INTACT,
+ DAMAGE_DAMAGED,
+ DAMAGE_DESTROYED,
+};
+
+const uint32 AreaPOIIconId[3][3] = {{7,8,9},{4,5,6},{1,2,3}};
+
+struct BuildingState
+{
+ explicit BuildingState(uint32 _worldState, uint32 _health)
+ : worldState(_worldState), health(_health), team(TEAM_NEUTRAL), damageState(DAMAGE_INTACT)
+ {}
+ uint32 worldState;
+ uint32 health;
+ TeamId team;
+ DamageState damageState;
+};
+
class OPvPWintergrasp : public OutdoorPvP
{
+ protected:
+ typedef std::list<const AreaPOIEntry *> AreaPOIList;
+ typedef std::map<uint32, BuildingState *> BuildingStateMap;
public:
bool SetupOutdoorPvP();
void HandlePlayerEnterZone(Player *plr, uint32 zone);
void HandlePlayerLeaveZone(Player *plr, uint32 zone);
void HandleKill(Player *killer, Unit *victim);
+ protected:
+ TeamId m_defender, m_attacker;
+ AreaPOIList areaPOIs;
+ BuildingStateMap buildingStates;
};
#endif