root/trunk/src/game/OutdoorPvPNA.cpp @ 252

Revision 102, 26.5 kB (checked in by yumileroy, 17 years ago)

[svn] Fixed copyright notices to comply with GPL.

Original author: w12x
Date: 2008-10-23 03:29:52-05:00

Line 
1/*
2 * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19#include "OutdoorPvPNA.h"
20#include "Player.h"
21#include "ObjectMgr.h"
22#include "OutdoorPvPMgr.h"
23#include "WorldPacket.h"
24#include "Language.h"
25#include "World.h"
26
27OutdoorPvPNA::OutdoorPvPNA()
28{
29    m_TypeId = OUTDOOR_PVP_NA;
30}
31
32void OutdoorPvPNA::HandleKillImpl(Player *plr, Unit * killed)
33{
34    if(killed->GetTypeId() == TYPEID_PLAYER && plr->GetTeam() != ((Player*)killed)->GetTeam())
35    {
36        plr->KilledMonster(NA_CREDIT_MARKER,0); // 0 guid, btw it isn't even used in killedmonster function :S
37        if(plr->GetTeam() == ALLIANCE)
38            plr->CastSpell(plr,NA_KILL_TOKEN_ALLIANCE,true);
39        else
40            plr->CastSpell(plr,NA_KILL_TOKEN_HORDE,true);
41    }
42}
43
44uint32 OutdoorPvPObjectiveNA::GetAliveGuardsCount()
45{
46    uint32 cnt = 0;
47    for(std::map<uint32, uint64>::iterator itr = m_Creatures.begin(); itr != m_Creatures.end(); ++itr)
48    {
49        switch(itr->first)
50        {
51        case NA_NPC_GUARD_01:
52        case NA_NPC_GUARD_02:
53        case NA_NPC_GUARD_03:
54        case NA_NPC_GUARD_04:
55        case NA_NPC_GUARD_05:
56        case NA_NPC_GUARD_06:
57        case NA_NPC_GUARD_07:
58        case NA_NPC_GUARD_08:
59        case NA_NPC_GUARD_09:
60        case NA_NPC_GUARD_10:
61        case NA_NPC_GUARD_11:
62        case NA_NPC_GUARD_12:
63        case NA_NPC_GUARD_13:
64        case NA_NPC_GUARD_14:
65        case NA_NPC_GUARD_15:
66            {
67                if(Creature * cr = HashMapHolder<Creature>::Find(itr->second))
68                {
69                    if(cr->isAlive())
70                        ++cnt;
71                }
72                else if (CreatureData const * cd = objmgr.GetCreatureData(GUID_LOPART(itr->second)))
73                {
74                    if(!cd->is_dead)
75                        ++cnt;
76                }
77            }
78            break;
79        default:
80            break;
81        }
82    }
83    return cnt;
84}
85
86void OutdoorPvPNA::BuffTeam(uint32 team)
87{
88    if(team == ALLIANCE)
89    {
90        for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
91        {
92            if(Player * plr = objmgr.GetPlayer(*itr))
93                if(plr->IsInWorld()) plr->CastSpell(plr,NA_CAPTURE_BUFF,true);
94        }
95        for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
96        {
97            if(Player * plr = objmgr.GetPlayer(*itr))
98                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
99        }
100    }
101    else if(team == HORDE)
102    {
103        for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
104        {
105            if(Player * plr = objmgr.GetPlayer(*itr))
106                if(plr->IsInWorld()) plr->CastSpell(plr,NA_CAPTURE_BUFF,true);
107        }
108        for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
109        {
110            if(Player * plr = objmgr.GetPlayer(*itr))
111                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
112        }
113    }
114    else
115    {
116        for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
117        {
118            if(Player * plr = objmgr.GetPlayer(*itr))
119                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
120        }
121        for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
122        {
123            if(Player * plr = objmgr.GetPlayer(*itr))
124                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
125        }
126    }
127}
128
129void OutdoorPvPObjectiveNA::SpawnNPCsForTeam(uint32 team)
130{
131    const creature_type * creatures = NULL;
132    if(team == ALLIANCE)
133        creatures=AllianceControlNPCs;
134    else if(team == HORDE)
135        creatures=HordeControlNPCs;
136    else
137        return;
138    for(int i = 0; i < NA_CONTROL_NPC_NUM; ++i)
139        AddCreature(i,creatures[i].entry,creatures[i].teamval,creatures[i].map,creatures[i].x,creatures[i].y,creatures[i].z,creatures[i].o,1000000);
140}
141
142void OutdoorPvPObjectiveNA::DeSpawnNPCs()
143{
144    for(int i = 0; i < NA_CONTROL_NPC_NUM; ++i)
145        DelCreature(i);
146}
147
148void OutdoorPvPObjectiveNA::SpawnGOsForTeam(uint32 team)
149{
150    const go_type * gos = NULL;
151    if(team == ALLIANCE)
152        gos=AllianceControlGOs;
153    else if(team == HORDE)
154        gos=HordeControlGOs;
155    else
156        return;
157    for(int i = 0; i < NA_CONTROL_GO_NUM; ++i)
158    {
159        if( i == NA_ROOST_S ||
160            i == NA_ROOST_W ||
161            i == NA_ROOST_N ||
162            i == NA_ROOST_E ||
163            i == NA_BOMB_WAGON_S || 
164            i == NA_BOMB_WAGON_W || 
165            i == NA_BOMB_WAGON_N || 
166            i == NA_BOMB_WAGON_E )
167            continue;   // roosts and bomb wagons are spawned when someone uses the matching destroyed roost
168        AddObject(i,gos[i].entry,gos[i].map,gos[i].x,gos[i].y,gos[i].z,gos[i].o,gos[i].rot0,gos[i].rot1,gos[i].rot2,gos[i].rot3);
169    }
170}
171
172void OutdoorPvPObjectiveNA::DeSpawnGOs()
173{
174    for(int i = 0; i < NA_CONTROL_GO_NUM; ++i)
175    {
176        DelObject(i);
177    }
178}
179
180void OutdoorPvPObjectiveNA::FactionTakeOver(uint32 team)
181{
182    if(m_ControllingFaction)
183        objmgr.RemoveGraveYardLink(NA_HALAA_GRAVEYARD,NA_HALAA_GRAVEYARD_ZONE,m_ControllingFaction,false);
184    if(m_ControllingFaction == ALLIANCE)
185        sWorld.SendZoneText(NA_HALAA_GRAVEYARD_ZONE,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_NA_LOOSE_A));
186    else if(m_ControllingFaction == HORDE)
187        sWorld.SendZoneText(NA_HALAA_GRAVEYARD_ZONE,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_NA_LOOSE_H));
188
189    m_ControllingFaction = team;
190    if(m_ControllingFaction)
191        objmgr.AddGraveYardLink(NA_HALAA_GRAVEYARD,NA_HALAA_GRAVEYARD_ZONE,m_ControllingFaction,false);
192    DeSpawnGOs();
193    DeSpawnNPCs();
194    SpawnGOsForTeam(team);
195    SpawnNPCsForTeam(team);
196    m_GuardsAlive = NA_GUARDS_MAX;
197    m_capturable = false;
198    this->UpdateHalaaWorldState();
199    if(team == ALLIANCE)
200    {
201        m_WyvernStateSouth = WYVERN_NEU_HORDE;
202        m_WyvernStateNorth = WYVERN_NEU_HORDE;
203        m_WyvernStateEast = WYVERN_NEU_HORDE;
204        m_WyvernStateWest = WYVERN_NEU_HORDE;
205        m_PvP->SendUpdateWorldState(NA_UI_HORDE_GUARDS_SHOW, 0);
206        m_PvP->SendUpdateWorldState(NA_UI_ALLIANCE_GUARDS_SHOW, 1);
207        m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, m_GuardsAlive);
208        sWorld.SendZoneText(NA_HALAA_GRAVEYARD_ZONE,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_NA_CAPTURE_A));
209    }
210    else
211    {
212        m_WyvernStateSouth = WYVERN_NEU_ALLIANCE;
213        m_WyvernStateNorth = WYVERN_NEU_ALLIANCE;
214        m_WyvernStateEast = WYVERN_NEU_ALLIANCE;
215        m_WyvernStateWest = WYVERN_NEU_ALLIANCE;
216        m_PvP->SendUpdateWorldState(NA_UI_HORDE_GUARDS_SHOW, 1);
217        m_PvP->SendUpdateWorldState(NA_UI_ALLIANCE_GUARDS_SHOW, 0);
218        m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, m_GuardsAlive);
219        sWorld.SendZoneText(NA_HALAA_GRAVEYARD_ZONE,objmgr.GetTrinityStringForDBCLocale(LANG_OPVP_NA_CAPTURE_H));
220    }
221    this->UpdateWyvernRoostWorldState(NA_ROOST_S);
222    this->UpdateWyvernRoostWorldState(NA_ROOST_N);
223    this->UpdateWyvernRoostWorldState(NA_ROOST_W);
224    this->UpdateWyvernRoostWorldState(NA_ROOST_E);
225    ((OutdoorPvPNA*)m_PvP)->BuffTeam(team);
226}
227
228bool OutdoorPvPObjectiveNA::HandlePlayerEnter(Player *plr)
229{
230    if(OutdoorPvPObjective::HandlePlayerEnter(plr))
231    {
232        plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_DISPLAY, 1);
233        uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f);
234        plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_POS, phase);
235        plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_N, m_NeutralValue);
236        return true;
237    }
238    return false;
239}
240
241void OutdoorPvPObjectiveNA::HandlePlayerLeave(Player *plr)
242{
243    plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_DISPLAY, 0);
244    OutdoorPvPObjective::HandlePlayerLeave(plr);
245}
246
247OutdoorPvPObjectiveNA::OutdoorPvPObjectiveNA(OutdoorPvP *pvp) : 
248OutdoorPvPObjective(pvp), m_capturable(true), m_GuardsAlive(0), m_ControllingFaction(0),
249m_HalaaState(HALAA_N), m_WyvernStateSouth(0), m_WyvernStateNorth(0), m_WyvernStateWest(0),
250m_WyvernStateEast(0), m_RespawnTimer(NA_RESPAWN_TIME), m_GuardCheckTimer(NA_GUARD_CHECK_TIME)
251{
252    AddCapturePoint(182210,530,-1572.57,7945.3,-22.475,2.05949,0,0,0.857167,0.515038);
253}
254
255bool OutdoorPvPNA::SetupOutdoorPvP()
256{
257//    m_TypeId = OUTDOOR_PVP_NA; _MUST_ be set in ctor, because of spawns cleanup
258    // add the zones affected by the pvp buff
259    sOutdoorPvPMgr.AddZone(NA_BUFF_ZONE,this);
260
261    // halaa
262    m_obj = new OutdoorPvPObjectiveNA(this);
263    if(!m_obj)
264        return false;
265    m_OutdoorPvPObjectives.insert(m_obj);
266
267    return true;
268}
269
270void OutdoorPvPNA::HandlePlayerEnterZone(Player * plr, uint32 zone)
271{
272    // add buffs
273    if(plr->GetTeam() == m_obj->m_ControllingFaction)
274        plr->CastSpell(plr,NA_CAPTURE_BUFF,true);
275    OutdoorPvP::HandlePlayerEnterZone(plr,zone);
276}
277
278void OutdoorPvPNA::HandlePlayerLeaveZone(Player * plr, uint32 zone)
279{
280    // remove buffs
281    plr->RemoveAurasDueToSpell(NA_CAPTURE_BUFF);
282    OutdoorPvP::HandlePlayerLeaveZone(plr, zone);
283}
284
285void OutdoorPvPNA::FillInitialWorldStates(WorldPacket &data)
286{
287    m_obj->FillInitialWorldStates(data);
288}
289
290void OutdoorPvPObjectiveNA::FillInitialWorldStates(WorldPacket &data)
291{
292    if(m_ControllingFaction == ALLIANCE)
293    {
294        data << NA_UI_HORDE_GUARDS_SHOW << uint32(0);
295        data << NA_UI_ALLIANCE_GUARDS_SHOW << uint32(1);
296    }
297    else if(m_ControllingFaction == HORDE)
298    {
299        data << NA_UI_HORDE_GUARDS_SHOW << uint32(1);
300        data << NA_UI_ALLIANCE_GUARDS_SHOW << uint32(0);
301    }
302    else
303    {
304        data << NA_UI_HORDE_GUARDS_SHOW << uint32(0);
305        data << NA_UI_ALLIANCE_GUARDS_SHOW << uint32(0);
306    }
307
308    data << NA_UI_GUARDS_MAX << NA_GUARDS_MAX;
309    data << NA_UI_GUARDS_LEFT << uint32(m_GuardsAlive);
310
311    data << NA_UI_TOWER_SLIDER_DISPLAY << uint32(0);
312    data << NA_UI_TOWER_SLIDER_POS << uint32(50);
313    data << NA_UI_TOWER_SLIDER_N << uint32(100);
314
315    data << NA_MAP_WYVERN_NORTH_NEU_H << uint32(bool(m_WyvernStateNorth & WYVERN_NEU_HORDE));
316    data << NA_MAP_WYVERN_NORTH_NEU_A << uint32(bool(m_WyvernStateNorth & WYVERN_NEU_ALLIANCE));
317    data << NA_MAP_WYVERN_NORTH_H << uint32(bool(m_WyvernStateNorth & WYVERN_HORDE));
318    data << NA_MAP_WYVERN_NORTH_A << uint32(bool(m_WyvernStateNorth & WYVERN_ALLIANCE));
319
320    data << NA_MAP_WYVERN_SOUTH_NEU_H << uint32(bool(m_WyvernStateSouth & WYVERN_NEU_HORDE));
321    data << NA_MAP_WYVERN_SOUTH_NEU_A << uint32(bool(m_WyvernStateSouth & WYVERN_NEU_ALLIANCE));
322    data << NA_MAP_WYVERN_SOUTH_H << uint32(bool(m_WyvernStateSouth & WYVERN_HORDE));
323    data << NA_MAP_WYVERN_SOUTH_A << uint32(bool(m_WyvernStateSouth & WYVERN_ALLIANCE));
324
325    data << NA_MAP_WYVERN_WEST_NEU_H << uint32(bool(m_WyvernStateWest & WYVERN_NEU_HORDE));
326    data << NA_MAP_WYVERN_WEST_NEU_A << uint32(bool(m_WyvernStateWest & WYVERN_NEU_ALLIANCE));
327    data << NA_MAP_WYVERN_WEST_H << uint32(bool(m_WyvernStateWest & WYVERN_HORDE));
328    data << NA_MAP_WYVERN_WEST_A << uint32(bool(m_WyvernStateWest & WYVERN_ALLIANCE));
329
330    data << NA_MAP_WYVERN_EAST_NEU_H << uint32(bool(m_WyvernStateEast & WYVERN_NEU_HORDE));
331    data << NA_MAP_WYVERN_EAST_NEU_A << uint32(bool(m_WyvernStateEast & WYVERN_NEU_ALLIANCE));
332    data << NA_MAP_WYVERN_EAST_H << uint32(bool(m_WyvernStateEast & WYVERN_HORDE));
333    data << NA_MAP_WYVERN_EAST_A << uint32(bool(m_WyvernStateEast & WYVERN_ALLIANCE));
334
335    data << NA_MAP_HALAA_NEUTRAL << uint32(bool(m_HalaaState & HALAA_N));
336    data << NA_MAP_HALAA_NEU_A << uint32(bool(m_HalaaState & HALAA_N_A));
337    data << NA_MAP_HALAA_NEU_H << uint32(bool(m_HalaaState & HALAA_N_H));
338    data << NA_MAP_HALAA_HORDE << uint32(bool(m_HalaaState & HALAA_H));
339    data << NA_MAP_HALAA_ALLIANCE << uint32(bool(m_HalaaState & HALAA_A)); 
340}
341
342void OutdoorPvPNA::SendRemoveWorldStates(Player *plr)
343{
344    plr->SendUpdateWorldState(NA_UI_HORDE_GUARDS_SHOW,0);
345    plr->SendUpdateWorldState(NA_UI_ALLIANCE_GUARDS_SHOW,0);
346    plr->SendUpdateWorldState(NA_UI_GUARDS_MAX,0);
347    plr->SendUpdateWorldState(NA_UI_GUARDS_LEFT,0);
348    plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_DISPLAY,0);
349    plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_POS,0);
350    plr->SendUpdateWorldState(NA_UI_TOWER_SLIDER_N,0);
351    plr->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_H,0);
352    plr->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_A,0);
353    plr->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_H,0);
354    plr->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_A,0);
355    plr->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_H,0);
356    plr->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_A,0);
357    plr->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_H,0);
358    plr->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_A,0);
359    plr->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_H,0);
360    plr->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_A,0);
361    plr->SendUpdateWorldState(NA_MAP_WYVERN_WEST_H,0);
362    plr->SendUpdateWorldState(NA_MAP_WYVERN_WEST_A,0);
363    plr->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_H,0);
364    plr->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_A,0);
365    plr->SendUpdateWorldState(NA_MAP_WYVERN_EAST_H,0);
366    plr->SendUpdateWorldState(NA_MAP_WYVERN_EAST_A,0);
367    plr->SendUpdateWorldState(NA_MAP_HALAA_NEUTRAL,0);
368    plr->SendUpdateWorldState(NA_MAP_HALAA_NEU_A,0);
369    plr->SendUpdateWorldState(NA_MAP_HALAA_NEU_H,0);
370    plr->SendUpdateWorldState(NA_MAP_HALAA_HORDE,0);
371    plr->SendUpdateWorldState(NA_MAP_HALAA_ALLIANCE,0); 
372}
373
374bool OutdoorPvPNA::Update(uint32 diff)
375{
376    return m_obj->Update(diff);
377}
378
379bool OutdoorPvPObjectiveNA::HandleCustomSpell(Player * plr, uint32 spellId, GameObject * go)
380{
381    std::vector<uint32> nodes;
382    nodes.resize(2);
383    bool retval = false;
384    switch(spellId)
385    {
386    case NA_SPELL_FLY_NORTH:
387        nodes[0] = FlightPathStartNodes[NA_ROOST_N];
388        nodes[1] = FlightPathEndNodes[NA_ROOST_N];
389        plr->ActivateTaxiPathTo(nodes);
390        plr->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP);
391        plr->UpdatePvP(true,true);
392        retval = true;
393        break;
394    case NA_SPELL_FLY_SOUTH:
395        nodes[0] = FlightPathStartNodes[NA_ROOST_S];
396        nodes[1] = FlightPathEndNodes[NA_ROOST_S];
397        plr->ActivateTaxiPathTo(nodes);
398        plr->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP);
399        plr->UpdatePvP(true,true);
400        retval = true;
401        break;
402    case NA_SPELL_FLY_WEST:
403        nodes[0] = FlightPathStartNodes[NA_ROOST_W];
404        nodes[1] = FlightPathEndNodes[NA_ROOST_W];
405        plr->ActivateTaxiPathTo(nodes);
406        plr->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP);
407        plr->UpdatePvP(true,true);
408        retval = true;
409        break;
410    case NA_SPELL_FLY_EAST:
411        nodes[0] = FlightPathStartNodes[NA_ROOST_E];
412        nodes[1] = FlightPathEndNodes[NA_ROOST_E];
413        plr->ActivateTaxiPathTo(nodes);
414        plr->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP);
415        plr->UpdatePvP(true,true);
416        retval = true;
417        break;
418    default:
419        break;
420    }
421
422    if(retval)
423    {
424        //Adding items
425        uint32 noSpaceForCount = 0;
426
427        // check space and find places
428        ItemPosCountVec dest;                           
429
430        int32 count = 10;
431        uint32 itemid = 24538;
432                                                                // bomb id count
433        uint8 msg = plr->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, itemid, count, &noSpaceForCount );
434        if( msg != EQUIP_ERR_OK )                               // convert to possible store amount
435            count -= noSpaceForCount;
436
437        if( count == 0 || dest.empty())                         // can't add any
438        {
439            return true;
440        }
441
442        Item* item = plr->StoreNewItem( dest, itemid, true);
443
444        if(count > 0 && item)
445        {
446            plr->SendNewItem(item,count,true,false);
447        }
448
449        return true;
450    }
451    return false;
452}
453
454int32 OutdoorPvPObjectiveNA::HandleOpenGo(Player *plr, uint64 guid)
455{
456    uint32 retval = OutdoorPvPObjective::HandleOpenGo(plr, guid);
457    if(retval>=0)
458    {
459        const go_type * gos = NULL;
460        if(m_ControllingFaction == ALLIANCE)
461            gos=AllianceControlGOs;
462        else if(m_ControllingFaction == HORDE)
463            gos=HordeControlGOs;
464        else
465            return -1;
466
467        int32 del = -1;
468        int32 del2 = -1;
469        int32 add = -1;
470        int32 add2 = -1;
471
472        switch(retval)
473        {
474        case NA_DESTROYED_ROOST_S:
475            del = NA_DESTROYED_ROOST_S;
476            add = NA_ROOST_S;
477            add2 = NA_BOMB_WAGON_S;
478            if(m_ControllingFaction == HORDE)
479                m_WyvernStateSouth = WYVERN_ALLIANCE;
480            else
481                m_WyvernStateSouth = WYVERN_HORDE;
482            UpdateWyvernRoostWorldState(NA_ROOST_S);
483            break;
484        case NA_DESTROYED_ROOST_N:
485            del = NA_DESTROYED_ROOST_N;
486            add = NA_ROOST_N;
487            add2 = NA_BOMB_WAGON_N;
488            if(m_ControllingFaction == HORDE)
489                m_WyvernStateNorth = WYVERN_ALLIANCE;
490            else
491                m_WyvernStateNorth = WYVERN_HORDE;
492            UpdateWyvernRoostWorldState(NA_ROOST_N);
493            break;
494        case NA_DESTROYED_ROOST_W:
495            del = NA_DESTROYED_ROOST_W;
496            add = NA_ROOST_W;
497            add2 = NA_BOMB_WAGON_W;
498            if(m_ControllingFaction == HORDE)
499                m_WyvernStateWest = WYVERN_ALLIANCE;
500            else
501                m_WyvernStateWest = WYVERN_HORDE;
502            UpdateWyvernRoostWorldState(NA_ROOST_W);
503            break;
504        case NA_DESTROYED_ROOST_E:
505            del = NA_DESTROYED_ROOST_E;
506            add = NA_ROOST_E;
507            add2 = NA_BOMB_WAGON_E;
508            if(m_ControllingFaction == HORDE)
509                m_WyvernStateEast = WYVERN_ALLIANCE;
510            else
511                m_WyvernStateEast = WYVERN_HORDE;
512            UpdateWyvernRoostWorldState(NA_ROOST_E);
513            break;
514        case NA_BOMB_WAGON_S:
515            del = NA_BOMB_WAGON_S;
516            del2 = NA_ROOST_S;
517            add = NA_DESTROYED_ROOST_S;
518            if(m_ControllingFaction == HORDE)
519                m_WyvernStateSouth = WYVERN_NEU_ALLIANCE;
520            else
521                m_WyvernStateSouth = WYVERN_NEU_HORDE;
522            UpdateWyvernRoostWorldState(NA_ROOST_S);
523            break;
524        case NA_BOMB_WAGON_N:
525            del = NA_BOMB_WAGON_N;
526            del2 = NA_ROOST_N;
527            add = NA_DESTROYED_ROOST_N;
528            if(m_ControllingFaction == HORDE)
529                m_WyvernStateNorth = WYVERN_NEU_ALLIANCE;
530            else
531                m_WyvernStateNorth = WYVERN_NEU_HORDE;
532            UpdateWyvernRoostWorldState(NA_ROOST_N);
533            break;
534        case NA_BOMB_WAGON_W:
535            del = NA_BOMB_WAGON_W;
536            del2 = NA_ROOST_W;
537            add = NA_DESTROYED_ROOST_W;
538            if(m_ControllingFaction == HORDE)
539                m_WyvernStateWest = WYVERN_NEU_ALLIANCE;
540            else
541                m_WyvernStateWest = WYVERN_NEU_HORDE;
542            UpdateWyvernRoostWorldState(NA_ROOST_W);
543            break;
544        case NA_BOMB_WAGON_E:
545            del = NA_BOMB_WAGON_E;
546            del2 = NA_ROOST_E;
547            add = NA_DESTROYED_ROOST_E;
548            if(m_ControllingFaction == HORDE)
549                m_WyvernStateEast = WYVERN_NEU_ALLIANCE;
550            else
551                m_WyvernStateEast = WYVERN_NEU_HORDE;
552            UpdateWyvernRoostWorldState(NA_ROOST_E);
553            break;
554        default:
555            return -1;
556            break;
557        }
558
559        if(del>-1)
560            DelObject(del);
561
562        if(del2>-1)
563            DelObject(del2);
564
565        if(add>-1)
566            AddObject(add,gos[add].entry,gos[add].map,gos[add].x,gos[add].y,gos[add].z,gos[add].o,gos[add].rot0,gos[add].rot1,gos[add].rot2,gos[add].rot3);
567
568        if(add2>-1)
569            AddObject(add2,gos[add2].entry,gos[add2].map,gos[add2].x,gos[add2].y,gos[add2].z,gos[add2].o,gos[add2].rot0,gos[add2].rot1,gos[add2].rot2,gos[add2].rot3);
570
571        return retval;
572    }
573    return -1;
574}
575
576bool OutdoorPvPObjectiveNA::Update(uint32 diff)
577{
578    // let the controlling faction advance in phase
579    bool capturable = false;
580    if(m_ControllingFaction == ALLIANCE && m_AllianceActivePlayerCount > m_HordeActivePlayerCount)
581        capturable = true;
582    else if(m_ControllingFaction == HORDE && m_AllianceActivePlayerCount < m_HordeActivePlayerCount)
583        capturable = true;
584
585    if(m_GuardCheckTimer < diff)
586    {
587        m_GuardCheckTimer = NA_GUARD_CHECK_TIME;
588        uint32 cnt = GetAliveGuardsCount();
589        if(cnt != m_GuardsAlive)
590        {
591            m_GuardsAlive = cnt;
592            if(m_GuardsAlive == 0)
593                m_capturable = true;
594            // update the guard count for the players in zone
595            m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT,m_GuardsAlive);
596        }
597    } else m_GuardCheckTimer -= diff;
598
599    if((m_capturable || capturable) && OutdoorPvPObjective::Update(diff))
600    {
601        if(m_RespawnTimer < diff)
602        {
603            // if the guards have been killed, then the challenger has one hour to take over halaa.
604            // in case they fail to do it, the guards are respawned, and they have to start again.
605            if(m_ControllingFaction)
606                FactionTakeOver(m_ControllingFaction);
607            m_RespawnTimer = NA_RESPAWN_TIME;
608        } else m_RespawnTimer -= diff;
609
610        if(m_OldState != m_State)
611        {
612            uint32 artkit = 21;
613            switch(m_State)
614            {
615            case OBJECTIVESTATE_NEUTRAL:
616                m_HalaaState = HALAA_N;
617                break;
618            case OBJECTIVESTATE_ALLIANCE:
619                m_HalaaState = HALAA_A;
620                FactionTakeOver(ALLIANCE);
621                artkit = 2;
622                break;
623            case OBJECTIVESTATE_HORDE:
624                m_HalaaState = HALAA_H;
625                FactionTakeOver(HORDE);
626                artkit = 1;
627                break;
628            case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
629                m_HalaaState = HALAA_N_A;
630                break;
631            case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
632                m_HalaaState = HALAA_N_H;
633                break;
634            case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
635                m_HalaaState = HALAA_N_A;
636                artkit = 2;
637                break;
638            case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
639                m_HalaaState = HALAA_N_H;
640                artkit = 1;
641                break;
642            }
643
644            GameObject* flag = HashMapHolder<GameObject>::Find(m_CapturePoint);
645            if(flag)
646            {
647                flag->SetGoArtKit(artkit);
648                flag->SendUpdateObjectToAllExcept(NULL);
649            }
650
651            UpdateHalaaWorldState();
652        }
653
654        if(m_ShiftPhase != m_OldPhase)
655        {
656            // send this too, sometimes the slider disappears, dunno why :(
657            SendUpdateWorldState(NA_UI_TOWER_SLIDER_DISPLAY, 1);
658            // send these updates to only the ones in this objective
659            uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f);
660            SendUpdateWorldState(NA_UI_TOWER_SLIDER_POS, phase);
661            SendUpdateWorldState(NA_UI_TOWER_SLIDER_N, m_NeutralValue);
662        }
663        return true;
664    }
665    return false;
666}
667
668void OutdoorPvPObjectiveNA::UpdateHalaaWorldState()
669{
670    m_PvP->SendUpdateWorldState( NA_MAP_HALAA_NEUTRAL ,uint32(bool(m_HalaaState & HALAA_N)));
671    m_PvP->SendUpdateWorldState( NA_MAP_HALAA_NEU_A ,uint32(bool(m_HalaaState & HALAA_N_A)));
672    m_PvP->SendUpdateWorldState( NA_MAP_HALAA_NEU_H ,uint32(bool(m_HalaaState & HALAA_N_H)));
673    m_PvP->SendUpdateWorldState( NA_MAP_HALAA_HORDE ,uint32(bool(m_HalaaState & HALAA_H)));
674    m_PvP->SendUpdateWorldState( NA_MAP_HALAA_ALLIANCE ,uint32(bool(m_HalaaState & HALAA_A)));
675}
676
677void OutdoorPvPObjectiveNA::UpdateWyvernRoostWorldState(uint32 roost)
678{
679    switch(roost)
680    {
681    case NA_ROOST_S:
682        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_H,uint32(bool(m_WyvernStateSouth & WYVERN_NEU_HORDE)));
683        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_A,uint32(bool(m_WyvernStateSouth & WYVERN_NEU_ALLIANCE)));
684        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_H,uint32(bool(m_WyvernStateSouth & WYVERN_HORDE)));
685        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_A,uint32(bool(m_WyvernStateSouth & WYVERN_ALLIANCE)));
686        break;
687    case NA_ROOST_N:
688        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_H,uint32(bool(m_WyvernStateNorth & WYVERN_NEU_HORDE)));
689        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_A,uint32(bool(m_WyvernStateNorth & WYVERN_NEU_ALLIANCE)));
690        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_H,uint32(bool(m_WyvernStateNorth & WYVERN_HORDE)));
691        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_A,uint32(bool(m_WyvernStateNorth & WYVERN_ALLIANCE)));
692        break;
693    case NA_ROOST_W:
694        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_H,uint32(bool(m_WyvernStateWest & WYVERN_NEU_HORDE)));
695        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_A,uint32(bool(m_WyvernStateWest & WYVERN_NEU_ALLIANCE)));
696        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_H,uint32(bool(m_WyvernStateWest & WYVERN_HORDE)));
697        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_A,uint32(bool(m_WyvernStateWest & WYVERN_ALLIANCE)));
698        break;
699    case NA_ROOST_E:
700        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_H,uint32(bool(m_WyvernStateEast & WYVERN_NEU_HORDE)));
701        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_A,uint32(bool(m_WyvernStateEast & WYVERN_NEU_ALLIANCE)));
702        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_H,uint32(bool(m_WyvernStateEast & WYVERN_HORDE)));
703        m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_A,uint32(bool(m_WyvernStateEast & WYVERN_ALLIANCE)));
704        break;
705    }
706}
707
708bool OutdoorPvPObjectiveNA::HandleCapturePointEvent(Player *plr, uint32 eventId)
709{
710    switch(eventId)
711    {
712    case 11821:
713        this->HandlePlayerEnter(plr);
714        return true;
715        break;
716    case 11822:
717        this->HandlePlayerLeave(plr);
718        return true;
719        break;
720    default:
721        break;
722    }
723    return false;
724}
Note: See TracBrowser for help on using the browser.