Files
test/Assets/PerfectWorld/Scripts/MainFiles/EC_Game.Time.cs
T

67 lines
2.8 KiB
C#

using UnityEngine;
using System;
namespace BrewMonster.Network
{
public partial class EC_Game
{
private static uint m_AbsTickStart;
private static int m_AbsTimeStart;
private static int m_iTimeError; // 服务器与本机时间差(秒) // Time error in seconds
private static int m_iTimeZoneBias; // 服务器时区偏移(秒) // Server timezone bias in seconds
// 设置时间误差 // Set time error
public static void SetServerTime(int iSevTime, int iTimeZoneBias)
{
Debug.Log($"SetServerTime, iSevTime = {iSevTime}, iTimeZoneBias = {iTimeZoneBias}");
int iOldTimeError = m_iTimeError;
int nowUnix = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds();
m_iTimeError = iSevTime - nowUnix; // 记录与本机的时间差 // store delta with local
m_iTimeZoneBias = iTimeZoneBias; // 记录服务器时区偏移 // store server timezone bias
// 计算服务器本地时间并设置昼夜 // Compute server local time and set time of day
var serverLocal = DateTimeOffset.FromUnixTimeSeconds((long)iSevTime + iTimeZoneBias);
int nTimeInDay = serverLocal.Hour * 3600 + serverLocal.Minute * 60 + serverLocal.Second;
// GetGameRun()->GetWorld()->GetSunMoon()->SetTimeOfTheDay(nTimeInDay / (4.0f * 3600.0f));
// 设置昼夜时间(原逻辑保留为注释) // Set time of day (original call left commented)
// 防沉迷时长修正 // Anti-wallow playtime adjust
// S2C::player_wallow_info wallowinfo = GetGameRun()->GetWallowInfo();
// if (wallowinfo.anti_wallow_active)
// {
// wallowinfo.play_time += m_iTimeError - iOldTimeError;
// GetGameRun()->SetWallowInfo(wallowinfo);
// }
// 初始化绝对时间参考点 // Initialize absolute time reference
m_AbsTimeStart = iSevTime;
m_AbsTickStart = (uint)(Time.realtimeSinceStartup * 1000.0f);
Debug.Log($"timeGetTime(), TickStart = {m_AbsTickStart}");
}
public static int GetServerAbsTime()
{
uint curTick = (uint)(Time.realtimeSinceStartup * 1000.0f);
if (curTick < m_AbsTickStart)
{
// if player run this game more than 49.71 days...
uint sec = (((uint)~0u - m_AbsTickStart + 1u) + curTick) / 1000u;
m_AbsTickStart = curTick;
m_AbsTimeStart += (int)sec;
return m_AbsTimeStart;
}
else
{
uint sec = (curTick - m_AbsTickStart) / 1000u;
return m_AbsTimeStart + (int)sec;
}
}
public float timeGetTime()
{
return Time.time;
}
}
}