Core/Calendar: Fixed breaking calendar event UI after relogging
This commit is contained in:
@@ -717,7 +717,7 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
|
||||
WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
|
||||
data.append(GetPlayer()->GetPackGUID());
|
||||
data << uint32(achievement->ID);
|
||||
data << uint32(secsToTimeBitFields(time(NULL)));
|
||||
data.AppendPackedTime(time(NULL));
|
||||
data << uint32(0);
|
||||
GetPlayer()->SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true);
|
||||
}
|
||||
@@ -735,7 +735,7 @@ void AchievementMgr::SendCriteriaUpdate(AchievementCriteriaEntry const* entry, C
|
||||
data << uint32(0);
|
||||
else
|
||||
data << uint32(timedCompleted ? 0 : 1); // this are some flags, 1 is for keeping the counter at 0 in client
|
||||
data << uint32(secsToTimeBitFields(progress->date));
|
||||
data.AppendPackedTime(progress->date);
|
||||
data << uint32(timeElapsed); // time elapsed in seconds
|
||||
data << uint32(0); // unk
|
||||
GetPlayer()->SendDirectMessage(&data);
|
||||
@@ -2126,7 +2126,7 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const
|
||||
continue;
|
||||
|
||||
*data << uint32(iter->first);
|
||||
*data << uint32(secsToTimeBitFields(iter->second.date));
|
||||
data->AppendPackedTime(iter->second.date);
|
||||
}
|
||||
*data << int32(-1);
|
||||
|
||||
@@ -2136,7 +2136,7 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const
|
||||
data->appendPackGUID(iter->second.counter);
|
||||
data->append(GetPlayer()->GetPackGUID());
|
||||
*data << uint32(0);
|
||||
*data << uint32(secsToTimeBitFields(iter->second.date));
|
||||
data->AppendPackedTime(iter->second.date);
|
||||
*data << uint32(0);
|
||||
*data << uint32(0);
|
||||
}
|
||||
|
||||
@@ -22098,7 +22098,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
|
||||
SendEquipmentSetList();
|
||||
|
||||
data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
|
||||
data << uint32(secsToTimeBitFields(sWorld->GetGameTime()));
|
||||
data.AppendPackedTime(sWorld->GetGameTime());
|
||||
data << float(0.01666667f); // game speed
|
||||
data << uint32(0); // added in 3.1.2
|
||||
GetSession()->SendPacket(&data);
|
||||
|
||||
@@ -1717,7 +1717,7 @@ void Guild::SendInfo(WorldSession* session) const
|
||||
{
|
||||
WorldPacket data(SMSG_GUILD_INFO, m_name.size() + 4 + 4 + 4);
|
||||
data << m_name;
|
||||
data << secsToTimeBitFields(m_createdDate); // 3.x (prev. year + month + day)
|
||||
data.AppendPackedTime(m_createdDate); // 3.x (prev. year + month + day)
|
||||
data << uint32(m_members.size()); // Number of members
|
||||
data << m_accountsNumber; // Number of accounts
|
||||
|
||||
|
||||
@@ -90,9 +90,9 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/)
|
||||
if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(*it))
|
||||
{
|
||||
data << uint64(*it);
|
||||
data << calendarEvent->GetTitle().c_str();
|
||||
data << calendarEvent->GetTitle();
|
||||
data << uint32(calendarEvent->GetType());
|
||||
data << uint32(calendarEvent->GetTime());
|
||||
data.AppendPackedTime(calendarEvent->GetTime());
|
||||
data << uint32(calendarEvent->GetFlags());
|
||||
data << uint32(calendarEvent->GetDungeonId());
|
||||
data.appendPackGUID(calendarEvent->GetCreatorGUID());
|
||||
@@ -111,7 +111,7 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/)
|
||||
}
|
||||
|
||||
data << uint32(cur_time); // server time
|
||||
data << uint32(secsToTimeBitFields(cur_time)); // server time
|
||||
data.AppendPackedTime(cur_time); // server time
|
||||
|
||||
uint32 counter = 0;
|
||||
size_t p_counter = data.wpos();
|
||||
@@ -240,7 +240,10 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData)
|
||||
uint8 rank;
|
||||
|
||||
recvData >> title >> description >> type >> repeatable >> maxInvites;
|
||||
recvData >> dungeonId >> eventPackedTime >> unkPackedTime >> flags;
|
||||
recvData >> dungeonId;
|
||||
recvData.ReadPackedTime(eventPackedTime);
|
||||
recvData.ReadPackedTime(unkPackedTime);
|
||||
recvData >> flags;
|
||||
|
||||
if (!(flags & CALENDAR_FLAG_WITHOUT_INVITES))
|
||||
{
|
||||
@@ -317,7 +320,9 @@ void WorldSession::HandleCalendarUpdateEvent(WorldPacket& recvData)
|
||||
|
||||
recvData >> eventId >> inviteId >> title >> description >> type;
|
||||
recvData >> repeatable >> maxInvites >> dungeonId;
|
||||
recvData >> eventPackedTime >> timeZoneTime >> flags;
|
||||
recvData.ReadPackedTime(eventPackedTime);
|
||||
recvData.ReadPackedTime(timeZoneTime);
|
||||
recvData >> flags;
|
||||
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_UPDATE_EVENT [" UI64FMTD "] EventId [" UI64FMTD
|
||||
"], InviteId [" UI64FMTD "] Title %s, Description %s, type %u "
|
||||
@@ -372,7 +377,8 @@ void WorldSession::HandleCalendarCopyEvent(WorldPacket& recvData)
|
||||
uint64 inviteId;
|
||||
uint32 time;
|
||||
|
||||
recvData >> eventId >> inviteId >> time;
|
||||
recvData >> eventId >> inviteId;
|
||||
recvData.ReadPackedTime(time);
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_CALENDAR_COPY_EVENT [" UI64FMTD "], EventId [" UI64FMTD
|
||||
"] inviteId [" UI64FMTD "] Time: %u", guid, eventId, inviteId, time);
|
||||
|
||||
@@ -607,15 +613,15 @@ void WorldSession::SendCalendarEvent(CalendarEvent const& calendarEvent, Calenda
|
||||
data << uint8(sendEventType);
|
||||
data.appendPackGUID(calendarEvent.GetCreatorGUID());
|
||||
data << uint64(eventId);
|
||||
data << calendarEvent.GetTitle().c_str();
|
||||
data << calendarEvent.GetDescription().c_str();
|
||||
data << calendarEvent.GetTitle();
|
||||
data << calendarEvent.GetDescription();
|
||||
data << uint8(calendarEvent.GetType());
|
||||
data << uint8(calendarEvent.GetRepeatable());
|
||||
data << uint32(calendarEvent.GetMaxInvites());
|
||||
data << int32(calendarEvent.GetDungeonId());
|
||||
data << uint32(calendarEvent.GetFlags());
|
||||
data << uint32(calendarEvent.GetTime());
|
||||
data << uint32(calendarEvent.GetTimeZoneTime());
|
||||
data.AppendPackedTime(calendarEvent.GetTime());
|
||||
data.AppendPackedTime(calendarEvent.GetTimeZoneTime());
|
||||
data << uint32(calendarEvent.GetGuildId());
|
||||
|
||||
CalendarInviteIdList const& invites = calendarEvent.GetInviteIdList();
|
||||
@@ -635,7 +641,7 @@ void WorldSession::SendCalendarEvent(CalendarEvent const& calendarEvent, Calenda
|
||||
data << uint8(calendarEvent.GetGuildId() != 0);
|
||||
data << uint64(invite->GetInviteId());
|
||||
data << uint32(invite->GetStatusTime());
|
||||
data << invite->GetText().c_str();
|
||||
data << invite->GetText();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -692,7 +698,7 @@ void WorldSession::SendCalendarEventInviteAlert(CalendarEvent const& calendarEve
|
||||
WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_ALERT);
|
||||
data << uint64(eventId);
|
||||
data << calendarEvent.GetTitle().c_str();
|
||||
data << uint32(calendarEvent.GetTime());
|
||||
data.AppendPackedTime(calendarEvent.GetTime());
|
||||
data << uint32(calendarEvent.GetFlags());
|
||||
data << uint32(calendarEvent.GetType());
|
||||
data << uint32(calendarEvent.GetDungeonId());
|
||||
@@ -717,9 +723,9 @@ void WorldSession::SendCalendarEventUpdateAlert(CalendarEvent const& calendarEve
|
||||
calendarEvent.GetTitle().size() + calendarEvent.GetDescription().size() + 1 + 4 + 4);
|
||||
data << uint8(sendEventType);
|
||||
data << uint64(eventId);
|
||||
data << uint32(calendarEvent.GetTime());
|
||||
data.AppendPackedTime(calendarEvent.GetTime());
|
||||
data << uint32(calendarEvent.GetFlags());
|
||||
data << uint32(calendarEvent.GetTime());
|
||||
data.AppendPackedTime(calendarEvent.GetTime());
|
||||
data << uint8(calendarEvent.GetType());
|
||||
data << uint32(calendarEvent.GetDungeonId());
|
||||
data << calendarEvent.GetTitle().c_str();
|
||||
@@ -734,7 +740,7 @@ void WorldSession::SendCalendarEventRemovedAlert(CalendarEvent const& calendarEv
|
||||
{
|
||||
uint64 guid = _player->GetGUID();
|
||||
uint64 eventId = calendarEvent.GetEventId();
|
||||
uint32 eventTime = (calendarEvent.GetTime());
|
||||
uint32 eventTime = calendarEvent.GetTime();
|
||||
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_REMOVED_ALERT [" UI64FMTD "] EventId ["
|
||||
UI64FMTD "] Time %u", guid, eventId, eventTime);
|
||||
@@ -742,7 +748,7 @@ void WorldSession::SendCalendarEventRemovedAlert(CalendarEvent const& calendarEv
|
||||
WorldPacket data(SMSG_CALENDAR_EVENT_REMOVED_ALERT, 1 + 8 + 1);
|
||||
data << uint8(1); // FIXME: If true does not SignalEvent(EVENT_CALENDAR_ACTION_PENDING)
|
||||
data << uint64(eventId);
|
||||
data << uint32(eventTime);
|
||||
data.AppendPackedTime(eventTime);
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
@@ -752,11 +758,11 @@ void WorldSession::SendCalendarEventStatus(CalendarEvent const& calendarEvent, C
|
||||
uint64 eventId = calendarEvent.GetEventId();
|
||||
uint64 inviteId = invite.GetInviteId();
|
||||
uint64 invitee = invite.GetInvitee();
|
||||
uint32 eventTime = (calendarEvent.GetTime());
|
||||
uint32 eventTime = calendarEvent.GetTime();
|
||||
uint32 flags = calendarEvent.GetFlags();
|
||||
uint8 status = invite.GetStatus();
|
||||
uint8 rank = invite.GetRank();
|
||||
uint32 statusTime = secsToTimeBitFields(invite.GetStatusTime());
|
||||
uint32 statusTime = invite.GetStatusTime();
|
||||
|
||||
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_STATUS [" UI64FMTD "] EventId ["
|
||||
@@ -768,11 +774,11 @@ void WorldSession::SendCalendarEventStatus(CalendarEvent const& calendarEvent, C
|
||||
WorldPacket data(SMSG_CALENDAR_EVENT_STATUS, 8 + 8 + 4 + 4 + 1 + 1 + 4);
|
||||
data.appendPackGUID(invitee);
|
||||
data << uint64(eventId);
|
||||
data << uint32(eventTime);
|
||||
data.AppendPackedTime(eventTime);
|
||||
data << uint32(flags);
|
||||
data << uint8(status);
|
||||
data << uint8(rank);
|
||||
data << uint32(statusTime);
|
||||
data.AppendPackedTime(statusTime);
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
@@ -801,7 +807,7 @@ void WorldSession::SendCalendarEventInviteRemoveAlert(CalendarEvent const& calen
|
||||
{
|
||||
uint64 guid = _player->GetGUID();
|
||||
uint64 eventId = calendarEvent.GetEventId();
|
||||
uint32 eventTime = (calendarEvent.GetTime());
|
||||
uint32 eventTime = calendarEvent.GetTime();
|
||||
uint32 flags = calendarEvent.GetFlags();
|
||||
|
||||
sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT ["
|
||||
@@ -810,7 +816,7 @@ void WorldSession::SendCalendarEventInviteRemoveAlert(CalendarEvent const& calen
|
||||
|
||||
WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, 8 + 4 + 4 + 1);
|
||||
data << uint64(eventId);
|
||||
data << uint32(eventTime);
|
||||
data.AppendPackedTime(eventTime);
|
||||
data << uint32(flags);
|
||||
data << uint8(status);
|
||||
SendPacket(&data);
|
||||
@@ -877,7 +883,7 @@ void WorldSession::SendCalendarRaidLockout(InstanceSave const* save, bool add)
|
||||
if (add)
|
||||
{
|
||||
data.SetOpcode(SMSG_CALENDAR_RAID_LOCKOUT_ADDED);
|
||||
data << uint32(secsToTimeBitFields(currTime));
|
||||
data.AppendPackedTime(currTime);
|
||||
}
|
||||
|
||||
data << uint32(save->GetMapId());
|
||||
@@ -899,7 +905,7 @@ void WorldSession::SendCalendarRaidLockoutUpdated(InstanceSave const* save)
|
||||
time_t cur_time = time_t(time(NULL));
|
||||
|
||||
WorldPacket data(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, 4 + 4 + 4 + 4 + 8);
|
||||
data << secsToTimeBitFields(cur_time);
|
||||
data.AppendPackedTime(cur_time);
|
||||
data << uint32(save->GetMapId());
|
||||
data << uint32(save->GetDifficulty());
|
||||
data << uint32(0); // Amount of seconds that has changed to the reset time
|
||||
|
||||
@@ -359,6 +359,28 @@ class ByteBuffer
|
||||
}
|
||||
}
|
||||
|
||||
uint32 ReadPackedTime()
|
||||
{
|
||||
uint32 packedDate = read<uint32>();
|
||||
tm lt;
|
||||
memset(<, 0, sizeof(lt));
|
||||
|
||||
lt.tm_min = packedDate & 0x3F;
|
||||
lt.tm_hour = (packedDate >> 6) & 0x1F;
|
||||
//lt.tm_wday = (packedDate >> 11) & 7;
|
||||
lt.tm_mday = ((packedDate >> 14) & 0x3F) + 1;
|
||||
lt.tm_mon = (packedDate >> 20) & 0xF;
|
||||
lt.tm_year = ((packedDate >> 24) & 0x1F) + 100;
|
||||
|
||||
return mktime(<) + timezone;
|
||||
}
|
||||
|
||||
ByteBuffer& ReadPackedTime(uint32& time)
|
||||
{
|
||||
time = ReadPackedTime();
|
||||
return *this;
|
||||
}
|
||||
|
||||
const uint8 *contents() const { return &_storage[0]; }
|
||||
|
||||
size_t size() const { return _storage.size(); }
|
||||
@@ -438,6 +460,12 @@ class ByteBuffer
|
||||
append(packGUID, size);
|
||||
}
|
||||
|
||||
void AppendPackedTime(time_t time)
|
||||
{
|
||||
tm* lt = localtime(&time);
|
||||
append<uint32>((lt->tm_year - 100) << 24 | lt->tm_mon << 20 | (lt->tm_mday - 1) << 14 | lt->tm_wday << 11 | lt->tm_hour << 6 | lt->tm_min);
|
||||
}
|
||||
|
||||
void put(size_t pos, const uint8 *src, size_t cnt)
|
||||
{
|
||||
if (pos + cnt > size())
|
||||
|
||||
@@ -48,12 +48,6 @@ std::string secsToTimeString(uint64 timeInSecs, bool shortText = false, bool hou
|
||||
uint32 TimeStringToSecs(const std::string& timestring);
|
||||
std::string TimeToTimestampStr(time_t t);
|
||||
|
||||
inline uint32 secsToTimeBitFields(time_t secs)
|
||||
{
|
||||
tm* lt = localtime(&secs);
|
||||
return uint32((lt->tm_year - 100) << 24 | lt->tm_mon << 20 | (lt->tm_mday - 1) << 14 | lt->tm_wday << 11 | lt->tm_hour << 6 | lt->tm_min);
|
||||
}
|
||||
|
||||
/* Return a random number in the range min..max; (max-min) must be smaller than 32768. */
|
||||
int32 irand(int32 min, int32 max);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user