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
1696 : _isSystemInit(false)
1697{
1698}
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

1270{
1271 uint8 announce = _gameEvent[eventId].Announce;
1272 if (announce == 1 || (announce == 2 && sWorld->getIntConfig(CONFIG_EVENT_ANNOUNCE)))
1273 ChatHandler(nullptr).SendWorldText(LANG_EVENTMESSAGE, _gameEvent[eventId].Description);
1274
1275 LOG_DEBUG("gameevent", "GameEvent {} \"{}\" started.", eventId, _gameEvent[eventId].Description);
1276
1277 // spawn positive event tagget objects
1278 GameEventSpawn(eventId);
1279 // un-spawn negative event tagged objects
1280 int16 numEventId = (-1) * eventId;
1281 GameEventUnspawn(numEventId);
1282 // Change equipement or model
1283 ChangeEquipOrModel(eventId, true);
1284 // Add quests that are events only to non event npc
1285 UpdateEventQuests(eventId, true);
1286 UpdateWorldStates(eventId, true);
1287 // update npcflags in this event
1288 UpdateEventNPCFlags(eventId);
1289 // add vendor items
1290 UpdateEventNPCVendor(eventId, true);
1291 // update bg holiday
1293
1295 RunSmartAIScripts(eventId, true);
1296
1297 // If event's worldstate is 0, it means the event hasn't been started yet. In that case, reset seasonal quests.
1298 // 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.
1299 if (sWorld->getWorldState(eventId) == 0)
1300 {
1301 sWorld->ResetEventSeasonalQuests(eventId);
1302 }
1303}
std::uint8_t uint8
Definition Define.h:109
std::int16_t int16
Definition Define.h:104
@ CONFIG_EVENT_ANNOUNCE
Definition IWorld.h:281
@ LANG_EVENTMESSAGE
Definition Language.h:36
#define LOG_DEBUG(filterType__,...)
Definition Log.h:169
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:131
void UpdateWorldStates(uint16 eventId, bool Activate)
Definition GameEventMgr.cpp:1676
void UpdateEventQuests(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1621
void GameEventSpawn(int16 eventId)
Definition GameEventMgr.cpp:1359
void GameEventUnspawn(int16 eventId)
Definition GameEventMgr.cpp:1432
GameEventDataMap _gameEvent
Definition GameEventMgr.h:188
void UpdateEventNPCVendor(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1348
void UpdateBattlegroundSettings()
Definition GameEventMgr.cpp:1340
void UpdateEventNPCFlags(uint16 eventId)
Definition GameEventMgr.cpp:1305
void RunSmartAIScripts(uint16 eventId, bool activate)
Definition GameEventMgr.cpp:1827
void ChangeEquipOrModel(int16 eventId, bool activate)
Definition GameEventMgr.cpp:1508
#define sWorld
Definition World.h:363

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

Referenced by StartEvent().

◆ ChangeEquipOrModel()

void GameEventMgr::ChangeEquipOrModel ( int16  eventId,
bool  activate 
)
private
1509{
1510 for (ModelEquipList::iterator itr = _gameEventModelEquip[eventId].begin(); itr != _gameEventModelEquip[eventId].end(); ++itr)
1511 {
1512 // Remove the creature from grid
1513 CreatureData const* data = sObjectMgr->GetCreatureData(itr->first);
1514 if (!data)
1515 continue;
1516
1517 // Update if spawned
1518 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr, activate](Map* map)
1519 {
1520 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(itr->first);
1521 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second; ++itr2)
1522 {
1523 Creature* creature = itr2->second;
1524 if (activate)
1525 {
1526 itr->second.EquipementIdPrev = creature->GetCurrentEquipmentId();
1527 itr->second.ModelIdPrev = creature->GetDisplayId();
1528 creature->LoadEquipment(itr->second.EquipmentId, true);
1529 if (itr->second.ModelId > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelId))
1530 {
1531 creature->SetDisplayId(itr->second.ModelId);
1532 creature->SetNativeDisplayId(itr->second.ModelId);
1533 }
1534 }
1535 else
1536 {
1537 creature->LoadEquipment(itr->second.EquipementIdPrev, true);
1538 if (itr->second.ModelIdPrev > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelIdPrev))
1539 {
1540 creature->SetDisplayId(itr->second.ModelIdPrev);
1541 creature->SetNativeDisplayId(itr->second.ModelIdPrev);
1542 }
1543 }
1544 }
1545 });
1546
1547 // now last step: put in data
1548 // just to have write access to it
1549 CreatureData& data2 = sObjectMgr->NewOrExistCreatureData(itr->first);
1550 if (activate)
1551 {
1552 itr->second.ModelIdPrev = data2.displayid;
1553 itr->second.EquipementIdPrev = data2.equipmentId;
1554 data2.displayid = itr->second.ModelId;
1555 data2.equipmentId = itr->second.EquipmentId;
1556 }
1557 else
1558 {
1559 data2.displayid = itr->second.ModelIdPrev;
1560 data2.equipmentId = itr->second.EquipementIdPrev;
1561 }
1562 }
1563}
#define sMapMgr
Definition MapMgr.h:220
#define sObjectMgr
Definition ObjectMgr.h:1636
GameEventModelEquipMap _gameEventModelEquip
Definition GameEventMgr.h:186
Definition Map.h:156
Definition CreatureData.h:370
uint32 displayid
Definition CreatureData.h:377
int8 equipmentId
Definition CreatureData.h:378
uint16 mapid
Definition CreatureData.h:375

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

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ CheckOneGameEvent()

bool GameEventMgr::CheckOneGameEvent ( uint16  entry) const
45{
46 switch (_gameEvent[entry].State)
47 {
48 default:
50 {
51 time_t currenttime = GameTime::GetGameTime().count();
52 // Get the event information
53 return _gameEvent[entry].Start < currenttime
54 && currenttime < _gameEvent[entry].End
55 && (currenttime - _gameEvent[entry].Start) % (_gameEvent[entry].Occurence * MINUTE) < _gameEvent[entry].Length * MINUTE;
56 }
57 // if the state is conditions or nextphase, then the event should be active
60 return true;
61 // finished world events are inactive
64 return false;
65 // if inactive world event, check the prerequisite events
67 {
68 time_t currenttime = GameTime::GetGameTime().count();
69 for (std::set<uint16>::const_iterator itr = _gameEvent[entry].PrerequisiteEvents.begin(); itr != _gameEvent[entry].PrerequisiteEvents.end(); ++itr)
70 {
71 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
72 _gameEvent[*itr].NextStart > currenttime) // if not in nextphase state for long enough, can't start this one
73 return false;
74 }
75 // all prerequisite events are met
76 // but if there are no prerequisites, this can be only activated through gm command
77 return !(_gameEvent[entry].PrerequisiteEvents.empty());
78 }
79 }
80}
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.

