public void ProcessInputMessages() { // Get the message NetInputMessage msg = _inputMessageQueue.Dequeue(); // Find out who sent it PhotonPlayer photonPlayer = PhotonUtils.GetPlayerById(msg.PhotonPlayerId); if (photonPlayer == null) { return; } // Get remote player instance var remotePlayer = _remotePlayers.Find(x => x.Player.ID == photonPlayer.ID); if (remotePlayer == null) { Transform target = null; foreach (var go in GameObject.FindGameObjectsWithTag("NetworkPlayer")) { if (go.GetComponent <PhotonView>().ownerId == photonPlayer.ID) { target = go.transform; } } if (target == null) { Debug.LogErrorFormat("Could not find Transform component for PhotonPlayer {0}", photonPlayer.ID); } else { remotePlayer = new ServerPlayer() { Player = photonPlayer, Target = target }; _remotePlayers.Add(remotePlayer); } } if (remotePlayer == null) { return; } Player player = remotePlayer.Target.GetComponent <Player>(); player.Client_SyncServer(); Server_ApplyInput(msg.Inputs, remotePlayer); player.PositionBuffer.Push(remotePlayer.Position.x, remotePlayer.Position.y, player.Syncer.ServerDelta(Time.deltaTime)); NetStateMessage stateMsg = new NetStateMessage { Position = remotePlayer.Position, LastTick = msg.Identifier, PhotonPlayerId = remotePlayer.Player.ID }; var options = new RaiseEventOptions { TargetActors = PhotonUtils.GetPlayerIdsInRoom() }; // Broadcast new state of the client PhotonNetwork.RaiseEvent((byte)EventCodes.STOC_ClientInputAcknowledge, stateMsg, false, options); }
public void OnEventRaised(byte eventCode, object content, int senderID) { bool isMaster = PhotonNetwork.isMasterClient; bool isMine = photonView.isMine; switch (eventCode) { case (byte)EventCodes.CTOS_ClientInput: if (!isMaster) { break; } var msg = (NetInputMessage)content; msg.PhotonPlayerId = senderID; msg.Time = Time.time; Server_ReceiveInput(msg, senderID); break; case (byte)EventCodes.STOC_ClientInputAcknowledge: var stateMsg = (NetStateMessage)content; var photonPlayer = PhotonUtils.GetPlayerById(stateMsg.PhotonPlayerId); if (photonPlayer == null) { break; } var photonPlayerTransform = PhotonUtils.GetPhotonPlayerTransform(photonPlayer); if (photonPlayerTransform == null) { break; } bool isMyAck = PhotonNetwork.player.ID == stateMsg.PhotonPlayerId; if (isMyAck) { photonPlayerTransform.position = stateMsg.Position; // Server Reconciliation if (Conciliation) { int j = 0; while (j < _inputBuffer.Count) { var input = _inputBuffer[j]; if (input.TickNr <= stateMsg.LastTick) { _inputBuffer.Remove(input); } else { ApplyInput(new List <Inputs> { input }, transform); j++; } } } PositionBuffer.Push(stateMsg.Position.x, stateMsg.Position.y, Syncer.ServerDelta(Time.deltaTime)); } else { // Entity Interpolation if (Interpolation) { Player p = photonPlayerTransform.GetComponent <Player>(); p.Client_SyncServer(); p.PositionBuffer.Push(stateMsg.Position.x, stateMsg.Position.y, p.Syncer.ServerDelta(Time.deltaTime)); } else { photonPlayerTransform.position = stateMsg.Position; } } break; default: Debug.LogErrorFormat("Unknown event code {0} from {1}", eventCode, senderID); break; } }