Files
a301_mmo_game_server/MMOTestServer/MMOserver/Game/Channel/ChannelManager.cs

96 lines
2.2 KiB
C#

using LiteNetLib;
using MMOserver.Utils;
namespace MMOserver.Game.Channel;
public class ChannelManager : Singleton<ChannelManager>
{
// 채널 관리
private Dictionary<int, Channel> channels = new Dictionary<int, Channel>();
// 보스 레이드 채널
private readonly int bossChannelStart = 10000;
private readonly int bossChannelSize = 10;
// 채널별 유저 관리 (유저 key, 채널 val)
private Dictionary<int, int> connectUsers = new Dictionary<int, int>();
public ChannelManager()
{
Initializer();
}
public void Initializer(int channelSize = 1)
{
for (int i = 1; i <= channelSize; i++)
{
channels.Add(i, new Channel(i));
}
// 보스 채널 생성
for (int i = 1; i <= bossChannelSize; i++)
{
int bossChannel = i + bossChannelStart;
channels.Add(bossChannel, new Channel(bossChannel));
}
}
public Channel GetChannel(int channelId)
{
return channels[channelId];
}
public Dictionary<int, Channel> GetChannels()
{
return channels;
}
public void AddUser(int channelId, int userId, Player player, NetPeer peer)
{
// 유저 추가 (채널 이동 시 기존 매핑 덮어쓰기 허용)
connectUsers[userId] = channelId;
// 채널에 유저 + peer 추가
channels[channelId].AddUser(userId, player, peer);
}
public bool RemoveUser(int userId)
{
// 채널에 없는 유저면 스킵
if (!connectUsers.TryGetValue(userId, out int channelId))
{
return false;
}
// 날린다.
if (channelId >= 0)
{
channels[channelId].RemoveUser(userId);
connectUsers.Remove(userId);
return true;
}
return false;
}
public int HasUser(int userId)
{
int channelId = -1;
if (connectUsers.ContainsKey(userId))
{
channelId = connectUsers[userId];
}
if (channelId != -1)
{
return channels[channelId].HasUser(userId);
}
return channelId;
}
public Dictionary<int, int> GetConnectUsers()
{
return connectUsers;
}
}