AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
GameEventMgr Class Reference

#include "GameEventMgr.h"

Public Types

typedef std::set< uint16ActiveEvents
 
typedef std::vector< GameEventDataGameEventDataMap
 

Public Member Functions

ActiveEvents const & GetActiveEventList () const
 
GameEventDataMap const & GetEventMap () const
 
bool CheckOneGameEvent (uint16 entry) const
 
uint32 NextCheck (uint16 entry) const
 
void LoadFromDB ()
 
void LoadHolidayDates ()
 
uint32 Update ()
 
bool IsActiveEvent (uint16 eventId)
 
uint32 StartSystem ()
 
void Initialize ()
 
void StartInternalEvent (uint16 event_id)
 
bool StartEvent (uint16 event_id, bool overwrite=false)
 
void StopEvent (uint16 event_id, bool overwrite=false)
 
void HandleQuestComplete (uint32 quest_id)
 
uint32 GetNPCFlag (Creature *cr)
 
void LoadEventVendors ()
 
uint32 GetHolidayEventId (uint32 holidayId) const
 
uint8 GetHolidayMainStage (uint32 holidayId) const
 

Static Public Member Functions

static GameEventMgrinstance ()
 

Public Attributes

GameEventGuidMap GameEventCreatureGuids
 
GameEventGuidMap GameEventGameobjectGuids
 
std::vector< uint32ModifiedHolidays
 

Private Types

typedef std::list< ObjectGuid::LowTypeGuidLowList
 
typedef std::list< uint32IdList
 
typedef std::vector< GuidLowListGameEventGuidMap
 
typedef std::vector< IdListGameEventIdMap
 
typedef std::pair< ObjectGuid::LowType, ModelEquipModelEquipPair
 
typedef std::list< ModelEquipPairModelEquipList
 
typedef std::vector< ModelEquipListGameEventModelEquipMap
 
typedef std::pair< uint32, uint32QuestRelation
 
typedef std::list< QuestRelationQuestRelList
 
typedef std::vector< QuestRelListGameEventQuestMap
 
typedef std::list< NPCVendorEntryNPCVendorList
 
typedef std::vector< NPCVendorListGameEventNPCVendorMap
 
typedef std::map< uint32, GameEventQuestToEventConditionNumQuestIdToEventConditionMap
 
typedef std::pair< ObjectGuid::LowType, uint32GuidNPCFlagPair
 
typedef std::list< GuidNPCFlagPairNPCFlagList
 
typedef std::vector< NPCFlagListGameEventNPCFlagMap
 
typedef std::vector< uint32GameEventBitmask
 
typedef std::unordered_map< uint32, std::vector< uint32 > > GameEventSeasonalQuestsMap
 
typedef std::unordered_map< uint32, uint8HolidayMainStageMap
 

Private Member Functions

 GameEventMgr ()
 
 ~GameEventMgr ()=default
 
void LoadEvents ()
 
void LoadEventSaveData ()
 
void LoadEventPrerequisiteData ()
 
void LoadEventCreatureData ()
 
void LoadEventGameObjectData ()
 
void LoadEventModelEquipmentChangeData ()
 
void LoadEventQuestData ()
 
void LoadEventGameObjectQuestData ()
 
void LoadEventQuestConditionData ()
 
void LoadEventConditionData ()
 
void LoadEventConditionSaveData ()
 
void LoadEventNPCFlags ()
 
void LoadEventSeasonalQuestRelations ()
 
void LoadEventBattlegroundData ()
 
void LoadEventPoolData ()
 
void SendWorldStateUpdate (Player *player, uint16 eventId)
 
void AddActiveEvent (uint16 eventId)
 
void RemoveActiveEvent (uint16 eventId)
 
void ApplyNewEvent (uint16 eventId)
 
void UnApplyEvent (uint16 eventId)
 
void GameEventSpawn (int16 eventId)
 
void GameEventUnspawn (int16 eventId)
 
void ChangeEquipOrModel (int16 eventId, bool activate)
 
void UpdateEventQuests (uint16 eventId, bool activate)
 
void UpdateWorldStates (uint16 eventId, bool Activate)
 
void UpdateEventNPCFlags (uint16 eventId)
 
void UpdateEventNPCVendor (uint16 eventId, bool activate)
 
void UpdateBattlegroundSettings ()
 
void RunSmartAIScripts (uint16 eventId, bool activate)
 
bool CheckOneGameEventConditions (uint16 eventId)
 Runs SMART_EVENT_GAME_EVENT_START/_END SAI.
 
void SaveWorldEventStateToDB (uint16 eventId)
 
bool HasCreatureQuestActiveEventExcept (uint32 quest_id, uint16 eventId)
 
bool HasGameObjectQuestActiveEventExcept (uint32 quest_id, uint16 eventId)
 
bool HasCreatureActiveEventExcept (ObjectGuid::LowType creature_guid, uint16 eventId)
 
bool HasGameObjectActiveEventExcept (ObjectGuid::LowType go_guid, uint16 eventId)
 
void SetHolidayEventTime (GameEventData &event)
 

Private Attributes

GameEventQuestMap _gameEventCreatureQuests
 
GameEventQuestMap _gameEventGameObjectQuests
 
GameEventNPCVendorMap _gameEventVendors
 
GameEventModelEquipMap _gameEventModelEquip
 
GameEventIdMap _gameEventPoolIds
 
GameEventDataMap _gameEvent
 
GameEventBitmask _gameEventBattlegroundHolidays
 
QuestIdToEventConditionMap _questToEventConditions
 
GameEventNPCFlagMap _gameEventNPCFlags
 
ActiveEvents _activeEvents
 
bool _isSystemInit
 
GameEventSeasonalQuestsMap _gameEventSeasonalQuestsMap
 
HolidayMainStageMap _holidayMainStages
 

Detailed Description

Member Typedef Documentation

◆ ActiveEvents

◆ GameEventBitmask

typedef std::vector<uint32> GameEventMgr::GameEventBitmask
private

◆ GameEventDataMap

◆ GameEventGuidMap

typedef std::vector<GuidLowList> GameEventMgr::GameEventGuidMap
private

◆ GameEventIdMap

typedef std::vector<IdList> GameEventMgr::GameEventIdMap
private

◆ GameEventModelEquipMap

◆ GameEventNPCFlagMap

typedef std::vector<NPCFlagList> GameEventMgr::GameEventNPCFlagMap
private

◆ GameEventNPCVendorMap

typedef std::vector<NPCVendorList> GameEventMgr::GameEventNPCVendorMap
private

◆ GameEventQuestMap

typedef std::vector<QuestRelList> GameEventMgr::GameEventQuestMap
private

◆ GameEventSeasonalQuestsMap

typedef std::unordered_map<uint32, std::vector<uint32> > GameEventMgr::GameEventSeasonalQuestsMap
private

◆ GuidLowList

typedef std::list<ObjectGuid::LowType> GameEventMgr::GuidLowList
private

◆ GuidNPCFlagPair

◆ HolidayMainStageMap

typedef std::unordered_map<uint32 , uint8 > GameEventMgr::HolidayMainStageMap
private

◆ IdList

typedef std::list<uint32> GameEventMgr::IdList
private

◆ ModelEquipList

typedef std::list<ModelEquipPair> GameEventMgr::ModelEquipList
private

◆ ModelEquipPair

◆ NPCFlagList

typedef std::list<GuidNPCFlagPair> GameEventMgr::NPCFlagList
private

◆ NPCVendorList

typedef std::list<NPCVendorEntry> GameEventMgr::NPCVendorList
private

◆ QuestIdToEventConditionMap

◆ QuestRelation

typedef std::pair<uint32, uint32> GameEventMgr::QuestRelation
private

◆ QuestRelList

typedef std::list<QuestRelation> GameEventMgr::QuestRelList
private

Constructor & Destructor Documentation

◆ GameEventMgr()

GameEventMgr::GameEventMgr ( )
private
1786 : _isSystemInit(false)
1787{
1788}
bool _isSystemInit
Definition GameEventMgr.h:195

◆ ~GameEventMgr()

GameEventMgr::~GameEventMgr ( )
privatedefault

Member Function Documentation

◆ AddActiveEvent()

void GameEventMgr::AddActiveEvent ( uint16  eventId)
inlineprivate
145{ _activeEvents.insert(eventId); }
ActiveEvents _activeEvents
Definition GameEventMgr.h:194

References _activeEvents.

Referenced by StartEvent().

◆ ApplyNewEvent()

void GameEventMgr::ApplyNewEvent ( uint16  eventId)
private

Run SAI scripts with SMART_EVENT_GAME_EVENT_START

1360{
1361 uint8 announce = _gameEvent[eventId].Announce;
1362 if (announce == 1 || (announce == 2 && sWorld->getIntConfig(CONFIG_EVENT_ANNOUNCE)))
1363 ChatHandler(nullptr).SendWorldText(LANG_EVENTMESSAGE, _gameEvent[eventId].Description);
1364
1365 LOG_DEBUG("gameevent", "GameEvent {} \"{}\" started.", eventId, _gameEvent[eventId].Description);
1366
1367 // spawn positive event tagget objects
1368 GameEventSpawn(eventId);
1369 // un-spawn negative event tagged objects
1370 int16 numEventId = (-1) * eventId;
1371 GameEventUnspawn(numEventId);
1372 // Change equipement or model
1373 ChangeEquipOrModel(eventId, true);
1374 // Add quests that are events only to non event npc
1375 UpdateEventQuests(eventId, true);
1376 UpdateWorldStates(eventId, true);
1377 // update npcflags in this event
1378 UpdateEventNPCFlags(eventId);
1379 // add vendor items
1380 UpdateEventNPCVendor(eventId, true);
1381 // update bg holiday
1383
1385 RunSmartAIScripts(eventId, true);
1386
1387 // If event's worldstate is 0, it means the event hasn't been started yet. In that case, reset seasonal quests.
1388 // When event ends (if it expires or if it's stopped via commands) worldstate will be set to 0 again, ready for another seasonal quest reset.
1389 if (sWorldState->getWorldState(eventId) == 0)
1390 {
1391 sWorld->ResetEventSeasonalQuests(eventId);
1392 }
1393}
std::uint8_t uint8
Definition Define.h:109
std::int16_t int16
Definition Define.h:104
@ LANG_EVENTMESSAGE
Definition Language.h:36
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
@ CONFIG_EVENT_ANNOUNCE
Definition WorldConfig.h:240
#define sWorldState
Definition WorldState.h:377
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:139
void UpdateWorldStates(uint16 eventId, bool Activate)
Definition GameEventMgr.cpp:1766
void UpdateEventQuests(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1711
void GameEventSpawn(int16 eventId)
Definition GameEventMgr.cpp:1449
void GameEventUnspawn(int16 eventId)
Definition GameEventMgr.cpp:1522
GameEventDataMap _gameEvent
Definition GameEventMgr.h:190
void UpdateEventNPCVendor(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1438
void UpdateBattlegroundSettings()
Definition GameEventMgr.cpp:1430
void UpdateEventNPCFlags(uint16 eventId)
Definition GameEventMgr.cpp:1395
void RunSmartAIScripts(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1917
void ChangeEquipOrModel(int16 eventId, bool activate)
Definition GameEventMgr.cpp:1598
#define sWorld
Definition World.h:318

References _gameEvent, ChangeEquipOrModel(), CONFIG_EVENT_ANNOUNCE, GameEventSpawn(), GameEventUnspawn(), LANG_EVENTMESSAGE, LOG_DEBUG, RunSmartAIScripts(), ChatHandler::SendWorldText(), sWorld, sWorldState, UpdateBattlegroundSettings(), UpdateEventNPCFlags(), UpdateEventNPCVendor(), UpdateEventQuests(), and UpdateWorldStates().

Referenced by StartEvent().

◆ ChangeEquipOrModel()

void GameEventMgr::ChangeEquipOrModel ( int16  eventId,
bool  activate 
)
private
1599{
1600 for (ModelEquipList::iterator itr = _gameEventModelEquip[eventId].begin(); itr != _gameEventModelEquip[eventId].end(); ++itr)
1601 {
1602 // Remove the creature from grid
1603 CreatureData const* data = sObjectMgr->GetCreatureData(itr->first);
1604 if (!data)
1605 continue;
1606
1607 // Update if spawned
1608 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr, activate](Map* map)
1609 {
1610 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(itr->first);
1611 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second; ++itr2)
1612 {
1613 Creature* creature = itr2->second;
1614 if (activate)
1615 {
1616 itr->second.EquipementIdPrev = creature->GetCurrentEquipmentId();
1617 itr->second.ModelIdPrev = creature->GetDisplayId();
1618 creature->LoadEquipment(itr->second.EquipmentId, true);
1619 if (itr->second.ModelId > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelId))
1620 {
1621 creature->SetDisplayId(itr->second.ModelId);
1622 creature->SetNativeDisplayId(itr->second.ModelId);
1623 }
1624 }
1625 else
1626 {
1627 creature->LoadEquipment(itr->second.EquipementIdPrev, true);
1628 if (itr->second.ModelIdPrev > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelIdPrev))
1629 {
1630 creature->SetDisplayId(itr->second.ModelIdPrev);
1631 creature->SetNativeDisplayId(itr->second.ModelIdPrev);
1632 }
1633 }
1634 }
1635 });
1636
1637 // now last step: put in data
1638 // just to have write access to it
1639 CreatureData& data2 = sObjectMgr->NewOrExistCreatureData(itr->first);
1640 if (activate)
1641 {
1642 itr->second.ModelIdPrev = data2.displayid;
1643 itr->second.EquipementIdPrev = data2.equipmentId;
1644 data2.displayid = itr->second.ModelId;
1645 data2.equipmentId = itr->second.EquipmentId;
1646 }
1647 else
1648 {
1649 data2.displayid = itr->second.ModelIdPrev;
1650 data2.equipmentId = itr->second.EquipementIdPrev;
1651 }
1652 }
1653}
#define sMapMgr
Definition MapMgr.h:220
#define sObjectMgr
Definition ObjectMgr.h:1730
GameEventModelEquipMap _gameEventModelEquip
Definition GameEventMgr.h:188
Definition Map.h:168
Definition CreatureData.h:370
uint32 displayid
Definition CreatureData.h:375
int8 equipmentId
Definition CreatureData.h:376
uint16 mapid
Definition SpawnData.h:69

