diff options
author | maximius <none@none> | 2009-10-14 14:26:57 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-14 14:26:57 -0700 |
commit | 27c7d6aa85bee461c15e81da23ed4d5fec4851f0 (patch) | |
tree | b0699448aa3cfd783b75d933e78dbd77ea12e4d3 /src | |
parent | edf0007e6a4f247d4cdf5208da55a43b400f0a25 (diff) |
*Wintergrasp: Some GOs were not being rebuilt at battle end, by Spp
*Wintergrasp: Proper way to destroy vehicles, by simon
*Wintergrasp: Turret Cannons were not changing faction at battle end, by Spp
*Some code cleanup and missing code from workshop faction change patch
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Wintergrasp.cpp | 92 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 6 |
2 files changed, 52 insertions, 46 deletions
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp index 7f2d54358e8..ea0fe7bcb21 100644 --- a/src/game/Wintergrasp.cpp +++ b/src/game/Wintergrasp.cpp @@ -102,6 +102,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP() } minX -= 20; minY -= 20; maxX += 20; maxY += 20; + // Coords: 4290.330078, 1790.359985 - 5558.379883, 4048.889893 QueryResult *result = WorldDatabase.PQuery("SELECT guid FROM gameobject,gameobject_template" " WHERE gameobject.map=571" " AND gameobject.position_x>%f AND gameobject.position_y>%f" @@ -144,9 +145,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP() 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); // add capture point @@ -154,13 +153,18 @@ bool OPvPWintergrasp::SetupOutdoorPvP() switch(goData->id) { - case 192028: capturePointEntry = 190475; break; - case 192029: capturePointEntry = 190487; break; // not sure - case 192030: capturePointEntry = 190475; break; - case 192031: capturePointEntry = 190487; break; - case 192032: capturePointEntry = 190475; break; - case 192033: capturePointEntry = 190487; break; + case 192028: // NW + case 192030: // W + case 192032: // SW + capturePointEntry = 190475; + break; + case 192029: // NE + case 192031: // E + case 192033: // SE + capturePointEntry = 190487; + break; } + // TODO - Get Engs from DB only 1 time, not 6 if (capturePointEntry) { uint32 engGuid = 0; @@ -333,11 +337,7 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) state->damageState = DAMAGE_DESTROYED; if (state->type == BUILDING_WORKSHOP) - { - //if (SiegeWorkshop *workshop = GetWorkshop(obj->GetDBTableGUIDLow())) - // workshop->DespawnAllVehicles(); ModifyWorkshopCount(state->GetTeam(), false); - } else if (state->type == BUILDING_TOWER) { if (!m_towerCount) @@ -346,11 +346,9 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId) { --m_towerCount; if (sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_CUSTOM_HONOR)) - { for (PlayerSet::const_iterator itr = m_players[m_defender].begin(); itr != m_players[m_defender].end(); ++itr) if ((*itr)->HasAura(SPELL_LIEUTENANT) && ((*itr)->getLevel() > 69)) (*itr)->ModifyHonorPoints(m_customHonorReward[DESTROYED_TOWER]); - } else LieutenantCastSpell(m_defender, SPELL_DESTROYED_TOWER); } @@ -619,6 +617,14 @@ void OPvPWintergrasp::BroadcastStateChange(BuildingState *state) const bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature) const { + if (GetCreatureType(creature->GetEntry()) == CREATURE_TURRET) + { + if (!creature->isAlive()) + creature->Respawn(true); + creature->setFaction(WintergraspFaction[m_defender]); + return true; + } + TeamPairMap::const_iterator itr = m_creEntryPair.find(creature->GetCreatureData()->id); if (itr != m_creEntryPair.end()) { @@ -635,25 +641,29 @@ bool OPvPWintergrasp::UpdateGameObjectInfo(GameObject *go) const { switch(go->GetGOInfo()->displayId) { + case 8244: // Defender's Portal - Vehicle Teleporter + go->SetUInt32Value(GAMEOBJECT_FACTION, WintergraspFaction[m_defender]); + return true; + case 7967: // Titan relic + go->SetUInt32Value(GAMEOBJECT_FACTION, WintergraspFaction[OTHER_TEAM(m_defender)]); + return true; + // Return False = we need to rebuild at battle End + case 8165: // Wintergrasp Keep Door case 7877: // Wintergrasp Fortress Wall case 7878: // Wintergrasp Keep Tower case 7906: // Wintergrasp Fortress Gate case 7909: // Wintergrasp Wall - case 8244: // Defender's Portal - Vehicle Teleporter go->SetUInt32Value(GAMEOBJECT_FACTION, WintergraspFaction[m_defender]); - return true; + return false; case 7900: // Flamewatch Tower - Shadowsight Tower - Winter's Edge Tower - case 7967: // Titan relic go->SetUInt32Value(GAMEOBJECT_FACTION, WintergraspFaction[OTHER_TEAM(m_defender)]); - return true; + return false; case 8208: // Goblin Workshop SiegeWorkshop *workshop = GetWorkshopByGOGuid(go->GetGUID()); if (workshop) - { go->SetUInt32Value(GAMEOBJECT_FACTION, WintergraspFaction[workshop->m_buildingState->GetTeam()]); - return true; - } + return false; } // Note: this is only for test, still need db support @@ -664,7 +674,6 @@ bool OPvPWintergrasp::UpdateGameObjectInfo(GameObject *go) const itr->second : itr->first); return true; } - return false; } @@ -753,19 +762,19 @@ void OPvPWintergrasp::HandleKill(Player *killer, Unit *victim) } // Cast or removes Tenacity. MaxHP Modified, HP keeps it's % ratio -void OPvPWintergrasp::CastTenacity(Unit *utr, int32 newStack) +void OPvPWintergrasp::CastTenacity(Unit *unit, int32 newStack) { - if (!utr) + if (!unit) return; - uint32 spellId = utr->GetTypeId() == TYPEID_PLAYER ? SPELL_TENACITY : SPELL_TENACITY_VEHICLE; - float percent = (0.0f + utr->GetHealth()) / utr->GetMaxHealth(); + uint32 spellId = unit->GetTypeId() == TYPEID_PLAYER ? SPELL_TENACITY : SPELL_TENACITY_VEHICLE; if (newStack) - utr->SetAuraStack(spellId, utr, newStack); + unit->SetAuraStack(spellId, unit, newStack); else - utr->RemoveAura(spellId); - utr->SetHealth(uint32(utr->GetMaxHealth()*percent)); + unit->RemoveAura(spellId); + if (!unit->GetTypeId() == TYPEID_PLAYER || unit->isAlive()) + unit->SetHealth(uint32(unit->GetMaxHealth()*((float)unit->GetHealth()) / unit->GetMaxHealth())); } // Recalculates Tenacity and applies it to Players / Vehicles @@ -936,6 +945,14 @@ void OPvPWintergrasp::EndBattle() for (uint32 team = 0; team < 2; ++team) { + // destroyed all vehicles + while(!m_vehicles[team].empty()) + { + Creature *veh = *m_vehicles[team].begin(); + m_vehicles[team].erase(m_vehicles[team].begin()); + veh->setDeathState(JUST_DIED); + } + // calculate rewards uint32 intactNum = 0; uint32 damagedNum = 0; @@ -981,14 +998,6 @@ void OPvPWintergrasp::EndBattle() REMOVE_TENACITY_AURA(*itr); (*itr)->CombatStop(true); } - - // destroyed all vehicles - while(!m_vehicles[team].empty()) - { - Creature *veh = *m_vehicles[team].begin(); - m_vehicles[team].erase(m_vehicles[team].begin()); - veh->CastSpell(veh, SPELL_SHUTDOWN_VEHICLE, true); - } } //3.2.0: TeamCastSpell(OTHER_TEAM(m_defender), SPELL_TELEPORT_DALARAN); @@ -1102,13 +1111,8 @@ void SiegeWorkshop::ChangeTeam(TeamId oldTeam) // TODO: this may be sent twice m_wintergrasp->BroadcastStateChange(m_buildingState); - // does not work, entry may change - /*Creature *creature = ObjectAccessor::GetObjectInWorld(m_Creatures[0], (Creature*)NULL); - if (!creature) - { - sLog.outError("SiegeWorkshop::ChangeState cannot find creature " I64FMT " !", m_Creatures[0]); - return; - }*/ + if (m_buildingState->building) + m_buildingState->building->SetUInt32Value(GAMEOBJECT_FACTION, WintergraspFaction[m_team]); if (entry) { diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h index b2a293b5f1e..1f73127f0c3 100644 --- a/src/game/Wintergrasp.h +++ b/src/game/Wintergrasp.h @@ -41,7 +41,6 @@ enum WintergraspSpell SPELL_TENACITY_VEHICLE = 59911, SPELL_TELEPORT_DALARAN = 53360, - SPELL_SHUTDOWN_VEHICLE = 21247, SPELL_TOWER_CONTROL = 62064, SPELL_VICTORY_REWARD = 56902, @@ -155,7 +154,7 @@ struct BuildingState if(graveTeam) *graveTeam = TeamId2Team[t]; } - GameObject * GetBuilding() { return building; } + private: TeamId team; }; @@ -194,6 +193,9 @@ class OPvPWintergrasp : public OutdoorPvP void SetData(uint32 id, uint32 value); void ModifyWorkshopCount(TeamId team, bool add); + uint32 GetTimer() { return m_timer / 1000; }; + TeamId GetTeam() { return m_defender; }; + bool isWarTime() { return m_wartime; }; protected: TeamId m_defender; int32 m_tenacityStack; |