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
 

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
 

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
 

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

◆ 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
1771 : _isSystemInit(false)
1772{
1773}
bool _isSystemInit
Definition GameEventMgr.h:193

◆ ~GameEventMgr()

GameEventMgr::~GameEventMgr ( )
privatedefault

Member Function Documentation

◆ AddActiveEvent()

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

References _activeEvents.

Referenced by StartEvent().

◆ ApplyNewEvent()

void GameEventMgr::ApplyNewEvent ( uint16  eventId)
private

Run SAI scripts with SMART_EVENT_GAME_EVENT_START

1345{
1346 uint8 announce = _gameEvent[eventId].Announce;
1347 if (announce == 1 || (announce == 2 && sWorld->getIntConfig(CONFIG_EVENT_ANNOUNCE)))
1348 ChatHandler(nullptr).SendWorldText(LANG_EVENTMESSAGE, _gameEvent[eventId].Description);
1349
1350 LOG_DEBUG("gameevent", "GameEvent {} \"{}\" started.", eventId, _gameEvent[eventId].Description);
1351
1352 // spawn positive event tagget objects
1353 GameEventSpawn(eventId);
1354 // un-spawn negative event tagged objects
1355 int16 numEventId = (-1) * eventId;
1356 GameEventUnspawn(numEventId);
1357 // Change equipement or model
1358 ChangeEquipOrModel(eventId, true);
1359 // Add quests that are events only to non event npc
1360 UpdateEventQuests(eventId, true);
1361 UpdateWorldStates(eventId, true);
1362 // update npcflags in this event
1363 UpdateEventNPCFlags(eventId);
1364 // add vendor items
1365 UpdateEventNPCVendor(eventId, true);
1366 // update bg holiday
1368
1370 RunSmartAIScripts(eventId, true);
1371
1372 // If event's worldstate is 0, it means the event hasn't been started yet. In that case, reset seasonal quests.
1373 // 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.
1374 if (sWorldState->getWorldState(eventId) == 0)
1375 {
1376 sWorld->ResetEventSeasonalQuests(eventId);
1377 }
1378}
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:238
#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:1751
void UpdateEventQuests(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1696
void GameEventSpawn(int16 eventId)
Definition GameEventMgr.cpp:1434
void GameEventUnspawn(int16 eventId)
Definition GameEventMgr.cpp:1507
GameEventDataMap _gameEvent
Definition GameEventMgr.h:188
void UpdateEventNPCVendor(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1423
void UpdateBattlegroundSettings()
Definition GameEventMgr.cpp:1415
void UpdateEventNPCFlags(uint16 eventId)
Definition GameEventMgr.cpp:1380
void RunSmartAIScripts(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1902
void ChangeEquipOrModel(int16 eventId, bool activate)
Definition GameEventMgr.cpp:1583
#define sWorld
Definition World.h:317

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
1584{
1585 for (ModelEquipList::iterator itr = _gameEventModelEquip[eventId].begin(); itr != _gameEventModelEquip[eventId].end(); ++itr)
1586 {
1587 // Remove the creature from grid
1588 CreatureData const* data = sObjectMgr->GetCreatureData(itr->first);
1589 if (!data)
1590 continue;
1591
1592 // Update if spawned
1593 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr, activate](Map* map)
1594 {
1595 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(itr->first);
1596 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second; ++itr2)
1597 {
1598 Creature* creature = itr2->second;
1599 if (activate)
1600 {
1601 itr->second.EquipementIdPrev = creature->GetCurrentEquipmentId();
1602 itr->second.ModelIdPrev = creature->GetDisplayId();
1603 creature->LoadEquipment(itr->second.EquipmentId, true);
1604 if (itr->second.ModelId > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelId))
1605 {
1606 creature->SetDisplayId(itr->second.ModelId);
1607 creature->SetNativeDisplayId(itr->second.ModelId);
1608 }
1609 }
1610 else
1611 {
1612 creature->LoadEquipment(itr->second.EquipementIdPrev, true);
1613 if (itr->second.ModelIdPrev > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelIdPrev))
1614 {
1615 creature->SetDisplayId(itr->second.ModelIdPrev);
1616 creature->SetNativeDisplayId(itr->second.ModelIdPrev);
1617 }
1618 }
1619 }
1620 });
1621
1622 // now last step: put in data
1623 // just to have write access to it
1624 CreatureData& data2 = sObjectMgr->NewOrExistCreatureData(itr->first);
1625 if (activate)
1626 {
1627 itr->second.ModelIdPrev = data2.displayid;
1628 itr->second.EquipementIdPrev = data2.equipmentId;
1629 data2.displayid = itr->second.ModelId;
1630 data2.equipmentId = itr->second.EquipmentId;
1631 }
1632 else
1633 {
1634 data2.displayid = itr->second.ModelIdPrev;
1635 data2.equipmentId = itr->second.EquipementIdPrev;
1636 }
1637 }
1638}
#define sMapMgr
Definition MapMgr.h:220
#define sObjectMgr
Definition ObjectMgr.h:1732
GameEventModelEquipMap _gameEventModelEquip
Definition GameEventMgr.h:186
Definition Map.h:166
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.

