///<summary> /// Send ball server position to all clients /// </summary> private void SendBallPositionToClients() { //Create the message BouncyBallSyncMessageModel bouncyBallPositionMessaageData = new BouncyBallSyncMessageModel( base.id, GameServerManager.instance.currentTick, rigidbodyReference.transform.position, rigidbodyReference.velocity); //...Time Stamps per Tom McDonnell Oct 27 bouncyBallPositionMessaageData.timeSent = new TimeSpan(DateTime.Now.Ticks).TotalMilliseconds; // create the message using (Message m = Message.Create( NetworkTags.InGame.BOUNCY_BALL_SYNC_POS, // Tag bouncyBallPositionMessaageData) // Data ) { foreach (IClient client in GameServerManager.instance.serverReference.Server.ClientManager.GetAllClients()) { client.SendMessage(m, SendMode.Reliable); } } }
///<summary> /// update from the sever state /// </summary> ///<param name="sender"<>/param> ///<param name="e"></param> private void UpdateFromServerState(object sender, DarkRift.Client.MessageReceivedEventArgs e) { if (e.Tag == NetworkTags.InGame.BOUNCY_BALL_SYNC_POS) { // Get message data BouncyBallSyncMessageModel syncMessage = e.GetMessage().Deserialize <BouncyBallSyncMessageModel>(); // Time Stamp per Tom McDonnell Oct 27 syncMessage.timeReceived = new TimeSpan(DateTime.Now.Ticks).TotalMilliseconds; if (id == syncMessage.networkID) { // If the distance between client and server ball position is beyone nominal constraint if (Vector3.Distance(rigidbodyReference.transform.position, syncMessage.position) >= 0.05f) { // Update data rigidbodyReference.velocity = syncMessage.velocity; rigidbodyReference.transform.position = syncMessage.position; clientTick = syncMessage.serverTick; //...lastReceivedMessage = syncMessage; } } } }
/// <summary> /// Reconciliate the client with the server data /// </summary> private void Reconciliate() { if (reconciliationInfoList.Count() > 0) { //Get the position of the client at this specific frame BouncyBallSyncMessageModel clientInfo = reconciliationInfoList.Where(i => i.serverTick == lastReceivedMessage.serverTick).FirstOrDefault(); //If there is more than 50 tick that the ball has not been updated depending to the server position if (reconciliationInfoList.Count() > 50) { rigidbodyReference.velocity = lastReceivedMessage.velocity; rigidbodyReference.transform.position = lastReceivedMessage.position; clientTick = lastReceivedMessage.serverTick; clientInfo = lastReceivedMessage; } if (!Equals(clientInfo, null)) { //Check for position divergence if (Vector3.Distance(clientInfo.position, lastReceivedMessage.position) >= 0.05f) { //Update data rigidbodyReference.velocity = lastReceivedMessage.velocity; rigidbodyReference.transform.position = lastReceivedMessage.position; } //Empty the list reconciliationInfoList.Clear(); } } }
/// <summary> /// Send ball server position to all clients /// </summary> private void SendBallPositionToClients() { //Create the message BouncyBallSyncMessageModel bouncyBallPositionMessageData = new BouncyBallSyncMessageModel { networkID = base.id, serverTick = GameServerManager.instance.currentTick, position = rigidbodyReference.transform.position, velocity = rigidbodyReference.velocity }; //create the message using (Message m = Message.Create( NetworkTags.InGame.BOUNCY_BALL_SYNC_POS, //Tag bouncyBallPositionMessageData) //Data ) { foreach (IClient client in GameServerManager.instance.serverReference.Server.ClientManager.GetAllClients()) { client.SendMessage(m, SendMode.Reliable); } } }
/// <summary> /// update from the server state /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void UpdateFromServerState(object sender, DarkRift.Client.MessageReceivedEventArgs e) { if (e.Tag == NetworkTags.InGame.BOUNCY_BALL_SYNC_POS) { //Get message data BouncyBallSyncMessageModel syncMessage = e.GetMessage().Deserialize <BouncyBallSyncMessageModel>(); //If this is the first time we receive the message if (Object.Equals(null, lastReceivedMessage)) { //Update data rigidbodyReference.velocity = syncMessage.velocity; rigidbodyReference.transform.position = syncMessage.position; clientTick = syncMessage.serverTick; lastReceivedMessage = syncMessage; } //If the message regards this object and is older than the previous one if (id == syncMessage.networkID && syncMessage.serverTick > lastReceivedMessage.serverTick) { lastReceivedMessage = syncMessage; } } }