1756{
1757 for (GameEventConditionMap::const_iterator itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1758 if (itr->second.Done < itr->second.ReqNum)
1759 // return false if a condition doesn't match
1760 return false;
1761 // set the phase
1762 _gameEvent[eventId].State = GAMEEVENT_WORLD_NEXTPHASE;
1763 // set the followup events' start time
1764 if (!_gameEvent[eventId].NextStart)
1765 {
1766 time_t currenttime = GameTime::GetGameTime().count();
1767 _gameEvent[eventId].NextStart = currenttime + _gameEvent[eventId].Length * 60;
1768 }
1769 return true;
1770}

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

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

◆ GameEventSpawn()

void GameEventMgr::GameEventSpawn ( int16  eventId)
private
1360{
1361 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1362
1363 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1364 {
1365 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element {} (size: {})",
1366 internal_event_id, GameEventCreatureGuids.size());
1367 return;
1368 }
1369
1370 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1371 {
1372 // Add to correct cell
1373 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1374 {
1375 sObjectMgr->AddCreatureToGrid(*itr, data);
1376
1377 // Spawn if necessary (loaded grids only)
1378 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1379 // We use spawn coords to spawn
1380 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1381 {
1382 Creature* creature = new Creature;
1383 if (!creature->LoadCreatureFromDB(*itr, map))
1384 delete creature;
1385 }
1386 }
1387 }
1388
1389 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1390 {
1391 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element {} (size: {})",
1392 internal_event_id, GameEventGameobjectGuids.size());
1393 return;
1394 }
1395
1396 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1397 {
1398 // Add to correct cell
1399 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1400 {
1401 sObjectMgr->AddGameobjectToGrid(*itr, data);
1402 // Spawn if necessary (loaded grids only)
1403 // this base map checked as non-instanced and then only existed
1404 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1405 // We use current coords to unspawn, not spawn coords since creature can have changed grid
1406 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1407 {
1408 GameObject* pGameobject = sObjectMgr->IsGameObjectStaticTransport(data->id) ? new StaticTransport() : new GameObject();
1409 //TODO: find out when it is add to map
1410 if (!pGameobject->LoadGameObjectFromDB(*itr, map, false))
1411 delete pGameobject;
1412 else
1413 {
1414 if (pGameobject->isSpawnedByDefault())
1415 map->AddToMap(pGameobject);
1416 }
1417 }
1418 }
1419 }
1420
1421 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1422 {
1423 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range _gameEventPoolIds element {} (size: {})",
1424 internal_event_id, _gameEventPoolIds.size());
1425 return;
1426 }
1427
1428 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1429 sPoolMgr->SpawnPool(*itr);
1430}
std::int32_t int32
Definition Define.h:103
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
#define sPoolMgr
Definition PoolMgr.h:163
Definition Creature.h:43
bool LoadCreatureFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true, bool allowDuplicate=false)
Definition Creature.cpp:1698
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
bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1108
bool IsGridLoaded(GridCoord const &gridCoord) const
Definition Map.cpp:291
bool Instanceable() const
Definition Map.h:294
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:394
Definition Transport.h:113
Definition GameObjectData.h:696

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
1433{
1434 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1435
1436 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1437 {
1438 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventCreatureGuids element {} (size: {})",
1439 internal_event_id, GameEventCreatureGuids.size());
1440 return;
1441 }
1442
1443 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1444 {
1445 // check if it's needed by another event, if so, don't remove
1446 if (eventId > 0 && HasCreatureActiveEventExcept(*itr, eventId))
1447 continue;
1448
1449 // Remove the creature from grid
1450 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1451 {
1452 sObjectMgr->RemoveCreatureFromGrid(*itr, data);
1453
1454 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1455 {
1456 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(*itr);
1457 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second;)
1458 {
1459 Creature* creature = itr2->second;
1460 ++itr2;
1461 creature->AddObjectToRemoveList();
1462 }
1463 });
1464 }
1465 }
1466
1467 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1468 {
1469 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventGameobjectGuids element {} (size: {})",
1470 internal_event_id, GameEventGameobjectGuids.size());
1471 return;
1472 }
1473
1474 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1475 {
1476 // check if it's needed by another event, if so, don't remove
1477 if (eventId > 0 && HasGameObjectActiveEventExcept(*itr, eventId))
1478 continue;
1479 // Remove the gameobject from grid
1480 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1481 {
1482 sObjectMgr->RemoveGameobjectFromGrid(*itr, data);
1483
1484 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1485 {
1486 auto gameobjectBounds = map->GetGameObjectBySpawnIdStore().equal_range(*itr);
1487 for (auto itr2 = gameobjectBounds.first; itr2 != gameobjectBounds.second;)
1488 {
1489 GameObject* go = itr2->second;
1490 ++itr2;
1491 go->AddObjectToRemoveList();
1492 }
1493 });
1494 }
1495 }
1496 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1497 {
1498 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element {} (size: {})", internal_event_id, _gameEventPoolIds.size());
1499 return;
1500 }
1501
1502 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1503 {
1504 sPoolMgr->DespawnPool(*itr);
1505 }
1506}
bool HasGameObjectActiveEventExcept(ObjectGuid::LowType go_guid, uint16 eventId)
Definition GameEventMgr.cpp:1606
bool HasCreatureActiveEventExcept(ObjectGuid::LowType creature_guid, uint16 eventId)
Definition GameEventMgr.cpp:1592

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.

◆ GetHolidayEventId()

uint32 GameEventMgr::GetHolidayEventId ( uint32  holidayId) const
1935{
1936 auto const& events = sGameEventMgr->GetEventMap();
1937
1938 for (auto const& eventEntry : events)
1939 {
1940 if (eventEntry.HolidayId == holidayId)
1941 {
1942 return eventEntry.EventId;
1943 }
1944 }
1945
1946 return 0;
1947}
#define sGameEventMgr
Definition GameEventMgr.h:201
events
Definition boss_sartura.cpp:43

References sGameEventMgr.

◆ GetNPCFlag()

uint32 GameEventMgr::GetNPCFlag ( Creature cr)
1120{
1121 uint32 mask = 0;
1122 ObjectGuid::LowType spawnId = cr->GetSpawnId();
1123
1124 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1125 {
1126 for (NPCFlagList::iterator itr = _gameEventNPCFlags[*e_itr].begin(); itr != _gameEventNPCFlags[*e_itr].end(); ++ itr)
1127 if (itr->first == spawnId)
1128 mask |= itr->second;
1129 }
1130
1131 return mask;
1132}
std::uint32_t uint32
Definition Define.h:107
ObjectGuid::LowType GetSpawnId() const
Definition Creature.h:65
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)
1701{
1702 // translate the quest to event and condition
1703 QuestIdToEventConditionMap::iterator itr = _questToEventConditions.find(quest_id);
1704 // quest is registered
1705 if (itr != _questToEventConditions.end())
1706 {
1707 uint16 eventId = itr->second.EventId;
1708 uint32 condition = itr->second.Condition;
1709 float num = itr->second.Num;
1710
1711 // the event is not active, so return, don't increase condition finishes
1712 if (!IsActiveEvent(eventId))
1713 return;
1714 // not in correct phase, return
1715 if (_gameEvent[eventId].State != GAMEEVENT_WORLD_CONDITIONS)
1716 return;
1717 GameEventConditionMap::iterator citr = _gameEvent[eventId].Conditions.find(condition);
1718 // condition is registered
1719 if (citr != _gameEvent[eventId].Conditions.end())
1720 {
1721 // increase the done count, only if less then the req
1722 if (citr->second.Done < citr->second.ReqNum)
1723 {
1724 citr->second.Done += num;
1725 // check max limit
1726 if (citr->second.Done > citr->second.ReqNum)
1727 citr->second.Done = citr->second.ReqNum;
1728 // save the change to db
1729 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1730
1732 stmt->SetData(0, uint8(eventId));
1733 stmt->SetData(1, condition);
1734 trans->Append(stmt);
1735
1736 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_CONDITION_SAVE);
1737 stmt->SetData(0, uint8(eventId));
1738 stmt->SetData(1, condition);
1739 stmt->SetData(2, citr->second.Done);
1740 trans->Append(stmt);
1741 CharacterDatabase.CommitTransaction(trans);
1742 // check if all conditions are met, if so, update the event state
1743 if (CheckOneGameEventConditions(eventId))
1744 {
1745 // changed, save to DB the gameevent state
1746 SaveWorldEventStateToDB(eventId);
1747 // force update events to set timer
1748 sWorld->ForceGameEventUpdate();
1749 }
1750 }
1751 }
1752 }
1753}
@ 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:1755
bool IsActiveEvent(uint16 eventId)
Definition GameEventMgr.h:115
QuestIdToEventConditionMap _questToEventConditions
Definition GameEventMgr.h:190
void SaveWorldEventStateToDB(uint16 eventId)
Definition GameEventMgr.cpp:1772
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
1593{
1594 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1595 {
1596 if ((*e_itr) != eventId)
1597 {
1598 int32 internal_event_id = _gameEvent.size() + (*e_itr) - 1;
1599 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++ itr)
1600 if (*itr == creature_guid)
1601 return true;
1602 }
1603 }
1604 return false;
1605}

References _activeEvents, _gameEvent, and GameEventCreatureGuids.

Referenced by GameEventUnspawn().

◆ HasCreatureQuestActiveEventExcept()

bool GameEventMgr::HasCreatureQuestActiveEventExcept ( uint32  quest_id,
uint16  eventId 
)
private
1566{
1567 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1568 {
1569 if ((*e_itr) != eventId)
1570 for (QuestRelList::iterator itr = _gameEventCreatureQuests[*e_itr].begin();
1571 itr != _gameEventCreatureQuests[*e_itr].end();
1572 ++ itr)
1573 if (itr->second == quest_id)
1574 return true;
1575 }
1576 return false;
1577}
GameEventQuestMap _gameEventCreatureQuests
Definition GameEventMgr.h:183

References _activeEvents, and _gameEventCreatureQuests.

Referenced by UpdateEventQuests().

◆ HasGameObjectActiveEventExcept()

bool GameEventMgr::HasGameObjectActiveEventExcept ( ObjectGuid::LowType  go_guid,
uint16  eventId 
)
private
1607{
1608 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1609 {
1610 if ((*e_itr) != eventId)
1611 {
1612 int32 internal_event_id = _gameEvent.size() + (*e_itr) - 1;
1613 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++ itr)
1614 if (*itr == go_guid)
1615 return true;
1616 }
1617 }
1618 return false;
1619}

References _activeEvents, _gameEvent, and GameEventGameobjectGuids.

◆ HasGameObjectQuestActiveEventExcept()

