You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

79 lines
2.1 KiB

using System;
namespace Sog
{
/*
64-61 4b inst id (1-15)
60-57 4b server type index (1-15)
56-47 10b worldid (1-1023)
46-15 32b time
14-1 14b seq = 16384
*/
public class ServerUniqueIDMgr
{
public readonly uint UID_START_TIME = 1655827200; //2022/6/22
private ulong baseUUid;
private ulong timeGap;
private ulong uuid;
private const int InstIdBitNum = 4;
private const int servertypeindexBitNum = 4;
private const int worldIdBitNum = 10;
private static ServerType[] UsedServerTypes = { ServerType.Game, ServerType.Arena, ServerType.Account};
public ServerUniqueIDMgr(uint serverId)
{
int serverType = ServerIDUtils.GetServerType(serverId);
uint instId = ServerIDUtils.GetInstanceID(serverId);
uint worldId = ServerIDUtils.GetWorldID(serverId);
int serverTypeIndex = -1;
for (int i = 0; i < UsedServerTypes.Length; i++)
{
if(serverType == (int)UsedServerTypes[i])
{
serverTypeIndex = i;
break;
}
}
if(serverTypeIndex == -1)
{
throw new Exception("servertype need add to UsedServerTypes");
}
if (instId >= (1 << InstIdBitNum))
{
throw new Exception("instId overflow");
}
if (serverTypeIndex >= (1 << servertypeindexBitNum))
{
throw new Exception("serverTypeIndex overflow");
}
if (worldId >= (1 << worldIdBitNum))
{
throw new Exception("worldId overflow");
}
timeGap = (ulong)(AppTime.GetNowSysSecond() - UID_START_TIME);
baseUUid = ((ulong)instId << 60) | ((ulong)serverTypeIndex << 56) | ((ulong)worldId << 46) | (timeGap << 14);
uuid = baseUUid;
}
public ulong GenUniqueId()
{
uuid++;
return uuid;
}
}
}