/// <summary> /// Sends invite request to opponent, waits for response or timeout. /// </summary> public CommandResult InviteOpponent(NetworkPlayer opponent) { CommandResult result = new CommandResult(ResultCode.Unspecified); try { lock (_inviteLock) { //send connect-request command byte[] data = PacketBuilder.ToBytes(new object[] { _localPlayer.Name }); result = SendCommandRequest(opponent.IP, CommandType.ConnectToPlayer, data, TimeSpan.FromSeconds(INVITE_TIMEOUT_SEC)); } //fire event? if (result.Code == ResultCode.Accept) { OpponentConnected?.InvokeFromTask(opponent); } } catch (Exception ex) { Log.Write("InviteOpponent: Unknown error"); ErrorHandler.LogError(ex); result.Code = ResultCode.Error; } return(result); }
/// <summary> /// Serialize to bytes. /// </summary> public byte[] ToBytes() { PacketBuilder builder = new PacketBuilder(); builder.AddIPAddress(IP); builder.AddString(GameTitle); builder.AddVersion(GameVersion); builder.AddString(Name); return(builder.ToBytes()); }
/// <summary> /// Builds packet from list of supoprted types and returns bytes as a single operation. /// </summary> public static byte[] ToBytes(IEnumerable <object> values) { PacketBuilder builder = new PacketBuilder(); foreach (object value in values) { if (value is byte b) { builder.AddByte(b); } else if (value is byte[] bs) { builder.AddBytes(bs); } else if (value is byte[,] bs2) { builder.AddBytes2D(bs2); } else if (value is bool bl) { builder.AddBoolean(bl); } else if (value is short i16) { builder.AddInt16(i16); } else if (value is ushort ui16) { builder.AddUInt16(ui16); } else if (value is int i32) { builder.AddInt32(i32); } else if (value is uint ui32) { builder.AddUInt32(ui32); } else if (value is long i64) { builder.AddInt64(i64); } else if (value is ulong ui64) { builder.AddUInt64(ui64); } else if (value is string str) { builder.AddString(str); } else if (value is Version ver) { builder.AddVersion(ver); } else if (value is IPAddress ip) { builder.AddIPAddress(ip); } else { throw new Exception("Data type not supported"); } } return(builder.ToBytes()); }