root/trunk/src/game/BattleGroundBE.cpp @ 6

Revision 2, 7.1 kB (checked in by yumileroy, 17 years ago)

[svn] * Proper SVN structure

Original author: Neo2003
Date: 2008-10-02 16:23:55-05:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.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 "Object.h"
20#include "Player.h"
21#include "BattleGround.h"
22#include "BattleGroundBE.h"
23#include "Creature.h"
24#include "ObjectMgr.h"
25#include "MapManager.h"
26#include "Language.h"
27
28BattleGroundBE::BattleGroundBE()
29{
30    m_BgObjects.resize(BG_BE_OBJECT_MAX);
31}
32
33BattleGroundBE::~BattleGroundBE()
34{
35
36}
37
38void BattleGroundBE::Update(time_t diff)
39{
40    BattleGround::Update(diff);
41
42    // after bg start we get there
43    if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize())
44    {
45        ModifyStartDelayTime(diff);
46
47        if (!(m_Events & 0x01))
48        {
49            m_Events |= 0x01;
50            for(uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_4; i++)
51                SpawnBGObject(i, RESPAWN_IMMEDIATELY);
52
53            for(uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; i++)
54                SpawnBGObject(i, RESPAWN_ONE_DAY);
55
56            SetStartDelayTime(START_DELAY1);
57            SendMessageToAll(LANG_ARENA_ONE_MINUTE);
58        }
59        // After 30 seconds, warning is signalled
60        else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x04))
61        {
62            m_Events |= 0x04;
63            SendMessageToAll(LANG_ARENA_THIRTY_SECONDS);
64        }
65        // After 15 seconds, warning is signalled
66        else if (GetStartDelayTime() <= START_DELAY3 && !(m_Events & 0x08))
67        {
68            m_Events |= 0x08;
69            SendMessageToAll(LANG_ARENA_FIFTEEN_SECONDS);
70        }
71        // delay expired (1 minute)
72        else if (GetStartDelayTime() <= 0 && !(m_Events & 0x10))
73        {
74            m_Events |= 0x10;
75
76            for(uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_2; i++)
77                DoorOpen(i);
78
79            for(uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; i++)
80                SpawnBGObject(i, 60);
81
82            SendMessageToAll(LANG_ARENA_BEGUN);
83            SetStatus(STATUS_IN_PROGRESS);
84            SetStartDelayTime(0);
85
86            for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
87                if(Player *plr = objmgr.GetPlayer(itr->first))
88                    plr->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION);
89        }
90    }
91
92    /*if(GetStatus() == STATUS_IN_PROGRESS)
93    {
94        // update something
95    }*/
96}
97
98void BattleGroundBE::AddPlayer(Player *plr)
99{
100    BattleGround::AddPlayer(plr);
101    //create score and add it to map, default values are set in constructor
102    BattleGroundBEScore* sc = new BattleGroundBEScore;
103
104    m_PlayerScores[plr->GetGUID()] = sc;
105}
106
107void BattleGroundBE::RemovePlayer(Player *plr, uint64 guid)
108{
109
110}
111
112void BattleGroundBE::HandleKillPlayer(Player *player, Player *killer)
113{
114    if(GetStatus() != STATUS_IN_PROGRESS)
115        return;
116
117    if(!killer)
118    {
119        sLog.outError("Killer player not found");
120        return;
121    }
122
123    BattleGround::HandleKillPlayer(player, killer);
124
125    uint32 killer_team_index = GetTeamIndexByTeamId(killer->GetTeam());
126
127    ++m_TeamKills[killer_team_index];                       // add kills to killer's team
128
129    if(m_TeamKills[killer_team_index] >= GetPlayersCountByTeam(player->GetTeam()))
130    {
131        // all opponents killed
132        EndBattleGround(killer->GetTeam());
133    }
134}
135
136void BattleGroundBE::HandleAreaTrigger(Player *Source, uint32 Trigger)
137{
138    // this is wrong way to implement these things. On official it done by gameobject spell cast.
139    if(GetStatus() != STATUS_IN_PROGRESS)
140        return;
141
142    //uint32 SpellId = 0;
143    //uint64 buff_guid = 0;
144    switch(Trigger)
145    {
146        case 4538:                                          // buff trigger?
147            //buff_guid = m_BgObjects[BG_BE_OBJECT_BUFF_1];
148            break;
149        case 4539:                                          // buff trigger?
150            //buff_guid = m_BgObjects[BG_BE_OBJECT_BUFF_2];
151            break;
152        default:
153            sLog.outError("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger);
154            Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger);
155            break;
156    }
157
158    //if(buff_guid)
159    //    HandleTriggerBuff(buff_guid,Source);
160}
161
162void BattleGroundBE::ResetBGSubclass()
163{
164    m_TeamKills[BG_TEAM_ALLIANCE] = 0;
165    m_TeamKills[BG_TEAM_HORDE]    = 0;
166}
167
168bool BattleGroundBE::SetupBattleGround()
169{
170    // gates
171    if(    !AddObject(BG_BE_OBJECT_DOOR_1, BG_BE_OBJECT_TYPE_DOOR_1, 6287.277f, 282.1877f, 3.810925f, -2.260201f, 0, 0, 0.9044551f, -0.4265689f, RESPAWN_IMMEDIATELY)
172        || !AddObject(BG_BE_OBJECT_DOOR_2, BG_BE_OBJECT_TYPE_DOOR_2, 6189.546f, 241.7099f, 3.101481f, 0.8813917f, 0, 0, 0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY)
173        || !AddObject(BG_BE_OBJECT_DOOR_3, BG_BE_OBJECT_TYPE_DOOR_3, 6299.116f, 296.5494f, 3.308032f, 0.8813917f, 0, 0, 0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY)
174        || !AddObject(BG_BE_OBJECT_DOOR_4, BG_BE_OBJECT_TYPE_DOOR_4, 6177.708f, 227.3481f, 3.604374f, -2.260201f, 0, 0, 0.9044551f, -0.4265689f, RESPAWN_IMMEDIATELY)
175        // buffs
176        || !AddObject(BG_BE_OBJECT_BUFF_1, BG_BE_OBJECT_TYPE_BUFF_1, 6249.042f, 275.3239f, 11.22033f, -1.448624f, 0, 0, 0.6626201f, -0.7489557f, 120)
177        || !AddObject(BG_BE_OBJECT_BUFF_2, BG_BE_OBJECT_TYPE_BUFF_2, 6228.26f, 249.566f, 11.21812f, -0.06981307f, 0, 0, 0.03489945f, -0.9993908f, 120))
178    {
179        sLog.outErrorDb("BatteGroundBE: Failed to spawn some object!");
180        return false;
181    }
182
183    return true;
184}
185
186void BattleGroundBE::UpdatePlayerScore(Player* Source, uint32 type, uint32 value)
187{
188
189    std::map<uint64, BattleGroundScore*>::iterator itr = m_PlayerScores.find(Source->GetGUID());
190
191    if(itr == m_PlayerScores.end())                         // player not found...
192        return;
193
194    //there is nothing special in this score
195    BattleGround::UpdatePlayerScore(Source,type,value);
196
197}
198
199/*
20021:45:46 id:231310 [S2C] SMSG_INIT_WORLD_STATES (706 = 0x02C2) len: 86
2010000: 32 02 00 00 76 0e 00 00 00 00 00 00 09 00 f3 09  |  2...v...........
2020010: 00 00 01 00 00 00 f1 09 00 00 01 00 00 00 f0 09  |  ................
2030020: 00 00 02 00 00 00 d4 08 00 00 00 00 00 00 d8 08  |  ................
2040030: 00 00 00 00 00 00 d7 08 00 00 00 00 00 00 d6 08  |  ................
2050040: 00 00 00 00 00 00 d5 08 00 00 00 00 00 00 d3 08  |  ................
2060050: 00 00 00 00 00 00                                |  ......
207
208spell 32724 - Gold Team
209spell 32725 - Green Team
21035774 Gold Team
21135775 Green Team
212*/
Note: See TracBrowser for help on using the browser.