protected override void UnityUpdate()
{
// TODO: Look into this
if (this == null)
return;
HasSerialized = false;
base.UnityUpdate();
if (!NetworkingManager.IsOnline)
return;
if (serverIsAuthority && (OwningNetWorker.IsServer || (IsOwner && clientSidePrediction)))
{
if (inputRequest != null)
{
foreach (KeyCode key in currentKeys)
inputRequest(key);
}
if (mouseRequest != null)
{
foreach (int button in mouseIndices)
mouseRequest(button);
}
}
if ((Properties == null || Properties.Count == 0) &&
serializePosition == SerializeVector3Properties.None &&
serializeRotation == SerializeVector3Properties.None &&
serializeScale == SerializeVector3Properties.None)
{
OwnedUpdate();
return;
}
// TODO: Examine other parts of removal for this
//if (isPlayer && OwningNetWorker.IsServer && serverTargetPlayer != null)
// serverTargetPlayer.UpdatePosition(transform.position);
if (OwningNetWorker.IsServer && serverTargetPlayer != null)
serverTargetPlayer.Position = transform.position;
if ((OwningNetWorker.IsServer && serverIsAuthority) || (!serverIsAuthority && IsOwner))
{
if (networkTimeDelay > 0)
{
timeDelayCounter += Time.deltaTime;
if (timeDelayCounter < networkTimeDelay)
{
OwnedUpdate();
return;
}
timeDelayCounter = 0.0f;
}
if (Properties != null)
{
foreach (NetRef<object> obj in Properties)
{
if (obj.IsDirty)
{
DoSerialize();
break;
}
}
}
if (!HasSerialized)
{
if ((serializePosition != SerializeVector3Properties.None && transform.position != previousPosition) ||
(serializeRotation != SerializeVector3Properties.None && transform.rotation != previousRotation) ||
(serializeScale != SerializeVector3Properties.None && transform.localScale != previousScale))
{
DoSerialize();
}
}
}
else
{
//if (newData.Ready)
// Deserialize(newData);
if (clientSidePrediction && IsOwner)
{
lock (_authoritativeFrameMutex)
{
if (serverIsAuthority)
TrackFrameHistory();
}
if (currentKeys.Count != 0 || mouseIndices.Count != 0)
{
// TODO: If the player is too far from targetPosition then fix it
OwnedUpdate();
return;
}
}
else
{
if (serializePosition != SerializeVector3Properties.None && transform.position != targetPosition)
{
if (!serverIsAuthority || !IsOwner || !clientSidePrediction)
{
if (!lerpPosition || skipInterpolation ||
Vector3.Distance(transform.position, targetPosition) > authoritativeTeleportSyncDistance)
transform.position = targetPosition;
else
{
transform.position = Vector3.Lerp(transform.position, targetPosition, lerpT);
if (Vector3.Distance(transform.position, targetPosition) <= lerpStopOffset)
transform.position = targetPosition;
}
}
}
}
if (serializeRotation != SerializeVector3Properties.None && transform.eulerAngles != targetRotation)
{
convertedTargetRotation = Quaternion.Euler(targetRotation);
if (!serverIsAuthority || !IsOwner || !clientSidePrediction || (Quaternion.Angle(transform.rotation, convertedTargetRotation) > authoritativeSyncRotation))
{
if (!lerpRotation || skipInterpolation)
transform.rotation = convertedTargetRotation;
else
{
transform.rotation = Quaternion.Slerp(transform.rotation, convertedTargetRotation, lerpT);
if (Quaternion.Angle(transform.rotation, convertedTargetRotation) <= lerpAngleStopOffset)
transform.rotation = convertedTargetRotation;
}
}
}
if (serializeScale != SerializeVector3Properties.None && transform.localScale != targetScale)
{
if (!lerpScale || skipInterpolation)
transform.localScale = targetScale;
else
{
transform.localScale = Vector3.Lerp(transform.localScale, targetScale, lerpT);
if (Vector3.Distance(transform.localScale, targetScale) <= lerpStopOffset)
transform.localScale = targetScale;
}
}
foreach (NetRef<object> obj in Properties)
{
if (!obj.Lerping)
continue;
UpdateRemoteNetRef(obj);
}
foreach (NetRef<object> obj in ManualProperties)
{
if (!obj.Lerping)
continue;
UpdateRemoteNetRef(obj);
}
}
OwnedUpdate();
}