public static void Bind() { Net.Init(); NetworkComms.AppendGlobalConnectionEstablishHandler((connection) => { // todo: Automatically disconnect after 60 seconds without a handshake }); NetworkComms.AppendGlobalConnectionCloseHandler((connection) => { DisconnectPlayer(connection.GetID()); }); Net.On <C2S_Handshake>((header, connection, obj) => { var response = new S2C_HandshakeResponse(obj.Version == VERSION, IsNicknameValid(obj.Nickname), "OK", null); if (IsValidPlayer(connection.GetID())) { //handshake for second time.. let's disconnect DisconnectPlayer(connection.GetID()); } if (!response.OK) { response.Message = $"Error:\n Version: {response.VersionOK}\n Nickname: {response.NicknameOK}"; if (!response.NicknameOK) { response.Message += "\n Nickname length must be within 3-16 characters and MUST be unique."; } } else { // OK! var player = new RemotePlayer() { Connection = connection, Nickname = obj.Nickname, PlayerState = PlayerState.HANDSHAKE_OK }; response.LocalPlayer = player.GetDisplay(); AddPlayer(player); } connection.Send(response); }); Net.On <C2S_JoinLobby>((header, connection, obj) => { RemotePlayer player; if (IsValidPlayer(connection.GetID(), out player)) { LobbyServer.EnterLobby(player); } }); Net.On <C2S_SendPlayerInvite>((header, connection, obj) => { RemotePlayer source, destination; if (IsValidPlayer(connection.GetID(), out source, PlayerState.IN_LOBBY) && IsValidPlayer(obj.Destination, out destination, PlayerState.IN_LOBBY)) { source.SendInvite(destination); } }); Net.On <C2S_RevokeSentPlayerInvite>((header, connection, obj) => { RemotePlayer source, destination; if (IsValidPlayer(connection.GetID(), out source, PlayerState.IN_LOBBY) && IsValidPlayer(obj.Destination, out destination, PlayerState.IN_LOBBY)) { source.RevokeSentInvite(destination); } }); Net.On <C2S_AcceptIncomingPlayerInvite>((header, connection, obj) => { RemotePlayer source, destination; if (IsValidPlayer(obj.Source, out source, PlayerState.IN_LOBBY) && IsValidPlayer(connection.GetID(), out destination, PlayerState.IN_LOBBY)) { if (source.HasSentInviteTo(destination)) { //We have a pair :) LobbyServer.LeaveLobby(source); LobbyServer.LeaveLobby(destination); GameServer.InitNewGame(source, destination); } } }); Net.On <C2S_GameReady>((header, connection, obj) => { RemotePlayer player; if (IsValidPlayer(connection.GetID(), out player, PlayerState.IN_GAME)) { var p = player.Game.GetPlayer(player); player.Game.OnPlayerReady(p); } }); Net.On <C2S_FireAt>((header, connection, obj) => { RemotePlayer player; if (IsValidPlayer(connection.GetID(), out player, PlayerState.IN_GAME)) { var p = player.Game.GetPlayer(player); p.FireAtEnemy(obj.X, obj.Y); } }); }