1831{
1832 for (GameEventConditionMap::const_iterator itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1833 if (itr->second.Done < itr->second.ReqNum)
1834 // return false if a condition doesn't match
1835 return false;
1836 // set the phase
1837 _gameEvent[eventId].State = GAMEEVENT_WORLD_NEXTPHASE;
1838 // set the followup events' start time
1839 if (!_gameEvent[eventId].NextStart)
1840 {
1841 time_t currenttime = GameTime::GetGameTime().count();
1842 _gameEvent[eventId].NextStart = currenttime + _gameEvent[eventId].Length * 60;
1843 }
1844 return true;
1845}

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

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

◆ GameEventSpawn()

void GameEventMgr::GameEventSpawn ( int16  eventId)
private
1435{
1436 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1437
1438 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1439 {
1440 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element {} (size: {})",
1441 internal_event_id, GameEventCreatureGuids.size());
1442 return;
1443 }
1444
1445 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1446 {
1447 // Add to correct cell
1448 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1449 {
1450 sObjectMgr->AddCreatureToGrid(*itr, data);
1451
1452 // Spawn if necessary (loaded grids only)
1453 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1454 // We use spawn coords to spawn
1455 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1456 {
1457 Creature* creature = new Creature;
1458 if (!creature->LoadCreatureFromDB(*itr, map))
1459 delete creature;
1460 }
1461 }
1462 }
1463
1464 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1465 {
1466 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element {} (size: {})",
1467 internal_event_id, GameEventGameobjectGuids.size());
1468 return;
1469 }
1470
1471 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1472 {
1473 // Add to correct cell
1474 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1475 {
1476 sObjectMgr->AddGameobjectToGrid(*itr, data);
1477 // Spawn if necessary (loaded grids only)
1478 // this base map checked as non-instanced and then only existed
1479 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1480 // We use current coords to unspawn, not spawn coords since creature can have changed grid
1481 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1482 {
1483 GameObject* pGameobject = sObjectMgr->IsGameObjectStaticTransport(data->id) ? new StaticTransport() : new GameObject();
1484 //TODO: find out when it is add to map
1485 if (!pGameobject->LoadGameObjectFromDB(*itr, map, false))
1486 delete pGameobject;
1487 else
1488 {
1489 if (pGameobject->isSpawnedByDefault())
1490 map->AddToMap(pGameobject);
1491 }
1492 }
1493 }
1494 }
1495
1496 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1497 {
1498 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range _gameEventPoolIds element {} (size: {})",
1499 internal_event_id, _gameEventPoolIds.size());
1500 return;
1501 }
1502
1503 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1504 sPoolMgr->SpawnPool(*itr);
1505}
std::int32_t int32
Definition Define.h:103
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define sPoolMgr
Definition PoolMgr.h:177
Definition Creature.h:47
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1677
GameEventGuidMap GameEventCreatureGuids
Definition GameEventMgr.h:196
GameEventGuidMap GameEventGameobjectGuids
Definition GameEventMgr.h:197
GameEventIdMap _gameEventPoolIds
Definition GameEventMgr.h:187
Definition GameObject.h:120
bool isSpawnedByDefault() const
Definition GameObject.h:196
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1099
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:203
bool Instanceable() const
Definition Map.h:296
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:304
Definition Transport.h:115
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
1508{
1509 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1510
1511 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1512 {
1513 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventCreatureGuids element {} (size: {})",
1514 internal_event_id, GameEventCreatureGuids.size());
1515 return;
1516 }
1517
1518 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1519 {
1520 // check if it's needed by another event, if so, don't remove
1521 if (eventId > 0 && HasCreatureActiveEventExcept(*itr, eventId))
1522 continue;
1523
1524 // Remove the creature from grid
1525 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1526 {
1527 sObjectMgr->RemoveCreatureFromGrid(*itr, data);
1528
1529 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1530 {
1531 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(*itr);
1532 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second;)
1533 {
1534 Creature* creature = itr2->second;
1535 ++itr2;
1536 creature->AddObjectToRemoveList();
1537 }
1538 });
1539 }
1540 }
1541
1542 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1543 {
1544 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventGameobjectGuids element {} (size: {})",
1545 internal_event_id, GameEventGameobjectGuids.size());
1546 return;
1547 }
1548
1549 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1550 {
1551 // check if it's needed by another event, if so, don't remove
1552 if (eventId > 0 && HasGameObjectActiveEventExcept(*itr, eventId))
1553 continue;
1554 // Remove the gameobject from grid
1555 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1556 {
1557 sObjectMgr->RemoveGameobjectFromGrid(*itr, data);
1558
1559 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1560 {
1561 auto gameobjectBounds = map->GetGameObjectBySpawnIdStore().equal_range(*itr);
1562 for (auto itr2 = gameobjectBounds.first; itr2 != gameobjectBounds.second;)
1563 {
1564 GameObject* go = itr2->second;
1565 ++itr2;
1566 go->AddObjectToRemoveList();
1567 }
1568 });
1569 }
1570 }
1571 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1572 {
1573 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element {} (size: {})", internal_event_id, _gameEventPoolIds.size());
1574 return;
1575 }
1576
1577 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1578 {
1579 sPoolMgr->DespawnPool(*itr);
1580 }
1581}
bool HasGameObjectActiveEventExcept(ObjectGuid::LowType go_guid, uint16 eventId)
Definition GameEventMgr.cpp:1681
bool HasCreatureActiveEventExcept(ObjectGuid::LowType creature_guid, uint16 eventId)
Definition GameEventMgr.cpp:1667

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
2007{
2008 auto const& events = GetEventMap();
2009
2010 for (auto const& eventEntry : events)
2011 {
2012 if (eventEntry.HolidayId == holidayId)
2013 {
2014 return eventEntry.EventId;
2015 }
2016 }
2017
2018 return 0;
2019}
events
Definition boss_sartura.cpp:43
GameEventDataMap const & GetEventMap() const
Definition GameEventMgr.h:109

References GetEventMap().

◆ GetNPCFlag()

uint32 GameEventMgr::GetNPCFlag ( Creature cr)
1195{
1196 uint32 mask = 0;
1197 ObjectGuid::LowType spawnId = cr->GetSpawnId();
1198
1199 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1200 {
1201 for (NPCFlagList::iterator itr = _gameEventNPCFlags[*e_itr].begin(); itr != _gameEventNPCFlags[*e_itr].end(); ++ itr)
1202 if (itr->first == spawnId)
1203 mask |= itr->second;
1204 }
1205
1206 return mask;
1207}
std::uint32_t uint32
Definition Define.h:107
ObjectGuid::LowType GetSpawnId() const
Definition Creature.h:69
GameEventNPCFlagMap _gameEventNPCFlags
Definition GameEventMgr.h:191
uint32 LowType
Definition ObjectGuid.h:122

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

Referenced by UpdateEventNPCFlags().

◆ HandleQuestComplete()

void GameEventMgr::HandleQuestComplete ( uint32  quest_id)
1776{
1777 // translate the quest to event and condition
1778 QuestIdToEventConditionMap::iterator itr = _questToEventConditions.find(quest_id);
1779 // quest is registered
1780 if (itr != _questToEventConditions.end())
1781 {
1782 uint16 eventId = itr->second.EventId;
1783 uint32 condition = itr->second.Condition;
1784 float num = itr->second.Num;
1785
1786 // the event is not active, so return, don't increase condition finishes
1787 if (!IsActiveEvent(eventId))
1788 return;
1789 // not in correct phase, return
1790 if (_gameEvent[eventId].State != GAMEEVENT_WORLD_CONDITIONS)
1791 return;
1792 GameEventConditionMap::iterator citr = _gameEvent[eventId].Conditions.find(condition);
1793 // condition is registered
1794 if (citr != _gameEvent[eventId].Conditions.end())
1795 {
1796 // increase the done count, only if less then the req
1797 if (citr->second.Done < citr->second.ReqNum)
1798 {
1799 citr->second.Done += num;
1800 // check max limit
1801 if (citr->second.Done > citr->second.ReqNum)
1802 citr->second.Done = citr->second.ReqNum;
1803 // save the change to db
1804 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1805
1807 stmt->SetData(0, uint8(eventId));
1808 stmt->SetData(1, condition);
1809 trans->Append(stmt);
1810
1811 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_CONDITION_SAVE);
1812 stmt->SetData(0, uint8(eventId));
1813 stmt->SetData(1, condition);
1814 stmt->SetData(2, citr->second.Done);
1815 trans->Append(stmt);
1816 CharacterDatabase.CommitTransaction(trans);
1817 // check if all conditions are met, if so, update the event state
1818 if (CheckOneGameEventConditions(eventId))
1819 {
1820 // changed, save to DB the gameevent state
1821 SaveWorldEventStateToDB(eventId);
1822 // force update events to set timer
1823 sWorld->ForceGameEventUpdate();
1824 }
1825 }
1826 }
1827 }
1828}
@ CHAR_DEL_GAME_EVENT_CONDITION_SAVE
Definition CharacterDatabase.h:219
@ CHAR_INS_GAME_EVENT_CONDITION_SAVE
Definition CharacterDatabase.h:220
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:1830
bool IsActiveEvent(uint16 eventId)
Definition GameEventMgr.h:115
QuestIdToEventConditionMap _questToEventConditions
Definition GameEventMgr.h:190
void SaveWorldEventStateToDB(uint16 eventId)
Definition GameEventMgr.cpp:1847
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
1668{
1669 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1670 {
1671 if ((*e_itr) != eventId)
1672 {
1673 int32 internal_event_id = _gameEvent.size() + (*e_itr) - 1;
1674 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++ itr)
1675 if (*itr == creature_guid)
1676 return true;
1677 }
1678 }
1679 return false;
1680}