bool GameEventMgr::HasGameObjectQuestActiveEventExcept ( uint32  quest_id,
uint16  eventId 
)
private
1580{
1581 for (ActiveEvents::iterator e_itr = _activeEvents.begin(); e_itr != _activeEvents.end(); ++e_itr)
1582 {
1583 if ((*e_itr) != eventId)
1584 for (QuestRelList::iterator itr = _gameEventGameObjectQuests[*e_itr].begin();
1585 itr != _gameEventGameObjectQuests[*e_itr].end();
1586 ++ itr)
1587 if (itr->second == quest_id)
1588 return true;
1589 }
1590 return false;
1591}
GameEventQuestMap _gameEventGameObjectQuests
Definition GameEventMgr.h:184

References _activeEvents, and _gameEventGameObjectQuests.

Referenced by UpdateEventQuests().

◆ Initialize()

void GameEventMgr::Initialize ( )
1135{
1136 QueryResult result = WorldDatabase.Query("SELECT MAX(eventEntry) FROM game_event");
1137 if (result)
1138 {
1139 Field* fields = result->Fetch();
1140
1141 uint32 maxEventId = fields[0].Get<uint8>();
1142
1143 // Id starts with 1 and vector with 0, thus increment
1144 maxEventId++;
1145
1146 _gameEvent.resize(maxEventId);
1147 GameEventCreatureGuids.resize(maxEventId * 2 - 1);
1148 GameEventGameobjectGuids.resize(maxEventId * 2 - 1);
1149 _gameEventCreatureQuests.resize(maxEventId);
1150 _gameEventGameObjectQuests.resize(maxEventId);
1151 _gameEventVendors.resize(maxEventId);
1152 _gameEventBattlegroundHolidays.resize(maxEventId, 0);
1153 _gameEventPoolIds.resize(maxEventId * 2 - 1);
1154 _gameEventNPCFlags.resize(maxEventId);
1155 _gameEventModelEquip.resize(maxEventId);
1156 }
1157}
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
39{
41 return &instance;
42}
Definition GameEventMgr.h:98
static GameEventMgr * instance()
Definition GameEventMgr.cpp:38

References instance().

Referenced by instance().

◆ IsActiveEvent()

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

References _activeEvents.

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

◆ LoadEventBattlegroundData()

