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
1773 : _isSystemInit(false)
1774{
1775}
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

1347{
1348 uint8 announce = _gameEvent[eventId].Announce;
1349 if (announce == 1 || (announce == 2 && sWorld->getIntConfig(CONFIG_EVENT_ANNOUNCE)))
1350 ChatHandler(nullptr).SendWorldText(LANG_EVENTMESSAGE, _gameEvent[eventId].Description);
1351
1352 LOG_DEBUG("gameevent", "GameEvent {} \"{}\" started.", eventId, _gameEvent[eventId].Description);
1353
1354 // spawn positive event tagget objects
1355 GameEventSpawn(eventId);
1356 // un-spawn negative event tagged objects
1357 int16 numEventId = (-1) * eventId;
1358 GameEventUnspawn(numEventId);
1359 // Change equipement or model
1360 ChangeEquipOrModel(eventId, true);
1361 // Add quests that are events only to non event npc
1362 UpdateEventQuests(eventId, true);
1363 UpdateWorldStates(eventId, true);
1364 // update npcflags in this event
1365 UpdateEventNPCFlags(eventId);
1366 // add vendor items
1367 UpdateEventNPCVendor(eventId, true);
1368 // update bg holiday
1370
1372 RunSmartAIScripts(eventId, true);
1373
1374 // If event's worldstate is 0, it means the event hasn't been started yet. In that case, reset seasonal quests.
1375 // 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.
1376 if (sWorldState->getWorldState(eventId) == 0)
1377 {
1378 sWorld->ResetEventSeasonalQuests(eventId);
1379 }
1380}
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:170
@ CONFIG_EVENT_ANNOUNCE
Definition WorldConfig.h:235
#define sWorldState
Definition WorldState.h:377
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:131
void UpdateWorldStates(uint16 eventId, bool Activate)
Definition GameEventMgr.cpp:1753
void UpdateEventQuests(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1698
void GameEventSpawn(int16 eventId)
Definition GameEventMgr.cpp:1436
void GameEventUnspawn(int16 eventId)
Definition GameEventMgr.cpp:1509
GameEventDataMap _gameEvent
Definition GameEventMgr.h:188
void UpdateEventNPCVendor(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1425
void UpdateBattlegroundSettings()
Definition GameEventMgr.cpp:1417
void UpdateEventNPCFlags(uint16 eventId)
Definition GameEventMgr.cpp:1382
void RunSmartAIScripts(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1904
void ChangeEquipOrModel(int16 eventId, bool activate)
Definition GameEventMgr.cpp:1585
#define sWorld
Definition World.h:316

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

References _gameEventModelEquip, CreatureData::displayid, CreatureData::equipmentId, CreatureData::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.

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

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

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

◆ GameEventSpawn()

void GameEventMgr::GameEventSpawn ( int16  eventId)
private
1437{
1438 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1439
1440 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1441 {
1442 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element {} (size: {})",
1443 internal_event_id, GameEventCreatureGuids.size());
1444 return;
1445 }
1446
1447 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1448 {
1449 // Add to correct cell
1450 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1451 {
1452 sObjectMgr->AddCreatureToGrid(*itr, data);
1453
1454 // Spawn if necessary (loaded grids only)
1455 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1456 // We use spawn coords to spawn
1457 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1458 {
1459 Creature* creature = new Creature;
1460 if (!creature->LoadCreatureFromDB(*itr, map))
1461 delete creature;
1462 }
1463 }
1464 }
1465
1466 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1467 {
1468 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element {} (size: {})",
1469 internal_event_id, GameEventGameobjectGuids.size());
1470 return;
1471 }
1472
1473 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1474 {
1475 // Add to correct cell
1476 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1477 {
1478 sObjectMgr->AddGameobjectToGrid(*itr, data);
1479 // Spawn if necessary (loaded grids only)
1480 // this base map checked as non-instanced and then only existed
1481 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1482 // We use current coords to unspawn, not spawn coords since creature can have changed grid
1483 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1484 {
1485 GameObject* pGameobject = sObjectMgr->IsGameObjectStaticTransport(data->id) ? new StaticTransport() : new GameObject();
1486 //TODO: find out when it is add to map
1487 if (!pGameobject->LoadGameObjectFromDB(*itr, map, false))
1488 delete pGameobject;
1489 else
1490 {
1491 if (pGameobject->isSpawnedByDefault())
1492 map->AddToMap(pGameobject);
1493 }
1494 }
1495 }
1496 }
1497
1498 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1499 {
1500 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range _gameEventPoolIds element {} (size: {})",
1501 internal_event_id, _gameEventPoolIds.size());
1502 return;
1503 }
1504
1505 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1506 sPoolMgr->SpawnPool(*itr);
1507}
std::int32_t int32
Definition Define.h:103
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
#define sPoolMgr
Definition PoolMgr.h:163
Definition Creature.h:47
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1653
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:195
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1088
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:204
bool Instanceable() const
Definition Map.h:294
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:305
Definition Transport.h:115
Definition GameObjectData.h:712

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

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

