75 lines
1.9 KiB
C#
75 lines
1.9 KiB
C#
namespace WebApi.Project.UniqueKeyApi.Socket.Object
|
|
{
|
|
public class ObjectManager
|
|
{
|
|
public static ObjectManager Instance { get; } = new ObjectManager();
|
|
|
|
object _lock = new object();
|
|
Dictionary<int, Client> _players = new Dictionary<int, Client>();
|
|
|
|
// [UNUSED(1)][TYPE(7)][ID(24)]
|
|
int _counter = 0;
|
|
|
|
public T Add<T>() where T : Client, new()
|
|
{
|
|
T gameObject = new T();
|
|
|
|
lock (_lock)
|
|
{
|
|
gameObject.Id = GenerateId(gameObject.ObjectType);
|
|
|
|
if (gameObject.ObjectType == EnumObjectType.Client)
|
|
{
|
|
_players.Add(gameObject.Id, gameObject as Client);
|
|
}
|
|
}
|
|
|
|
return gameObject;
|
|
}
|
|
|
|
int GenerateId(EnumObjectType type)
|
|
{
|
|
lock (_lock)
|
|
{
|
|
return ((int)type << 24) | (_counter++);
|
|
}
|
|
}
|
|
|
|
public static EnumObjectType GetObjectTypeById(int id)
|
|
{
|
|
int type = (id >> 24) & 0x7F;
|
|
return (EnumObjectType)type;
|
|
}
|
|
|
|
public bool Remove(int objectId)
|
|
{
|
|
EnumObjectType objectType = GetObjectTypeById(objectId);
|
|
|
|
lock (_lock)
|
|
{
|
|
if (objectType == EnumObjectType.Client)
|
|
return _players.Remove(objectId);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public Client Find(int objectId)
|
|
{
|
|
EnumObjectType objectType = GetObjectTypeById(objectId);
|
|
|
|
lock (_lock)
|
|
{
|
|
if (objectType == EnumObjectType.Client)
|
|
{
|
|
Client player = null;
|
|
if (_players.TryGetValue(objectId, out player))
|
|
return player;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|