[6922] Whitespace and newline fixes
[getmangos.git] / src / game / GameObject.h
blob0961a9cfc6c74ca0be962fc386b660f3a09a82c0
1 /*
2 * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
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.
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.
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
19 #ifndef MANGOSSERVER_GAMEOBJECT_H
20 #define MANGOSSERVER_GAMEOBJECT_H
22 #include "Common.h"
23 #include "SharedDefines.h"
24 #include "Object.h"
25 #include "LootMgr.h"
26 #include "Database/DatabaseEnv.h"
28 // GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push,N), also any gcc version not support it at some platform
29 #if defined( __GNUC__ )
30 #pragma pack(1)
31 #else
32 #pragma pack(push,1)
33 #endif
35 // from `gameobject_template`
36 struct GameObjectInfo
38 uint32 id;
39 uint32 type;
40 uint32 displayId;
41 char *name;
42 char *castBarCaption;
43 uint32 faction;
44 uint32 flags;
45 float size;
46 union // different GO types have different data field
48 //0 GAMEOBJECT_TYPE_DOOR
49 struct
51 uint32 startOpen; //0 used client side to determine GO_ACTIVATED means open/closed
52 uint32 lockId; //1 -> Lock.dbc
53 uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
54 uint32 noDamageImmune; //3 break opening whenever you recieve damage?
55 uint32 openTextID; //4 can be used to replace castBarCaption?
56 uint32 closeTextID; //5
57 } door;
58 //1 GAMEOBJECT_TYPE_BUTTON
59 struct
61 uint32 startOpen; //0
62 uint32 lockId; //1 -> Lock.dbc
63 uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
64 uint32 linkedTrap; //3
65 uint32 noDamageImmune; //4 isBattlegroundObject
66 uint32 large; //5
67 uint32 openTextID; //6 can be used to replace castBarCaption?
68 uint32 closeTextID; //7
69 uint32 losOK; //8
70 } button;
71 //2 GAMEOBJECT_TYPE_QUESTGIVER
72 struct
74 uint32 lockId; //0 -> Lock.dbc
75 uint32 questList; //1
76 uint32 pageMaterial; //2
77 uint32 gossipID; //3
78 uint32 customAnim; //4
79 uint32 noDamageImmune; //5
80 uint32 openTextID; //6 can be used to replace castBarCaption?
81 uint32 losOK; //7
82 uint32 allowMounted; //8
83 uint32 large; //9
84 } questgiver;
85 //3 GAMEOBJECT_TYPE_CHEST
86 struct
88 uint32 lockId; //0 -> Lock.dbc
89 uint32 lootId; //1
90 uint32 chestRestockTime; //2
91 uint32 consumable; //3
92 uint32 minSuccessOpens; //4
93 uint32 maxSuccessOpens; //5
94 uint32 eventId; //6 lootedEvent
95 uint32 linkedTrapId; //7
96 uint32 questId; //8 not used currently but store quest required for GO activation for player
97 uint32 level; //9
98 uint32 losOK; //10
99 uint32 leaveLoot; //11
100 uint32 notInCombat; //12
101 uint32 logLoot; //13
102 uint32 openTextID; //14 can be used to replace castBarCaption?
103 uint32 groupLootRules; //15
104 } chest;
105 //5 GAMEOBJECT_TYPE_GENERIC
106 struct
108 uint32 floatingTooltip; //0
109 uint32 highlight; //1
110 uint32 serverOnly; //2
111 uint32 large; //3
112 uint32 floatOnWater; //4
113 uint32 questID; //5
114 } _generic;
115 //6 GAMEOBJECT_TYPE_TRAP
116 struct
118 uint32 lockId; //0 -> Lock.dbc
119 uint32 level; //1
120 uint32 radius; //2 radius for trap activation
121 uint32 spellId; //3
122 uint32 charges; //4 need respawn (if > 0)
123 uint32 cooldown; //5 time in secs
124 uint32 autoCloseTime; //6
125 uint32 startDelay; //7
126 uint32 serverOnly; //8
127 uint32 stealthed; //9
128 uint32 large; //10
129 uint32 stealthAffected; //11
130 uint32 openTextID; //12 can be used to replace castBarCaption?
131 uint32 closeTextID; //13
132 } trap;
133 //7 GAMEOBJECT_TYPE_CHAIR
134 struct
136 uint32 slots; //0
137 uint32 height; //1
138 uint32 onlyCreatorUse; //2
139 } chair;
140 //8 GAMEOBJECT_TYPE_SPELL_FOCUS
141 struct
143 uint32 focusId; //0
144 uint32 dist; //1
145 uint32 linkedTrapId; //2
146 uint32 serverOnly; //3
147 uint32 questID; //4
148 uint32 large; //5
149 } spellFocus;
150 //9 GAMEOBJECT_TYPE_TEXT
151 struct
153 uint32 pageID; //0
154 uint32 language; //1
155 uint32 pageMaterial; //2
156 uint32 allowMounted; //3
157 } text;
158 //10 GAMEOBJECT_TYPE_GOOBER
159 struct
161 uint32 lockId; //0 -> Lock.dbc
162 uint32 questId; //1
163 uint32 eventId; //2
164 uint32 autoCloseTime; //3
165 uint32 customAnim; //4
166 uint32 consumable; //5
167 uint32 cooldown; //6
168 uint32 pageId; //7
169 uint32 language; //8
170 uint32 pageMaterial; //9
171 uint32 spellId; //10
172 uint32 noDamageImmune; //11
173 uint32 linkedTrapId; //12
174 uint32 large; //13
175 uint32 openTextID; //14 can be used to replace castBarCaption?
176 uint32 closeTextID; //15
177 uint32 losOK; //16 isBattlegroundObject
178 uint32 allowMounted; //17
179 } goober;
180 //11 GAMEOBJECT_TYPE_TRANSPORT
181 struct
183 uint32 pause; //0
184 uint32 startOpen; //1
185 uint32 autoCloseTime; //2 secs till autoclose = autoCloseTime / 0x10000
186 } transport;
187 //12 GAMEOBJECT_TYPE_AREADAMAGE
188 struct
190 uint32 lockId; //0
191 uint32 radius; //1
192 uint32 damageMin; //2
193 uint32 damageMax; //3
194 uint32 damageSchool; //4
195 uint32 autoCloseTime; //5 secs till autoclose = autoCloseTime / 0x10000
196 uint32 openTextID; //6
197 uint32 closeTextID; //7
198 } areadamage;
199 //13 GAMEOBJECT_TYPE_CAMERA
200 struct
202 uint32 lockId; //0 -> Lock.dbc
203 uint32 cinematicId; //1
204 uint32 eventID; //2
205 uint32 openTextID; //3 can be used to replace castBarCaption?
206 } camera;
207 //15 GAMEOBJECT_TYPE_MO_TRANSPORT
208 struct
210 uint32 taxiPathId; //0
211 uint32 moveSpeed; //1
212 uint32 accelRate; //2
213 uint32 startEventID; //3
214 uint32 stopEventID; //4
215 uint32 transportPhysics; //5
216 uint32 mapID; //6
217 } moTransport;
218 //17 GAMEOBJECT_TYPE_FISHINGNODE
219 struct
221 uint32 _data0; //0
222 uint32 lootId; //1
223 } fishnode;
224 //18 GAMEOBJECT_TYPE_SUMMONING_RITUAL
225 struct
227 uint32 reqParticipants; //0
228 uint32 spellId; //1
229 uint32 animSpell; //2
230 uint32 ritualPersistent; //3
231 uint32 casterTargetSpell; //4
232 uint32 casterTargetSpellTargets; //5
233 uint32 castersGrouped; //6
234 uint32 ritualNoTargetCheck; //7
235 } summoningRitual;
236 //20 GAMEOBJECT_TYPE_AUCTIONHOUSE
237 struct
239 uint32 actionHouseID; //0
240 } auctionhouse;
241 //21 GAMEOBJECT_TYPE_GUARDPOST
242 struct
244 uint32 creatureID; //0
245 uint32 charges; //1
246 } guardpost;
247 //22 GAMEOBJECT_TYPE_SPELLCASTER
248 struct
250 uint32 spellId; //0
251 uint32 charges; //1
252 uint32 partyOnly; //2
253 } spellcaster;
254 //23 GAMEOBJECT_TYPE_MEETINGSTONE
255 struct
257 uint32 minLevel; //0
258 uint32 maxLevel; //1
259 uint32 areaID; //2
260 } meetingstone;
261 //24 GAMEOBJECT_TYPE_FLAGSTAND
262 struct
264 uint32 lockId; //0
265 uint32 pickupSpell; //1
266 uint32 radius; //2
267 uint32 returnAura; //3
268 uint32 returnSpell; //4
269 uint32 noDamageImmune; //5
270 uint32 openTextID; //6
271 uint32 losOK; //7
272 } flagstand;
273 //25 GAMEOBJECT_TYPE_FISHINGHOLE // not implemented yet
274 struct
276 uint32 radius; //0 how close bobber must land for sending loot
277 uint32 lootId; //1
278 uint32 minSuccessOpens; //2
279 uint32 maxSuccessOpens; //3
280 uint32 lockId; //4 -> Lock.dbc; possibly 1628 for all?
281 } fishinghole;
282 //26 GAMEOBJECT_TYPE_FLAGDROP
283 struct
285 uint32 lockId; //0
286 uint32 eventID; //1
287 uint32 pickupSpell; //2
288 uint32 noDamageImmune; //3
289 uint32 openTextID; //4
290 } flagdrop;
291 //27 GAMEOBJECT_TYPE_MINI_GAME
292 struct
294 uint32 gameType; //0
295 } miniGame;
296 //29 GAMEOBJECT_TYPE_CAPTURE_POINT
297 struct
299 uint32 radius; //0
300 uint32 spell; //1
301 uint32 worldState1; //2
302 uint32 worldstate2; //3
303 uint32 winEventID1; //4
304 uint32 winEventID2; //5
305 uint32 contestedEventID1; //6
306 uint32 contestedEventID2; //7
307 uint32 progressEventID1; //8
308 uint32 progressEventID2; //9
309 uint32 neutralEventID1; //10
310 uint32 neutralEventID2; //11
311 uint32 neutralPercent; //12
312 uint32 worldstate3; //13
313 uint32 minSuperiority; //14
314 uint32 maxSuperiority; //15
315 uint32 minTime; //16
316 uint32 maxTime; //17
317 uint32 large; //18
318 uint32 highlight; //19
319 } capturePoint;
320 //30 GAMEOBJECT_TYPE_AURA_GENERATOR
321 struct
323 uint32 startOpen; //0
324 uint32 radius; //1
325 uint32 auraID1; //2
326 uint32 conditionID1; //3
327 uint32 auraID2; //4
328 uint32 conditionID2; //5
329 uint32 serverOnly; //6
330 } auraGenerator;
331 //31 GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY
332 struct
334 uint32 mapID; //0
335 uint32 difficulty; //1
336 } dungeonDifficulty;
337 //32 GAMEOBJECT_TYPE_DO_NOT_USE_YET
338 struct
340 uint32 mapID; //0
341 uint32 difficulty; //1
342 } doNotUseYet;
343 //33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
344 struct
346 uint32 dmgPctState1; //0
347 uint32 dmgPctState2; //1
348 uint32 state1Name; //2
349 uint32 state2Name; //3
350 } destructibleBuilding;
352 // not use for specific field access (only for output with loop by all filed), also this determinate max union size
353 struct // GAMEOBJECT_TYPE_SPELLCASTER
355 uint32 data[24];
356 } raw;
358 uint32 ScriptId;
361 struct GameObjectLocale
363 std::vector<std::string> Name;
364 std::vector<std::string> CastBarCaption;
367 // from `gameobject`
368 struct GameObjectData
370 uint32 id; // entry in gamobject_template
371 uint32 mapid;
372 float posX;
373 float posY;
374 float posZ;
375 float orientation;
376 float rotation0;
377 float rotation1;
378 float rotation2;
379 float rotation3;
380 int32 spawntimesecs;
381 uint32 animprogress;
382 uint32 go_state;
383 uint8 spawnMask;
386 // GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
387 #if defined( __GNUC__ )
388 #pragma pack()
389 #else
390 #pragma pack(pop)
391 #endif
393 // For containers: [GO_NOT_READY]->GO_READY (close)->GO_ACTIVATED (open) ->GO_JUST_DEACTIVATED->GO_READY -> ...
394 // For bobber: GO_NOT_READY ->GO_READY (close)->GO_ACTIVATED (open) ->GO_JUST_DEACTIVATED-><deleted>
395 // For door(closed):[GO_NOT_READY]->GO_READY (close)->GO_ACTIVATED (open) ->GO_JUST_DEACTIVATED->GO_READY(close) -> ...
396 // For door(open): [GO_NOT_READY]->GO_READY (open) ->GO_ACTIVATED (close)->GO_JUST_DEACTIVATED->GO_READY(open) -> ...
397 enum LootState
399 GO_NOT_READY = 0,
400 GO_READY, // can be ready but despawned, and then not possible activate until spawn
401 GO_ACTIVATED,
402 GO_JUST_DEACTIVATED
405 class Unit;
407 // 5 sec for bobber catch
408 #define FISHING_BOBBER_READY_TIME 5
410 class MANGOS_DLL_SPEC GameObject : public WorldObject
412 public:
413 explicit GameObject();
414 ~GameObject();
416 void AddToWorld();
417 void RemoveFromWorld();
419 bool Create(uint32 guidlow, uint32 name_id, Map *map, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 animprogress, uint32 go_state);
420 void Update(uint32 p_time);
421 static GameObject* GetGameObject(WorldObject& object, uint64 guid);
422 GameObjectInfo const* GetGOInfo() const;
424 bool IsTransport() const;
426 void SetOwnerGUID(uint64 owner)
428 m_spawnedByDefault = false; // all object with owner is despawned after delay
429 SetUInt64Value(OBJECT_FIELD_CREATED_BY, owner);
431 uint64 GetOwnerGUID() const { return GetUInt64Value(OBJECT_FIELD_CREATED_BY); }
432 Unit* GetOwner() const;
434 uint32 GetDBTableGUIDLow() const { return m_DBTableGuid; }
436 void Say(const char* text, uint32 language, uint64 TargetGuid) { MonsterSay(text,language,TargetGuid); }
437 void Yell(const char* text, uint32 language, uint64 TargetGuid) { MonsterYell(text,language,TargetGuid); }
438 void TextEmote(const char* text, uint64 TargetGuid) { MonsterTextEmote(text,TargetGuid); }
439 void Whisper(const char* text,uint64 receiver) { MonsterWhisper(text,receiver); }
440 void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); }
441 void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
442 void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
443 void Whisper(int32 textId, uint64 receiver) { MonsterWhisper(textId,receiver); }
445 // overwrite WorldObject function for proper name localization
446 const char* GetNameForLocaleIdx(int32 locale_idx) const;
448 void SaveToDB();
449 void SaveToDB(uint32 mapid, uint8 spawnMask);
450 bool LoadFromDB(uint32 guid, Map *map);
451 void DeleteFromDB();
452 void SetLootState(LootState s) { m_lootState = s; }
453 static uint32 GetLootId(GameObjectInfo const* info);
454 uint32 GetLootId() const { return GetLootId(GetGOInfo()); }
455 uint32 GetLockId() const
457 switch(GetGoType())
459 case GAMEOBJECT_TYPE_DOOR: return GetGOInfo()->door.lockId;
460 case GAMEOBJECT_TYPE_BUTTON: return GetGOInfo()->button.lockId;
461 case GAMEOBJECT_TYPE_QUESTGIVER: return GetGOInfo()->questgiver.lockId;
462 case GAMEOBJECT_TYPE_CHEST: return GetGOInfo()->chest.lockId;
463 case GAMEOBJECT_TYPE_TRAP: return GetGOInfo()->trap.lockId;
464 case GAMEOBJECT_TYPE_GOOBER: return GetGOInfo()->goober.lockId;
465 case GAMEOBJECT_TYPE_AREADAMAGE: return GetGOInfo()->areadamage.lockId;
466 case GAMEOBJECT_TYPE_CAMERA: return GetGOInfo()->camera.lockId;
467 case GAMEOBJECT_TYPE_FLAGSTAND: return GetGOInfo()->flagstand.lockId;
468 case GAMEOBJECT_TYPE_FISHINGHOLE:return GetGOInfo()->fishinghole.lockId;
469 case GAMEOBJECT_TYPE_FLAGDROP: return GetGOInfo()->flagdrop.lockId;
470 default: return 0;
474 time_t GetRespawnTime() const { return m_respawnTime; }
475 time_t GetRespawnTimeEx() const
477 time_t now = time(NULL);
478 if(m_respawnTime > now)
479 return m_respawnTime;
480 else
481 return now;
484 void SetRespawnTime(int32 respawn)
486 m_respawnTime = respawn > 0 ? time(NULL) + respawn : 0;
487 m_respawnDelayTime = respawn > 0 ? respawn : 0;
489 void Respawn();
490 bool isSpawned() const
492 return m_respawnDelayTime == 0 ||
493 (m_respawnTime > 0 && !m_spawnedByDefault) ||
494 (m_respawnTime == 0 && m_spawnedByDefault);
496 bool isSpawnedByDefault() const { return m_spawnedByDefault; }
497 uint32 GetRespawnDelay() const { return m_respawnDelayTime; }
498 void Refresh();
499 void Delete();
500 void SetSpellId(uint32 id) { m_spellId = id;}
501 uint32 GetSpellId() const { return m_spellId;}
502 void getFishLoot(Loot *loot);
503 GameobjectTypes GetGoType() const { return GameobjectTypes(GetUInt32Value(GAMEOBJECT_TYPE_ID)); }
504 void SetGoType(GameobjectTypes type) { SetUInt32Value(GAMEOBJECT_TYPE_ID, type); }
505 uint32 GetGoState() const { return GetUInt32Value(GAMEOBJECT_STATE); }
506 void SetGoState(uint32 state) { SetUInt32Value(GAMEOBJECT_STATE, state); }
507 uint32 GetGoArtKit() const { return GetUInt32Value(GAMEOBJECT_ARTKIT); }
508 void SetGoArtKit(uint32 artkit) { SetUInt32Value(GAMEOBJECT_ARTKIT, artkit); }
509 uint32 GetGoAnimProgress() const { return GetUInt32Value(GAMEOBJECT_ANIMPROGRESS); }
510 void SetGoAnimProgress(uint32 animprogress) { SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, animprogress); }
512 void Use(Unit* user);
514 LootState getLootState() const { return m_lootState; }
516 void AddToSkillupList(uint32 PlayerGuidLow) { m_SkillupList.push_back(PlayerGuidLow); }
517 bool IsInSkillupList(uint32 PlayerGuidLow) const
519 for (std::list<uint32>::const_iterator i = m_SkillupList.begin(); i != m_SkillupList.end(); ++i)
520 if (*i == PlayerGuidLow) return true;
521 return false;
523 void ClearSkillupList() { m_SkillupList.clear(); }
525 void AddUniqueUse(Player* player);
526 void AddUse() { ++m_usetimes; }
528 uint32 GetUseCount() const { return m_usetimes; }
529 uint32 GetUniqueUseCount() const { return m_unique_users.size(); }
531 void SaveRespawnTime();
533 Loot loot;
535 bool hasQuest(uint32 quest_id) const;
536 bool hasInvolvedQuest(uint32 quest_id) const;
537 bool ActivateToQuest(Player *pTarget) const;
538 void UseDoorOrButton(uint32 time_to_restore = 0); // 0 = use `gameobject`.`spawntimesecs`
540 uint32 GetLinkedGameObjectEntry() const
542 switch(GetGoType())
544 case GAMEOBJECT_TYPE_CHEST: return GetGOInfo()->chest.linkedTrapId;
545 case GAMEOBJECT_TYPE_SPELL_FOCUS: return GetGOInfo()->spellFocus.linkedTrapId;
546 case GAMEOBJECT_TYPE_GOOBER: return GetGOInfo()->goober.linkedTrapId;
547 default: return 0;
551 uint32 GetAutoCloseTime() const
553 uint32 autoCloseTime = 0;
554 switch(GetGoType())
556 case GAMEOBJECT_TYPE_DOOR: autoCloseTime = GetGOInfo()->door.autoCloseTime; break;
557 case GAMEOBJECT_TYPE_BUTTON: autoCloseTime = GetGOInfo()->button.autoCloseTime; break;
558 case GAMEOBJECT_TYPE_TRAP: autoCloseTime = GetGOInfo()->trap.autoCloseTime; break;
559 case GAMEOBJECT_TYPE_GOOBER: autoCloseTime = GetGOInfo()->goober.autoCloseTime; break;
560 case GAMEOBJECT_TYPE_TRANSPORT: autoCloseTime = GetGOInfo()->transport.autoCloseTime; break;
561 case GAMEOBJECT_TYPE_AREADAMAGE: autoCloseTime = GetGOInfo()->areadamage.autoCloseTime; break;
562 default: break;
564 return autoCloseTime / 0x10000;
567 void TriggeringLinkedGameObject( uint32 trapEntry, Unit* target);
569 bool isVisibleForInState(Player const* u, bool inVisibleList) const;
571 GameObject* LookupFishingHoleAround(float range);
573 GridReference<GameObject> &GetGridRef() { return m_gridRef; }
574 protected:
575 uint32 m_charges; // Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22)
576 uint32 m_spellId;
577 time_t m_respawnTime; // (secs) time of next respawn (or despawn if GO have owner()),
578 uint32 m_respawnDelayTime; // (secs) if 0 then current GO state no dependent from timer
579 LootState m_lootState;
580 bool m_spawnedByDefault;
581 time_t m_cooldownTime; // used as internal reaction delay time store (not state change reaction).
582 // For traps this: spell casting cooldown, for doors/buttons: reset time.
583 std::list<uint32> m_SkillupList;
585 std::set<uint32> m_unique_users;
586 uint32 m_usetimes;
588 uint32 m_DBTableGuid; ///< For new or temporary gameobjects is 0 for saved it is lowguid
589 GameObjectInfo const* m_goInfo;
590 private:
591 void SwitchDoorOrButton(bool activate);
593 GridReference<GameObject> m_gridRef;
595 #endif