160 lines
4.2 KiB
C#
Raw Normal View History

2020-12-07 21:19:16 +00:00
using QuantumUNET.Messages;
using QuantumUNET.Transport;
2020-12-07 21:19:16 +00:00
using System.Collections.Generic;
2020-12-02 12:42:26 +00:00
using UnityEngine;
2020-12-04 22:14:53 +00:00
namespace QuantumUNET
2020-12-02 12:42:26 +00:00
{
2020-12-03 08:28:05 +00:00
internal class QSBLocalClient : QSBNetworkClient
2020-12-02 12:42:26 +00:00
{
public override void Disconnect()
{
QSBClientScene.HandleClientDisconnect(m_Connection);
if (m_Connected)
{
PostInternalMessage(33);
m_Connected = false;
}
m_AsyncConnect = ConnectState.Disconnected;
2020-12-02 12:42:26 +00:00
m_LocalServer.RemoveLocalClient(m_Connection);
}
internal void InternalConnectLocalServer(bool generateConnectMsg)
{
if (m_FreeMessages == null)
{
m_FreeMessages = new Stack<InternalMsg>();
for (var i = 0; i < 64; i++)
{
var t = default(InternalMsg);
m_FreeMessages.Push(t);
}
}
m_LocalServer = QSBNetworkServer.instance;
2020-12-02 18:40:38 +00:00
m_Connection = new QSBULocalConnectionToServer(m_LocalServer);
SetHandlers(m_Connection);
2020-12-02 12:42:26 +00:00
m_Connection.connectionId = m_LocalServer.AddLocalClient(this);
m_AsyncConnect = ConnectState.Connected;
SetActive(true);
RegisterSystemHandlers(true);
2020-12-02 12:42:26 +00:00
if (generateConnectMsg)
{
PostInternalMessage(32);
}
m_Connected = true;
}
internal override void Update() => ProcessInternalMessages();
internal void AddLocalPlayer(QSBPlayerController localPlayer)
{
Debug.Log(string.Concat(new object[]
{
"Local client AddLocalPlayer ",
2020-12-03 11:56:32 +00:00
localPlayer.Gameobject.name,
2020-12-02 12:42:26 +00:00
" conn=",
m_Connection.connectionId
}));
m_Connection.isReady = true;
m_Connection.SetPlayerController(localPlayer);
2020-12-03 11:56:32 +00:00
var unetView = localPlayer.UnetView;
2020-12-02 12:42:26 +00:00
if (unetView != null)
{
2020-12-03 11:56:32 +00:00
QSBClientScene.SetLocalObject(unetView.NetId, localPlayer.Gameobject);
2020-12-02 12:42:26 +00:00
unetView.SetConnectionToServer(m_Connection);
}
2020-12-03 11:56:32 +00:00
QSBClientScene.InternalAddPlayer(unetView, localPlayer.PlayerControllerId);
2020-12-02 12:42:26 +00:00
}
private void PostInternalMessage(byte[] buffer, int channelId)
{
InternalMsg item;
if (m_FreeMessages.Count == 0)
{
item = default;
}
else
{
item = m_FreeMessages.Pop();
}
item.buffer = buffer;
item.channelId = channelId;
m_InternalMsgs.Add(item);
}
private void PostInternalMessage(short msgType)
{
2020-12-04 09:23:27 +00:00
var networkWriter = new QSBNetworkWriter();
2020-12-02 12:42:26 +00:00
networkWriter.StartMessage(msgType);
networkWriter.FinishMessage();
PostInternalMessage(networkWriter.AsArray(), 0);
}
private void ProcessInternalMessages()
{
if (m_InternalMsgs.Count != 0)
{
var internalMsgs = m_InternalMsgs;
m_InternalMsgs = m_InternalMsgs2;
for (var i = 0; i < internalMsgs.Count; i++)
{
var t = internalMsgs[i];
2020-12-03 11:56:32 +00:00
if (s_InternalMessage.Reader == null)
2020-12-02 12:42:26 +00:00
{
2020-12-04 09:23:27 +00:00
s_InternalMessage.Reader = new QSBNetworkReader(t.buffer);
2020-12-02 12:42:26 +00:00
}
else
{
2020-12-04 21:04:18 +00:00
s_InternalMessage.Reader.Replace(t.buffer);
2020-12-02 12:42:26 +00:00
}
2020-12-03 11:56:32 +00:00
s_InternalMessage.Reader.ReadInt16();
s_InternalMessage.ChannelId = t.channelId;
s_InternalMessage.Connection = connection;
2020-12-03 11:56:32 +00:00
s_InternalMessage.MsgType = s_InternalMessage.Reader.ReadInt16();
2020-12-02 12:42:26 +00:00
m_Connection.InvokeHandler(s_InternalMessage);
m_FreeMessages.Push(t);
connection.lastMessageTime = Time.time;
2020-12-02 12:42:26 +00:00
}
m_InternalMsgs = internalMsgs;
m_InternalMsgs.Clear();
for (var j = 0; j < m_InternalMsgs2.Count; j++)
{
m_InternalMsgs.Add(m_InternalMsgs2[j]);
}
m_InternalMsgs2.Clear();
}
}
2020-12-04 09:23:27 +00:00
internal void InvokeHandlerOnClient(short msgType, QSBMessageBase msg, int channelId)
2020-12-02 12:42:26 +00:00
{
2020-12-04 09:23:27 +00:00
var networkWriter = new QSBNetworkWriter();
2020-12-02 12:42:26 +00:00
networkWriter.StartMessage(msgType);
msg.Serialize(networkWriter);
networkWriter.FinishMessage();
InvokeBytesOnClient(networkWriter.AsArray(), channelId);
}
internal void InvokeBytesOnClient(byte[] buffer, int channelId) => PostInternalMessage(buffer, channelId);
private const int k_InitialFreeMessagePoolSize = 64;
private List<InternalMsg> m_InternalMsgs = new List<InternalMsg>();
private readonly List<InternalMsg> m_InternalMsgs2 = new List<InternalMsg>();
private Stack<InternalMsg> m_FreeMessages;
private QSBNetworkServer m_LocalServer;
private bool m_Connected;
private readonly QSBNetworkMessage s_InternalMessage = new QSBNetworkMessage();
private struct InternalMsg
{
internal byte[] buffer;
internal int channelId;
}
}
}