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

Revision 80, 25.7 kB (checked in by yumileroy, 17 years ago)

[svn] Fixed a crash in OutdoorPvP*::BuffTeam?().

Original author: w12x
Date: 2008-10-20 13:34:00-05:00

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