aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-08-31 13:43:54 -0500
committermegamage <none@none>2009-08-31 13:43:54 -0500
commita4f6659f7a483a73dbc3d5d78748ffe7a077dad7 (patch)
tree90b8597eed296cf29e0a48ab5fd7d67e42357970 /src
parent6a50516174a266e8e73403871101399f6855a3d1 (diff)
*Wintergrasp: fix the bug that player is send into hall when dead near hall.
*Only revive player in the graveyard which is occupied. *Do not allow to use titan relic if hall gate is not destroyed. --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/ObjectMgr.h5
-rw-r--r--src/game/SharedDefines.h4
-rw-r--r--src/game/Wintergrasp.cpp65
-rw-r--r--src/game/Wintergrasp.h18
4 files changed, 73 insertions, 19 deletions
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 6624cc7e76d..b0e1bce8367 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -873,6 +873,9 @@ class ObjectMgr
uint64 GenerateGMTicketId();
bool CheckDB() const;
+
+ // for wintergrasp only
+ GraveYardMap mGraveYardMap;
protected:
// first free id for selected id type
@@ -931,7 +934,7 @@ class ObjectMgr
std::set<uint32> m_DisabledCreatureSpells;
std::set<uint32> m_DisabledPetSpells;
- GraveYardMap mGraveYardMap;
+// GraveYardMap mGraveYardMap;
GameTeleMap m_GameTeleMap;
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 8731fe1a399..ba86c83c8b8 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -561,9 +561,11 @@ enum Team
//TEAM_HORDE_FORCES = 892,
//TEAM_SANCTUARY = 936,
//TEAM_OUTLAND = 980,
- //TEAM_OTHER = 0, // if ReputationListId > 0 && Flags != FACTION_FLAG_TEAM_HEADER
+ TEAM_OTHER = 0, // if ReputationListId > 0 && Flags != FACTION_FLAG_TEAM_HEADER
};
+const Team TeamId2Team[3] = {ALLIANCE, HORDE, TEAM_OTHER};
+
enum SpellEffects
{
SPELL_EFFECT_INSTAKILL = 1,
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index ea9cd0cd83a..fa387f8d926 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -81,7 +81,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
m_workshopCount[TEAM_HORDE] = 0;
m_towerCount = 3;
- // Load buildings
+ // Select POI
AreaPOIList areaPOIs;
float minX = 9999, minY = 9999, maxX = -9999, maxY = -9999;
for(uint32 i = 0; i < sAreaPOIStore.GetNumRows(); ++i)
@@ -139,6 +139,8 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
// add building to the list
TeamId teamId = x > POS_X_CENTER ? m_defender : OTHER_TEAM(m_defender);
m_buildingStates[guid] = new BuildingState((*poi)->worldState, teamId, m_defender != TEAM_ALLIANCE);
+ if((*poi)->id == 2246)
+ m_gate = m_buildingStates[guid];
areaPOIs.erase(poi);
//disable for now
@@ -227,13 +229,48 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
}while(result->NextRow());
delete result;
+ // Load Graveyard
+ GraveYardMap::const_iterator graveLow = objmgr.mGraveYardMap.lower_bound(ZONE_WINTERGRASP);
+ GraveYardMap::const_iterator graveUp = objmgr.mGraveYardMap.upper_bound(ZONE_WINTERGRASP);
+ for(AreaPOIList::iterator itr = areaPOIs.begin(); itr != areaPOIs.end();)
+ {
+ if((*itr)->icon[1] == 8)
+ {
+ // find or create grave yard
+ const WorldSafeLocsEntry *loc = objmgr.GetClosestGraveYard((*itr)->x, (*itr)->y, (*itr)->z, (*itr)->mapId, 0);
+ GraveYardMap::const_iterator graveItr;
+ for(graveItr = graveLow; graveItr != graveUp; ++graveItr)
+ if(graveItr->second.safeLocId == loc->ID)
+ break;
+ if(graveItr == graveUp)
+ {
+ GraveYardData graveData;
+ graveData.safeLocId = loc->ID;
+ graveData.team = 0;
+ graveItr = objmgr.mGraveYardMap.insert(std::make_pair(ZONE_WINTERGRASP, graveData));
+ }
+
+ for(BuildingStateMap::iterator stateItr = m_buildingStates.begin(); stateItr != m_buildingStates.end(); ++stateItr)
+ {
+ if(stateItr->second->worldState == (*itr)->worldState)
+ {
+ stateItr->second->graveTeam = const_cast<uint32*>(&graveItr->second.team);
+ break;
+ }
+ }
+ areaPOIs.erase(itr++);
+ }
+ else
+ ++itr;
+ }
+
//for(AreaPOIList::iterator itr = areaPOIs.begin(); itr != areaPOIs.end(); ++itr)
// sLog.outError("not assigned %u %f %f", (*itr)->id, (*itr)->x, (*itr)->y);
//gameeventmgr.StartInternalEvent(GameEventWintergraspDefender[m_defender]);
//Titan Relic eventid = 19982
- objmgr.AddGOData(192829, 571, 5440, 2840.8, 420.43, 0);
+ objmgr.AddGOData(192829, 571, 5440, 2840.8, 420.43 + 10, 0);
LoadTeamPair(m_goDisplayPair, GODisplayPair);
LoadTeamPair(m_creEntryPair, CreatureEntryPair);
@@ -249,7 +286,7 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
{
if(eventId == 19982)
{
- if(m_wartime)
+ if(m_wartime && m_gate->damageState == DAMAGE_DESTROYED)
{
m_changeDefender = true;
m_timer = 0;
@@ -276,7 +313,7 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
{
//if(SiegeWorkshop *workshop = GetWorkshop(obj->GetDBTableGUIDLow()))
// workshop->DespawnAllVehicles();
- ModifyWorkshopCount(state->team, false);
+ ModifyWorkshopCount(state->GetTeam(), false);
}
else if(state->type == BUILDING_TOWER)
{
@@ -491,11 +528,11 @@ void OPvPWintergrasp::RebuildAllBuildings()
if(itr->second->damageState == DAMAGE_DESTROYED)
{
if(itr->second->type == BUILDING_WORKSHOP)
- ModifyWorkshopCount(itr->second->team, true);
+ ModifyWorkshopCount(itr->second->GetTeam(), true);
}
itr->second->damageState = DAMAGE_INTACT;
- itr->second->team = m_defender == TEAM_ALLIANCE ? OTHER_TEAM(itr->second->defaultTeam) : itr->second->defaultTeam;
+ itr->second->SetTeam(m_defender == TEAM_ALLIANCE ? OTHER_TEAM(itr->second->defaultTeam) : itr->second->defaultTeam);
}
m_towerCount = 3;
@@ -823,7 +860,7 @@ void OPvPWintergrasp::EndBattle()
for(OutdoorPvP::OPvPCapturePointMap::const_iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
{
if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second))
- if(workshop->m_buildingState->team == team)
+ if(workshop->m_buildingState->GetTeam() == team)
if(workshop->m_buildingState->damageState == DAMAGE_DAMAGED)
++damagedNum;
else if(workshop->m_buildingState->damageState == DAMAGE_INTACT)
@@ -858,7 +895,7 @@ void OPvPWintergrasp::SetData(uint32 id, uint32 value)
bool OPvPWintergrasp::CanBuildVehicle(SiegeWorkshop *workshop) const
{
- TeamId team = workshop->m_buildingState->team;
+ TeamId team = workshop->m_buildingState->GetTeam();
if(team == TEAM_NEUTRAL)
return false;
@@ -913,12 +950,12 @@ SiegeWorkshop::SiegeWorkshop(OPvPWintergrasp *opvp, BuildingState *state)
void SiegeWorkshop::SetTeamByBuildingState()
{
- if(m_buildingState->team == TEAM_ALLIANCE)
+ if(m_buildingState->GetTeam() == TEAM_ALLIANCE)
{
m_value = m_maxValue;
m_State = OBJECTIVESTATE_ALLIANCE;
}
- else if(m_buildingState->team == TEAM_HORDE)
+ else if(m_buildingState->GetTeam() == TEAM_HORDE)
{
m_value = -m_maxValue;
m_State = OBJECTIVESTATE_HORDE;
@@ -929,10 +966,10 @@ void SiegeWorkshop::SetTeamByBuildingState()
m_State = OBJECTIVESTATE_NEUTRAL;
}
- if(m_team != m_buildingState->team)
+ if(m_team != m_buildingState->GetTeam())
{
TeamId oldTeam = m_team;
- m_team = m_buildingState->team;
+ m_team = m_buildingState->GetTeam();
ChangeTeam(oldTeam);
}
@@ -952,7 +989,7 @@ void SiegeWorkshop::ChangeTeam(TeamId oldTeam)
GameObject::SetGoArtKit(CapturePointArtKit[m_team], m_capturePoint, m_capturePointGUID);
- m_buildingState->team = m_team;
+ m_buildingState->SetTeam(m_team);
// TODO: this may be sent twice
m_wintergrasp->BroadcastStateChange(m_buildingState);
@@ -982,7 +1019,7 @@ void SiegeWorkshop::ChangeTeam(TeamId oldTeam)
else if(m_engineer)
m_engineer->SetVisibility(VISIBILITY_OFF);
- sLog.outDebug("Wintergrasp workshop now belongs to %u.", (uint32)m_buildingState->team);
+ sLog.outDebug("Wintergrasp workshop now belongs to %u.", (uint32)m_buildingState->GetTeam());
}
/*
diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h
index a8c4a5a12ce..c6a14441c3a 100644
--- a/src/game/Wintergrasp.h
+++ b/src/game/Wintergrasp.h
@@ -116,13 +116,14 @@ struct BuildingState
explicit BuildingState(uint32 _worldState, TeamId _team, bool asDefault)
: worldState(_worldState), health(0)
, defaultTeam(asDefault ? _team : OTHER_TEAM(_team)), team(_team), damageState(DAMAGE_INTACT)
- , building(NULL), type(BUILDING_WALL)
+ , building(NULL), type(BUILDING_WALL), graveTeam(NULL)
{}
uint32 worldState;
uint32 health;
- TeamId team, defaultTeam;
+ TeamId defaultTeam;
DamageState damageState;
GameObject *building;
+ uint32 *graveTeam;
BuildingType type;
void SendUpdate(Player *player) const
@@ -134,6 +135,16 @@ struct BuildingState
{
data << worldState << AreaPOIIconId[team][damageState];
}
+
+ TeamId GetTeam() const { return team; }
+ void SetTeam(TeamId t)
+ {
+ team = t;
+ if(graveTeam)
+ *graveTeam = TeamId2Team[t];
+ }
+private:
+ TeamId team;
};
typedef std::map<uint32, uint32> TeamPairMap;
@@ -147,7 +158,7 @@ class OPvPWintergrasp : public OutdoorPvP
typedef std::set<Creature*> CreatureSet;
typedef std::set<GameObject*> GameObjectSet;
public:
- explicit OPvPWintergrasp() : m_tenacityStack(0) {}
+ explicit OPvPWintergrasp() : m_tenacityStack(0), m_gate(NULL) {}
bool SetupOutdoorPvP();
uint32 GetCreatureEntry(uint32 guidlow, const CreatureData *data);
@@ -175,6 +186,7 @@ class OPvPWintergrasp : public OutdoorPvP
int32 m_tenacityStack;
BuildingStateMap m_buildingStates;
+ BuildingState *m_gate;
CreatureSet m_creatures;
CreatureSet m_vehicles[2];