using System; using System.Net; using CSNetwork; using CSNetwork.GPDataType; using BrewMonster.Common; using UnityEngine; // Account login info struct public struct AccountLoginInfo { public uint login_time; public uint login_ip; public uint current_ip; public void Reset() { login_time = 0; login_ip = 0; current_ip = 0; } } // Game runtime partial class partial class CECGameRun { public AccountLoginInfo m_AccountLoginInfo = new AccountLoginInfo(); public bool m_bAccountLoginInfoShown = false; public byte m_accountInfoFlag = 0; public bool m_bAccountInfoShown = false; public void ResetAccountLoginInfo() { m_AccountLoginInfo.Reset(); m_bAccountLoginInfoShown = true; } /// /// Hiển thị thông tin đăng nhập của tài khoản (thời gian & IP). /// Hàm này được gọi khi người chơi vào thế giới game. /// Thông báo chỉ hiển thị một lần duy nhất theo phiên chơi nhờ biến m_bAccountLoginInfoShown. /// public void ShowAccountLoginInfo() { Debug.Log("[Cuong] ShowAccountLoginInfo"); // Kiểm tra cờ xem đã hiển thị thông tin đăng nhập chưa để tránh in lặp lại nhiều lần. if (!m_bAccountLoginInfoShown) { m_bAccountLoginInfoShown = true; // (Trong C++ gốc: CECUIConfig::Instance().GetGameUI().bEnableShowIP) // Hiện tại mặc định bật cờ hiển thị IP đăng nhập. bool bEnableShowIP = true; if (bEnableShowIP) { // 1. Tính toán và hiển thị thời gian đăng nhập lần trước (Last login time). // Hàm này cộng dồn số giây cấu hình được từ server so với mốc Epoch (1/1/1970) sang Local time. DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); DateTime t = Epoch.AddSeconds(m_AccountLoginInfo.login_time).ToLocalTime(); string timeStr = string.Format("({0}-{1:00}-{2:00} {3:00}:{4:00})", t.Year, t.Month, t.Day, t.Hour, t.Minute); string textTime = string.Format("Lần đăng nhập trước: {0}", timeStr); // Tương đương mảng TextTable ID 9343 // Phát sinh sự kiện để hệ thống Chat in log vào kênh SYSTEM. EventBus.Publish(new GameSession.ChatMessageEvent { context = textTime, channel = (byte)ChatChannel.GP_CHAT_SYSTEM }); Debug.Log($"[Cuong] ShowAccountLoginInfo {textTime}"); // 2. Định dạng và hiển thị IP đăng nhập lần trước (Last login IP). // Dùng IPAddress parse giá trị số nguyên long ra dạng IPv4 chuẩn. string ipStr = new IPAddress((long)m_AccountLoginInfo.login_ip).ToString(); string textIp = string.Format("IP đăng nhập trước: {0}", ipStr); // Tương đương mảng TextTable ID 9344 EventBus.Publish(new GameSession.ChatMessageEvent { context = textIp, channel = (byte)ChatChannel.GP_CHAT_SYSTEM }); Debug.Log($"[Cuong] ShowAccountLoginInfo {textIp}"); // 3. Định dạng và hiển thị IP đăng nhập hiện tại (Current login IP). string curIpStr = new IPAddress((long)m_AccountLoginInfo.current_ip).ToString(); string textCurIp = string.Format("IP đăng nhập hiện tại: {0}", curIpStr); // Tương đương mảng TextTable ID 9345 EventBus.Publish(new GameSession.ChatMessageEvent { context = textCurIp, channel = (byte)ChatChannel.GP_CHAT_SYSTEM }); Debug.Log($"[Cuong] ShowAccountLoginInfo {textCurIp}"); } } } public void SetAccountInfoFlag(byte accountinfo_flag) { m_accountInfoFlag = accountinfo_flag; m_bAccountInfoShown = false; } public void ShowAccountInfo() { if (!m_bAccountInfoShown) { m_bAccountInfoShown = true; bool bEnableCompleteAccount = true; if (bEnableCompleteAccount && ((m_accountInfoFlag & 0x03) != 0)) { string text = "Hoàn tất thông tin tài khoản..."; // 9347 EventBus.Publish(new GameSession.ChatMessageEvent { context = text, channel = (byte)ChatChannel.GP_CHAT_SYSTEM }); Debug.Log($"[Cuong] ShowAccountInfo {text}"); } } } /// /// Seconds between chat reminders (default 10). Change at runtime or in code as needed. /// public float healthPlaytimeChatReminderIntervalSeconds = 600f; private uint _healthPlaytimeChatReminderAccumMs; private bool _healthPlaytimeChatReminderDidImmediateThisSession; private const string HealthPlaytimeChatReminderText = "Chơi game quá 180 phút có hại cho sức khoẻ"; private static void PublishHealthPlaytimeChatReminder() { string redMsg = "" + HealthPlaytimeChatReminderText + ""; EventBus.Publish(new GameSession.ChatMessageEvent(redMsg, (byte)ChatChannel.GP_CHAT_SYSTEM)); } private void TickHealthPlaytimeChatReminder(uint dwDeltaMs) { if (GetGameState() != (int)GameState.GS_GAME) { _healthPlaytimeChatReminderAccumMs = 0; _healthPlaytimeChatReminderDidImmediateThisSession = false; return; } if (!_healthPlaytimeChatReminderDidImmediateThisSession) { _healthPlaytimeChatReminderDidImmediateThisSession = true; _healthPlaytimeChatReminderAccumMs = 0; PublishHealthPlaytimeChatReminder(); } float intervalSec = Mathf.Max(0.1f, healthPlaytimeChatReminderIntervalSeconds); uint intervalMs = (uint)(intervalSec * 1000f); if (intervalMs < 1) intervalMs = 1; _healthPlaytimeChatReminderAccumMs += dwDeltaMs; while (_healthPlaytimeChatReminderAccumMs >= intervalMs) { _healthPlaytimeChatReminderAccumMs -= intervalMs; PublishHealthPlaytimeChatReminder(); } } }