public void HandleIncomingMessage(Message msg) { switch (msg.GetNetworkMessageType()) { case NetworkMessageType.Authenticate: AuthenticateMessage mA = msg as AuthenticateMessage; client.InitClient(mA.ClientId, "This is Client \n Id:" + mA.ClientId); break; case NetworkMessageType.Transform: TransformMessage transformMsg = msg as TransformMessage; if (!client.IsClientsCharacterCreated) { client.CreateClientsCharacter(transformMsg); } else { if (transformMsg.AcknowledgmentId != -1) { int acknoledgmentIdx = unAcknowledgedInputRequests. FindIndex(it => it.RequestId == transformMsg.AcknowledgmentId); if (acknoledgmentIdx != -1) { /* Removes this unacknowledged message and all that came before */ unAcknowledgedInputRequests.RemoveRange(0, acknoledgmentIdx + 1); /* Peform position prediction based on last acknowledged position */ lastAcknowledgedPosition = transformMsg.Position.Vect3; Vector3 newPosBasedOnAck = new Vector3(lastAcknowledgedPosition.x, lastAcknowledgedPosition.y, lastAcknowledgedPosition.z); foreach (InputMessage inputMsg in unAcknowledgedInputRequests) { newPosBasedOnAck += client.GetPositionChangeBasedOnInput(inputMsg); } client.SlowlyUpdateCharactersPosition(newPosBasedOnAck); } } else { client.UpdateCharactersTransform(transformMsg); } } break; case NetworkMessageType.MultipleTransforms: MultipleTranformMessage multipleTransfMsg = msg as MultipleTranformMessage; /* Update other player characters */ otherPlayerCharManager.UpdateOtherCharPosition(multipleTransfMsg); break; case NetworkMessageType.Disconnect: otherPlayerCharManager.DespawnDisconnectedPlayer(msg as DisconnectMessage); break; } }
public void UpdateOtherCharPosition(MultipleTranformMessage multipleTransfMsg) { foreach (TransformMessage transformMsg in multipleTransfMsg.AllTransformMessages) { int keyIndex = allOtherCharacters.FindIndex(it => it.ClientId == transformMsg.ReceiverId); if (keyIndex > -1) { UpdateOtherCharacterPosition(transformMsg); } else { CreateOtherPlayerCharacter(transformMsg); } } }
public void SendClientPosInfoOfAllOtherPlayers(ServerNetworkManager servNetworkManager, int connectionId) { /* Send client all TransformMessages about all other player characters */ List <TransformMessage> allCharcterPositions = new List <TransformMessage>(); foreach (Character playerCharacter in allCharacters) { if (playerCharacter.ClientId != connectionId) { TransformMessage msg = new TransformMessage(playerCharacter.ClientId); msg.Position.Vect3 = playerCharacter.CharacterObj.transform.position; msg.Rotation.Quaternion = playerCharacter.CharacterObj.transform.rotation; msg.Scale.Vect3 = playerCharacter.CharacterObj.transform.localScale; allCharcterPositions.Add(msg); } } MultipleTranformMessage multipleTransfMsg = new MultipleTranformMessage(allCharcterPositions.ToArray()); servNetworkManager.SendNetworkReliableMessage(multipleTransfMsg, connectionId); }
public void SendAllPlayersAllOtherPlayerPostions(ServerNetworkManager servNetworkManger) { foreach (Character character in allCharacters) { Vector3 playerPos = character.CharacterObj.transform.position; character.LastSentPosition = new Vector3(playerPos.x, playerPos.y, playerPos.z); /* Send inform this characters client about all other characters positions */ List <Character> allOtherCharacters = allCharacters.FindAll(it => it.ClientId != character.ClientId); List <TransformMessage> allTranformMsg = new List <TransformMessage>(); foreach (Character otherCharacter in allOtherCharacters) { TransformMessage transfMsg = new TransformMessage(otherCharacter.ClientId); transfMsg.Position.Vect3 = otherCharacter.CharacterObj.transform.position; transfMsg.Scale.Vect3 = otherCharacter.CharacterObj.transform.localScale; transfMsg.Rotation.Quaternion = otherCharacter.CharacterObj.transform.rotation; allTranformMsg.Add(transfMsg); otherCharacter.LastSentPosition = new Vector3(transfMsg.Position.X, transfMsg.Position.Y, transfMsg.Position.Z); } MultipleTranformMessage multipleTransfMsg = new MultipleTranformMessage(allTranformMsg.ToArray()); servNetworkManger.SendNetworkUnreliableMessage(multipleTransfMsg, character.ClientId); } }