void GameEventMgr::LoadEventBattlegroundData ( )
private
962{
963 LOG_INFO("server.loading", "Loading Game Event Battleground Data...");
964
965 uint32 oldMSTime = getMSTime();
966
968 PreparedQueryResult result = WorldDatabase.Query(stmt);
969
970 if (!result)
971 {
972 LOG_WARN("server.loading", ">> Loaded 0 Battleground Holidays In Game Events. DB table `game_event_battleground_holiday` is empty.");
973 LOG_INFO("server.loading", " ");
974 }
975 else
976 {
977 uint32 count = 0;
978 do
979 {
980 Field* fields = result->Fetch();
981
982 uint16 eventId = fields[0].Get<uint8>();
983
984 if (eventId >= _gameEvent.size())
985 {
986 LOG_ERROR("sql.sql", "`game_event_battleground_holiday` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
987 continue;
988 }
989
990 _gameEventBattlegroundHolidays[eventId] = fields[1].Get<uint32>();
991
992 ++count;
993 } while (result->NextRow());
994
995 LOG_INFO("server.loading", ">> Loaded {} Battleground Holidays In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
996 LOG_INFO("server.loading", " ");
997 }
998}
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
#define LOG_INFO(filterType__,...)
Definition Log.h:165
#define LOG_WARN(filterType__,...)
Definition Log.h:161
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
782{
783 LOG_INFO("server.loading", "Loading Game Event Condition Data...");
784
785 uint32 oldMSTime = getMSTime();
786
788 PreparedQueryResult result = WorldDatabase.Query(stmt);
789
790 if (!result)
791 {
792 LOG_WARN("server.loading", ">> Loaded 0 Conditions In Game Events. DB table `game_event_condition` Is Empty.");
793 LOG_INFO("server.loading", " ");
794 }
795 else
796 {
797 uint32 count = 0;
798 do
799 {
800 Field* fields = result->Fetch();
801
802 uint16 eventId = fields[0].Get<uint8>();
803 uint32 condition = fields[1].Get<uint32>();
804
805 if (eventId >= _gameEvent.size())
806 {
807 LOG_ERROR("sql.sql", "`game_event_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
808 continue;
809 }
810
811 _gameEvent[eventId].Conditions[condition].ReqNum = fields[2].Get<float>();
812 _gameEvent[eventId].Conditions[condition].Done = 0;
813 _gameEvent[eventId].Conditions[condition].MaxWorldState = fields[3].Get<uint16>();
814 _gameEvent[eventId].Conditions[condition].DoneWorldState = fields[4].Get<uint16>();
815
816 ++count;
817 } while (result->NextRow());
818
819 LOG_INFO("server.loading", ">> Loaded {} conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
820 LOG_INFO("server.loading", " ");
821 }
822}
@ WORLD_SEL_GAME_EVENT_CONDITION_DATA
Definition WorldDatabase.h: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
825{
826 LOG_INFO("server.loading", "Loading Game Event Condition Save Data...");
827
828 uint32 oldMSTime = getMSTime();
829
831 PreparedQueryResult result = CharacterDatabase.Query(stmt);
832
833 if (!result)
834 {
835 LOG_WARN("server.loading", ">> Loaded 0 Condition Saves In Game Events. DB Table `game_event_condition_save` Is Empty.");
836 LOG_INFO("server.loading", " ");
837 }
838 else
839 {
840 uint32 count = 0;
841 do
842 {
843 Field* fields = result->Fetch();
844
845 uint16 eventId = fields[0].Get<uint8>();
846 uint32 condition = fields[1].Get<uint32>();
847
848 if (eventId >= _gameEvent.size())
849 {
850 LOG_ERROR("sql.sql", "`game_event_condition_save` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
851 continue;
852 }
853
854 GameEventConditionMap::iterator itr = _gameEvent[eventId].Conditions.find(condition);
855 if (itr != _gameEvent[eventId].Conditions.end())
856 {
857 itr->second.Done = fields[2].Get<float>();
858 }
859 else
860 {
861 LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition evt id {} cond id {}", eventId, condition);
862 continue;
863 }
864
865 ++count;
866 } while (result->NextRow());
867
868 LOG_INFO("server.loading", ">> Loaded {} Condition Saves In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
869 LOG_INFO("server.loading", " ");
870 }
871}
@ CHAR_SEL_GAME_EVENT_CONDITION_SAVE_DATA
Definition CharacterDatabase.h:221

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

Referenced by LoadFromDB().

◆ LoadEventCreatureData()

void GameEventMgr::LoadEventCreatureData ( )
private
493{
494 LOG_INFO("server.loading", "Loading Game Event Creature Data...");
495
496 uint32 oldMSTime = getMSTime();
497
499 PreparedQueryResult result = WorldDatabase.Query(stmt);
500
501 if (!result)
502 {
503 LOG_WARN("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty");
504 LOG_INFO("server.loading", " ");
505 }
506 else
507 {
508 uint32 count = 0;
509 do
510 {
511 Field* fields = result->Fetch();
512
513 ObjectGuid::LowType guid = fields[0].Get<uint32>();
514 int16 eventId = fields[1].Get<int8>();
515
516 CreatureData const* data = sObjectMgr->GetCreatureData(guid);
517 if (!data)
518 {
519 LOG_ERROR("sql.sql", "`game_event_creature` contains creature (GUID: {}) not found in `creature` table.", guid);
520 continue;
521 }
522
523 int32 internal_event_id = _gameEvent.size() + eventId - 1;
524
525 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
526 {
527 LOG_ERROR("sql.sql", "`game_event_creature` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
528 continue;
529 }
530
531 GuidLowList& crelist = GameEventCreatureGuids[internal_event_id];
532 crelist.push_back(guid);
533
534 ++count;
535 } while (result->NextRow());
536
537 LOG_INFO("server.loading", ">> Loaded {} Creatures In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
538 LOG_INFO("server.loading", " ");
539 }
540}
std::int8_t int8
Definition Define.h:105
@ 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
543{
544 LOG_INFO("server.loading", "Loading Game Event GO Data...");
545
546 uint32 oldMSTime = getMSTime();
547
549 PreparedQueryResult result = WorldDatabase.Query(stmt);
550
551 if (!result)
552 {
553 LOG_WARN("server.loading", ">> Loaded 0 gameobjects in game events. DB table `game_event_gameobject` is empty.");
554 LOG_INFO("server.loading", " ");
555 }
556 else
557 {
558 uint32 count = 0;
559 do
560 {
561 Field* fields = result->Fetch();
562
563 ObjectGuid::LowType guid = fields[0].Get<uint32>();
564 int16 eventId = fields[1].Get<int8>();
565
566 int32 internal_event_id = _gameEvent.size() + eventId - 1;
567
568 GameObjectData const* data = sObjectMgr->GetGameObjectData(guid);
569 if (!data)
570 {
571 LOG_ERROR("sql.sql", "`game_event_gameobject` contains gameobject (GUID: {}) not found in `gameobject` table.", guid);
572 continue;
573 }
574
575 if (internal_event_id < 0 || internal_event_id >= int32(GameEventGameobjectGuids.size()))
576 {
577 LOG_ERROR("sql.sql", "`game_event_gameobject` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
578 continue;
579 }
580
581 GuidLowList& golist = GameEventGameobjectGuids[internal_event_id];
582 golist.push_back(guid);
583
584 ++count;
585 } while (result->NextRow());
586
587 LOG_INFO("server.loading", ">> Loaded {} Gameobjects In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
588 LOG_INFO("server.loading", " ");
589 }
590}
@ 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
696{
697 LOG_INFO("server.loading", "Loading Game Event GO Quest Data...");
698
699 uint32 oldMSTime = getMSTime();
700
702 PreparedQueryResult result = WorldDatabase.Query(stmt);
703
704 if (!result)
705 {
706 LOG_WARN("server.loading", ">> Loaded 0 go Quests Additions In Game Events. DB Table `game_event_gameobject_quest` Is Empty.");
707 LOG_INFO("server.loading", " ");
708 }
709 else
710 {
711 uint32 count = 0;
712 do
713 {
714 Field* fields = result->Fetch();
715
716 uint32 id = fields[0].Get<uint32>();
717 uint32 quest = fields[1].Get<uint32>();
718 uint16 eventId = fields[2].Get<uint8>();
719
720 if (eventId >= _gameEventGameObjectQuests.size())
721 {
722 LOG_ERROR("sql.sql", "`game_event_gameobject_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
723 continue;
724 }
725
726 QuestRelList& questlist = _gameEventGameObjectQuests[eventId];
727 questlist.push_back(QuestRelation(id, quest));
728
729 ++count;
730 } while (result->NextRow());
731
732 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
733 LOG_INFO("server.loading", " ");
734 }
735}
@ WORLD_SEL_GAME_EVENT_GAMEOBJECT_QUEST_DATA
Definition WorldDatabase.h: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
593{
594 LOG_INFO("server.loading", "Loading Game Event Model/Equipment Change Data...");
595
596 uint32 oldMSTime = getMSTime();
597
599 PreparedQueryResult result = WorldDatabase.Query(stmt);
600
601 if (!result)
602 {
603 LOG_WARN("server.loading", ">> Loaded 0 Model/Equipment Changes In Game Events. DB Table `game_event_model_equip` Is Empty.");
604 LOG_INFO("server.loading", " ");
605 }
606 else
607 {
608 uint32 count = 0;
609 do
610 {
611 Field* fields = result->Fetch();
612
613 ObjectGuid::LowType guid = fields[0].Get<uint32>();
614 uint32 entry = fields[1].Get<uint32>();
615 uint32 entry2 = fields[2].Get<uint32>();
616 uint32 entry3 = fields[3].Get<uint32>();
617 uint16 eventId = fields[4].Get<uint8>();
618
619 if (eventId >= _gameEventModelEquip.size())
620 {
621 LOG_ERROR("sql.sql", "`game_event_model_equip` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
622 continue;
623 }
624
625 ModelEquipList& equiplist = _gameEventModelEquip[eventId];
626 ModelEquip newModelEquipSet;
627 newModelEquipSet.ModelId = fields[5].Get<uint32>();
628 newModelEquipSet.EquipmentId = fields[6].Get<uint8>();
629 newModelEquipSet.EquipementIdPrev = 0;
630 newModelEquipSet.ModelIdPrev = 0;
631
632 if (newModelEquipSet.EquipmentId > 0)
633 {
634 int8 equipId = static_cast<int8>(newModelEquipSet.EquipmentId);
635 if ((!sObjectMgr->GetEquipmentInfo(entry, equipId)) || (entry2 && !sObjectMgr->GetEquipmentInfo(entry2, equipId)) || (entry3 && !sObjectMgr->GetEquipmentInfo(entry3, equipId)))
636 {
637 LOG_ERROR("sql.sql", "Table `game_event_model_equip` have creature (Guid: {}) with equipment_id {} not found in table `creature_equip_template`, set to no equipment.",
638 guid, newModelEquipSet.EquipmentId);
639 continue;
640 }
641 }
642
643 equiplist.push_back(std::pair<ObjectGuid::LowType, ModelEquip>(guid, newModelEquipSet));
644
645 ++count;
646 } while (result->NextRow());
647
648 LOG_INFO("server.loading", ">> Loaded {} Model/Equipment Changes In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
649 LOG_INFO("server.loading", " ");
650 }
651}
@ 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
874{
875 LOG_INFO("server.loading", "Loading Game Event NPCflag Data...");
876
877 uint32 oldMSTime = getMSTime();
878
880 PreparedQueryResult result = WorldDatabase.Query(stmt);
881
882 if (!result)
883 {
884 LOG_WARN("server.loading", ">> Loaded 0 Npcflags In Game Events. DB Table `game_event_npcflag` Is Empty.");
885 LOG_INFO("server.loading", " ");
886 }
887 else
888 {
889 uint32 count = 0;
890 do
891 {
892 Field* fields = result->Fetch();
893
894 ObjectGuid::LowType guid = fields[0].Get<uint32>();
895 uint16 eventId = fields[1].Get<uint8>();
896 uint32 npcflag = fields[2].Get<uint32>();
897
898 if (eventId >= _gameEvent.size())
899 {
900 LOG_ERROR("sql.sql", "`game_event_npcflag` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
901 continue;
902 }
903
904 _gameEventNPCFlags[eventId].push_back(GuidNPCFlagPair(guid, npcflag));
905
906 ++count;
907 } while (result->NextRow());
908
909 LOG_INFO("server.loading", ">> Loaded {} Npcflags In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
910 LOG_INFO("server.loading", " ");
911 }
912}
@ WORLD_SEL_GAME_EVENT_NPC_FLAGS
Definition WorldDatabase.h: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
1001{
1002 LOG_INFO("server.loading", "Loading Game Event Pool Data...");
1003
1004 uint32 oldMSTime = getMSTime();
1005
1007 PreparedQueryResult result = WorldDatabase.Query(stmt);
1008
1009 if (!result)
1010 {
1011 LOG_WARN("server.loading", ">> Loaded 0 Pools For Game Events. DB Table `game_event_pool` Is Empty.");
1012 LOG_INFO("server.loading", " ");
1013 }
1014 else
1015 {
1016 uint32 count = 0;
1017 do
1018 {
1019 Field* fields = result->Fetch();
1020
1021 uint32 entry = fields[0].Get<uint32>();
1022 int16 eventId = fields[1].Get<int8>();
1023
1024 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1025
1026 if (internal_event_id < 0 || internal_event_id >= int32(_gameEventPoolIds.size()))
1027 {
1028 LOG_ERROR("sql.sql", "`game_event_pool` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
1029 continue;
1030 }
1031
1032 if (!sPoolMgr->CheckPool(entry))
1033 {
1034 LOG_ERROR("sql.sql", "Pool Id ({}) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", entry);
1035 continue;
1036 }
1037
1038 IdList& poollist = _gameEventPoolIds[internal_event_id];
1039 poollist.push_back(entry);
1040
1041 ++count;
1042 } while (result->NextRow());
1043
1044 LOG_INFO("server.loading", ">> Loaded {} Pools For Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1045 LOG_INFO("server.loading", " ");
1046 }
1047}
@ WORLD_SEL_GAME_EVENT_POOL_DATA
Definition WorldDatabase.h: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
440{
441 LOG_INFO("server.loading", "Loading Game Event Prerequisite Data...");
442
443 uint32 oldMSTime = getMSTime();
444
446 PreparedQueryResult result = WorldDatabase.Query(stmt);
447
448 if (!result)
449 {
450 LOG_WARN("server.loading", ">> Loaded 0 Game Rvent Prerequisites in Game Events. DB Table `game_event_prerequisite` Is Empty.");
451 LOG_INFO("server.loading", " ");
452 }
453 else
454 {
455 uint32 count = 0;
456 do
457 {
458 Field* fields = result->Fetch();
459
460 uint16 eventId = fields[0].Get<uint8>();
461
462 if (eventId >= _gameEvent.size())
463 {
464 LOG_ERROR("sql.sql", "`game_event_prerequisite` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
465 continue;
466 }
467
468 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
469 {
470 uint16 prerequisite_event = fields[1].Get<uint32>();
471 if (prerequisite_event >= _gameEvent.size())
472 {
473 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);
474 continue;
475 }
476 _gameEvent[eventId].PrerequisiteEvents.insert(prerequisite_event);
477 }
478 else
479 {
480 LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id {}", eventId);
481 continue;
482 }
483
484 ++count;
485 } while (result->NextRow());
486
487 LOG_INFO("server.loading", ">> Loaded {} game event prerequisites in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
488 LOG_INFO("server.loading", " ");
489 }
490}
@ 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
738{
739 LOG_INFO("server.loading", "Loading Game Event Quest Condition Data...");
740
741 uint32 oldMSTime = getMSTime();
742
744 PreparedQueryResult result = WorldDatabase.Query(stmt);
745
746 if (!result)
747 {
748 LOG_WARN("server.loading", ">> Loaded 0 quest event Conditions In Game Events. DB Table `game_event_quest_condition` Is Empty.");
749 LOG_INFO("server.loading", " ");
750 }
751 else
752 {
753 uint32 count = 0;
754 do
755 {
756 Field* fields = result->Fetch();
757
758 uint32 quest = fields[0].Get<uint32>();
759 uint16 eventId = fields[1].Get<uint8>();
760 uint32 condition = fields[2].Get<uint32>();
761 float num = fields[3].Get<float>();
762
763 if (eventId >= _gameEvent.size())
764 {
765 LOG_ERROR("sql.sql", "`game_event_quest_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
766 continue;
767 }
768
769 _questToEventConditions[quest].EventId = eventId;
770 _questToEventConditions[quest].Condition = condition;
771 _questToEventConditions[quest].Num = num;
772
773 ++count;
774 } while (result->NextRow());
775
776 LOG_INFO("server.loading", ">> Loaded {} quest event conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
777 LOG_INFO("server.loading", " ");
778 }
779}
@ WORLD_SEL_GAME_EVENT_QUEST_CONDITION_DATA
Definition WorldDatabase.h: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
654{
655 LOG_INFO("server.loading", "Loading Game Event Quest Data...");
656
657 uint32 oldMSTime = getMSTime();
658
660 PreparedQueryResult result = WorldDatabase.Query(stmt);
661
662 if (!result)
663 {
664 LOG_WARN("server.loading", ">> Loaded 0 Quests Additions In Game Events. DB Table `game_event_creature_quest` Is Empty.");
665 LOG_INFO("server.loading", " ");
666 }
667 else
668 {
669 uint32 count = 0;
670 do
671 {
672 Field* fields = result->Fetch();
673
674 uint32 id = fields[0].Get<uint32>();
675 uint32 quest = fields[1].Get<uint32>();
676 uint16 eventId = fields[2].Get<uint8>();
677
678 if (eventId >= _gameEventCreatureQuests.size())
679 {
680 LOG_ERROR("sql.sql", "`game_event_creature_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
681 continue;
682 }
683
684 QuestRelList& questlist = _gameEventCreatureQuests[eventId];
685 questlist.push_back(QuestRelation(id, quest));
686
687 ++count;
688 } while (result->NextRow());
689
690 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
691 LOG_INFO("server.loading", " ");
692 }
693}
@ WORLD_SEL_GAME_EVENT_QUEST_DATA
Definition WorldDatabase.h: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
326{
327 LOG_INFO("server.loading", "Loading Game Events...");
328 uint32 oldMSTime = getMSTime();
330 PreparedQueryResult result = WorldDatabase.Query(stmt);
331
332 if (!result)
333 {
334 _gameEvent.clear();
335 LOG_WARN("server.loading", ">> Loaded 0 game events. DB table `game_event` is empty.");
336 LOG_INFO("server.loading", " ");
337 return;
338 }
339
340 uint32 count = 0;
341 do
342 {
343 Field* fields = result->Fetch();
344
345 uint8 eventId = fields[0].Get<uint8>();
346 if (eventId == 0)
347 {
348 LOG_ERROR("sql.sql", "`game_event` game event entry 0 is reserved and can't be used.");
349 continue;
350 }
351
352 GameEventData& pGameEvent = _gameEvent[eventId];
353 pGameEvent.EventId = fields[0].Get<uint32>();
354 uint64 starttime = fields[1].Get<uint64>();
355 pGameEvent.Start = time_t(starttime);
356 uint64 endtime = fields[2].Get<uint64>();
357 if (fields[2].IsNull())
358 endtime = GameTime::GetGameTime().count() + 63072000; // add 2 years to current date
359 pGameEvent.End = time_t(endtime);
360 pGameEvent.Occurence = fields[3].Get<uint64>();
361 pGameEvent.Length = fields[4].Get<uint64>();
362 pGameEvent.HolidayId = HolidayIds(fields[5].Get<uint32>());
363 pGameEvent.HolidayStage = fields[6].Get<uint8>();
364 pGameEvent.Description = fields[7].Get<std::string>();
365 pGameEvent.State = (GameEventState)(fields[8].Get<uint8>());
366 pGameEvent.Announce = fields[9].Get<uint8>();
367 pGameEvent.NextStart = 0;
368
369 ++count;
370
371 if (pGameEvent.Length == 0 && pGameEvent.State == GAMEEVENT_NORMAL) // length>0 is validity check
372 {
373 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);
374 continue;
375 }
376
377 if (pGameEvent.HolidayId != HOLIDAY_NONE)
378 {
379 if (!sHolidaysStore.LookupEntry(pGameEvent.HolidayId))
380 {
381 LOG_ERROR("sql.sql", "`game_event` game event id ({}) have not existed holiday id {}.", eventId, pGameEvent.HolidayId);
382 pGameEvent.HolidayId = HOLIDAY_NONE;
383 }
384
385 SetHolidayEventTime(pGameEvent);
386 }
387 } while (result->NextRow());
388
389 LOG_INFO("server.loading", ">> Loaded {} Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
390 LOG_INFO("server.loading", " ");
391}
DBCStorage< HolidaysEntry > sHolidaysStore(Holidaysfmt)
std::uint64_t uint64
Definition Define.h:106
GameEventState
Definition GameEventMgr.h:30
HolidayIds
Definition SharedDefines.h:2741
@ HOLIDAY_NONE
Definition SharedDefines.h:2742
@ WORLD_SEL_GAME_EVENTS
Definition WorldDatabase.h:93
void SetHolidayEventTime(GameEventData &event)
Definition GameEventMgr.cpp:1839
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
394{
395 uint32 oldMSTime = getMSTime();
396 LOG_INFO("server.loading", "Loading Game Event Saves Data...");
398 PreparedQueryResult result = CharacterDatabase.Query(stmt);
399
400 if (!result)
401 {
402 LOG_WARN("server.loading", ">> Loaded 0 Game Event Saves In Game Events. DB Table `game_event_save` Is Empty.");
403 LOG_INFO("server.loading", " ");
404 }
405 else
406 {
407 uint32 count = 0;
408 do
409 {
410 Field* fields = result->Fetch();
411
412 uint8 eventId = fields[0].Get<uint8>();
413
414 if (eventId >= _gameEvent.size())
415 {
416 LOG_ERROR("sql.sql", "`game_event_save` game event entry ({}) is out of range compared to max event entry in `game_event`", eventId);
417 continue;
418 }
419
420 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
421 {
422 _gameEvent[eventId].State = (GameEventState)(fields[1].Get<uint8>());
423 _gameEvent[eventId].NextStart = time_t(fields[2].Get<uint32>());
424 }
425 else
426 {
427 LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id {}", eventId);
428 continue;
429 }
430
431 ++count;
432 } while (result->NextRow());
433
434 LOG_INFO("server.loading", ">> Loaded {} Game Event Saves In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
435 LOG_INFO("server.loading", " ");
436 }
437}
@ CHAR_SEL_GAME_EVENT_SAVE_DATA
Definition CharacterDatabase.h:222

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

Referenced by LoadFromDB().

◆ LoadEventSeasonalQuestRelations()

void GameEventMgr::LoadEventSeasonalQuestRelations ( )
private
Todo:
: Change to uint8
915{
916 LOG_INFO("server.loading", "Loading Game Event Seasonal Quest Relations...");
917 uint32 oldMSTime = getMSTime();
918
920 PreparedQueryResult result = WorldDatabase.Query(stmt);
921
922 if (!result)
923 {
924 LOG_WARN("server.loading", ">> Loaded 0 Seasonal Quests Additions In Game Events. DB Table `game_event_seasonal_questrelation` Is Empty.");
925 LOG_INFO("server.loading", " ");
926 }
927 else
928 {
929 uint32 count = 0;
930 do
931 {
932 Field* fields = result->Fetch();
933
934 uint32 questId = fields[0].Get<uint32>();
935 uint32 eventEntry = fields[1].Get<uint32>();
936
937 Quest* questTemplate = const_cast<Quest*>(sObjectMgr->GetQuestTemplate(questId));
938
939 if (!questTemplate)
940 {
941 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` quest id ({}) does not exist in `quest_template`", questId);
942 continue;
943 }
944
945 if (eventEntry >= _gameEvent.size())
946 {
947 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` event id ({}) is out of range compared to max event in `game_event`", eventEntry);
948 continue;
949 }
950
951 questTemplate->SetEventIdForQuest((uint16)eventEntry);
952 _gameEventSeasonalQuestsMap[eventEntry].push_back(questId);
953 ++count;
954 } while (result->NextRow());
955
956 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
957 LOG_INFO("server.loading", " ");
958 }
959}
@ WORLD_SEL_GAME_EVENT_QUEST_SEASONAL_RELATIONS
Definition WorldDatabase.h: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 ( )
239{
240 LOG_INFO("server.loading", "Loading Game Event Vendor Additions Data...");
241 uint32 oldMSTime = getMSTime();
243 PreparedQueryResult result = WorldDatabase.Query(stmt);
244
245 if (!result)
246 {
247 LOG_WARN("server.loading", ">> Loaded 0 Vendor Additions In Game Events. DB Table `game_event_npc_vendor` Is Empty.");
248 LOG_INFO("server.loading", " ");
249 return;
250 }
251
252 uint32 count = 0;
253 std::unordered_set<uint8> processedEvents;
254
255 do
256 {
257 Field* fields = result->Fetch();
258 uint8 eventId = fields[0].Get<uint8>();
259 ObjectGuid::LowType guid = fields[1].Get<uint32>();
260
261 if (eventId >= _gameEventVendors.size())
262 {
263 LOG_ERROR("sql.sql", "Table `game_event_npc_vendor` has invalid eventEntry ({}) for GUID ({}), skipped.", eventId, guid);
264 continue;
265 }
266
267 // Clear existing vendors for this event only once
268 if (processedEvents.find(eventId) == processedEvents.end())
269 {
270 // Remove vendor items from in-memory data
271 for (auto& entry : _gameEventVendors[eventId])
272 {
273 sObjectMgr->RemoveVendorItem(entry.Entry, entry.Item, false);
274 }
275 _gameEventVendors[eventId].clear();
276 processedEvents.insert(eventId);
277 }
278
279 NPCVendorList& vendors = _gameEventVendors[eventId];
280 NPCVendorEntry newEntry;
281 newEntry.Item = fields[2].Get<uint32>();
282 newEntry.MaxCount = fields[3].Get<uint32>();
283 newEntry.Incrtime = fields[4].Get<uint32>();
284 newEntry.ExtendedCost = fields[5].Get<uint32>();
285
286 // Get the event NPC flag for validity check
287 uint32 event_npc_flag = 0;
288 NPCFlagList& flist = _gameEventNPCFlags[eventId];
289 for (NPCFlagList::const_iterator itr = flist.begin(); itr != flist.end(); ++itr)
290 {
291 if (itr->first == guid)
292 {
293 event_npc_flag = itr->second;
294 break;
295 }
296 }
297
298 // Get creature entry
299 newEntry.Entry = 0;
300 if (CreatureData const* data = sObjectMgr->GetCreatureData(guid))
301 newEntry.Entry = data->id1;
302
303 // Validate vendor item
304 if (!sObjectMgr->IsVendorItemValid(newEntry.Entry, newEntry.Item, newEntry.MaxCount, newEntry.Incrtime, newEntry.ExtendedCost, nullptr, nullptr, event_npc_flag))
305 {
306 LOG_ERROR("sql.sql", "Table `game_event_npc_vendor` has invalid item ({}) for guid ({}) for event ({}), skipped.",
307 newEntry.Item, newEntry.Entry, eventId);
308 continue;
309 }
310
311 // Add the item to the vendor if event is active
312 if (IsEventActive(eventId))
313 sObjectMgr->AddVendorItem(newEntry.Entry, newEntry.Item, newEntry.MaxCount, newEntry.Incrtime, newEntry.ExtendedCost, false);
314
315 vendors.push_back(newEntry);
316
317 ++count;
318 } while (result->NextRow());
319
320 LOG_INFO("server.loading", ">> Loaded {} Vendor Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
321 LOG_INFO("server.loading", " ");
322
323}
bool IsEventActive(uint16 eventId)
Definition GameEventMgr.cpp:1964
@ WORLD_SEL_GAME_EVENT_NPC_VENDOR
Definition WorldDatabase.h:110
std::list< GuidNPCFlagPair > NPCFlagList
Definition GameEventMgr.h:179
std::list< NPCVendorEntry > NPCVendorList
Definition GameEventMgr.h:175
Definition GameEventMgr.h:85
int32 MaxCount
Definition GameEventMgr.h:88
uint32 Incrtime
Definition GameEventMgr.h:89
uint32 Item
Definition GameEventMgr.h:87
uint32 ExtendedCost
Definition GameEventMgr.h:90
uint32 Entry
Definition GameEventMgr.h:86

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

Referenced by LoadFromDB().

◆ LoadFromDB()

void GameEventMgr::LoadFromDB ( )
1050{
1051 // The order of these functions matter. Do not change
1052 LoadEvents();
1068}
void LoadEventConditionData()
Definition GameEventMgr.cpp:781
void LoadEventCreatureData()
Definition GameEventMgr.cpp:492
void LoadEventSeasonalQuestRelations()
Definition GameEventMgr.cpp:914
void LoadEventQuestData()
Definition GameEventMgr.cpp:653
void LoadEventPoolData()
Definition GameEventMgr.cpp:1000
void LoadEventGameObjectQuestData()
Definition GameEventMgr.cpp:695
void LoadEventSaveData()
Definition GameEventMgr.cpp:393
void LoadEventNPCFlags()
Definition GameEventMgr.cpp:873
void LoadEventQuestConditionData()
Definition GameEventMgr.cpp:737
void LoadEventModelEquipmentChangeData()
Definition GameEventMgr.cpp:592
void LoadEventPrerequisiteData()
Definition GameEventMgr.cpp:439
void LoadEventVendors()
Definition GameEventMgr.cpp:238
void LoadEventGameObjectData()
Definition GameEventMgr.cpp:542
void LoadEvents()
Definition GameEventMgr.cpp:325
void LoadEventBattlegroundData()
Definition GameEventMgr.cpp:961
void LoadEventConditionSaveData()
Definition GameEventMgr.cpp:824

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

◆ LoadHolidayDates()

void GameEventMgr::LoadHolidayDates ( )
1071{
1072 uint32 oldMSTime = getMSTime();
1073
1075 PreparedQueryResult result = WorldDatabase.Query(stmt);
1076
1077 if (!result)
1078 {
1079 LOG_WARN("server.loading", ">> Loaded 0 holiday dates. DB table `holiday_dates` is empty.");
1080 return;
1081 }
1082
1083 uint32 count = 0;
1084 do
1085 {
1086 Field* fields = result->Fetch();
1087
1088 uint32 holidayId = fields[0].Get<uint32>();
1089 HolidaysEntry* entry = const_cast<HolidaysEntry*>(sHolidaysStore.LookupEntry(holidayId));
1090 if (!entry)
1091 {
1092 LOG_ERROR("sql.sql", "holiday_dates entry has invalid holiday id {}.", holidayId);
1093 continue;
1094 }
1095
1096 uint8 dateId = fields[1].Get<uint8>();
1097 if (dateId >= MAX_HOLIDAY_DATES)
1098 {
1099 LOG_ERROR("sql.sql", "holiday_dates entry has out of range date_id {}.", dateId);
1100 continue;
1101 }
1102 entry->Date[dateId] = fields[2].Get<uint32>();
1103
1104 if (uint32 duration = fields[3].Get<uint32>())
1105 entry->Duration[0] = duration;
1106
1107 auto itr = std::lower_bound(ModifiedHolidays.begin(), ModifiedHolidays.end(), entry->Id);
1108 if (itr == ModifiedHolidays.end() || *itr != entry->Id)
1109 {
1110 ModifiedHolidays.insert(itr, entry->Id);
1111 }
1112
1113 ++count;
1114 } while (result->NextRow());
1115
1116 LOG_INFO("server.loading", ">> Loaded {} Holiday Dates in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1117}
#define MAX_HOLIDAY_DATES
Definition DBCStructure.h:1119
@ WORLD_SEL_GAME_EVENT_HOLIDAY_DATES
Definition WorldDatabase.h:107
std::vector< uint32 > ModifiedHolidays
Definition GameEventMgr.h:198
Definition DBCStructure.h:1123

References Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, MAX_HOLIDAY_DATES, ModifiedHolidays, sHolidaysStore, WORLD_SEL_GAME_EVENT_HOLIDAY_DATES, and WorldDatabase.

◆ NextCheck()

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

1828{
1831 sMapMgr->DoForAllMaps([eventId, activate](Map* map)
1832 {
1833 GameEventAIHookWorker worker(eventId, activate);
1835 visitor.Visit(map->GetObjectsStore());
1836 });
1837}
Definition GameEventMgr.cpp:1801
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:364
Definition TypeContainerVisitor.h:84

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

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ SaveWorldEventStateToDB()

void GameEventMgr::SaveWorldEventStateToDB ( uint16  eventId)
private
1773{
1774 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1775
1777 stmt->SetData(0, uint8(eventId));
1778 trans->Append(stmt);
1779
1780 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_SAVE);
1781 stmt->SetData(0, uint8(eventId));
1782 stmt->SetData(1, _gameEvent[eventId].State);
1783 stmt->SetData(2, _gameEvent[eventId].NextStart ? uint32(_gameEvent[eventId].NextStart) : 0);
1784 trans->Append(stmt);
1785 CharacterDatabase.CommitTransaction(trans);
1786}
@ 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
1789{
1790 GameEventConditionMap::const_iterator itr;
1791 for (itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1792 {
1793 if (itr->second.DoneWorldState)
1794 player->SendUpdateWorldState(itr->second.DoneWorldState, (uint32)(itr->second.Done));
1795 if (itr->second.MaxWorldState)
1796 player->SendUpdateWorldState(itr->second.MaxWorldState, (uint32)(itr->second.ReqNum));
1797 }
1798}
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition PlayerUpdates.cpp:2243

References _gameEvent, and Player::SendUpdateWorldState().

◆ SetHolidayEventTime()

void GameEventMgr::SetHolidayEventTime ( GameEventData event)
private
1840{
1841 if (!event.HolidayStage) // Ignore holiday
1842 return;
1843
1844 HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(event.HolidayId);
1845
1846 if (!holiday->Date[0] || !holiday->Duration[0]) // Invalid definitions
1847 {
1848 LOG_ERROR("sql.sql", "Missing date or duration for holiday {}.", event.HolidayId);
1849 return;
1850 }
1851
1852 uint8 stageIndex = event.HolidayStage - 1;
1853 event.Length = holiday->Duration[stageIndex] * HOUR / MINUTE;
1854
1855 time_t stageOffset = 0;
1856 for (uint8 i = 0; i < stageIndex; ++i)
1857 {
1858 stageOffset += holiday->Duration[i] * HOUR;
1859 }
1860
1861 switch (holiday->CalendarFilterType)
1862 {
1863 case -1: // Yearly
1864 event.Occurence = YEAR / MINUTE; // Not all too useful
1865 break;
1866 case 0: // Weekly
1867 event.Occurence = WEEK / MINUTE;
1868 break;
1869 case 1: // Defined dates only (Darkmoon Faire)
1870 break;
1871 case 2: // Only used for looping events (Call to Arms)
1872 break;
1873 }
1874
1875 if (holiday->Looping)
1876 {
1877 event.Occurence = 0;
1878 for (uint8 i = 0; i < MAX_HOLIDAY_DURATIONS && holiday->Duration[i]; ++i)
1879 {
1880 event.Occurence += holiday->Duration[i] * HOUR / MINUTE;
1881 }
1882 }
1883
1884 bool singleDate = ((holiday->Date[0] >> 24) & 0x1F) == 31; // Events with fixed date within year have - 1
1885
1886 time_t curTime = GameTime::GetGameTime().count();
1887 for (uint8 i = 0; i < MAX_HOLIDAY_DATES && holiday->Date[i]; ++i)
1888
1889 {
1890 uint32 date = holiday->Date[i];
1891
1892 tm timeInfo;
1893 if (singleDate)
1894 {
1895 timeInfo = Acore::Time::TimeBreakdown(curTime);
1896 timeInfo.tm_year -= 1; // First try last year (event active through New Year)
1897 }
1898 else
1899 {
1900 timeInfo.tm_year = ((date >> 24) & 0x1F) + 100;
1901 }
1902
1903 timeInfo.tm_mon = (date >> 20) & 0xF;
1904 timeInfo.tm_mday = ((date >> 14) & 0x3F) + 1;
1905 timeInfo.tm_hour = (date >> 6) & 0x1F;
1906 timeInfo.tm_min = date & 0x3F;
1907 timeInfo.tm_sec = 0;
1908 timeInfo.tm_isdst = -1;
1909
1910 // try to get next start time (skip past dates)
1911 time_t startTime = mktime(&timeInfo);
1912 if (curTime < startTime + event.Length * MINUTE)
1913 {
1914 event.Start = startTime + stageOffset;
1915 break;
1916 }
1917 else if (singleDate)
1918 {
1919 tm tmCopy = Acore::Time::TimeBreakdown(curTime);
1920 int year = tmCopy.tm_year; // This year
1921 tmCopy = timeInfo;
1922 tmCopy.tm_year = year;
1923 event.Start = mktime(&tmCopy) + stageOffset;
1924 break;
1925 }
1926 else
1927 {
1928 // date is due and not a singleDate event, try with next DBC date (modified by holiday_dates)
1929 // if none is found we don't modify start date and use the one in game_event
1930 }
1931 }
1932}
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:1118
AC_COMMON_API std::tm TimeBreakdown(time_t t=0)
Definition Timer.cpp:233
int32 CalendarFilterType
Definition DBCStructure.h:1134
uint32 Duration[MAX_HOLIDAY_DURATIONS]
Definition DBCStructure.h:1125
uint32 Date[MAX_HOLIDAY_DATES]
Definition DBCStructure.h:1126
uint32 Looping
Definition DBCStructure.h:1128

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

Referenced by StartInternalEvent(), and Update().

◆ StartInternalEvent()

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

References _activeEvents, _gameEvent, and StartEvent().

◆ StartSystem()

uint32 GameEventMgr::StartSystem ( )
1160{
1161 _activeEvents.clear();
1162 uint32 delay = Update();
1163 _isSystemInit = true;
1164 return delay;
1165}
uint32 Update()
Definition GameEventMgr.cpp:1167

References _activeEvents, _isSystemInit, and Update().

◆ StopEvent()

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

Referenced by Update().

◆ UnApplyEvent()

void GameEventMgr::UnApplyEvent ( uint16  eventId)
private

Run SAI scripts with SMART_EVENT_GAME_EVENT_END

1247{
1248 LOG_DEBUG("gameevent", "GameEvent {} \"{}\" removed.", eventId, _gameEvent[eventId].Description);
1250 RunSmartAIScripts(eventId, false);
1251 // un-spawn positive event tagged objects
1252 GameEventUnspawn(eventId);
1253 // spawn negative event tagget objects
1254 int16 numEventId = (-1) * eventId;
1255 GameEventSpawn(numEventId);
1256 // restore equipment or model
1257 ChangeEquipOrModel(eventId, false);
1258 // Remove quests that are events only to non event npc
1259 UpdateEventQuests(eventId, false);
1260 UpdateWorldStates(eventId, false);
1261 // update npcflags in this event
1262 UpdateEventNPCFlags(eventId);
1263 // remove vendor items
1264 UpdateEventNPCVendor(eventId, false);
1265 // update bg holiday
1267}

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

Referenced by StopEvent().

◆ Update()

uint32 GameEventMgr::Update ( )
1168{
1169 time_t currenttime = GameTime::GetGameTime().count();
1170 uint32 nextEventDelay = max_ge_check_delay; // 1 day
1171 uint32 calcDelay;
1172 std::set<uint16> activate, deactivate;
1173 for (uint16 itr = 1; itr < _gameEvent.size(); ++itr)
1174 {
1175 // must do the activating first, and after that the deactivating
1176 // so first queue it
1177 //LOG_ERROR("sql.sql", "Checking event {}", itr);
1178
1179 sScriptMgr->OnGameEventCheck(itr);
1180
1181 if (CheckOneGameEvent(itr))
1182 {
1183 // if the world event is in NEXTPHASE state, and the time has passed to finish this event, then do so
1184 if (_gameEvent[itr].State == GAMEEVENT_WORLD_NEXTPHASE && _gameEvent[itr].NextStart <= currenttime)
1185 {
1186 // set this event to finished, null the nextstart time
1188 _gameEvent[itr].NextStart = 0;
1189 // save the state of this gameevent
1191 // queue for deactivation
1192 if (IsActiveEvent(itr))
1193 deactivate.insert(itr);
1194 // go to next event, this no longer needs an event update timer
1195 continue;
1196 }
1198 // changed, save to DB the gameevent state, will be updated in next update cycle
1200
1201 // queue for activation
1202 if (!IsActiveEvent(itr))
1203 activate.insert(itr);
1204 }
1205 else
1206 {
1207 // If event is inactive, periodically clean up its worldstate
1208 sWorld->setWorldState(itr, 0);
1209
1210 if (IsActiveEvent(itr))
1211 {
1212 // Xinef: do not deactivate internal events on whim
1213 if (_gameEvent[itr].State != GAMEEVENT_INTERNAL)
1214 deactivate.insert(itr);
1215 }
1216 else
1217 {
1218 if (!_isSystemInit)
1219 {
1220 int16 event_nid = (-1) * (itr);
1221 // spawn all negative ones for this event
1222 GameEventSpawn(event_nid);
1223 }
1224 }
1225 }
1226 calcDelay = NextCheck(itr);
1227 if (calcDelay < nextEventDelay)
1228 nextEventDelay = calcDelay;
1229 }
1230 // now activate the queue
1231 // a now activated event can contain a spawn of a to-be-deactivated one
1232 // following the activate - deactivate order, deactivating the first event later will leave the spawn in (wont disappear then reappear clientside)
1233 for (std::set<uint16>::iterator itr = activate.begin(); itr != activate.end(); ++itr)
1234 // start the event
1235 // returns true the started event completed
1236 // in that case, initiate next update in 1 second
1237 if (StartEvent(*itr))
1238 nextEventDelay = 0;
1239 for (std::set<uint16>::iterator itr = deactivate.begin(); itr != deactivate.end(); ++itr)
1240 StopEvent(*itr);
1241
1242 LOG_DEBUG("gameevent", "Next game event check in {} seconds.", nextEventDelay + 1);
1243 return (nextEventDelay + 1) * IN_MILLISECONDS; // Add 1 second to be sure event has started/stopped at next call
1244}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
uint32 NextCheck(uint16 entry) const
Definition GameEventMgr.cpp:82
bool CheckOneGameEvent(uint16 entry) const
Definition GameEventMgr.cpp:44
void StopEvent(uint16 event_id, bool overwrite=false)
Definition GameEventMgr.cpp:192

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 sWorld.

Referenced by StartSystem().

◆ UpdateBattlegroundSettings()

void GameEventMgr::UpdateBattlegroundSettings ( )
private
1341{
1342 uint32 mask = 0;
1343 for (ActiveEvents::const_iterator itr = _activeEvents.begin(); itr != _activeEvents.end(); ++itr)
1344 mask |= _gameEventBattlegroundHolidays[*itr];
1345 sBattlegroundMgr->SetHolidayWeekends(mask);
1346}
#define sBattlegroundMgr
Definition BattlegroundMgr.h:187

References _activeEvents, _gameEventBattlegroundHolidays, and sBattlegroundMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventNPCFlags()

void GameEventMgr::UpdateEventNPCFlags ( uint16  eventId)
private
1306{
1307 std::unordered_map<uint32, std::unordered_set<ObjectGuid::LowType>> creaturesByMap;
1308
1309 // go through the creatures whose npcflags are changed in the event
1310 for (NPCFlagList::iterator itr = _gameEventNPCFlags[eventId].begin(); itr != _gameEventNPCFlags[eventId].end(); ++itr)
1311 {
1312 // get the creature data from the low guid to get the entry, to be able to find out the whole guid
1313 if (CreatureData const* data = sObjectMgr->GetCreatureData(itr->first))
1314 creaturesByMap[data->mapid].insert(itr->first);
1315 }
1316
1317 for (auto const& p : creaturesByMap)
1318 {
1319 sMapMgr->DoForAllMapsWithMapId(p.first, [this, &p](Map* map)
1320 {
1321 for (auto& spawnId : p.second)
1322 {
1323 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(spawnId);
1324 for (auto itr = creatureBounds.first; itr != creatureBounds.second; ++itr)
1325 {
1326 Creature* creature = itr->second;
1327 uint32 npcflag = GetNPCFlag(creature);
1328 if (CreatureTemplate const* creatureTemplate = creature->GetCreatureTemplate())
1329 npcflag |= creatureTemplate->npcflag;
1330
1331 creature->ReplaceAllNpcFlags(NPCFlags(npcflag));
1332 // reset gossip options, since the flag change might have added / removed some
1333 //cr->ResetGossipOptions();
1334 }
1335 }
1336 });
1337 }
1338}

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
1349{
1350 for (NPCVendorList::iterator itr = _gameEventVendors[eventId].begin(); itr != _gameEventVendors[eventId].end(); ++itr)
1351 {
1352 if (activate)
1353 sObjectMgr->AddVendorItem(itr->Entry, itr->Item, itr->MaxCount, itr->Incrtime, itr->ExtendedCost, false);
1354 else
1355 sObjectMgr->RemoveVendorItem(itr->Entry, itr->Item, false);
1356 }
1357}

References _gameEventVendors, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventQuests()

void GameEventMgr::UpdateEventQuests ( uint16  eventId,
bool  activate 
)
private
1622{
1623 QuestRelList::iterator itr;
1624 for (itr = _gameEventCreatureQuests[eventId].begin(); itr != _gameEventCreatureQuests[eventId].end(); ++itr)
1625 {
1626 QuestRelations* CreatureQuestMap = sObjectMgr->GetCreatureQuestRelationMap();
1627 if (activate) // Add the pair(id, quest) to the multimap
1628 CreatureQuestMap->insert(QuestRelations::value_type(itr->first, itr->second));
1629 else
1630 {
1631 if (!HasCreatureQuestActiveEventExcept(itr->second, eventId))
1632 {
1633 // Remove the pair(id, quest) from the multimap
1634 QuestRelations::iterator qitr = CreatureQuestMap->find(itr->first);
1635 if (qitr == CreatureQuestMap->end())
1636 continue;
1637 QuestRelations::iterator lastElement = CreatureQuestMap->upper_bound(itr->first);
1638 for (; qitr != lastElement; ++qitr)
1639 {
1640 if (qitr->second == itr->second)
1641 {
1642 CreatureQuestMap->erase(qitr); // iterator is now no more valid
1643 break; // but we can exit loop since the element is found
1644 }
1645 }
1646 }
1647 }
1648 }
1649 for (itr = _gameEventGameObjectQuests[eventId].begin(); itr != _gameEventGameObjectQuests[eventId].end(); ++itr)
1650 {
1651 QuestRelations* GameObjectQuestMap = sObjectMgr->GetGOQuestRelationMap();
1652 if (activate) // Add the pair(id, quest) to the multimap
1653 GameObjectQuestMap->insert(QuestRelations::value_type(itr->first, itr->second));
1654 else
1655 {
1656 if (!HasGameObjectQuestActiveEventExcept(itr->second, eventId))
1657 {
1658 // Remove the pair(id, quest) from the multimap
1659 QuestRelations::iterator qitr = GameObjectQuestMap->find(itr->first);
1660 if (qitr == GameObjectQuestMap->end())
1661 continue;
1662 QuestRelations::iterator lastElement = GameObjectQuestMap->upper_bound(itr->first);
1663 for (; qitr != lastElement; ++qitr)
1664 {
1665 if (qitr->second == itr->second)
1666 {
1667 GameObjectQuestMap->erase(qitr); // iterator is now no more valid
1668 break; // but we can exit loop since the element is found
1669 }
1670 }
1671 }
1672 }
1673 }
1674}
std::multimap< uint32, uint32 > QuestRelations
Definition ObjectMgr.h:524
bool HasCreatureQuestActiveEventExcept(uint32 quest_id, uint16 eventId)
Definition GameEventMgr.cpp:1565
bool HasGameObjectQuestActiveEventExcept(uint32 quest_id, uint16 eventId)
Definition GameEventMgr.cpp:1579

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

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateWorldStates()

void GameEventMgr::UpdateWorldStates ( uint16  eventId,
bool  Activate 
)
private
1677{
1678 GameEventData const& event = _gameEvent[eventId];
1679 if (event.HolidayId != HOLIDAY_NONE)
1680 {
1682 if (bgTypeId != BATTLEGROUND_TYPE_NONE)
1683 {
1684 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId);
1685 if (bl && bl->HolidayWorldStateId)
1686 {
1688 worldstate.VariableID = bl->HolidayWorldStateId;
1689 worldstate.Value = Activate ? 1 : 0;
1690 sWorldSessionMgr->SendGlobalMessage(worldstate.Write());
1691 }
1692 }
1693 }
1694}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
BattlegroundTypeId
Definition SharedDefines.h:3479
@ BATTLEGROUND_TYPE_NONE
Definition SharedDefines.h:3480
#define sWorldSessionMgr
Definition WorldSessionMgr.h:110
static BattlegroundTypeId WeekendHolidayIdToBGType(HolidayIds holiday)
Definition BattlegroundMgr.cpp:888
Definition WorldStatePackets.h:50
int32 Value
Definition WorldStatePackets.h:57
WorldPacket const * Write() override
Definition WorldStatePackets.cpp:40
int32 VariableID
Definition WorldStatePackets.h:56
Definition DBCStructure.h:603
uint32 HolidayWorldStateId
Definition DBCStructure.h:611

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: