diff options
-rw-r--r-- | src/server/game/Calendar/CalendarMgr.cpp | 72 | ||||
-rw-r--r-- | src/server/game/Calendar/CalendarMgr.h | 19 | ||||
-rw-r--r-- | src/server/game/DungeonFinding/LFGMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CalendarHandler.cpp | 99 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 16 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 44 | ||||
-rw-r--r-- | src/server/game/World/World.h | 7 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 8 |
9 files changed, 238 insertions, 39 deletions
diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index b16579f0a71..fda4a5f984b 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -175,13 +175,24 @@ void CalendarMgr::RemoveEvent(uint64 eventId, ObjectGuid remover) return; } + RemoveEvent(calendarEvent, remover); +} + +void CalendarMgr::RemoveEvent(CalendarEvent* calendarEvent, ObjectGuid remover) +{ + if (!calendarEvent) + { + SendCalendarCommandResult(remover, CALENDAR_ERROR_EVENT_INVALID); + return; + } + SendCalendarEventRemovedAlert(*calendarEvent); SQLTransaction trans = CharacterDatabase.BeginTransaction(); PreparedStatement* stmt; MailDraft mail(calendarEvent->BuildCalendarMailSubject(remover), calendarEvent->BuildCalendarMailBody()); - CalendarInviteStore& eventInvites = _invites[eventId]; + CalendarInviteStore& eventInvites = _invites[calendarEvent->GetEventId()]; for (size_t i = 0; i < eventInvites.size(); ++i) { CalendarInvite* invite = eventInvites[i]; @@ -197,10 +208,10 @@ void CalendarMgr::RemoveEvent(uint64 eventId, ObjectGuid remover) delete invite; } - _invites.erase(eventId); + _invites.erase(calendarEvent->GetEventId()); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CALENDAR_EVENT); - stmt->setUInt64(0, eventId); + stmt->setUInt64(0, calendarEvent->GetEventId()); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); @@ -280,9 +291,13 @@ void CalendarMgr::UpdateInvite(CalendarInvite* invite, SQLTransaction& trans) void CalendarMgr::RemoveAllPlayerEventsAndInvites(ObjectGuid guid) { - for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) - if ((*itr)->GetCreatorGUID() == guid) - RemoveEvent((*itr)->GetEventId(), ObjectGuid::Empty); // don't send mail if removing a character + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end();) + { + CalendarEvent* event = *itr; + ++itr; + if (event->GetCreatorGUID() == guid) + RemoveEvent(event, ObjectGuid::Empty); // don't send mail if removing a character + } CalendarInviteStore playerInvites = GetPlayerInvites(guid); for (CalendarInviteStore::const_iterator itr = playerInvites.begin(); itr != playerInvites.end(); ++itr) @@ -359,6 +374,44 @@ uint64 CalendarMgr::GetFreeInviteId() return inviteId; } +void CalendarMgr::DeleteOldEvents() +{ + time_t oldEventsTime = GameTime::GetGameTime() - CALENDAR_OLD_EVENTS_DELETION_TIME; + + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end();) + { + CalendarEvent* event = *itr; + ++itr; + if (event->GetEventTime() < oldEventsTime) + RemoveEvent(event, ObjectGuid::Empty); + } +} + +CalendarEventStore CalendarMgr::GetEventsCreatedBy(ObjectGuid guid, bool includeGuildEvents) +{ + CalendarEventStore result; + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) + if ((*itr)->GetCreatorGUID() == guid && (includeGuildEvents || (!(*itr)->IsGuildEvent() && !(*itr)->IsGuildAnnouncement()))) + result.insert(*itr); + + return result; +} + +CalendarEventStore CalendarMgr::GetGuildEvents(ObjectGuid::LowType guildId) +{ + CalendarEventStore result; + + if (!guildId) + return result; + + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) + if ((*itr)->IsGuildEvent() || (*itr)->IsGuildAnnouncement()) + if ((*itr)->GetGuildId() == guildId) + result.insert(*itr); + + return result; +} + CalendarEventStore CalendarMgr::GetPlayerEvents(ObjectGuid guid) { CalendarEventStore events; @@ -370,9 +423,10 @@ CalendarEventStore CalendarMgr::GetPlayerEvents(ObjectGuid guid) events.insert(event); if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) - for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) - if ((*itr)->GetGuildId() == player->GetGuildId()) - events.insert(*itr); + if (player->GetGuildId()) + for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) + if ((*itr)->GetGuildId() == player->GetGuildId()) + events.insert(*itr); return events; } diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h index c762dc10174..e170cdb3151 100644 --- a/src/server/game/Calendar/CalendarMgr.h +++ b/src/server/game/Calendar/CalendarMgr.h @@ -127,9 +127,14 @@ enum CalendarError CALENDAR_ERROR_NO_MODERATOR = 40 }; -#define CALENDAR_MAX_EVENTS 30 -#define CALENDAR_MAX_GUILD_EVENTS 100 -#define CALENDAR_MAX_INVITES 100 +enum CalendarLimits +{ + CALENDAR_MAX_EVENTS = 30, + CALENDAR_MAX_GUILD_EVENTS = 100, + CALENDAR_MAX_INVITES = 100, + CALENDAR_CREATE_EVENT_COOLDOWN = 5, + CALENDAR_OLD_EVENTS_DELETION_TIME = 1 * MONTH, +}; struct TC_GAME_API CalendarInvite { @@ -251,6 +256,9 @@ struct TC_GAME_API CalendarEvent bool IsGuildEvent() const { return (_flags & CALENDAR_FLAG_GUILD_EVENT) != 0; } bool IsGuildAnnouncement() const { return (_flags & CALENDAR_FLAG_WITHOUT_INVITES) != 0; } + static bool IsGuildEvent(uint32 flags) { return (flags & CALENDAR_FLAG_GUILD_EVENT) != 0; } + static bool IsGuildAnnouncement(uint32 flags) { return (flags & CALENDAR_FLAG_WITHOUT_INVITES) != 0; } + std::string BuildCalendarMailSubject(ObjectGuid remover) const; std::string BuildCalendarMailBody() const; @@ -291,7 +299,9 @@ class TC_GAME_API CalendarMgr CalendarEvent* GetEvent(uint64 eventId) const; CalendarEventStore const& GetEvents() const { return _events; } + CalendarEventStore GetEventsCreatedBy(ObjectGuid guid, bool includeGuildEvents = false); CalendarEventStore GetPlayerEvents(ObjectGuid guid); + CalendarEventStore GetGuildEvents(ObjectGuid::LowType guildId); CalendarInvite* GetInvite(uint64 inviteId) const; CalendarEventInviteStore const& GetInvites() const { return _invites; } @@ -303,10 +313,13 @@ class TC_GAME_API CalendarMgr void FreeInviteId(uint64 id); uint64 GetFreeInviteId(); + void DeleteOldEvents(); + uint32 GetPlayerNumPending(ObjectGuid guid); void AddEvent(CalendarEvent* calendarEvent, CalendarSendEventType sendType); void RemoveEvent(uint64 eventId, ObjectGuid remover); + void RemoveEvent(CalendarEvent* calendarEvent, ObjectGuid remover); void UpdateEvent(CalendarEvent* calendarEvent); void AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite); diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 61c8753bf8a..9dba4371040 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -540,7 +540,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const { // Create new rolecheck LfgRoleCheck& roleCheck = RoleChecksStore[gguid]; - roleCheck.cancelTime = time_t(GameTime::GetGameTime()) + LFG_TIME_ROLECHECK; + roleCheck.cancelTime = GameTime::GetGameTime() + LFG_TIME_ROLECHECK; roleCheck.state = LFG_ROLECHECK_INITIALITING; roleCheck.leader = guid; roleCheck.dungeons = dungeons; diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 3ee233a4c76..46839c4b147 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -245,15 +245,54 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) if (time_t(eventPackedTime) < (GameTime::GetGameTime() - time_t(86400L))) { recvData.rfinish(); + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_PASSED); return; } + // If the event is a guild event, check if the player is in a guild + if (CalendarEvent::IsGuildEvent(flags) || CalendarEvent::IsGuildAnnouncement(flags)) + { + if (!_player->GetGuildId()) + { + recvData.rfinish(); + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_GUILD_PLAYER_NOT_IN_GUILD); + return; + } + } + + // Check if the player reached the max number of events allowed to create + if (CalendarEvent::IsGuildEvent(flags) || CalendarEvent::IsGuildAnnouncement(flags)) + { + if (sCalendarMgr->GetGuildEvents(_player->GetGuildId()).size() >= CALENDAR_MAX_GUILD_EVENTS) + { + recvData.rfinish(); + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_GUILD_EVENTS_EXCEEDED); + return; + } + } + else + { + if (sCalendarMgr->GetEventsCreatedBy(guid).size() >= CALENDAR_MAX_EVENTS) + { + recvData.rfinish(); + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENTS_EXCEEDED); + return; + } + } + + if (GetCalendarEventCreationCooldown() > GameTime::GetGameTime()) + { + recvData.rfinish(); + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_INTERNAL); + return; + } + SetCalendarEventCreationCooldown(GameTime::GetGameTime() + CALENDAR_CREATE_EVENT_COOLDOWN); + CalendarEvent* calendarEvent = new CalendarEvent(sCalendarMgr->GetFreeEventId(), guid, 0, CalendarEventType(type), dungeonId, time_t(eventPackedTime), flags, time_t(unkPackedTime), title, description); if (calendarEvent->IsGuildEvent() || calendarEvent->IsGuildAnnouncement()) - if (Player* creator = ObjectAccessor::FindPlayer(guid)) - calendarEvent->SetGuildId(creator->GetGuildId()); + calendarEvent->SetGuildId(_player->GetGuildId()); if (calendarEvent->IsGuildAnnouncement()) { @@ -266,12 +305,11 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) else { // client limits the amount of players to be invited to 100 - const uint32 MaxPlayerInvites = 100; uint32 inviteCount; - ObjectGuid invitee[MaxPlayerInvites]; - uint8 status[MaxPlayerInvites]; - uint8 rank[MaxPlayerInvites]; + ObjectGuid invitee[CALENDAR_MAX_INVITES]; + uint8 status[CALENDAR_MAX_INVITES]; + uint8 rank[CALENDAR_MAX_INVITES]; memset(status, 0, sizeof(status)); memset(rank, 0, sizeof(rank)); @@ -280,7 +318,7 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) { recvData >> inviteCount; - for (uint32 i = 0; i < inviteCount && i < MaxPlayerInvites; ++i) + for (uint32 i = 0; i < inviteCount && i < CALENDAR_MAX_INVITES; ++i) { recvData >> invitee[i].ReadAsPacked(); recvData >> status[i] >> rank[i]; @@ -297,7 +335,7 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) if (inviteCount > 1) trans = CharacterDatabase.BeginTransaction(); - for (uint32 i = 0; i < inviteCount && i < MaxPlayerInvites; ++i) + for (uint32 i = 0; i < inviteCount && i < CALENDAR_MAX_INVITES; ++i) { // 946684800 is 01/01/2000 00:00:00 - default response time CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEvent->GetEventId(), invitee[i], guid, 946684800, CalendarInviteStatus(status[i]), CalendarModerationRank(rank[i]), ""); @@ -398,12 +436,55 @@ void WorldSession::HandleCalendarCopyEvent(WorldPacket& recvData) // To Do: properly handle timezones and remove the "- time_t(86400L)" hack if (time_t(eventTime) < (GameTime::GetGameTime() - time_t(86400L))) { - recvData.rfinish(); + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_PASSED); return; } if (CalendarEvent* oldEvent = sCalendarMgr->GetEvent(eventId)) { + // Ensure that the player has access to the event + if (oldEvent->IsGuildEvent() || oldEvent->IsGuildAnnouncement()) + { + if (oldEvent->GetGuildId() != _player->GetGuildId()) + { + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); + return; + } + } + else + { + if (oldEvent->GetCreatorGUID() != guid) + { + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); + return; + } + } + + // Check if the player reached the max number of events allowed to create + if (oldEvent->IsGuildEvent() || oldEvent->IsGuildAnnouncement()) + { + if (sCalendarMgr->GetGuildEvents(_player->GetGuildId()).size() >= CALENDAR_MAX_GUILD_EVENTS) + { + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_GUILD_EVENTS_EXCEEDED); + return; + } + } + else + { + if (sCalendarMgr->GetEventsCreatedBy(guid).size() >= CALENDAR_MAX_EVENTS) + { + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENTS_EXCEEDED); + return; + } + } + + if (GetCalendarEventCreationCooldown() > GameTime::GetGameTime()) + { + sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_INTERNAL); + return; + } + SetCalendarEventCreationCooldown(GameTime::GetGameTime() + CALENDAR_CREATE_EVENT_COOLDOWN); + CalendarEvent* newEvent = new CalendarEvent(*oldEvent, sCalendarMgr->GetFreeEventId()); newEvent->SetEventTime(time_t(eventTime)); sCalendarMgr->AddEvent(newEvent, CALENDAR_SENDTYPE_COPY); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index a722e2e0e10..4314e819b86 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -134,13 +134,13 @@ WorldSession::WorldSession(uint32 id, std::string&& name, std::shared_ptr<WorldS m_currentBankerGUID(), _timeSyncClockDeltaQueue(6), _timeSyncClockDelta(0), - _pendingTimeSyncRequests() + _pendingTimeSyncRequests(), + _timeSyncNextCounter(0), + _timeSyncTimer(0), + _calendarEventCreationCooldown(0) { memset(m_Tutorials, 0, sizeof(m_Tutorials)); - _timeSyncNextCounter = 0; - _timeSyncTimer = 0; - if (sock) { m_Address = sock->GetRemoteIpAddress().to_string(); @@ -1499,7 +1499,6 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co case CMSG_GROUP_SET_LEADER: // 1 2 1 async db query case CMSG_GROUP_RAID_CONVERT: // 1 5 1 async db query case CMSG_GROUP_ASSISTANT_LEADER: // 1 2 1 async db query - case CMSG_CALENDAR_ADD_EVENT: // 21 10 2 async db query case CMSG_PETITION_BUY: // not profiled 1 sync 1 async db queries case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE: // not profiled case CMSG_REQUEST_VEHICLE_PREV_SEAT: // not profiled @@ -1522,6 +1521,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co case CMSG_GMTICKET_UPDATETEXT: // 0 15 1 async db query case CMSG_GMTICKET_DELETETICKET: // 1 25 1 async db query case CMSG_GMRESPONSE_RESOLVE: // 1 25 1 async db query + case CMSG_CALENDAR_ADD_EVENT: // 21 10 2 async db query case CMSG_CALENDAR_UPDATE_EVENT: // not profiled case CMSG_CALENDAR_REMOVE_EVENT: // not profiled case CMSG_CALENDAR_COPY_EVENT: // not profiled diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index f806fec586c..d7ff80129b0 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -409,8 +409,6 @@ class TC_GAME_API WorldSession m_TutorialsChanged |= TUTORIALS_FLAG_CHANGED; } } - //used with item_page table - bool SendItemInfo(uint32 itemid, WorldPacket data); //auction void SendAuctionHello(ObjectGuid guid, Creature* unit); void SendAuctionCommandResult(uint32 auctionItemId, AuctionAction command, AuctionError errorCode, InventoryResult bagResult = InventoryResult(0)); @@ -462,6 +460,10 @@ class TC_GAME_API WorldSession void ResetTimeSync(); void SendTimeSync(); + // Packets cooldown + time_t GetCalendarEventCreationCooldown() const { return _calendarEventCreationCooldown; } + void SetCalendarEventCreationCooldown(time_t cooldown) { _calendarEventCreationCooldown = cooldown; } + public: // opcodes handlers void Handle_NULL(WorldPacket& recvPacket); // not used @@ -498,7 +500,6 @@ class TC_GAME_API WorldSession // new void HandleMoveUnRootAck(WorldPacket& recvPacket); void HandleMoveRootAck(WorldPacket& recvPacket); - void HandleLookingForGroup(WorldPacket& recvPacket); // new inspect void HandleInspectOpcode(WorldPacket& recvPacket); @@ -526,7 +527,6 @@ class TC_GAME_API WorldSession void HandleMoveTeleportAck(WorldPacket& recvPacket); void HandleForceSpeedChangeAck(WorldPacket& recvData); - void HandlePingOpcode(WorldPacket& recvPacket); void HandleRepopRequestOpcode(WorldPacket& recvPacket); void HandleAutostoreLootItemOpcode(WorldPacket& recvPacket); void HandleLootMoneyOpcode(WorldPacket& recvPacket); @@ -578,7 +578,6 @@ class TC_GAME_API WorldSession void HandleSetActionButtonOpcode(WorldPacket& recvPacket); void HandleGameObjectUseOpcode(WorldPacket& recPacket); - void HandleMeetingStoneInfo(WorldPacket& recPacket); void HandleGameobjectReportUse(WorldPacket& recvPacket); void HandleNameQueryOpcode(WorldPacket& recvPacket); @@ -603,10 +602,8 @@ class TC_GAME_API WorldSession void HandleRequestRaidInfoOpcode(WorldPacket& recvData); void HandleBattlefieldStatusOpcode(WorldPacket& recvData); - void HandleBattleMasterHelloOpcode(WorldPacket& recvData); void HandleGroupInviteOpcode(WorldPacket& recvPacket); - //void HandleGroupCancelOpcode(WorldPacket& recvPacket); void HandleGroupAcceptOpcode(WorldPacket& recvPacket); void HandleGroupDeclineOpcode(WorldPacket& recvPacket); void HandleGroupUninviteOpcode(WorldPacket& recvPacket); @@ -721,7 +718,6 @@ class TC_GAME_API WorldSession void HandleQueryNextMailTime(WorldPacket& recvData); void HandleCancelChanneling(WorldPacket& recvData); - void SendItemPageInfo(ItemTemplate* itemProto); void HandleSplitItemOpcode(WorldPacket& recvPacket); void HandleSwapInvItemOpcode(WorldPacket& recvPacket); void HandleDestroyItemOpcode(WorldPacket& recvPacket); @@ -804,7 +800,6 @@ class TC_GAME_API WorldSession void HandleChannelBan(WorldPacket& recvPacket); void HandleChannelUnban(WorldPacket& recvPacket); void HandleChannelAnnouncements(WorldPacket& recvPacket); - void HandleChannelModerate(WorldPacket& recvPacket); void HandleChannelDeclineInvite(WorldPacket& recvPacket); void HandleChannelDisplayListQuery(WorldPacket& recvPacket); void HandleGetChannelMemberCount(WorldPacket& recvPacket); @@ -1116,6 +1111,9 @@ class TC_GAME_API WorldSession uint32 _timeSyncNextCounter; uint32 _timeSyncTimer; + // Packets cooldown + time_t _calendarEventCreationCooldown; + WorldSession(WorldSession const& right) = delete; WorldSession& operator=(WorldSession const& right) = delete; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index f4c188434c4..6e1958b6a97 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -120,6 +120,7 @@ World::World() m_NextWeeklyQuestReset = 0; m_NextMonthlyQuestReset = 0; m_NextRandomBGReset = 0; + m_NextCalendarOldEventsDeletionTime = 0; m_NextGuildReset = 0; m_defaultDbcLocale = LOCALE_enUS; @@ -1132,6 +1133,13 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_RANDOM_BG_RESET_HOUR] = 6; } + m_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR] = sConfigMgr->GetIntDefault("Calendar.DeleteOldEventsHour", 6); + if (m_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR] > 23) + { + TC_LOG_ERROR("misc", "Calendar.DeleteOldEventsHour (%i) can't be load. Set to 6.", m_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR]); + m_int_configs[CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR] = 6; + } + m_int_configs[CONFIG_GUILD_RESET_HOUR] = sConfigMgr->GetIntDefault("Guild.ResetHour", 6); if (m_int_configs[CONFIG_GUILD_RESET_HOUR] > 23) { @@ -2166,6 +2174,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Calculate random battleground reset time..."); InitRandomBGResetTime(); + TC_LOG_INFO("server.loading", "Calculate deletion of old calendar events time..."); + InitCalendarOldEventsDeletionTime(); + TC_LOG_INFO("server.loading", "Calculate guild limitation(s) reset time..."); InitGuildResetTime(); @@ -2313,6 +2324,9 @@ void World::Update(uint32 diff) if (currentGameTime > m_NextRandomBGReset) ResetRandomBG(); + if (currentGameTime > m_NextCalendarOldEventsDeletionTime) + CalendarDeleteOldEvents(); + if (currentGameTime > m_NextGuildReset) ResetGuildCap(); @@ -3248,7 +3262,7 @@ void World::InitRandomBGResetTime() { time_t bgtime = uint64(sWorld->getWorldState(WS_BG_DAILY_RESET_TIME)); if (!bgtime) - m_NextRandomBGReset = time_t(GameTime::GetGameTime()); // game time not yet init + m_NextRandomBGReset = GameTime::GetGameTime(); // game time not yet init // generate time by config time_t curTime = GameTime::GetGameTime(); @@ -3272,11 +3286,28 @@ void World::InitRandomBGResetTime() sWorld->setWorldState(WS_BG_DAILY_RESET_TIME, uint64(m_NextRandomBGReset)); } +void World::InitCalendarOldEventsDeletionTime() +{ + time_t now = GameTime::GetGameTime(); + time_t nextDeletionTime = GetLocalHourTimestamp(now, getIntConfig(CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR)); + time_t currentDeletionTime = getWorldState(WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME); + + // If the reset time saved in the worldstate is before now it means the server was offline when the reset was supposed to occur. + // In this case we set the reset time in the past and next world update will do the reset and schedule next one in the future. + if (currentDeletionTime < now) + m_NextCalendarOldEventsDeletionTime = nextDeletionTime - DAY; + else + m_NextCalendarOldEventsDeletionTime = nextDeletionTime; + + if (!currentDeletionTime) + sWorld->setWorldState(WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME, uint64(m_NextCalendarOldEventsDeletionTime)); +} + void World::InitGuildResetTime() { time_t gtime = uint64(getWorldState(WS_GUILD_DAILY_RESET_TIME)); if (!gtime) - m_NextGuildReset = time_t(GameTime::GetGameTime()); // game time not yet init + m_NextGuildReset = GameTime::GetGameTime(); // game time not yet init // generate time by config time_t curTime = GameTime::GetGameTime(); @@ -3328,6 +3359,15 @@ void World::ResetRandomBG() sWorld->setWorldState(WS_BG_DAILY_RESET_TIME, uint64(m_NextRandomBGReset)); } +void World::CalendarDeleteOldEvents() +{ + TC_LOG_INFO("misc", "Calendar deletion of old events."); + + m_NextCalendarOldEventsDeletionTime = time_t(m_NextCalendarOldEventsDeletionTime + DAY); + sWorld->setWorldState(WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME, uint64(m_NextCalendarOldEventsDeletionTime)); + sCalendarMgr->DeleteOldEvents(); +} + void World::ResetGuildCap() { TC_LOG_INFO("misc", "Guild Daily Cap reset."); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 9e144de6da2..28fc6a5f937 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -335,6 +335,7 @@ enum WorldIntConfigs CONFIG_GUILD_BANK_EVENT_LOG_COUNT, CONFIG_MIN_LEVEL_STAT_SAVE, CONFIG_RANDOM_BG_RESET_HOUR, + CONFIG_CALENDAR_DELETE_OLD_EVENTS_HOUR, CONFIG_GUILD_RESET_HOUR, CONFIG_CHARDELETE_KEEP_DAYS, CONFIG_CHARDELETE_METHOD, @@ -532,7 +533,8 @@ enum WorldStates WS_CLEANING_FLAGS = 20004, // Cleaning Flags WS_GUILD_DAILY_RESET_TIME = 20006, // Next guild cap reset time WS_MONTHLY_QUEST_RESET_TIME = 20007, // Next monthly quest reset time - WS_DAILY_QUEST_RESET_TIME = 20008 // Next daily quest reset time + WS_DAILY_QUEST_RESET_TIME = 20008, // Next daily quest reset time + WS_DAILY_CALENDAR_DELETION_OLD_EVENTS_TIME = 20009, // Next daily calendar deletions of old events time }; /// Storage class for commands issued for delayed execution @@ -788,8 +790,10 @@ class TC_GAME_API World void ResetMonthlyQuests(); void InitRandomBGResetTime(); + void InitCalendarOldEventsDeletionTime(); void InitGuildResetTime(); void ResetRandomBG(); + void CalendarDeleteOldEvents(); void ResetGuildCap(); private: World(); @@ -849,6 +853,7 @@ class TC_GAME_API World time_t m_NextWeeklyQuestReset; time_t m_NextMonthlyQuestReset; time_t m_NextRandomBGReset; + time_t m_NextCalendarOldEventsDeletionTime; time_t m_NextGuildReset; //Player Queue diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index c308bc9d03d..58694ade631 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1046,6 +1046,14 @@ Quests.DailyResetTime = 3 Quests.WeeklyResetWDay = 3 # +# Calendar.DeleteOldEventsHour +# Description: Hour of the day when the daily deletion of old calendar events occurs. +# Range: 0-23 +# Default: 6 - (06:00 AM) + +Calendar.DeleteOldEventsHour = 6 + +# # Guild.EventLogRecordsCount # Description: Number of log entries for guild events that are stored per guild. Old entries # will be overwritten if the number of log entries exceed the configured value. |