Core/Calendar: Implement different timezone support for ingame calendar

Port From (https://github.com/TrinityCore/TrinityCore/commit/b888b1b09f71a8b8b4a9d45c804a1f164fb65ac3)
This commit is contained in:
hondacrx
2024-02-21 16:36:19 -05:00
parent 47a64b8782
commit 0f4130704a
25 changed files with 831 additions and 322 deletions
+44 -18
View File
@@ -200,7 +200,8 @@ namespace Game.Guilds
{
GuildRoster roster = new();
roster.NumAccounts = (int)m_accountsNumber;
roster.CreateDate = (uint)m_createdDate;
roster.CreateDate.SetUtcTimeFromUnixTime(m_createdDate);
roster.CreateDate += session.GetTimezoneOffset();
roster.GuildFlags = 0;
bool sendOfficerNote = _HasRankRight(session.GetPlayer(), GuildRankRights.ViewOffNote);
@@ -558,7 +559,7 @@ namespace Game.Guilds
return;
}
// Invited player cannot be invited
// Invited player cannot be invited
if (pInvitee.GetGuildIdInvited() != 0)
{
SendCommandResult(session, GuildCommandType.InvitePlayer, GuildCommandError.AlreadyInvitedToGuild_S, name);
@@ -1040,7 +1041,10 @@ namespace Game.Guilds
GuildNewsPkt packet = new();
foreach (var newsLogEntry in newsLog)
{
newsLogEntry.WritePacket(packet);
packet.NewsEvents.Last().CompletedDate += session.GetTimezoneOffset();
}
session.SendPacket(packet);
}
@@ -1535,17 +1539,20 @@ namespace Game.Guilds
}
}
public void BroadcastPacketIfTrackingAchievement(ServerPacket packet, uint criteriaId)
public List<Player> GetMembersTrackingCriteria(uint criteriaId)
{
foreach (var member in m_members.Values)
List<Player> members = new();
foreach (var (_, member) in m_members)
{
if (member.IsTrackingCriteriaId(criteriaId))
{
Player player = member.FindPlayer();
if (player != null)
player.SendPacket(packet);
members.Add(player);
}
}
return members;
}
public void MassInviteToEvent(WorldSession session, uint minLevel, uint maxLevel, GuildRankOrder minRank)
@@ -1717,7 +1724,7 @@ namespace Game.Guilds
player.SetGuildLevel(0);
foreach (var entry in CliDB.GuildPerkSpellsStorage.Values)
player.RemoveSpell(entry.SpellID, false, false);
player.RemoveSpell(entry.SpellID, false, false);
}
else
Global.CharacterCacheStorage.UpdateCharacterGuildId(guid, 0);
@@ -1754,7 +1761,7 @@ namespace Game.Guilds
return Math.Min(m_bankMoney, (ulong)_GetMemberRemainingMoney(member));
}
public void SwapItems(Player player, byte tabId, byte slotId, byte destTabId, byte destSlotId, uint splitedAmount)
{
if (tabId >= _GetPurchasedTabsSize() || slotId >= GuildConst.MaxBankSlots ||
@@ -1805,7 +1812,7 @@ namespace Game.Guilds
{
return m_ranks.Find(rank => rank.GetOrder() == rankOrder);
}
// Private methods
void _CreateNewBankTab()
{
@@ -1841,7 +1848,7 @@ namespace Game.Guilds
stmt.AddValue(0, m_id);
trans.Append(stmt);
_CreateRank(trans, Global.ObjectMgr.GetCypherString( CypherStrings.GuildMaster, loc), GuildRankRights.All);
_CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildMaster, loc), GuildRankRights.All);
_CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildOfficer, loc), GuildRankRights.All);
_CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildVeteran, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak);
_CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildMember, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak);
@@ -2404,9 +2411,16 @@ namespace Game.Guilds
NewsLogEntry news = m_newsLog.AddEvent(trans, new NewsLogEntry(m_id, m_newsLog.GetNextGUID(), type, guid, flags, value));
DB.Characters.CommitTransaction(trans);
GuildNewsPkt newsPacket = new();
news.WritePacket(newsPacket);
BroadcastPacket(newsPacket);
var packetBuilder = (Player receiver) =>
{
GuildNewsPkt newsPacket = new();
news.WritePacket(newsPacket);
newsPacket.NewsEvents.Last().CompletedDate += receiver.GetSession().GetTimezoneOffset();
receiver.SendPacket(newsPacket);
};
BroadcastWorker(packetBuilder);
}
bool HasAchieved(uint achievementId)
@@ -2432,6 +2446,7 @@ namespace Game.Guilds
GuildNewsPkt newsPacket = new();
newsLog.WritePacket(newsPacket);
newsPacket.NewsEvents.Last().CompletedDate += session.GetTimezoneOffset();
session.SendPacket(newsPacket);
}
@@ -2455,6 +2470,17 @@ namespace Game.Guilds
}
}
public void BroadcastWorker(Action<Player> _do, Player except = null)
{
foreach (var member in m_members.Values)
{
Player player = member.FindPlayer();
if (player != null)
if (player != except)
_do.Invoke(player);
}
}
public int GetMembersCount() { return m_members.Count; }
public GuildAchievementMgr GetAchievementMgr() { return m_achievementSys; }
@@ -3077,7 +3103,7 @@ namespace Game.Guilds
GuildNewsEvent newsEvent = new();
newsEvent.Id = (int)GetGUID();
newsEvent.MemberGuid = GetPlayerGuid();
newsEvent.CompletedDate = (uint)GetTimestamp();
newsEvent.CompletedDate.SetUtcTimeFromUnixTime(GetTimestamp());
newsEvent.Flags = GetFlags();
newsEvent.Type = (int)GetNewsType();
@@ -3116,9 +3142,9 @@ namespace Game.Guilds
// Checks if new log entry can be added to holder
public bool CanInsert() { return m_log.Count < m_maxRecords; }
public byte GetSize() { return (byte)m_log.Count; }
public void LoadEvent(T entry)
{
if (m_nextGUID == GuildConst.EventLogGuidUndefined)
@@ -3540,7 +3566,7 @@ namespace Game.Guilds
{
return ValidateEmblemColors(m_style, m_color, m_borderStyle, m_borderColor, m_backgroundColor);
}
public static bool ValidateEmblemColors(uint style, uint color, uint borderStyle, uint borderColor, uint backgroundColor)
{
return CliDB.GuildColorBackgroundStorage.ContainsKey(backgroundColor) &&
@@ -3650,7 +3676,7 @@ namespace Game.Guilds
{
m_pPlayer.SendEquipError(result, item);
}
public abstract bool IsBank();
// Initializes item. Returns true, if item exists, false otherwise.
public abstract bool InitItem();
@@ -3823,7 +3849,7 @@ namespace Game.Guilds
public override void LogBankEvent(SQLTransaction trans, MoveItemData pFrom, uint count)
{
Cypher.Assert(pFrom.GetItem() != null);
Cypher.Assert(pFrom.GetItem() != null);
if (pFrom.IsBank())
// Bank . Bank
m_pGuild._LogBankEvent(trans, GuildBankEventLogTypes.MoveItem, pFrom.GetContainer(), m_pPlayer.GetGUID().GetCounter(),