/// <summary> /// Sends handshake to the connected player. /// </summary> private void SendHandshake(NetPlayer player) { Messages.HandshakeMessage message = new Messages.HandshakeMessage(); message.protocolVersion = PROTOCOL_VERSION; message.clock = GetNetworkClock(); SendMessage(player, message, Steamworks.EP2PSend.k_EP2PSendReliable); }
/// <summary> /// Write player state into handshake message. /// </summary> /// <param name="msg">Message to write to.</param> public void WriteHandshake(Messages.HandshakeMessage msg) { if (state == State.OnFoot) { msg.occupiedVehicleId = NetVehicle.INVALID_ID; } else { msg.occupiedVehicleId = currentVehicle.NetId; msg.passenger = state == State.Passenger; } msg.pickedUpObject = NetPickupable.INVALID_ID; GamePlayer player = GameWorld.Instance.Player; if (player != null) { // It is possible the local player is not spawned yet. If so we do not // care about those values as those can be only set when player is actually spawned. var pickedUpObject = player.PickedUpObject; if (pickedUpObject == null) { msg.pickedUpObject = netWorld.GetPickupableNetId(pickedUpObject); } } }
/// <summary> /// Sends handshake to the connected player. /// </summary> private void SendHandshake() { Messages.HandshakeMessage message = new Messages.HandshakeMessage(); message.clock = GetNetworkClock(); GetLocalPlayer().WriteHandshake(message); BroadcastMessage(message, Steamworks.EP2PSend.k_EP2PSendReliable); }
/// <summary> /// Process handshake message received from the given steam id. /// </summary> /// <param name="senderSteamId">The steam id of the sender.</param> /// <param name="msg">Hand shake message.</param> private void HandleHandshake(Steamworks.CSteamID senderSteamId, Messages.HandshakeMessage msg) { if (IsHost) { if (players[1] != null) { Logger.Log("Received handshake from player but player is already here."); LeaveLobby(); return; } // Setup THE PLAYER timeSinceLastHeartbeat = 0.0f; players[1] = new NetPlayer(this, netWorld, senderSteamId); // Player can be spawned here safely. Host is already in game and all game objects are here. players[1].Spawn(); SendHandshake(); } else { if (players[1] == null) { Logger.Log("Received handshake from host but host is not here."); LeaveLobby(); return; } Logger.Log("CONNECTION ESTABLISHED!"); MPController.Instance.LoadLevel("GAME"); // Host will be spawned when game will be loaded and OnGameWorldLoad callback will be called. } // Set player state. players[1].Teleport(Utils.NetVec3ToGame(msg.spawnPosition), Utils.NetQuatToGame(msg.spawnRotation)); if (msg.occupiedVehicleId != NetVehicle.INVALID_ID) { var vehicle = netWorld.GetVehicle(msg.occupiedVehicleId); Client.Assert(vehicle != null, $"Player {players[1].GetName()} ({players[1].SteamId}) you tried to join reported that he drives car that does not exists in your game. Vehicle id: {msg.occupiedVehicleId}, passenger: {msg.passenger}"); players[1].EnterVehicle(vehicle, msg.passenger); } if (msg.pickedUpObject != NetPickupable.INVALID_ID) { players[1].PickupObject(msg.pickedUpObject); } players[1].hasHandshake = true; }
/// <summary> /// Process handshake message received from the given steam id. /// </summary> /// <param name="senderSteamId">The steam id of the sender.</param> /// <param name="msg">Hand shake message.</param> private void HandleHandshake(Steamworks.CSteamID senderSteamId, Messages.HandshakeMessage msg) { if (IsHost) { if (players[1] != null) { Logger.Log("Received handshake from player but player is already here."); LeaveLobby(); return; } // Setup THE PLAYER timeSinceLastHeartbeat = 0.0f; players[1] = new NetPlayer(this, netWorld, senderSteamId); // Player can be spawned here safely. Host is already in game and all game objects are here. players[1].Spawn(); SendHandshake(); } else { if (players[1] == null) { Logger.Log("Received handshake from host but host is not here."); LeaveLobby(); return; } Logger.Log("CONNECTION ESTABLISHED!"); MPController.Instance.LoadLevel("GAME"); // Host will be spawned when game will be loaded and OnGameWorldLoad callback will be called. } players[1].hasHandshake = true; }
/// <summary> /// Process handshake message received from the given steam id. /// </summary> /// <param name="senderSteamId">The steam id of the sender.</param> /// <param name="msg">Hand shake message.</param> private void HandleHandshake(Steamworks.CSteamID senderSteamId, Messages.HandshakeMessage msg) { if (IsHost) { if (players[1] != null) { Logger.Log("Received handshake from player but player is already here."); LeaveLobby(); return; } // Setup THE PLAYER timeSinceLastHeartbeat = 0.0f; players[1] = new NetPlayer(this, netWorld, senderSteamId); // Check if version matches - if not ignore this player. if (msg.protocolVersion != PROTOCOL_VERSION) { RejectPlayer($"Mod version mismatch."); return; } // Player can be spawned here safely. Host is already in game and all game objects are here. players[1].Spawn(); SendHandshake(players[1]); MessagesList.AddMessage($"Player {players[1].GetName()} joined.", MessageSeverity.Info); } else { if (players[1] == null) { Logger.Log("Received handshake from host but host is not here."); LeaveLobby(); return; } // Check if protocol version matches. if (msg.protocolVersion != PROTOCOL_VERSION) { string message; if (msg.protocolVersion > PROTOCOL_VERSION) { message = "Host has newer version of the mod."; } else { message = "Host has older version of the mod."; } AbortJoining($"{message}\n(Your mod version: {PROTOCOL_VERSION}, Host mod version: {msg.protocolVersion})"); return; } // All is fine - load game world. MessagesList.AddMessage($"Connection established!", MessageSeverity.Info); MPController.Instance.LoadLevel("GAME"); // Host will be spawned when game will be loaded and OnGameWorldLoad callback will be called. } remoteClock = msg.clock; players[1].hasHandshake = true; }
/// <summary> /// Process handshake message received from the given steam id. /// </summary> /// <param name="senderSteamId">The steam id of the sender.</param> /// <param name="msg">Hand shake message.</param> private void HandleHandshake(Steamworks.CSteamID senderSteamId, Messages.HandshakeMessage msg) { if (IsHost) { // Setup THE PLAYER timeSinceLastHeartbeat = 0.0f; players.Add(players.Count, new NetPlayer(this, netWorld, senderSteamId)); int connectingPlayerID = players.Count - 1; Logger.Log("Connecting player is now ID: " + (players.Count - 1)); // Check if version matches - if not ignore this player. if (msg.protocolVersion != PROTOCOL_VERSION) { RejectPlayer(connectingPlayerID, $"Mod version mismatch."); return; } // Player can be spawned here safely. Host is already in game and all game objects are here. players[connectingPlayerID].Spawn(); SendHandshake(players[connectingPlayerID]); MessagesList.AddMessage($"Player {players[connectingPlayerID].GetName()} joined.", MessageSeverity.Info); players[connectingPlayerID].hasHandshake = true; SendPlayerJoined(connectingPlayerID, players[players.Count - 1]); } else { // Check if protocol version matches. if (msg.protocolVersion != PROTOCOL_VERSION) { string message; if (msg.protocolVersion > PROTOCOL_VERSION) { message = "Host has newer version of the mod."; } else { message = "Host has older version of the mod."; } AbortJoining($"{message}\n(Your mod version: {PROTOCOL_VERSION}, Host mod version: {msg.protocolVersion})"); return; } // All is fine - load game world. MessagesList.AddMessage($"Connection established!", MessageSeverity.Info); MPController.Instance.LoadLevel("GAME"); // Host will be spawned when game will be loaded and OnGameWorldLoad callback will be called. } remoteClock = msg.clock; connectionStartedTime = DateTime.UtcNow; }