*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
This commit is contained in:
megamage
2009-08-31 13:43:54 -05:00
parent 6a50516174
commit a4f6659f7a
6 changed files with 76 additions and 19 deletions
+4 -1
View File
@@ -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;
+3 -1
View File
@@ -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,
+51 -14
View File
@@ -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());
}
/*
+15 -3
View File
@@ -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];