Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ public class NetworkedTransform : NetworkedBehaviour
{
internal class ClientSendInfo
{
public ulong clientId;
public float lastSent;
public Vector3? lastMissedPosition;
public Quaternion? lastMissedRotation;
Expand Down Expand Up @@ -154,13 +153,17 @@ private void Awake()

private void Update()
{
if (IsOwner) {
if (NetworkingManager.Singleton.NetworkTime - lastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees)) {
if (IsOwner)
{
if (NetworkingManager.Singleton.NetworkTime - lastSendTime >= (1f / FixedSendsPerSecond) && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
{
lastSendTime = NetworkingManager.Singleton.NetworkTime;
lastSentPos = transform.position;
lastSentRot = transform.rotation;
using (PooledBitStream stream = PooledBitStream.Get()) {
using (PooledBitWriter writer = PooledBitWriter.Get(stream)) {
using (PooledBitStream stream = PooledBitStream.Get())
{
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
{
writer.WriteSinglePacked(transform.position.x);
writer.WriteSinglePacked(transform.position.y);
writer.WriteSinglePacked(transform.position.z);
Expand All @@ -180,8 +183,10 @@ private void Update()
}
else {
//If we are server and interpolation is turned on for server OR we are not server and interpolation is turned on
if ((IsServer && InterpolateServer && InterpolatePosition) || (!IsServer && InterpolatePosition)) {
if (Vector3.Distance(transform.position, lerpEndPos) > SnapDistance) {
if ((IsServer && InterpolateServer && InterpolatePosition) || (!IsServer && InterpolatePosition))
{
if (Vector3.Distance(transform.position, lerpEndPos) > SnapDistance)
{
//Snap, set T to 1 (100% of the lerp)
lerpT = 1f;
}
Expand Down Expand Up @@ -210,8 +215,9 @@ private void ApplyTransform(ulong clientId, Stream stream)
{
if (!enabled)
return;
using (PooledBitReader reader = PooledBitReader.Get(stream)) {

using (PooledBitReader reader = PooledBitReader.Get(stream))
{
float xPos = reader.ReadSinglePacked();
float yPos = reader.ReadSinglePacked();
float zPos = reader.ReadSinglePacked();
Expand All @@ -229,15 +235,17 @@ private void ApplyTransformInternal(Vector3 position, Quaternion rotation)
if (!enabled)
return;

if (InterpolatePosition && (!IsServer || InterpolateServer)) {
if (InterpolatePosition && (!IsServer || InterpolateServer))
{
lastReceiveTime = Time.unscaledTime;
lerpStartPos = transform.position;
lerpStartRot = transform.rotation;
lerpEndPos = position;
lerpEndRot = rotation;
lerpT = 0;
}
else {
else
{
transform.position = position;
transform.rotation = rotation;
}
Expand All @@ -248,7 +256,9 @@ private void SubmitTransform(ulong clientId, Stream stream)
{
if (!enabled)
return;
using (PooledBitReader reader = PooledBitReader.Get(stream)) {

using (PooledBitReader reader = PooledBitReader.Get(stream))
{
float xPos = reader.ReadSinglePacked();
float yPos = reader.ReadSinglePacked();
float zPos = reader.ReadSinglePacked();
Expand All @@ -257,19 +267,23 @@ private void SubmitTransform(ulong clientId, Stream stream)
float yRot = reader.ReadSinglePacked();
float zRot = reader.ReadSinglePacked();

if (IsMoveValidDelegate != null && !IsMoveValidDelegate(clientId, lerpEndPos, new Vector3(xPos, yPos, zPos))) {
if (IsMoveValidDelegate != null && !IsMoveValidDelegate(clientId, lerpEndPos, new Vector3(xPos, yPos, zPos)))
{
//Invalid move!
//TODO: Add rubber band (just a message telling them to go back)
return;
}

if (!IsClient) {
if (!IsClient)
{
// Dedicated server
ApplyTransformInternal(new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
}

using (PooledBitStream writeStream = PooledBitStream.Get()) {
using (PooledBitWriter writer = PooledBitWriter.Get(writeStream)) {
using (PooledBitStream writeStream = PooledBitStream.Get())
{
using (PooledBitWriter writer = PooledBitWriter.Get(writeStream))
{
writer.WriteSinglePacked(xPos);
writer.WriteSinglePacked(yPos);
writer.WriteSinglePacked(zPos);
Expand All @@ -278,11 +292,14 @@ private void SubmitTransform(ulong clientId, Stream stream)
writer.WriteSinglePacked(yRot);
writer.WriteSinglePacked(zRot);

if (EnableRange) {
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++) {
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId)) {
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo() {
clientId = NetworkingManager.Singleton.ConnectedClientsList[i].ClientId,
if (EnableRange)
{
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
{
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId))
{
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo()
{
lastMissedPosition = null,
lastMissedRotation = null,
lastSent = 0
Expand All @@ -293,20 +310,23 @@ private void SubmitTransform(ulong clientId, Stream stream)
Vector3? receiverPosition = NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject.transform.position);
Vector3? senderPosition = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position);

if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) {
if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value))
{
info.lastSent = NetworkingManager.Singleton.NetworkTime;
info.lastMissedPosition = null;
info.lastMissedRotation = null;

InvokeClientRpcOnClientPerformance(applyTransformDelegate, NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, writeStream, string.IsNullOrEmpty(Channel) ? "MLAPI_DEFAULT_MESSAGE" : Channel);
}
else {
else
{
info.lastMissedPosition = new Vector3(xPos, yPos, zPos);
info.lastMissedRotation = Quaternion.Euler(xRot, yRot, zRot);
}
}
}
else {
else
{
InvokeClientRpcOnEveryoneExceptPerformance(applyTransformDelegate, OwnerClientId, writeStream, string.IsNullOrEmpty(Channel) ? "MLAPI_DEFAULT_MESSAGE" : Channel);
}

Expand All @@ -317,10 +337,12 @@ private void SubmitTransform(ulong clientId, Stream stream)

private void CheckForMissedSends()
{
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++) {
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId)) {
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo() {
clientId = NetworkingManager.Singleton.ConnectedClientsList[i].ClientId,
for (int i = 0; i < NetworkingManager.Singleton.ConnectedClientsList.Count; i++)
{
if (!clientSendInfo.ContainsKey(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId))
{
clientSendInfo.Add(NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, new ClientSendInfo()
{
lastMissedPosition = null,
lastMissedRotation = null,
lastSent = 0
Expand All @@ -330,28 +352,33 @@ private void CheckForMissedSends()
Vector3? receiverPosition = NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClientsList[i].PlayerObject.transform.position);
Vector3? senderPosition = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position);

if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value)) {
if ((receiverPosition == null || senderPosition == null && NetworkingManager.Singleton.NetworkTime - info.lastSent >= (1f / FixedSendsPerSecond)) || NetworkingManager.Singleton.NetworkTime - info.lastSent >= GetTimeForLerp(receiverPosition.Value, senderPosition.Value))
{
Vector3? pos = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.position);
Vector3? rot = NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject == null ? null : new Vector3?(NetworkingManager.Singleton.ConnectedClients[OwnerClientId].PlayerObject.transform.rotation.eulerAngles);

if (pos != null && rot != null) {
if (info.lastMissedPosition != null && info.lastMissedRotation != null)
{
info.lastSent = NetworkingManager.Singleton.NetworkTime;
info.lastMissedPosition = null;
info.lastMissedRotation = null;

using (PooledBitStream stream = PooledBitStream.Get()) {
using (PooledBitWriter writer = PooledBitWriter.Get(stream)) {
writer.WriteSinglePacked(pos.Value.x);
writer.WriteSinglePacked(pos.Value.y);
writer.WriteSinglePacked(pos.Value.z);
using (PooledBitStream stream = PooledBitStream.Get())
{
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
{
writer.WriteSinglePacked(info.lastMissedPosition.Value.x);
writer.WriteSinglePacked(info.lastMissedPosition.Value.y);
writer.WriteSinglePacked(info.lastMissedPosition.Value.z);

writer.WriteSinglePacked(rot.Value.x);
writer.WriteSinglePacked(rot.Value.y);
writer.WriteSinglePacked(rot.Value.z);
writer.WriteSinglePacked(info.lastMissedRotation.Value.x);
writer.WriteSinglePacked(info.lastMissedRotation.Value.y);
writer.WriteSinglePacked(info.lastMissedRotation.Value.z);

InvokeClientRpcOnClientPerformance(applyTransformDelegate, NetworkingManager.Singleton.ConnectedClientsList[i].ClientId, stream, string.IsNullOrEmpty(Channel) ? "MLAPI_DEFAULT_MESSAGE" : Channel);
}
}

info.lastMissedPosition = null;
info.lastMissedRotation = null;
}
}
}
Expand All @@ -364,7 +391,8 @@ private void CheckForMissedSends()
/// <param name="rotation">The rotation to teleport to</param>
public void Teleport(Vector3 position, Quaternion rotation)
{
if (InterpolateServer && IsServer || IsClient) {
if (InterpolateServer && IsServer || IsClient)
{
lerpStartPos = position;
lerpStartRot = rotation;
lerpEndPos = position;
Expand Down