TrinityCore
Loading...
Searching...
No Matches
arena_ring_of_valor.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "Battleground.h"
19#include "BattlegroundScript.h"
20#include "GameObject.h"
21#include "Map.h"
22#include "ObjectAccessor.h"
23#include "ScriptMgr.h"
24#include "TaskScheduler.h"
25
27{
54
66
68
69 void OnUpdate(uint32 diff) override
70 {
72 return;
73
74 _scheduler.Update(diff);
75
76 if (_timer < diff)
77 {
78 switch (_state)
79 {
81 // Open fire (only at game start)
82 for (ObjectGuid const& guid : _fireGUIDs)
84 go->UseDoorOrButton();
85 for (ObjectGuid const& guid : _firedoorGUIDs)
87 go->UseDoorOrButton();
90 break;
92 for (ObjectGuid const& guid : _fireGUIDs)
94 go->ResetDoorOrButton();
95 for (ObjectGuid const& guid : _firedoorGUIDs)
97 go->ResetDoorOrButton();
98 // Fire got closed after five seconds, leaves twenty seconds before toggling pillars
101 break;
105 break;
106 default:
107 break;
108 }
109 }
110 else
111 _timer -= diff;
112 }
113
114 void OnInit() override
115 {
116 CreateObject(BG_RV_OBJECT_TYPE_ELEVATOR_1, 763.536377f, -294.535767f, 0.505383f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
117 CreateObject(BG_RV_OBJECT_TYPE_ELEVATOR_2, 763.506348f, -273.873352f, 0.505383f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
118
119 CreateObject(BG_RV_OBJECT_TYPE_FIRE_1, 743.543457f, -283.799469f, 28.286655f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
120 CreateObject(BG_RV_OBJECT_TYPE_FIRE_2, 782.971802f, -283.799469f, 28.286655f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
121 CreateObject(BG_RV_OBJECT_TYPE_FIREDOOR_1, 743.711060f, -284.099609f, 27.542587f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
122 CreateObject(BG_RV_OBJECT_TYPE_FIREDOOR_2, 783.221252f, -284.133362f, 27.535686f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
123
124 CreateObject(BG_RV_OBJECT_TYPE_GEAR_1, 763.664551f, -261.872986f, 26.686588f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
125 CreateObject(BG_RV_OBJECT_TYPE_GEAR_2, 763.578979f, -306.146149f, 26.665222f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
126 CreateObject(BG_RV_OBJECT_TYPE_PULLEY_1, 700.722290f, -283.990662f, 39.517582f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
127 CreateObject(BG_RV_OBJECT_TYPE_PULLEY_2, 826.303833f, -283.996429f, 39.517582f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
128 CreateObject(BG_RV_OBJECT_TYPE_PILAR_1, 763.632385f, -306.162384f, 25.909504f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
129 CreateObject(BG_RV_OBJECT_TYPE_PILAR_2, 723.644287f, -284.493256f, 24.648525f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
130 CreateObject(BG_RV_OBJECT_TYPE_PILAR_3, 763.611145f, -261.856750f, 25.909504f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
131 CreateObject(BG_RV_OBJECT_TYPE_PILAR_4, 802.211609f, -284.493256f, 24.648525f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
132 CreateObject(BG_RV_OBJECT_TYPE_PILAR_COLLISION_1, 763.632385f, -306.162384f, 30.639660f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
133 CreateObject(BG_RV_OBJECT_TYPE_PILAR_COLLISION_2, 723.644287f, -284.493256f, 32.382710f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
134 CreateObject(BG_RV_OBJECT_TYPE_PILAR_COLLISION_3, 763.611145f, -261.856750f, 30.639660f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f);
135 CreateObject(BG_RV_OBJECT_TYPE_PILAR_COLLISION_4, 802.211609f, -284.493256f, 32.382710f, 3.141593f, 0.0f, 0.0f, 0.0f, 0.0f);
136 }
137
138 void OnStart() override
139 {
140 for (ObjectGuid const& guid : _elevatorGUIDs)
141 {
142 if (GameObject* door = battlegroundMap->GetGameObject(guid))
143 {
144 door->UseDoorOrButton();
145 door->DespawnOrUnsummon(5s);
146 }
147 }
148
151
152 // Should be false at first, TogglePillarCollision will do it.
153 _pillarCollision = true;
155
156 _scheduler.Schedule(1min, [&](TaskContext const&)
157 {
158 CreateObject(BG_RV_OBJECT_TYPE_BUFF_1, 735.551819f, -284.794678f, 28.276682f, 0.034906f, 0.0f, 0.0f, 0.0f, 0.0f);
159 CreateObject(BG_RV_OBJECT_TYPE_BUFF_2, 791.224487f, -284.794464f, 28.276682f, 2.600535f, 0.0f, 0.0f, 0.0f, 0.0f);
160 });
161 }
162
164 {
165 // Toggle visual pillars, pulley, gear, and collision based on previous state
166
167 GuidVector smallPillarGuids;
168 smallPillarGuids.insert(std::end(smallPillarGuids), std::begin(_pillarSmallGUIDs), std::end(_pillarSmallGUIDs));
169 smallPillarGuids.insert(std::end(smallPillarGuids), std::begin(_gearGUIDs), std::end(_gearGUIDs));
170
171 for (ObjectGuid const& guid : smallPillarGuids)
172 {
174 {
176 go->UseDoorOrButton();
177 else
178 go->ResetDoorOrButton();
179 }
180 }
181
182 GuidVector bigPillarGuids;
183 bigPillarGuids.insert(std::end(bigPillarGuids), std::begin(_pillarBigGUIDs), std::end(_pillarBigGUIDs));
184 bigPillarGuids.insert(std::end(bigPillarGuids), std::begin(_pulleyGUIDs), std::end(_pulleyGUIDs));
185
186 for (ObjectGuid const& guid : bigPillarGuids)
187 {
189 {
191 go->ResetDoorOrButton();
192 else
193 go->UseDoorOrButton();
194 }
195 }
196
197 GuidVector allObjects;
198 allObjects.insert(std::end(allObjects), std::begin(smallPillarGuids), std::end(smallPillarGuids));
199 allObjects.insert(std::end(allObjects), std::begin(bigPillarGuids), std::end(bigPillarGuids));
200 allObjects.insert(std::end(allObjects), std::begin(_pillarSmallCollisionGUIDs), std::end(_pillarSmallCollisionGUIDs));
201 allObjects.insert(std::end(allObjects), std::begin(_pillarBigCollisionGUIDs), std::end(_pillarBigCollisionGUIDs));
202
203 for (ObjectGuid const& guid : allObjects)
204 {
206 {
207 bool isCollision = false;
208 switch (go->GetEntry())
209 {
214 isCollision = true;
215 break;
216 default:
217 break;
218 }
219
220 if (isCollision)
221 {
222 GOState state = ((go->GetGOInfo()->door.startOpen != 0) == _pillarCollision) ? GO_STATE_ACTIVE : GO_STATE_READY;
223 go->SetGoState(state);
224 }
225
226 for (auto const& [playerGuid, _]: battleground->GetPlayers())
227 if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
228 go->SendUpdateToPlayer(player);
229 }
230 }
231
233 }
234
235 void OnGameObjectCreate(GameObject* gameobject) override
236 {
238
239 switch (gameobject->GetEntry())
240 {
243 _elevatorGUIDs.emplace_back(gameobject->GetGUID());
244 break;
247 _fireGUIDs.emplace_back(gameobject->GetGUID());
248 break;
251 _firedoorGUIDs.emplace_back(gameobject->GetGUID());
252 break;
255 _gearGUIDs.emplace_back(gameobject->GetGUID());
256 break;
259 _pillarSmallGUIDs.emplace_back(gameobject->GetGUID());
260 break;
263 _pillarBigGUIDs.emplace_back(gameobject->GetGUID());
264 break;
267 _pillarSmallCollisionGUIDs.emplace_back(gameobject->GetGUID());
268 break;
271 _pillarBigCollisionGUIDs.emplace_back(gameobject->GetGUID());
272 break;
275 _pulleyGUIDs.emplace_back(gameobject->GetGUID());
276 break;
277 default:
278 break;
279 }
280 }
281
282private:
293
297};
298
@ STATUS_IN_PROGRESS
uint32_t uint32
Definition Define.h:154
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:434
#define RegisterBattlegroundMapScript(script_name, mapId)
Definition ScriptMgr.h:1447
GOState
@ GO_STATE_READY
@ GO_STATE_ACTIVE
void AddSC_arena_ring_of_valor()
GameObject * CreateObject(uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, GOState goState=GO_STATE_READY) const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
Battleground * battleground
BattlegroundMap * battlegroundMap
BattlegroundPlayerMap const & GetPlayers() const
BattlegroundStatus GetStatus() const
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:3552
uint32 GetEntry() const
Definition Object.h:89
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
virtual void OnGameObjectCreate(GameObject *)
Definition ZoneScript.h:79
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
void OnGameObjectCreate(GameObject *gameobject) override
void OnUpdate(uint32 diff) override
arena_ring_of_valor(BattlegroundMap *map)