diff options
author | megamage <none@none> | 2009-08-31 13:43:54 -0500 |
---|---|---|
committer | megamage <none@none> | 2009-08-31 13:43:54 -0500 |
commit | a4f6659f7a483a73dbc3d5d78748ffe7a077dad7 (patch) | |
tree | 90b8597eed296cf29e0a48ab5fd7d67e42357970 /src | |
parent | 6a50516174a266e8e73403871101399f6855a3d1 (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.h | 5 | ||||
-rw-r--r-- | src/game/SharedDefines.h | 4 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 65 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 18 |
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]; |