References GetEventMap().

◆ GetNPCFlag()

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

References _activeEvents, _gameEvent, and GameEventCreatureGuids.

Referenced by GameEventUnspawn().

◆ HasCreatureQuestActiveEventExcept()

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

References _activeEvents, and _gameEventCreatureQuests.

Referenced by UpdateEventQuests().

◆ HasGameObjectActiveEventExcept()

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

References _activeEvents, _gameEvent, and GameEventGameobjectGuids.

◆ HasGameObjectQuestActiveEventExcept()

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

References _activeEvents, and _gameEventGameObjectQuests.

Referenced by UpdateEventQuests().

◆ Initialize()

void GameEventMgr::Initialize ( )
1212{
1213 QueryResult result = WorldDatabase.Query("SELECT MAX(eventEntry) FROM game_event");
1214 if (result)
1215 {
1216 Field* fields = result->Fetch();
1217
1218 uint32 maxEventId = fields[0].Get<uint8>();
1219
1220 // Id starts with 1 and vector with 0, thus increment
1221 maxEventId++;
1222
1223 _gameEvent.resize(maxEventId);
1224 GameEventCreatureGuids.resize(maxEventId * 2 - 1);
1225 GameEventGameobjectGuids.resize(maxEventId * 2 - 1);
1226 _gameEventCreatureQuests.resize(maxEventId);
1227 _gameEventGameObjectQuests.resize(maxEventId);
1228 _gameEventVendors.resize(maxEventId);
1229 _gameEventBattlegroundHolidays.resize(maxEventId, 0);
1230 _gameEventPoolIds.resize(maxEventId * 2 - 1);
1231 _gameEventNPCFlags.resize(maxEventId);
1232 _gameEventModelEquip.resize(maxEventId);
1233 }
1234}
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
964{
965 LOG_INFO("server.loading", "Loading Game Event Battleground Data...");
966
967 uint32 oldMSTime = getMSTime();
968
970 PreparedQueryResult result = WorldDatabase.Query(stmt);
971
972 if (!result)
973 {
974 LOG_WARN("server.loading", ">> Loaded 0 Battleground Holidays In Game Events. DB table `game_event_battleground_holiday` is empty.");
975 LOG_INFO("server.loading", " ");
976 }
977 else
978 {
979 uint32 count = 0;
980 do
981 {
982 Field* fields = result->Fetch();
983
984 uint16 eventId = fields[0].Get<uint8>();
985
986 if (eventId >= _gameEvent.size())
987 {
988 LOG_ERROR("sql.sql", "`game_event_battleground_holiday` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
989 continue;
990 }
991
992 _gameEventBattlegroundHolidays[eventId] = fields[1].Get<uint32>();
993
994 ++count;
995 } while (result->NextRow());
996
997 LOG_INFO("server.loading", ">> Loaded {} Battleground Holidays In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
998 LOG_INFO("server.loading", " ");
999 }
1000}
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define LOG_WARN(filterType__,...)
Definition Log.h:162
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
uint32 getMSTime()
Definition Timer.h:103
@ WORLD_SEL_GAME_EVENT_BATTLEGROUND_DATA
Definition WorldDatabase.h:104

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

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

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
698{
699 LOG_INFO("server.loading", "Loading Game Event GO Quest Data...");
700
701 uint32 oldMSTime = getMSTime();
702
704 PreparedQueryResult result = WorldDatabase.Query(stmt);
705
706 if (!result)
707 {
708 LOG_WARN("server.loading", ">> Loaded 0 go Quests Additions In Game Events. DB Table `game_event_gameobject_quest` Is Empty.");
709 LOG_INFO("server.loading", " ");
710 }
711 else
712 {
713 uint32 count = 0;
714 do
715 {
716 Field* fields = result->Fetch();
717
718 uint32 id = fields[0].Get<uint32>();
719 uint32 quest = fields[1].Get<uint32>();
720 uint16 eventId = fields[2].Get<uint8>();
721
722 if (eventId >= _gameEventGameObjectQuests.size())
723 {
724 LOG_ERROR("sql.sql", "`game_event_gameobject_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
725 continue;
726 }
727
728 QuestRelList& questlist = _gameEventGameObjectQuests[eventId];
729 questlist.push_back(QuestRelation(id, quest));
730
731 ++count;
732 } while (result->NextRow());
733
734 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
735 LOG_INFO("server.loading", " ");
736 }
737}
@ WORLD_SEL_GAME_EVENT_GAMEOBJECT_QUEST_DATA
Definition WorldDatabase.h:99
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 uint32 entry2 = fields[2].Get<uint32>();
618 uint32 entry3 = fields[3].Get<uint32>();
619 uint16 eventId = fields[4].Get<uint8>();
620
621 if (eventId >= _gameEventModelEquip.size())
622 {
623 LOG_ERROR("sql.sql", "`game_event_model_equip` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
624 continue;
625 }
626
627 ModelEquipList& equiplist = _gameEventModelEquip[eventId];
628 ModelEquip newModelEquipSet;
629 newModelEquipSet.ModelId = fields[5].Get<uint32>();
630 newModelEquipSet.EquipmentId = fields[6].Get<uint8>();
631 newModelEquipSet.EquipementIdPrev = 0;
632 newModelEquipSet.ModelIdPrev = 0;
633
634 if (newModelEquipSet.EquipmentId > 0)
635 {
636 int8 equipId = static_cast<int8>(newModelEquipSet.EquipmentId);
637 if ((!sObjectMgr->GetEquipmentInfo(entry, equipId)) || (entry2 && !sObjectMgr->GetEquipmentInfo(entry2, equipId)) || (entry3 && !sObjectMgr->GetEquipmentInfo(entry3, equipId)))
638 {
639 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.",
640 guid, newModelEquipSet.EquipmentId);
641 continue;
642 }
643 }
644
645 equiplist.push_back(std::pair<ObjectGuid::LowType, ModelEquip>(guid, newModelEquipSet));
646
647 ++count;
648 } while (result->NextRow());
649
650 LOG_INFO("server.loading", ">> Loaded {} Model/Equipment Changes In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
651 LOG_INFO("server.loading", " ");
652 }
653}
std::int8_t int8
Definition Define.h:105
@ WORLD_SEL_GAME_EVENT_MODEL_EQUIPMENT_DATA
Definition WorldDatabase.h:97
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
876{
877 LOG_INFO("server.loading", "Loading Game Event NPCflag Data...");
878
879 uint32 oldMSTime = getMSTime();
880
882 PreparedQueryResult result = WorldDatabase.Query(stmt);
883
884 if (!result)
885 {
886 LOG_WARN("server.loading", ">> Loaded 0 Npcflags In Game Events. DB Table `game_event_npcflag` Is Empty.");
887 LOG_INFO("server.loading", " ");
888 }
889 else
890 {
891 uint32 count = 0;
892 do
893 {
894 Field* fields = result->Fetch();
895
896 ObjectGuid::LowType guid = fields[0].Get<uint32>();
897 uint16 eventId = fields[1].Get<uint8>();
898 uint32 npcflag = fields[2].Get<uint32>();
899
900 if (eventId >= _gameEvent.size())
901 {
902 LOG_ERROR("sql.sql", "`game_event_npcflag` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
903 continue;
904 }
905
906 _gameEventNPCFlags[eventId].push_back(GuidNPCFlagPair(guid, npcflag));
907
908 ++count;
909 } while (result->NextRow());
910
911 LOG_INFO("server.loading", ">> Loaded {} Npcflags In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
912 LOG_INFO("server.loading", " ");
913 }
914}
@ WORLD_SEL_GAME_EVENT_NPC_FLAGS
Definition WorldDatabase.h:102
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
1003{
1004 LOG_INFO("server.loading", "Loading Game Event Pool Data...");
1005
1006 uint32 oldMSTime = getMSTime();
1007
1009 PreparedQueryResult result = WorldDatabase.Query(stmt);
1010
1011 if (!result)
1012 {
1013 LOG_WARN("server.loading", ">> Loaded 0 Pools For Game Events. DB Table `game_event_pool` Is Empty.");
1014 LOG_INFO("server.loading", " ");
1015 }
1016 else
1017 {
1018 uint32 count = 0;
1019 do
1020 {
1021 Field* fields = result->Fetch();
1022
1023 uint32 entry = fields[0].Get<uint32>();
1024 int16 eventId = fields[1].Get<int16>();
1025
1026 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1027
1028 if (internal_event_id < 0 || internal_event_id >= int32(_gameEventPoolIds.size()))
1029 {
1030 LOG_ERROR("sql.sql", "`game_event_pool` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
1031 continue;
1032 }
1033
1034 if (!sPoolMgr->CheckPool(entry))
1035 {
1036 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);
1037 continue;
1038 }
1039
1040 IdList& poollist = _gameEventPoolIds[internal_event_id];
1041 poollist.push_back(entry);
1042
1043 ++count;
1044 } while (result->NextRow());
1045
1046 LOG_INFO("server.loading", ">> Loaded {} Pools For Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1047 LOG_INFO("server.loading", " ");
1048 }
1049}
@ WORLD_SEL_GAME_EVENT_POOL_DATA
Definition WorldDatabase.h:105
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:94

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

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

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:2981
@ HOLIDAY_NONE
Definition SharedDefines.h:2982
@ WORLD_SEL_GAME_EVENTS
Definition WorldDatabase.h:93
void SetHolidayEventTime(GameEventData &event)
Definition GameEventMgr.cpp:1916
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
917{
918 LOG_INFO("server.loading", "Loading Game Event Seasonal Quest Relations...");
919 uint32 oldMSTime = getMSTime();
920
922 PreparedQueryResult result = WorldDatabase.Query(stmt);
923
924 if (!result)
925 {
926 LOG_WARN("server.loading", ">> Loaded 0 Seasonal Quests Additions In Game Events. DB Table `game_event_seasonal_questrelation` Is Empty.");
927 LOG_INFO("server.loading", " ");
928 }
929 else
930 {
931 uint32 count = 0;
932 do
933 {
934 Field* fields = result->Fetch();
935
936 uint32 questId = fields[0].Get<uint32>();
937 uint32 eventEntry = fields[1].Get<uint32>();
938
939 Quest* questTemplate = const_cast<Quest*>(sObjectMgr->GetQuestTemplate(questId));
940
941 if (!questTemplate)
942 {
943 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` quest id ({}) does not exist in `quest_template`", questId);
944 continue;
945 }
946
947 if (eventEntry >= _gameEvent.size())
948 {
949 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` event id ({}) is out of range compared to max event in `game_event`", eventEntry);
950 continue;
951 }
952
953 questTemplate->SetEventIdForQuest((uint16)eventEntry);
954 _gameEventSeasonalQuestsMap[eventEntry].push_back(questId);
955 ++count;
956 } while (result->NextRow());
957
958 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
959 LOG_INFO("server.loading", " ");
960 }
961}
@ WORLD_SEL_GAME_EVENT_QUEST_SEASONAL_RELATIONS
Definition WorldDatabase.h:103
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->id1;
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:2041
@ WORLD_SEL_GAME_EVENT_NPC_VENDOR
Definition WorldDatabase.h:109
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 ( )
1052{
1053 // The order of these functions matter. Do not change
1054 LoadEvents();
1070}
void LoadEventConditionData()
Definition GameEventMgr.cpp:783
void LoadEventCreatureData()
Definition GameEventMgr.cpp:494
void LoadEventSeasonalQuestRelations()
Definition GameEventMgr.cpp:916
void LoadEventQuestData()
Definition GameEventMgr.cpp:655
void LoadEventPoolData()
Definition GameEventMgr.cpp:1002
void LoadEventGameObjectQuestData()
Definition GameEventMgr.cpp:697
void LoadEventSaveData()
Definition GameEventMgr.cpp:395
void LoadEventNPCFlags()
Definition GameEventMgr.cpp:875
void LoadEventQuestConditionData()
Definition GameEventMgr.cpp:739
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:963
void LoadEventConditionSaveData()
Definition GameEventMgr.cpp:826

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

◆ LoadHolidayDates()

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

1905{
1908 sMapMgr->DoForAllMaps([eventId, activate](Map* map)
1909 {
1910 GameEventAIHookWorker worker(eventId, activate);
1912 visitor.Visit(map->GetObjectsStore());
1913 });
1914}
Definition GameEventMgr.cpp:1878
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:348
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
1850{
1851 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1852
1854 stmt->SetData(0, uint8(eventId));
1855 trans->Append(stmt);
1856
1857 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_SAVE);
1858 stmt->SetData(0, uint8(eventId));
1859 stmt->SetData(1, _gameEvent[eventId].State);
1860 stmt->SetData(2, _gameEvent[eventId].NextStart ? uint32(_gameEvent[eventId].NextStart) : 0);
1861 trans->Append(stmt);
1862 CharacterDatabase.CommitTransaction(trans);
1863}
@ 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
1866{
1867 GameEventConditionMap::const_iterator itr;
1868 for (itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1869 {
1870 if (itr->second.DoneWorldState)
1871 player->SendUpdateWorldState(itr->second.DoneWorldState, (uint32)(itr->second.Done));
1872 if (itr->second.MaxWorldState)
1873 player->SendUpdateWorldState(itr->second.MaxWorldState, (uint32)(itr->second.ReqNum));
1874 }
1875}
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition PlayerUpdates.cpp:2235

References _gameEvent, and Player::SendUpdateWorldState().

◆ SetHolidayEventTime()

void GameEventMgr::SetHolidayEventTime ( GameEventData event)
private
1917{
1918 if (!event.HolidayStage) // Ignore holiday
1919 return;
1920
1921 HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(event.HolidayId);
1922
1923 if (!holiday->Date[0] || !holiday->Duration[0]) // Invalid definitions
1924 {
1925 LOG_ERROR("sql.sql", "Missing date or duration for holiday {}.", event.HolidayId);
1926 return;
1927 }
1928
1929 uint8 stageIndex = event.HolidayStage - 1;
1930 event.Length = holiday->Duration[stageIndex] * HOUR / MINUTE;
1931
1932 time_t stageOffset = 0;
1933 for (uint8 i = 0; i < stageIndex; ++i)
1934 {
1935 stageOffset += holiday->Duration[i] * HOUR;
1936 }
1937
1938 switch (holiday->CalendarFilterType)
1939 {
1940 case -1: // Yearly
1941 event.Occurence = YEAR / MINUTE; // Not all too useful
1942 break;
1943 case 0: // Weekly
1944 event.Occurence = WEEK / MINUTE;
1945 break;
1946 case 1: // Defined dates only (Darkmoon Faire)
1947 break;
1948 case 2: // Only used for looping events (Call to Arms)
1949 break;
1950 }
1951
1952 if (holiday->Looping)
1953 {
1954 event.Occurence = 0;
1955 for (uint8 i = 0; i < MAX_HOLIDAY_DURATIONS && holiday->Duration[i]; ++i)
1956 {
1957 event.Occurence += holiday->Duration[i] * HOUR / MINUTE;
1958 }
1959 }
1960
1961 bool singleDate = ((holiday->Date[0] >> 24) & 0x1F) == 31; // Events with fixed date within year have - 1
1962
1963 time_t curTime = GameTime::GetGameTime().count();
1964 for (uint8 i = 0; i < MAX_HOLIDAY_DATES && holiday->Date[i]; ++i)
1965
1966 {
1967 uint32 date = holiday->Date[i];
1968
1969 tm timeInfo;
1970 if (singleDate)
1971 {
1972 timeInfo = Acore::Time::TimeBreakdown(curTime);
1973 timeInfo.tm_year -= 1; // First try last year (event active through New Year)
1974 }
1975 else
1976 {
1977 timeInfo.tm_year = ((date >> 24) & 0x1F) + 100;
1978 }
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 + event.Length * MINUTE)
1990 {
1991 event.Start = startTime + stageOffset;
1992 break;
1993 }
1994 else if (singleDate)
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 else
2004 {
2005 // date is due and not a singleDate event, try with next DBC date (dynamically calculated or overridden by game_event.start_time)
2006 // if none is found we don't modify start date and use the one in game_event
2007 }
2008 }
2009}
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
int32 CalendarFilterType
Definition DBCStructure.h:1138
uint32 Looping
Definition DBCStructure.h:1132

References HolidaysEntry::CalendarFilterType, HolidaysEntry::Date, HolidaysEntry::Duration, 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:719
void ApplyNewEvent(uint16 eventId)
Definition GameEventMgr.cpp:1346
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 ( )
1237{
1238 _activeEvents.clear();
1239 uint32 delay = Update();
1240 _isSystemInit = true;
1241 return delay;
1242}
uint32 Update()
Definition GameEventMgr.cpp:1244

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:1323
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

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

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

Referenced by StopEvent().

◆ Update()

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

References _activeEvents, _gameEventBattlegroundHolidays, and sBattlegroundMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventNPCFlags()

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

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

References _gameEventVendors, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventQuests()

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

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

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateWorldStates()

void GameEventMgr::UpdateWorldStates ( uint16  eventId,
bool  Activate 
)
private
1754{
1755 GameEventData const& event = _gameEvent[eventId];
1756 if (event.HolidayId != HOLIDAY_NONE)
1757 {
1759 if (bgTypeId != BATTLEGROUND_TYPE_NONE)
1760 {
1761 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
1762 if (bl && bl->HolidayWorldStateId)
1763 {
1765 worldstate.VariableID = bl->HolidayWorldStateId;
1766 worldstate.Value = Activate ? 1 : 0;
1767 sWorldSessionMgr->SendGlobalMessage(worldstate.Write());
1768 }
1769 }
1770 }
1771}
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: