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

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

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

Referenced by StartEvent().

◆ ChangeEquipOrModel()

void GameEventMgr::ChangeEquipOrModel ( int16  eventId,
bool  activate 
)
private
1510{
1511 for (ModelEquipList::iterator itr = _gameEventModelEquip[eventId].begin(); itr != _gameEventModelEquip[eventId].end(); ++itr)
1512 {
1513 // Remove the creature from grid
1514 CreatureData const* data = sObjectMgr->GetCreatureData(itr->first);
1515 if (!data)
1516 continue;
1517
1518 // Update if spawned
1519 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr, activate](Map* map)
1520 {
1521 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(itr->first);
1522 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second; ++itr2)
1523 {
1524 Creature* creature = itr2->second;
1525 if (activate)
1526 {
1527 itr->second.EquipementIdPrev = creature->GetCurrentEquipmentId();
1528 itr->second.ModelIdPrev = creature->GetDisplayId();
1529 creature->LoadEquipment(itr->second.EquipmentId, true);
1530 if (itr->second.ModelId > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelId))
1531 {
1532 creature->SetDisplayId(itr->second.ModelId);
1533 creature->SetNativeDisplayId(itr->second.ModelId);
1534 }
1535 }
1536 else
1537 {
1538 creature->LoadEquipment(itr->second.EquipementIdPrev, true);
1539 if (itr->second.ModelIdPrev > 0 && itr->second.ModelIdPrev != itr->second.ModelId && sObjectMgr->GetCreatureModelInfo(itr->second.ModelIdPrev))
1540 {
1541 creature->SetDisplayId(itr->second.ModelIdPrev);
1542 creature->SetNativeDisplayId(itr->second.ModelIdPrev);
1543 }
1544 }
1545 }
1546 });
1547
1548 // now last step: put in data
1549 // just to have write access to it
1550 CreatureData& data2 = sObjectMgr->NewOrExistCreatureData(itr->first);
1551 if (activate)
1552 {
1553 itr->second.ModelIdPrev = data2.displayid;
1554 itr->second.EquipementIdPrev = data2.equipmentId;
1555 data2.displayid = itr->second.ModelId;
1556 data2.equipmentId = itr->second.EquipmentId;
1557 }
1558 else
1559 {
1560 data2.displayid = itr->second.ModelIdPrev;
1561 data2.equipmentId = itr->second.EquipementIdPrev;
1562 }
1563 }
1564}
#define sMapMgr
Definition MapMgr.h:220
#define sObjectMgr
Definition ObjectMgr.h:1650
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
46{
47 switch (_gameEvent[entry].State)
48 {
49 default:
51 {
52 time_t currenttime = GameTime::GetGameTime().count();
53 // Get the event information
54 return _gameEvent[entry].Start < currenttime
55 && currenttime < _gameEvent[entry].End
56 && (currenttime - _gameEvent[entry].Start) % (_gameEvent[entry].Occurence * MINUTE) < _gameEvent[entry].Length * MINUTE;
57 }
58 // if the state is conditions or nextphase, then the event should be active
61 return true;
62 // finished world events are inactive
65 return false;
66 // if inactive world event, check the prerequisite events
68 {
69 time_t currenttime = GameTime::GetGameTime().count();
70 for (std::set<uint16>::const_iterator itr = _gameEvent[entry].PrerequisiteEvents.begin(); itr != _gameEvent[entry].PrerequisiteEvents.end(); ++itr)
71 {
72 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
73 _gameEvent[*itr].NextStart > currenttime) // if not in nextphase state for long enough, can't start this one
74 return false;
75 }
76 // all prerequisite events are met
77 // but if there are no prerequisites, this can be only activated through gm command
78 return !(_gameEvent[entry].PrerequisiteEvents.empty());
79 }
80 }
81}
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.

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

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

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

◆ GameEventSpawn()