References _gameEventModelEquip, CreatureData::displayid, CreatureData::equipmentId, SpawnData::mapid, sMapMgr, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ CheckOneGameEvent()

bool GameEventMgr::CheckOneGameEvent ( uint16  entry) const
47{
48 switch (_gameEvent[entry].State)
49 {
50 default:
52 {
53 time_t currenttime = GameTime::GetGameTime().count();
54 // Get the event information
55 return _gameEvent[entry].Start < currenttime
56 && currenttime < _gameEvent[entry].End
57 && (currenttime - _gameEvent[entry].Start) % (_gameEvent[entry].Occurence * MINUTE) < _gameEvent[entry].Length * MINUTE;
58 }
59 // if the state is conditions or nextphase, then the event should be active
62 return true;
63 // finished world events are inactive
66 return false;
67 // if inactive world event, check the prerequisite events
69 {
70 time_t currenttime = GameTime::GetGameTime().count();
71 for (std::set<uint16>::const_iterator itr = _gameEvent[entry].PrerequisiteEvents.begin(); itr != _gameEvent[entry].PrerequisiteEvents.end(); ++itr)
72 {
73 if ((_gameEvent[*itr].State != GAMEEVENT_WORLD_NEXTPHASE && _gameEvent[*itr].State != GAMEEVENT_WORLD_FINISHED) || // if prereq not in nextphase or finished state, then can't start this one
74 _gameEvent[*itr].NextStart > currenttime) // if not in nextphase state for long enough, can't start this one
75 return false;
76 }
77 // all prerequisite events are met
78 // but if there are no prerequisites, this can be only activated through gm command
79 return !(_gameEvent[entry].PrerequisiteEvents.empty());
80 }
81 }
82}
constexpr auto MINUTE
Definition Common.h:47
@ GAMEEVENT_NORMAL
Definition GameEventMgr.h:31
@ GAMEEVENT_INTERNAL
Definition GameEventMgr.h:36
@ GAMEEVENT_WORLD_FINISHED
Definition GameEventMgr.h:35
@ GAMEEVENT_WORLD_CONDITIONS
Definition GameEventMgr.h:33
@ GAMEEVENT_WORLD_NEXTPHASE
Definition GameEventMgr.h:34
@ GAMEEVENT_WORLD_INACTIVE
Definition GameEventMgr.h:32
Seconds GetGameTime()
Definition GameTime.cpp:38

References _gameEvent, GAMEEVENT_INTERNAL, GAMEEVENT_NORMAL, GAMEEVENT_WORLD_CONDITIONS, GAMEEVENT_WORLD_FINISHED, GAMEEVENT_WORLD_INACTIVE, GAMEEVENT_WORLD_NEXTPHASE, GameTime::GetGameTime(), and MINUTE.

Referenced by Update().

◆ CheckOneGameEventConditions()

bool GameEventMgr::CheckOneGameEventConditions ( uint16  eventId)
private

Runs SMART_EVENT_GAME_EVENT_START/_END SAI.

1846{
1847 for (GameEventConditionMap::const_iterator itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1848 if (itr->second.Done < itr->second.ReqNum)
1849 // return false if a condition doesn't match
1850 return false;
1851 // set the phase
1852 _gameEvent[eventId].State = GAMEEVENT_WORLD_NEXTPHASE;
1853 // set the followup events' start time
1854 if (!_gameEvent[eventId].NextStart)
1855 {
1856 time_t currenttime = GameTime::GetGameTime().count();
1857 _gameEvent[eventId].NextStart = currenttime + _gameEvent[eventId].Length * 60;
1858 }
1859 return true;
1860}

References _gameEvent, GAMEEVENT_WORLD_NEXTPHASE, and GameTime::GetGameTime().

Referenced by HandleQuestComplete(), StartEvent(), and Update().

◆ GameEventSpawn()

void GameEventMgr::GameEventSpawn ( int16  eventId)
private
1450{
1451 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1452
1453 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1454 {
1455 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element {} (size: {})",
1456 internal_event_id, GameEventCreatureGuids.size());
1457 return;
1458 }
1459
1460 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1461 {
1462 // Add to correct cell
1463 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1464 {
1465 sObjectMgr->AddCreatureToGrid(*itr, data);
1466
1467 // Spawn if necessary (loaded grids only)
1468 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1469 // We use spawn coords to spawn
1470 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1471 {
1472 Creature* creature = new Creature;
1473 if (!creature->LoadCreatureFromDB(*itr, map))
1474 delete creature;
1475 }
1476 }
1477 }
1478
1479 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1480 {
1481 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element {} (size: {})",
1482 internal_event_id, GameEventGameobjectGuids.size());
1483 return;
1484 }
1485
1486 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1487 {
1488 // Add to correct cell
1489 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1490 {
1491 sObjectMgr->AddGameobjectToGrid(*itr, data);
1492 // Spawn if necessary (loaded grids only)
1493 // this base map checked as non-instanced and then only existed
1494 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1495 // We use current coords to unspawn, not spawn coords since creature can have changed grid
1496 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1497 {
1498 GameObject* pGameobject = sObjectMgr->IsGameObjectStaticTransport(data->id) ? new StaticTransport() : new GameObject();
1499 //TODO: find out when it is add to map
1500 if (!pGameobject->LoadGameObjectFromDB(*itr, map, false))
1501 delete pGameobject;
1502 else
1503 {
1504 if (pGameobject->isSpawnedByDefault())
1505 map->AddToMap(pGameobject);
1506 }
1507 }
1508 }
1509 }
1510
1511 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1512 {
1513 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range _gameEventPoolIds element {} (size: {})",
1514 internal_event_id, _gameEventPoolIds.size());
1515 return;
1516 }
1517
1518 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1519 sPoolMgr->SpawnEventPool(*itr);
1520}
std::int32_t int32
Definition Define.h:103
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sPoolMgr
Definition PoolMgr.h:216
Definition Creature.h:47
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1694
GameEventGuidMap GameEventCreatureGuids
Definition GameEventMgr.h:199
GameEventGuidMap GameEventGameobjectGuids
Definition GameEventMgr.h:200
GameEventIdMap _gameEventPoolIds
Definition GameEventMgr.h:189
Definition GameObject.h:120
bool isSpawnedByDefault() const
Definition GameObject.h:197
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1102
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:206
bool Instanceable() const
Definition Map.h:298
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:307
Definition Transport.h:120
Definition GameObjectData.h:715

References _gameEvent, _gameEventPoolIds, Map::AddToMap(), GameEventCreatureGuids, GameEventGameobjectGuids, Map::Instanceable(), Map::IsGridLoaded(), GameObject::isSpawnedByDefault(), Creature::LoadCreatureFromDB(), GameObject::LoadGameObjectFromDB(), LOG_ERROR, sMapMgr, sObjectMgr, and sPoolMgr.

Referenced by ApplyNewEvent(), UnApplyEvent(), and Update().

◆ GameEventUnspawn()

void GameEventMgr::GameEventUnspawn ( int16  eventId)
private
1523{
1524 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1525
1526 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1527 {
1528 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventCreatureGuids element {} (size: {})",
1529 internal_event_id, GameEventCreatureGuids.size());
1530 return;
1531 }
1532
1533 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1534 {
1535 // check if it's needed by another event, if so, don't remove
1536 if (eventId > 0 && HasCreatureActiveEventExcept(*itr, eventId))
1537 continue;
1538
1539 // Remove the creature from grid
1540 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1541 {
1542 sObjectMgr->RemoveCreatureFromGrid(*itr, data);
1543
1544 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1545 {
1546 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(*itr);
1547 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second;)
1548 {
1549 Creature* creature = itr2->second;
1550 ++itr2;
1551 creature->AddObjectToRemoveList();
1552 }
1553 });
1554 }
1555 }
1556
1557 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1558 {
1559 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventGameobjectGuids element {} (size: {})",
1560 internal_event_id, GameEventGameobjectGuids.size());
1561 return;
1562 }
1563
1564 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1565 {
1566 // check if it's needed by another event, if so, don't remove
1567 if (eventId > 0 && HasGameObjectActiveEventExcept(*itr, eventId))
1568 continue;
1569 // Remove the gameobject from grid
1570 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1571 {
1572 sObjectMgr->RemoveGameobjectFromGrid(*itr, data);
1573
1574 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1575 {
1576 auto gameobjectBounds = map->GetGameObjectBySpawnIdStore().equal_range(*itr);
1577 for (auto itr2 = gameobjectBounds.first; itr2 != gameobjectBounds.second;)
1578 {
1579 GameObject* go = itr2->second;
1580 ++itr2;
1581 go->AddObjectToRemoveList();
1582 }
1583 });
1584 }
1585 }
1586 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1587 {
1588 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element {} (size: {})", internal_event_id, _gameEventPoolIds.size());
1589 return;
1590 }
1591
1592 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1593 {
1594 sPoolMgr->DespawnEventPool(*itr);
1595 }
1596}
bool HasGameObjectActiveEventExcept(ObjectGuid::LowType go_guid, uint16 eventId)
Definition GameEventMgr.cpp:1696
bool HasCreatureActiveEventExcept(ObjectGuid::LowType creature_guid, uint16 eventId)
Definition GameEventMgr.cpp:1682

References _gameEvent, GameEventCreatureGuids, HasCreatureActiveEventExcept(), LOG_ERROR, sMapMgr, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ GetActiveEventList()

ActiveEvents const & GameEventMgr::GetActiveEventList ( ) const
inline
108{ return _activeEvents; }

References _activeEvents.

◆ GetEventMap()

GameEventDataMap const & GameEventMgr::GetEventMap ( ) const
inline
109{ return _gameEvent; }

References _gameEvent.

Referenced by GetHolidayEventId().

◆ GetHolidayEventId()

uint32 GameEventMgr::GetHolidayEventId ( uint32  holidayId) const
2033{
2034 auto const& events = GetEventMap();
2035 uint8 mainStage = GetHolidayMainStage(holidayId);
2036
2037 for (auto const& eventEntry : events)
2038 {
2039 if (eventEntry.HolidayId == holidayId && eventEntry.HolidayStage == mainStage)
2040 {
2041 return eventEntry.EventId;
2042 }
2043 }
2044
2045 return 0;
2046}
events
Definition boss_sartura.cpp:43
GameEventDataMap const & GetEventMap() const
Definition GameEventMgr.h:109
uint8 GetHolidayMainStage(uint32 holidayId) const
Definition GameEventMgr.cpp:2048

References GetEventMap(), and GetHolidayMainStage().

◆ GetHolidayMainStage()

uint8 GameEventMgr::GetHolidayMainStage ( uint32  holidayId) const
2049{
2050 auto itr = _holidayMainStages.find(holidayId);
2051 return itr != _holidayMainStages.end() ? itr->second : 0;
2052}
HolidayMainStageMap _holidayMainStages
Definition GameEventMgr.h:197

References _holidayMainStages.

Referenced by GetHolidayEventId().

◆ GetNPCFlag()

uint32 GameEventMgr::GetNPCFlag ( Creature cr)
1210{
1211 uint32 mask = 0;
1212 ObjectGuid::LowType spawnId = cr->GetSpawnId();
1213
1214 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1215 {
1216 for (NPCFlagList::iterator itr = _gameEventNPCFlags[*e_itr].begin(); itr != _gameEventNPCFlags[*e_itr].end(); ++ itr)
1217 if (itr->first == spawnId)
1218 mask |= itr->second;
1219 }
1220
1221 return mask;
1222}
std::uint32_t uint32
Definition Define.h:107
ObjectGuid::LowType GetSpawnId() const
Definition Creature.h:69
GameEventNPCFlagMap _gameEventNPCFlags
Definition GameEventMgr.h:193
uint32 LowType
Definition ObjectGuid.h:125

References _activeEvents, _gameEventNPCFlags, and Creature::GetSpawnId().

Referenced by UpdateEventNPCFlags().

◆ HandleQuestComplete()

void GameEventMgr::HandleQuestComplete ( uint32  quest_id)
1791{
1792 // translate the quest to event and condition
1793 QuestIdToEventConditionMap::iterator itr = _questToEventConditions.find(quest_id);
1794 // quest is registered
1795 if (itr != _questToEventConditions.end())
1796 {
1797 uint16 eventId = itr->second.EventId;
1798 uint32 condition = itr->second.Condition;
1799 float num = itr->second.Num;
1800
1801 // the event is not active, so return, don't increase condition finishes
1802 if (!IsActiveEvent(eventId))
1803 return;
1804 // not in correct phase, return
1805 if (_gameEvent[eventId].State != GAMEEVENT_WORLD_CONDITIONS)
1806 return;
1807 GameEventConditionMap::iterator citr = _gameEvent[eventId].Conditions.find(condition);
1808 // condition is registered
1809 if (citr != _gameEvent[eventId].Conditions.end())
1810 {
1811 // increase the done count, only if less then the req
1812 if (citr->second.Done < citr->second.ReqNum)
1813 {
1814 citr->second.Done += num;
1815 // check max limit
1816 if (citr->second.Done > citr->second.ReqNum)
1817 citr->second.Done = citr->second.ReqNum;
1818 // save the change to db
1819 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1820
1822 stmt->SetData(0, uint8(eventId));
1823 stmt->SetData(1, condition);
1824 trans->Append(stmt);
1825
1826 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_CONDITION_SAVE);
1827 stmt->SetData(0, uint8(eventId));
1828 stmt->SetData(1, condition);
1829 stmt->SetData(2, citr->second.Done);
1830 trans->Append(stmt);
1831 CharacterDatabase.CommitTransaction(trans);
1832 // check if all conditions are met, if so, update the event state
1833 if (CheckOneGameEventConditions(eventId))
1834 {
1835 // changed, save to DB the gameevent state
1836 SaveWorldEventStateToDB(eventId);
1837 // force update events to set timer
1838 sWorld->ForceGameEventUpdate();
1839 }
1840 }
1841 }
1842 }
1843}
@ CHAR_DEL_GAME_EVENT_CONDITION_SAVE
Definition CharacterDatabase.h:220
@ CHAR_INS_GAME_EVENT_CONDITION_SAVE
Definition CharacterDatabase.h:221
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint16_t uint16
Definition Define.h:108
bool CheckOneGameEventConditions(uint16 eventId)
Runs SMART_EVENT_GAME_EVENT_START/_END SAI.
Definition GameEventMgr.cpp:1845
bool IsActiveEvent(uint16 eventId)
Definition GameEventMgr.h:115
QuestIdToEventConditionMap _questToEventConditions
Definition GameEventMgr.h:192
void SaveWorldEventStateToDB(uint16 eventId)
Definition GameEventMgr.cpp:1862
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References _gameEvent, _questToEventConditions, CHAR_DEL_GAME_EVENT_CONDITION_SAVE, CHAR_INS_GAME_EVENT_CONDITION_SAVE, CharacterDatabase, CheckOneGameEventConditions(), GAMEEVENT_WORLD_CONDITIONS, IsActiveEvent(), SaveWorldEventStateToDB(), PreparedStatementBase::SetData(), and sWorld.