References _activeEvents, _gameEvent, and GameEventCreatureGuids.

Referenced by GameEventUnspawn().

◆ HasCreatureQuestActiveEventExcept()

bool GameEventMgr::HasCreatureQuestActiveEventExcept ( uint32  quest_id,
uint16  eventId 
)
private
1641{
1642 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1643 {
1644 if ((*e_itr) != eventId)
1645 for (QuestRelList::iterator itr = _gameEventCreatureQuests[*e_itr].begin();
1646 itr != _gameEventCreatureQuests[*e_itr].end();
1647 ++ itr)
1648 if (itr->second == quest_id)
1649 return true;
1650 }
1651 return false;
1652}
GameEventQuestMap _gameEventCreatureQuests
Definition GameEventMgr.h:183

References _activeEvents, and _gameEventCreatureQuests.

Referenced by UpdateEventQuests().

◆ HasGameObjectActiveEventExcept()

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

References _activeEvents, _gameEvent, and GameEventGameobjectGuids.

◆ HasGameObjectQuestActiveEventExcept()

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

References _activeEvents, and _gameEventGameObjectQuests.

Referenced by UpdateEventQuests().

◆ Initialize()

void GameEventMgr::Initialize ( )
1210{
1211 QueryResult result = WorldDatabase.Query("SELECT MAX(eventEntry) FROM game_event");
1212 if (result)
1213 {
1214 Field* fields = result->Fetch();
1215
1216 uint32 maxEventId = fields[0].Get<uint8>();
1217
1218 // Id starts with 1 and vector with 0, thus increment
1219 maxEventId++;
1220
1221 _gameEvent.resize(maxEventId);
1222 GameEventCreatureGuids.resize(maxEventId * 2 - 1);
1223 GameEventGameobjectGuids.resize(maxEventId * 2 - 1);
1224 _gameEventCreatureQuests.resize(maxEventId);
1225 _gameEventGameObjectQuests.resize(maxEventId);
1226 _gameEventVendors.resize(maxEventId);
1227 _gameEventBattlegroundHolidays.resize(maxEventId, 0);
1228 _gameEventPoolIds.resize(maxEventId * 2 - 1);
1229 _gameEventNPCFlags.resize(maxEventId);
1230 _gameEventModelEquip.resize(maxEventId);
1231 }
1232}
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:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
GameEventBitmask _gameEventBattlegroundHolidays
Definition GameEventMgr.h:189
GameEventNPCVendorMap _gameEventVendors
Definition GameEventMgr.h:185

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
962{
963 LOG_INFO("server.loading", "Loading Game Event Battleground Data...");
964
965 uint32 oldMSTime = getMSTime();
966
968 PreparedQueryResult result = WorldDatabase.Query(stmt);
969
970 if (!result)
971 {
972 LOG_WARN("server.loading", ">> Loaded 0 Battleground Holidays In Game Events. DB table `game_event_battleground_holiday` is empty.");
973 LOG_INFO("server.loading", " ");
974 }
975 else
976 {
977 uint32 count = 0;
978 do
979 {
980 Field* fields = result->Fetch();
981
982 uint16 eventId = fields[0].Get<uint8>();
983
984 if (eventId >= _gameEvent.size())
985 {
986 LOG_ERROR("sql.sql", "`game_event_battleground_holiday` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
987 continue;
988 }
989
990 _gameEventBattlegroundHolidays[eventId] = fields[1].Get<uint32>();
991
992 ++count;
993 } while (result->NextRow());
994
995 LOG_INFO("server.loading", ">> Loaded {} Battleground Holidays In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
996 LOG_INFO("server.loading", " ");
997 }
998}
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:105

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
782{
783 LOG_INFO("server.loading", "Loading Game Event Condition Data...");
784
785 uint32 oldMSTime = getMSTime();
786
788 PreparedQueryResult result = WorldDatabase.Query(stmt);
789
790 if (!result)
791 {
792 LOG_WARN("server.loading", ">> Loaded 0 Conditions In Game Events. DB table `game_event_condition` Is Empty.");
793 LOG_INFO("server.loading", " ");
794 }
795 else
796 {
797 uint32 count = 0;
798 do
799 {
800 Field* fields = result->Fetch();
801
802 uint16 eventId = fields[0].Get<uint8>();
803 uint32 condition = fields[1].Get<uint32>();
804
805 if (eventId >= _gameEvent.size())
806 {
807 LOG_ERROR("sql.sql", "`game_event_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
808 continue;
809 }
810
811 _gameEvent[eventId].Conditions[condition].ReqNum = fields[2].Get<float>();
812 _gameEvent[eventId].Conditions[condition].Done = 0;
813 _gameEvent[eventId].Conditions[condition].MaxWorldState = fields[3].Get<uint16>();
814 _gameEvent[eventId].Conditions[condition].DoneWorldState = fields[4].Get<uint16>();
815
816 ++count;
817 } while (result->NextRow());
818
819 LOG_INFO("server.loading", ">> Loaded {} conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
820 LOG_INFO("server.loading", " ");
821 }
822}
@ WORLD_SEL_GAME_EVENT_CONDITION_DATA
Definition WorldDatabase.h:102

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
825{
826 LOG_INFO("server.loading", "Loading Game Event Condition Save Data...");
827
828 uint32 oldMSTime = getMSTime();
829
831 PreparedQueryResult result = CharacterDatabase.Query(stmt);
832
833 if (!result)
834 {
835 LOG_WARN("server.loading", ">> Loaded 0 Condition Saves In Game Events. DB Table `game_event_condition_save` Is Empty.");
836 LOG_INFO("server.loading", " ");
837 }
838 else
839 {
840 uint32 count = 0;
841 do
842 {
843 Field* fields = result->Fetch();
844
845 uint16 eventId = fields[0].Get<uint8>();
846 uint32 condition = fields[1].Get<uint32>();
847
848 if (eventId >= _gameEvent.size())
849 {
850 LOG_ERROR("sql.sql", "`game_event_condition_save` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
851 continue;
852 }
853
854 GameEventConditionMap::iterator itr = _gameEvent[eventId].Conditions.find(condition);
855 if (itr != _gameEvent[eventId].Conditions.end())
856 {
857 itr->second.Done = fields[2].Get<float>();
858 }
859 else
860 {
861 LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition evt id {} cond id {}", eventId, condition);
862 continue;
863 }
864
865 ++count;
866 } while (result->NextRow());
867
868 LOG_INFO("server.loading", ">> Loaded {} Condition Saves In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
869 LOG_INFO("server.loading", " ");
870 }
871}
@ CHAR_SEL_GAME_EVENT_CONDITION_SAVE_DATA
Definition CharacterDatabase.h:221

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
495{
496 LOG_INFO("server.loading", "Loading Game Event Creature Data...");
497
498 uint32 oldMSTime = getMSTime();
499
501 PreparedQueryResult result = WorldDatabase.Query(stmt);
502
503 if (!result)
504 {
505 LOG_WARN("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty");
506 LOG_INFO("server.loading", " ");
507 }
508 else
509 {
510 uint32 count = 0;
511 do
512 {
513 Field* fields = result->Fetch();
514
515 ObjectGuid::LowType guid = fields[0].Get<uint32>();
516 int16 eventId = fields[1].Get<int16>();
517
518 CreatureData const* data = sObjectMgr->GetCreatureData(guid);
519 if (!data)
520 {
521 LOG_ERROR("sql.sql", "`game_event_creature` contains creature (GUID: {}) not found in `creature` table.", guid);
522 continue;
523 }
524
525 int32 internal_event_id = _gameEvent.size() + eventId - 1;
526
527 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
528 {
529 LOG_ERROR("sql.sql", "`game_event_creature` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
530 continue;
531 }
532
533 GuidLowList& crelist = GameEventCreatureGuids[internal_event_id];
534 crelist.push_back(guid);
535
536 ++count;
537 } while (result->NextRow());
538
539 LOG_INFO("server.loading", ">> Loaded {} Creatures In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
540 LOG_INFO("server.loading", " ");
541 }
542}
@ WORLD_SEL_GAME_EVENT_CREATURE_DATA
Definition WorldDatabase.h:96
std::list< ObjectGuid::LowType > GuidLowList
Definition GameEventMgr.h:165

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
545{
546 LOG_INFO("server.loading", "Loading Game Event GO Data...");
547
548 uint32 oldMSTime = getMSTime();
549
551 PreparedQueryResult result = WorldDatabase.Query(stmt);
552
553 if (!result)
554 {
555 LOG_WARN("server.loading", ">> Loaded 0 gameobjects in game events. DB table `game_event_gameobject` is empty.");
556 LOG_INFO("server.loading", " ");
557 }
558 else
559 {
560 uint32 count = 0;
561 do
562 {
563 Field* fields = result->Fetch();
564
565 ObjectGuid::LowType guid = fields[0].Get<uint32>();
566 int16 eventId = fields[1].Get<int16>();
567
568 int32 internal_event_id = _gameEvent.size() + eventId - 1;
569
570 GameObjectData const* data = sObjectMgr->GetGameObjectData(guid);
571 if (!data)
572 {
573 LOG_ERROR("sql.sql", "`game_event_gameobject` contains gameobject (GUID: {}) not found in `gameobject` table.", guid);
574 continue;
575 }
576
577 if (internal_event_id < 0 || internal_event_id >= int32(GameEventGameobjectGuids.size()))
578 {
579 LOG_ERROR("sql.sql", "`game_event_gameobject` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
580 continue;
581 }
582
583 GuidLowList& golist = GameEventGameobjectGuids[internal_event_id];
584 golist.push_back(guid);
585
586 ++count;
587 } while (result->NextRow());
588
589 LOG_INFO("server.loading", ">> Loaded {} Gameobjects In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
590 LOG_INFO("server.loading", " ");
591 }
592}
@ WORLD_SEL_GAME_EVENT_GAMEOBJECT_DATA
Definition WorldDatabase.h:97

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
696{
697 LOG_INFO("server.loading", "Loading Game Event GO Quest Data...");
698
699 uint32 oldMSTime = getMSTime();
700
702 PreparedQueryResult result = WorldDatabase.Query(stmt);
703
704 if (!result)
705 {
706 LOG_WARN("server.loading", ">> Loaded 0 go Quests Additions In Game Events. DB Table `game_event_gameobject_quest` Is Empty.");
707 LOG_INFO("server.loading", " ");
708 }
709 else
710 {
711 uint32 count = 0;
712 do
713 {
714 Field* fields = result->Fetch();
715
716 uint32 id = fields[0].Get<uint32>();
717 uint32 quest = fields[1].Get<uint32>();
718 uint16 eventId = fields[2].Get<uint8>();
719
720 if (eventId >= _gameEventGameObjectQuests.size())
721 {
722 LOG_ERROR("sql.sql", "`game_event_gameobject_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
723 continue;
724 }
725
726 QuestRelList& questlist = _gameEventGameObjectQuests[eventId];
727 questlist.push_back(QuestRelation(id, quest));
728
729 ++count;
730 } while (result->NextRow());
731
732 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
733 LOG_INFO("server.loading", " ");
734 }
735}
@ WORLD_SEL_GAME_EVENT_GAMEOBJECT_QUEST_DATA
Definition WorldDatabase.h:100
std::list< QuestRelation > QuestRelList
Definition GameEventMgr.h:173
std::pair< uint32, uint32 > QuestRelation
Definition GameEventMgr.h:172

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
595{
596 LOG_INFO("server.loading", "Loading Game Event Model/Equipment Change Data...");
597
598 uint32 oldMSTime = getMSTime();
599
601 PreparedQueryResult result = WorldDatabase.Query(stmt);
602
603 if (!result)
604 {
605 LOG_WARN("server.loading", ">> Loaded 0 Model/Equipment Changes In Game Events. DB Table `game_event_model_equip` Is Empty.");
606 LOG_INFO("server.loading", " ");
607 }
608 else
609 {
610 uint32 count = 0;
611 do
612 {
613 Field* fields = result->Fetch();
614
615 ObjectGuid::LowType guid = fields[0].Get<uint32>();
616 uint32 entry = fields[1].Get<uint32>();
617 uint16 eventId = fields[2].Get<uint8>();
618
619 if (eventId >= _gameEventModelEquip.size())
620 {
621 LOG_ERROR("sql.sql", "`game_event_model_equip` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
622 continue;
623 }
624
625 ModelEquipList& equiplist = _gameEventModelEquip[eventId];
626 ModelEquip newModelEquipSet;
627 newModelEquipSet.ModelId = fields[3].Get<uint32>();
628 newModelEquipSet.EquipmentId = fields[4].Get<uint8>();
629 newModelEquipSet.EquipementIdPrev = 0;
630 newModelEquipSet.ModelIdPrev = 0;
631
632 if (newModelEquipSet.EquipmentId > 0)
633 {
634 int8 equipId = static_cast<int8>(newModelEquipSet.EquipmentId);
635 if (!sObjectMgr->GetEquipmentInfo(entry, equipId))
636 {
637 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.",
638 guid, newModelEquipSet.EquipmentId);
639 continue;
640 }
641 }
642
643 equiplist.push_back(std::pair<ObjectGuid::LowType, ModelEquip>(guid, newModelEquipSet));
644
645 ++count;
646 } while (result->NextRow());
647
648 LOG_INFO("server.loading", ">> Loaded {} Model/Equipment Changes In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
649 LOG_INFO("server.loading", " ");
650 }
651}
std::int8_t int8
Definition Define.h:105
@ WORLD_SEL_GAME_EVENT_MODEL_EQUIPMENT_DATA
Definition WorldDatabase.h:98
std::list< ModelEquipPair > ModelEquipList
Definition GameEventMgr.h:170
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
874{
875 LOG_INFO("server.loading", "Loading Game Event NPCflag Data...");
876
877 uint32 oldMSTime = getMSTime();
878
880 PreparedQueryResult result = WorldDatabase.Query(stmt);
881
882 if (!result)
883 {
884 LOG_WARN("server.loading", ">> Loaded 0 Npcflags In Game Events. DB Table `game_event_npcflag` Is Empty.");
885 LOG_INFO("server.loading", " ");
886 }
887 else
888 {
889 uint32 count = 0;
890 do
891 {
892 Field* fields = result->Fetch();
893
894 ObjectGuid::LowType guid = fields[0].Get<uint32>();
895 uint16 eventId = fields[1].Get<uint8>();
896 uint32 npcflag = fields[2].Get<uint32>();
897
898 if (eventId >= _gameEvent.size())
899 {
900 LOG_ERROR("sql.sql", "`game_event_npcflag` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
901 continue;
902 }
903
904 _gameEventNPCFlags[eventId].push_back(GuidNPCFlagPair(guid, npcflag));
905
906 ++count;
907 } while (result->NextRow());
908
909 LOG_INFO("server.loading", ">> Loaded {} Npcflags In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
910 LOG_INFO("server.loading", " ");
911 }
912}
@ WORLD_SEL_GAME_EVENT_NPC_FLAGS
Definition WorldDatabase.h:103
std::pair< ObjectGuid::LowType, uint32 > GuidNPCFlagPair
Definition GameEventMgr.h:178

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
1001{
1002 LOG_INFO("server.loading", "Loading Game Event Pool Data...");
1003
1004 uint32 oldMSTime = getMSTime();
1005
1007 PreparedQueryResult result = WorldDatabase.Query(stmt);
1008
1009 if (!result)
1010 {
1011 LOG_WARN("server.loading", ">> Loaded 0 Pools For Game Events. DB Table `game_event_pool` Is Empty.");
1012 LOG_INFO("server.loading", " ");
1013 }
1014 else
1015 {
1016 uint32 count = 0;
1017 do
1018 {
1019 Field* fields = result->Fetch();
1020
1021 uint32 entry = fields[0].Get<uint32>();
1022 int16 eventId = fields[1].Get<int16>();
1023
1024 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1025
1026 if (internal_event_id < 0 || internal_event_id >= int32(_gameEventPoolIds.size()))
1027 {
1028 LOG_ERROR("sql.sql", "`game_event_pool` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
1029 continue;
1030 }
1031
1032 if (!sPoolMgr->CheckPool(entry))
1033 {
1034 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);
1035 continue;
1036 }
1037
1038 IdList& poollist = _gameEventPoolIds[internal_event_id];
1039 poollist.push_back(entry);
1040
1041 ++count;
1042 } while (result->NextRow());
1043
1044 LOG_INFO("server.loading", ">> Loaded {} Pools For Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1045 LOG_INFO("server.loading", " ");
1046 }
1047}
@ WORLD_SEL_GAME_EVENT_POOL_DATA
Definition WorldDatabase.h:106
std::list< uint32 > IdList
Definition GameEventMgr.h:166

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
442{
443 LOG_INFO("server.loading", "Loading Game Event Prerequisite Data...");
444
445 uint32 oldMSTime = getMSTime();
446
448 PreparedQueryResult result = WorldDatabase.Query(stmt);
449
450 if (!result)
451 {
452 LOG_WARN("server.loading", ">> Loaded 0 Game Rvent Prerequisites in Game Events. DB Table `game_event_prerequisite` Is Empty.");
453 LOG_INFO("server.loading", " ");
454 }
455 else
456 {
457 uint32 count = 0;
458 do
459 {
460 Field* fields = result->Fetch();
461
462 uint16 eventId = fields[0].Get<uint8>();
463
464 if (eventId >= _gameEvent.size())
465 {
466 LOG_ERROR("sql.sql", "`game_event_prerequisite` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
467 continue;
468 }
469
470 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
471 {
472 uint16 prerequisite_event = fields[1].Get<uint32>();
473 if (prerequisite_event >= _gameEvent.size())
474 {
475 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);
476 continue;
477 }
478 _gameEvent[eventId].PrerequisiteEvents.insert(prerequisite_event);
479 }
480 else
481 {
482 LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id {}", eventId);
483 continue;
484 }
485
486 ++count;
487 } while (result->NextRow());
488
489 LOG_INFO("server.loading", ">> Loaded {} game event prerequisites in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
490 LOG_INFO("server.loading", " ");
491 }
492}
@ WORLD_SEL_GAME_EVENT_PREREQUISITE_DATA
Definition WorldDatabase.h:95

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
738{
739 LOG_INFO("server.loading", "Loading Game Event Quest Condition Data...");
740
741 uint32 oldMSTime = getMSTime();
742
744 PreparedQueryResult result = WorldDatabase.Query(stmt);
745
746 if (!result)
747 {
748 LOG_WARN("server.loading", ">> Loaded 0 quest event Conditions In Game Events. DB Table `game_event_quest_condition` Is Empty.");
749 LOG_INFO("server.loading", " ");
750 }
751 else
752 {
753 uint32 count = 0;
754 do
755 {
756 Field* fields = result->Fetch();
757
758 uint32 quest = fields[0].Get<uint32>();
759 uint16 eventId = fields[1].Get<uint8>();
760 uint32 condition = fields[2].Get<uint32>();
761 float num = fields[3].Get<float>();
762
763 if (eventId >= _gameEvent.size())
764 {
765 LOG_ERROR("sql.sql", "`game_event_quest_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
766 continue;
767 }
768
769 _questToEventConditions[quest].EventId = eventId;
770 _questToEventConditions[quest].Condition = condition;
771 _questToEventConditions[quest].Num = num;
772
773 ++count;
774 } while (result->NextRow());
775
776 LOG_INFO("server.loading", ">> Loaded {} quest event conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
777 LOG_INFO("server.loading", " ");
778 }
779}
@ WORLD_SEL_GAME_EVENT_QUEST_CONDITION_DATA
Definition WorldDatabase.h:101

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
654{
655 LOG_INFO("server.loading", "Loading Game Event Quest Data...");
656
657 uint32 oldMSTime = getMSTime();
658
660 PreparedQueryResult result = WorldDatabase.Query(stmt);
661
662 if (!result)
663 {
664 LOG_WARN("server.loading", ">> Loaded 0 Quests Additions In Game Events. DB Table `game_event_creature_quest` Is Empty.");
665 LOG_INFO("server.loading", " ");
666 }
667 else
668 {
669 uint32 count = 0;
670 do
671 {
672 Field* fields = result->Fetch();
673
674 uint32 id = fields[0].Get<uint32>();
675 uint32 quest = fields[1].Get<uint32>();
676 uint16 eventId = fields[2].Get<uint8>();
677
678 if (eventId >= _gameEventCreatureQuests.size())
679 {
680 LOG_ERROR("sql.sql", "`game_event_creature_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
681 continue;
682 }
683
684 QuestRelList& questlist = _gameEventCreatureQuests[eventId];
685 questlist.push_back(QuestRelation(id, quest));
686
687 ++count;
688 } while (result->NextRow());
689
690 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
691 LOG_INFO("server.loading", " ");
692 }
693}
@ WORLD_SEL_GAME_EVENT_QUEST_DATA
Definition WorldDatabase.h:99

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();
332 PreparedQueryResult result = WorldDatabase.Query(stmt);
333
334 if (!result)
335 {
336 _gameEvent.clear();
337 LOG_WARN("server.loading", ">> Loaded 0 game events. DB table `game_event` is empty.");
338 LOG_INFO("server.loading", " ");
339 return;
340 }
341
342 uint32 count = 0;
343 do
344 {
345 Field* fields = result->Fetch();
346
347 uint8 eventId = fields[0].Get<uint8>();
348 if (eventId == 0)
349 {
350 LOG_ERROR("sql.sql", "`game_event` game event entry 0 is reserved and can't be used.");
351 continue;
352 }
353
354 GameEventData& pGameEvent = _gameEvent[eventId];
355 pGameEvent.EventId = fields[0].Get<uint32>();
356 uint64 starttime = fields[1].Get<uint64>();
357 pGameEvent.Start = time_t(starttime);
358 uint64 endtime = fields[2].Get<uint64>();
359 if (fields[2].IsNull())
360 endtime = GameTime::GetGameTime().count() + 63072000; // add 2 years to current date
361 pGameEvent.End = time_t(endtime);
362 pGameEvent.Occurence = fields[3].Get<uint64>();
363 pGameEvent.Length = fields[4].Get<uint64>();
364 pGameEvent.HolidayId = HolidayIds(fields[5].Get<uint32>());
365 pGameEvent.HolidayStage = fields[6].Get<uint8>();
366 pGameEvent.Description = fields[7].Get<std::string>();
367 pGameEvent.State = (GameEventState)(fields[8].Get<uint8>());
368 pGameEvent.Announce = fields[9].Get<uint8>();
369 pGameEvent.NextStart = 0;
370
371 ++count;
372
373 if (pGameEvent.Length == 0 && pGameEvent.State == GAMEEVENT_NORMAL) // length>0 is validity check
374 {
375 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);
376 continue;
377 }
378
379 if (pGameEvent.HolidayId != HOLIDAY_NONE)
380 {
381 if (!sHolidaysStore.LookupEntry(pGameEvent.HolidayId))
382 {
383 LOG_ERROR("sql.sql", "`game_event` game event id ({}) have not existed holiday id {}.", eventId, pGameEvent.HolidayId);
384 pGameEvent.HolidayId = HOLIDAY_NONE;
385 }
386
387 SetHolidayEventTime(pGameEvent);
388 }
389 } while (result->NextRow());
390
391 LOG_INFO("server.loading", ">> Loaded {} Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
392 LOG_INFO("server.loading", " ");
393}
DBCStorage< HolidaysEntry > sHolidaysStore(Holidaysfmt)
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:94
void SetHolidayEventTime(GameEventData &event)
Definition GameEventMgr.cpp:1914
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

References _gameEvent, GameEventData::Announce, GameEventData::Description, 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, GameEventData::NextStart, GameEventData::Occurence, SetHolidayEventTime(), sHolidaysStore, GameEventData::Start, GameEventData::State, WORLD_SEL_GAME_EVENTS, and WorldDatabase.

Referenced by LoadFromDB().

◆ LoadEventSaveData()

void GameEventMgr::LoadEventSaveData ( )
private
396{
397 uint32 oldMSTime = getMSTime();
398 LOG_INFO("server.loading", "Loading Game Event Saves Data...");
400 PreparedQueryResult result = CharacterDatabase.Query(stmt);
401
402 if (!result)
403 {
404 LOG_WARN("server.loading", ">> Loaded 0 Game Event Saves In Game Events. DB Table `game_event_save` Is Empty.");
405 LOG_INFO("server.loading", " ");
406 }
407 else
408 {
409 uint32 count = 0;
410 do
411 {
412 Field* fields = result->Fetch();
413
414 uint8 eventId = fields[0].Get<uint8>();
415
416 if (eventId >= _gameEvent.size())
417 {
418 LOG_ERROR("sql.sql", "`game_event_save` game event entry ({}) is out of range compared to max event entry in `game_event`", eventId);
419 continue;
420 }
421
422 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
423 {
424 _gameEvent[eventId].State = (GameEventState)(fields[1].Get<uint8>());
425 _gameEvent[eventId].NextStart = time_t(fields[2].Get<uint32>());
426 }
427 else
428 {
429 LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id {}", eventId);
430 continue;
431 }
432
433 ++count;
434 } while (result->NextRow());
435
436 LOG_INFO("server.loading", ">> Loaded {} Game Event Saves In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
437 LOG_INFO("server.loading", " ");
438 }
439}
@ CHAR_SEL_GAME_EVENT_SAVE_DATA
Definition CharacterDatabase.h:222

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
915{
916 LOG_INFO("server.loading", "Loading Game Event Seasonal Quest Relations...");
917 uint32 oldMSTime = getMSTime();
918
920 PreparedQueryResult result = WorldDatabase.Query(stmt);
921
922 if (!result)
923 {
924 LOG_WARN("server.loading", ">> Loaded 0 Seasonal Quests Additions In Game Events. DB Table `game_event_seasonal_questrelation` Is Empty.");
925 LOG_INFO("server.loading", " ");
926 }
927 else
928 {
929 uint32 count = 0;
930 do
931 {
932 Field* fields = result->Fetch();
933
934 uint32 questId = fields[0].Get<uint32>();
935 uint32 eventEntry = fields[1].Get<uint32>();
936
937 Quest* questTemplate = const_cast<Quest*>(sObjectMgr->GetQuestTemplate(questId));
938
939 if (!questTemplate)
940 {
941 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` quest id ({}) does not exist in `quest_template`", questId);
942 continue;
943 }
944
945 if (eventEntry >= _gameEvent.size())
946 {
947 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` event id ({}) is out of range compared to max event in `game_event`", eventEntry);
948 continue;
949 }
950
951 questTemplate->SetEventIdForQuest((uint16)eventEntry);
952 _gameEventSeasonalQuestsMap[eventEntry].push_back(questId);
953 ++count;
954 } while (result->NextRow());
955
956 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
957 LOG_INFO("server.loading", " ");
958 }
959}
@ WORLD_SEL_GAME_EVENT_QUEST_SEASONAL_RELATIONS
Definition WorldDatabase.h:104
GameEventSeasonalQuestsMap _gameEventSeasonalQuestsMap
Definition GameEventMgr.h:194
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:2036
@ WORLD_SEL_GAME_EVENT_NPC_VENDOR
Definition WorldDatabase.h:110
std::list< GuidNPCFlagPair > NPCFlagList
Definition GameEventMgr.h:179
std::list< NPCVendorEntry > NPCVendorList
Definition GameEventMgr.h:175
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 ( )
1050{
1051 // The order of these functions matter. Do not change
1052 LoadEvents();
1068}
void LoadEventConditionData()
Definition GameEventMgr.cpp:781
void LoadEventCreatureData()
Definition GameEventMgr.cpp:494
void LoadEventSeasonalQuestRelations()
Definition GameEventMgr.cpp:914
void LoadEventQuestData()
Definition GameEventMgr.cpp:653
void LoadEventPoolData()
Definition GameEventMgr.cpp:1000
void LoadEventGameObjectQuestData()
Definition GameEventMgr.cpp:695
void LoadEventSaveData()
Definition GameEventMgr.cpp:395
void LoadEventNPCFlags()
Definition GameEventMgr.cpp:873
void LoadEventQuestConditionData()
Definition GameEventMgr.cpp:737
void LoadEventModelEquipmentChangeData()
Definition GameEventMgr.cpp:594
void LoadEventPrerequisiteData()
Definition GameEventMgr.cpp:441
void LoadEventVendors()
Definition GameEventMgr.cpp:240
void LoadEventGameObjectData()
Definition GameEventMgr.cpp:544
void LoadEvents()
Definition GameEventMgr.cpp:327
void LoadEventBattlegroundData()
Definition GameEventMgr.cpp:961
void LoadEventConditionSaveData()
Definition GameEventMgr.cpp:824

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

◆ LoadHolidayDates()

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

1903{
1906 sMapMgr->DoForAllMaps([eventId, activate](Map* map)
1907 {
1908 GameEventAIHookWorker worker(eventId, activate);
1910 visitor.Visit(map->GetObjectsStore());
1911 });
1912}
Definition GameEventMgr.cpp:1876
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:352
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
1848{
1849 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1850
1852 stmt->SetData(0, uint8(eventId));
1853 trans->Append(stmt);
1854
1855 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_SAVE);
1856 stmt->SetData(0, uint8(eventId));
1857 stmt->SetData(1, _gameEvent[eventId].State);
1858 stmt->SetData(2, _gameEvent[eventId].NextStart ? uint32(_gameEvent[eventId].NextStart) : 0);
1859 trans->Append(stmt);
1860 CharacterDatabase.CommitTransaction(trans);
1861}
@ CHAR_DEL_GAME_EVENT_SAVE
Definition CharacterDatabase.h:215
@ CHAR_INS_GAME_EVENT_SAVE
Definition CharacterDatabase.h:216

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
1864{
1865 GameEventConditionMap::const_iterator itr;
1866 for (itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1867 {
1868 if (itr->second.DoneWorldState)
1869 player->SendUpdateWorldState(itr->second.DoneWorldState, (uint32)(itr->second.Done));
1870 if (itr->second.MaxWorldState)
1871 player->SendUpdateWorldState(itr->second.MaxWorldState, (uint32)(itr->second.ReqNum));
1872 }
1873}
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition PlayerUpdates.cpp:2240

References _gameEvent, and Player::SendUpdateWorldState().

◆ SetHolidayEventTime()

void GameEventMgr::SetHolidayEventTime ( GameEventData event)
private
1915{
1916 if (!event.HolidayStage) // Ignore holiday
1917 return;
1918
1919 HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(event.HolidayId);
1920
1921 if (!holiday->Date[0] || !holiday->Duration[0]) // Invalid definitions
1922 {
1923 LOG_ERROR("sql.sql", "Missing date or duration for holiday {}.", event.HolidayId);
1924 return;
1925 }
1926
1927 uint8 stageIndex = event.HolidayStage - 1;
1928 event.Length = holiday->Duration[stageIndex] * HOUR / MINUTE;
1929
1930 time_t stageOffset = 0;
1931 for (uint8 i = 0; i < stageIndex; ++i)
1932 {
1933 stageOffset += holiday->Duration[i] * HOUR;
1934 }
1935
1936 switch (holiday->CalendarFilterType)
1937 {
1938 case -1: // Yearly
1939 event.Occurence = YEAR / MINUTE; // Not all too useful
1940 break;
1941 case 0: // Weekly
1942 event.Occurence = WEEK / MINUTE;
1943 break;
1944 case 1: // Defined dates only (Darkmoon Faire)
1945 break;
1946 case 2: // Only used for looping events (Call to Arms)
1947 break;
1948 }
1949
1950 if (holiday->Looping)
1951 {
1952 event.Occurence = 0;
1953 for (uint8 i = 0; i < MAX_HOLIDAY_DURATIONS && holiday->Duration[i]; ++i)
1954 {
1955 event.Occurence += holiday->Duration[i] * HOUR / MINUTE;
1956 }
1957 }
1958
1959 bool singleDate = ((holiday->Date[0] >> 24) & 0x1F) == 31; // Events with fixed date within year have - 1
1960
1961 time_t curTime = GameTime::GetGameTime().count();
1962
1963 if (!singleDate)
1964 {
1966 holiday->Date, MAX_HOLIDAY_DATES, stageOffset, event.Length, curTime);
1967 if (start)
1968 event.Start = start;
1969
1970 return;
1971 }
1972
1973 for (uint8 i = 0; i < MAX_HOLIDAY_DATES && holiday->Date[i]; ++i)
1974 {
1975 uint32 date = holiday->Date[i];
1976
1977 tm timeInfo = Acore::Time::TimeBreakdown(curTime);
1978 timeInfo.tm_year -= 1; // First try last year (event active through New Year)
1979
1980 timeInfo.tm_mon = (date >> 20) & 0xF;
1981 timeInfo.tm_mday = ((date >> 14) & 0x3F) + 1;
1982 timeInfo.tm_hour = (date >> 6) & 0x1F;
1983 timeInfo.tm_min = date & 0x3F;
1984 timeInfo.tm_sec = 0;
1985 timeInfo.tm_isdst = -1;
1986
1987 // try to get next start time (skip past dates)
1988 time_t startTime = mktime(&timeInfo);
1989 if (curTime < startTime + stageOffset + event.Length * MINUTE)
1990 {
1991 event.Start = startTime + stageOffset;
1992 break;
1993 }
1994 else
1995 {
1996 tm tmCopy = Acore::Time::TimeBreakdown(curTime);
1997 int year = tmCopy.tm_year; // This year
1998 tmCopy = timeInfo;
1999 tmCopy.tm_year = year;
2000 event.Start = mktime(&tmCopy) + stageOffset;
2001 break;
2002 }
2003 }
2004}
constexpr auto YEAR
Definition Common.h:52
constexpr auto WEEK
Definition Common.h:50
constexpr auto HOUR
Definition Common.h:48
#define MAX_HOLIDAY_DURATIONS
Definition DBCStructure.h:1122
static time_t FindStartTimeForStage(const uint32_t *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::FindStartTimeForStage(), GameTime::GetGameTime(), GameEventData::HolidayId, GameEventData::HolidayStage, HOUR, GameEventData::Length, LOG_ERROR, HolidaysEntry::Looping, MAX_HOLIDAY_DATES, MAX_HOLIDAY_DURATIONS, MINUTE, 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:740
void ApplyNewEvent(uint16 eventId)
Definition GameEventMgr.cpp:1344
void AddActiveEvent(uint16 eventId)
Definition GameEventMgr.h:144

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 ( )
1235{
1236 _activeEvents.clear();
1237 uint32 delay = Update();
1238 _isSystemInit = true;
1239 return delay;
1240}
uint32 Update()
Definition GameEventMgr.cpp:1242

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:218
void UnApplyEvent(uint16 eventId)
Definition GameEventMgr.cpp:1321
void RemoveActiveEvent(uint16 eventId)
Definition GameEventMgr.h:145
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

1322{
1323 LOG_DEBUG("gameevent", "GameEvent {} \"{}\" removed.", eventId, _gameEvent[eventId].Description);
1325 RunSmartAIScripts(eventId, false);
1326 // un-spawn positive event tagged objects
1327 GameEventUnspawn(eventId);
1328 // spawn negative event tagget objects
1329 int16 numEventId = (-1) * eventId;
1330 GameEventSpawn(numEventId);
1331 // restore equipment or model
1332 ChangeEquipOrModel(eventId, false);
1333 // Remove quests that are events only to non event npc
1334 UpdateEventQuests(eventId, false);
1335 UpdateWorldStates(eventId, false);
1336 // update npcflags in this event
1337 UpdateEventNPCFlags(eventId);
1338 // remove vendor items
1339 UpdateEventNPCVendor(eventId, false);
1340 // update bg holiday
1342}

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

Referenced by StopEvent().

◆ Update()

uint32 GameEventMgr::Update ( )
1243{
1244 time_t currenttime = GameTime::GetGameTime().count();
1245 uint32 nextEventDelay = max_ge_check_delay; // 1 day
1246 uint32 calcDelay;
1247 std::set<uint16> activate, deactivate;
1248 for (uint16 itr = 1; itr < _gameEvent.size(); ++itr)
1249 {
1250 // must do the activating first, and after that the deactivating
1251 // so first queue it
1252 //LOG_ERROR("sql.sql", "Checking event {}", itr);
1253
1254 sScriptMgr->OnGameEventCheck(itr);
1255
1256 if (CheckOneGameEvent(itr))
1257 {
1258 // if the world event is in NEXTPHASE state, and the time has passed to finish this event, then do so
1259 if (_gameEvent[itr].State == GAMEEVENT_WORLD_NEXTPHASE && _gameEvent[itr].NextStart <= currenttime)
1260 {
1261 // set this event to finished, null the nextstart time
1263 _gameEvent[itr].NextStart = 0;
1264 // save the state of this gameevent
1266 // queue for deactivation
1267 if (IsActiveEvent(itr))
1268 deactivate.insert(itr);
1269 // go to next event, this no longer needs an event update timer
1270 continue;
1271 }
1273 // changed, save to DB the gameevent state, will be updated in next update cycle
1275
1276 // queue for activation
1277 if (!IsActiveEvent(itr))
1278 activate.insert(itr);
1279 }
1280 else
1281 {
1282 // If event is inactive, periodically clean up its worldstate
1283 sWorldState->setWorldState(itr, 0);
1284
1285 if (IsActiveEvent(itr))
1286 {
1287 // Xinef: do not deactivate internal events on whim
1288 if (_gameEvent[itr].State != GAMEEVENT_INTERNAL)
1289 deactivate.insert(itr);
1290 }
1291 else
1292 {
1293 if (!_isSystemInit)
1294 {
1295 int16 event_nid = (-1) * (itr);
1296 // spawn all negative ones for this event
1297 GameEventSpawn(event_nid);
1298 }
1299 }
1300 }
1301 calcDelay = NextCheck(itr);
1302 if (calcDelay < nextEventDelay)
1303 nextEventDelay = calcDelay;
1304 }
1305 // now activate the queue
1306 // a now activated event can contain a spawn of a to-be-deactivated one
1307 // following the activate - deactivate order, deactivating the first event later will leave the spawn in (wont disappear then reappear clientside)
1308 for (std::set<uint16>::iterator itr = activate.begin(); itr != activate.end(); ++itr)
1309 // start the event
1310 // returns true the started event completed
1311 // in that case, initiate next update in 1 second
1312 if (StartEvent(*itr))
1313 nextEventDelay = 0;
1314 for (std::set<uint16>::iterator itr = deactivate.begin(); itr != deactivate.end(); ++itr)
1315 StopEvent(*itr);
1316
1317 LOG_DEBUG("gameevent", "Next game event check in {} seconds.", nextEventDelay + 1);
1318 return (nextEventDelay + 1) * IN_MILLISECONDS; // Add 1 second to be sure event has started/stopped at next call
1319}
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
1416{
1417 uint32 mask = 0;
1418 for (ActiveEvents::const_iterator itr = _activeEvents.begin(); itr != _activeEvents.end(); ++itr)
1419 mask |= _gameEventBattlegroundHolidays[*itr];
1420 sBattlegroundMgr->SetHolidayWeekends(mask);
1421}
#define sBattlegroundMgr
Definition BattlegroundMgr.h:187

References _activeEvents, _gameEventBattlegroundHolidays, and sBattlegroundMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventNPCFlags()

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

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
1424{
1425 for (NPCVendorList::iterator itr = _gameEventVendors[eventId].begin(); itr != _gameEventVendors[eventId].end(); ++itr)
1426 {
1427 if (activate)
1428 sObjectMgr->AddVendorItem(itr->Entry, itr->Item, itr->MaxCount, itr->Incrtime, itr->ExtendedCost, false);
1429 else
1430 sObjectMgr->RemoveVendorItem(itr->Entry, itr->Item, false);
1431 }
1432}

References _gameEventVendors, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventQuests()

void GameEventMgr::UpdateEventQuests ( uint16  eventId,
bool  activate 
)
private
1697{
1698 QuestRelList::iterator itr;
1699 for (itr = _gameEventCreatureQuests[eventId].begin(); itr != _gameEventCreatureQuests[eventId].end(); ++itr)
1700 {
1701 QuestRelations* CreatureQuestMap = sObjectMgr->GetCreatureQuestRelationMap();
1702 if (activate) // Add the pair(id, quest) to the multimap
1703 CreatureQuestMap->insert(QuestRelations::value_type(itr->first, itr->second));
1704 else
1705 {
1706 if (!HasCreatureQuestActiveEventExcept(itr->second, eventId))
1707 {
1708 // Remove the pair(id, quest) from the multimap
1709 QuestRelations::iterator qitr = CreatureQuestMap->find(itr->first);
1710 if (qitr == CreatureQuestMap->end())
1711 continue;
1712 QuestRelations::iterator lastElement = CreatureQuestMap->upper_bound(itr->first);
1713 for (; qitr != lastElement; ++qitr)
1714 {
1715 if (qitr->second == itr->second)
1716 {
1717 CreatureQuestMap->erase(qitr); // iterator is now no more valid
1718 break; // but we can exit loop since the element is found
1719 }
1720 }
1721 }
1722 }
1723 }
1724 for (itr = _gameEventGameObjectQuests[eventId].begin(); itr != _gameEventGameObjectQuests[eventId].end(); ++itr)
1725 {
1726 QuestRelations* GameObjectQuestMap = sObjectMgr->GetGOQuestRelationMap();
1727 if (activate) // Add the pair(id, quest) to the multimap
1728 GameObjectQuestMap->insert(QuestRelations::value_type(itr->first, itr->second));
1729 else
1730 {
1731 if (!HasGameObjectQuestActiveEventExcept(itr->second, eventId))
1732 {
1733 // Remove the pair(id, quest) from the multimap
1734 QuestRelations::iterator qitr = GameObjectQuestMap->find(itr->first);
1735 if (qitr == GameObjectQuestMap->end())
1736 continue;
1737 QuestRelations::iterator lastElement = GameObjectQuestMap->upper_bound(itr->first);
1738 for (; qitr != lastElement; ++qitr)
1739 {
1740 if (qitr->second == itr->second)
1741 {
1742 GameObjectQuestMap->erase(qitr); // iterator is now no more valid
1743 break; // but we can exit loop since the element is found
1744 }
1745 }
1746 }
1747 }
1748 }
1749}
std::multimap< uint32, uint32 > QuestRelations
Definition ObjectMgr.h:530
bool HasCreatureQuestActiveEventExcept(uint32 quest_id, uint16 eventId)
Definition GameEventMgr.cpp:1640
bool HasGameObjectQuestActiveEventExcept(uint32 quest_id, uint16 eventId)
Definition GameEventMgr.cpp:1654

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

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateWorldStates()

void GameEventMgr::UpdateWorldStates ( uint16  eventId,
bool  Activate 
)
private
1752{
1753 GameEventData const& event = _gameEvent[eventId];
1754 if (event.HolidayId != HOLIDAY_NONE)
1755 {
1757 if (bgTypeId != BATTLEGROUND_TYPE_NONE)
1758 {
1759 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
1760 if (bl && bl->HolidayWorldStateId)
1761 {
1763 worldstate.VariableID = bl->HolidayWorldStateId;
1764 worldstate.Value = Activate ? 1 : 0;
1765 sWorldSessionMgr->SendGlobalMessage(worldstate.Write());
1766 }
1767 }
1768 }
1769}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
BattlegroundTypeId
Definition SharedDefines.h:3735
@ BATTLEGROUND_TYPE_NONE
Definition SharedDefines.h:3736
#define sWorldSessionMgr
Definition WorldSessionMgr.h:108
static BattlegroundTypeId WeekendHolidayIdToBGType(HolidayIds holiday)
Definition BattlegroundMgr.cpp:889
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

◆ _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: