void ServerUpdate() { if (!isServer || isLocalPlayer) //Precludes any player from being a server host { return; } Package packageData = PackageManager.GetNextDataReceived(); if (packageData == null) { return; } Move(packageData.Horizontal * moveSpeed, packageData.Vertical * moveSpeed); if (transform.position == lastPosition) { return; } lastPosition = transform.position; ServerPackageManager.AddPackage(new ReceivePackage { X = transform.position.x, Y = transform.position.y, Z = transform.position.z, Timestamp = packageData.Timestamp }); }
public void RemoteClientUpdate() { if (isServer) { return; } var data = ServerPackageManager.GetNextDataReceived(); if (data == null) { return; } if (isLocalPlayer && isPredictionEnabled) { var transmittedPackage = predictedPackages.Where(x => x.Timestamp == data.Timestamp).FirstOrDefault(); if (transmittedPackage == null) { return; } //If the distance between where the server says player should be, and player says they are, is too high if (Vector3.Distance(new Vector3(transmittedPackage.X, transmittedPackage.Y, transmittedPackage.Z), new Vector3(data.X, data.Y, data.Z)) > correctionThreshold) { transform.position = new Vector3(data.X, data.Y, data.Z); } //Remove old packages predictedPackages.RemoveAll(x => x.Timestamp <= data.Timestamp); } else { transform.position = new Vector3(data.X, data.Y, data.Z); } }