void GameEventMgr::GameEventSpawn ( int16  eventId)
private
1361{
1362 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1363
1364 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1365 {
1366 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element {} (size: {})",
1367 internal_event_id, GameEventCreatureGuids.size());
1368 return;
1369 }
1370
1371 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1372 {
1373 // Add to correct cell
1374 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1375 {
1376 sObjectMgr->AddCreatureToGrid(*itr, data);
1377
1378 // Spawn if necessary (loaded grids only)
1379 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1380 // We use spawn coords to spawn
1381 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1382 {
1383 Creature* creature = new Creature;
1384 if (!creature->LoadCreatureFromDB(*itr, map))
1385 delete creature;
1386 }
1387 }
1388 }
1389
1390 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1391 {
1392 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element {} (size: {})",
1393 internal_event_id, GameEventGameobjectGuids.size());
1394 return;
1395 }
1396
1397 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1398 {
1399 // Add to correct cell
1400 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1401 {
1402 sObjectMgr->AddGameobjectToGrid(*itr, data);
1403 // Spawn if necessary (loaded grids only)
1404 // this base map checked as non-instanced and then only existed
1405 Map* map = sMapMgr->CreateBaseMap(data->mapid);
1406 // We use current coords to unspawn, not spawn coords since creature can have changed grid
1407 if (!map->Instanceable() && map->IsGridLoaded(data->posX, data->posY))
1408 {
1409 GameObject* pGameobject = sObjectMgr->IsGameObjectStaticTransport(data->id) ? new StaticTransport() : new GameObject();
1410 //TODO: find out when it is add to map
1411 if (!pGameobject->LoadGameObjectFromDB(*itr, map, false))
1412 delete pGameobject;
1413 else
1414 {
1415 if (pGameobject->isSpawnedByDefault())
1416 map->AddToMap(pGameobject);
1417 }
1418 }
1419 }
1420 }
1421
1422 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1423 {
1424 LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range _gameEventPoolIds element {} (size: {})",
1425 internal_event_id, _gameEventPoolIds.size());
1426 return;
1427 }
1428
1429 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1430 sPoolMgr->SpawnPool(*itr);
1431}
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
1434{
1435 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1436
1437 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
1438 {
1439 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventCreatureGuids element {} (size: {})",
1440 internal_event_id, GameEventCreatureGuids.size());
1441 return;
1442 }
1443
1444 for (GuidLowList::iterator itr = GameEventCreatureGuids[internal_event_id].begin(); itr != GameEventCreatureGuids[internal_event_id].end(); ++itr)
1445 {
1446 // check if it's needed by another event, if so, don't remove
1447 if (eventId > 0 && HasCreatureActiveEventExcept(*itr, eventId))
1448 continue;
1449
1450 // Remove the creature from grid
1451 if (CreatureData const* data = sObjectMgr->GetCreatureData(*itr))
1452 {
1453 sObjectMgr->RemoveCreatureFromGrid(*itr, data);
1454
1455 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1456 {
1457 auto creatureBounds = map->GetCreatureBySpawnIdStore().equal_range(*itr);
1458 for (auto itr2 = creatureBounds.first; itr2 != creatureBounds.second;)
1459 {
1460 Creature* creature = itr2->second;
1461 ++itr2;
1462 creature->AddObjectToRemoveList();
1463 }
1464 });
1465 }
1466 }
1467
1468 if (internal_event_id >= int32(GameEventGameobjectGuids.size()))
1469 {
1470 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range GameEventGameobjectGuids element {} (size: {})",
1471 internal_event_id, GameEventGameobjectGuids.size());
1472 return;
1473 }
1474
1475 for (GuidLowList::iterator itr = GameEventGameobjectGuids[internal_event_id].begin(); itr != GameEventGameobjectGuids[internal_event_id].end(); ++itr)
1476 {
1477 // check if it's needed by another event, if so, don't remove
1478 if (eventId > 0 && HasGameObjectActiveEventExcept(*itr, eventId))
1479 continue;
1480 // Remove the gameobject from grid
1481 if (GameObjectData const* data = sObjectMgr->GetGameObjectData(*itr))
1482 {
1483 sObjectMgr->RemoveGameobjectFromGrid(*itr, data);
1484
1485 sMapMgr->DoForAllMapsWithMapId(data->mapid, [&itr](Map* map)
1486 {
1487 auto gameobjectBounds = map->GetGameObjectBySpawnIdStore().equal_range(*itr);
1488 for (auto itr2 = gameobjectBounds.first; itr2 != gameobjectBounds.second;)
1489 {
1490 GameObject* go = itr2->second;
1491 ++itr2;
1492 go->AddObjectToRemoveList();
1493 }
1494 });
1495 }
1496 }
1497 if (internal_event_id >= int32(_gameEventPoolIds.size()))
1498 {
1499 LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element {} (size: {})", internal_event_id, _gameEventPoolIds.size());
1500 return;
1501 }
1502
1503 for (IdList::iterator itr = _gameEventPoolIds[internal_event_id].begin(); itr != _gameEventPoolIds[internal_event_id].end(); ++itr)
1504 {
1505 sPoolMgr->DespawnPool(*itr);
1506 }
1507}
bool HasGameObjectActiveEventExcept(ObjectGuid::LowType go_guid, uint16 eventId)
Definition GameEventMgr.cpp:1607
bool HasCreatureActiveEventExcept(ObjectGuid::LowType creature_guid, uint16 eventId)
Definition GameEventMgr.cpp:1593

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

References sGameEventMgr.

◆ GetNPCFlag()

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

References _activeEvents, _gameEvent, and GameEventCreatureGuids.

Referenced by GameEventUnspawn().

◆ HasCreatureQuestActiveEventExcept()

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

References _activeEvents, and _gameEventCreatureQuests.

Referenced by UpdateEventQuests().

◆ HasGameObjectActiveEventExcept()

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

References _activeEvents, _gameEvent, and GameEventGameobjectGuids.

◆ HasGameObjectQuestActiveEventExcept()

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

References _activeEvents, and _gameEventGameObjectQuests.

Referenced by UpdateEventQuests().

