[성현모] UniqueKeyApi Sokcet 완료
This commit is contained in:
@ -0,0 +1,74 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user