WRJServer/GameServer/User.cs

175 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace GameServer
{
public class User
{
#region
private static List<User> Users = new List<User>();
//private static ulong counter = 1;
#endregion
/// <summary>
/// 用户ID服务端
/// </summary>
public ulong userId = 0;
/// <summary>
/// 远程终端节点
/// </summary>
public string remoteId = "";
/// <summary>
/// 用户姓名
/// </summary>
public string username = "";
/// <summary>
/// 所在房间ID0表示不在任何房间
/// </summary>
public ulong roomId = 0;
public TcpClient client = null;
public NetworkStream stream = null;
/// <summary>
/// 用户构造函数
/// </summary>
/// <param name="_client">客户端</param>
/// <param name="_stream">流</param>
public User(TcpClient _client, NetworkStream _stream)
{
client = _client;
stream = _stream;
remoteId = client.Client.RemoteEndPoint.ToString();
Users.Add(this);
}
/// <summary>
/// 注册
/// </summary>
/// <param name="_username">名字</param>
public void Regist(string _username)
{
userId = ulong.Parse(_username);
username = _username;
byte[] response = Encoding.UTF8.GetBytes(string.Format("regist {0},{1},{2}", userId, username, roomId));
stream.WriteAsync(response, 0, response.Length);
}
/// <summary>
/// 写入
/// </summary>
/// <param name="msg"></param>
public void Write(string msg)
{
byte[] buffer = Encoding.UTF8.GetBytes(msg);
stream.WriteAsync(buffer, 0, buffer.Length);
}
public void OffLine()
{
Room.LeaveRoom(this);
Users.Remove(this);
}
/// <summary>
/// 创建用户
/// </summary>
/// <param name="_client"></param>
/// <returns></returns>
public static User Create(TcpClient _client, NetworkStream _stream)
{
return new User(_client, _stream);
}
/// <summary>
/// 获取用户列表
/// </summary>
/// <param name="except">除此之外(通常指自己)</param>
/// <returns></returns>
public static string GetUsers(ulong except, ulong roomId = 0)
{
StringBuilder sb = new StringBuilder();
var tempUsers = Users;
if (roomId != 0)
{
tempUsers = Users.Where(u => u.roomId.Equals(roomId)).ToList();
}
tempUsers.ForEach(u =>
{
if (u.userId != except)
{
sb.AppendFormat("{0},{1},{2};", u.userId, u.username, u.roomId);
}
});
return sb.ToString().Trim(';');
}
public static List<User> GetAllUsers()
{
return Users;
}
/// <summary>
/// 私发
/// </summary>
/// <param name="_userId"></param>
public static void Send2User(ulong _userId, string msg)
{
var user = Users.Find(u => u.userId == _userId);
if (user != null)
{
user.Write(msg);
}
}
/// <summary>
/// 房间
/// </summary>
/// <param name="_roomId"></param>
public static void Send2Room(ulong _userId, ulong _roomId, string msg)
{
var users = Users.Where(u => u.roomId == _roomId && u.userId != _userId).ToList();
users.ForEach(u =>
{
if (u.roomId != 0)
{
u.Write(msg);
}
});
}
/// <summary>
/// 房间
/// </summary>
/// <param name="_roomId"></param>
public static void Send2Player(ulong _userId, ulong _roomId, string msg)
{
var users = Users.Where(u => u.roomId == _roomId && u.userId != _userId).ToList();
users.ForEach(u =>
{
if (u.roomId != 0)
{
u.Write(String.Format("{0}", msg));
}
});
}
/// <summary>
/// 世界
/// </summary>
/// <param name="_user"></param>
public static void Send2World(User _user, string msg)
{
Users.ForEach((u) =>
{
if (u.userId != _user.userId)
u.Write(msg);
});
}
}
}