◆ HasCreatureActiveEventExcept()

bool GameEventMgr::HasCreatureActiveEventExcept ( ObjectGuid::LowType  creature_guid,
uint16  eventId 
)
private
1683{
1684 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1685 {
1686 if ((*e_itr) != eventId)
1687 {
1688 int32 internal_event_id = _gameEvent.size() + (*e_itr) - 1;
1689 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++ itr)
1690 if (*itr == creature_guid)
1691 return true;
1692 }
1693 }
1694 return false;
1695}

References _activeEvents, _gameEvent, and GameEventCreatureGuids.

Referenced by GameEventUnspawn().

◆ HasCreatureQuestActiveEventExcept()

bool GameEventMgr::HasCreatureQuestActiveEventExcept ( uint32  quest_id,
uint16  eventId 
)
private
1656{
1657 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1658 {
1659 if ((*e_itr) != eventId)
1660 for (QuestRelList::iterator itr = _gameEventCreatureQuests[*e_itr].begin();
1661 itr != _gameEventCreatureQuests[*e_itr].end();
1662 ++ itr)
1663 if (itr->second == quest_id)
1664 return true;
1665 }
1666 return false;
1667}
GameEventQuestMap _gameEventCreatureQuests
Definition GameEventMgr.h:185

References _activeEvents, and _gameEventCreatureQuests.

Referenced by UpdateEventQuests().

◆ HasGameObjectActiveEventExcept()

bool GameEventMgr::HasGameObjectActiveEventExcept ( ObjectGuid::LowType  go_guid,
uint16  eventId 
)
private
1697{
1698 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1699 {
1700 if ((*e_itr) != eventId)
1701 {
1702 int32 internal_event_id = _gameEvent.size() + (*e_itr) - 1;
1703 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++ itr)
1704 if (*itr == go_guid)
1705 return true;
1706 }
1707 }
1708 return false;
1709}

References _activeEvents, _gameEvent, and GameEventGameobjectGuids.

◆ HasGameObjectQuestActiveEventExcept()

bool GameEventMgr::HasGameObjectQuestActiveEventExcept ( uint32  quest_id,
uint16  eventId 
)
private
1670{
1671 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1672 {
1673 if ((*e_itr) != eventId)
1674 for (QuestRelList::iterator itr = _gameEventGameObjectQuests[*e_itr].begin();
1675 itr != _gameEventGameObjectQuests[*e_itr].end();
1676 ++ itr)
1677 if (itr->second == quest_id)
1678 return true;
1679 }
1680 return false;
1681}
GameEventQuestMap _gameEventGameObjectQuests
Definition GameEventMgr.h:186

References _activeEvents, and _gameEventGameObjectQuests.

Referenced by UpdateEventQuests().

◆ Initialize()

void GameEventMgr::Initialize ( )
1225{
1226 QueryResult result = WorldDatabase.Query("SELECT MAX(eventEntry) FROM game_event");
1227 if (result)
1228 {
1229 Field* fields = result->Fetch();
1230
1231 uint32 maxEventId = fields[0].Get<uint8>();
1232
1233 // Id starts with 1 and vector with 0, thus increment
1234 maxEventId++;
1235
1236 _gameEvent.resize(maxEventId);
1237 GameEventCreatureGuids.resize(maxEventId * 2 - 1);
1238 GameEventGameobjectGuids.resize(maxEventId * 2 - 1);
1239 _gameEventCreatureQuests.resize(maxEventId);
1240 _gameEventGameObjectQuests.resize(maxEventId);
1241 _gameEventVendors.resize(maxEventId);
1242 _gameEventBattlegroundHolidays.resize(maxEventId, 0);
1243 _gameEventPoolIds.resize(maxEventId * 2 - 1);
1244 _gameEventNPCFlags.resize(maxEventId);
1245 _gameEventModelEquip.resize(maxEventId);
1246 }
1247}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
Class used to access individual fields of database query result.
Definition Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:113
GameEventBitmask _gameEventBattlegroundHolidays
Definition GameEventMgr.h:191
GameEventNPCVendorMap _gameEventVendors
Definition GameEventMgr.h:187

References _gameEvent, _gameEventBattlegroundHolidays, _gameEventCreatureQuests, _gameEventGameObjectQuests, _gameEventModelEquip, _gameEventNPCFlags, _gameEventPoolIds, _gameEventVendors, GameEventCreatureGuids, GameEventGameobjectGuids, Field::Get(), and WorldDatabase.

◆ instance()

GameEventMgr * GameEventMgr::instance ( )
static
41{
43 return &instance;
44}
Definition GameEventMgr.h:98
static GameEventMgr * instance()
Definition GameEventMgr.cpp:40

References instance().

Referenced by instance().

◆ IsActiveEvent()

bool GameEventMgr::IsActiveEvent ( uint16  eventId)
inline
115{ return (_activeEvents.find(eventId) != _activeEvents.end()); }

References _activeEvents.

Referenced by HandleQuestComplete(), StartEvent(), StopEvent(), and Update().

◆ LoadEventBattlegroundData()