◆ Initialize()

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

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
963{
964 LOG_INFO("server.loading", "Loading Game Event Battleground Data...");
965
966 uint32 oldMSTime = getMSTime();
967
969 PreparedQueryResult result = WorldDatabase.Query(stmt);
970
971 if (!result)
972 {
973 LOG_WARN("server.loading", ">> Loaded 0 Battleground Holidays In Game Events. DB table `game_event_battleground_holiday` is empty.");
974 LOG_INFO("server.loading", " ");
975 }
976 else
977 {
978 uint32 count = 0;
979 do
980 {
981 Field* fields = result->Fetch();
982
983 uint16 eventId = fields[0].Get<uint8>();
984
985 if (eventId >= _gameEvent.size())
986 {
987 LOG_ERROR("sql.sql", "`game_event_battleground_holiday` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
988 continue;
989 }
990
991 _gameEventBattlegroundHolidays[eventId] = fields[1].Get<uint32>();
992
993 ++count;
994 } while (result->NextRow());
995
996 LOG_INFO("server.loading", ">> Loaded {} Battleground Holidays In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
997 LOG_INFO("server.loading", " ");
998 }
999}
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
783{
784 LOG_INFO("server.loading", "Loading Game Event Condition Data...");
785
786 uint32 oldMSTime = getMSTime();
787
789 PreparedQueryResult result = WorldDatabase.Query(stmt);
790
791 if (!result)
792 {
793 LOG_WARN("server.loading", ">> Loaded 0 Conditions In Game Events. DB table `game_event_condition` Is Empty.");
794 LOG_INFO("server.loading", " ");
795 }
796 else
797 {
798 uint32 count = 0;
799 do
800 {
801 Field* fields = result->Fetch();
802
803 uint16 eventId = fields[0].Get<uint8>();
804 uint32 condition = fields[1].Get<uint32>();
805
806 if (eventId >= _gameEvent.size())
807 {
808 LOG_ERROR("sql.sql", "`game_event_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
809 continue;
810 }
811
812 _gameEvent[eventId].Conditions[condition].ReqNum = fields[2].Get<float>();
813 _gameEvent[eventId].Conditions[condition].Done = 0;
814 _gameEvent[eventId].Conditions[condition].MaxWorldState = fields[3].Get<uint16>();
815 _gameEvent[eventId].Conditions[condition].DoneWorldState = fields[4].Get<uint16>();
816
817 ++count;
818 } while (result->NextRow());
819
820 LOG_INFO("server.loading", ">> Loaded {} conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
821 LOG_INFO("server.loading", " ");
822 }
823}
@ 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
826{
827 LOG_INFO("server.loading", "Loading Game Event Condition Save Data...");
828
829 uint32 oldMSTime = getMSTime();
830
832 PreparedQueryResult result = CharacterDatabase.Query(stmt);
833
834 if (!result)
835 {
836 LOG_WARN("server.loading", ">> Loaded 0 Condition Saves In Game Events. DB Table `game_event_condition_save` Is Empty.");
837 LOG_INFO("server.loading", " ");
838 }
839 else
840 {
841 uint32 count = 0;
842 do
843 {
844 Field* fields = result->Fetch();
845
846 uint16 eventId = fields[0].Get<uint8>();
847 uint32 condition = fields[1].Get<uint32>();
848
849 if (eventId >= _gameEvent.size())
850 {
851 LOG_ERROR("sql.sql", "`game_event_condition_save` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
852 continue;
853 }
854
855 GameEventConditionMap::iterator itr = _gameEvent[eventId].Conditions.find(condition);
856 if (itr != _gameEvent[eventId].Conditions.end())
857 {
858 itr->second.Done = fields[2].Get<float>();
859 }
860 else
861 {
862 LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition evt id {} cond id {}", eventId, condition);
863 continue;
864 }
865
866 ++count;
867 } while (result->NextRow());
868
869 LOG_INFO("server.loading", ">> Loaded {} Condition Saves In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
870 LOG_INFO("server.loading", " ");
871 }
872}
@ 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
494{
495 LOG_INFO("server.loading", "Loading Game Event Creature Data...");
496
497 uint32 oldMSTime = getMSTime();
498
500 PreparedQueryResult result = WorldDatabase.Query(stmt);
501
502 if (!result)
503 {
504 LOG_WARN("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty");
505 LOG_INFO("server.loading", " ");
506 }
507 else
508 {
509 uint32 count = 0;
510 do
511 {
512 Field* fields = result->Fetch();
513
514 ObjectGuid::LowType guid = fields[0].Get<uint32>();
515 int16 eventId = fields[1].Get<int16>();
516
517 CreatureData const* data = sObjectMgr->GetCreatureData(guid);
518 if (!data)
519 {
520 LOG_ERROR("sql.sql", "`game_event_creature` contains creature (GUID: {}) not found in `creature` table.", guid);
521 continue;
522 }
523
524 int32 internal_event_id = _gameEvent.size() + eventId - 1;
525
526 if (internal_event_id < 0 || internal_event_id >= int32(GameEventCreatureGuids.size()))
527 {
528 LOG_ERROR("sql.sql", "`game_event_creature` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
529 continue;
530 }
531
532 GuidLowList& crelist = GameEventCreatureGuids[internal_event_id];
533 crelist.push_back(guid);
534
535 ++count;
536 } while (result->NextRow());
537
538 LOG_INFO("server.loading", ">> Loaded {} Creatures In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
539 LOG_INFO("server.loading", " ");
540 }
541}
@ 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
544{
545 LOG_INFO("server.loading", "Loading Game Event GO Data...");
546
547 uint32 oldMSTime = getMSTime();
548
550 PreparedQueryResult result = WorldDatabase.Query(stmt);
551
552 if (!result)
553 {
554 LOG_WARN("server.loading", ">> Loaded 0 gameobjects in game events. DB table `game_event_gameobject` is empty.");
555 LOG_INFO("server.loading", " ");
556 }
557 else
558 {
559 uint32 count = 0;
560 do
561 {
562 Field* fields = result->Fetch();
563
564 ObjectGuid::LowType guid = fields[0].Get<uint32>();
565 int16 eventId = fields[1].Get<int16>();
566
567 int32 internal_event_id = _gameEvent.size() + eventId - 1;
568
569 GameObjectData const* data = sObjectMgr->GetGameObjectData(guid);
570 if (!data)
571 {
572 LOG_ERROR("sql.sql", "`game_event_gameobject` contains gameobject (GUID: {}) not found in `gameobject` table.", guid);
573 continue;
574 }
575
576 if (internal_event_id < 0 || internal_event_id >= int32(GameEventGameobjectGuids.size()))
577 {
578 LOG_ERROR("sql.sql", "`game_event_gameobject` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
579 continue;
580 }
581
582 GuidLowList& golist = GameEventGameobjectGuids[internal_event_id];
583 golist.push_back(guid);
584
585 ++count;
586 } while (result->NextRow());
587
588 LOG_INFO("server.loading", ">> Loaded {} Gameobjects In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
589 LOG_INFO("server.loading", " ");
590 }
591}
@ 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
697{
698 LOG_INFO("server.loading", "Loading Game Event GO Quest Data...");
699
700 uint32 oldMSTime = getMSTime();
701
703 PreparedQueryResult result = WorldDatabase.Query(stmt);
704
705 if (!result)
706 {
707 LOG_WARN("server.loading", ">> Loaded 0 go Quests Additions In Game Events. DB Table `game_event_gameobject_quest` Is Empty.");
708 LOG_INFO("server.loading", " ");
709 }
710 else
711 {
712 uint32 count = 0;
713 do
714 {
715 Field* fields = result->Fetch();
716
717 uint32 id = fields[0].Get<uint32>();
718 uint32 quest = fields[1].Get<uint32>();
719 uint16 eventId = fields[2].Get<uint8>();
720
721 if (eventId >= _gameEventGameObjectQuests.size())
722 {
723 LOG_ERROR("sql.sql", "`game_event_gameobject_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
724 continue;
725 }
726
727 QuestRelList& questlist = _gameEventGameObjectQuests[eventId];
728 questlist.push_back(QuestRelation(id, quest));
729
730 ++count;
731 } while (result->NextRow());
732
733 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
734 LOG_INFO("server.loading", " ");
735 }
736}
@ 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
594{
595 LOG_INFO("server.loading", "Loading Game Event Model/Equipment Change Data...");
596
597 uint32 oldMSTime = getMSTime();
598
600 PreparedQueryResult result = WorldDatabase.Query(stmt);
601
602 if (!result)
603 {
604 LOG_WARN("server.loading", ">> Loaded 0 Model/Equipment Changes In Game Events. DB Table `game_event_model_equip` Is Empty.");
605 LOG_INFO("server.loading", " ");
606 }
607 else
608 {
609 uint32 count = 0;
610 do
611 {
612 Field* fields = result->Fetch();
613
614 ObjectGuid::LowType guid = fields[0].Get<uint32>();
615 uint32 entry = fields[1].Get<uint32>();
616 uint32 entry2 = fields[2].Get<uint32>();
617 uint32 entry3 = fields[3].Get<uint32>();
618 uint16 eventId = fields[4].Get<uint8>();
619
620 if (eventId >= _gameEventModelEquip.size())
621 {
622 LOG_ERROR("sql.sql", "`game_event_model_equip` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
623 continue;
624 }
625
626 ModelEquipList& equiplist = _gameEventModelEquip[eventId];
627 ModelEquip newModelEquipSet;
628 newModelEquipSet.ModelId = fields[5].Get<uint32>();
629 newModelEquipSet.EquipmentId = fields[6].Get<uint8>();
630 newModelEquipSet.EquipementIdPrev = 0;
631 newModelEquipSet.ModelIdPrev = 0;
632
633 if (newModelEquipSet.EquipmentId > 0)
634 {
635 int8 equipId = static_cast<int8>(newModelEquipSet.EquipmentId);
636 if ((!sObjectMgr->GetEquipmentInfo(entry, equipId)) || (entry2 && !sObjectMgr->GetEquipmentInfo(entry2, equipId)) || (entry3 && !sObjectMgr->GetEquipmentInfo(entry3, equipId)))
637 {
638 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.",
639 guid, newModelEquipSet.EquipmentId);
640 continue;
641 }
642 }
643
644 equiplist.push_back(std::pair<ObjectGuid::LowType, ModelEquip>(guid, newModelEquipSet));
645
646 ++count;
647 } while (result->NextRow());
648
649 LOG_INFO("server.loading", ">> Loaded {} Model/Equipment Changes In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
650 LOG_INFO("server.loading", " ");
651 }
652}
std::int8_t int8
Definition Define.h:105
@ WORLD_SEL_GAME_EVENT_MODEL_EQUIPMENT_DATA
Definition WorldDatabase.h:97
std::list< ModelEquipPair > ModelEquipList
Definition GameEventMgr.h:170
Definition GameEventMgr.h:77
uint8 EquipementIdPrev
Definition GameEventMgr.h:81
uint32 ModelIdPrev
Definition GameEventMgr.h:79
uint32 ModelId
Definition GameEventMgr.h:78
uint8 EquipmentId
Definition GameEventMgr.h:80

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

Referenced by LoadFromDB().

◆ LoadEventNPCFlags()

void GameEventMgr::LoadEventNPCFlags ( )
private
875{
876 LOG_INFO("server.loading", "Loading Game Event NPCflag Data...");
877
878 uint32 oldMSTime = getMSTime();
879
881 PreparedQueryResult result = WorldDatabase.Query(stmt);
882
883 if (!result)
884 {
885 LOG_WARN("server.loading", ">> Loaded 0 Npcflags In Game Events. DB Table `game_event_npcflag` Is Empty.");
886 LOG_INFO("server.loading", " ");
887 }
888 else
889 {
890 uint32 count = 0;
891 do
892 {
893 Field* fields = result->Fetch();
894
895 ObjectGuid::LowType guid = fields[0].Get<uint32>();
896 uint16 eventId = fields[1].Get<uint8>();
897 uint32 npcflag = fields[2].Get<uint32>();
898
899 if (eventId >= _gameEvent.size())
900 {
901 LOG_ERROR("sql.sql", "`game_event_npcflag` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
902 continue;
903 }
904
905 _gameEventNPCFlags[eventId].push_back(GuidNPCFlagPair(guid, npcflag));
906
907 ++count;
908 } while (result->NextRow());
909
910 LOG_INFO("server.loading", ">> Loaded {} Npcflags In Game Events In {} ms", count, GetMSTimeDiffToNow(oldMSTime));
911 LOG_INFO("server.loading", " ");
912 }
913}
@ 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
1002{
1003 LOG_INFO("server.loading", "Loading Game Event Pool Data...");
1004
1005 uint32 oldMSTime = getMSTime();
1006
1008 PreparedQueryResult result = WorldDatabase.Query(stmt);
1009
1010 if (!result)
1011 {
1012 LOG_WARN("server.loading", ">> Loaded 0 Pools For Game Events. DB Table `game_event_pool` Is Empty.");
1013 LOG_INFO("server.loading", " ");
1014 }
1015 else
1016 {
1017 uint32 count = 0;
1018 do
1019 {
1020 Field* fields = result->Fetch();
1021
1022 uint32 entry = fields[0].Get<uint32>();
1023 int16 eventId = fields[1].Get<int16>();
1024
1025 int32 internal_event_id = _gameEvent.size() + eventId - 1;
1026
1027 if (internal_event_id < 0 || internal_event_id >= int32(_gameEventPoolIds.size()))
1028 {
1029 LOG_ERROR("sql.sql", "`game_event_pool` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
1030 continue;
1031 }
1032
1033 if (!sPoolMgr->CheckPool(entry))
1034 {
1035 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);
1036 continue;
1037 }
1038
1039 IdList& poollist = _gameEventPoolIds[internal_event_id];
1040 poollist.push_back(entry);
1041
1042 ++count;
1043 } while (result->NextRow());
1044
1045 LOG_INFO("server.loading", ">> Loaded {} Pools For Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
1046 LOG_INFO("server.loading", " ");
1047 }
1048}
@ 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
441{
442 LOG_INFO("server.loading", "Loading Game Event Prerequisite Data...");
443
444 uint32 oldMSTime = getMSTime();
445
447 PreparedQueryResult result = WorldDatabase.Query(stmt);
448
449 if (!result)
450 {
451 LOG_WARN("server.loading", ">> Loaded 0 Game Rvent Prerequisites in Game Events. DB Table `game_event_prerequisite` Is Empty.");
452 LOG_INFO("server.loading", " ");
453 }
454 else
455 {
456 uint32 count = 0;
457 do
458 {
459 Field* fields = result->Fetch();
460
461 uint16 eventId = fields[0].Get<uint8>();
462
463 if (eventId >= _gameEvent.size())
464 {
465 LOG_ERROR("sql.sql", "`game_event_prerequisite` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
466 continue;
467 }
468
469 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
470 {
471 uint16 prerequisite_event = fields[1].Get<uint32>();
472 if (prerequisite_event >= _gameEvent.size())
473 {
474 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);
475 continue;
476 }
477 _gameEvent[eventId].PrerequisiteEvents.insert(prerequisite_event);
478 }
479 else
480 {
481 LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id {}", eventId);
482 continue;
483 }
484
485 ++count;
486 } while (result->NextRow());
487
488 LOG_INFO("server.loading", ">> Loaded {} game event prerequisites in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
489 LOG_INFO("server.loading", " ");
490 }
491}
@ 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
739{
740 LOG_INFO("server.loading", "Loading Game Event Quest Condition Data...");
741
742 uint32 oldMSTime = getMSTime();
743
745 PreparedQueryResult result = WorldDatabase.Query(stmt);
746
747 if (!result)
748 {
749 LOG_WARN("server.loading", ">> Loaded 0 quest event Conditions In Game Events. DB Table `game_event_quest_condition` Is Empty.");
750 LOG_INFO("server.loading", " ");
751 }
752 else
753 {
754 uint32 count = 0;
755 do
756 {
757 Field* fields = result->Fetch();
758
759 uint32 quest = fields[0].Get<uint32>();
760 uint16 eventId = fields[1].Get<uint8>();
761 uint32 condition = fields[2].Get<uint32>();
762 float num = fields[3].Get<float>();
763
764 if (eventId >= _gameEvent.size())
765 {
766 LOG_ERROR("sql.sql", "`game_event_quest_condition` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
767 continue;
768 }
769
770 _questToEventConditions[quest].EventId = eventId;
771 _questToEventConditions[quest].Condition = condition;
772 _questToEventConditions[quest].Num = num;
773
774 ++count;
775 } while (result->NextRow());
776
777 LOG_INFO("server.loading", ">> Loaded {} quest event conditions in Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
778 LOG_INFO("server.loading", " ");
779 }
780}
@ 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
655{
656 LOG_INFO("server.loading", "Loading Game Event Quest Data...");
657
658 uint32 oldMSTime = getMSTime();
659
661 PreparedQueryResult result = WorldDatabase.Query(stmt);
662
663 if (!result)
664 {
665 LOG_WARN("server.loading", ">> Loaded 0 Quests Additions In Game Events. DB Table `game_event_creature_quest` Is Empty.");
666 LOG_INFO("server.loading", " ");
667 }
668 else
669 {
670 uint32 count = 0;
671 do
672 {
673 Field* fields = result->Fetch();
674
675 uint32 id = fields[0].Get<uint32>();
676 uint32 quest = fields[1].Get<uint32>();
677 uint16 eventId = fields[2].Get<uint8>();
678
679 if (eventId >= _gameEventCreatureQuests.size())
680 {
681 LOG_ERROR("sql.sql", "`game_event_creature_quest` game event id ({}) is out of range compared to max event id in `game_event`", eventId);
682 continue;
683 }
684
685 QuestRelList& questlist = _gameEventCreatureQuests[eventId];
686 questlist.push_back(QuestRelation(id, quest));
687
688 ++count;
689 } while (result->NextRow());
690
691 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
692 LOG_INFO("server.loading", " ");
693 }
694}
@ 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
327{
328 LOG_INFO("server.loading", "Loading Game Events...");
329 uint32 oldMSTime = getMSTime();
331 PreparedQueryResult result = WorldDatabase.Query(stmt);
332
333 if (!result)
334 {
335 _gameEvent.clear();
336 LOG_WARN("server.loading", ">> Loaded 0 game events. DB table `game_event` is empty.");
337 LOG_INFO("server.loading", " ");
338 return;
339 }
340
341 uint32 count = 0;
342 do
343 {
344 Field* fields = result->Fetch();
345
346 uint8 eventId = fields[0].Get<uint8>();
347 if (eventId == 0)
348 {
349 LOG_ERROR("sql.sql", "`game_event` game event entry 0 is reserved and can't be used.");
350 continue;
351 }
352
353 GameEventData& pGameEvent = _gameEvent[eventId];
354 pGameEvent.EventId = fields[0].Get<uint32>();
355 uint64 starttime = fields[1].Get<uint64>();
356 pGameEvent.Start = time_t(starttime);
357 uint64 endtime = fields[2].Get<uint64>();
358 if (fields[2].IsNull())
359 endtime = GameTime::GetGameTime().count() + 63072000; // add 2 years to current date
360 pGameEvent.End = time_t(endtime);
361 pGameEvent.Occurence = fields[3].Get<uint64>();
362 pGameEvent.Length = fields[4].Get<uint64>();
363 pGameEvent.HolidayId = HolidayIds(fields[5].Get<uint32>());
364 pGameEvent.HolidayStage = fields[6].Get<uint8>();
365 pGameEvent.Description = fields[7].Get<std::string>();
366 pGameEvent.State = (GameEventState)(fields[8].Get<uint8>());
367 pGameEvent.Announce = fields[9].Get<uint8>();
368 pGameEvent.NextStart = 0;
369
370 ++count;
371
372 if (pGameEvent.Length == 0 && pGameEvent.State == GAMEEVENT_NORMAL) // length>0 is validity check
373 {
374 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);
375 continue;
376 }
377
378 if (pGameEvent.HolidayId != HOLIDAY_NONE)
379 {
380 if (!sHolidaysStore.LookupEntry(pGameEvent.HolidayId))
381 {
382 LOG_ERROR("sql.sql", "`game_event` game event id ({}) have not existed holiday id {}.", eventId, pGameEvent.HolidayId);
383 pGameEvent.HolidayId = HOLIDAY_NONE;
384 }
385
386 SetHolidayEventTime(pGameEvent);
387 }
388 } while (result->NextRow());
389
390 LOG_INFO("server.loading", ">> Loaded {} Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
391 LOG_INFO("server.loading", " ");
392}
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:1840
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
395{
396 uint32 oldMSTime = getMSTime();
397 LOG_INFO("server.loading", "Loading Game Event Saves Data...");
399 PreparedQueryResult result = CharacterDatabase.Query(stmt);
400
401 if (!result)
402 {
403 LOG_WARN("server.loading", ">> Loaded 0 Game Event Saves In Game Events. DB Table `game_event_save` Is Empty.");
404 LOG_INFO("server.loading", " ");
405 }
406 else
407 {
408 uint32 count = 0;
409 do
410 {
411 Field* fields = result->Fetch();
412
413 uint8 eventId = fields[0].Get<uint8>();
414
415 if (eventId >= _gameEvent.size())
416 {
417 LOG_ERROR("sql.sql", "`game_event_save` game event entry ({}) is out of range compared to max event entry in `game_event`", eventId);
418 continue;
419 }
420
421 if (_gameEvent[eventId].State != GAMEEVENT_NORMAL && _gameEvent[eventId].State != GAMEEVENT_INTERNAL)
422 {
423 _gameEvent[eventId].State = (GameEventState)(fields[1].Get<uint8>());
424 _gameEvent[eventId].NextStart = time_t(fields[2].Get<uint32>());
425 }
426 else
427 {
428 LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id {}", eventId);
429 continue;
430 }
431
432 ++count;
433 } while (result->NextRow());
434
435 LOG_INFO("server.loading", ">> Loaded {} Game Event Saves In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
436 LOG_INFO("server.loading", " ");
437 }
438}
@ 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
916{
917 LOG_INFO("server.loading", "Loading Game Event Seasonal Quest Relations...");
918 uint32 oldMSTime = getMSTime();
919
921 PreparedQueryResult result = WorldDatabase.Query(stmt);
922
923 if (!result)
924 {
925 LOG_WARN("server.loading", ">> Loaded 0 Seasonal Quests Additions In Game Events. DB Table `game_event_seasonal_questrelation` Is Empty.");
926 LOG_INFO("server.loading", " ");
927 }
928 else
929 {
930 uint32 count = 0;
931 do
932 {
933 Field* fields = result->Fetch();
934
935 uint32 questId = fields[0].Get<uint32>();
936 uint32 eventEntry = fields[1].Get<uint32>();
937
938 Quest* questTemplate = const_cast<Quest*>(sObjectMgr->GetQuestTemplate(questId));
939
940 if (!questTemplate)
941 {
942 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` quest id ({}) does not exist in `quest_template`", questId);
943 continue;
944 }
945
946 if (eventEntry >= _gameEvent.size())
947 {
948 LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` event id ({}) is out of range compared to max event in `game_event`", eventEntry);
949 continue;
950 }
951
952 questTemplate->SetEventIdForQuest((uint16)eventEntry);
953 _gameEventSeasonalQuestsMap[eventEntry].push_back(questId);
954 ++count;
955 } while (result->NextRow());
956
957 LOG_INFO("server.loading", ">> Loaded {} Quests Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
958 LOG_INFO("server.loading", " ");
959 }
960}
@ 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 ( )
240{
241 LOG_INFO("server.loading", "Loading Game Event Vendor Additions Data...");
242 uint32 oldMSTime = getMSTime();
244 PreparedQueryResult result = WorldDatabase.Query(stmt);
245
246 if (!result)
247 {
248 LOG_WARN("server.loading", ">> Loaded 0 Vendor Additions In Game Events. DB Table `game_event_npc_vendor` Is Empty.");
249 LOG_INFO("server.loading", " ");
250 return;
251 }
252
253 uint32 count = 0;
254 std::unordered_set<uint8> processedEvents;
255
256 do
257 {
258 Field* fields = result->Fetch();
259 uint8 eventId = fields[0].Get<uint8>();
260 ObjectGuid::LowType guid = fields[1].Get<uint32>();
261
262 if (eventId >= _gameEventVendors.size())
263 {
264 LOG_ERROR("sql.sql", "Table `game_event_npc_vendor` has invalid eventEntry ({}) for GUID ({}), skipped.", eventId, guid);
265 continue;
266 }
267
268 // Clear existing vendors for this event only once
269 if (processedEvents.find(eventId) == processedEvents.end())
270 {
271 // Remove vendor items from in-memory data
272 for (auto& entry : _gameEventVendors[eventId])
273 {
274 sObjectMgr->RemoveVendorItem(entry.Entry, entry.Item, false);
275 }
276 _gameEventVendors[eventId].clear();
277 processedEvents.insert(eventId);
278 }
279
280 NPCVendorList& vendors = _gameEventVendors[eventId];
281 NPCVendorEntry newEntry;
282 newEntry.Item = fields[2].Get<uint32>();
283 newEntry.MaxCount = fields[3].Get<uint32>();
284 newEntry.Incrtime = fields[4].Get<uint32>();
285 newEntry.ExtendedCost = fields[5].Get<uint32>();
286
287 // Get the event NPC flag for validity check
288 uint32 event_npc_flag = 0;
289 NPCFlagList& flist = _gameEventNPCFlags[eventId];
290 for (NPCFlagList::const_iterator itr = flist.begin(); itr != flist.end(); ++itr)
291 {
292 if (itr->first == guid)
293 {
294 event_npc_flag = itr->second;
295 break;
296 }
297 }
298
299 // Get creature entry
300 newEntry.Entry = 0;
301 if (CreatureData const* data = sObjectMgr->GetCreatureData(guid))
302 newEntry.Entry = data->id1;
303
304 // Validate vendor item
305 if (!sObjectMgr->IsVendorItemValid(newEntry.Entry, newEntry.Item, newEntry.MaxCount, newEntry.Incrtime, newEntry.ExtendedCost, nullptr, nullptr, event_npc_flag))
306 {
307 LOG_ERROR("sql.sql", "Table `game_event_npc_vendor` has invalid item ({}) for guid ({}) for event ({}), skipped.",
308 newEntry.Item, newEntry.Entry, eventId);
309 continue;
310 }
311
312 // Add the item to the vendor if event is active
313 if (IsEventActive(eventId))
314 sObjectMgr->AddVendorItem(newEntry.Entry, newEntry.Item, newEntry.MaxCount, newEntry.Incrtime, newEntry.ExtendedCost, false);
315
316 vendors.push_back(newEntry);
317
318 ++count;
319 } while (result->NextRow());
320
321 LOG_INFO("server.loading", ">> Loaded {} Vendor Additions In Game Events in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
322 LOG_INFO("server.loading", " ");
323
324}
bool IsEventActive(uint16 eventId)
Definition GameEventMgr.cpp:1965
@ 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 ( )
1051{
1052 // The order of these functions matter. Do not change
1053 LoadEvents();
1069}
void LoadEventConditionData()
Definition GameEventMgr.cpp:782
void LoadEventCreatureData()
Definition GameEventMgr.cpp:493
void LoadEventSeasonalQuestRelations()
Definition GameEventMgr.cpp:915
void LoadEventQuestData()
Definition GameEventMgr.cpp:654
void LoadEventPoolData()
Definition GameEventMgr.cpp:1001
void LoadEventGameObjectQuestData()
Definition GameEventMgr.cpp:696
void LoadEventSaveData()
Definition GameEventMgr.cpp:394
void LoadEventNPCFlags()
Definition GameEventMgr.cpp:874
void LoadEventQuestConditionData()
Definition GameEventMgr.cpp:738
void LoadEventModelEquipmentChangeData()
Definition GameEventMgr.cpp:593
void LoadEventPrerequisiteData()
Definition GameEventMgr.cpp:440
void LoadEventVendors()
Definition GameEventMgr.cpp:239
void LoadEventGameObjectData()
Definition GameEventMgr.cpp:543
void LoadEvents()
Definition GameEventMgr.cpp:326
void LoadEventBattlegroundData()
Definition GameEventMgr.cpp:962
void LoadEventConditionSaveData()
Definition GameEventMgr.cpp:825

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

◆ LoadHolidayDates()

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

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

1829{
1832 sMapMgr->DoForAllMaps([eventId, activate](Map* map)
1833 {
1834 GameEventAIHookWorker worker(eventId, activate);
1836 visitor.Visit(map->GetObjectsStore());
1837 });
1838}
Definition GameEventMgr.cpp:1802
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
1774{
1775 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
1776
1778 stmt->SetData(0, uint8(eventId));
1779 trans->Append(stmt);
1780
1781 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GAME_EVENT_SAVE);
1782 stmt->SetData(0, uint8(eventId));
1783 stmt->SetData(1, _gameEvent[eventId].State);
1784 stmt->SetData(2, _gameEvent[eventId].NextStart ? uint32(_gameEvent[eventId].NextStart) : 0);
1785 trans->Append(stmt);
1786 CharacterDatabase.CommitTransaction(trans);
1787}
@ 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
1790{
1791 GameEventConditionMap::const_iterator itr;
1792 for (itr = _gameEvent[eventId].Conditions.begin(); itr != _gameEvent[eventId].Conditions.end(); ++itr)
1793 {
1794 if (itr->second.DoneWorldState)
1795 player->SendUpdateWorldState(itr->second.DoneWorldState, (uint32)(itr->second.Done));
1796 if (itr->second.MaxWorldState)
1797 player->SendUpdateWorldState(itr->second.MaxWorldState, (uint32)(itr->second.ReqNum));
1798 }
1799}
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition PlayerUpdates.cpp:2243

References _gameEvent, and Player::SendUpdateWorldState().

◆ SetHolidayEventTime()

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

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

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

Referenced by StartInternalEvent(), and Update().

◆ StartInternalEvent()

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

References _activeEvents, _gameEvent, and StartEvent().

◆ StartSystem()

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

References _activeEvents, _isSystemInit, and Update().

◆ StopEvent()

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

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

Referenced by Update().

◆ UnApplyEvent()

void GameEventMgr::UnApplyEvent ( uint16  eventId)
private

Run SAI scripts with SMART_EVENT_GAME_EVENT_END

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

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

Referenced by StopEvent().

◆ Update()

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

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

Referenced by StartSystem().

◆ UpdateBattlegroundSettings()

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

References _activeEvents, _gameEventBattlegroundHolidays, and sBattlegroundMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventNPCFlags()

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

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

References _gameEventVendors, and sObjectMgr.

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateEventQuests()

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

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

Referenced by ApplyNewEvent(), and UnApplyEvent().

◆ UpdateWorldStates()

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

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

Referenced by ApplyNewEvent(), and UnApplyEvent().

Member Data Documentation

◆ _activeEvents

◆ _gameEvent

◆ _gameEventBattlegroundHolidays

GameEventBitmask GameEventMgr::_gameEventBattlegroundHolidays
private

◆ _gameEventCreatureQuests

GameEventQuestMap GameEventMgr::_gameEventCreatureQuests
private

◆ _gameEventGameObjectQuests

GameEventQuestMap GameEventMgr::_gameEventGameObjectQuests
private

◆ _gameEventModelEquip

GameEventModelEquipMap GameEventMgr::_gameEventModelEquip
private

◆ _gameEventNPCFlags

GameEventNPCFlagMap GameEventMgr::_gameEventNPCFlags
private

◆ _gameEventPoolIds

GameEventIdMap GameEventMgr::_gameEventPoolIds
private

◆ _gameEventSeasonalQuestsMap

GameEventSeasonalQuestsMap GameEventMgr::_gameEventSeasonalQuestsMap
private

◆ _gameEventVendors

GameEventNPCVendorMap GameEventMgr::_gameEventVendors
private

◆ _isSystemInit

bool GameEventMgr::_isSystemInit
private

Referenced by StartSystem(), and Update().

◆ _questToEventConditions

QuestIdToEventConditionMap GameEventMgr::_questToEventConditions
private

◆ GameEventCreatureGuids

◆ GameEventGameobjectGuids

◆ ModifiedHolidays

std::vector<uint32> GameEventMgr::ModifiedHolidays

Referenced by LoadHolidayDates().


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