diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/ObjectMgr.cpp | 25 | ||||
-rw-r--r-- | src/game/OutdoorPvP.cpp | 82 | ||||
-rw-r--r-- | src/game/OutdoorPvP.h | 17 | ||||
-rw-r--r-- | src/game/OutdoorPvPEP.cpp | 56 | ||||
-rw-r--r-- | src/game/OutdoorPvPHP.cpp | 8 | ||||
-rw-r--r-- | src/game/OutdoorPvPNA.cpp | 8 | ||||
-rw-r--r-- | src/game/OutdoorPvPTF.cpp | 8 | ||||
-rw-r--r-- | src/game/OutdoorPvPZM.cpp | 8 | ||||
-rw-r--r-- | src/game/Player.cpp | 2 | ||||
-rw-r--r-- | src/game/Wintergrasp.cpp | 112 | ||||
-rw-r--r-- | src/game/Wintergrasp.h | 6 |
11 files changed, 216 insertions, 116 deletions
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 98594519a92..8d5861bc72b 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -1392,6 +1392,10 @@ uint32 ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float if (!goinfo) return 0; + Map* map = const_cast<Map*>(MapManager::Instance().CreateBaseMap(mapId)); + if(!map) + return 0; + uint32 guid = GenerateLowGuid(HIGHGUID_GAMEOBJECT); GameObjectData& data = NewGOData(guid); data.id = entry; @@ -1414,22 +1418,21 @@ uint32 ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float AddGameobjectToGrid(guid, &data); // Spawn if necessary (loaded grids only) - if(Map* map = const_cast<Map*>(MapManager::Instance().CreateBaseMap(mapId))) + // We use spawn coords to spawn + if(!map->Instanceable() && !map->IsRemovalGrid(x, y)) { - // We use spawn coords to spawn - if(!map->Instanceable() && !map->IsRemovalGrid(x, y)) + GameObject *go = new GameObject; + if(!go->LoadFromDB(guid, map)) { - GameObject *go = new GameObject; - if(!go->LoadFromDB(guid, map)) - { - sLog.outError("AddGameObject: cannot add gameobject entry %u to map", entry); - delete go; - return 0; - } - map->Add(go); + sLog.outError("AddGOData: cannot add gameobject entry %u to map", entry); + delete go; + return 0; } + map->Add(go); } + sLog.outDebug("AddGOData: dbguid %u entry %u map %u x %f y %f z %f o %f", guid, entry, mapId, x, y, z, o); + return guid; } diff --git a/src/game/OutdoorPvP.cpp b/src/game/OutdoorPvP.cpp index dc17f340038..546769b7a11 100644 --- a/src/game/OutdoorPvP.cpp +++ b/src/game/OutdoorPvP.cpp @@ -32,22 +32,43 @@ #include "CellImpl.h" OPvPCapturePoint::OPvPCapturePoint(OutdoorPvP * pvp) -: m_PvP(pvp), m_ShiftPhase(0), m_ShiftMaxPhase(0), m_OldPhase(0), -m_State(0), m_OldState(0), m_CapturePointGUID(0), m_NeutralValue(0), -m_ShiftMaxCaptureSpeed(0), m_capturePoint(NULL) +: m_PvP(pvp), m_value(0), m_maxValue(0), m_oldValue(0), +m_State(0), m_OldState(0), m_CapturePointGUID(0), m_neutralValuePct(0), +m_maxSpeed(0), m_capturePoint(NULL) { } bool OPvPCapturePoint::HandlePlayerEnter(Player * plr) { + if(m_capturePoint) + { + plr->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldState1, 1); + plr->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate2, (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f)); + plr->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct); + } return m_activePlayers[plr->GetTeamId()].insert(plr).second; } void OPvPCapturePoint::HandlePlayerLeave(Player * plr) { + if(m_capturePoint) + plr->SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldState1, 0); m_activePlayers[plr->GetTeamId()].erase(plr); } +void OPvPCapturePoint::SendChangePhase() +{ + if(!m_capturePoint) + return; + + // send this too, sometimes the slider disappears, dunno why :( + SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldState1, 1); + // send these updates to only the ones in this objective + SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate2, (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f)); + // send this too, sometimes it resets :S + SendUpdateWorldState(m_capturePoint->GetGOInfo()->capturePoint.worldstate3, m_neutralValuePct); +} + void OPvPCapturePoint::AddGO(uint32 type, uint32 guid, uint32 entry) { if(!entry) @@ -113,9 +134,10 @@ bool OPvPCapturePoint::AddCapturePoint(uint32 entry, uint32 map, float x, float return false; // get the needed values from goinfo - m_ShiftMaxPhase = goinfo->capturePoint.maxTime; - m_ShiftMaxCaptureSpeed = m_ShiftMaxPhase / float(goinfo->capturePoint.minTime); - m_NeutralValue = goinfo->capturePoint.neutralPercent; + m_maxValue = goinfo->capturePoint.maxTime; + m_maxSpeed = m_maxValue / (goinfo->capturePoint.minTime ? goinfo->capturePoint.minTime : 60); + m_neutralValuePct = goinfo->capturePoint.neutralPercent; + m_minValue = m_maxValue * goinfo->capturePoint.neutralPercent / 100; return true; } @@ -281,55 +303,51 @@ bool OPvPCapturePoint::Update(uint32 diff) return false; uint32 Challenger = 0; + float maxDiff = m_maxSpeed * diff; if(fact_diff < 0) { // horde is in majority, but it's already horde-controlled -> no change - if(m_State == OBJECTIVESTATE_HORDE && m_ShiftPhase <= -m_ShiftMaxPhase) + if(m_State == OBJECTIVESTATE_HORDE && m_value <= -m_maxValue) return false; - if(fact_diff < -m_ShiftMaxCaptureSpeed) - fact_diff = -m_ShiftMaxCaptureSpeed; + if(fact_diff < -maxDiff) + fact_diff = -maxDiff; Challenger = HORDE; } else { // ally is in majority, but it's already ally-controlled -> no change - if(m_State == OBJECTIVESTATE_ALLIANCE && m_ShiftPhase >= m_ShiftMaxPhase) + if(m_State == OBJECTIVESTATE_ALLIANCE && m_value >= m_maxValue) return false; - if(fact_diff > m_ShiftMaxCaptureSpeed) - fact_diff = m_ShiftMaxCaptureSpeed; + if(fact_diff > maxDiff) + fact_diff = maxDiff; Challenger = ALLIANCE; } - m_OldPhase = m_ShiftPhase; + m_oldValue = m_value; m_OldState = m_State; - m_ShiftPhase += fact_diff; + m_value += fact_diff; - // check limits, these are over the grey part - if(m_ShiftPhase < -m_ShiftMaxPhase * (float)(m_NeutralValue) / 100.0f) + if(m_value < -m_minValue) // red { - if(m_ShiftPhase < -m_ShiftMaxPhase) - m_ShiftPhase = -m_ShiftMaxPhase; + if(m_value < -m_maxValue) + m_value = -m_maxValue; m_State = OBJECTIVESTATE_HORDE; - return true; } - else if(m_ShiftPhase > m_ShiftMaxPhase * (float)(m_NeutralValue) / 100.0f) + else if(m_value > m_minValue) // blue { - if(m_ShiftPhase > m_ShiftMaxPhase) - m_ShiftPhase = m_ShiftMaxPhase; + if(m_value > m_maxValue) + m_value = m_maxValue; m_State = OBJECTIVESTATE_ALLIANCE; - return true; } - - if(m_OldPhase*m_ShiftPhase <=0) + else if(m_oldValue * m_value <= 0) // grey, go through mid point { - // gone through neutral // if challenger is ally, then n->a challenge if(Challenger == ALLIANCE) m_State = OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE; @@ -337,7 +355,7 @@ bool OPvPCapturePoint::Update(uint32 diff) else if(Challenger == HORDE) m_State = OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE; } - else + else // grey, did not go through mid point { // old phase and current are on the same side, so one team challenges the other if(Challenger == ALLIANCE && (m_OldState == OBJECTIVESTATE_HORDE || m_OldState == OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE)) @@ -346,9 +364,12 @@ bool OPvPCapturePoint::Update(uint32 diff) m_State = OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE; } - if(m_ShiftPhase != m_OldPhase) + if(m_value != m_oldValue) SendChangePhase(); + //if(m_OldState != m_State) + // sLog.outError("%u->%u", m_OldState, m_State); + return m_OldState != m_State; } @@ -569,6 +590,11 @@ void OutdoorPvP::OnGameObjectCreate(GameObject *go, bool add) return; for(OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) + { if((*itr)->m_CapturePointGUID == go->GetDBTableGUIDLow()) + { (*itr)->m_capturePoint = add ? go : NULL; + break; + } + } } diff --git a/src/game/OutdoorPvP.h b/src/game/OutdoorPvP.h index e9b6c8ec407..4d7eeea171c 100644 --- a/src/game/OutdoorPvP.h +++ b/src/game/OutdoorPvP.h @@ -80,9 +80,9 @@ public: virtual void FillInitialWorldStates(WorldPacket & data) {} // send world state update to all players present - virtual void SendUpdateWorldState(uint32 field, uint32 value); + void SendUpdateWorldState(uint32 field, uint32 value); // send kill notify to players in the controlling faction - virtual void SendObjectiveComplete(uint32 id, uint64 guid); + void SendObjectiveComplete(uint32 id, uint64 guid); // used when player is activated/inactivated in the area virtual bool HandlePlayerEnter(Player * plr); @@ -98,7 +98,7 @@ public: // returns true if the state of the objective has changed, in this case, the OutdoorPvP must send a world state ui update. virtual bool Update(uint32 diff); virtual void ChangeState() = 0; - virtual void SendChangePhase() {} + virtual void SendChangePhase(); virtual bool HandleGossipOption(Player *plr, uint64 guid, uint32 gossipid); @@ -128,18 +128,19 @@ protected: // active players in the area of the objective, 0 - alliance, 1 - horde PlayerSet m_activePlayers[2]; // total shift needed to capture the objective - float m_ShiftMaxPhase; + float m_maxValue; + float m_minValue; // maximum speed of capture - float m_ShiftMaxCaptureSpeed; + float m_maxSpeed; // the status of the objective - float m_ShiftPhase; + float m_value; // phase before update, used to check which faction is in conquer / control - float m_OldPhase; + float m_oldValue; // objective states uint32 m_OldState; uint32 m_State; // neutral value on capture bar - uint32 m_NeutralValue; + uint32 m_neutralValuePct; // pointer to the OutdoorPvP this objective belongs to OutdoorPvP* m_PvP; diff --git a/src/game/OutdoorPvPEP.cpp b/src/game/OutdoorPvPEP.cpp index db4cfd94917..1ba2f7fcfa0 100644 --- a/src/game/OutdoorPvPEP.cpp +++ b/src/game/OutdoorPvPEP.cpp @@ -37,7 +37,7 @@ OPvPCapturePointEP_EWT::OPvPCapturePointEP_EWT(OutdoorPvP *pvp) void OPvPCapturePointEP_EWT::ChangeState() { - if(fabs(m_ShiftPhase) == m_ShiftMaxPhase) // state won't change, only phase when maxed out! + if(fabs(m_value) == m_maxValue) // state won't change, only phase when maxed out! { // if changing from controlling alliance to horde or vice versa if( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) @@ -56,7 +56,7 @@ void OPvPCapturePointEP_EWT::ChangeState() switch(m_State) { case OBJECTIVESTATE_ALLIANCE: - if(m_ShiftPhase == m_ShiftMaxPhase) + if(m_value == m_maxValue) m_TowerState = EP_TS_A; else m_TowerState = EP_TS_A_P; @@ -66,7 +66,7 @@ void OPvPCapturePointEP_EWT::ChangeState() if(m_OldState != m_State) sWorld.SendZoneText(EP_GraveYardZone,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_EWT_A)); break; case OBJECTIVESTATE_HORDE: - if(m_ShiftPhase == -m_ShiftMaxPhase) + if(m_value == -m_maxValue) m_TowerState = EP_TS_H; else m_TowerState = EP_TS_H_P; @@ -115,10 +115,10 @@ void OPvPCapturePointEP_EWT::SendChangePhase() // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } void OPvPCapturePointEP_EWT::FillInitialWorldStates(WorldPacket &data) @@ -148,9 +148,9 @@ bool OPvPCapturePointEP_EWT::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); return true; } return false; @@ -191,7 +191,7 @@ OPvPCapturePointEP_NPT::OPvPCapturePointEP_NPT(OutdoorPvP *pvp) void OPvPCapturePointEP_NPT::ChangeState() { - if(fabs(m_ShiftPhase) == m_ShiftMaxPhase) // state won't change, only phase when maxed out! + if(fabs(m_value) == m_maxValue) // state won't change, only phase when maxed out! { // if changing from controlling alliance to horde or vice versa if( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) @@ -210,7 +210,7 @@ void OPvPCapturePointEP_NPT::ChangeState() switch(m_State) { case OBJECTIVESTATE_ALLIANCE: - if(m_ShiftPhase == m_ShiftMaxPhase) + if(m_value == m_maxValue) m_TowerState = EP_TS_A; else m_TowerState = EP_TS_A_P; @@ -220,7 +220,7 @@ void OPvPCapturePointEP_NPT::ChangeState() if(m_OldState != m_State) sWorld.SendZoneText(EP_GraveYardZone,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_NPT_A)); break; case OBJECTIVESTATE_HORDE: - if(m_ShiftPhase == -m_ShiftMaxPhase) + if(m_value == -m_maxValue) m_TowerState = EP_TS_H; else m_TowerState = EP_TS_H_P; @@ -270,10 +270,10 @@ void OPvPCapturePointEP_NPT::SendChangePhase() // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } void OPvPCapturePointEP_NPT::FillInitialWorldStates(WorldPacket &data) @@ -303,9 +303,9 @@ bool OPvPCapturePointEP_NPT::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); return true; } return false; @@ -340,7 +340,7 @@ OPvPCapturePointEP_CGT::OPvPCapturePointEP_CGT(OutdoorPvP *pvp) void OPvPCapturePointEP_CGT::ChangeState() { - if(fabs(m_ShiftPhase) == m_ShiftMaxPhase) // state won't change, only phase when maxed out! + if(fabs(m_value) == m_maxValue) // state won't change, only phase when maxed out! { // if changing from controlling alliance to horde or vice versa if( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) @@ -359,7 +359,7 @@ void OPvPCapturePointEP_CGT::ChangeState() switch(m_State) { case OBJECTIVESTATE_ALLIANCE: - if(m_ShiftPhase == m_ShiftMaxPhase) + if(m_value == m_maxValue) m_TowerState = EP_TS_A; else m_TowerState = EP_TS_A_P; @@ -369,7 +369,7 @@ void OPvPCapturePointEP_CGT::ChangeState() if(m_OldState != m_State) sWorld.SendZoneText(EP_GraveYardZone,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_CGT_A)); break; case OBJECTIVESTATE_HORDE: - if(m_ShiftPhase == -m_ShiftMaxPhase) + if(m_value == -m_maxValue) m_TowerState = EP_TS_H; else m_TowerState = EP_TS_H_P; @@ -417,10 +417,10 @@ void OPvPCapturePointEP_CGT::SendChangePhase() // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } void OPvPCapturePointEP_CGT::FillInitialWorldStates(WorldPacket &data) @@ -450,9 +450,9 @@ bool OPvPCapturePointEP_CGT::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); return true; } return false; @@ -484,7 +484,7 @@ OPvPCapturePointEP_PWT::OPvPCapturePointEP_PWT(OutdoorPvP *pvp) void OPvPCapturePointEP_PWT::ChangeState() { - if(fabs(m_ShiftPhase) == m_ShiftMaxPhase) // state won't change, only phase when maxed out! + if(fabs(m_value) == m_maxValue) // state won't change, only phase when maxed out! { // if changing from controlling alliance to horde or vice versa if( m_OldState == OBJECTIVESTATE_ALLIANCE && m_OldState != m_State ) @@ -503,7 +503,7 @@ void OPvPCapturePointEP_PWT::ChangeState() switch(m_State) { case OBJECTIVESTATE_ALLIANCE: - if(m_ShiftPhase == m_ShiftMaxPhase) + if(m_value == m_maxValue) m_TowerState = EP_TS_A; else m_TowerState = EP_TS_A_P; @@ -513,7 +513,7 @@ void OPvPCapturePointEP_PWT::ChangeState() if(m_OldState != m_State) sWorld.SendZoneText(EP_GraveYardZone,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_PWT_A)); break; case OBJECTIVESTATE_HORDE: - if(m_ShiftPhase == -m_ShiftMaxPhase) + if(m_value == -m_maxValue) m_TowerState = EP_TS_H; else m_TowerState = EP_TS_H_P; @@ -563,10 +563,10 @@ void OPvPCapturePointEP_PWT::SendChangePhase() // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); // send this too, sometimes it resets :S - SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); } void OPvPCapturePointEP_PWT::FillInitialWorldStates(WorldPacket &data) @@ -596,9 +596,9 @@ bool OPvPCapturePointEP_PWT::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); - plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_NeutralValue); + plr->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); return true; } return false; diff --git a/src/game/OutdoorPvPHP.cpp b/src/game/OutdoorPvPHP.cpp index 97a912e3b45..4adb9541053 100644 --- a/src/game/OutdoorPvPHP.cpp +++ b/src/game/OutdoorPvPHP.cpp @@ -268,9 +268,9 @@ void OPvPCapturePointHP::ChangeState() void OPvPCapturePointHP::SendChangePhase() { - SendUpdateWorldState(HP_UI_TOWER_SLIDER_N, m_NeutralValue); + SendUpdateWorldState(HP_UI_TOWER_SLIDER_N, m_neutralValuePct); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(HP_UI_TOWER_SLIDER_POS, phase); // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(HP_UI_TOWER_SLIDER_DISPLAY, 1); @@ -308,9 +308,9 @@ bool OPvPCapturePointHP::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_POS, phase); - plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_N, m_NeutralValue); + plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_N, m_neutralValuePct); return true; } return false; diff --git a/src/game/OutdoorPvPNA.cpp b/src/game/OutdoorPvPNA.cpp index d93cea4b3f8..e4d78e4d717 100644 --- a/src/game/OutdoorPvPNA.cpp +++ b/src/game/OutdoorPvPNA.cpp @@ -188,9 +188,9 @@ bool OPvPCapturePointNA::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_POS, phase); - plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_N, m_NeutralValue); + plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_N, m_neutralValuePct); return true; } return false; @@ -619,9 +619,9 @@ void OPvPCapturePointNA::SendChangePhase() // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(NA_UI_TOWER_SLIDER_DISPLAY, 1); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(NA_UI_TOWER_SLIDER_POS, phase); - SendUpdateWorldState(NA_UI_TOWER_SLIDER_N, m_NeutralValue); + SendUpdateWorldState(NA_UI_TOWER_SLIDER_N, m_neutralValuePct); } void OPvPCapturePointNA::UpdateHalaaWorldState() diff --git a/src/game/OutdoorPvPTF.cpp b/src/game/OutdoorPvPTF.cpp index 01fc9a10386..2b16d11ef73 100644 --- a/src/game/OutdoorPvPTF.cpp +++ b/src/game/OutdoorPvPTF.cpp @@ -104,9 +104,9 @@ bool OPvPCapturePointTF::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(TF_UI_TOWER_SLIDER_DISPLAY, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(TF_UI_TOWER_SLIDER_POS, phase); - plr->SendUpdateWorldState(TF_UI_TOWER_SLIDER_N, m_NeutralValue); + plr->SendUpdateWorldState(TF_UI_TOWER_SLIDER_N, m_neutralValuePct); return true; } return false; @@ -301,9 +301,9 @@ void OPvPCapturePointTF::SendChangePhase() // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(TF_UI_TOWER_SLIDER_DISPLAY, 1); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(TF_UI_TOWER_SLIDER_POS, phase); // send this too, sometimes it resets :S - SendUpdateWorldState(TF_UI_TOWER_SLIDER_N, m_NeutralValue); + SendUpdateWorldState(TF_UI_TOWER_SLIDER_N, m_neutralValuePct); } diff --git a/src/game/OutdoorPvPZM.cpp b/src/game/OutdoorPvPZM.cpp index c3861e7a7ec..b2b717e06c4 100644 --- a/src/game/OutdoorPvPZM.cpp +++ b/src/game/OutdoorPvPZM.cpp @@ -57,9 +57,9 @@ bool OPvPCapturePointZM_Beacon::HandlePlayerEnter(Player *plr) if(OPvPCapturePoint::HandlePlayerEnter(plr)) { plr->SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_disp, 1); - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); plr->SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_pos, phase); - plr->SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_n, m_NeutralValue); + plr->SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_n, m_neutralValuePct); return true; } return false; @@ -119,9 +119,9 @@ void OPvPCapturePointZM_Beacon::SendChangePhase() // send this too, sometimes the slider disappears, dunno why :( SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_disp, 1); // send these updates to only the ones in this objective - uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f); + uint32 phase = (uint32)ceil(( m_value + m_maxValue) / ( 2 * m_maxValue ) * 100.0f); SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_pos, phase); - SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_n, m_NeutralValue); + SendUpdateWorldState(ZMBeaconInfo[m_TowerType].slider_n, m_neutralValuePct); } bool OutdoorPvPZM::Update(uint32 diff) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index d9ffdab5365..edf557b46f6 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -6544,7 +6544,7 @@ void Player::CheckDuelDistance(time_t currTime) bool Player::IsOutdoorPvPActive() { - return (isAlive() && !HasInvisibilityAura() && !HasStealthAura() && (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP) || sWorld.IsPvPRealm()) && !HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && !isInFlight()); + return (isAlive() && !HasInvisibilityAura() && !HasStealthAura() && (IsPvP() || sWorld.IsPvPRealm()) && !HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && !isInFlight()); } void Player::DuelComplete(DuelCompleteType type) diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp index 96be1ad8121..fa1c507ac73 100644 --- a/src/game/Wintergrasp.cpp +++ b/src/game/Wintergrasp.cpp @@ -25,10 +25,16 @@ typedef uint32 TeamPair[2]; +enum CreatureEntry +{ + CRE_ENG_A = 30499, + CRE_ENG_H = 30400, +}; + const TeamPair CreatureEntryPair[] = { {30739, 30740}, - {30400, 30499}, + //{30400, 30499}, {0,0} }; @@ -56,39 +62,69 @@ typedef std::list<const AreaPOIEntry *> AreaPOIList; SiegeWorkshop::SiegeWorkshop(OPvPWintergrasp *opvp, BuildingState *state) : OPvPCapturePoint(opvp), m_buildingState(state), m_wintergrasp(opvp) -, m_vehNum(0) +, m_vehNum(0), m_engineer(NULL), m_engGuid(0) { } -void SiegeWorkshop::ChangeState() +void SiegeWorkshop::SetStateByBuildingState() { - Creature *creature = ObjectAccessor::GetObjectInWorld(m_Creatures[0], (Creature*)NULL); - if(!creature) - return; + if(m_buildingState->team == TEAM_ALLIANCE) + { + m_value = m_maxValue; + m_State = OBJECTIVESTATE_ALLIANCE; + } + else if(m_buildingState->team == TEAM_HORDE) + { + m_value = -m_maxValue; + m_State = OBJECTIVESTATE_HORDE; + } + else + { + m_value = 0; + m_State = OBJECTIVESTATE_NEUTRAL; + } + ChangeState(); + SendChangePhase(); +} + +void SiegeWorkshop::ChangeState() +{ uint32 entry = 0; - if(m_State == OBJECTIVESTATE_ALLIANCE) + if(m_State == OBJECTIVESTATE_ALLIANCE) // to do m_buildingState->team == TEAM_ALLIANCE; { m_buildingState->team = TEAM_ALLIANCE; - entry = 30499; + entry = CRE_ENG_A; } else if(m_State == OBJECTIVESTATE_HORDE) { m_buildingState->team = TEAM_HORDE; - entry = 30400; + entry = CRE_ENG_H; } else return; + *m_engEntry = entry; + + // TODO: this may be sent twice m_wintergrasp->BroadcastStateChange(m_buildingState); - if(entry != creature->GetEntry()) + // 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_engineer) { - creature->SetOriginalEntry(entry); - creature->Respawn(true); + m_engineer->SetOriginalEntry(entry); + if(entry != m_engineer->GetEntry() || !m_engineer->isAlive()) + m_engineer->Respawn(true); } - else if(!creature->isAlive()) - creature->Respawn(true); + + sLog.outDebug("Wintergrasp workshop now belongs to %u.", (uint32)m_buildingState->team); } bool OPvPWintergrasp::SetupOutdoorPvP() @@ -156,7 +192,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP() areaPOIs.erase(poi); //disable for now - continue; + //continue; // add capture point uint32 capturePointEntry = 0; @@ -184,7 +220,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP() QueryResult *result = WorldDatabase.PQuery("SELECT `guid` FROM `creature`" " WHERE `creature`.`map`=571" - " AND `creature`.`id` IN (30400, 30499);"); + " AND `creature`.`id` IN (%u, %u);", CRE_ENG_A, CRE_ENG_H); if(!result) { @@ -217,16 +253,24 @@ bool OPvPWintergrasp::SetupOutdoorPvP() } SiegeWorkshop *workshop = new SiegeWorkshop(this, m_buildingStates[guid]); - if(!workshop->AddCapturePoint(capturePointEntry, goData->id, goData->posX, goData->posY, goData->posZ)) + if(!workshop->AddCapturePoint(capturePointEntry, goData->mapid, goData->posX, goData->posY, goData->posZ)) { delete workshop; sLog.outError("Cannot add capture point!"); continue; } + const CreatureData *creData = objmgr.GetCreatureData(engGuid); + if(!creData) + continue; + + workshop->m_engEntry = const_cast<uint32*>(&creData->id); + const_cast<CreatureData*>(creData)->displayid = 0; workshop->AddGO(0, guid, goData->id); - workshop->AddCre(0, engGuid); + workshop->m_engGuid = engGuid; + //workshop->AddCre(0, engGuid, creData->id); + //sLog.outDebug("Demolisher Engineerer lowguid %u is linked to workshop lowguid %u.", engGuid, guid); m_capturePoints.push_back(workshop); - workshop->ChangeState(); + workshop->SetStateByBuildingState(); } }while(result->NextRow()); delete result; @@ -286,7 +330,8 @@ uint32 OPvPWintergrasp::GetCreatureEntry(uint32 guidlow, const CreatureData *dat void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add) { - if(creature->isVehicle()) + uint32 entry = creature->GetEntry(); + if(creature->isVehicle()) // vehicles { TeamId team; if(creature->getFaction() == WintergraspFaction[TEAM_ALLIANCE]) @@ -296,7 +341,7 @@ void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add) else return; - switch(creature->GetEntry()) + switch(entry) { case 27881: case 28094: @@ -322,11 +367,21 @@ void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add) break; } } - else if(m_creEntryPair.find(creature->GetEntry()) != m_creEntryPair.end()) + else if(m_creEntryPair.find(entry) != m_creEntryPair.end()) // guards and npc { if(add) m_creatures.insert(creature); else m_creatures.erase(creature); } + else if(entry == CRE_ENG_A || entry == CRE_ENG_H) // demolisher engineers + { + for(OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) + if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(*itr)) + if(workshop->m_engGuid == creature->GetDBTableGUIDLow()) + { + workshop->m_engineer = add ? creature : NULL; + break; + } + } } void OPvPWintergrasp::OnGameObjectCreate(GameObject *go, bool add) @@ -361,13 +416,19 @@ void OPvPWintergrasp::OnGameObjectCreate(GameObject *go, bool add) void OPvPWintergrasp::UpdateAllWorldObject() { + // update cre and go factions for(GameObjectSet::iterator itr = m_gobjects.begin(); itr != m_gobjects.end(); ++itr) UpdateGameObjectInfo(*itr); for(CreatureSet::iterator itr = m_creatures.begin(); itr != m_creatures.end(); ++itr) UpdateCreatureInfo(*itr); + + // rebuild and update building states RebuildAllBuildings(); - //if(GameObject *obj = ObjectAccessor::GetObjectInWorld( + // update capture points + for(OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) + if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(*itr)) + workshop->SetStateByBuildingState(); SendInitWorldStatesTo(); } @@ -571,7 +632,12 @@ void OPvPWintergrasp::VehicleCastSpell(TeamId team, int32 spellId) bool OPvPWintergrasp::Update(uint32 diff) { if(m_timer > diff) + { m_timer -= diff; + + if(m_wartime) + OutdoorPvP::Update(diff); // update capture points + } else { if(m_wartime) diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h index 8b18061845a..47cc7b4132f 100644 --- a/src/game/Wintergrasp.h +++ b/src/game/Wintergrasp.h @@ -166,11 +166,15 @@ class SiegeWorkshop : public OPvPCapturePoint { public: explicit SiegeWorkshop(OPvPWintergrasp *opvp, BuildingState *state); + void SetStateByBuildingState(); void ChangeState(); + uint32 m_vehNum; + uint32 *m_engEntry; + uint32 m_engGuid; + Creature *m_engineer; protected: BuildingState *m_buildingState; OPvPWintergrasp *m_wintergrasp; - uint32 m_vehNum; }; #endif |