115 lines
2.5 KiB
C#
Raw Normal View History

2021-11-26 17:36:14 +00:00
using QuantumUNET;
using QuantumUNET.Messages;
using QuantumUNET.Transport;
using UnityEngine;
namespace QSB.Utility.VariableSync
{
2021-11-26 19:33:56 +00:00
public abstract class BaseVariableSyncer : QNetworkBehaviour
2021-11-26 17:36:14 +00:00
{
private float _lastClientSendTime;
2021-11-26 19:33:56 +00:00
private QNetworkWriter _writer;
2021-11-26 22:31:52 +00:00
private int _index;
public bool Ready { get; protected set; }
2021-11-26 19:33:56 +00:00
public abstract void WriteData(QNetworkWriter writer);
public abstract void ReadData(QNetworkReader writer);
public abstract bool HasChanged();
2021-12-01 09:48:11 +00:00
2021-11-26 22:31:52 +00:00
public virtual void Awake()
2021-11-26 17:36:14 +00:00
{
2021-12-07 19:51:11 -08:00
QNetworkServer.RegisterHandlerSafe(short.MaxValue, HandleVariable);
2021-11-26 19:33:56 +00:00
2021-11-26 17:36:14 +00:00
if (LocalPlayerAuthority)
{
2021-11-26 19:33:56 +00:00
_writer = new QNetworkWriter();
2021-11-26 17:36:14 +00:00
}
}
2021-11-26 22:31:52 +00:00
public virtual void Start()
=> _index = GetComponents<BaseVariableSyncer>().IndexOfReference(this);
public void OnDestroy()
=> Ready = false;
2021-11-26 22:31:52 +00:00
2021-11-26 17:36:14 +00:00
public override bool OnSerialize(QNetworkWriter writer, bool initialState)
{
if (!initialState)
{
if (SyncVarDirtyBits == 0U)
{
writer.WritePackedUInt32(0U);
return false;
}
writer.WritePackedUInt32(1U);
}
WriteData(writer);
return true;
}
public override void OnDeserialize(QNetworkReader reader, bool initialState)
{
if (!IsServer || !QNetworkServer.localClientActive)
{
if (!initialState && reader.ReadPackedUInt32() == 0U)
{
return;
}
ReadData(reader);
}
}
private void FixedUpdate()
{
if (!IsServer || SyncVarDirtyBits != 0U || !QNetworkServer.active || !Ready)
2021-11-26 17:36:14 +00:00
{
return;
}
if (GetNetworkSendInterval() != 0f && HasChanged())
2021-11-26 17:36:14 +00:00
{
SetDirtyBit(1U);
}
}
public virtual void Update()
{
if (!HasAuthority || !LocalPlayerAuthority || QNetworkServer.active || !Ready)
2021-11-26 17:36:14 +00:00
{
return;
}
if (Time.time - _lastClientSendTime > GetNetworkSendInterval())
{
2021-11-26 19:33:56 +00:00
SendVariable();
_lastClientSendTime = Time.time;
2021-11-26 17:36:14 +00:00
}
}
2021-11-26 19:33:56 +00:00
private void SendVariable()
2021-11-26 17:36:14 +00:00
{
if (HasChanged() && QClientScene.readyConnection != null)
2021-11-26 17:36:14 +00:00
{
2021-11-29 22:26:32 +00:00
_writer.StartMessage(short.MaxValue);
2021-11-26 19:33:56 +00:00
_writer.Write(NetId);
2021-11-26 22:31:52 +00:00
_writer.Write(_index);
2021-11-26 19:33:56 +00:00
WriteData(_writer);
_writer.FinishMessage();
QClientScene.readyConnection.SendWriter(_writer, GetNetworkChannel());
2021-11-26 17:36:14 +00:00
}
}
2021-11-26 19:33:56 +00:00
public static void HandleVariable(QNetworkMessage netMsg)
2021-11-26 17:36:14 +00:00
{
var networkInstanceId = netMsg.Reader.ReadNetworkId();
2021-11-26 20:05:45 +00:00
var index = netMsg.Reader.ReadInt32();
2021-11-26 17:36:14 +00:00
var gameObject = QNetworkServer.FindLocalObject(networkInstanceId);
2021-11-26 20:05:45 +00:00
var components = gameObject.GetComponents<BaseVariableSyncer>();
components[index].ReadData(netMsg.Reader);
2021-11-26 17:36:14 +00:00
}
}
}