aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2018-02-16 03:02:10 -0300
committerShauren <shauren.trinity@gmail.com>2021-06-22 13:19:03 +0200
commit5714e89ccf48d4a4add22f308f77aa8bdd94fc9a (patch)
tree96a1cec5134c583554e2d34702c874d6e313a477
parentd36f8bb7547c5ebef067f834c79754c57ff66a34 (diff)
Core/Events: update holiday code and remove misleading log (event date is the one from game_event)
- add siign to DBC struct member CalendarFilterType as it was being used as such - kill localtime usage as it's deprecated Closes #18542 (cherry picked from commit 5b4287e6832da32539a49e68f6a5ab0ee55854b3)
-rw-r--r--src/server/game/Events/GameEventMgr.cpp31
-rw-r--r--src/server/game/Events/GameEventMgr.h4
2 files changed, 23 insertions, 12 deletions
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index d4425eb9c7d..2cfa51dd402 100644
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -1698,7 +1698,6 @@ void GameEventMgr::SetHolidayEventTime(GameEventData& event)
return;
HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(event.holiday_id);
-
if (!holiday->Date[0] || !holiday->Duration[0]) // Invalid definitions
{
TC_LOG_ERROR("sql.sql", "Missing date or duration for holiday %u.", event.holiday_id);
@@ -1709,7 +1708,7 @@ void GameEventMgr::SetHolidayEventTime(GameEventData& event)
event.length = holiday->Duration[stageIndex] * HOUR / MINUTE;
time_t stageOffset = 0;
- for (int i = 0; i < stageIndex; ++i)
+ for (uint8 i = 0; i < stageIndex; ++i)
stageOffset += holiday->Duration[i] * HOUR;
switch (holiday->CalendarFilterType)
@@ -1729,20 +1728,23 @@ void GameEventMgr::SetHolidayEventTime(GameEventData& event)
if (holiday->Looping)
{
event.occurence = 0;
- for (int i = 0; i < MAX_HOLIDAY_DURATIONS && holiday->Duration[i]; ++i)
+ for (uint8 i = 0; i < MAX_HOLIDAY_DURATIONS && holiday->Duration[i]; ++i)
event.occurence += holiday->Duration[i] * HOUR / MINUTE;
}
bool singleDate = ((holiday->Date[0] >> 24) & 0x1F) == 31; // Events with fixed date within year have - 1
time_t curTime = GameTime::GetGameTime();
- for (int i = 0; i < MAX_HOLIDAY_DATES && holiday->Date[i]; ++i)
+ for (uint8 i = 0; i < MAX_HOLIDAY_DATES && holiday->Date[i]; ++i)
{
uint32 date = holiday->Date[i];
tm timeInfo;
if (singleDate)
- timeInfo.tm_year = localtime(&curTime)->tm_year - 1; // First try last year (event active through New Year)
+ {
+ localtime_r(&curTime, &timeInfo);
+ timeInfo.tm_year -= 1; // First try last year (event active through New Year)
+ }
else
timeInfo.tm_year = ((date >> 24) & 0x1F) + 100;
@@ -1754,22 +1756,31 @@ void GameEventMgr::SetHolidayEventTime(GameEventData& event)
timeInfo.tm_wday = 0;
timeInfo.tm_yday = 0;
timeInfo.tm_isdst = -1;
- tm tmCopy = timeInfo;
+ // try to get next start time (skip past dates)
time_t startTime = mktime(&timeInfo);
if (curTime < startTime + event.length * MINUTE)
{
event.start = startTime + stageOffset;
- return;
+ break;
}
else if (singleDate)
{
- tmCopy.tm_year = localtime(&curTime)->tm_year; // This year
+ tm tmCopy;
+ localtime_r(&curTime, &tmCopy);
+ int year = tmCopy.tm_year; // This year
+ tmCopy = timeInfo;
+ tmCopy.tm_year = year;
+
event.start = mktime(&tmCopy) + stageOffset;
- return;
+ break;
+ }
+ else
+ {
+ // date is due and not a singleDate event, try with next DBC date (modified by holiday_dates)
+ // if none is found we don't modify start date and use the one in game_event
}
}
- TC_LOG_ERROR("sql.sql", "No suitable start date found for holiday %u.", event.holiday_id);
}
bool IsHolidayActive(HolidayIds id)
diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index 4cf96151174..b889394d848 100644
--- a/src/server/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
@@ -115,9 +115,8 @@ class TC_GAME_API GameEventMgr
bool StartEvent(uint16 event_id, bool overwrite = false);
void StopEvent(uint16 event_id, bool overwrite = false);
void HandleQuestComplete(uint32 quest_id); // called on world event type quest completions
- void HandleWorldEventGossip(Player* player, Creature* c);
uint64 GetNPCFlag(Creature* cr);
- uint32 GetNpcTextId(uint32 guid);
+
private:
void SendWorldStateUpdate(Player* player, uint16 event_id);
void AddActiveEvent(uint16 event_id) { m_ActiveEvents.insert(event_id); }
@@ -171,6 +170,7 @@ class TC_GAME_API GameEventMgr
GameEventNPCFlagMap mGameEventNPCFlags;
ActiveEvents m_ActiveEvents;
bool isSystemInit;
+
public:
GameEventGuidMap mGameEventCreatureGuids;
GameEventGuidMap mGameEventGameobjectGuids;