*Display worldstate in wintergrasp.
--HG-- branch : trunk
This commit is contained in:
@@ -62,14 +62,17 @@ bool GossipHello_npc_demolisher_engineerer(Player* pPlayer, Creature* pCreature)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GossipSelect_npc_demolisher_engineerer(Player* pPlayer, Creature* me, uint32 uiSender, uint32 uiAction)
|
||||
bool GossipSelect_npc_demolisher_engineerer(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
|
||||
{
|
||||
pPlayer->CLOSE_GOSSIP_MENU();
|
||||
switch(uiAction - GOSSIP_ACTION_INFO_DEF)
|
||||
if(pPlayer->isGameMaster() || pCreature->GetZoneScript() && pCreature->GetZoneScript()->GetData(pCreature->GetDBTableGUIDLow()))
|
||||
{
|
||||
case 0: pPlayer->CastSpell(pPlayer, 56663, false, NULL, NULL, me->GetGUID()); break;
|
||||
case 1: pPlayer->CastSpell(pPlayer, 56575, false, NULL, NULL, me->GetGUID()); break;
|
||||
case 2: pPlayer->CastSpell(pPlayer, pPlayer->GetTeamId() ? 61408 : 56661, false, NULL, NULL, me->GetGUID()); break;
|
||||
switch(uiAction - GOSSIP_ACTION_INFO_DEF)
|
||||
{
|
||||
case 0: pPlayer->CastSpell(pPlayer, 56663, false, NULL, NULL, pCreature->GetGUID()); break;
|
||||
case 1: pPlayer->CastSpell(pPlayer, 56575, false, NULL, NULL, pCreature->GetGUID()); break;
|
||||
case 2: pPlayer->CastSpell(pPlayer, pPlayer->GetTeamId() ? 61408 : 56661, false, NULL, NULL, pCreature->GetGUID()); break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -85,4 +88,4 @@ void AddSC_wintergrasp()
|
||||
newscript->pGossipHello = &GossipHello_npc_demolisher_engineerer;
|
||||
newscript->pGossipSelect = &GossipSelect_npc_demolisher_engineerer;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
}
|
||||
|
||||
+8
-11
@@ -33,7 +33,7 @@
|
||||
|
||||
OPvPCapturePoint::OPvPCapturePoint(OutdoorPvP * pvp)
|
||||
: 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_State(OBJECTIVESTATE_NEUTRAL), m_OldState(OBJECTIVESTATE_NEUTRAL), m_CapturePointGUID(0), m_neutralValuePct(0),
|
||||
m_maxSpeed(0), m_capturePoint(NULL)
|
||||
{
|
||||
}
|
||||
@@ -225,7 +225,7 @@ void OutdoorPvP::DeleteSpawns()
|
||||
itr->second->DeleteSpawns();
|
||||
}
|
||||
|
||||
OutdoorPvP::OutdoorPvP()
|
||||
OutdoorPvP::OutdoorPvP() : m_sendUpdate(true)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -375,13 +375,10 @@ bool OPvPCapturePoint::Update(uint32 diff)
|
||||
|
||||
void OutdoorPvP::SendUpdateWorldState(uint32 field, uint32 value)
|
||||
{
|
||||
// send to both factions
|
||||
for(int i = 0; i < 2; ++i)
|
||||
{
|
||||
// send to all players present in the area
|
||||
for(PlayerSet::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr)
|
||||
(*itr)->SendUpdateWorldState(field,value);
|
||||
}
|
||||
if(m_sendUpdate)
|
||||
for(int i = 0; i < 2; ++i)
|
||||
for(PlayerSet::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr)
|
||||
(*itr)->SendUpdateWorldState(field, value);
|
||||
}
|
||||
|
||||
void OPvPCapturePoint::SendUpdateWorldState(uint32 field, uint32 value)
|
||||
@@ -545,11 +542,11 @@ bool OutdoorPvP::HandleAreaTrigger(Player *plr, uint32 trigger)
|
||||
return false;
|
||||
}
|
||||
|
||||
void OutdoorPvP::BroadcastPacket(WorldPacket &data)
|
||||
void OutdoorPvP::BroadcastPacket(WorldPacket &data) const
|
||||
{
|
||||
// This is faster than sWorld.SendZoneMessage
|
||||
for(uint32 team = 0; team < 2; ++team)
|
||||
for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
|
||||
for(PlayerSet::const_iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
|
||||
(*itr)->GetSession()->SendPacket(&data);
|
||||
}
|
||||
|
||||
|
||||
+17
-4
@@ -36,6 +36,17 @@ enum OutdoorPvPTypes
|
||||
OPVP_WINTERGRASP,
|
||||
};
|
||||
|
||||
enum ObjectiveStates
|
||||
{
|
||||
OBJECTIVESTATE_NEUTRAL = 0,
|
||||
OBJECTIVESTATE_ALLIANCE,
|
||||
OBJECTIVESTATE_HORDE,
|
||||
OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE,
|
||||
OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE,
|
||||
OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE,
|
||||
OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE,
|
||||
};
|
||||
|
||||
// struct for go spawning
|
||||
struct go_type{
|
||||
uint32 entry;
|
||||
@@ -137,8 +148,8 @@ protected:
|
||||
// phase before update, used to check which faction is in conquer / control
|
||||
float m_oldValue;
|
||||
// objective states
|
||||
uint32 m_OldState;
|
||||
uint32 m_State;
|
||||
ObjectiveStates m_OldState;
|
||||
ObjectiveStates m_State;
|
||||
// neutral value on capture bar
|
||||
uint32 m_neutralValuePct;
|
||||
|
||||
@@ -182,7 +193,7 @@ public:
|
||||
void OnCreatureCreate(Creature *, bool add) {}
|
||||
|
||||
// send world state update to all players present
|
||||
virtual void SendUpdateWorldState(uint32 field, uint32 value);
|
||||
void SendUpdateWorldState(uint32 field, uint32 value);
|
||||
|
||||
// called by OutdoorPvPMgr, updates the objectives and if needed, sends new worldstateui information
|
||||
virtual bool Update(uint32 diff);
|
||||
@@ -213,10 +224,12 @@ protected:
|
||||
PlayerSet m_players[2];
|
||||
uint32 m_TypeId;
|
||||
|
||||
bool m_sendUpdate;
|
||||
|
||||
// world state stuff
|
||||
virtual void SendRemoveWorldStates(Player * plr) {}
|
||||
|
||||
void BroadcastPacket(WorldPacket & data);
|
||||
void BroadcastPacket(WorldPacket & data) const;
|
||||
|
||||
virtual void HandlePlayerEnterZone(Player * plr, uint32 zone);
|
||||
virtual void HandlePlayerLeaveZone(Player * plr, uint32 zone);
|
||||
|
||||
@@ -25,15 +25,4 @@
|
||||
|
||||
#define OTHER_TEAM(a) (a == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE)
|
||||
|
||||
enum ObjectiveStates
|
||||
{
|
||||
OBJECTIVESTATE_NEUTRAL = 0,
|
||||
OBJECTIVESTATE_ALLIANCE,
|
||||
OBJECTIVESTATE_HORDE,
|
||||
OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE,
|
||||
OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE,
|
||||
OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE,
|
||||
OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+137
-57
@@ -75,6 +75,10 @@ typedef std::list<const AreaPOIEntry *> AreaPOIList;
|
||||
bool OPvPWintergrasp::SetupOutdoorPvP()
|
||||
{
|
||||
m_defender = TeamId(rand()%2);
|
||||
m_changeDefender = false;
|
||||
|
||||
m_workshopCount[TEAM_ALLIANCE] = 0;
|
||||
m_workshopCount[TEAM_HORDE] = 0;
|
||||
|
||||
// Load buildings
|
||||
AreaPOIList areaPOIs;
|
||||
@@ -217,7 +221,7 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
|
||||
//sLog.outDebug("Demolisher Engineerer lowguid %u is linked to workshop lowguid %u.", engGuid, guid);
|
||||
AddCapturePoint(workshop);
|
||||
m_buildingStates[guid]->type = BUILDING_WORKSHOP;
|
||||
workshop->SetStateByBuildingState();
|
||||
workshop->SetTeamByBuildingState();
|
||||
}
|
||||
}while(result->NextRow());
|
||||
delete result;
|
||||
@@ -245,7 +249,10 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
|
||||
if(eventId == 19982)
|
||||
{
|
||||
if(m_wartime)
|
||||
ChangeDefender();
|
||||
{
|
||||
m_changeDefender = true;
|
||||
m_timer = 0;
|
||||
}
|
||||
}
|
||||
else if(obj->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
|
||||
{
|
||||
@@ -255,16 +262,35 @@ void OPvPWintergrasp::ProcessEvent(GameObject *obj, uint32 eventId)
|
||||
if(obj->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED))
|
||||
itr->second->damageState = DAMAGE_DAMAGED;
|
||||
else
|
||||
{
|
||||
itr->second->damageState = DAMAGE_DESTROYED;
|
||||
BroadcastStateChange(itr->second);
|
||||
|
||||
if(itr->second->type == BUILDING_WORKSHOP)
|
||||
if(SiegeWorkshop *workshop = GetWorkshop(obj->GetDBTableGUIDLow()))
|
||||
workshop->DespawnAllVehicles();
|
||||
if(itr->second->type == BUILDING_WORKSHOP)
|
||||
{
|
||||
if(SiegeWorkshop *workshop = GetWorkshop(obj->GetDBTableGUIDLow()))
|
||||
workshop->DespawnAllVehicles();
|
||||
ModifyWorkshopCount(itr->second->team, false);
|
||||
}
|
||||
}
|
||||
|
||||
BroadcastStateChange(itr->second);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::ModifyWorkshopCount(TeamId team, bool add)
|
||||
{
|
||||
return;
|
||||
if(add)
|
||||
++m_workshopCount[team];
|
||||
else if(m_workshopCount[team])
|
||||
--m_workshopCount[team];
|
||||
else
|
||||
sLog.outError("OPvPWintergrasp::ModifyWorkshopCount: negative workshop count!");
|
||||
|
||||
SendUpdateWorldState(MaxVehNumWorldState[team], m_workshopCount[team] * MAX_VEHICLE_PER_WORKSHOP);
|
||||
}
|
||||
|
||||
uint32 OPvPWintergrasp::GetCreatureEntry(uint32 guidlow, const CreatureData *data)
|
||||
{
|
||||
if(m_defender == TEAM_ALLIANCE)
|
||||
@@ -335,6 +361,7 @@ void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add)
|
||||
}
|
||||
else
|
||||
m_vehicles[team].erase((Vehicle*)creature);
|
||||
SendUpdateWorldState(VehNumWorldState[team], m_vehicles[team].size());
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -399,14 +426,12 @@ void OPvPWintergrasp::UpdateAllWorldObject()
|
||||
// update capture points
|
||||
for(OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
|
||||
if(SiegeWorkshop *workshop = dynamic_cast<SiegeWorkshop*>(itr->second))
|
||||
workshop->SetStateByBuildingState();
|
||||
|
||||
SendInitWorldStatesTo();
|
||||
workshop->SetTeamByBuildingState();
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::RebuildAllBuildings()
|
||||
{
|
||||
for(BuildingStateMap::iterator itr = m_buildingStates.begin(); itr != m_buildingStates.end(); ++itr)
|
||||
for(BuildingStateMap::const_iterator itr = m_buildingStates.begin(); itr != m_buildingStates.end(); ++itr)
|
||||
{
|
||||
if(itr->second->building)
|
||||
{
|
||||
@@ -418,50 +443,65 @@ void OPvPWintergrasp::RebuildAllBuildings()
|
||||
|
||||
itr->second->damageState = DAMAGE_INTACT;
|
||||
itr->second->team = m_defender == TEAM_ALLIANCE ? OTHER_TEAM(itr->second->defaultTeam) : itr->second->defaultTeam;
|
||||
|
||||
if(itr->second->type == BUILDING_WORKSHOP)
|
||||
ModifyWorkshopCount(itr->second->team, true);
|
||||
}
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::SendInitWorldStatesTo(Player *player)
|
||||
void OPvPWintergrasp::SendInitWorldStatesTo(Player *player) const
|
||||
{
|
||||
WorldPacket data(SMSG_INIT_WORLD_STATES, (4+4+4+2+(m_buildingStates.size()*8)));
|
||||
data << uint32(571);
|
||||
data << uint32(ZONE_WINTERGRASP);
|
||||
data << uint32(0);
|
||||
data << uint16(m_buildingStates.size());
|
||||
for(BuildingStateMap::iterator itr = m_buildingStates.begin(); itr != m_buildingStates.end(); ++itr)
|
||||
data << uint16(4+5+4+m_buildingStates.size());
|
||||
|
||||
data << uint32(3803) << uint32(m_defender == TEAM_ALLIANCE ? 1 : 0);
|
||||
data << uint32(3802) << uint32(m_defender != TEAM_ALLIANCE ? 1 : 0);
|
||||
data << uint32(3801) << uint32(m_wartime ? 0 : 1);
|
||||
data << uint32(3710) << uint32(m_wartime ? 1 : 0);
|
||||
|
||||
for(uint32 i = 0; i < 5; ++i)
|
||||
data << ClockWorldState[i] << m_clock[i];
|
||||
|
||||
data << uint32(3490) << uint32(m_vehicles[TEAM_HORDE].size());
|
||||
data << uint32(3491) << m_workshopCount[TEAM_HORDE] * MAX_VEHICLE_PER_WORKSHOP;
|
||||
data << uint32(3680) << uint32(m_vehicles[TEAM_ALLIANCE].size());
|
||||
data << uint32(3681) << m_workshopCount[TEAM_ALLIANCE] * MAX_VEHICLE_PER_WORKSHOP;
|
||||
|
||||
for(BuildingStateMap::const_iterator itr = m_buildingStates.begin(); itr != m_buildingStates.end(); ++itr)
|
||||
itr->second->FillData(data);
|
||||
|
||||
if(player)
|
||||
player->GetSession()->SendPacket(&data);
|
||||
else
|
||||
BroadcastPacket(data);
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::BroadcastStateChange(BuildingState *state)
|
||||
void OPvPWintergrasp::BroadcastStateChange(BuildingState *state) const
|
||||
{
|
||||
for(uint32 team = 0; team < 2; ++team)
|
||||
for(PlayerSet::iterator p_itr = m_players[team].begin(); p_itr != m_players[team].end(); ++p_itr)
|
||||
state->SendUpdate(*p_itr);
|
||||
if(m_sendUpdate)
|
||||
for(uint32 team = 0; team < 2; ++team)
|
||||
for(PlayerSet::const_iterator p_itr = m_players[team].begin(); p_itr != m_players[team].end(); ++p_itr)
|
||||
state->SendUpdate(*p_itr);
|
||||
}
|
||||
|
||||
bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature)
|
||||
bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature) const
|
||||
{
|
||||
TeamPairMap::const_iterator itr = m_creEntryPair.find(creature->GetCreatureData()->id);
|
||||
if(itr != m_creEntryPair.end())
|
||||
{
|
||||
uint32 entry = m_defender == TEAM_ALLIANCE ? itr->second : itr->first;
|
||||
if(entry != creature->GetEntry())
|
||||
{
|
||||
creature->SetOriginalEntry(entry);
|
||||
creature->Respawn(true);
|
||||
}
|
||||
else if(!creature->isAlive())
|
||||
creature->SetOriginalEntry(entry);
|
||||
if(entry != creature->GetEntry() || !creature->isAlive())
|
||||
creature->Respawn(true);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool OPvPWintergrasp::UpdateGameObjectInfo(GameObject *go)
|
||||
bool OPvPWintergrasp::UpdateGameObjectInfo(GameObject *go) const
|
||||
{
|
||||
switch(go->GetEntry())
|
||||
{
|
||||
@@ -590,16 +630,38 @@ void OPvPWintergrasp::UpdateTenacityStack()
|
||||
}
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::VehicleCastSpell(TeamId team, int32 spellId)
|
||||
void OPvPWintergrasp::VehicleCastSpell(TeamId team, int32 spellId) const
|
||||
{
|
||||
if(spellId > 0)
|
||||
for(VehicleSet::iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr)
|
||||
for(VehicleSet::const_iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr)
|
||||
(*itr)->CastSpell(*itr, (uint32)spellId, true);
|
||||
else
|
||||
for(VehicleSet::iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr)
|
||||
for(VehicleSet::const_iterator itr = m_vehicles[team].begin(); itr != m_vehicles[team].end(); ++itr)
|
||||
(*itr)->RemoveAura((uint32)-spellId); // by stack?
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::UpdateClockDigit(uint32 &timer, uint32 digit, uint32 mod)
|
||||
{
|
||||
uint32 value = timer%mod;
|
||||
timer /= mod;
|
||||
if(m_clock[digit] != value)
|
||||
{
|
||||
m_clock[digit] = value;
|
||||
SendUpdateWorldState(ClockWorldState[digit], value);
|
||||
}
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::UpdateClock()
|
||||
{
|
||||
uint32 timer = m_timer / 1000;
|
||||
UpdateClockDigit(timer, 0, 10);
|
||||
UpdateClockDigit(timer, 1, 6);
|
||||
UpdateClockDigit(timer, 2, 10);
|
||||
UpdateClockDigit(timer, 3, 6);
|
||||
if(!m_wartime)
|
||||
UpdateClockDigit(timer, 4, 10);
|
||||
}
|
||||
|
||||
bool OPvPWintergrasp::Update(uint32 diff)
|
||||
{
|
||||
if(m_timer > diff)
|
||||
@@ -608,49 +670,50 @@ bool OPvPWintergrasp::Update(uint32 diff)
|
||||
|
||||
if(m_wartime)
|
||||
OutdoorPvP::Update(diff); // update capture points
|
||||
|
||||
UpdateClock();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_sendUpdate = false;
|
||||
|
||||
if(m_wartime)
|
||||
{
|
||||
if(m_defender == TEAM_ALLIANCE)
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has successfully defended the fortress!");
|
||||
if(m_changeDefender)
|
||||
{
|
||||
m_changeDefender = false;
|
||||
m_defender = OTHER_TEAM(m_defender);
|
||||
if(m_defender == TEAM_ALLIANCE)
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has taken over the fortress!");
|
||||
else
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Horde has taken over the fortress!");
|
||||
}
|
||||
else
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Horde has successfully defended the fortress!");
|
||||
GiveReward();
|
||||
{
|
||||
if(m_defender == TEAM_ALLIANCE)
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has successfully defended the fortress!");
|
||||
else
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Horde has successfully defended the fortress!");
|
||||
}
|
||||
|
||||
EndBattle();
|
||||
}
|
||||
else
|
||||
{
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Battle begins!");
|
||||
UpdateAllWorldObject();
|
||||
StartBattle();
|
||||
}
|
||||
|
||||
UpdateAllWorldObject();
|
||||
UpdateClock();
|
||||
|
||||
SendInitWorldStatesTo();
|
||||
m_sendUpdate = true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::ChangeDefender()
|
||||
{
|
||||
m_defender = OTHER_TEAM(m_defender);
|
||||
if(m_defender == TEAM_ALLIANCE)
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Alliance has taken over the fortress!");
|
||||
else
|
||||
sWorld.SendZoneText(ZONE_WINTERGRASP, "Horde has taken over the fortress!");
|
||||
UpdateAllWorldObject();
|
||||
|
||||
GiveReward();
|
||||
EndBattle();
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::GiveReward()
|
||||
{
|
||||
for(uint32 team = 0; team < 2; ++team)
|
||||
for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
|
||||
if((*itr)->HasAura(SPELL_LIEUTENANT))
|
||||
(*itr)->CastSpell(*itr, team == m_defender ? SPELL_VICTORY_REWARD : SPELL_DEFEAT_REWARD, true);
|
||||
}
|
||||
|
||||
void OPvPWintergrasp::StartBattle()
|
||||
{
|
||||
m_wartime = true;
|
||||
@@ -677,6 +740,8 @@ void OPvPWintergrasp::EndBattle()
|
||||
|
||||
for(PlayerSet::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
|
||||
{
|
||||
if((*itr)->HasAura(SPELL_LIEUTENANT))
|
||||
(*itr)->CastSpell(*itr, team == m_defender ? SPELL_VICTORY_REWARD : SPELL_DEFEAT_REWARD, true);
|
||||
REMOVE_RANK_AURAS(*itr);
|
||||
}
|
||||
}
|
||||
@@ -733,7 +798,7 @@ SiegeWorkshop::SiegeWorkshop(OPvPWintergrasp *opvp, BuildingState *state)
|
||||
{
|
||||
}
|
||||
|
||||
void SiegeWorkshop::SetStateByBuildingState()
|
||||
void SiegeWorkshop::SetTeamByBuildingState()
|
||||
{
|
||||
if(m_buildingState->team == TEAM_ALLIANCE)
|
||||
{
|
||||
@@ -751,6 +816,9 @@ void SiegeWorkshop::SetStateByBuildingState()
|
||||
m_State = OBJECTIVESTATE_NEUTRAL;
|
||||
}
|
||||
|
||||
// this will force ChangeState to update workshop count
|
||||
m_buildingState->team = TEAM_NEUTRAL;
|
||||
|
||||
ChangeState();
|
||||
SendChangePhase();
|
||||
}
|
||||
@@ -760,12 +828,24 @@ void SiegeWorkshop::ChangeState()
|
||||
uint32 entry = 0;
|
||||
if(m_State == OBJECTIVESTATE_ALLIANCE) // to do m_buildingState->team == TEAM_ALLIANCE;
|
||||
{
|
||||
m_buildingState->team = TEAM_ALLIANCE;
|
||||
if(m_buildingState->team != TEAM_ALLIANCE)
|
||||
{
|
||||
if(m_buildingState->team == TEAM_HORDE)
|
||||
m_wintergrasp->ModifyWorkshopCount(TEAM_HORDE, false);
|
||||
m_buildingState->team = TEAM_ALLIANCE;
|
||||
m_wintergrasp->ModifyWorkshopCount(TEAM_ALLIANCE, true);
|
||||
}
|
||||
entry = CRE_ENG_A;
|
||||
}
|
||||
else if(m_State == OBJECTIVESTATE_HORDE)
|
||||
{
|
||||
m_buildingState->team = TEAM_HORDE;
|
||||
if(m_buildingState->team != TEAM_HORDE)
|
||||
{
|
||||
if(m_buildingState->team == TEAM_ALLIANCE)
|
||||
m_wintergrasp->ModifyWorkshopCount(TEAM_ALLIANCE, false);
|
||||
m_buildingState->team = TEAM_HORDE;
|
||||
m_wintergrasp->ModifyWorkshopCount(TEAM_HORDE, true);
|
||||
}
|
||||
entry = CRE_ENG_H;
|
||||
}
|
||||
else
|
||||
|
||||
+25
-16
@@ -74,6 +74,10 @@ enum OutdoorPvP_WG_KeepStatus
|
||||
OutdoorPvP_WG_KEEP_STATUS_HORDE_OCCUPIED = 4
|
||||
};
|
||||
|
||||
const uint32 VehNumWorldState[2] = {3680,3490};
|
||||
const uint32 MaxVehNumWorldState[2] = {3681,3491};
|
||||
const uint32 ClockWorldState[5] = {3785,3784,3782,3976,3975};
|
||||
|
||||
enum BuildingType
|
||||
{
|
||||
BUILDING_WALL,
|
||||
@@ -104,12 +108,12 @@ struct BuildingState
|
||||
GameObject *building;
|
||||
BuildingType type;
|
||||
|
||||
void SendUpdate(Player *player)
|
||||
void SendUpdate(Player *player) const
|
||||
{
|
||||
player->SendUpdateWorldState(worldState, AreaPOIIconId[team][damageState]);
|
||||
}
|
||||
|
||||
void FillData(WorldPacket &data)
|
||||
void FillData(WorldPacket &data) const
|
||||
{
|
||||
data << worldState << AreaPOIIconId[team][damageState];
|
||||
}
|
||||
@@ -145,10 +149,12 @@ class OPvPWintergrasp : public OutdoorPvP
|
||||
|
||||
bool Update(uint32 diff);
|
||||
|
||||
void BroadcastStateChange(BuildingState *state);
|
||||
void BroadcastStateChange(BuildingState *state) const;
|
||||
|
||||
uint32 GetData(uint32 id);
|
||||
void SetData(uint32 id, uint32 value);
|
||||
|
||||
void ModifyWorkshopCount(TeamId team, bool add);
|
||||
protected:
|
||||
TeamId m_defender;
|
||||
int32 m_tenacityStack;
|
||||
@@ -162,34 +168,37 @@ class OPvPWintergrasp : public OutdoorPvP
|
||||
TeamPairMap m_creEntryPair, m_goDisplayPair;
|
||||
|
||||
bool m_wartime;
|
||||
bool m_changeDefender;
|
||||
uint32 m_timer;
|
||||
uint32 m_clock[5];
|
||||
uint32 m_workshopCount[2];
|
||||
|
||||
SiegeWorkshop *GetWorkshop(uint32 lowguid) const;
|
||||
SiegeWorkshop *GetWorkshopByEngGuid(uint32 lowguid) const;
|
||||
SiegeWorkshop *GetWorkshopByGOGuid(uint32 lowguid) const;
|
||||
|
||||
void ChangeDefender();
|
||||
|
||||
void UpdateTenacityStack();
|
||||
bool UpdateCreatureInfo(Creature *creature);
|
||||
void UpdateAllWorldObject();
|
||||
bool UpdateGameObjectInfo(GameObject *go);
|
||||
|
||||
void RebuildAllBuildings();
|
||||
void StartBattle();
|
||||
void EndBattle();
|
||||
void GiveReward();
|
||||
|
||||
void VehicleCastSpell(TeamId team, int32 spellId);
|
||||
void UpdateClock();
|
||||
void UpdateClockDigit(uint32 &timer, uint32 digit, uint32 mod);
|
||||
void UpdateTenacityStack();
|
||||
void UpdateAllWorldObject();
|
||||
bool UpdateCreatureInfo(Creature *creature) const;
|
||||
bool UpdateGameObjectInfo(GameObject *go) const;
|
||||
|
||||
void SendInitWorldStatesTo(Player *player = NULL);
|
||||
void RebuildAllBuildings();
|
||||
|
||||
void VehicleCastSpell(TeamId team, int32 spellId) const;
|
||||
|
||||
void SendInitWorldStatesTo(Player *player = NULL) const;
|
||||
};
|
||||
|
||||
class SiegeWorkshop : public OPvPCapturePoint
|
||||
{
|
||||
public:
|
||||
explicit SiegeWorkshop(OPvPWintergrasp *opvp, BuildingState *state);
|
||||
void SetStateByBuildingState();
|
||||
void SetTeamByBuildingState();
|
||||
void ChangeState();
|
||||
void DespawnAllVehicles();
|
||||
|
||||
@@ -200,8 +209,8 @@ class SiegeWorkshop : public OPvPCapturePoint
|
||||
Creature *m_engineer;
|
||||
uint32 m_workshopGuid;
|
||||
VehicleSet m_vehicles;
|
||||
protected:
|
||||
BuildingState *m_buildingState;
|
||||
protected:
|
||||
OPvPWintergrasp *m_wintergrasp;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user