root/trunk/src/game/OutdoorPvPHP.cpp @ 83

Revision 80, 13.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 "OutdoorPvPHP.h"
2#include "OutdoorPvP.h"
3#include "OutdoorPvPMgr.h"
4#include "Player.h"
5#include "WorldPacket.h"
6#include "World.h"
7#include "ObjectMgr.h"
8#include "Language.h"
9
10const uint32 HP_LANG_LOOSE_A[HP_TOWER_NUM] = {LANG_OPVP_HP_LOOSE_BROKENHILL_A,LANG_OPVP_HP_LOOSE_OVERLOOK_A,LANG_OPVP_HP_LOOSE_STADIUM_A};
11
12const uint32 HP_LANG_LOOSE_H[HP_TOWER_NUM] = {LANG_OPVP_HP_LOOSE_BROKENHILL_H,LANG_OPVP_HP_LOOSE_OVERLOOK_H,LANG_OPVP_HP_LOOSE_STADIUM_H};
13
14const uint32 HP_LANG_CAPTURE_A[HP_TOWER_NUM] = {LANG_OPVP_HP_CAPTURE_BROKENHILL_A,LANG_OPVP_HP_CAPTURE_OVERLOOK_A,LANG_OPVP_HP_CAPTURE_STADIUM_A};
15
16const uint32 HP_LANG_CAPTURE_H[HP_TOWER_NUM] = {LANG_OPVP_HP_CAPTURE_BROKENHILL_H,LANG_OPVP_HP_CAPTURE_OVERLOOK_H,LANG_OPVP_HP_CAPTURE_STADIUM_H};
17
18OutdoorPvPObjectiveHP::OutdoorPvPObjectiveHP(OutdoorPvP *pvp,OutdoorPvPHPTowerType type)
19: OutdoorPvPObjective(pvp), m_TowerType(type)
20{
21    AddCapturePoint(HPCapturePoints[type].entry,
22        HPCapturePoints[type].map,
23        HPCapturePoints[type].x,
24        HPCapturePoints[type].y,
25        HPCapturePoints[type].z,
26        HPCapturePoints[type].o,
27        HPCapturePoints[type].rot0,
28        HPCapturePoints[type].rot1,
29        HPCapturePoints[type].rot2,
30        HPCapturePoints[type].rot3);
31    AddObject(type,
32        HPTowerFlags[type].entry,
33        HPTowerFlags[type].map,
34        HPTowerFlags[type].x,
35        HPTowerFlags[type].y,
36        HPTowerFlags[type].z,
37        HPTowerFlags[type].o,
38        HPTowerFlags[type].rot0,
39        HPTowerFlags[type].rot1,
40        HPTowerFlags[type].rot2,
41        HPTowerFlags[type].rot3);
42}
43
44OutdoorPvPHP::OutdoorPvPHP()
45{
46    m_TypeId = OUTDOOR_PVP_HP;
47}
48
49bool OutdoorPvPHP::SetupOutdoorPvP()
50{
51    m_AllianceTowersControlled = 0;
52    m_HordeTowersControlled = 0;
53    // add the zones affected by the pvp buff
54    for(int i = 0; i < OutdoorPvPHPBuffZonesNum; ++i)
55        sOutdoorPvPMgr.AddZone(OutdoorPvPHPBuffZones[i],this);
56
57    m_OutdoorPvPObjectives.insert(new OutdoorPvPObjectiveHP(this,HP_TOWER_BROKEN_HILL));
58
59    m_OutdoorPvPObjectives.insert(new OutdoorPvPObjectiveHP(this,HP_TOWER_OVERLOOK));
60
61    m_OutdoorPvPObjectives.insert(new OutdoorPvPObjectiveHP(this,HP_TOWER_STADIUM));
62
63    return true;
64}
65
66void OutdoorPvPHP::HandlePlayerEnterZone(Player * plr, uint32 zone)
67{
68    // add buffs
69    if(plr->GetTeam() == ALLIANCE)
70    {
71        if(m_AllianceTowersControlled >=3)
72            plr->CastSpell(plr,AllianceBuff,true);
73    }
74    else
75    {
76        if(m_HordeTowersControlled >=3)
77            plr->CastSpell(plr,HordeBuff,true);
78    }
79    OutdoorPvP::HandlePlayerEnterZone(plr,zone);
80}
81
82void OutdoorPvPHP::HandlePlayerLeaveZone(Player * plr, uint32 zone)
83{
84    // remove buffs
85    if(plr->GetTeam() == ALLIANCE)
86    {
87        plr->RemoveAurasDueToSpell(AllianceBuff);
88    }
89    else
90    {
91        plr->RemoveAurasDueToSpell(HordeBuff);
92    }
93    OutdoorPvP::HandlePlayerLeaveZone(plr, zone);
94}
95
96bool OutdoorPvPHP::Update(uint32 diff)
97{
98    bool changed = false;
99    if(changed = OutdoorPvP::Update(diff))
100    {
101        if(m_AllianceTowersControlled == 3)
102            BuffTeam(ALLIANCE);
103        else if(m_HordeTowersControlled == 3)
104            BuffTeam(HORDE);
105        else
106            BuffTeam(NULL);
107        SendUpdateWorldState(HP_UI_TOWER_COUNT_A, m_AllianceTowersControlled);
108        SendUpdateWorldState(HP_UI_TOWER_COUNT_H, m_HordeTowersControlled);
109    }
110    return changed;
111}
112
113void OutdoorPvPHP::SendRemoveWorldStates(Player *plr)
114{
115    plr->SendUpdateWorldState(HP_UI_TOWER_DISPLAY_A,0);
116    plr->SendUpdateWorldState(HP_UI_TOWER_DISPLAY_H,0);
117    plr->SendUpdateWorldState(HP_UI_TOWER_COUNT_H,0);
118    plr->SendUpdateWorldState(HP_UI_TOWER_COUNT_A,0);
119    plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_N,0);
120    plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_POS,0);
121    plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_DISPLAY,0);
122    for(int i = 0; i < HP_TOWER_NUM; ++i)
123    {
124        plr->SendUpdateWorldState(HP_MAP_N[i],0);
125        plr->SendUpdateWorldState(HP_MAP_A[i],0);
126        plr->SendUpdateWorldState(HP_MAP_H[i],0);
127    }
128}
129
130void OutdoorPvPHP::FillInitialWorldStates(WorldPacket &data)
131{
132    data << uint32(HP_UI_TOWER_DISPLAY_A) << uint32(1);
133    data << uint32(HP_UI_TOWER_DISPLAY_H) << uint32(1);
134    data << uint32(HP_UI_TOWER_COUNT_A) << uint32(m_AllianceTowersControlled);
135    data << uint32(HP_UI_TOWER_COUNT_H) << uint32(m_HordeTowersControlled);
136    data << uint32(HP_UI_TOWER_SLIDER_DISPLAY) << uint32(0);
137    data << uint32(HP_UI_TOWER_SLIDER_POS) << uint32(50);
138    data << uint32(HP_UI_TOWER_SLIDER_N) << uint32(100);
139    for(OutdoorPvPObjectiveSet::iterator itr = m_OutdoorPvPObjectives.begin(); itr != m_OutdoorPvPObjectives.end(); ++itr)
140    {
141        (*itr)->FillInitialWorldStates(data);
142    }
143}
144
145bool OutdoorPvPObjectiveHP::Update(uint32 diff)
146{
147    // if status changed:
148    if(OutdoorPvPObjective::Update(diff))
149    {
150        if(m_OldState != m_State)
151        {
152            uint32 field = 0;
153            switch(m_OldState)
154            {
155            case OBJECTIVESTATE_NEUTRAL:
156                field = HP_MAP_N[m_TowerType];
157                break;
158            case OBJECTIVESTATE_ALLIANCE:
159                field = HP_MAP_A[m_TowerType];
160                if(((OutdoorPvPHP*)m_PvP)->m_AllianceTowersControlled)
161                    ((OutdoorPvPHP*)m_PvP)->m_AllianceTowersControlled--;
162                sWorld.SendZoneText(OutdoorPvPHPBuffZones[0],objmgr.GetTrinityStringForDBCLocale(HP_LANG_LOOSE_A[m_TowerType]));
163                break;
164            case OBJECTIVESTATE_HORDE:
165                field = HP_MAP_H[m_TowerType];
166                if(((OutdoorPvPHP*)m_PvP)->m_HordeTowersControlled)
167                    ((OutdoorPvPHP*)m_PvP)->m_HordeTowersControlled--;
168                sWorld.SendZoneText(OutdoorPvPHPBuffZones[0],objmgr.GetTrinityStringForDBCLocale(HP_LANG_LOOSE_H[m_TowerType]));
169                break;
170            case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
171                field = HP_MAP_N[m_TowerType];
172                break;
173            case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
174                field = HP_MAP_N[m_TowerType];
175                break;
176            case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
177                field = HP_MAP_A[m_TowerType];
178                break;
179            case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
180                field = HP_MAP_H[m_TowerType];
181                break;
182            }
183
184            // send world state update
185            if(field)
186            {
187                m_PvP->SendUpdateWorldState(field, 0);
188                field = 0;
189            }
190            uint32 artkit = 21;
191            uint32 artkit2 = HP_TowerArtKit_N[m_TowerType];
192            switch(m_State)
193            {
194            case OBJECTIVESTATE_NEUTRAL:
195                field = HP_MAP_N[m_TowerType];
196                break;
197            case OBJECTIVESTATE_ALLIANCE:
198                field = HP_MAP_A[m_TowerType];
199                artkit = 2;
200                artkit2 = HP_TowerArtKit_A[m_TowerType];
201                if(((OutdoorPvPHP*)m_PvP)->m_AllianceTowersControlled<3)
202                    ((OutdoorPvPHP*)m_PvP)->m_AllianceTowersControlled++;
203                sWorld.SendZoneText(OutdoorPvPHPBuffZones[0],objmgr.GetTrinityStringForDBCLocale(HP_LANG_CAPTURE_A[m_TowerType]));
204                break;
205            case OBJECTIVESTATE_HORDE:
206                field = HP_MAP_H[m_TowerType];
207                artkit = 1;
208                artkit2 = HP_TowerArtKit_H[m_TowerType];
209                if(((OutdoorPvPHP*)m_PvP)->m_HordeTowersControlled<3)
210                    ((OutdoorPvPHP*)m_PvP)->m_HordeTowersControlled++;
211                sWorld.SendZoneText(OutdoorPvPHPBuffZones[0],objmgr.GetTrinityStringForDBCLocale(HP_LANG_CAPTURE_H[m_TowerType]));
212                break;
213            case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
214                field = HP_MAP_N[m_TowerType];
215                break;
216            case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
217                field = HP_MAP_N[m_TowerType];
218                break;
219            case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
220                field = HP_MAP_A[m_TowerType];
221                artkit = 2;
222                artkit2 = HP_TowerArtKit_A[m_TowerType];
223                break;
224            case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
225                field = HP_MAP_H[m_TowerType];
226                artkit = 1;
227                artkit2 = HP_TowerArtKit_H[m_TowerType];
228                break;
229            }
230
231            GameObject* flag = HashMapHolder<GameObject>::Find(m_CapturePoint);
232            GameObject* flag2 = HashMapHolder<GameObject>::Find(m_Objects[m_TowerType]);
233            if(flag)
234            {
235                flag->SetGoArtKit(artkit);
236                flag->SendUpdateObjectToAllExcept(NULL);
237            }
238            if(flag2)
239            {
240                flag2->SetGoArtKit(artkit2);
241                flag2->SendUpdateObjectToAllExcept(NULL);
242            }
243
244            // send world state update
245            if(field)
246                m_PvP->SendUpdateWorldState(field, 1);
247
248            // complete quest objective
249            if(m_State == OBJECTIVESTATE_ALLIANCE || m_State == OBJECTIVESTATE_HORDE)
250                SendObjectiveComplete(HP_CREDITMARKER[m_TowerType], 0);
251        }
252
253        if(m_ShiftPhase != m_OldPhase)
254        {
255            SendUpdateWorldState(HP_UI_TOWER_SLIDER_N, m_NeutralValue);
256            // send these updates to only the ones in this objective
257            uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f);
258            SendUpdateWorldState(HP_UI_TOWER_SLIDER_POS, phase);
259            // send this too, sometimes the slider disappears, dunno why :(
260            SendUpdateWorldState(HP_UI_TOWER_SLIDER_DISPLAY, 1);
261        }
262        return true;
263    }
264    return false;
265}
266
267void OutdoorPvPObjectiveHP::FillInitialWorldStates(WorldPacket &data)
268{
269    switch(m_State)
270    {
271        case OBJECTIVESTATE_ALLIANCE:
272        case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE:
273            data << uint32(HP_MAP_N[m_TowerType]) << uint32(0);
274            data << uint32(HP_MAP_A[m_TowerType]) << uint32(1);
275            data << uint32(HP_MAP_H[m_TowerType]) << uint32(0);
276            break;
277        case OBJECTIVESTATE_HORDE:
278        case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE:
279            data << uint32(HP_MAP_N[m_TowerType]) << uint32(0);
280            data << uint32(HP_MAP_A[m_TowerType]) << uint32(0);
281            data << uint32(HP_MAP_H[m_TowerType]) << uint32(1);
282            break;
283        case OBJECTIVESTATE_NEUTRAL:
284        case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE:
285        case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE:
286        default:
287            data << uint32(HP_MAP_N[m_TowerType]) << uint32(1);
288            data << uint32(HP_MAP_A[m_TowerType]) << uint32(0);
289            data << uint32(HP_MAP_H[m_TowerType]) << uint32(0);
290            break;
291    }
292}
293
294bool OutdoorPvPObjectiveHP::HandlePlayerEnter(Player *plr)
295{
296    if(OutdoorPvPObjective::HandlePlayerEnter(plr))
297    {
298        plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_DISPLAY, 1);
299        uint32 phase = (uint32)ceil(( m_ShiftPhase + m_ShiftMaxPhase) / ( 2 * m_ShiftMaxPhase ) * 100.0f);
300        plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_POS, phase);
301        plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_N, m_NeutralValue);
302        return true;
303    }
304    return false;
305}
306
307void OutdoorPvPObjectiveHP::HandlePlayerLeave(Player *plr)
308{
309    plr->SendUpdateWorldState(HP_UI_TOWER_SLIDER_DISPLAY, 0);
310    OutdoorPvPObjective::HandlePlayerLeave(plr);
311}
312
313void OutdoorPvPHP::BuffTeam(uint32 team)
314{
315    if(team == ALLIANCE)
316    {
317        for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
318        {
319            if(Player * plr = objmgr.GetPlayer(*itr))
320                if(plr->IsInWorld()) plr->CastSpell(plr,AllianceBuff,true);
321        }
322        for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
323        {
324            if(Player * plr = objmgr.GetPlayer(*itr))
325                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(HordeBuff);
326        }
327    }
328    else if(team == HORDE)
329    {
330        for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
331        {
332            if(Player * plr = objmgr.GetPlayer(*itr))
333                if(plr->IsInWorld()) plr->CastSpell(plr,HordeBuff,true);
334        }
335        for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
336        {
337            if(Player * plr = objmgr.GetPlayer(*itr))
338                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(AllianceBuff);
339        }
340    }
341    else
342    {
343        for(std::set<uint64>::iterator itr = m_PlayerGuids[0].begin(); itr != m_PlayerGuids[0].end(); ++itr)
344        {
345            if(Player * plr = objmgr.GetPlayer(*itr))
346                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(AllianceBuff);
347        }
348        for(std::set<uint64>::iterator itr = m_PlayerGuids[1].begin(); itr != m_PlayerGuids[1].end(); ++itr)
349        {
350            if(Player * plr = objmgr.GetPlayer(*itr))
351                if(plr->IsInWorld()) plr->RemoveAurasDueToSpell(HordeBuff);
352        }
353    }
354}
355
356void OutdoorPvPHP::HandleKillImpl(Player *plr, Unit * killed)
357{
358    if(killed->GetTypeId() != TYPEID_PLAYER)
359        return;
360
361    if(plr->GetTeam() == ALLIANCE && ((Player*)killed)->GetTeam() != ALLIANCE)
362        plr->CastSpell(plr,AlliancePlayerKillReward,true);
363    else if(plr->GetTeam() == HORDE && ((Player*)killed)->GetTeam() != HORDE)
364        plr->CastSpell(plr,HordePlayerKillReward,true);
365}
366
367bool OutdoorPvPObjectiveHP::HandleCapturePointEvent(Player *plr, uint32 eventId)
368{
369    if(eventId == HP_CapturePointEvent_Enter[m_TowerType])
370    {
371        this->HandlePlayerEnter(plr);
372        return true;
373    }
374    else if(eventId == HP_CapturePointEvent_Leave[m_TowerType])
375    {
376        this->HandlePlayerLeave(plr);
377        return true;
378    }
379    return false;
380}
Note: See TracBrowser for help on using the browser.