From 7485f016a328d84c52285494259a2d14ed39c308 Mon Sep 17 00:00:00 2001
From: sin365 <353374337@qq.com>
Date: Fri, 28 Jun 2024 17:43:55 +0800
Subject: [PATCH] =?UTF-8?q?=E5=BD=92=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../AxibugEmuOnline.Server.csproj | 19 +
.../AxibugEmuOnline.Server.csproj.user | 6 +
.../AxibugEmuOnline.Server/Common/Helper.cs | 20 +
.../Common/ProtoBufHelper.cs | 22 +
.../AxibugEmuOnline.Server/Event/EEvent.cs | 9 +
.../Event/EventSystem.cs | 216 +++
.../Manager/ChatManager.cs | 29 +
.../Manager/ClientManager.cs | 241 +++
.../Manager/GameManager.cs | 26 +
.../Manager/LogManager.cs | 29 +
.../Manager/LoginManager.cs | 32 +
.../Manager/ServerManager.cs | 33 +
.../NetWork/IOCPNetWork.cs | 63 +
.../AxibugEmuOnline.Server/NetWork/NetMsg.cs | 96 ++
.../AxibugEmuOnline.Server/Program.cs | 17 +
.../PublishProfiles/FolderProfile.pubxml | 18 +
.../PublishProfiles/FolderProfile.pubxml.user | 10 +
.../Protobuf/ProtobufAxibugEmuOnline.cs | 1398 +++++++++++++++++
Lib/Google.Protobuf.dll | Bin 0 -> 381952 bytes
Lib/HaoYueNet.ServerNetwork.dll | Bin 0 -> 24576 bytes
ProtobufCore/build_cs.bat | 16 +
.../out/CS/ProtobufAxibugEmuOnline.cs | 1398 +++++++++++++++++
.../proto/protobuf_AxibugEmuOnline.proto | 81 +
ProtobufCore/protoc.exe | Bin 0 -> 3121664 bytes
24 files changed, 3779 insertions(+)
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj.user
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/Helper.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EEvent.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EventSystem.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ChatManager.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ClientManager.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/GameManager.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LogManager.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LoginManager.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ServerManager.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/IOCPNetWork.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/NetMsg.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Program.cs
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml.user
create mode 100644 AxibugEmuOnline.Server/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs
create mode 100644 Lib/Google.Protobuf.dll
create mode 100644 Lib/HaoYueNet.ServerNetwork.dll
create mode 100644 ProtobufCore/build_cs.bat
create mode 100644 ProtobufCore/out/CS/ProtobufAxibugEmuOnline.cs
create mode 100644 ProtobufCore/proto/protobuf_AxibugEmuOnline.proto
create mode 100644 ProtobufCore/protoc.exe
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj
new file mode 100644
index 0000000..3d4aa88
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj
@@ -0,0 +1,19 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+ ..\..\Lib\Google.Protobuf.dll
+
+
+ ..\..\Lib\HaoYueNet.ServerNetwork.dll
+
+
+
+
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj.user b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj.user
new file mode 100644
index 0000000..939e9d6
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/AxibugEmuOnline.Server.csproj.user
@@ -0,0 +1,6 @@
+
+
+
+ <_LastSelectedProfileId>G:\Sin365\AxibugEmuOnline\AxibugEmuOnline.Server\AxibugEmuOnline.Server\Properties\PublishProfiles\FolderProfile.pubxml
+
+
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/Helper.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/Helper.cs
new file mode 100644
index 0000000..9d5a278
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/Helper.cs
@@ -0,0 +1,20 @@
+namespace AxibugEmuOnline.Server.Common
+{
+ public static class Helper
+ {
+ public static long GetNowTimeStamp()
+ {
+ return GetTimeStamp(DateTime.Now);
+ }
+
+ ///
+ /// 获取时间戳
+ ///
+ ///
+ public static long GetTimeStamp(DateTime dt)
+ {
+ TimeSpan ts = dt - new DateTime(1970, 1, 1, 0, 0, 0, 0);
+ return Convert.ToInt64(ts.TotalSeconds);
+ }
+ }
+}
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs
new file mode 100644
index 0000000..1554678
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Common/ProtoBufHelper.cs
@@ -0,0 +1,22 @@
+using Google.Protobuf;
+
+namespace AxibugEmuOnline.Server.Common
+{
+ public static class ProtoBufHelper
+ {
+
+ public static byte[] Serizlize(IMessage msg)
+ {
+ return msg.ToByteArray();
+ }
+
+ public static T DeSerizlize(byte[] bytes)
+ {
+ var msgType = typeof(T);
+ object msg = Activator.CreateInstance(msgType);
+ ((IMessage)msg).MergeFrom(bytes);
+ return (T)msg;
+ }
+ }
+
+}
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EEvent.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EEvent.cs
new file mode 100644
index 0000000..a4d0399
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EEvent.cs
@@ -0,0 +1,9 @@
+namespace AxibugEmuOnline.Server.Event
+{
+ public enum EEvent
+ {
+ // 添加你自己需要的事件类型
+ OnUserJoin,
+ OnUserLeave
+ }
+}
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EventSystem.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EventSystem.cs
new file mode 100644
index 0000000..7fb3750
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Event/EventSystem.cs
@@ -0,0 +1,216 @@
+using AxibugEmuOnline.Server.Manager;
+
+namespace AxibugEmuOnline.Server.Event
+{
+
+ public class EventSystem
+ {
+ private static EventSystem instance = new EventSystem();
+ public static EventSystem Instance { get { return instance; } }
+
+ private Dictionary> eventDic = new Dictionary>(128);
+
+ private EventSystem() { }
+
+
+ #region RegisterEvent
+ public void RegisterEvent(EEvent evt, Action callback)
+ {
+ InterRegisterEvent(evt, callback);
+ }
+
+ public void RegisterEvent(EEvent evt, Action callback)
+ {
+ InterRegisterEvent(evt, callback);
+ }
+
+ public void RegisterEvent(EEvent evt, Action callback)
+ {
+ InterRegisterEvent(evt, callback);
+ }
+
+ public void RegisterEvent(EEvent evt, Action callback)
+ {
+ InterRegisterEvent(evt, callback);
+ }
+
+ public void RegisterEvent(EEvent evt, Action callback)
+ {
+ InterRegisterEvent(evt, callback);
+ }
+
+ private void InterRegisterEvent(EEvent evt, Delegate callback)
+ {
+ if (eventDic.ContainsKey(evt))
+ {
+ if (eventDic[evt].IndexOf(callback) < 0)
+ {
+ eventDic[evt].Add(callback);
+ }
+ }
+ else
+ {
+ eventDic.Add(evt, new List() { callback });
+ }
+ }
+ #endregion
+
+ #region UnregisterEvent
+
+ public void UnregisterEvent(EEvent evt, Action callback)
+ {
+ Delegate tempDelegate = callback;
+ InterUnregisterEvent(evt, tempDelegate);
+ }
+
+ public void UnregisterEvent(EEvent evt, Action callback)
+ {
+ Delegate tempDelegate = callback;
+ InterUnregisterEvent(evt, tempDelegate);
+ }
+
+ public void UnregisterEvent(EEvent evt, Action callback)
+ {
+ Delegate tempDelegate = callback;
+ InterUnregisterEvent(evt, tempDelegate);
+ }
+
+ public void UnregisterEvent(EEvent evt, Action callback)
+ {
+ Delegate tempDelegate = callback;
+ InterUnregisterEvent(evt, tempDelegate);
+ }
+
+ public void UnregisterEvent(EEvent evt, Action callback)
+ {
+ Delegate tempDelegate = callback;
+ InterUnregisterEvent(evt, tempDelegate);
+ }
+
+ private void InterUnregisterEvent(EEvent evt, Delegate callback)
+ {
+ if (eventDic.ContainsKey(evt))
+ {
+ eventDic[evt].Remove(callback);
+ if (eventDic[evt].Count == 0) eventDic.Remove(evt);
+ }
+ }
+ #endregion
+
+ #region PostEvent
+ public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ {
+ List eventList = GetEventList(evt);
+ if (eventList != null)
+ {
+ foreach (Delegate callback in eventList)
+ {
+ try
+ {
+ ((Action)callback)(arg1, arg2, arg3, arg4);
+ }
+ catch (Exception e)
+ {
+ ServerManager.g_Log.Error(e.Message);
+ }
+ }
+ }
+ }
+
+ public void PostEvent(EEvent evt, T1 arg1, T2 arg2, T3 arg3)
+ {
+ List eventList = GetEventList(evt);
+ if (eventList != null)
+ {
+ foreach (Delegate callback in eventList)
+ {
+ try
+ {
+ ((Action)callback)(arg1, arg2, arg3);
+ }
+ catch (Exception e)
+ {
+ ServerManager.g_Log.Error(e.Message);
+ }
+ }
+ }
+ }
+
+ public void PostEvent(EEvent evt, T1 arg1, T2 arg2)
+ {
+ List eventList = GetEventList(evt);
+ if (eventList != null)
+ {
+ foreach (Delegate callback in eventList)
+ {
+ try
+ {
+ ((Action)callback)(arg1, arg2);
+ }
+ catch (Exception e)
+ {
+ ServerManager.g_Log.Error(e.Message);
+ }
+ }
+ }
+ }
+
+ public void PostEvent(EEvent evt, T arg)
+ {
+ List eventList = GetEventList(evt);
+ if (eventList != null)
+ {
+ foreach (Delegate callback in eventList)
+ {
+ try
+ {
+ ((Action)callback)(arg);
+ }
+ catch (Exception e)
+ {
+ ServerManager.g_Log.Error(e.Message + ", method name : " + callback.Method);
+ }
+ }
+ }
+
+ }
+
+ public void PostEvent(EEvent evt)
+ {
+ List eventList = GetEventList(evt);
+ if (eventList != null)
+ {
+ foreach (Delegate callback in eventList)
+ {
+ try
+ {
+ ((Action)callback)();
+ }
+ catch (Exception e)
+ {
+ ServerManager.g_Log.Error(e.Message);
+ }
+ }
+ }
+ }
+ #endregion
+
+ ///
+ /// 获取所有事件
+ ///
+ ///
+ ///
+ private List GetEventList(EEvent evt)
+ {
+ if (eventDic.ContainsKey(evt))
+ {
+ List tempList = eventDic[evt];
+ if (null != tempList)
+ {
+ return tempList;
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ChatManager.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ChatManager.cs
new file mode 100644
index 0000000..0773168
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ChatManager.cs
@@ -0,0 +1,29 @@
+using AxibugProtobuf;
+using AxibugEmuOnline.Server.Common;
+using AxibugEmuOnline.Server.NetWork;
+using System.Net.Sockets;
+
+namespace AxibugEmuOnline.Server.Manager
+{
+ public class ChatManager
+ {
+ public ChatManager()
+ {
+ NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdChatmsg, RecvPlayerChatMsg);
+ }
+
+ public void RecvPlayerChatMsg(Socket sk, byte[] reqData)
+ {
+ ClientInfo _c = ServerManager.g_ClientMgr.GetClientForSocket(sk);
+ ServerManager.g_Log.Debug("收到聊天消息请求");
+ Protobuf_ChatMsg msg = ProtoBufHelper.DeSerizlize(reqData);
+ byte[] respData = ProtoBufHelper.Serizlize(new Protobuf_ChatMsg_RESP()
+ {
+ ChatMsg = msg.ChatMsg,
+ NickName = _c.Account,
+ Date = Helper.GetNowTimeStamp()
+ });
+ ServerManager.g_ClientMgr.ClientSendALL((int)CommandID.CmdChatmsg, (int)ErrorCode.ErrorOk, respData);
+ }
+ }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ClientManager.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ClientManager.cs
new file mode 100644
index 0000000..99ed3c2
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ClientManager.cs
@@ -0,0 +1,241 @@
+using AxibugProtobuf;
+using System.Net.Sockets;
+using System.Timers;
+
+namespace AxibugEmuOnline.Server.Manager
+{
+ public class ClientInfo
+ {
+ public long UID { get; set; }
+ public string Account { get; set; }
+ public Socket _socket { get; set; }
+ public bool IsOffline { get; set; } = false;
+ public DateTime LogOutDT { get; set; }
+
+
+ }
+
+ public class ClientManager
+ {
+ private List ClientList = new List();
+ private Dictionary _DictSocketClient = new Dictionary();
+ private Dictionary _DictUIDClient = new Dictionary();
+ private long TestUIDSeed = 0;
+
+ private System.Timers.Timer _ClientCheckTimer;
+ private long _RemoveOfflineCacheMin;
+ ///
+ /// 初始化并指定检查时间
+ ///
+ /// tick检查毫秒数
+ /// 清理掉线分钟数
+ public void Init(long ticktime, long RemoveOfflineCacheMin)
+ {
+ //换算成毫秒
+ _RemoveOfflineCacheMin = RemoveOfflineCacheMin;
+ _ClientCheckTimer = new System.Timers.Timer();
+ _ClientCheckTimer.Interval = ticktime;
+ _ClientCheckTimer.AutoReset = true;
+ _ClientCheckTimer.Elapsed += new ElapsedEventHandler(ClientCheckClearOffline_Elapsed);
+ _ClientCheckTimer.Enabled = true;
+ }
+
+ public long GetNextUID()
+ {
+ return ++TestUIDSeed;
+ }
+
+ private void ClientCheckClearOffline_Elapsed(object sender, ElapsedEventArgs e)
+ {
+ DateTime CheckDT = DateTime.Now.AddMinutes(-1 * _RemoveOfflineCacheMin);
+ ClientInfo[] OfflineClientlist = ClientList.Where(w => w.IsOffline == true && w.LogOutDT < CheckDT).ToArray();
+
+ Console.WriteLine("开始清理离线过久的玩家的缓存");
+ for (int i = 0; i < OfflineClientlist.Length; i++)
+ {
+ //to do 掉线处理
+ RemoveClient(OfflineClientlist[i]);
+ }
+ GC.Collect();
+ }
+
+
+ //通用处理
+ #region clientlist 处理
+
+ public ClientInfo JoinNewClient(Protobuf_Login data, Socket _socket)
+ {
+ //也许这个函数需加lock
+ ClientInfo cinfo = GetClientForSocket(_socket);
+ //如果连接还在
+ if (cinfo != null)
+ {
+ cinfo.IsOffline = false;
+ }
+ else
+ {
+ cinfo = new ClientInfo()
+ {
+ UID = GetNextUID(),
+ _socket = _socket,
+ Account = data.Account,
+ IsOffline = false,
+ };
+ AddClient(cinfo);
+ }
+ return cinfo;
+ }
+
+
+ ///
+ /// 增加用户
+ ///
+ ///
+ void AddClient(ClientInfo clientInfo)
+ {
+ try
+ {
+ Console.WriteLine("追加连接玩家 UID=>" + clientInfo.UID + " | " + clientInfo.Account);
+ lock (ClientList)
+ {
+ _DictUIDClient.Add(clientInfo.UID, clientInfo);
+ _DictSocketClient.Add(clientInfo._socket, clientInfo);
+ ClientList.Add(clientInfo);
+ }
+ }
+ catch (Exception ex)
+ {
+ ex.ToString();
+ }
+ }
+
+ ///
+ /// 清理连接
+ ///
+ ///
+ public void RemoveClient(ClientInfo client)
+ {
+ lock (ClientList)
+ {
+ if (_DictUIDClient.ContainsKey(client.UID))
+ _DictUIDClient.Remove(client.UID);
+
+ if (_DictSocketClient.ContainsKey(client._socket))
+ _DictSocketClient.Remove(client._socket);
+
+ ClientList.Remove(client);
+ }
+ }
+
+ ///
+ /// 清理连接
+ ///
+ ///
+ public bool GetClientByUID(long uid,out ClientInfo client)
+ {
+ lock (ClientList)
+ {
+ if (!_DictUIDClient.ContainsKey(uid))
+ {
+ client = null;
+ return false;
+ }
+
+ client = _DictUIDClient[uid];
+ return true;
+ }
+ }
+
+
+ public ClientInfo GetClientForSocket(Socket sk)
+ {
+ return _DictSocketClient.ContainsKey(sk) ? _DictSocketClient[sk] : null;
+ }
+
+ ///
+ /// 获取在线玩家
+ ///
+ ///
+ public List GetOnlineClientList()
+ {
+ return ClientList.Where(w => w.IsOffline == false).ToList();
+ }
+
+
+ ///
+ /// 设置玩家离线
+ ///
+ ///
+ public void SetClientOfflineForSocket(Socket sk)
+ {
+ if (!_DictSocketClient.ContainsKey(sk))
+ return;
+
+ ClientInfo cinfo = _DictSocketClient[sk];
+ Console.WriteLine("标记玩家UID" + cinfo.UID + "为离线");
+ cinfo.IsOffline = true;
+ cinfo.LogOutDT = DateTime.Now;
+ }
+
+ public void RemoveClientForSocket(Socket sk)
+ {
+ if (!_DictSocketClient.ContainsKey(sk))
+ return;
+
+ RemoveClient(_DictSocketClient[sk]);
+ }
+
+ #endregion
+
+ public void ClientSendALL(int CMDID, int ERRCODE, byte[] data, long SkipUID = -1)
+ {
+ ClientSend(ClientList, CMDID, ERRCODE, data, SkipUID);
+ }
+
+ ///
+ /// 给一组用户发送数据
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void ClientSend(List _toclientlist, int CMDID, int ERRCODE, byte[] data,long SkipUID = -1)
+ {
+ for (int i = 0; i < _toclientlist.Count(); i++)
+ {
+ if (_toclientlist[i] == null || _toclientlist[i].IsOffline)
+ continue;
+
+ if(SkipUID > -1 && _toclientlist[i].UID == SkipUID)
+ continue;
+
+ ServerManager.g_SocketMgr.SendToSocket(_toclientlist[i]._socket, CMDID, ERRCODE, data);
+ }
+ }
+
+ public void ClientSend(Socket _socket, int CMDID, int ERRCODE, byte[] data)
+ {
+ //Console.WriteLine("发送数据 CMDID->"+ CMDID);
+ ServerManager.g_SocketMgr.SendToSocket(_socket, CMDID, ERRCODE, data);
+ }
+
+ ///
+ /// 给一个连接发送数据
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void ClientSend(ClientInfo _c, int CMDID, int ERRCODE, byte[] data)
+ {
+ if (_c == null || _c.IsOffline)
+ return;
+ ServerManager.g_SocketMgr.SendToSocket(_c._socket, CMDID, ERRCODE, data);
+ }
+
+ public int GetOnlineClient()
+ {
+ return ClientList.Where(w => !w.IsOffline).Count();
+ }
+ }
+}
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/GameManager.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/GameManager.cs
new file mode 100644
index 0000000..29cc0df
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/GameManager.cs
@@ -0,0 +1,26 @@
+using AxibugEmuOnline.Server.Common;
+using AxibugEmuOnline.Server.Manager;
+using AxibugEmuOnline.Server.NetWork;
+using AxibugProtobuf;
+using System.Net;
+using System.Net.Sockets;
+
+namespace AxibugEmuOnline.Server
+{
+
+ public class GameManager
+ {
+ public GameManager()
+ {
+ NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdScreen, OnCmdScreen);
+ }
+
+ public void OnCmdScreen(Socket sk, byte[] reqData)
+ {
+ ServerManager.g_Log.Debug($"OnCmdScreen lenght:{reqData.Length}");
+ ClientInfo _c = ServerManager.g_ClientMgr.GetClientForSocket(sk);
+ Protobuf_Screnn_Frame msg = ProtoBufHelper.DeSerizlize(reqData);
+ ServerManager.g_ClientMgr.ClientSendALL((int)CommandID.CmdScreen, (int)ErrorCode.ErrorOk, reqData, _c.UID);
+ }
+ }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LogManager.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LogManager.cs
new file mode 100644
index 0000000..927f0b2
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LogManager.cs
@@ -0,0 +1,29 @@
+namespace AxibugEmuOnline.Server.Manager
+{
+ public class LogManager
+ {
+ public void Info(string str)
+ {
+ Console.WriteLine(str);
+ }
+ public void Debug(string str)
+ {
+ Console.WriteLine(str);
+ }
+
+ public void Warning(string str)
+ {
+ Console.WriteLine(str);
+ }
+
+ public void Error(string str)
+ {
+ Console.WriteLine(str);
+ }
+
+ public void Log(int logtype, string str)
+ {
+ Console.WriteLine(str);
+ }
+ }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LoginManager.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LoginManager.cs
new file mode 100644
index 0000000..a7e4fe9
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/LoginManager.cs
@@ -0,0 +1,32 @@
+using AxibugProtobuf;
+using AxibugEmuOnline.Server.Common;
+using AxibugEmuOnline.Server.NetWork;
+using System.Net.Sockets;
+
+namespace AxibugEmuOnline.Server.Manager
+{
+ public class LoginManager
+ {
+ public LoginManager()
+ {
+ NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdLogin, UserLogin);
+ }
+
+ public void UserLogin(Socket _socket, byte[] reqData)
+ {
+ ServerManager.g_Log.Debug("收到新的登录请求");
+ Protobuf_Login msg = ProtoBufHelper.DeSerizlize(reqData);
+ ClientInfo cinfo = ServerManager.g_ClientMgr.JoinNewClient(msg, _socket);
+
+ byte[] respData = ProtoBufHelper.Serizlize(new Protobuf_Login_RESP()
+ {
+ Status = LoginResultStatus.Ok,
+ RegDate = "",
+ LastLoginDate = "",
+ Token = "",
+ UID = cinfo.UID
+ });
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ServerManager.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ServerManager.cs
new file mode 100644
index 0000000..00a36c8
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Manager/ServerManager.cs
@@ -0,0 +1,33 @@
+using AxibugEmuOnline.Server.Manager;
+using AxibugEmuOnline.Server.NetWork;
+using System.Net;
+
+namespace AxibugEmuOnline.Server
+{
+
+ public static class ServerManager
+ {
+ public static ClientManager g_ClientMgr;
+ public static LogManager g_Log;
+ public static LoginManager g_Login;
+ public static ChatManager g_Chat;
+ public static IOCPNetWork g_SocketMgr;
+ public static GameManager g_Game;
+
+ public static void InitServer(int port)
+ {
+ g_ClientMgr = new ClientManager();
+ g_ClientMgr.Init(45000, 120);
+ g_Log = new LogManager();
+ g_Login = new LoginManager();
+ g_Chat = new ChatManager();
+ //g_SocketMgr = new IOCPNetWork(1024, 1024);
+ g_SocketMgr = new IOCPNetWork(1024, 4096);
+ g_Game = new GameManager();
+
+ g_SocketMgr.Init();
+ g_SocketMgr.Start(new IPEndPoint(IPAddress.Any.Address, port));
+ Console.WriteLine("Succeed!");
+ }
+ }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/IOCPNetWork.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/IOCPNetWork.cs
new file mode 100644
index 0000000..94b2722
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/IOCPNetWork.cs
@@ -0,0 +1,63 @@
+using HaoYueNet.ServerNetwork;
+using System.Net.Sockets;
+
+namespace AxibugEmuOnline.Server.NetWork
+{
+ public class IOCPNetWork : TcpSaeaServer
+ {
+ public IOCPNetWork(int numConnections, int receiveBufferSize)
+ : base(numConnections, receiveBufferSize)
+ {
+ OnClientNumberChange += ClientNumberChange;
+ OnReceive += ReceiveData;
+ OnDisconnected += OnDisconnect;
+ OnNetLog += OnShowNetLog;
+ }
+
+ private void ClientNumberChange(int num, AsyncUserToken token)
+ {
+ Console.WriteLine("Client数发生变化");
+ }
+
+ ///
+ /// 接受包回调
+ ///
+ /// 协议ID
+ /// 错误编号
+ /// 业务数据
+ private void ReceiveData(AsyncUserToken token, int CMDID, byte[] data)
+ {
+ DataCallBack(token.Socket, CMDID, data);
+ }
+
+ public void DataCallBack(Socket sk, int CMDID, byte[] data)
+ {
+ //ServerManager.g_Log.Debug("收到消息 CMDID =>" + CMDID + " 数据长度=>" + data.Length);
+ try
+ {
+ //抛出网络数据
+ NetMsg.Instance.PostNetMsgEvent(CMDID, sk, data);
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine("逻辑处理错误:" + ex.ToString());
+ }
+ }
+
+ ///
+ /// 断开连接
+ ///
+ ///
+ public void OnDisconnect(AsyncUserToken token)
+ {
+ Console.WriteLine("断开连接");
+ ServerManager.g_ClientMgr.SetClientOfflineForSocket(token.Socket);
+ }
+
+ public void OnShowNetLog(string msg)
+ {
+ ServerManager.g_Log.Debug(msg);
+ }
+
+ }
+}
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/NetMsg.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/NetMsg.cs
new file mode 100644
index 0000000..3bd94fa
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/NetWork/NetMsg.cs
@@ -0,0 +1,96 @@
+using System.Net.Sockets;
+
+namespace AxibugEmuOnline.Server.NetWork
+{
+
+ public class NetMsg
+ {
+ private static NetMsg instance = new NetMsg();
+ public static NetMsg Instance { get { return instance; } }
+
+ private Dictionary> netEventDic = new Dictionary>(128);
+
+ private NetMsg() { }
+
+
+ #region RegisterMsgEvent
+
+ public void RegNetMsgEvent(int cmd, Action callback)
+ {
+ InterRegNetMsgEvent(cmd, callback);
+ }
+
+ private void InterRegNetMsgEvent(int cmd, Delegate callback)
+ {
+ if (netEventDic.ContainsKey(cmd))
+ {
+ if (netEventDic[cmd].IndexOf(callback) < 0)
+ {
+ netEventDic[cmd].Add(callback);
+ }
+ }
+ else
+ {
+ netEventDic.Add(cmd, new List() { callback });
+ }
+ }
+ #endregion
+
+ #region UnregisterCMD
+
+ public void UnregisterCMD(int cmd, Action callback)
+ {
+ Delegate tempDelegate = callback;
+ InterUnregisterCMD(cmd, tempDelegate);
+ }
+
+ private void InterUnregisterCMD(int cmd, Delegate callback)
+ {
+ if (netEventDic.ContainsKey(cmd))
+ {
+ netEventDic[cmd].Remove(callback);
+ if (netEventDic[cmd].Count == 0) netEventDic.Remove(cmd);
+ }
+ }
+ #endregion
+
+ #region PostEvent
+ public void PostNetMsgEvent(int cmd, Socket arg1, byte[] arg2)
+ {
+ List eventList = GetNetEventDicList(cmd);
+ if (eventList != null)
+ {
+ foreach (Delegate callback in eventList)
+ {
+ try
+ {
+ ((Action)callback)(arg1, arg2);
+ }
+ catch (Exception e)
+ {
+ ServerManager.g_Log.Error(e.Message);
+ }
+ }
+ }
+ }
+ #endregion
+
+ ///
+ /// 获取所有事件
+ ///
+ ///
+ ///
+ private List GetNetEventDicList(int cmd)
+ {
+ if (netEventDic.ContainsKey(cmd))
+ {
+ List tempList = netEventDic[cmd];
+ if (null != tempList)
+ {
+ return tempList;
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Program.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Program.cs
new file mode 100644
index 0000000..6d4a122
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Program.cs
@@ -0,0 +1,17 @@
+namespace AxibugEmuOnline.Server
+{
+ internal class Program
+ {
+ static string Title = "AxibugEmuOnline.Server";
+ static void Main(string[] args)
+ {
+ Console.ForegroundColor = ConsoleColor.Green;
+ Console.Title = Title;
+ ServerManager.InitServer(10492);
+ while (true)
+ {
+ Console.ReadLine();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml
new file mode 100644
index 0000000..d37ba18
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml
@@ -0,0 +1,18 @@
+
+
+
+
+ Release
+ Any CPU
+ bin\Release\net8.0\publish\win-x64\
+ FileSystem
+ <_TargetId>Folder
+ net8.0
+ win-x64
+ false
+ false
+ false
+
+
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml.user b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml.user
new file mode 100644
index 0000000..de2ab1d
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -0,0 +1,10 @@
+
+
+
+
+ True|2024-06-28T08:25:59.3159172Z;True|2024-06-28T15:30:49.8257235+08:00;
+
+
+
\ No newline at end of file
diff --git a/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs
new file mode 100644
index 0000000..b23e13b
--- /dev/null
+++ b/AxibugEmuOnline.Server/AxibugEmuOnline.Server/Protobuf/ProtobufAxibugEmuOnline.cs
@@ -0,0 +1,1398 @@
+//
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// source: protobuf_AxibugEmuOnline.proto
+//
+#pragma warning disable 1591, 0612, 3021
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace AxibugProtobuf {
+
+ /// Holder for reflection information generated from protobuf_AxibugEmuOnline.proto
+ public static partial class ProtobufAxibugEmuOnlineReflection {
+
+ #region Descriptor
+ /// File descriptor for protobuf_AxibugEmuOnline.proto
+ public static pbr::FileDescriptor Descriptor {
+ get { return descriptor; }
+ }
+ private static pbr::FileDescriptor descriptor;
+
+ static ProtobufAxibugEmuOnlineReflection() {
+ byte[] descriptorData = global::System.Convert.FromBase64String(
+ string.Concat(
+ "Ch5wcm90b2J1Zl9BeGlidWdFbXVPbmxpbmUucHJvdG8SDkF4aWJ1Z1Byb3Rv",
+ "YnVmIiMKEFByb3RvYnVmX0NoYXRNc2cSDwoHQ2hhdE1zZxgBIAEoCSJIChVQ",
+ "cm90b2J1Zl9DaGF0TXNnX1JFU1ASEAoITmlja05hbWUYASABKAkSDwoHQ2hh",
+ "dE1zZxgCIAEoCRIMCgREYXRlGAMgASgDIpEBCg5Qcm90b2J1Zl9Mb2dpbhIs",
+ "Cglsb2dpblR5cGUYASABKA4yGS5BeGlidWdQcm90b2J1Zi5Mb2dpblR5cGUS",
+ "LgoKZGV2aWNlVHlwZRgCIAEoDjIaLkF4aWJ1Z1Byb3RvYnVmLkRldmljZVR5",
+ "cGUSDwoHQWNjb3VudBgDIAEoCRIQCghQYXNzd29yZBgEIAEoCSKMAQoTUHJv",
+ "dG9idWZfTG9naW5fUkVTUBINCgVUb2tlbhgBIAEoCRIVCg1MYXN0TG9naW5E",
+ "YXRlGAIgASgJEg8KB1JlZ0RhdGUYAyABKAkSMQoGU3RhdHVzGAQgASgOMiEu",
+ "QXhpYnVnUHJvdG9idWYuTG9naW5SZXN1bHRTdGF0dXMSCwoDVUlEGAUgASgD",
+ "IjsKFVByb3RvYnVmX1NjcmVubl9GcmFtZRIPCgdGcmFtZUlEGAEgASgFEhEK",
+ "CVJhd0JpdG1hcBgCIAEoDCpOCglDb21tYW5kSUQSDgoKQ01EX0RFRkFVTBAA",
+ "Eg4KCUNNRF9MT0dJThDRDxIQCgtDTURfQ0hBVE1TRxChHxIPCgpDTURfU2Ny",
+ "ZWVuEIknKisKCUVycm9yQ29kZRIQCgxFUlJPUl9ERUZBVUwQABIMCghFUlJP",
+ "Ul9PSxABKhwKCUxvZ2luVHlwZRIPCgtCYXNlRGVmYXVsdBAAKksKCkRldmlj",
+ "ZVR5cGUSFgoSRGV2aWNlVHlwZV9EZWZhdWx0EAASBgoCUEMQARILCgdBbmRy",
+ "b2lkEAISBwoDSU9TEAMSBwoDUFNWEAQqTgoRTG9naW5SZXN1bHRTdGF0dXMS",
+ "IQodTG9naW5SZXN1bHRTdGF0dXNfQmFzZURlZmF1bHQQABIGCgJPSxABEg4K",
+ "CkFjY291bnRFcnIQAkICSAFiBnByb3RvMw=="));
+ descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+ new pbr::FileDescriptor[] { },
+ new pbr::GeneratedClrTypeInfo(new[] {typeof(global::AxibugProtobuf.CommandID), typeof(global::AxibugProtobuf.ErrorCode), typeof(global::AxibugProtobuf.LoginType), typeof(global::AxibugProtobuf.DeviceType), typeof(global::AxibugProtobuf.LoginResultStatus), }, null, new pbr::GeneratedClrTypeInfo[] {
+ new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_ChatMsg), global::AxibugProtobuf.Protobuf_ChatMsg.Parser, new[]{ "ChatMsg" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_ChatMsg_RESP), global::AxibugProtobuf.Protobuf_ChatMsg_RESP.Parser, new[]{ "NickName", "ChatMsg", "Date" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Login), global::AxibugProtobuf.Protobuf_Login.Parser, new[]{ "LoginType", "DeviceType", "Account", "Password" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Login_RESP), global::AxibugProtobuf.Protobuf_Login_RESP.Parser, new[]{ "Token", "LastLoginDate", "RegDate", "Status", "UID" }, null, null, null, null),
+ new pbr::GeneratedClrTypeInfo(typeof(global::AxibugProtobuf.Protobuf_Screnn_Frame), global::AxibugProtobuf.Protobuf_Screnn_Frame.Parser, new[]{ "FrameID", "RawBitmap" }, null, null, null, null)
+ }));
+ }
+ #endregion
+
+ }
+ #region Enums
+ public enum CommandID {
+ ///
+ ///缺省不使用
+ ///
+ [pbr::OriginalName("CMD_DEFAUL")] CmdDefaul = 0,
+ ///
+ ///自动登录上行 | 下行 对应 Protobuf_Login | Protobuf_Login_RESP
+ ///
+ [pbr::OriginalName("CMD_LOGIN")] CmdLogin = 2001,
+ ///
+ ///广播信息上行 | 下行 对应 Protobuf_ChatMsg | Protobuf_ChatMsg_RESP
+ ///
+ [pbr::OriginalName("CMD_CHATMSG")] CmdChatmsg = 4001,
+ ///
+ ///画面同步 | 同步广播 对应 Protobuf_Screnn_Frame
+ ///
+ [pbr::OriginalName("CMD_Screen")] CmdScreen = 5001,
+ }
+
+ public enum ErrorCode {
+ ///
+ ///缺省不使用
+ ///
+ [pbr::OriginalName("ERROR_DEFAUL")] ErrorDefaul = 0,
+ ///
+ ///成功
+ ///
+ [pbr::OriginalName("ERROR_OK")] ErrorOk = 1,
+ }
+
+ public enum LoginType {
+ ///
+ ///缺省不使用
+ ///
+ [pbr::OriginalName("BaseDefault")] BaseDefault = 0,
+ }
+
+ public enum DeviceType {
+ ///
+ ///缺省不使用
+ ///
+ [pbr::OriginalName("DeviceType_Default")] Default = 0,
+ [pbr::OriginalName("PC")] Pc = 1,
+ [pbr::OriginalName("Android")] Android = 2,
+ [pbr::OriginalName("IOS")] Ios = 3,
+ [pbr::OriginalName("PSV")] Psv = 4,
+ }
+
+ public enum LoginResultStatus {
+ ///
+ ///缺省不使用
+ ///
+ [pbr::OriginalName("LoginResultStatus_BaseDefault")] BaseDefault = 0,
+ [pbr::OriginalName("OK")] Ok = 1,
+ [pbr::OriginalName("AccountErr")] AccountErr = 2,
+ }
+
+ #endregion
+
+ #region Messages
+ ///
+ ///聊天 上行
+ ///
+ public sealed partial class Protobuf_ChatMsg : pb::IMessage
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_ChatMsg());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[0]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_ChatMsg() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_ChatMsg(Protobuf_ChatMsg other) : this() {
+ chatMsg_ = other.chatMsg_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_ChatMsg Clone() {
+ return new Protobuf_ChatMsg(this);
+ }
+
+ /// Field number for the "ChatMsg" field.
+ public const int ChatMsgFieldNumber = 1;
+ private string chatMsg_ = "";
+ ///
+ ///消息
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string ChatMsg {
+ get { return chatMsg_; }
+ set {
+ chatMsg_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Protobuf_ChatMsg);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Protobuf_ChatMsg other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (ChatMsg != other.ChatMsg) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (ChatMsg.Length != 0) hash ^= ChatMsg.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (ChatMsg.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(ChatMsg);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (ChatMsg.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(ChatMsg);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (ChatMsg.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(ChatMsg);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Protobuf_ChatMsg other) {
+ if (other == null) {
+ return;
+ }
+ if (other.ChatMsg.Length != 0) {
+ ChatMsg = other.ChatMsg;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ ChatMsg = input.ReadString();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 10: {
+ ChatMsg = input.ReadString();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ ///
+ ///聊天 下行
+ ///
+ public sealed partial class Protobuf_ChatMsg_RESP : pb::IMessage
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_ChatMsg_RESP());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[1]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_ChatMsg_RESP() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_ChatMsg_RESP(Protobuf_ChatMsg_RESP other) : this() {
+ nickName_ = other.nickName_;
+ chatMsg_ = other.chatMsg_;
+ date_ = other.date_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_ChatMsg_RESP Clone() {
+ return new Protobuf_ChatMsg_RESP(this);
+ }
+
+ /// Field number for the "NickName" field.
+ public const int NickNameFieldNumber = 1;
+ private string nickName_ = "";
+ ///
+ ///昵称
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string NickName {
+ get { return nickName_; }
+ set {
+ nickName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "ChatMsg" field.
+ public const int ChatMsgFieldNumber = 2;
+ private string chatMsg_ = "";
+ ///
+ ///消息
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string ChatMsg {
+ get { return chatMsg_; }
+ set {
+ chatMsg_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "Date" field.
+ public const int DateFieldNumber = 3;
+ private long date_;
+ ///
+ ///时间
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public long Date {
+ get { return date_; }
+ set {
+ date_ = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Protobuf_ChatMsg_RESP);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Protobuf_ChatMsg_RESP other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (NickName != other.NickName) return false;
+ if (ChatMsg != other.ChatMsg) return false;
+ if (Date != other.Date) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (NickName.Length != 0) hash ^= NickName.GetHashCode();
+ if (ChatMsg.Length != 0) hash ^= ChatMsg.GetHashCode();
+ if (Date != 0L) hash ^= Date.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (NickName.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(NickName);
+ }
+ if (ChatMsg.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteString(ChatMsg);
+ }
+ if (Date != 0L) {
+ output.WriteRawTag(24);
+ output.WriteInt64(Date);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (NickName.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(NickName);
+ }
+ if (ChatMsg.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteString(ChatMsg);
+ }
+ if (Date != 0L) {
+ output.WriteRawTag(24);
+ output.WriteInt64(Date);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (NickName.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(NickName);
+ }
+ if (ChatMsg.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(ChatMsg);
+ }
+ if (Date != 0L) {
+ size += 1 + pb::CodedOutputStream.ComputeInt64Size(Date);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Protobuf_ChatMsg_RESP other) {
+ if (other == null) {
+ return;
+ }
+ if (other.NickName.Length != 0) {
+ NickName = other.NickName;
+ }
+ if (other.ChatMsg.Length != 0) {
+ ChatMsg = other.ChatMsg;
+ }
+ if (other.Date != 0L) {
+ Date = other.Date;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ NickName = input.ReadString();
+ break;
+ }
+ case 18: {
+ ChatMsg = input.ReadString();
+ break;
+ }
+ case 24: {
+ Date = input.ReadInt64();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 10: {
+ NickName = input.ReadString();
+ break;
+ }
+ case 18: {
+ ChatMsg = input.ReadString();
+ break;
+ }
+ case 24: {
+ Date = input.ReadInt64();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ ///
+ ///登录数据上行
+ ///
+ public sealed partial class Protobuf_Login : pb::IMessage
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Login());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[2]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Login() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Login(Protobuf_Login other) : this() {
+ loginType_ = other.loginType_;
+ deviceType_ = other.deviceType_;
+ account_ = other.account_;
+ password_ = other.password_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Login Clone() {
+ return new Protobuf_Login(this);
+ }
+
+ /// Field number for the "loginType" field.
+ public const int LoginTypeFieldNumber = 1;
+ private global::AxibugProtobuf.LoginType loginType_ = global::AxibugProtobuf.LoginType.BaseDefault;
+ ///
+ ///登录操作类型 [0]皓月通行证 [3] 皓月BF3 [4] 皓月BF4
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public global::AxibugProtobuf.LoginType LoginType {
+ get { return loginType_; }
+ set {
+ loginType_ = value;
+ }
+ }
+
+ /// Field number for the "deviceType" field.
+ public const int DeviceTypeFieldNumber = 2;
+ private global::AxibugProtobuf.DeviceType deviceType_ = global::AxibugProtobuf.DeviceType.Default;
+ ///
+ ///设备类型 [0]PC [1]AndroidPad预留 [3]IPad预留
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public global::AxibugProtobuf.DeviceType DeviceType {
+ get { return deviceType_; }
+ set {
+ deviceType_ = value;
+ }
+ }
+
+ /// Field number for the "Account" field.
+ public const int AccountFieldNumber = 3;
+ private string account_ = "";
+ ///
+ ///用户名
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Account {
+ get { return account_; }
+ set {
+ account_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "Password" field.
+ public const int PasswordFieldNumber = 4;
+ private string password_ = "";
+ ///
+ ///密码
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Password {
+ get { return password_; }
+ set {
+ password_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Protobuf_Login);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Protobuf_Login other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (LoginType != other.LoginType) return false;
+ if (DeviceType != other.DeviceType) return false;
+ if (Account != other.Account) return false;
+ if (Password != other.Password) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) hash ^= LoginType.GetHashCode();
+ if (DeviceType != global::AxibugProtobuf.DeviceType.Default) hash ^= DeviceType.GetHashCode();
+ if (Account.Length != 0) hash ^= Account.GetHashCode();
+ if (Password.Length != 0) hash ^= Password.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) {
+ output.WriteRawTag(8);
+ output.WriteEnum((int) LoginType);
+ }
+ if (DeviceType != global::AxibugProtobuf.DeviceType.Default) {
+ output.WriteRawTag(16);
+ output.WriteEnum((int) DeviceType);
+ }
+ if (Account.Length != 0) {
+ output.WriteRawTag(26);
+ output.WriteString(Account);
+ }
+ if (Password.Length != 0) {
+ output.WriteRawTag(34);
+ output.WriteString(Password);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) {
+ output.WriteRawTag(8);
+ output.WriteEnum((int) LoginType);
+ }
+ if (DeviceType != global::AxibugProtobuf.DeviceType.Default) {
+ output.WriteRawTag(16);
+ output.WriteEnum((int) DeviceType);
+ }
+ if (Account.Length != 0) {
+ output.WriteRawTag(26);
+ output.WriteString(Account);
+ }
+ if (Password.Length != 0) {
+ output.WriteRawTag(34);
+ output.WriteString(Password);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (LoginType != global::AxibugProtobuf.LoginType.BaseDefault) {
+ size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) LoginType);
+ }
+ if (DeviceType != global::AxibugProtobuf.DeviceType.Default) {
+ size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) DeviceType);
+ }
+ if (Account.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Account);
+ }
+ if (Password.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Password);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Protobuf_Login other) {
+ if (other == null) {
+ return;
+ }
+ if (other.LoginType != global::AxibugProtobuf.LoginType.BaseDefault) {
+ LoginType = other.LoginType;
+ }
+ if (other.DeviceType != global::AxibugProtobuf.DeviceType.Default) {
+ DeviceType = other.DeviceType;
+ }
+ if (other.Account.Length != 0) {
+ Account = other.Account;
+ }
+ if (other.Password.Length != 0) {
+ Password = other.Password;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 8: {
+ LoginType = (global::AxibugProtobuf.LoginType) input.ReadEnum();
+ break;
+ }
+ case 16: {
+ DeviceType = (global::AxibugProtobuf.DeviceType) input.ReadEnum();
+ break;
+ }
+ case 26: {
+ Account = input.ReadString();
+ break;
+ }
+ case 34: {
+ Password = input.ReadString();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 8: {
+ LoginType = (global::AxibugProtobuf.LoginType) input.ReadEnum();
+ break;
+ }
+ case 16: {
+ DeviceType = (global::AxibugProtobuf.DeviceType) input.ReadEnum();
+ break;
+ }
+ case 26: {
+ Account = input.ReadString();
+ break;
+ }
+ case 34: {
+ Password = input.ReadString();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ ///
+ ///登录数据下行
+ ///
+ public sealed partial class Protobuf_Login_RESP : pb::IMessage
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Login_RESP());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[3]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Login_RESP() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Login_RESP(Protobuf_Login_RESP other) : this() {
+ token_ = other.token_;
+ lastLoginDate_ = other.lastLoginDate_;
+ regDate_ = other.regDate_;
+ status_ = other.status_;
+ uID_ = other.uID_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Login_RESP Clone() {
+ return new Protobuf_Login_RESP(this);
+ }
+
+ /// Field number for the "Token" field.
+ public const int TokenFieldNumber = 1;
+ private string token_ = "";
+ ///
+ ///登录凭据 (本次登录之后,所有业务请求凭据,需要存储在内存中)
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string Token {
+ get { return token_; }
+ set {
+ token_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "LastLoginDate" field.
+ public const int LastLoginDateFieldNumber = 2;
+ private string lastLoginDate_ = "";
+ ///
+ ///上次登录时间(只用于呈现的字符串,若界面需求需要)
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string LastLoginDate {
+ get { return lastLoginDate_; }
+ set {
+ lastLoginDate_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "RegDate" field.
+ public const int RegDateFieldNumber = 3;
+ private string regDate_ = "";
+ ///
+ ///注册时间(只用于呈现的字符串,若界面需求需要)
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public string RegDate {
+ get { return regDate_; }
+ set {
+ regDate_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ /// Field number for the "Status" field.
+ public const int StatusFieldNumber = 4;
+ private global::AxibugProtobuf.LoginResultStatus status_ = global::AxibugProtobuf.LoginResultStatus.BaseDefault;
+ ///
+ ///账号状态 (预留) [1]正常[0]被禁封
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public global::AxibugProtobuf.LoginResultStatus Status {
+ get { return status_; }
+ set {
+ status_ = value;
+ }
+ }
+
+ /// Field number for the "UID" field.
+ public const int UIDFieldNumber = 5;
+ private long uID_;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public long UID {
+ get { return uID_; }
+ set {
+ uID_ = value;
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Protobuf_Login_RESP);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Protobuf_Login_RESP other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Token != other.Token) return false;
+ if (LastLoginDate != other.LastLoginDate) return false;
+ if (RegDate != other.RegDate) return false;
+ if (Status != other.Status) return false;
+ if (UID != other.UID) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (Token.Length != 0) hash ^= Token.GetHashCode();
+ if (LastLoginDate.Length != 0) hash ^= LastLoginDate.GetHashCode();
+ if (RegDate.Length != 0) hash ^= RegDate.GetHashCode();
+ if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) hash ^= Status.GetHashCode();
+ if (UID != 0L) hash ^= UID.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (Token.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(Token);
+ }
+ if (LastLoginDate.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteString(LastLoginDate);
+ }
+ if (RegDate.Length != 0) {
+ output.WriteRawTag(26);
+ output.WriteString(RegDate);
+ }
+ if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) {
+ output.WriteRawTag(32);
+ output.WriteEnum((int) Status);
+ }
+ if (UID != 0L) {
+ output.WriteRawTag(40);
+ output.WriteInt64(UID);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (Token.Length != 0) {
+ output.WriteRawTag(10);
+ output.WriteString(Token);
+ }
+ if (LastLoginDate.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteString(LastLoginDate);
+ }
+ if (RegDate.Length != 0) {
+ output.WriteRawTag(26);
+ output.WriteString(RegDate);
+ }
+ if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) {
+ output.WriteRawTag(32);
+ output.WriteEnum((int) Status);
+ }
+ if (UID != 0L) {
+ output.WriteRawTag(40);
+ output.WriteInt64(UID);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (Token.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(Token);
+ }
+ if (LastLoginDate.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(LastLoginDate);
+ }
+ if (RegDate.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeStringSize(RegDate);
+ }
+ if (Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) {
+ size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Status);
+ }
+ if (UID != 0L) {
+ size += 1 + pb::CodedOutputStream.ComputeInt64Size(UID);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Protobuf_Login_RESP other) {
+ if (other == null) {
+ return;
+ }
+ if (other.Token.Length != 0) {
+ Token = other.Token;
+ }
+ if (other.LastLoginDate.Length != 0) {
+ LastLoginDate = other.LastLoginDate;
+ }
+ if (other.RegDate.Length != 0) {
+ RegDate = other.RegDate;
+ }
+ if (other.Status != global::AxibugProtobuf.LoginResultStatus.BaseDefault) {
+ Status = other.Status;
+ }
+ if (other.UID != 0L) {
+ UID = other.UID;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 10: {
+ Token = input.ReadString();
+ break;
+ }
+ case 18: {
+ LastLoginDate = input.ReadString();
+ break;
+ }
+ case 26: {
+ RegDate = input.ReadString();
+ break;
+ }
+ case 32: {
+ Status = (global::AxibugProtobuf.LoginResultStatus) input.ReadEnum();
+ break;
+ }
+ case 40: {
+ UID = input.ReadInt64();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 10: {
+ Token = input.ReadString();
+ break;
+ }
+ case 18: {
+ LastLoginDate = input.ReadString();
+ break;
+ }
+ case 26: {
+ RegDate = input.ReadString();
+ break;
+ }
+ case 32: {
+ Status = (global::AxibugProtobuf.LoginResultStatus) input.ReadEnum();
+ break;
+ }
+ case 40: {
+ UID = input.ReadInt64();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ public sealed partial class Protobuf_Screnn_Frame : pb::IMessage
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ , pb::IBufferMessage
+ #endif
+ {
+ private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Protobuf_Screnn_Frame());
+ private pb::UnknownFieldSet _unknownFields;
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pb::MessageParser Parser { get { return _parser; } }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::AxibugProtobuf.ProtobufAxibugEmuOnlineReflection.Descriptor.MessageTypes[4]; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Screnn_Frame() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Screnn_Frame(Protobuf_Screnn_Frame other) : this() {
+ frameID_ = other.frameID_;
+ rawBitmap_ = other.rawBitmap_;
+ _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public Protobuf_Screnn_Frame Clone() {
+ return new Protobuf_Screnn_Frame(this);
+ }
+
+ /// Field number for the "FrameID" field.
+ public const int FrameIDFieldNumber = 1;
+ private int frameID_;
+ ///
+ ///帧编号
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int FrameID {
+ get { return frameID_; }
+ set {
+ frameID_ = value;
+ }
+ }
+
+ /// Field number for the "RawBitmap" field.
+ public const int RawBitmapFieldNumber = 2;
+ private pb::ByteString rawBitmap_ = pb::ByteString.Empty;
+ ///
+ ///渲染层画面
+ ///
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public pb::ByteString RawBitmap {
+ get { return rawBitmap_; }
+ set {
+ rawBitmap_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+ }
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override bool Equals(object other) {
+ return Equals(other as Protobuf_Screnn_Frame);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public bool Equals(Protobuf_Screnn_Frame other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (FrameID != other.FrameID) return false;
+ if (RawBitmap != other.RawBitmap) return false;
+ return Equals(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override int GetHashCode() {
+ int hash = 1;
+ if (FrameID != 0) hash ^= FrameID.GetHashCode();
+ if (RawBitmap.Length != 0) hash ^= RawBitmap.GetHashCode();
+ if (_unknownFields != null) {
+ hash ^= _unknownFields.GetHashCode();
+ }
+ return hash;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void WriteTo(pb::CodedOutputStream output) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ output.WriteRawMessage(this);
+ #else
+ if (FrameID != 0) {
+ output.WriteRawTag(8);
+ output.WriteInt32(FrameID);
+ }
+ if (RawBitmap.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteBytes(RawBitmap);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(output);
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+ if (FrameID != 0) {
+ output.WriteRawTag(8);
+ output.WriteInt32(FrameID);
+ }
+ if (RawBitmap.Length != 0) {
+ output.WriteRawTag(18);
+ output.WriteBytes(RawBitmap);
+ }
+ if (_unknownFields != null) {
+ _unknownFields.WriteTo(ref output);
+ }
+ }
+ #endif
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public int CalculateSize() {
+ int size = 0;
+ if (FrameID != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(FrameID);
+ }
+ if (RawBitmap.Length != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeBytesSize(RawBitmap);
+ }
+ if (_unknownFields != null) {
+ size += _unknownFields.CalculateSize();
+ }
+ return size;
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(Protobuf_Screnn_Frame other) {
+ if (other == null) {
+ return;
+ }
+ if (other.FrameID != 0) {
+ FrameID = other.FrameID;
+ }
+ if (other.RawBitmap.Length != 0) {
+ RawBitmap = other.RawBitmap;
+ }
+ _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ public void MergeFrom(pb::CodedInputStream input) {
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ input.ReadRawMessage(this);
+ #else
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+ break;
+ case 8: {
+ FrameID = input.ReadInt32();
+ break;
+ }
+ case 18: {
+ RawBitmap = input.ReadBytes();
+ break;
+ }
+ }
+ }
+ #endif
+ }
+
+ #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+ void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+ break;
+ case 8: {
+ FrameID = input.ReadInt32();
+ break;
+ }
+ case 18: {
+ RawBitmap = input.ReadBytes();
+ break;
+ }
+ }
+ }
+ }
+ #endif
+
+ }
+
+ #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/Lib/Google.Protobuf.dll b/Lib/Google.Protobuf.dll
new file mode 100644
index 0000000000000000000000000000000000000000..7663c313cb9e24f3c80190a0b2509d839ad1fd5f
GIT binary patch
literal 381952
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⁢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