void GameEventMgr::LoadEventBattlegroundData ( )
private
977{
978 LOG_INFO("server.loading", "Loading Game Event Battleground Data...");
979
980 uint32 oldMSTime = getMSTime();
981
983 PreparedQueryResult result = WorldDatabase.Query(stmt);
984
985 if (!result)
986 {
987 LOG_WARN("server.loading", ">> Loaded 0 Battleground Holidays In Game Events. DB table `game_event_battleground_holiday` is empty.");
988 LOG_INFO("server.loading", " ");
989 }
990 else
991 {
992 uint32 count = 0;
993 do
994 {
995 Field* fields = result->Fetch();
996
997 uint16 eventId = fields[0].Get<uint8>();
998
999 if (eventId >= _gameEvent.size())
1000 {
1001 LOG_ERROR("sql.sql", "`game_event_battleground_holiday` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
1002 continue;
1003 }
1004
1005 _gameEventBattlegroundHolidays[eventId] = fields[1].Get<uint32>();
1006
1007 ++count;
1008 } while (result->NextRow());
1009
1010 LOG_INFO("server.loading", ">> Loaded {} Battleground Holidays In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1011 LOG_INFO("server.loading", " ");
1012 }
1013}
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
#define LOG_INFO(filterType__,...)
Definition Log.h:153
#define LOG_WARN(filterType__,...)
Definition Log.h:149
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
uint32 getMSTime()
Definition Timer.h:103
@ WORLD_SEL_GAME_EVENT_BATTLEGROUND_DATA
Definition WorldDatabase.h:106

References _gameEvent, _gameEventBattlegroundHolidays, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, WORLD_SEL_GAME_EVENT_BATTLEGROUND_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventConditionData()

void GameEventMgr::LoadEventConditionData ( )
private
797{
798 LOG_INFO("server.loading", "Loading Game Event Condition Data...");
799
800 uint32 oldMSTime = getMSTime();
801
803 PreparedQueryResult result = WorldDatabase.Query(stmt);
804
805 if (!result)
806 {
807 LOG_WARN("server.loading", ">> Loaded 0 Conditions In Game Events. DB table `game_event_condition` Is Empty.");
808 LOG_INFO("server.loading", " ");
809 }
810 else
811 {
812 uint32 count = 0;
813 do
814 {
815 Field* fields = result->Fetch();
816
817 uint16 eventId = fields[0].Get<uint8>();
818 uint32 condition = fields[1].Get<uint32>();
819
820 if (eventId >= _gameEvent.size())
821 {
822 LOG_ERROR("sql.sql", "`game_event_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
823 continue;
824 }
825
826 _gameEvent[eventId].Conditions[condition].ReqNum = fields[2].Get<float>();
827 _gameEvent[eventId].Conditions[condition].Done = 0;
828 _gameEvent[eventId].Conditions[condition].MaxWorldState = fields[3].Get<uint16>();
829 _gameEvent[eventId].Conditions[condition].DoneWorldState = fields[4].Get<uint16>();
830
831 ++count;
832 } while (result->NextRow());
833
834 LOG_INFO("server.loading", ">> Loaded {} conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
835 LOG_INFO("server.loading", " ");
836 }
837}
@ WORLD_SEL_GAME_EVENT_CONDITION_DATA
Definition WorldDatabase.h:103

References _gameEvent, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, WORLD_SEL_GAME_EVENT_CONDITION_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventConditionSaveData()

void GameEventMgr::LoadEventConditionSaveData ( )
private
840{
841 LOG_INFO("server.loading", "Loading Game Event Condition Save Data...");
842
843 uint32 oldMSTime = getMSTime();
844
846 PreparedQueryResult result = CharacterDatabase.Query(stmt);
847
848 if (!result)
849 {
850 LOG_WARN("server.loading", ">> Loaded 0 Condition Saves In Game Events. DB Table `game_event_condition_save` Is Empty.");
851 LOG_INFO("server.loading", " ");
852 }
853 else
854 {
855 uint32 count = 0;
856 do
857 {
858 Field* fields = result->Fetch();
859
860 uint16 eventId = fields[0].Get<uint8>();
861 uint32 condition = fields[1].Get<uint32>();
862
863 if (eventId >= _gameEvent.size())
864 {
865 LOG_ERROR("sql.sql", "`game_event_condition_save` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
866 continue;
867 }
868
869 GameEventConditionMap::iterator itr = _gameEvent[eventId].Conditions.find(condition);
870 if (itr != _gameEvent[eventId].Conditions.end())
871 {
872 itr->second.Done = fields[2].Get<float>();
873 }
874 else
875 {
876 LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition evt id {} cond id {}", eventId, condition);
877 continue;
878 }
879
880 ++count;
881 } while (result->NextRow());
882
883 LOG_INFO("server.loading", ">> Loaded {} Condition Saves In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
884 LOG_INFO("server.loading", " ");
885 }
886}
@ CHAR_SEL_GAME_EVENT_CONDITION_SAVE_DATA
Definition CharacterDatabase.h:222

References _gameEvent, CHAR_SEL_GAME_EVENT_CONDITION_SAVE_DATA, CharacterDatabase, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, and LOG_WARN.

Referenced by LoadFromDB().

◆ LoadEventCreatureData()

void GameEventMgr::LoadEventCreatureData ( )
private
510{
511 LOG_INFO("server.loading", "Loading Game Event Creature Data...");
512
513 uint32 oldMSTime = getMSTime();
514
516 PreparedQueryResult result = WorldDatabase.Query(stmt);
517
518 if (!result)
519 {
520 LOG_WARN("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty");
521 LOG_INFO("server.loading", " ");
522 }
523 else
524 {
525 uint32 count = 0;
526 do
527 {
528 Field* fields = result->Fetch();
529
530 ObjectGuid::LowType guid = fields[0].Get<uint32>();
531 int16 eventId = fields[1].Get<int16>();
532
533 CreatureData const* data = sObjectMgr->GetCreatureData(guid);
534 if (!data)
535 {
536 LOG_ERROR("sql.sql", "`game_event_creature` contains creature (GUID: {}) not found in `creature` table.", guid);
537 continue;
538 }
539
540 int32 internal_event_id = _gameEvent.size() + eventId - 1;
541
542 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
543 {
544 LOG_ERROR("sql.sql", "`game_event_creature` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
545 continue;
546 }
547
548 GuidLowList& crelist = GameEventCreatureGuids[internal_event_id];
549 crelist.push_back(guid);
550
551 ++count;
552 } while (result->NextRow());
553
554 LOG_INFO("server.loading", ">> Loaded {} Creatures In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
555 LOG_INFO("server.loading", " ");
556 }
557}
@ WORLD_SEL_GAME_EVENT_CREATURE_DATA
Definition WorldDatabase.h:97
std::list< ObjectGuid::LowType > GuidLowList
Definition GameEventMgr.h:166

References _gameEvent, GameEventCreatureGuids, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, WORLD_SEL_GAME_EVENT_CREATURE_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventGameObjectData()

void GameEventMgr::LoadEventGameObjectData ( )
private
560{
561 LOG_INFO("server.loading", "Loading Game Event GO Data...");
562
563 uint32 oldMSTime = getMSTime();
564
566 PreparedQueryResult result = WorldDatabase.Query(stmt);
567
568 if (!result)
569 {
570 LOG_WARN("server.loading", ">> Loaded 0 gameobjects in game events. DB table `game_event_gameobject` is empty.");
571 LOG_INFO("server.loading", " ");
572 }
573 else
574 {
575 uint32 count = 0;
576 do
577 {
578 Field* fields = result->Fetch();
579
580 ObjectGuid::LowType guid = fields[0].Get<uint32>();
581 int16 eventId = fields[1].Get<int16>();
582
583 int32 internal_event_id = _gameEvent.size() + eventId - 1;
584
585 GameObjectData const* data = sObjectMgr->GetGameObjectData(guid);
586 if (!data)
587 {
588 LOG_ERROR("sql.sql", "`game_event_gameobject` contains gameobject (GUID: {}) not found in `gameobject` table.", guid);
589 continue;
590 }
591
592 if (internal_event_id < 0 || internal_event_id >= int32(GameEventGameobjectGuids.size()))
593 {
594 LOG_ERROR("sql.sql", "`game_event_gameobject` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
595 continue;
596 }
597
598 GuidLowList& golist = GameEventGameobjectGuids[internal_event_id];
599 golist.push_back(guid);
600
601 ++count;
602 } while (result->NextRow());
603
604 LOG_INFO("server.loading", ">> Loaded {} Gameobjects In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
605 LOG_INFO("server.loading", " ");
606 }
607}
@ WORLD_SEL_GAME_EVENT_GAMEOBJECT_DATA
Definition WorldDatabase.h:98

References _gameEvent, GameEventGameobjectGuids, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, WORLD_SEL_GAME_EVENT_GAMEOBJECT_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventGameObjectQuestData()

void GameEventMgr::LoadEventGameObjectQuestData ( )
private
711{
712 LOG_INFO("server.loading", "Loading Game Event GO Quest Data...");
713
714 uint32 oldMSTime = getMSTime();
715
717 PreparedQueryResult result = WorldDatabase.Query(stmt);
718
719 if (!result)
720 {
721 LOG_WARN("server.loading", ">> Loaded 0 go Quests Additions In Game Events. DB Table `game_event_gameobject_quest` Is Empty.");
722 LOG_INFO("server.loading", " ");
723 }
724 else
725 {
726 uint32 count = 0;
727 do
728 {
729 Field* fields = result->Fetch();
730
731 uint32 id = fields[0].Get<uint32>();
732 uint32 quest = fields[1].Get<uint32>();
733 uint16 eventId = fields[2].Get<uint8>();
734
735 if (eventId >= _gameEventGameObjectQuests.size())
736 {
737 LOG_ERROR("sql.sql", "`game_event_gameobject_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
738 continue;
739 }
740
741 QuestRelList& questlist = _gameEventGameObjectQuests[eventId];
742 questlist.push_back(QuestRelation(id, quest));
743
744 ++count;
745 } while (result->NextRow());
746
747 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
748 LOG_INFO("server.loading", " ");
749 }
750}
@ WORLD_SEL_GAME_EVENT_GAMEOBJECT_QUEST_DATA
Definition WorldDatabase.h:101
std::list< QuestRelation > QuestRelList
Definition GameEventMgr.h:174
std::pair< uint32, uint32 > QuestRelation
Definition GameEventMgr.h:173

References _gameEventGameObjectQuests, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, WORLD_SEL_GAME_EVENT_GAMEOBJECT_QUEST_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventModelEquipmentChangeData()

void GameEventMgr::LoadEventModelEquipmentChangeData ( )
private
610{
611 LOG_INFO("server.loading", "Loading Game Event Model/Equipment Change Data...");
612
613 uint32 oldMSTime = getMSTime();
614
616 PreparedQueryResult result = WorldDatabase.Query(stmt);
617
618 if (!result)
619 {
620 LOG_WARN("server.loading", ">> Loaded 0 Model/Equipment Changes In Game Events. DB Table `game_event_model_equip` Is Empty.");
621 LOG_INFO("server.loading", " ");
622 }
623 else
624 {
625 uint32 count = 0;
626 do
627 {
628 Field* fields = result->Fetch();
629
630 ObjectGuid::LowType guid = fields[0].Get<uint32>();
631 uint32 entry = fields[1].Get<uint32>();
632 uint16 eventId = fields[2].Get<uint8>();
633
634 if (eventId >= _gameEventModelEquip.size())
635 {
636 LOG_ERROR("sql.sql", "`game_event_model_equip` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
637 continue;
638 }
639
640 ModelEquipList& equiplist = _gameEventModelEquip[eventId];
641 ModelEquip newModelEquipSet;
642 newModelEquipSet.ModelId = fields[3].Get<uint32>();
643 newModelEquipSet.EquipmentId = fields[4].Get<uint8>();
644 newModelEquipSet.EquipementIdPrev = 0;
645 newModelEquipSet.ModelIdPrev = 0;
646
647 if (newModelEquipSet.EquipmentId > 0)
648 {
649 int8 equipId = static_cast<int8>(newModelEquipSet.EquipmentId);
650 if (!sObjectMgr->GetEquipmentInfo(entry, equipId))
651 {
652 LOG_ERROR("sql.sql", "Table `game_event_model_equip` have creature (Guid: {}) with equipment_id {} not found in table `creature_equip_template`, set to no equipment.",
653 guid, newModelEquipSet.EquipmentId);
654 continue;
655 }
656 }
657
658 equiplist.push_back(std::pair<ObjectGuid::LowType, ModelEquip>(guid, newModelEquipSet));
659
660 ++count;
661 } while (result->NextRow());
662
663 LOG_INFO("server.loading", ">> Loaded {} Model/Equipment Changes In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
664 LOG_INFO("server.loading", " ");
665 }
666}
std::int8_t int8
Definition Define.h:105
@ WORLD_SEL_GAME_EVENT_MODEL_EQUIPMENT_DATA
Definition WorldDatabase.h:99
std::list< ModelEquipPair > ModelEquipList
Definition GameEventMgr.h:171
Definition GameEventMgr.h:77
uint8 EquipementIdPrev
Definition GameEventMgr.h:81
uint32 ModelIdPrev
Definition GameEventMgr.h:79
uint32 ModelId
Definition GameEventMgr.h:78
uint8 EquipmentId
Definition GameEventMgr.h:80

References _gameEventModelEquip, ModelEquip::EquipementIdPrev, ModelEquip::EquipmentId, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, ModelEquip::ModelId, ModelEquip::ModelIdPrev, sObjectMgr, WORLD_SEL_GAME_EVENT_MODEL_EQUIPMENT_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventNPCFlags()

void GameEventMgr::LoadEventNPCFlags ( )
private
889{
890 LOG_INFO("server.loading", "Loading Game Event NPCflag Data...");
891
892 uint32 oldMSTime = getMSTime();
893
895 PreparedQueryResult result = WorldDatabase.Query(stmt);
896
897 if (!result)
898 {
899 LOG_WARN("server.loading", ">> Loaded 0 Npcflags In Game Events. DB Table `game_event_npcflag` Is Empty.");
900 LOG_INFO("server.loading", " ");
901 }
902 else
903 {
904 uint32 count = 0;
905 do
906 {
907 Field* fields = result->Fetch();
908
909 ObjectGuid::LowType guid = fields[0].Get<uint32>();
910 uint16 eventId = fields[1].Get<uint8>();
911 uint32 npcflag = fields[2].Get<uint32>();
912
913 if (eventId >= _gameEvent.size())
914 {
915 LOG_ERROR("sql.sql", "`game_event_npcflag` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
916 continue;
917 }
918
919 _gameEventNPCFlags[eventId].push_back(GuidNPCFlagPair(guid, npcflag));
920
921 ++count;
922 } while (result->NextRow());
923
924 LOG_INFO("server.loading", ">> Loaded {} Npcflags In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
925 LOG_INFO("server.loading", " ");
926 }
927}
@ WORLD_SEL_GAME_EVENT_NPC_FLAGS
Definition WorldDatabase.h:104
std::pair< ObjectGuid::LowType, uint32 > GuidNPCFlagPair
Definition GameEventMgr.h:179

References _gameEvent, _gameEventNPCFlags, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, WORLD_SEL_GAME_EVENT_NPC_FLAGS, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventPoolData()

void GameEventMgr::LoadEventPoolData ( )
private
1016{
1017 LOG_INFO("server.loading", "Loading Game Event Pool Data...");
1018
1019 uint32 oldMSTime = getMSTime();
1020
1022 PreparedQueryResult result = WorldDatabase.Query(stmt);
1023
1024 if (!result)
1025 {
1026 LOG_WARN("server.loading", ">> Loaded 0 Pools For Game Events. DB Table `game_event_pool` Is Empty.");
1027 LOG_INFO("server.loading", " ");
1028 }
1029 else
1030 {
1031 uint32 count = 0;
1032 do
1033 {
1034 Field* fields = result->Fetch();
1035
1036 uint32 entry = fields[0].Get<uint32>();
1037 int16 eventId = fields[1].Get<int16>();
1038
1039 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1040
1041 if (internal_event_id < 0 || internal_event_id >= int32(_gameEventPoolIds.size()))
1042 {
1043 LOG_ERROR("sql.sql", "`game_event_pool` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
1044 continue;
1045 }
1046
1047 if (!sPoolMgr->CheckPool(entry))
1048 {
1049 LOG_ERROR("sql.sql", "Pool Id ({}) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", entry);
1050 continue;
1051 }
1052
1053 IdList& poollist = _gameEventPoolIds[internal_event_id];
1054 poollist.push_back(entry);
1055
1056 ++count;
1057 } while (result->NextRow());
1058
1059 LOG_INFO("server.loading", ">> Loaded {} Pools For Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1060 LOG_INFO("server.loading", " ");
1061 }
1062}
@ WORLD_SEL_GAME_EVENT_POOL_DATA
Definition WorldDatabase.h:107
std::list< uint32 > IdList
Definition GameEventMgr.h:167

References _gameEvent, _gameEventPoolIds, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sPoolMgr, WORLD_SEL_GAME_EVENT_POOL_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventPrerequisiteData()

void GameEventMgr::LoadEventPrerequisiteData ( )
private
457{
458 LOG_INFO("server.loading", "Loading Game Event Prerequisite Data...");
459
460 uint32 oldMSTime = getMSTime();
461
463 PreparedQueryResult result = WorldDatabase.Query(stmt);
464
465 if (!result)
466 {
467 LOG_WARN("server.loading", ">> Loaded 0 Game Rvent Prerequisites in Game Events. DB Table `game_event_prerequisite` Is Empty.");
468 LOG_INFO("server.loading", " ");
469 }
470 else
471 {
472 uint32 count = 0;
473 do
474 {
475 Field* fields = result->Fetch();
476
477 uint16 eventId = fields[0].Get<uint8>();
478
479 if (eventId >= _gameEvent.size())
480 {
481 LOG_ERROR("sql.sql", "`game_event_prerequisite` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
482 continue;
483 }
484
485 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
486 {
487 uint16 prerequisite_event = fields[1].Get<uint32>();
488 if (prerequisite_event >= _gameEvent.size())
489 {
490 LOG_ERROR("sql.sql", "`game_event_prerequisite` game event prerequisite id ({}) is out of range compared to max event id in `game_event`", prerequisite_event);
491 continue;
492 }
493 _gameEvent[eventId].PrerequisiteEvents.insert(prerequisite_event);
494 }
495 else
496 {
497 LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id {}", eventId);
498 continue;
499 }
500
501 ++count;
502 } while (result->NextRow());
503
504 LOG_INFO("server.loading", ">> Loaded {} game event prerequisites in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
505 LOG_INFO("server.loading", " ");
506 }
507}
@ WORLD_SEL_GAME_EVENT_PREREQUISITE_DATA
Definition WorldDatabase.h:96

References _gameEvent, GAMEEVENT_INTERNAL, GAMEEVENT_NORMAL, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, WORLD_SEL_GAME_EVENT_PREREQUISITE_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventQuestConditionData()

void GameEventMgr::LoadEventQuestConditionData ( )
private
753{
754 LOG_INFO("server.loading", "Loading Game Event Quest Condition Data...");
755
756 uint32 oldMSTime = getMSTime();
757
759 PreparedQueryResult result = WorldDatabase.Query(stmt);
760
761 if (!result)
762 {
763 LOG_WARN("server.loading", ">> Loaded 0 quest event Conditions In Game Events. DB Table `game_event_quest_condition` Is Empty.");
764 LOG_INFO("server.loading", " ");
765 }
766 else
767 {
768 uint32 count = 0;
769 do
770 {
771 Field* fields = result->Fetch();
772
773 uint32 quest = fields[0].Get<uint32>();
774 uint16 eventId = fields[1].Get<uint8>();
775 uint32 condition = fields[2].Get<uint32>();
776 float num = fields[3].Get<float>();
777
778 if (eventId >= _gameEvent.size())
779 {
780 LOG_ERROR("sql.sql", "`game_event_quest_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
781 continue;
782 }
783
784 _questToEventConditions[quest].EventId = eventId;
785 _questToEventConditions[quest].Condition = condition;
786 _questToEventConditions[quest].Num = num;
787
788 ++count;
789 } while (result->NextRow());
790
791 LOG_INFO("server.loading", ">> Loaded {} quest event conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
792 LOG_INFO("server.loading", " ");
793 }
794}
@ WORLD_SEL_GAME_EVENT_QUEST_CONDITION_DATA
Definition WorldDatabase.h:102

References _gameEvent, _questToEventConditions, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, WORLD_SEL_GAME_EVENT_QUEST_CONDITION_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventQuestData()

void GameEventMgr::LoadEventQuestData ( )
private
669{
670 LOG_INFO("server.loading", "Loading Game Event Quest Data...");
671
672 uint32 oldMSTime = getMSTime();
673
675 PreparedQueryResult result = WorldDatabase.Query(stmt);
676
677 if (!result)
678 {
679 LOG_WARN("server.loading", ">> Loaded 0 Quests Additions In Game Events. DB Table `game_event_creature_quest` Is Empty.");
680 LOG_INFO("server.loading", " ");
681 }
682 else
683 {
684 uint32 count = 0;
685 do
686 {
687 Field* fields = result->Fetch();
688
689 uint32 id = fields[0].Get<uint32>();
690 uint32 quest = fields[1].Get<uint32>();
691 uint16 eventId = fields[2].Get<uint8>();
692
693 if (eventId >= _gameEventCreatureQuests.size())
694 {
695 LOG_ERROR("sql.sql", "`game_event_creature_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
696 continue;
697 }
698
699 QuestRelList& questlist = _gameEventCreatureQuests[eventId];
700 questlist.push_back(QuestRelation(id, quest));
701
702 ++count;
703 } while (result->NextRow());
704
705 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
706 LOG_INFO("server.loading", " ");
707 }
708}
@ WORLD_SEL_GAME_EVENT_QUEST_DATA
Definition WorldDatabase.h:100

References _gameEventCreatureQuests, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, WORLD_SEL_GAME_EVENT_QUEST_DATA, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEvents()

void GameEventMgr::LoadEvents ( )
private
328{
329 LOG_INFO("server.loading", "Loading Game Events...");
330 uint32 oldMSTime = getMSTime();
331 _holidayMainStages.clear();
333 PreparedQueryResult result = WorldDatabase.Query(stmt);
334
335 if (!result)
336 {
337 _gameEvent.clear();
338 LOG_WARN("server.loading", ">> Loaded 0 game events. DB table `game_event` is empty.");
339 LOG_INFO("server.loading", " ");
340 return;
341 }
342
343 uint32 count = 0;
344 do
345 {
346 Field* fields = result->Fetch();
347
348 uint8 eventId = fields[0].Get<uint8>();
349 if (eventId == 0)
350 {
351 LOG_ERROR("sql.sql", "`game_event` game event entry 0 is reserved and can't be used.");
352 continue;
353 }
354
355 GameEventData& pGameEvent = _gameEvent[eventId];
356 pGameEvent.EventId = fields[0].Get<uint32>();
357 uint64 starttime = fields[1].Get<uint64>();
358 pGameEvent.Start = time_t(starttime);
359 uint64 endtime = fields[2].Get<uint64>();
360 if (fields[2].IsNull())
361 endtime = GameTime::GetGameTime().count() + 63072000; // add 2 years to current date
362 pGameEvent.End = time_t(endtime);
363 pGameEvent.Occurence = fields[3].Get<uint64>();
364 pGameEvent.Length = fields[4].Get<uint64>();
365 pGameEvent.HolidayId = HolidayIds(fields[5].Get<uint32>());
366 pGameEvent.HolidayStage = fields[6].Get<uint8>();
367 pGameEvent.Description = fields[7].Get<std::string>();
368 pGameEvent.State = (GameEventState)(fields[8].Get<uint8>());
369 pGameEvent.Announce = fields[9].Get<uint8>();
370 pGameEvent.NextStart = 0;
371
372 ++count;
373
374 if (pGameEvent.Length == 0 && pGameEvent.State == GAMEEVENT_NORMAL) // length>0 is validity check
375 {
376 LOG_ERROR("sql.sql", "`game_event` game event id ({}) isn't a world event and has length = 0, thus it can't be used.", eventId);
377 continue;
378 }
379
380 if (pGameEvent.HolidayId != HOLIDAY_NONE)
381 {
382 HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(pGameEvent.HolidayId);
383 if (!holiday)
384 {
385 LOG_ERROR("sql.sql", "`game_event` game event id ({}) have not existed holiday id {}.", eventId, pGameEvent.HolidayId);
386 pGameEvent.HolidayId = HOLIDAY_NONE;
387 continue;
388 }
389
390 // a stage the holiday does not define leaves the event with length 0, which keeps it from ever starting
391 if (pGameEvent.HolidayStage > MAX_HOLIDAY_DURATIONS
392 || (pGameEvent.HolidayStage && !holiday->Duration[pGameEvent.HolidayStage - 1]))
393 {
394 LOG_ERROR("sql.sql", "`game_event` game event id ({}) has out of range holidayStage {}.", eventId, pGameEvent.HolidayStage);
395 pGameEvent.HolidayStage = 0;
396 }
397
398 uint8& mainStage = _holidayMainStages[pGameEvent.HolidayId];
399 if (pGameEvent.HolidayStage > mainStage)
400 mainStage = pGameEvent.HolidayStage;
401
402 SetHolidayEventTime(pGameEvent);
403 }
404 } while (result->NextRow());
405
406 LOG_INFO("server.loading", ">> Loaded {} Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
407 LOG_INFO("server.loading", " ");
408}
DBCStorage< HolidaysEntry > sHolidaysStore(Holidaysfmt)
#define MAX_HOLIDAY_DURATIONS
Definition DBCStructure.h:1122
std::uint64_t uint64
Definition Define.h:106
GameEventState
Definition GameEventMgr.h:30
HolidayIds
Definition SharedDefines.h:2974
@ HOLIDAY_NONE
Definition SharedDefines.h:2975
@ WORLD_SEL_GAME_EVENTS
Definition WorldDatabase.h:95
void SetHolidayEventTime(GameEventData &event)
Definition GameEventMgr.cpp:1929
Definition GameEventMgr.h:57
time_t Start
Definition GameEventMgr.h:60
uint8 HolidayStage
Definition GameEventMgr.h:66
time_t End
Definition GameEventMgr.h:61
std::string Description
Definition GameEventMgr.h:70
GameEventState State
Definition GameEventMgr.h:67
uint32 EventId
Definition GameEventMgr.h:59
uint32 Length
Definition GameEventMgr.h:64
HolidayIds HolidayId
Definition GameEventMgr.h:65
time_t NextStart
Definition GameEventMgr.h:62
uint32 Occurence
Definition GameEventMgr.h:63
uint8 Announce
Definition GameEventMgr.h:71
Definition DBCStructure.h:1127
uint32 Duration[MAX_HOLIDAY_DURATIONS]
Definition DBCStructure.h:1129

References _gameEvent, _holidayMainStages, GameEventData::Announce, GameEventData::Description, HolidaysEntry::Duration, GameEventData::End, GameEventData::EventId, GAMEEVENT_NORMAL, Field::Get(), GameTime::GetGameTime(), getMSTime(), GetMSTimeDiffToNow(), HOLIDAY_NONE, GameEventData::HolidayId, GameEventData::HolidayStage, GameEventData::Length, LOG_ERROR, LOG_INFO, LOG_WARN, MAX_HOLIDAY_DURATIONS, GameEventData::NextStart, GameEventData::Occurence, SetHolidayEventTime(), sHolidaysStore, GameEventData::Start, GameEventData::State, WORLD_SEL_GAME_EVENTS, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventSaveData()

void GameEventMgr::LoadEventSaveData ( )
private
411{
412 uint32 oldMSTime = getMSTime();
413 LOG_INFO("server.loading", "Loading Game Event Saves Data...");
415 PreparedQueryResult result = CharacterDatabase.Query(stmt);
416
417 if (!result)
418 {
419 LOG_WARN("server.loading", ">> Loaded 0 Game Event Saves In Game Events. DB Table `game_event_save` Is Empty.");
420 LOG_INFO("server.loading", " ");
421 }
422 else
423 {
424 uint32 count = 0;
425 do
426 {
427 Field* fields = result->Fetch();
428
429 uint8 eventId = fields[0].Get<uint8>();
430
431 if (eventId >= _gameEvent.size())
432 {
433 LOG_ERROR("sql.sql", "`game_event_save` game event entry ({}) is out of range compared to max event entry in `game_event`", eventId);
434 continue;
435 }
436
437 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
438 {
439 _gameEvent[eventId].State = (GameEventState)(fields[1].Get<uint8>());
440 _gameEvent[eventId].NextStart = time_t(fields[2].Get<uint32>());
441 }
442 else
443 {
444 LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id {}", eventId);
445 continue;
446 }
447
448 ++count;
449 } while (result->NextRow());
450
451 LOG_INFO("server.loading", ">> Loaded {} Game Event Saves In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
452 LOG_INFO("server.loading", " ");
453 }
454}
@ CHAR_SEL_GAME_EVENT_SAVE_DATA
Definition CharacterDatabase.h:223

References _gameEvent, CHAR_SEL_GAME_EVENT_SAVE_DATA, CharacterDatabase, GAMEEVENT_INTERNAL, GAMEEVENT_NORMAL, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, and LOG_WARN.

Referenced by LoadFromDB().

◆ LoadEventSeasonalQuestRelations()

void GameEventMgr::LoadEventSeasonalQuestRelations ( )
private
Todo:
: Change to uint8
930{
931 LOG_INFO("server.loading", "Loading Game Event Seasonal Quest Relations...");
932 uint32 oldMSTime = getMSTime();
933
935 PreparedQueryResult result = WorldDatabase.Query(stmt);
936
937 if (!result)
938 {
939 LOG_WARN("server.loading", ">> Loaded 0 Seasonal Quests Additions In Game Events. DB Table `game_event_seasonal_questrelation` Is Empty.");
940 LOG_INFO("server.loading", " ");
941 }
942 else
943 {
944 uint32 count = 0;
945 do
946 {
947 Field* fields = result->Fetch();
948
949 uint32 questId = fields[0].Get<uint32>();
950 uint32 eventEntry = fields[1].Get<uint32>();
951
952 Quest* questTemplate = const_cast<Quest*>(sObjectMgr->GetQuestTemplate(questId));
953
954 if (!questTemplate)
955 {
956 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` quest id ({}) does not exist in `quest_template`", questId);
957 continue;
958 }
959
960 if (eventEntry >= _gameEvent.size())
961 {
962 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` event id ({}) is out of range compared to max event in `game_event`", eventEntry);
963 continue;
964 }
965
966 questTemplate->SetEventIdForQuest((uint16)eventEntry);
967 _gameEventSeasonalQuestsMap[eventEntry].push_back(questId);
968 ++count;
969 } while (result->NextRow());
970
971 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
972 LOG_INFO("server.loading", " ");
973 }
974}
@ WORLD_SEL_GAME_EVENT_QUEST_SEASONAL_RELATIONS
Definition WorldDatabase.h:105
GameEventSeasonalQuestsMap _gameEventSeasonalQuestsMap
Definition GameEventMgr.h:196
Definition QuestDef.h:210

References _gameEvent, _gameEventSeasonalQuestsMap, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sObjectMgr, WORLD_SEL_GAME_EVENT_QUEST_SEASONAL_RELATIONS, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventVendors()

void GameEventMgr::LoadEventVendors ( )
241{
242 LOG_INFO("server.loading", "Loading Game Event Vendor Additions Data...");
243 uint32 oldMSTime = getMSTime();
245 PreparedQueryResult result = WorldDatabase.Query(stmt);
246
247 if (!result)
248 {
249 LOG_WARN("server.loading", ">> Loaded 0 Vendor Additions In Game Events. DB Table `game_event_npc_vendor` Is Empty.");
250 LOG_INFO("server.loading", " ");
251 return;
252 }
253
254 uint32 count = 0;
255 std::unordered_set<uint8> processedEvents;
256
257 do
258 {
259 Field* fields = result->Fetch();
260 uint8 eventId = fields[0].Get<uint8>();
261 ObjectGuid::LowType guid = fields[1].Get<uint32>();
262
263 if (eventId >= _gameEventVendors.size())
264 {
265 LOG_ERROR("sql.sql", "Table `game_event_npc_vendor` has invalid eventEntry ({}) for GUID ({}), skipped.", eventId, guid);
266 continue;
267 }
268
269 // Clear existing vendors for this event only once
270 if (processedEvents.find(eventId) == processedEvents.end())
271 {
272 // Remove vendor items from in-memory data
273 for (auto& entry : _gameEventVendors[eventId])
274 {
275 sObjectMgr->RemoveVendorItem(entry.Entry, entry.Item, false);
276 }
277 _gameEventVendors[eventId].clear();
278 processedEvents.insert(eventId);
279 }
280
281 NPCVendorList& vendors = _gameEventVendors[eventId];
282 NPCVendorEntry newEntry;
283 newEntry.Item = fields[2].Get<uint32>();
284 newEntry.MaxCount = fields[3].Get<uint32>();
285 newEntry.Incrtime = fields[4].Get<uint32>();
286 newEntry.ExtendedCost = fields[5].Get<uint32>();
287
288 // Get the event NPC flag for validity check
289 uint32 event_npc_flag = 0;
290 NPCFlagList& flist = _gameEventNPCFlags[eventId];
291 for (NPCFlagList::const_iterator itr = flist.begin(); itr != flist.end(); ++itr)
292 {
293 if (itr->first == guid)
294 {
295 event_npc_flag = itr->second;
296 break;
297 }
298 }
299
300 // Get creature entry
301 newEntry.Entry = 0;
302 if (CreatureData const* data = sObjectMgr->GetCreatureData(guid))
303 newEntry.Entry = data->id;
304
305 // Validate vendor item
306 if (!sObjectMgr->IsVendorItemValid(newEntry.Entry, newEntry.Item, newEntry.MaxCount, newEntry.Incrtime, newEntry.ExtendedCost, nullptr, nullptr, event_npc_flag))
307 {
308 LOG_ERROR("sql.sql", "Table `game_event_npc_vendor` has invalid item ({}) for guid ({}) for event ({}), skipped.",
309 newEntry.Item, newEntry.Entry, eventId);
310 continue;
311 }
312
313 // Add the item to the vendor if event is active
314 if (IsEventActive(eventId))
315 sObjectMgr->AddVendorItem(newEntry.Entry, newEntry.Item, newEntry.MaxCount, newEntry.Incrtime, newEntry.ExtendedCost, false);
316
317 vendors.push_back(newEntry);
318
319 ++count;
320 } while (result->NextRow());
321
322 LOG_INFO("server.loading", ">> Loaded {} Vendor Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
323 LOG_INFO("server.loading", " ");
324
325}
bool IsEventActive(uint16 eventId)
Definition GameEventMgr.cpp:2076
@ WORLD_SEL_GAME_EVENT_NPC_VENDOR
Definition WorldDatabase.h:111
std::list< GuidNPCFlagPair > NPCFlagList
Definition GameEventMgr.h:180
std::list< NPCVendorEntry > NPCVendorList
Definition GameEventMgr.h:176
Definition GameEventMgr.h:85
int32 MaxCount
Definition GameEventMgr.h:88
uint32 Incrtime
Definition GameEventMgr.h:89
uint32 Item
Definition GameEventMgr.h:87
uint32 ExtendedCost
Definition GameEventMgr.h:90
uint32 Entry
Definition GameEventMgr.h:86

References _gameEventNPCFlags, _gameEventVendors, NPCVendorEntry::Entry, NPCVendorEntry::ExtendedCost, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), NPCVendorEntry::Incrtime, IsEventActive(), NPCVendorEntry::Item, LOG_ERROR, LOG_INFO, LOG_WARN, NPCVendorEntry::MaxCount, sObjectMgr, WORLD_SEL_GAME_EVENT_NPC_VENDOR, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadFromDB()

void GameEventMgr::LoadFromDB ( )
1065{
1066 // The order of these functions matter. Do not change
1067 LoadEvents();
1083}
void LoadEventConditionData()
Definition GameEventMgr.cpp:796
void LoadEventCreatureData()
Definition GameEventMgr.cpp:509
void LoadEventSeasonalQuestRelations()
Definition GameEventMgr.cpp:929
void LoadEventQuestData()
Definition GameEventMgr.cpp:668
void LoadEventPoolData()
Definition GameEventMgr.cpp:1015
void LoadEventGameObjectQuestData()
Definition GameEventMgr.cpp:710
void LoadEventSaveData()
Definition GameEventMgr.cpp:410
void LoadEventNPCFlags()
Definition GameEventMgr.cpp:888
void LoadEventQuestConditionData()
Definition GameEventMgr.cpp:752
void LoadEventModelEquipmentChangeData()
Definition GameEventMgr.cpp:609
void LoadEventPrerequisiteData()
Definition GameEventMgr.cpp:456
void LoadEventVendors()
Definition GameEventMgr.cpp:240
void LoadEventGameObjectData()
Definition GameEventMgr.cpp:559
void LoadEvents()
Definition GameEventMgr.cpp:327
void LoadEventBattlegroundData()
Definition GameEventMgr.cpp:976
void LoadEventConditionSaveData()
Definition GameEventMgr.cpp:839

References LoadEventBattlegroundData(), LoadEventConditionData(), LoadEventConditionSaveData(), LoadEventCreatureData(), LoadEventGameObjectData(), LoadEventGameObjectQuestData(), LoadEventModelEquipmentChangeData(), LoadEventNPCFlags(), LoadEventPoolData(), LoadEventPrerequisiteData(), LoadEventQuestConditionData(), LoadEventQuestData(), LoadEvents(), LoadEventSaveData(), LoadEventSeasonalQuestRelations(), and LoadEventVendors().

◆ LoadHolidayDates()

void GameEventMgr::LoadHolidayDates ( )
1086{
1087 uint32 const oldMSTime = getMSTime();
1088 uint32 dynamicCount = 0;
1089 uint32 dbCount = 0;
1090
1091 // Step 1: Generate dynamic holiday dates based on current year
1092 std::chrono::system_clock::time_point const now = std::chrono::system_clock::now();
1093 std::time_t const nowTime = std::chrono::system_clock::to_time_t(now);
1094 std::tm localTime = {};
1095#ifdef _WIN32
1096 localtime_s(&localTime, &nowTime);
1097#else
1098 localtime_r(&nowTime, &localTime);
1099#endif
1100 int const currentYear = localTime.tm_year + 1900;
1101
1102 for (auto const& rule : HolidayDateCalculator::GetHolidayRules())
1103 {
1104 HolidaysEntry* entry = const_cast<HolidaysEntry*>(sHolidaysStore.LookupEntry(rule.holidayId));
1105 if (!entry)
1106 {
1107 LOG_INFO("server.loading", ">> Holiday {} not found in DBC - cannot set dynamic dates", rule.holidayId);
1108 continue;
1109 }
1110
1111 // Special handling for Darkmoon Faire - needs multiple dates per year (4 occurrences)
1113 {
1114 int const locationOffset = rule.month;
1115 std::vector<uint32_t> const dates = HolidayDateCalculator::GetDarkmoonFaireDates(locationOffset, currentYear - 1, 4, rule.offset);
1116
1117 uint8 dateId = 0;
1118 for (auto const& packedDate : dates)
1119 {
1120 if (dateId >= MAX_HOLIDAY_DATES)
1121 break;
1122
1123 entry->Date[dateId++] = packedDate;
1124 ++dynamicCount;
1125 }
1126
1127 // Darkmoon Faire lasts 7 days (168 hours) - set Duration if not already set
1128 if (!entry->Duration[0])
1129 entry->Duration[0] = 168; // 7 days in hours
1130
1131 auto itr = std::lower_bound(ModifiedHolidays.begin(), ModifiedHolidays.end(), entry->Id);
1132 if (itr == ModifiedHolidays.end() || *itr != entry->Id)
1133 ModifiedHolidays.insert(itr, entry->Id);
1134
1135 continue;
1136 }
1137
1138 // Generate dates for current year + 2 ahead (year capped at 2030 due to 5-bit client limitation)
1139 for (int yearOffset = -1; yearOffset <= 2; ++yearOffset)
1140 {
1141 int const year = currentYear + yearOffset;
1142 if (year > 2030)
1143 break;
1144
1145 uint8 const dateId = static_cast<uint8>(yearOffset + 1);
1146 if (dateId >= MAX_HOLIDAY_DATES)
1147 break;
1148
1149 uint32_t const packedDate = HolidayDateCalculator::GetPackedHolidayDate(rule.holidayId, year);
1150 entry->Date[dateId] = packedDate;
1151
1152 // Debug: decode and log the date
1153 std::tm const date = HolidayDateCalculator::UnpackDate(packedDate);
1154 LOG_DEBUG("server.loading", ">> Holiday {} Date[{}] = {}-{:02d}-{:02d}",
1155 rule.holidayId, dateId, date.tm_year + 1900, date.tm_mon + 1, date.tm_mday);
1156
1157 ++dynamicCount;
1158 }
1159
1160 auto itr = std::lower_bound(ModifiedHolidays.begin(), ModifiedHolidays.end(), entry->Id);
1161 if (itr == ModifiedHolidays.end() || *itr != entry->Id)
1162 ModifiedHolidays.insert(itr, entry->Id);
1163 }
1164
1165 // Step 2: Check game_event.start_time for overrides (allows custom servers to override calculated dates)
1166 // Only use as override if start_time year >= current year (ignore old static dates)
1167 QueryResult result = WorldDatabase.Query("SELECT holiday, UNIX_TIMESTAMP(start_time) FROM game_event WHERE holiday != 0 AND start_time > '2000-12-31'");
1168
1169 if (result)
1170 {
1171 do
1172 {
1173 Field* fields = result->Fetch();
1174
1175 uint32 const holidayId = fields[0].Get<uint32>();
1176 HolidaysEntry* entry = const_cast<HolidaysEntry*>(sHolidaysStore.LookupEntry(holidayId));
1177 if (!entry)
1178 continue;
1179
1180 if (fields[1].IsNull())
1181 continue;
1182
1183 time_t const startTime = fields[1].Get<uint64>();
1184 if (startTime == 0)
1185 continue;
1186
1187 std::tm const timeInfo = Acore::Time::TimeBreakdown(startTime);
1188
1189 int const year = timeInfo.tm_year + 1900;
1190 // Only override if start_time is current year or later (ignore old static dates)
1191 if (year < currentYear || year > 2030)
1192 continue;
1193
1194 // Pack the date in WoW format and override Date[0]
1195 uint32_t const yearOffset = static_cast<uint32_t>(year - 2000);
1196 uint32_t const month = static_cast<uint32_t>(timeInfo.tm_mon);
1197 uint32_t const day = static_cast<uint32_t>(timeInfo.tm_mday - 1);
1198 uint32_t const weekday = static_cast<uint32_t>(timeInfo.tm_wday);
1199 entry->Date[0] = (yearOffset << 24) | (month << 20) | (day << 14) | (weekday << 11);
1200
1201 ++dbCount;
1202 } while (result->NextRow());
1203 }
1204
1205 LOG_INFO("server.loading", ">> Loaded {} Holiday Dates ({} dynamic, {} game_event overrides) in {} ms",
1206 dynamicCount + dbCount, dynamicCount, dbCount, GetMSTimeDiffToNow(oldMSTime));
1207}
#define MAX_HOLIDAY_DATES
Definition DBCStructure.h:1123
struct tm * localtime_r(time_t const *time, struct tm *result)
Definition Timer.cpp:226
std::vector< uint32 > ModifiedHolidays
Definition GameEventMgr.h:201
Definition HolidayDateCalculator.h:59
static std::vector< uint32_t > GetDarkmoonFaireDates(int locationOffset, int startYear, int numYears, int dayOffset=0)
Definition HolidayDateCalculator.cpp:621
static uint32_t GetPackedHolidayDate(uint32_t holidayId, int year)
Definition HolidayDateCalculator.cpp:608
static std::tm UnpackDate(uint32_t packed)
Definition HolidayDateCalculator.cpp:595
AC_COMMON_API std::tm TimeBreakdown(time_t t=0)
Definition Timer.cpp:233
uint32 Id
Definition DBCStructure.h:1128
uint32 Date[MAX_HOLIDAY_DATES]
Definition DBCStructure.h:1130

References DARKMOON_FAIRE, HolidaysEntry::Date, HolidaysEntry::Duration, Field::Get(), HolidayDateCalculator::GetDarkmoonFaireDates(), HolidayDateCalculator::GetHolidayRules(), getMSTime(), GetMSTimeDiffToNow(), HolidayDateCalculator::GetPackedHolidayDate(), HolidaysEntry::Id, localtime_r(), LOG_DEBUG, LOG_INFO, MAX_HOLIDAY_DATES, ModifiedHolidays, sHolidaysStore, Acore::Time::TimeBreakdown(), HolidayDateCalculator::UnpackDate(), and WorldDatabase.

◆ NextCheck()

uint32 GameEventMgr::NextCheck ( uint16  entry) const
85{
86 time_t currenttime = GameTime::GetGameTime().count();
87
88 // for NEXTPHASE state world events, return the delay to start the next event, so the followup event will be checked correctly
89 if ((_gameEvent[entry].State == GAMEEVENT_WORLD_NEXTPHASE || _gameEvent[entry].State == GAMEEVENT_WORLD_FINISHED) && _gameEvent[entry].NextStart >= currenttime)
90 return uint32(_gameEvent[entry].NextStart - currenttime);
91
92 // for CONDITIONS state world events, return the length of the wait period, so if the conditions are met, this check will be called again to set the timer as NEXTPHASE event
93 if (_gameEvent[entry].State == GAMEEVENT_WORLD_CONDITIONS)
94 {
95 if (_gameEvent[entry].Length)
96 return _gameEvent[entry].Length * 60;
97 else
98 return max_ge_check_delay;
99 }
100
101 // outdated event: we return max
102 if (currenttime > _gameEvent[entry].End)
103 return max_ge_check_delay;
104
105 // never started event, we return delay before start
106 if (_gameEvent[entry].Start > currenttime)
107 return uint32(_gameEvent[entry].Start - currenttime);
108
109 uint32 delay;
110 // in event, we return the end of it
111 if ((((currenttime - _gameEvent[entry].Start) % (_gameEvent[entry].Occurence * 60)) < (_gameEvent[entry].Length * 60)))
112 // we return the delay before it ends
113 delay = (_gameEvent[entry].Length * MINUTE) - ((currenttime - _gameEvent[entry].Start) % (_gameEvent[entry].Occurence * MINUTE));
114 else // not in window, we return the delay before next start
115 delay = (_gameEvent[entry].Occurence * MINUTE) - ((currenttime - _gameEvent[entry].Start) % (_gameEvent[entry].Occurence * MINUTE));
116 // In case the end is before next check
117 if (_gameEvent[entry].End < time_t(currenttime + delay))
118 return uint32(_gameEvent[entry].End - currenttime);
119 else
120 return delay;
121}
#define max_ge_check_delay
Definition GameEventMgr.h:27

References _gameEvent, GAMEEVENT_WORLD_CONDITIONS, GAMEEVENT_WORLD_FINISHED, GAMEEVENT_WORLD_NEXTPHASE, GameTime::GetGameTime(), max_ge_check_delay, and MINUTE.

Referenced by Update().

◆ RemoveActiveEvent()

void GameEventMgr::RemoveActiveEvent ( uint16  eventId)
inlineprivate
146{ _activeEvents.erase(eventId); }

References _activeEvents.

Referenced by StopEvent().

◆ RunSmartAIScripts()

void GameEventMgr::RunSmartAIScripts ( uint16  eventId,
bool  activate 
)
private

Iterate over every supported source type (creature and gameobject) Not entirely sure how this will affect units in non-loaded grids.

1918{
1921 sMapMgr->DoForAllMaps([eventId, activate](Map* map)
1922 {
1923 GameEventAIHookWorker worker(eventId, activate);
1925 visitor.Visit(map->GetObjectsStore());
1926 });
1927}
Definition GameEventMgr.cpp:1891
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:358
Definition TypeContainerVisitor.h:105

References Map::GetObjectsStore(), sMapMgr, and TypeContainerVisitor< VISITOR, TYPE_CONTAINER >::Visit().

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ SaveWorldEventStateToDB()

void GameEventMgr::SaveWorldEventStateToDB ( uint16  eventId)
private
1863{
1864 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1865
1867 stmt->SetData(0, uint8(eventId));
1868 trans->Append(stmt);
1869
1870 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_SAVE);
1871 stmt->SetData(0, uint8(eventId));
1872 stmt->SetData(1, _gameEvent[eventId].State);
1873 stmt->SetData(2, _gameEvent[eventId].NextStart ? uint32(_gameEvent[eventId].NextStart) : 0);
1874 trans->Append(stmt);
1875 CharacterDatabase.CommitTransaction(trans);
1876}
@ CHAR_DEL_GAME_EVENT_SAVE
Definition CharacterDatabase.h:216
@ CHAR_INS_GAME_EVENT_SAVE
Definition CharacterDatabase.h:217

References _gameEvent, CHAR_DEL_GAME_EVENT_SAVE, CHAR_INS_GAME_EVENT_SAVE, CharacterDatabase, and PreparedStatementBase::SetData().

Referenced by HandleQuestComplete(), StartEvent(), and Update().

◆ SendWorldStateUpdate()

void GameEventMgr::SendWorldStateUpdate ( Player player,
uint16  eventId 
)
private
1879{
1880 GameEventConditionMap::const_iterator itr;
1881 for (itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1882 {
1883 if (itr->second.DoneWorldState)
1884 player->SendUpdateWorldState(itr->second.DoneWorldState, (uint32)(itr->second.Done));
1885 if (itr->second.MaxWorldState)
1886 player->SendUpdateWorldState(itr->second.MaxWorldState, (uint32)(itr->second.ReqNum));
1887 }
1888}
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition PlayerUpdates.cpp:2266

References _gameEvent, and Player::SendUpdateWorldState().

◆ SetHolidayEventTime()

void GameEventMgr::SetHolidayEventTime ( GameEventData event)
private
1930{
1931 if (!event.HolidayStage) // Ignore holiday
1932 return;
1933
1934 HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(event.HolidayId);
1935
1936 if (!holiday->Date[0] || !holiday->Duration[0]) // Invalid definitions
1937 {
1938 LOG_ERROR("sql.sql", "Missing date or duration for holiday {}.", event.HolidayId);
1939 return;
1940 }
1941
1942 uint8 stageIndex = event.HolidayStage - 1;
1943 event.Length = holiday->Duration[stageIndex] * HOUR / MINUTE;
1944
1945 time_t stageOffset = 0;
1946 for (uint8 i = 0; i < stageIndex; ++i)
1947 {
1948 stageOffset += holiday->Duration[i] * HOUR;
1949 }
1950
1951 switch (holiday->CalendarFilterType)
1952 {
1953 case -1: // Yearly
1954 event.Occurence = YEAR / MINUTE; // Not all too useful
1955 break;
1956 case 0: // Weekly
1957 event.Occurence = WEEK / MINUTE;
1958 break;
1959 case 1: // Defined dates only (Darkmoon Faire)
1960 break;
1961 case 2: // Only used for looping events (Call to Arms)
1962 break;
1963 }
1964
1965 if (holiday->Looping)
1966 {
1967 event.Occurence = 0;
1968 for (uint8 i = 0; i < MAX_HOLIDAY_DURATIONS && holiday->Duration[i]; ++i)
1969 {
1970 event.Occurence += holiday->Duration[i] * HOUR / MINUTE;
1971 }
1972 }
1973
1974 bool singleDate = ((holiday->Date[0] >> 24) & 0x1F) == 31; // Events with fixed date within year have - 1
1975
1976 time_t curTime = GameTime::GetGameTime().count();
1977
1978 if (holiday->Looping)
1979 {
1980 // Looping events (Battleground Call to Arms) carry a single past anchor in the DBC and
1981 // recur via event.Occurence. Anchor to that DBC date so the window keeps the correct phase
1982 // instead of inheriting the wrong time of day from a stale game_event.start_time.
1983 if (time_t start = HolidayDateCalculator::FindLoopingStartTime(holiday->Date[0], stageOffset, event.Occurence, curTime))
1984 event.Start = start;
1985
1986 return;
1987 }
1988
1989 if (!singleDate)
1990 {
1992 holiday->Date, MAX_HOLIDAY_DATES, stageOffset, event.Length, curTime);
1993 if (start)
1994 event.Start = start;
1995
1996 return;
1997 }
1998
1999 for (uint8 i = 0; i < MAX_HOLIDAY_DATES && holiday->Date[i]; ++i)
2000 {
2001 uint32 date = holiday->Date[i];
2002
2003 tm timeInfo = Acore::Time::TimeBreakdown(curTime);
2004 timeInfo.tm_year -= 1; // First try last year (event active through New Year)
2005
2006 timeInfo.tm_mon = (date >> 20) & 0xF;
2007 timeInfo.tm_mday = ((date >> 14) & 0x3F) + 1;
2008 timeInfo.tm_hour = (date >> 6) & 0x1F;
2009 timeInfo.tm_min = date & 0x3F;
2010 timeInfo.tm_sec = 0;
2011 timeInfo.tm_isdst = -1;
2012
2013 // try to get next start time (skip past dates)
2014 time_t startTime = mktime(&timeInfo);
2015 if (curTime < startTime + stageOffset + event.Length * MINUTE)
2016 {
2017 event.Start = startTime + stageOffset;
2018 break;
2019 }
2020 else
2021 {
2022 tm tmCopy = Acore::Time::TimeBreakdown(curTime);
2023 int year = tmCopy.tm_year; // This year
2024 tmCopy = timeInfo;
2025 tmCopy.tm_year = year;
2026 event.Start = mktime(&tmCopy) + stageOffset;
2027 break;
2028 }
2029 }
2030}
constexpr auto YEAR
Definition Common.h:52
constexpr auto WEEK
Definition Common.h:50
constexpr auto HOUR
Definition Common.h:48
static time_t FindLoopingStartTime(uint32_t packedAnchor, time_t stageOffset, uint32_t occurenceMinutes, time_t curTime)
Definition HolidayDateCalculator.cpp:675
static time_t FindStartTimeForStage(uint32_t const *packedDates, uint8_t numDates, time_t stageOffset, uint32_t stageLengthMinutes, time_t curTime)
Definition HolidayDateCalculator.cpp:651
int32 CalendarFilterType
Definition DBCStructure.h:1138
uint32 Looping
Definition DBCStructure.h:1132

References HolidaysEntry::CalendarFilterType, HolidaysEntry::Date, HolidaysEntry::Duration, HolidayDateCalculator::FindLoopingStartTime(), HolidayDateCalculator::FindStartTimeForStage(), GameTime::GetGameTime(), GameEventData::HolidayId, GameEventData::HolidayStage, HOUR, GameEventData::Length, LOG_ERROR, HolidaysEntry::Looping, MAX_HOLIDAY_DATES, MAX_HOLIDAY_DURATIONS, MINUTE, GameEventData::Occurence, sHolidaysStore, Acore::Time::TimeBreakdown(), WEEK, and YEAR.

Referenced by LoadEvents().

◆ StartEvent()

bool GameEventMgr::StartEvent ( uint16  event_id,
bool  overwrite = false 
)
138{
139 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_GAME_EVENT, eventId, nullptr) && !overwrite)
140 return false;
141
142 GameEventData& data = _gameEvent[eventId];
143 if (data.State == GAMEEVENT_NORMAL || data.State == GAMEEVENT_INTERNAL)
144 {
145 AddActiveEvent(eventId);
146 ApplyNewEvent(eventId);
147 if (overwrite)
148 {
149 _gameEvent[eventId].Start = GameTime::GetGameTime().count();
150 if (data.End <= data.Start)
151 data.End = data.Start + data.Length;
152 }
153
154 if (IsActiveEvent(eventId))
155 sScriptMgr->OnGameEventStart(eventId);
156
157 // When event is started, set its worldstate to current time
158 auto itr = _gameEventSeasonalQuestsMap.find(eventId);
159 if (itr != _gameEventSeasonalQuestsMap.end() && !itr->second.empty())
160 {
161 sWorldState->setWorldState(eventId, GameTime::GetGameTime().count());
162 }
163
164 return false;
165 }
166 else
167 {
169 // set to conditions phase
171
172 // add to active events
173 AddActiveEvent(eventId);
174 // add spawns
175 ApplyNewEvent(eventId);
176
177 // check if can go to next state
178 bool conditions_met = CheckOneGameEventConditions(eventId);
179 // save to db
181 // force game event update to set the update timer if conditions were met from a command
182 // this update is needed to possibly start events dependent on the started one
183 // or to scedule another update where the next event will be started
184 if (overwrite && conditions_met)
185 sWorld->ForceGameEventUpdate();
186
187 if (IsActiveEvent(eventId))
188 sScriptMgr->OnGameEventStart(eventId);
189
190 return conditions_met;
191 }
192}
#define sDisableMgr
Definition DisableMgr.h:88
@ DISABLE_TYPE_GAME_EVENT
Definition DisableMgr.h:37
#define sScriptMgr
Definition ScriptMgr.h:757
void ApplyNewEvent(uint16 eventId)
Definition GameEventMgr.cpp:1359
void AddActiveEvent(uint16 eventId)
Definition GameEventMgr.h:145

References _gameEvent, _gameEventSeasonalQuestsMap, AddActiveEvent(), ApplyNewEvent(), CheckOneGameEventConditions(), DISABLE_TYPE_GAME_EVENT, GameEventData::End, GAMEEVENT_INTERNAL, GAMEEVENT_NORMAL, GAMEEVENT_WORLD_CONDITIONS, GAMEEVENT_WORLD_INACTIVE, GameTime::GetGameTime(), IsActiveEvent(), GameEventData::Length, SaveWorldEventStateToDB(), sDisableMgr, sScriptMgr, GameEventData::Start, GameEventData::State, sWorld, and sWorldState.

Referenced by StartInternalEvent(), and Update().

◆ StartInternalEvent()

void GameEventMgr::StartInternalEvent ( uint16  event_id)
124{
125 if (eventId < 1 || eventId >= _gameEvent.size())
126 return;
127
128 if (!_gameEvent[eventId].isValid())
129 return;
130
131 if (_activeEvents.find(eventId) != _activeEvents.end())
132 return;
133
134 StartEvent(eventId);
135}
bool StartEvent(uint16 event_id, bool overwrite=false)
Definition GameEventMgr.cpp:137

References _activeEvents, _gameEvent, and StartEvent().

◆ StartSystem()

uint32 GameEventMgr::StartSystem ( )
1250{
1251 _activeEvents.clear();
1252 uint32 delay = Update();
1253 _isSystemInit = true;
1254 return delay;
1255}
uint32 Update()
Definition GameEventMgr.cpp:1257

References _activeEvents, _isSystemInit, and Update().

◆ StopEvent()

void GameEventMgr::StopEvent ( uint16  event_id,
bool  overwrite = false 
)
195{
196 GameEventData& data = _gameEvent[eventId];
197 bool serverwide_evt = data.State != GAMEEVENT_NORMAL && data.State != GAMEEVENT_INTERNAL;
198
199 RemoveActiveEvent(eventId);
200 UnApplyEvent(eventId);
201
202 // When event is stopped, clean up its worldstate
203 sWorldState->setWorldState(eventId, 0);
204
205 if (overwrite && !serverwide_evt)
206 {
207 data.Start = GameTime::GetGameTime().count() - data.Length * MINUTE;
208 if (data.End <= data.Start)
209 data.End = data.Start + data.Length;
210 }
211 else if (serverwide_evt)
212 {
213 // if finished world event, then only gm command can stop it
214 if (overwrite || data.State != GAMEEVENT_WORLD_FINISHED)
215 {
216 // reset conditions
217 data.NextStart = 0;
219 GameEventConditionMap::iterator itr;
220 for (itr = data.Conditions.begin(); itr != data.Conditions.end(); ++itr)
221 itr->second.Done = 0;
222
223 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
225 stmt->SetData(0, uint8(eventId));
226 trans->Append(stmt);
227
228 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GAME_EVENT_SAVE);
229 stmt->SetData(0, uint8(eventId));
230 trans->Append(stmt);
231
232 CharacterDatabase.CommitTransaction(trans);
233 }
234 }
235
236 if (!IsActiveEvent(eventId))
237 sScriptMgr->OnGameEventStop(eventId);
238}
@ CHAR_DEL_ALL_GAME_EVENT_CONDITION_SAVE
Definition CharacterDatabase.h:219
void UnApplyEvent(uint16 eventId)
Definition GameEventMgr.cpp:1336
void RemoveActiveEvent(uint16 eventId)
Definition GameEventMgr.h:146
GameEventConditionMap Conditions
Definition GameEventMgr.h:68

References _gameEvent, CHAR_DEL_ALL_GAME_EVENT_CONDITION_SAVE, CHAR_DEL_GAME_EVENT_SAVE, CharacterDatabase, GameEventData::Conditions, GameEventData::End, GAMEEVENT_INTERNAL, GAMEEVENT_NORMAL, GAMEEVENT_WORLD_FINISHED, GAMEEVENT_WORLD_INACTIVE, GameTime::GetGameTime(), IsActiveEvent(), GameEventData::Length, MINUTE, GameEventData::NextStart, RemoveActiveEvent(), PreparedStatementBase::SetData(), sScriptMgr, GameEventData::Start, GameEventData::State, sWorldState, and UnApplyEvent().

Referenced by Update().

◆ UnApplyEvent()

void GameEventMgr::UnApplyEvent ( uint16  eventId)
private

Run SAI scripts with SMART_EVENT_GAME_EVENT_END

1337{
1338 LOG_DEBUG("gameevent", "GameEvent {} \"{}\" removed.", eventId, _gameEvent[eventId].Description);
1340 RunSmartAIScripts(eventId, false);
1341 // un-spawn positive event tagged objects
1342 GameEventUnspawn(eventId);
1343 // spawn negative event tagget objects
1344 int16 numEventId = (-1) * eventId;
1345 GameEventSpawn(numEventId);
1346 // restore equipment or model
1347 ChangeEquipOrModel(eventId, false);
1348 // Remove quests that are events only to non event npc
1349 UpdateEventQuests(eventId, false);
1350 UpdateWorldStates(eventId, false);
1351 // update npcflags in this event
1352 UpdateEventNPCFlags(eventId);
1353 // remove vendor items
1354 UpdateEventNPCVendor(eventId, false);
1355 // update bg holiday
1357}

References _gameEvent, ChangeEquipOrModel(), GameEventSpawn(), GameEventUnspawn(), LOG_DEBUG, RunSmartAIScripts(), UpdateBattlegroundSettings(), UpdateEventNPCFlags(), UpdateEventNPCVendor(), UpdateEventQuests(), and UpdateWorldStates().

Referenced by StopEvent().

◆ Update()

uint32 GameEventMgr::Update ( )
1258{
1259 time_t currenttime = GameTime::GetGameTime().count();
1260 uint32 nextEventDelay = max_ge_check_delay; // 1 day
1261 uint32 calcDelay;
1262 std::set<uint16> activate, deactivate;
1263 for (uint16 itr = 1; itr < _gameEvent.size(); ++itr)
1264 {
1265 // must do the activating first, and after that the deactivating
1266 // so first queue it
1267 //LOG_ERROR("sql.sql", "Checking event {}", itr);
1268
1269 sScriptMgr->OnGameEventCheck(itr);
1270
1271 if (CheckOneGameEvent(itr))
1272 {
1273 // if the world event is in NEXTPHASE state, and the time has passed to finish this event, then do so
1274 if (_gameEvent[itr].State == GAMEEVENT_WORLD_NEXTPHASE && _gameEvent[itr].NextStart <= currenttime)
1275 {
1276 // set this event to finished, null the nextstart time
1278 _gameEvent[itr].NextStart = 0;
1279 // save the state of this gameevent
1281 // queue for deactivation
1282 if (IsActiveEvent(itr))
1283 deactivate.insert(itr);
1284 // go to next event, this no longer needs an event update timer
1285 continue;
1286 }
1288 // changed, save to DB the gameevent state, will be updated in next update cycle
1290
1291 // queue for activation
1292 if (!IsActiveEvent(itr))
1293 activate.insert(itr);
1294 }
1295 else
1296 {
1297 // If event is inactive, periodically clean up its worldstate
1298 sWorldState->setWorldState(itr, 0);
1299
1300 if (IsActiveEvent(itr))
1301 {
1302 // Xinef: do not deactivate internal events on whim
1303 if (_gameEvent[itr].State != GAMEEVENT_INTERNAL)
1304 deactivate.insert(itr);
1305 }
1306 else
1307 {
1308 if (!_isSystemInit)
1309 {
1310 int16 event_nid = (-1) * (itr);
1311 // spawn all negative ones for this event
1312 GameEventSpawn(event_nid);
1313 }
1314 }
1315 }
1316 calcDelay = NextCheck(itr);
1317 if (calcDelay < nextEventDelay)
1318 nextEventDelay = calcDelay;
1319 }
1320 // now activate the queue
1321 // a now activated event can contain a spawn of a to-be-deactivated one
1322 // following the activate - deactivate order, deactivating the first event later will leave the spawn in (wont disappear then reappear clientside)
1323 for (std::set<uint16>::iterator itr = activate.begin(); itr != activate.end(); ++itr)
1324 // start the event
1325 // returns true the started event completed
1326 // in that case, initiate next update in 1 second
1327 if (StartEvent(*itr))
1328 nextEventDelay = 0;
1329 for (std::set<uint16>::iterator itr = deactivate.begin(); itr != deactivate.end(); ++itr)
1330 StopEvent(*itr);
1331
1332 LOG_DEBUG("gameevent", "Next game event check in {} seconds.", nextEventDelay + 1);
1333 return (nextEventDelay + 1) * IN_MILLISECONDS; // Add 1 second to be sure event has started/stopped at next call
1334}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
uint32 NextCheck(uint16 entry) const
Definition GameEventMgr.cpp:84
bool CheckOneGameEvent(uint16 entry) const
Definition GameEventMgr.cpp:46
void StopEvent(uint16 event_id, bool overwrite=false)
Definition GameEventMgr.cpp:194

References _gameEvent, _isSystemInit, CheckOneGameEvent(), CheckOneGameEventConditions(), GAMEEVENT_INTERNAL, GAMEEVENT_WORLD_CONDITIONS, GAMEEVENT_WORLD_FINISHED, GAMEEVENT_WORLD_NEXTPHASE, GameEventSpawn(), GameTime::GetGameTime(), IN_MILLISECONDS, IsActiveEvent(), LOG_DEBUG, max_ge_check_delay, NextCheck(), SaveWorldEventStateToDB(), sScriptMgr, StartEvent(), StopEvent(), and sWorldState.

Referenced by StartSystem().

◆ UpdateBattlegroundSettings()

void GameEventMgr::UpdateBattlegroundSettings ( )
private
1431{
1432 uint32 mask = 0;
1433 for (ActiveEvents::const_iterator itr = _activeEvents.begin(); itr != _activeEvents.end(); ++itr)
1434 mask |= _gameEventBattlegroundHolidays[*itr];
1435 sBattlegroundMgr->SetHolidayWeekends(mask);
1436}
#define sBattlegroundMgr
Definition BattlegroundMgr.h:190

References _activeEvents, _gameEventBattlegroundHolidays, and sBattlegroundMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventNPCFlags()

void GameEventMgr::UpdateEventNPCFlags ( uint16  eventId)
private
1396{
1397 std::unordered_map<uint32, std::unordered_set<ObjectGuid::LowType>> creaturesByMap;
1398
1399 // go through the creatures whose npcflags are changed in the event
1400 for (NPCFlagList::iterator itr = _gameEventNPCFlags[eventId].begin(); itr != _gameEventNPCFlags[eventId].end(); ++itr)
1401 {
1402 // get the creature data from the low guid to get the entry, to be able to find out the whole guid
1403 if (CreatureData const* data = sObjectMgr->GetCreatureData(itr->first))
1404 creaturesByMap[data->mapid].insert(itr->first);
1405 }
1406
1407 for (auto const& p : creaturesByMap)
1408 {
1409 sMapMgr->DoForAllMapsWithMapId(p.first, [this, &p](Map* map)
1410 {
1411 for (auto& spawnId : p.second)
1412 {
1413 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(spawnId);
1414 for (auto itr = creatureBounds.first; itr != creatureBounds.second; ++itr)
1415 {
1416 Creature* creature = itr->second;
1417 uint32 npcflag = GetNPCFlag(creature);
1418 if (CreatureTemplate const* creatureTemplate = creature->GetCreatureTemplate())
1419 npcflag |= creatureTemplate->npcflag;
1420
1421 creature->ReplaceAllNpcFlags(NPCFlags(npcflag));
1422 // reset gossip options, since the flag change might have added / removed some
1423 //cr->ResetGossipOptions();
1424 }
1425 }
1426 });
1427 }
1428}

References _gameEventNPCFlags, Map::GetCreatureBySpawnIdStore(), Creature::GetCreatureTemplate(), GetNPCFlag(), Unit::ReplaceAllNpcFlags(), sMapMgr, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventNPCVendor()

void GameEventMgr::UpdateEventNPCVendor ( uint16  eventId,
bool  activate 
)
private
1439{
1440 for (NPCVendorList::iterator itr = _gameEventVendors[eventId].begin(); itr != _gameEventVendors[eventId].end(); ++itr)
1441 {
1442 if (activate)
1443 sObjectMgr->AddVendorItem(itr->Entry, itr->Item, itr->MaxCount, itr->Incrtime, itr->ExtendedCost, false);
1444 else
1445 sObjectMgr->RemoveVendorItem(itr->Entry, itr->Item, false);
1446 }
1447}

References _gameEventVendors, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventQuests()

void GameEventMgr::UpdateEventQuests ( uint16  eventId,
bool  activate 
)
private
1712{
1713 QuestRelList::iterator itr;
1714 for (itr = _gameEventCreatureQuests[eventId].begin(); itr != _gameEventCreatureQuests[eventId].end(); ++itr)
1715 {
1716 QuestRelations* CreatureQuestMap = sObjectMgr->GetCreatureQuestRelationMap();
1717 if (activate) // Add the pair(id, quest) to the multimap
1718 CreatureQuestMap->insert(QuestRelations::value_type(itr->first, itr->second));
1719 else
1720 {
1721 if (!HasCreatureQuestActiveEventExcept(itr->second, eventId))
1722 {
1723 // Remove the pair(id, quest) from the multimap
1724 QuestRelations::iterator qitr = CreatureQuestMap->find(itr->first);
1725 if (qitr == CreatureQuestMap->end())
1726 continue;
1727 QuestRelations::iterator lastElement = CreatureQuestMap->upper_bound(itr->first);
1728 for (; qitr != lastElement; ++qitr)
1729 {
1730 if (qitr->second == itr->second)
1731 {
1732 CreatureQuestMap->erase(qitr); // iterator is now no more valid
1733 break; // but we can exit loop since the element is found
1734 }
1735 }
1736 }
1737 }
1738 }
1739 for (itr = _gameEventGameObjectQuests[eventId].begin(); itr != _gameEventGameObjectQuests[eventId].end(); ++itr)
1740 {
1741 QuestRelations* GameObjectQuestMap = sObjectMgr->GetGOQuestRelationMap();
1742 if (activate) // Add the pair(id, quest) to the multimap
1743 GameObjectQuestMap->insert(QuestRelations::value_type(itr->first, itr->second));
1744 else
1745 {
1746 if (!HasGameObjectQuestActiveEventExcept(itr->second, eventId))
1747 {
1748 // Remove the pair(id, quest) from the multimap
1749 QuestRelations::iterator qitr = GameObjectQuestMap->find(itr->first);
1750 if (qitr == GameObjectQuestMap->end())
1751 continue;
1752 QuestRelations::iterator lastElement = GameObjectQuestMap->upper_bound(itr->first);
1753 for (; qitr != lastElement; ++qitr)
1754 {
1755 if (qitr->second == itr->second)
1756 {
1757 GameObjectQuestMap->erase(qitr); // iterator is now no more valid
1758 break; // but we can exit loop since the element is found
1759 }
1760 }
1761 }
1762 }
1763 }
1764}
std::multimap< uint32, uint32 > QuestRelations
Definition ObjectMgr.h:530
bool HasCreatureQuestActiveEventExcept(uint32 quest_id, uint16 eventId)
Definition GameEventMgr.cpp:1655
bool HasGameObjectQuestActiveEventExcept(uint32 quest_id, uint16 eventId)
Definition GameEventMgr.cpp:1669

References _gameEventCreatureQuests, _gameEventGameObjectQuests, HasCreatureQuestActiveEventExcept(), HasGameObjectQuestActiveEventExcept(), and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateWorldStates()

void GameEventMgr::UpdateWorldStates ( uint16  eventId,
bool  Activate 
)
private
1767{
1768 GameEventData const& event = _gameEvent[eventId];
1769 if (event.HolidayId != HOLIDAY_NONE)
1770 {
1772 if (bgTypeId != BATTLEGROUND_TYPE_NONE)
1773 {
1774 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
1775 if (bl && bl->HolidayWorldStateId)
1776 {
1778 worldstate.VariableID = bl->HolidayWorldStateId;
1779 worldstate.Value = Activate ? 1 : 0;
1780 sWorldSessionMgr->SendGlobalMessage(worldstate.Write());
1781 }
1782 }
1783 }
1784}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
BattlegroundTypeId
Definition SharedDefines.h:3735
@ BATTLEGROUND_TYPE_NONE
Definition SharedDefines.h:3736
#define sWorldSessionMgr
Definition WorldSessionMgr.h:118
static BattlegroundTypeId WeekendHolidayIdToBGType(HolidayIds holiday)
Definition BattlegroundMgr.cpp:888
Definition WorldStatePackets.h:50
int32 Value
Definition WorldStatePackets.h:57
WorldPacket const * Write() override
Definition WorldStatePackets.cpp:40
int32 VariableID
Definition WorldStatePackets.h:56
Definition DBCStructure.h:604
uint32 HolidayWorldStateId
Definition DBCStructure.h:612

References _gameEvent, BATTLEGROUND_TYPE_NONE, HOLIDAY_NONE, BattlemasterListEntry::HolidayWorldStateId, sBattlemasterListStore, sWorldSessionMgr, WorldPackets::WorldState::UpdateWorldState::Value, WorldPackets::WorldState::UpdateWorldState::VariableID, BattlegroundMgr::WeekendHolidayIdToBGType(), and WorldPackets::WorldState::UpdateWorldState::Write().

Referenced by ApplyNewEvent(), and UnApplyEvent().

Member Data Documentation

◆ _activeEvents

◆ _gameEvent

◆ _gameEventBattlegroundHolidays

GameEventBitmask GameEventMgr::_gameEventBattlegroundHolidays
private

◆ _gameEventCreatureQuests

GameEventQuestMap GameEventMgr::_gameEventCreatureQuests
private

◆ _gameEventGameObjectQuests

GameEventQuestMap GameEventMgr::_gameEventGameObjectQuests
private

◆ _gameEventModelEquip

GameEventModelEquipMap GameEventMgr::_gameEventModelEquip
private

◆ _gameEventNPCFlags

GameEventNPCFlagMap GameEventMgr::_gameEventNPCFlags
private

◆ _gameEventPoolIds

GameEventIdMap GameEventMgr::_gameEventPoolIds
private

◆ _gameEventSeasonalQuestsMap

GameEventSeasonalQuestsMap GameEventMgr::_gameEventSeasonalQuestsMap
private

◆ _gameEventVendors

GameEventNPCVendorMap GameEventMgr::_gameEventVendors
private

◆ _holidayMainStages

HolidayMainStageMap GameEventMgr::_holidayMainStages
private

Referenced by GetHolidayMainStage(), and LoadEvents().

◆ _isSystemInit

bool GameEventMgr::_isSystemInit
private

Referenced by StartSystem(), and Update().

◆ _questToEventConditions

QuestIdToEventConditionMap GameEventMgr::_questToEventConditions
private

◆ GameEventCreatureGuids

◆ GameEventGameobjectGuids

◆ ModifiedHolidays

std::vector<uint32> GameEventMgr::ModifiedHolidays

Referenced by LoadHolidayDates().


The documentation for this class was generated from the following files: