Guest User

All lobby changes

a guest
Dec 30th, 2019
407
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. From 67aece9560579810e82e7b57471fce17b20c5b49 Mon Sep 17 00:00:00 2001
  2. From: NegativeOne
  3. Date: Mon, 30 Dec 2019 08:22:15 +0100
  4. Subject: [PATCH] Complete diff between cocomed code and latest changes
  5.  
  6. Unlist servers that disconnect or crash
  7. Support password protected servers
  8. Simple chat implementation for lobby screen
  9. Show number of players on servers
  10. ---
  11. S2Library/Protocol/ChatPayloads.cs |  78 +--
  12.  S2Library/Protocol/Crypto.cs       |   7 +-
  13.  S2Library/Protocol/Payloads.cs     | 941 +++++++++++++++--------------
  14.  S2Lobby/Accounts.cs                |  19 +-
  15.  S2Lobby/Channels.cs                | 243 ++++++++
  16.  S2Lobby/ChatProcessor.cs           | 302 ++++++++-
  17.  S2Lobby/Database.cs                |  29 +
  18.  S2Lobby/LobbyProcessor.cs          |  74 ++-
  19.  S2Lobby/NetworkProcessor.cs        |  15 +-
  20.  S2Lobby/Program.cs                 |  40 +-
  21.  S2Lobby/S2Lobby.csproj             |   1 +
  22.  S2Lobby/ServerProcessor.cs         |  19 +-
  23.  S2Lobby/Servers.cs                 |   4 +
  24.  13 files changed, 1210 insertions(+), 562 deletions(-)
  25.  create mode 100644 S2Lobby/Channels.cs
  26.  
  27. diff --git a/S2Library/Protocol/ChatPayloads.cs b/S2Library/Protocol/ChatPayloads.cs
  28. index 5448477..c5d2c7b 100644
  29. --- a/S2Library/Protocol/ChatPayloads.cs
  30. +++ b/S2Library/Protocol/ChatPayloads.cs
  31. @@ -7,17 +7,17 @@ namespace S2Library.Protocol
  32.      {
  33.          public enum ChatTypes : ushort
  34.          {
  35. -            UnknownType00 = 0,
  36. +            ChannelInfo = 0, // UnknownType00
  37.              UnknownType01 = 1,
  38. -            UnknownType02 = 2,
  39. -            UnknownType03 = 3,
  40. +            ChatMessage = 2, // UnknownType02
  41. +            ChatReply = 3, // UnknownType03
  42.              UnknownType04 = 4,
  43.              UnknownType05 = 5,
  44.              CreateChannel = 7, // UnknownType07
  45.              UnknownType08 = 8,
  46. -            UnknownType09 = 9,
  47. +            ChannelJoined = 9, // UnknownType09
  48.              UnknownType10 = 10,
  49. -            UnknownType11 = 11,
  50. +            StatusReply = 11, // UnknownType11
  51.          }
  52.  
  53.          private static readonly Dictionary<Type, ChatTypes> ChatPayloadTypes = new Dictionary<Type, ChatTypes>();
  54. @@ -25,17 +25,17 @@ namespace S2Library.Protocol
  55.  
  56.          static ChatPayloads()
  57.          {
  58. -            ChatPayloadTypes.Add(typeof(ChatPayload0), ChatTypes.UnknownType00);
  59. +            ChatPayloadTypes.Add(typeof(ChannelInfo), ChatTypes.ChannelInfo); // ChatPayload0
  60.              ChatPayloadTypes.Add(typeof(ChatPayload1), ChatTypes.UnknownType01);
  61. -            ChatPayloadTypes.Add(typeof(ChatPayload2), ChatTypes.UnknownType02);
  62. -            ChatPayloadTypes.Add(typeof(ChatPayload3), ChatTypes.UnknownType03);
  63. +            ChatPayloadTypes.Add(typeof(ChatMessage), ChatTypes.ChatMessage); // ChatPayload2
  64. +            ChatPayloadTypes.Add(typeof(ChatReply), ChatTypes.ChatReply); // ChatPayload3
  65.              ChatPayloadTypes.Add(typeof(ChatPayload4), ChatTypes.UnknownType04);
  66.              ChatPayloadTypes.Add(typeof(ChatPayload5), ChatTypes.UnknownType05);
  67.              ChatPayloadTypes.Add(typeof(CreateChannel), ChatTypes.CreateChannel); // ChatPayload7
  68.              ChatPayloadTypes.Add(typeof(ChatPayload8), ChatTypes.UnknownType08);
  69. -            ChatPayloadTypes.Add(typeof(ChatPayload9), ChatTypes.UnknownType09);
  70. +            ChatPayloadTypes.Add(typeof(ChannelJoined), ChatTypes.ChannelJoined); // ChatPayload9
  71.              ChatPayloadTypes.Add(typeof(ChatPayload10), ChatTypes.UnknownType10);
  72. -            ChatPayloadTypes.Add(typeof(ChatPayload11), ChatTypes.UnknownType11);
  73. +            ChatPayloadTypes.Add(typeof(StatusReply), ChatTypes.StatusReply); // ChatPayload11
  74.  
  75.              foreach (KeyValuePair<Type, ChatTypes> payloadType in ChatPayloadTypes)
  76.              {
  77. @@ -77,6 +77,7 @@ namespace S2Library.Protocol
  78.      {
  79.          public ushort Magic;
  80.          public ushort Type;
  81. +        public ushort Id;
  82.  
  83.          public const ushort PayloadMagic = 0x0062;
  84.  
  85. @@ -84,25 +85,24 @@ namespace S2Library.Protocol
  86.          {
  87.              serializer.Serialize(nameof(Magic), ref Magic);
  88.              serializer.Serialize(nameof(Type), ref Type);
  89. +            serializer.Serialize(nameof(Id), ref Id);
  90.          }
  91.      }
  92.  
  93. -    public class ChatPayload0 : ChatPayloadPrefix
  94. +    public class ChannelInfo : ChatPayloadPrefix // ChatPayload0
  95.      {
  96. -        public ushort Id;
  97.          public byte[] Data;
  98.          public uint CellId;
  99.          public uint TicketId;
  100.  
  101. -        public ChatPayload0()
  102. +        public ChannelInfo()
  103.          {
  104. -            Id = (ushort) ChatPayloads.ChatTypes.UnknownType00;
  105. +            Id = (ushort) ChatPayloads.ChatTypes.ChannelInfo;
  106.          }
  107.  
  108.          public override void Serialize(Serializer serializer)
  109.          {
  110.              base.Serialize(serializer);
  111. -            serializer.Serialize(nameof(Id), ref Id);
  112.              serializer.Serialize(nameof(Data), ref Data);
  113.              serializer.Serialize(nameof(CellId), ref CellId);
  114.              serializer.Serialize(nameof(TicketId), ref TicketId);
  115. @@ -111,7 +111,6 @@ namespace S2Library.Protocol
  116.  
  117.      public class ChatPayload1 : ChatPayloadPrefix
  118.      {
  119. -        public ushort Id;
  120.          public uint CellId;
  121.          public uint TicketId;
  122.          public ushort Option;
  123. @@ -124,16 +123,14 @@ namespace S2Library.Protocol
  124.          public override void Serialize(Serializer serializer)
  125.          {
  126.              base.Serialize(serializer);
  127. -            serializer.Serialize(nameof(Id), ref Id);
  128.              serializer.Serialize(nameof(CellId), ref CellId);
  129.              serializer.Serialize(nameof(TicketId), ref TicketId);
  130.              serializer.Serialize(nameof(Option), ref Option);
  131.          }
  132.      }
  133.  
  134. -    public class ChatPayload2 : ChatPayloadPrefix
  135. +    public class ChatMessage : ChatPayloadPrefix // ChatPayload2
  136.      {
  137. -        public ushort Id;
  138.          public ushort ModuleId;
  139.          public ushort MessageId;
  140.          public uint Except;
  141. @@ -142,15 +139,14 @@ namespace S2Library.Protocol
  142.          public bool Self;
  143.          public bool Ispropset;
  144.  
  145. -        public ChatPayload2()
  146. +        public ChatMessage()
  147.          {
  148. -            Id = (ushort)ChatPayloads.ChatTypes.UnknownType02;
  149. +            Id = (ushort)ChatPayloads.ChatTypes.ChatMessage;
  150.          }
  151.  
  152.          public override void Serialize(Serializer serializer)
  153.          {
  154.              base.Serialize(serializer);
  155. -            serializer.Serialize(nameof(Id), ref Id);
  156.              serializer.Serialize(nameof(ModuleId), ref ModuleId);
  157.              serializer.Serialize(nameof(MessageId), ref MessageId);
  158.              serializer.Serialize(nameof(Except), ref Except);
  159. @@ -161,24 +157,22 @@ namespace S2Library.Protocol
  160.          }
  161.      }
  162.  
  163. -    public class ChatPayload3 : ChatPayloadPrefix
  164. +    public class ChatReply : ChatPayloadPrefix // ChatPayload3
  165.      {
  166. -        public ushort Id;
  167.          public ushort MessageId;
  168.          public byte[] Data;
  169.          public uint CellId;
  170.          public uint FromId;
  171.          public bool Ispropset;
  172.  
  173. -        public ChatPayload3()
  174. +        public ChatReply()
  175.          {
  176. -            Id = (ushort)ChatPayloads.ChatTypes.UnknownType03;
  177. +            Id = (ushort)ChatPayloads.ChatTypes.ChatReply;
  178.          }
  179.  
  180.          public override void Serialize(Serializer serializer)
  181.          {
  182.              base.Serialize(serializer);
  183. -            serializer.Serialize(nameof(Id), ref Id);
  184.              serializer.Serialize(nameof(MessageId), ref MessageId);
  185.              serializer.Serialize(nameof(Data), ref Data);
  186.              serializer.Serialize(nameof(CellId), ref CellId);
  187. @@ -189,7 +183,6 @@ namespace S2Library.Protocol
  188.  
  189.      public class ChatPayload4 : ChatPayloadPrefix
  190.      {
  191. -        public ushort Id;
  192.          public uint CellId;
  193.          public uint TicketId;
  194.          public ushort Option;
  195. @@ -202,7 +195,6 @@ namespace S2Library.Protocol
  196.          public override void Serialize(Serializer serializer)
  197.          {
  198.              base.Serialize(serializer);
  199. -            serializer.Serialize(nameof(Id), ref Id);
  200.              serializer.Serialize(nameof(CellId), ref CellId);
  201.              serializer.Serialize(nameof(TicketId), ref TicketId);
  202.              serializer.Serialize(nameof(Option), ref Option);
  203. @@ -211,7 +203,6 @@ namespace S2Library.Protocol
  204.  
  205.      public class ChatPayload5 : ChatPayloadPrefix
  206.      {
  207. -        public ushort Id;
  208.          public uint CellId;
  209.          public uint TicketId;
  210.          public ushort Option;
  211. @@ -224,7 +215,6 @@ namespace S2Library.Protocol
  212.          public override void Serialize(Serializer serializer)
  213.          {
  214.              base.Serialize(serializer);
  215. -            serializer.Serialize(nameof(Id), ref Id);
  216.              serializer.Serialize(nameof(CellId), ref CellId);
  217.              serializer.Serialize(nameof(TicketId), ref TicketId);
  218.              serializer.Serialize(nameof(Option), ref Option);
  219. @@ -233,7 +223,6 @@ namespace S2Library.Protocol
  220.  
  221.      public class CreateChannel : ChatPayloadPrefix // ChatPayload7
  222.      {
  223. -        public ushort Id;
  224.          public byte[] Data;
  225.          public uint TicketId;
  226.  
  227. @@ -245,7 +234,6 @@ namespace S2Library.Protocol
  228.          public override void Serialize(Serializer serializer)
  229.          {
  230.              base.Serialize(serializer);
  231. -            serializer.Serialize(nameof(Id), ref Id);
  232.              serializer.Serialize(nameof(Data), ref Data);
  233.              serializer.Serialize(nameof(TicketId), ref TicketId);
  234.          }
  235. @@ -253,7 +241,6 @@ namespace S2Library.Protocol
  236.  
  237.      public class ChatPayload8 : ChatPayloadPrefix
  238.      {
  239. -        public ushort Id;
  240.          public uint CellId;
  241.          public uint TicketId;
  242.          public ushort Option;
  243. @@ -266,29 +253,26 @@ namespace S2Library.Protocol
  244.          public override void Serialize(Serializer serializer)
  245.          {
  246.              base.Serialize(serializer);
  247. -            serializer.Serialize(nameof(Id), ref Id);
  248.              serializer.Serialize(nameof(CellId), ref CellId);
  249.              serializer.Serialize(nameof(TicketId), ref TicketId);
  250.              serializer.Serialize(nameof(Option), ref Option);
  251.          }
  252.      }
  253.  
  254. -    public class ChatPayload9 : ChatPayloadPrefix
  255. +    public class ChannelJoined : ChatPayloadPrefix // ChatPayload9
  256.      {
  257. -        public ushort Id;
  258.          public uint CellId;
  259.          public uint TicketId;
  260.          public ushort Option;
  261.  
  262. -        public ChatPayload9()
  263. +        public ChannelJoined()
  264.          {
  265. -            Id = (ushort)ChatPayloads.ChatTypes.UnknownType09;
  266. +            Id = (ushort)ChatPayloads.ChatTypes.ChannelJoined;
  267.          }
  268.  
  269.          public override void Serialize(Serializer serializer)
  270.          {
  271.              base.Serialize(serializer);
  272. -            serializer.Serialize(nameof(Id), ref Id);
  273.              serializer.Serialize(nameof(CellId), ref CellId);
  274.              serializer.Serialize(nameof(TicketId), ref TicketId);
  275.              serializer.Serialize(nameof(Option), ref Option);
  276. @@ -297,7 +281,6 @@ namespace S2Library.Protocol
  277.  
  278.      public class ChatPayload10 : ChatPayloadPrefix
  279.      {
  280. -        public ushort Id;
  281.          public uint CellId;
  282.          public uint TicketId;
  283.          public ushort Option;
  284. @@ -310,36 +293,33 @@ namespace S2Library.Protocol
  285.          public override void Serialize(Serializer serializer)
  286.          {
  287.              base.Serialize(serializer);
  288. -            serializer.Serialize(nameof(Id), ref Id);
  289.              serializer.Serialize(nameof(CellId), ref CellId);
  290.              serializer.Serialize(nameof(TicketId), ref TicketId);
  291.              serializer.Serialize(nameof(Option), ref Option);
  292.          }
  293.      }
  294.  
  295. -    public class ChatPayload11 : ChatPayloadPrefix
  296. +    public class StatusReply : ChatPayloadPrefix // ChatPayload11
  297.      {
  298. -        public ushort Id;
  299.          public uint CellId;
  300.          public uint TicketId;
  301.          public ushort ResultId;
  302.  
  303. -        public ChatPayload11()
  304. +        public StatusReply()
  305.          {
  306. -            Id = (ushort)ChatPayloads.ChatTypes.UnknownType11;
  307. +            Id = (ushort)ChatPayloads.ChatTypes.StatusReply;
  308.          }
  309.  
  310.          public override void Serialize(Serializer serializer)
  311.          {
  312.              base.Serialize(serializer);
  313. -            serializer.Serialize(nameof(Id), ref Id);
  314.              serializer.Serialize(nameof(CellId), ref CellId);
  315.              serializer.Serialize(nameof(TicketId), ref TicketId);
  316.              serializer.Serialize(nameof(ResultId), ref ResultId);
  317.          }
  318.      }
  319.  
  320. -    public class UnknownData
  321. +    public class ChannelData
  322.      {
  323.          public string Publish;
  324.          public string Name;
  325. @@ -352,7 +332,7 @@ namespace S2Library.Protocol
  326.          public bool Hidden;
  327.          public uint CreatorPid;
  328.  
  329. -        public UnknownData()
  330. +        public ChannelData()
  331.          {
  332.              Publish = "SC";
  333.          }
  334. diff --git a/S2Library/Protocol/Crypto.cs b/S2Library/Protocol/Crypto.cs
  335. index a035e5a..b40a18b 100644
  336. --- a/S2Library/Protocol/Crypto.cs
  337. +++ b/S2Library/Protocol/Crypto.cs
  338. @@ -1,5 +1,6 @@
  339.  using System;
  340.  using System.IO;
  341. +
  342.  using Org.BouncyCastle.Asn1;
  343.  using Org.BouncyCastle.Asn1.X9;
  344.  using Org.BouncyCastle.Crypto;
  345. @@ -117,7 +118,7 @@ namespace S2Library.Protocol
  346.              return result;
  347.          }
  348.  
  349. -        public static byte[] HandleUser(byte[] cipher, byte[] secretKey)
  350. +        public static byte[] HandleCipher(byte[] cipher, byte[] secretKey)
  351.          {
  352.  
  353.              TwofishEngine engine = new TwofishEngine();
  354. @@ -154,14 +155,12 @@ namespace S2Library.Protocol
  355.  
  356.              TwofishEngine engine = new TwofishEngine();
  357.              CtrBlockCipher blockCipher = new CtrBlockCipher(engine);
  358. -            PaddedBufferedBlockCipher bufferedBlockCipher = new PaddedBufferedBlockCipher(blockCipher, new ZeroBytePadding());
  359.              KeyParameter secret = new KeyParameter(sharedSecret);
  360.  
  361.              ParametersWithIV key = new ParametersWithIV(secret, iv);
  362. -            bufferedBlockCipher.Init(true, key);
  363. +            blockCipher.Init(true, key);
  364.  
  365.              byte[] result = new byte[iv.Length + sessionKey.Length];
  366. -            bufferedBlockCipher.ProcessBytes(sessionKey, 0, sessionKey.Length, result, 16);
  367.              Array.Copy(iv, result, iv.Length);
  368.  
  369.              int pos = 0;
  370. diff --git a/S2Library/Protocol/Payloads.cs b/S2Library/Protocol/Payloads.cs
  371. index 25f260a..5ca3bd9 100644
  372. --- a/S2Library/Protocol/Payloads.cs
  373. +++ b/S2Library/Protocol/Payloads.cs
  374. @@ -8,11 +8,11 @@ namespace S2Library.Protocol
  375.          public enum Types : ushort
  376.          {
  377.              UnknownType001 = 1,
  378. -            UnknownType002 = 2,
  379. +            ChatPayload = 2, // UnknownType002
  380.              UnknownType003 = 3,
  381.              UnknownType004 = 4,
  382. -            UnknownType005 = 5,
  383. -            UnknownType006 = 6,
  384. +            ChatUserInfo = 5, // UnknownType005
  385. +            ChatDisconnected = 6, // UnknownType006
  386.              UnknownType007 = 7,
  387.              UnknownType008 = 8,
  388.              UnknownType009 = 9,
  389. @@ -23,7 +23,7 @@ namespace S2Library.Protocol
  390.              UnknownType014 = 14,
  391.              UnknownType015 = 15,
  392.              UnknownType016 = 16,
  393. -            UnknownType017 = 17,
  394. +            JoinChatChannel = 17, // UnknownType017
  395.              UnknownType018 = 18,
  396.              UnknownType019 = 19,
  397.              UnknownType020 = 20,
  398. @@ -141,7 +141,7 @@ namespace S2Library.Protocol
  399.              UnknownType143 = 143,
  400.              UnknownType144 = 144,
  401.              UnknownType145 = 145,
  402. -            UnknownType146 = 146,
  403. +            PlayerJoinedServer = 146, // UnknownType146
  404.              UnknownType147 = 147,
  405.              UnknownType148 = 148,
  406.              UnknownType149 = 149,
  407. @@ -164,7 +164,7 @@ namespace S2Library.Protocol
  408.              UnknownType166 = 166,
  409.              UnknownType167 = 167,
  410.              RegisterServer = 168, // UnknownType168
  411. -            UnknownType169 = 169,
  412. +            UnlistServer = 169, // UnknownType169
  413.              ServerInfo = 170, // UnknownType170
  414.              GetServers = 171, // UnknownType171
  415.              StopServerUpdates = 172, // UnknownType172
  416. @@ -185,7 +185,7 @@ namespace S2Library.Protocol
  417.              UnknownType187 = 187,
  418.              VersionCheck = 188, // UnknownType188
  419.              GetChatServer = 189, // UnknownType189
  420. -            UnknownType190 = 190,
  421. +            PlayerLeftServer = 190, // UnknownType190
  422.              UnknownType191 = 191,
  423.              SendChatServerInfo = 192, // UnknownType192
  424.              UnknownType193 = 193,
  425. @@ -236,11 +236,11 @@ namespace S2Library.Protocol
  426.          static Payloads()
  427.          {
  428.              PayloadTypes.Add(typeof(Payload1), Types.UnknownType001);
  429. -            PayloadTypes.Add(typeof(Payload2), Types.UnknownType002);
  430. +            PayloadTypes.Add(typeof(ChatPayload), Types.ChatPayload); // Payload2
  431.              PayloadTypes.Add(typeof(Payload3), Types.UnknownType003);
  432.              PayloadTypes.Add(typeof(Payload4), Types.UnknownType004);
  433. -            PayloadTypes.Add(typeof(Payload5), Types.UnknownType005);
  434. -            PayloadTypes.Add(typeof(Payload6), Types.UnknownType006);
  435. +            PayloadTypes.Add(typeof(ChatUserInfo), Types.ChatUserInfo); // Payload5
  436. +            PayloadTypes.Add(typeof(ChatDisconnected), Types.ChatDisconnected); // Payload6
  437.              PayloadTypes.Add(typeof(Payload7), Types.UnknownType007);
  438.              PayloadTypes.Add(typeof(Payload8), Types.UnknownType008);
  439.              PayloadTypes.Add(typeof(Payload9), Types.UnknownType009);
  440. @@ -251,7 +251,7 @@ namespace S2Library.Protocol
  441.              PayloadTypes.Add(typeof(Payload14), Types.UnknownType014);
  442.              PayloadTypes.Add(typeof(Payload15), Types.UnknownType015);
  443.              PayloadTypes.Add(typeof(Payload16), Types.UnknownType016);
  444. -            PayloadTypes.Add(typeof(Payload17), Types.UnknownType017);
  445. +            PayloadTypes.Add(typeof(JoinChatChannel), Types.JoinChatChannel); // Payload17
  446.              PayloadTypes.Add(typeof(Payload18), Types.UnknownType018);
  447.              PayloadTypes.Add(typeof(Payload19), Types.UnknownType019);
  448.              PayloadTypes.Add(typeof(Payload20), Types.UnknownType020);
  449. @@ -369,7 +369,7 @@ namespace S2Library.Protocol
  450.              PayloadTypes.Add(typeof(Payload143), Types.UnknownType143);
  451.              PayloadTypes.Add(typeof(Payload144), Types.UnknownType144);
  452.              PayloadTypes.Add(typeof(Payload145), Types.UnknownType145);
  453. -            PayloadTypes.Add(typeof(Payload146), Types.UnknownType146);
  454. +            PayloadTypes.Add(typeof(PlayerJoinedServer), Types.PlayerJoinedServer); // Payload146
  455.              PayloadTypes.Add(typeof(Payload147), Types.UnknownType147);
  456.              PayloadTypes.Add(typeof(Payload148), Types.UnknownType148);
  457.              PayloadTypes.Add(typeof(Payload149), Types.UnknownType149);
  458. @@ -392,7 +392,7 @@ namespace S2Library.Protocol
  459.              PayloadTypes.Add(typeof(Payload166), Types.UnknownType166);
  460.              PayloadTypes.Add(typeof(Payload167), Types.UnknownType167);
  461.              PayloadTypes.Add(typeof(RegisterServer), Types.RegisterServer); // Payload168
  462. -            PayloadTypes.Add(typeof(Payload169), Types.UnknownType169);
  463. +            PayloadTypes.Add(typeof(UnlistServer), Types.UnlistServer); // Payload169
  464.              PayloadTypes.Add(typeof(ServerInfo), Types.ServerInfo); // Payload170
  465.              PayloadTypes.Add(typeof(GetServers), Types.GetServers); // Payload171
  466.              PayloadTypes.Add(typeof(StopServerUpdates), Types.StopServerUpdates); // Payload172
  467. @@ -413,7 +413,7 @@ namespace S2Library.Protocol
  468.              PayloadTypes.Add(typeof(Payload187), Types.UnknownType187);
  469.              PayloadTypes.Add(typeof(VersionCheck), Types.VersionCheck); // Payload188
  470.              PayloadTypes.Add(typeof(GetChatServer), Types.GetChatServer); // Payload189
  471. -            PayloadTypes.Add(typeof(Payload190), Types.UnknownType190);
  472. +            PayloadTypes.Add(typeof(PlayerLeftServer), Types.PlayerLeftServer); // Payload190
  473.              PayloadTypes.Add(typeof(Payload191), Types.UnknownType191);
  474.              PayloadTypes.Add(typeof(SendChatServerInfo), Types.SendChatServerInfo); // Payload192
  475.              PayloadTypes.Add(typeof(Payload193), Types.UnknownType193);
  476. @@ -508,11 +508,20 @@ namespace S2Library.Protocol
  477.  
  478.          public const ushort PayloadMagic = 0x26B6;
  479.  
  480. -        public virtual void Serialize(Serializer serializer)
  481. +        public virtual void Serialize(Serializer serializer, bool fullHeader = true)
  482.          {
  483. -            serializer.Serialize(nameof(Magic), ref Magic);
  484. -            serializer.Serialize(nameof(Type1), ref Type1);
  485. +            if (fullHeader)
  486. +            {
  487. +                serializer.Serialize(nameof(Magic), ref Magic);
  488. +                serializer.Serialize(nameof(Type1), ref Type1);
  489. +            }
  490.              serializer.Serialize(nameof(Type2), ref Type2);
  491. +
  492. +            if (!fullHeader)
  493. +            {
  494. +                Magic = PayloadMagic;
  495. +                Type1 = Type2;
  496. +            }
  497.          }
  498.      }
  499.  
  500. @@ -524,9 +533,9 @@ namespace S2Library.Protocol
  501.      {
  502.          public uint Data;
  503.  
  504. -        public override void Serialize(Serializer serializer)
  505. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  506.          {
  507. -            base.Serialize(serializer);
  508. +            base.Serialize(serializer, fullHeader);
  509.              serializer.Serialize(nameof(Data), ref Data);
  510.          }
  511.      }
  512. @@ -538,16 +547,16 @@ namespace S2Library.Protocol
  513.  //    (**(code**)(* piVar1 + 8))("ticket_id",8);
  514.  //    (**(code**)(* piVar1 + 8))("from_id",8);
  515.  //    (**(code**)(* unaff_EDI + 4))(2,piVar1);
  516. -    public class Payload2 : PayloadPrefix
  517. +    public class ChatPayload : PayloadPrefix // Payload2
  518.      {
  519.          public uint Mode;
  520.          public string Txt;
  521.          public uint TicketId;
  522.          public uint FromId;
  523.  
  524. -        public override void Serialize(Serializer serializer)
  525. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  526.          {
  527. -            base.Serialize(serializer);
  528. +            base.Serialize(serializer, fullHeader);
  529.              serializer.Serialize(nameof(Mode), ref Mode);
  530.              serializer.Serialize(nameof(Txt), ref Txt);
  531.              serializer.Serialize(nameof(TicketId), ref TicketId);
  532. @@ -573,9 +582,9 @@ namespace S2Library.Protocol
  533.          public uint ToId;
  534.          public string FromName;
  535.  
  536. -        public override void Serialize(Serializer serializer)
  537. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  538.          {
  539. -            base.Serialize(serializer);
  540. +            base.Serialize(serializer, fullHeader);
  541.              serializer.Serialize(nameof(Mode), ref Mode);
  542.              serializer.Serialize(nameof(Txt), ref Txt);
  543.              serializer.Serialize(nameof(CellId), ref CellId);
  544. @@ -603,9 +612,9 @@ namespace S2Library.Protocol
  545.          public uint Patchlevel;
  546.          public uint TicketId;
  547.  
  548. -        public override void Serialize(Serializer serializer)
  549. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  550.          {
  551. -            base.Serialize(serializer);
  552. +            base.Serialize(serializer, fullHeader);
  553.              serializer.Serialize(nameof(Nick), ref Nick);
  554.              serializer.Serialize(nameof(Password), ref Password);
  555.              serializer.Serialize(nameof(CdKey), ref CdKey);
  556. @@ -621,15 +630,15 @@ namespace S2Library.Protocol
  557.  //    (**(code**)(* piVar1 + 8))("cell_id",8);
  558.  //    (**(code**)(* piVar1 + 4))("nick",2,0x100);
  559.  //    (**(code**)(* unaff_EDI + 4))(5,piVar1);
  560. -    public class Payload5 : PayloadPrefix
  561. +    public class ChatUserInfo : PayloadPrefix // Payload5
  562.      {
  563.          public uint PermId;
  564.          public uint CellId;
  565.          public string Nick;
  566.  
  567. -        public override void Serialize(Serializer serializer)
  568. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  569.          {
  570. -            base.Serialize(serializer);
  571. +            base.Serialize(serializer, fullHeader);
  572.              serializer.Serialize(nameof(PermId), ref PermId);
  573.              serializer.Serialize(nameof(CellId), ref CellId);
  574.              serializer.Serialize(nameof(Nick), ref Nick);
  575. @@ -641,14 +650,14 @@ namespace S2Library.Protocol
  576.  //    (**(code**)(* piVar1 + 8))("perm_id",8);
  577.  //    (**(code**)(* piVar1 + 8))("cell_id",8);
  578.  //    (**(code**)(* unaff_EDI + 4))(6,piVar1);
  579. -    public class Payload6 : PayloadPrefix
  580. +    public class ChatDisconnected : PayloadPrefix // Payload6
  581.      {
  582.          public uint PermId;
  583.          public uint CellId;
  584.  
  585. -        public override void Serialize(Serializer serializer)
  586. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  587.          {
  588. -            base.Serialize(serializer);
  589. +            base.Serialize(serializer, fullHeader);
  590.              serializer.Serialize(nameof(PermId), ref PermId);
  591.              serializer.Serialize(nameof(CellId), ref CellId);
  592.          }
  593. @@ -664,9 +673,9 @@ namespace S2Library.Protocol
  594.          public uint CellId;
  595.          public uint UsrCount;
  596.  
  597. -        public override void Serialize(Serializer serializer)
  598. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  599.          {
  600. -            base.Serialize(serializer);
  601. +            base.Serialize(serializer, fullHeader);
  602.              serializer.Serialize(nameof(CellId), ref CellId);
  603.              serializer.Serialize(nameof(UsrCount), ref UsrCount);
  604.          }
  605. @@ -680,9 +689,9 @@ namespace S2Library.Protocol
  606.      {
  607.          public uint CellId;
  608.  
  609. -        public override void Serialize(Serializer serializer)
  610. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  611.          {
  612. -            base.Serialize(serializer);
  613. +            base.Serialize(serializer, fullHeader);
  614.              serializer.Serialize(nameof(CellId), ref CellId);
  615.          }
  616.      }
  617. @@ -699,9 +708,9 @@ namespace S2Library.Protocol
  618.          public uint MsgId;
  619.          public uint TicketId;
  620.  
  621. -        public override void Serialize(Serializer serializer)
  622. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  623.          {
  624. -            base.Serialize(serializer);
  625. +            base.Serialize(serializer, fullHeader);
  626.              serializer.Serialize(nameof(CellId), ref CellId);
  627.              serializer.Serialize(nameof(MsgId), ref MsgId);
  628.              serializer.Serialize(nameof(TicketId), ref TicketId);
  629. @@ -718,9 +727,9 @@ namespace S2Library.Protocol
  630.          public uint CellId;
  631.          public uint TicketId;
  632.  
  633. -        public override void Serialize(Serializer serializer)
  634. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  635.          {
  636. -            base.Serialize(serializer);
  637. +            base.Serialize(serializer, fullHeader);
  638.              serializer.Serialize(nameof(CellId), ref CellId);
  639.              serializer.Serialize(nameof(TicketId), ref TicketId);
  640.          }
  641. @@ -762,9 +771,9 @@ namespace S2Library.Protocol
  642.          public uint DeliveryDate;
  643.          public uint TicketId;
  644.  
  645. -        public override void Serialize(Serializer serializer)
  646. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  647.          {
  648. -            base.Serialize(serializer);
  649. +            base.Serialize(serializer, fullHeader);
  650.              serializer.Serialize(nameof(CellId), ref CellId);
  651.              serializer.Serialize(nameof(MsgId), ref MsgId);
  652.              serializer.Serialize(nameof(MsgType), ref MsgType);
  653. @@ -793,9 +802,9 @@ namespace S2Library.Protocol
  654.          public uint CellId;
  655.          public byte[] Idlist;
  656.  
  657. -        public override void Serialize(Serializer serializer)
  658. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  659.          {
  660. -            base.Serialize(serializer);
  661. +            base.Serialize(serializer, fullHeader);
  662.              serializer.Serialize(nameof(CellId), ref CellId);
  663.              serializer.Serialize(nameof(Idlist), ref Idlist);
  664.          }
  665. @@ -835,9 +844,9 @@ namespace S2Library.Protocol
  666.          public uint DeliveryInterval;
  667.          public uint DeliveryDate;
  668.  
  669. -        public override void Serialize(Serializer serializer)
  670. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  671.          {
  672. -            base.Serialize(serializer);
  673. +            base.Serialize(serializer, fullHeader);
  674.              serializer.Serialize(nameof(CellId), ref CellId);
  675.              serializer.Serialize(nameof(MsgId), ref MsgId);
  676.              serializer.Serialize(nameof(MsgType), ref MsgType);
  677. @@ -891,9 +900,9 @@ namespace S2Library.Protocol
  678.          public uint DeliveryDate;
  679.          public uint TicketId;
  680.  
  681. -        public override void Serialize(Serializer serializer)
  682. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  683.          {
  684. -            base.Serialize(serializer);
  685. +            base.Serialize(serializer, fullHeader);
  686.              serializer.Serialize(nameof(CellId), ref CellId);
  687.              serializer.Serialize(nameof(MsgId), ref MsgId);
  688.              serializer.Serialize(nameof(MsgType), ref MsgType);
  689. @@ -924,9 +933,9 @@ namespace S2Library.Protocol
  690.          public uint MsgId;
  691.          public uint TicketId;
  692.  
  693. -        public override void Serialize(Serializer serializer)
  694. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  695.          {
  696. -            base.Serialize(serializer);
  697. +            base.Serialize(serializer, fullHeader);
  698.              serializer.Serialize(nameof(CellId), ref CellId);
  699.              serializer.Serialize(nameof(MsgId), ref MsgId);
  700.              serializer.Serialize(nameof(TicketId), ref TicketId);
  701. @@ -945,9 +954,9 @@ namespace S2Library.Protocol
  702.          public uint PermId;
  703.          public uint FromId;
  704.  
  705. -        public override void Serialize(Serializer serializer)
  706. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  707.          {
  708. -            base.Serialize(serializer);
  709. +            base.Serialize(serializer, fullHeader);
  710.              serializer.Serialize(nameof(CellId), ref CellId);
  711.              serializer.Serialize(nameof(PermId), ref PermId);
  712.              serializer.Serialize(nameof(FromId), ref FromId);
  713. @@ -962,7 +971,7 @@ namespace S2Library.Protocol
  714.  //    (**(code**)(* piVar1 + 4))("password",2,0x20);
  715.  //    (**(code**)(* piVar1 + 8))("from_id",8);
  716.  //    (**(code**)(* unaff_EDI + 4))(0x11,piVar1);
  717. -    public class Payload17 : PayloadPrefix
  718. +    public class JoinChatChannel : PayloadPrefix // Payload17
  719.      {
  720.          public uint CellId;
  721.          public uint TicketId;
  722. @@ -970,9 +979,9 @@ namespace S2Library.Protocol
  723.          public string Password;
  724.          public uint FromId;
  725.  
  726. -        public override void Serialize(Serializer serializer)
  727. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  728.          {
  729. -            base.Serialize(serializer);
  730. +            base.Serialize(serializer, fullHeader);
  731.              serializer.Serialize(nameof(CellId), ref CellId);
  732.              serializer.Serialize(nameof(TicketId), ref TicketId);
  733.              serializer.Serialize(nameof(Option), ref Option);
  734. @@ -993,9 +1002,9 @@ namespace S2Library.Protocol
  735.          public uint PermId;
  736.          public uint TicketId;
  737.  
  738. -        public override void Serialize(Serializer serializer)
  739. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  740.          {
  741. -            base.Serialize(serializer);
  742. +            base.Serialize(serializer, fullHeader);
  743.              serializer.Serialize(nameof(CellId), ref CellId);
  744.              serializer.Serialize(nameof(PermId), ref PermId);
  745.              serializer.Serialize(nameof(TicketId), ref TicketId);
  746. @@ -1010,9 +1019,9 @@ namespace S2Library.Protocol
  747.      {
  748.          public uint PermId;
  749.  
  750. -        public override void Serialize(Serializer serializer)
  751. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  752.          {
  753. -            base.Serialize(serializer);
  754. +            base.Serialize(serializer, fullHeader);
  755.              serializer.Serialize(nameof(PermId), ref PermId);
  756.          }
  757.      }
  758. @@ -1025,9 +1034,9 @@ namespace S2Library.Protocol
  759.      {
  760.          public uint GroupId;
  761.  
  762. -        public override void Serialize(Serializer serializer)
  763. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  764.          {
  765. -            base.Serialize(serializer);
  766. +            base.Serialize(serializer, fullHeader);
  767.              serializer.Serialize(nameof(GroupId), ref GroupId);
  768.          }
  769.      }
  770. @@ -1052,9 +1061,9 @@ namespace S2Library.Protocol
  771.          public bool Active;
  772.          public bool Banned;
  773.  
  774. -        public override void Serialize(Serializer serializer)
  775. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  776.          {
  777. -            base.Serialize(serializer);
  778. +            base.Serialize(serializer, fullHeader);
  779.              serializer.Serialize(nameof(Username), ref Username);
  780.              serializer.Serialize(nameof(PermId), ref PermId);
  781.              serializer.Serialize(nameof(Userpwd), ref Userpwd);
  782. @@ -1079,9 +1088,9 @@ namespace S2Library.Protocol
  783.          public uint Grouptype;
  784.          public uint GroupAccess;
  785.  
  786. -        public override void Serialize(Serializer serializer)
  787. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  788.          {
  789. -            base.Serialize(serializer);
  790. +            base.Serialize(serializer, fullHeader);
  791.              serializer.Serialize(nameof(Groupname), ref Groupname);
  792.              serializer.Serialize(nameof(GroupId), ref GroupId);
  793.              serializer.Serialize(nameof(Grouptype), ref Grouptype);
  794. @@ -1107,9 +1116,9 @@ namespace S2Library.Protocol
  795.          public bool Active;
  796.          public bool Banned;
  797.  
  798. -        public override void Serialize(Serializer serializer)
  799. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  800.          {
  801. -            base.Serialize(serializer);
  802. +            base.Serialize(serializer, fullHeader);
  803.              serializer.Serialize(nameof(Username), ref Username);
  804.              serializer.Serialize(nameof(Userpwd), ref Userpwd);
  805.              serializer.Serialize(nameof(GroupId), ref GroupId);
  806. @@ -1131,9 +1140,9 @@ namespace S2Library.Protocol
  807.          public uint GroupAccess;
  808.          public uint TicketId;
  809.  
  810. -        public override void Serialize(Serializer serializer)
  811. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  812.          {
  813. -            base.Serialize(serializer);
  814. +            base.Serialize(serializer, fullHeader);
  815.              serializer.Serialize(nameof(Groupname), ref Groupname);
  816.              serializer.Serialize(nameof(GroupAccess), ref GroupAccess);
  817.              serializer.Serialize(nameof(TicketId), ref TicketId);
  818. @@ -1160,9 +1169,9 @@ namespace S2Library.Protocol
  819.          public bool Active;
  820.          public bool Banned;
  821.  
  822. -        public override void Serialize(Serializer serializer)
  823. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  824.          {
  825. -            base.Serialize(serializer);
  826. +            base.Serialize(serializer, fullHeader);
  827.              serializer.Serialize(nameof(Username), ref Username);
  828.              serializer.Serialize(nameof(PermId), ref PermId);
  829.              serializer.Serialize(nameof(Userpwd), ref Userpwd);
  830. @@ -1187,9 +1196,9 @@ namespace S2Library.Protocol
  831.          public uint GroupAccess;
  832.          public uint TicketId;
  833.  
  834. -        public override void Serialize(Serializer serializer)
  835. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  836.          {
  837. -            base.Serialize(serializer);
  838. +            base.Serialize(serializer, fullHeader);
  839.              serializer.Serialize(nameof(Groupname), ref Groupname);
  840.              serializer.Serialize(nameof(GroupId), ref GroupId);
  841.              serializer.Serialize(nameof(GroupAccess), ref GroupAccess);
  842. @@ -1205,9 +1214,9 @@ namespace S2Library.Protocol
  843.      {
  844.          public uint PermId;
  845.  
  846. -        public override void Serialize(Serializer serializer)
  847. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  848.          {
  849. -            base.Serialize(serializer);
  850. +            base.Serialize(serializer, fullHeader);
  851.              serializer.Serialize(nameof(PermId), ref PermId);
  852.          }
  853.      }
  854. @@ -1220,9 +1229,9 @@ namespace S2Library.Protocol
  855.      {
  856.          public uint GroupId;
  857.  
  858. -        public override void Serialize(Serializer serializer)
  859. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  860.          {
  861. -            base.Serialize(serializer);
  862. +            base.Serialize(serializer, fullHeader);
  863.              serializer.Serialize(nameof(GroupId), ref GroupId);
  864.          }
  865.      }
  866. @@ -1237,9 +1246,9 @@ namespace S2Library.Protocol
  867.          public uint ResultId;
  868.          public uint UsrGrpId;
  869.  
  870. -        public override void Serialize(Serializer serializer)
  871. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  872.          {
  873. -            base.Serialize(serializer);
  874. +            base.Serialize(serializer, fullHeader);
  875.              serializer.Serialize(nameof(ResultId), ref ResultId);
  876.              serializer.Serialize(nameof(UsrGrpId), ref UsrGrpId);
  877.          }
  878. @@ -1261,9 +1270,9 @@ namespace S2Library.Protocol
  879.          public uint FromId;
  880.          public uint PermId;
  881.  
  882. -        public override void Serialize(Serializer serializer)
  883. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  884.          {
  885. -            base.Serialize(serializer);
  886. +            base.Serialize(serializer, fullHeader);
  887.              serializer.Serialize(nameof(Mode), ref Mode);
  888.              serializer.Serialize(nameof(Txt), ref Txt);
  889.              serializer.Serialize(nameof(CellId), ref CellId);
  890. @@ -1282,9 +1291,9 @@ namespace S2Library.Protocol
  891.          public string DeliveryTargetName;
  892.          public string Body;
  893.  
  894. -        public override void Serialize(Serializer serializer)
  895. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  896.          {
  897. -            base.Serialize(serializer);
  898. +            base.Serialize(serializer, fullHeader);
  899.              serializer.Serialize(nameof(DeliveryTargetName), ref DeliveryTargetName);
  900.              serializer.Serialize(nameof(Body), ref Body);
  901.          }
  902. @@ -1328,9 +1337,9 @@ namespace S2Library.Protocol
  903.          public uint DeliveryInterval;
  904.          public uint DeliveryDate;
  905.  
  906. -        public override void Serialize(Serializer serializer)
  907. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  908.          {
  909. -            base.Serialize(serializer);
  910. +            base.Serialize(serializer, fullHeader);
  911.              serializer.Serialize(nameof(CellId), ref CellId);
  912.              serializer.Serialize(nameof(TicketId), ref TicketId);
  913.              serializer.Serialize(nameof(MsgId), ref MsgId);
  914. @@ -1358,9 +1367,9 @@ namespace S2Library.Protocol
  915.      {
  916.          public uint CellId;
  917.  
  918. -        public override void Serialize(Serializer serializer)
  919. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  920.          {
  921. -            base.Serialize(serializer);
  922. +            base.Serialize(serializer, fullHeader);
  923.              serializer.Serialize(nameof(CellId), ref CellId);
  924.          }
  925.      }
  926. @@ -1385,9 +1394,9 @@ namespace S2Library.Protocol
  927.          public byte[] ItemData;
  928.          public uint TicketId;
  929.  
  930. -        public override void Serialize(Serializer serializer)
  931. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  932.          {
  933. -            base.Serialize(serializer);
  934. +            base.Serialize(serializer, fullHeader);
  935.              serializer.Serialize(nameof(Owner), ref Owner);
  936.              serializer.Serialize(nameof(ItemType), ref ItemType);
  937.              serializer.Serialize(nameof(ItemName), ref ItemName);
  938. @@ -1410,9 +1419,9 @@ namespace S2Library.Protocol
  939.          public uint ItemPrize;
  940.          public uint TicketId;
  941.  
  942. -        public override void Serialize(Serializer serializer)
  943. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  944.          {
  945. -            base.Serialize(serializer);
  946. +            base.Serialize(serializer, fullHeader);
  947.              serializer.Serialize(nameof(ItemId), ref ItemId);
  948.              serializer.Serialize(nameof(ItemPrize), ref ItemPrize);
  949.              serializer.Serialize(nameof(TicketId), ref TicketId);
  950. @@ -1429,9 +1438,9 @@ namespace S2Library.Protocol
  951.          public uint ItemId;
  952.          public uint TicketId;
  953.  
  954. -        public override void Serialize(Serializer serializer)
  955. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  956.          {
  957. -            base.Serialize(serializer);
  958. +            base.Serialize(serializer, fullHeader);
  959.              serializer.Serialize(nameof(ItemId), ref ItemId);
  960.              serializer.Serialize(nameof(TicketId), ref TicketId);
  961.          }
  962. @@ -1449,9 +1458,9 @@ namespace S2Library.Protocol
  963.          public uint ItemId;
  964.          public uint TicketId;
  965.  
  966. -        public override void Serialize(Serializer serializer)
  967. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  968.          {
  969. -            base.Serialize(serializer);
  970. +            base.Serialize(serializer, fullHeader);
  971.              serializer.Serialize(nameof(Netzone), ref Netzone);
  972.              serializer.Serialize(nameof(ItemId), ref ItemId);
  973.              serializer.Serialize(nameof(TicketId), ref TicketId);
  974. @@ -1482,9 +1491,9 @@ namespace S2Library.Protocol
  975.          public byte[] ItemData;
  976.          public uint TicketId;
  977.  
  978. -        public override void Serialize(Serializer serializer)
  979. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  980.          {
  981. -            base.Serialize(serializer);
  982. +            base.Serialize(serializer, fullHeader);
  983.              serializer.Serialize(nameof(ItemId), ref ItemId);
  984.              serializer.Serialize(nameof(Owner), ref Owner);
  985.              serializer.Serialize(nameof(OwnerName), ref OwnerName);
  986. @@ -1527,9 +1536,9 @@ namespace S2Library.Protocol
  987.          public string Criterias;
  988.          public uint TicketId;
  989.  
  990. -        public override void Serialize(Serializer serializer)
  991. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  992.          {
  993. -            base.Serialize(serializer);
  994. +            base.Serialize(serializer, fullHeader);
  995.              serializer.Serialize(nameof(Netzone), ref Netzone);
  996.              serializer.Serialize(nameof(ItemType), ref ItemType);
  997.              serializer.Serialize(nameof(OwnerName), ref OwnerName);
  998. @@ -1553,9 +1562,9 @@ namespace S2Library.Protocol
  999.      {
  1000.          public uint TicketId;
  1001.  
  1002. -        public override void Serialize(Serializer serializer)
  1003. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1004.          {
  1005. -            base.Serialize(serializer);
  1006. +            base.Serialize(serializer, fullHeader);
  1007.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1008.          }
  1009.      }
  1010. @@ -1570,9 +1579,9 @@ namespace S2Library.Protocol
  1011.          public ushort Limit;
  1012.          public uint TicketId;
  1013.  
  1014. -        public override void Serialize(Serializer serializer)
  1015. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1016.          {
  1017. -            base.Serialize(serializer);
  1018. +            base.Serialize(serializer, fullHeader);
  1019.              serializer.Serialize(nameof(Limit), ref Limit);
  1020.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1021.          }
  1022. @@ -1590,9 +1599,9 @@ namespace S2Library.Protocol
  1023.          public string Errormsg;
  1024.          public uint TicketId;
  1025.  
  1026. -        public override void Serialize(Serializer serializer)
  1027. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1028.          {
  1029. -            base.Serialize(serializer);
  1030. +            base.Serialize(serializer, fullHeader);
  1031.              serializer.Serialize(nameof(Errorcode), ref Errorcode);
  1032.              serializer.Serialize(nameof(Errormsg), ref Errormsg);
  1033.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1034. @@ -1611,9 +1620,9 @@ namespace S2Library.Protocol
  1035.          public uint NotificationType;
  1036.          public uint TargetMsgId;
  1037.  
  1038. -        public override void Serialize(Serializer serializer)
  1039. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1040.          {
  1041. -            base.Serialize(serializer);
  1042. +            base.Serialize(serializer, fullHeader);
  1043.              serializer.Serialize(nameof(CellId), ref CellId);
  1044.              serializer.Serialize(nameof(NotificationType), ref NotificationType);
  1045.              serializer.Serialize(nameof(TargetMsgId), ref TargetMsgId);
  1046. @@ -1632,9 +1641,9 @@ namespace S2Library.Protocol
  1047.          public uint Buyer;
  1048.          public uint TicketId;
  1049.  
  1050. -        public override void Serialize(Serializer serializer)
  1051. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1052.          {
  1053. -            base.Serialize(serializer);
  1054. +            base.Serialize(serializer, fullHeader);
  1055.              serializer.Serialize(nameof(ItemId), ref ItemId);
  1056.              serializer.Serialize(nameof(Buyer), ref Buyer);
  1057.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1058. @@ -1653,9 +1662,9 @@ namespace S2Library.Protocol
  1059.          public uint Buyer;
  1060.          public uint TicketId;
  1061.  
  1062. -        public override void Serialize(Serializer serializer)
  1063. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1064.          {
  1065. -            base.Serialize(serializer);
  1066. +            base.Serialize(serializer, fullHeader);
  1067.              serializer.Serialize(nameof(ItemId), ref ItemId);
  1068.              serializer.Serialize(nameof(Buyer), ref Buyer);
  1069.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1070. @@ -1683,9 +1692,9 @@ namespace S2Library.Protocol
  1071.          public byte[] ItemData;
  1072.          public uint TicketId;
  1073.  
  1074. -        public override void Serialize(Serializer serializer)
  1075. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1076.          {
  1077. -            base.Serialize(serializer);
  1078. +            base.Serialize(serializer, fullHeader);
  1079.              serializer.Serialize(nameof(ItemId), ref ItemId);
  1080.              serializer.Serialize(nameof(Buyer), ref Buyer);
  1081.              serializer.Serialize(nameof(ItemType), ref ItemType);
  1082. @@ -1707,9 +1716,9 @@ namespace S2Library.Protocol
  1083.          public uint ItemsFound;
  1084.          public uint TicketId;
  1085.  
  1086. -        public override void Serialize(Serializer serializer)
  1087. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1088.          {
  1089. -            base.Serialize(serializer);
  1090. +            base.Serialize(serializer, fullHeader);
  1091.              serializer.Serialize(nameof(ItemsFound), ref ItemsFound);
  1092.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1093.          }
  1094. @@ -1723,9 +1732,9 @@ namespace S2Library.Protocol
  1095.      {
  1096.          public uint TicketId;
  1097.  
  1098. -        public override void Serialize(Serializer serializer)
  1099. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1100.          {
  1101. -            base.Serialize(serializer);
  1102. +            base.Serialize(serializer, fullHeader);
  1103.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1104.          }
  1105.      }
  1106. @@ -1740,9 +1749,9 @@ namespace S2Library.Protocol
  1107.          public string ValueName;
  1108.          public uint TicketId;
  1109.  
  1110. -        public override void Serialize(Serializer serializer)
  1111. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1112.          {
  1113. -            base.Serialize(serializer);
  1114. +            base.Serialize(serializer, fullHeader);
  1115.              serializer.Serialize(nameof(ValueName), ref ValueName);
  1116.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1117.          }
  1118. @@ -1758,9 +1767,9 @@ namespace S2Library.Protocol
  1119.          public string ValueName;
  1120.          public uint TicketId;
  1121.  
  1122. -        public override void Serialize(Serializer serializer)
  1123. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1124.          {
  1125. -            base.Serialize(serializer);
  1126. +            base.Serialize(serializer, fullHeader);
  1127.              serializer.Serialize(nameof(ValueName), ref ValueName);
  1128.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1129.          }
  1130. @@ -1776,9 +1785,9 @@ namespace S2Library.Protocol
  1131.          public string Value;
  1132.          public uint TicketId;
  1133.  
  1134. -        public override void Serialize(Serializer serializer)
  1135. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1136.          {
  1137. -            base.Serialize(serializer);
  1138. +            base.Serialize(serializer, fullHeader);
  1139.              serializer.Serialize(nameof(Value), ref Value);
  1140.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1141.          }
  1142. @@ -1794,9 +1803,9 @@ namespace S2Library.Protocol
  1143.          public ushort Resultcode;
  1144.          public uint TicketId;
  1145.  
  1146. -        public override void Serialize(Serializer serializer)
  1147. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1148.          {
  1149. -            base.Serialize(serializer);
  1150. +            base.Serialize(serializer, fullHeader);
  1151.              serializer.Serialize(nameof(Resultcode), ref Resultcode);
  1152.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1153.          }
  1154. @@ -1820,9 +1829,9 @@ namespace S2Library.Protocol
  1155.          public uint Selection;
  1156.          public uint TicketId;
  1157.  
  1158. -        public override void Serialize(Serializer serializer)
  1159. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1160.          {
  1161. -            base.Serialize(serializer);
  1162. +            base.Serialize(serializer, fullHeader);
  1163.              serializer.Serialize(nameof(UserId), ref UserId);
  1164.              serializer.Serialize(nameof(CdKey), ref CdKey);
  1165.              serializer.Serialize(nameof(Keypool), ref Keypool);
  1166. @@ -1842,9 +1851,9 @@ namespace S2Library.Protocol
  1167.          public uint UserId;
  1168.          public uint TicketId;
  1169.  
  1170. -        public override void Serialize(Serializer serializer)
  1171. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1172.          {
  1173. -            base.Serialize(serializer);
  1174. +            base.Serialize(serializer, fullHeader);
  1175.              serializer.Serialize(nameof(UserId), ref UserId);
  1176.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1177.          }
  1178. @@ -1860,9 +1869,9 @@ namespace S2Library.Protocol
  1179.          public uint UserId;
  1180.          public uint TicketId;
  1181.  
  1182. -        public override void Serialize(Serializer serializer)
  1183. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1184.          {
  1185. -            base.Serialize(serializer);
  1186. +            base.Serialize(serializer, fullHeader);
  1187.              serializer.Serialize(nameof(UserId), ref UserId);
  1188.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1189.          }
  1190. @@ -1878,9 +1887,9 @@ namespace S2Library.Protocol
  1191.          public uint UserId;
  1192.          public uint TicketId;
  1193.  
  1194. -        public override void Serialize(Serializer serializer)
  1195. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1196.          {
  1197. -            base.Serialize(serializer);
  1198. +            base.Serialize(serializer, fullHeader);
  1199.              serializer.Serialize(nameof(UserId), ref UserId);
  1200.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1201.          }
  1202. @@ -1898,9 +1907,9 @@ namespace S2Library.Protocol
  1203.          public ushort AccessIndex;
  1204.          public uint TicketId;
  1205.  
  1206. -        public override void Serialize(Serializer serializer)
  1207. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1208.          {
  1209. -            base.Serialize(serializer);
  1210. +            base.Serialize(serializer, fullHeader);
  1211.              serializer.Serialize(nameof(PermId), ref PermId);
  1212.              serializer.Serialize(nameof(AccessIndex), ref AccessIndex);
  1213.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1214. @@ -1937,9 +1946,9 @@ namespace S2Library.Protocol
  1215.          public uint TotalLogins;
  1216.          public uint TicketId;
  1217.  
  1218. -        public override void Serialize(Serializer serializer)
  1219. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1220.          {
  1221. -            base.Serialize(serializer);
  1222. +            base.Serialize(serializer, fullHeader);
  1223.              serializer.Serialize(nameof(UserId), ref UserId);
  1224.              serializer.Serialize(nameof(Name), ref Name);
  1225.              serializer.Serialize(nameof(Password), ref Password);
  1226. @@ -1985,9 +1994,9 @@ namespace S2Library.Protocol
  1227.          public byte[] Data;
  1228.          public uint TicketId;
  1229.  
  1230. -        public override void Serialize(Serializer serializer)
  1231. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1232.          {
  1233. -            base.Serialize(serializer);
  1234. +            base.Serialize(serializer, fullHeader);
  1235.              serializer.Serialize(nameof(CharId), ref CharId);
  1236.              serializer.Serialize(nameof(Name), ref Name);
  1237.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1238. @@ -2025,9 +2034,9 @@ namespace S2Library.Protocol
  1239.          public string ServerName;
  1240.          public uint TicketId;
  1241.  
  1242. -        public override void Serialize(Serializer serializer)
  1243. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1244.          {
  1245. -            base.Serialize(serializer);
  1246. +            base.Serialize(serializer, fullHeader);
  1247.              serializer.Serialize(nameof(UserId), ref UserId);
  1248.              serializer.Serialize(nameof(BuddyId), ref BuddyId);
  1249.              serializer.Serialize(nameof(Name), ref Name);
  1250. @@ -2055,9 +2064,9 @@ namespace S2Library.Protocol
  1251.          public byte Level;
  1252.          public uint TicketId;
  1253.  
  1254. -        public override void Serialize(Serializer serializer)
  1255. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1256.          {
  1257. -            base.Serialize(serializer);
  1258. +            base.Serialize(serializer, fullHeader);
  1259.              serializer.Serialize(nameof(UserId), ref UserId);
  1260.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1261.              serializer.Serialize(nameof(Name), ref Name);
  1262. @@ -2080,9 +2089,9 @@ namespace S2Library.Protocol
  1263.          public uint Access;
  1264.          public uint TicketId;
  1265.  
  1266. -        public override void Serialize(Serializer serializer)
  1267. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1268.          {
  1269. -            base.Serialize(serializer);
  1270. +            base.Serialize(serializer, fullHeader);
  1271.              serializer.Serialize(nameof(PermId), ref PermId);
  1272.              serializer.Serialize(nameof(AccessIndex), ref AccessIndex);
  1273.              serializer.Serialize(nameof(Access), ref Access);
  1274. @@ -2104,9 +2113,9 @@ namespace S2Library.Protocol
  1275.          public uint Selection;
  1276.          public uint TicketId;
  1277.  
  1278. -        public override void Serialize(Serializer serializer)
  1279. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1280.          {
  1281. -            base.Serialize(serializer);
  1282. +            base.Serialize(serializer, fullHeader);
  1283.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1284.              serializer.Serialize(nameof(Name), ref Name);
  1285.              serializer.Serialize(nameof(Selection), ref Selection);
  1286. @@ -2124,9 +2133,9 @@ namespace S2Library.Protocol
  1287.          public uint GroupId;
  1288.          public uint TicketId;
  1289.  
  1290. -        public override void Serialize(Serializer serializer)
  1291. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1292.          {
  1293. -            base.Serialize(serializer);
  1294. +            base.Serialize(serializer, fullHeader);
  1295.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1296.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1297.          }
  1298. @@ -2144,9 +2153,9 @@ namespace S2Library.Protocol
  1299.          public ushort AccessIndex;
  1300.          public uint TicketId;
  1301.  
  1302. -        public override void Serialize(Serializer serializer)
  1303. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1304.          {
  1305. -            base.Serialize(serializer);
  1306. +            base.Serialize(serializer, fullHeader);
  1307.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1308.              serializer.Serialize(nameof(AccessIndex), ref AccessIndex);
  1309.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1310. @@ -2171,9 +2180,9 @@ namespace S2Library.Protocol
  1311.          public string ServerName;
  1312.          public uint TicketId;
  1313.  
  1314. -        public override void Serialize(Serializer serializer)
  1315. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1316.          {
  1317. -            base.Serialize(serializer);
  1318. +            base.Serialize(serializer, fullHeader);
  1319.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1320.              serializer.Serialize(nameof(UserId), ref UserId);
  1321.              serializer.Serialize(nameof(Name), ref Name);
  1322. @@ -2197,9 +2206,9 @@ namespace S2Library.Protocol
  1323.          public byte Level;
  1324.          public uint TicketId;
  1325.  
  1326. -        public override void Serialize(Serializer serializer)
  1327. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1328.          {
  1329. -            base.Serialize(serializer);
  1330. +            base.Serialize(serializer, fullHeader);
  1331.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1332.              serializer.Serialize(nameof(Name), ref Name);
  1333.              serializer.Serialize(nameof(Level), ref Level);
  1334. @@ -2221,9 +2230,9 @@ namespace S2Library.Protocol
  1335.          public uint Access;
  1336.          public uint TicketId;
  1337.  
  1338. -        public override void Serialize(Serializer serializer)
  1339. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1340.          {
  1341. -            base.Serialize(serializer);
  1342. +            base.Serialize(serializer, fullHeader);
  1343.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1344.              serializer.Serialize(nameof(AccessIndex), ref AccessIndex);
  1345.              serializer.Serialize(nameof(Access), ref Access);
  1346. @@ -2249,9 +2258,9 @@ namespace S2Library.Protocol
  1347.          public uint Patchlevel;
  1348.          public uint TicketId;
  1349.  
  1350. -        public override void Serialize(Serializer serializer)
  1351. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1352.          {
  1353. -            base.Serialize(serializer);
  1354. +            base.Serialize(serializer, fullHeader);
  1355.              serializer.Serialize(nameof(Nick), ref Nick);
  1356.              serializer.Serialize(nameof(Password), ref Password);
  1357.              serializer.Serialize(nameof(CdKey), ref CdKey);
  1358. @@ -2275,9 +2284,9 @@ namespace S2Library.Protocol
  1359.          public uint Selection;
  1360.          public uint TicketId;
  1361.  
  1362. -        public override void Serialize(Serializer serializer)
  1363. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1364.          {
  1365. -            base.Serialize(serializer);
  1366. +            base.Serialize(serializer, fullHeader);
  1367.              serializer.Serialize(nameof(CharId), ref CharId);
  1368.              serializer.Serialize(nameof(Name), ref Name);
  1369.              serializer.Serialize(nameof(Selection), ref Selection);
  1370. @@ -2295,9 +2304,9 @@ namespace S2Library.Protocol
  1371.          public uint Count;
  1372.          public byte[] Data;
  1373.  
  1374. -        public override void Serialize(Serializer serializer)
  1375. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1376.          {
  1377. -            base.Serialize(serializer);
  1378. +            base.Serialize(serializer, fullHeader);
  1379.              serializer.Serialize(nameof(Count), ref Count);
  1380.              serializer.Serialize(nameof(Data), ref Data);
  1381.          }
  1382. @@ -2313,9 +2322,9 @@ namespace S2Library.Protocol
  1383.          public uint MsgType;
  1384.          public byte[] Data;
  1385.  
  1386. -        public override void Serialize(Serializer serializer)
  1387. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1388.          {
  1389. -            base.Serialize(serializer);
  1390. +            base.Serialize(serializer, fullHeader);
  1391.              serializer.Serialize(nameof(MsgType), ref MsgType);
  1392.              serializer.Serialize(nameof(Data), ref Data);
  1393.          }
  1394. @@ -2351,9 +2360,9 @@ namespace S2Library.Protocol
  1395.          public byte[] Data;
  1396.          public uint TicketId;
  1397.  
  1398. -        public override void Serialize(Serializer serializer)
  1399. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1400.          {
  1401. -            base.Serialize(serializer);
  1402. +            base.Serialize(serializer, fullHeader);
  1403.              serializer.Serialize(nameof(CharId), ref CharId);
  1404.              serializer.Serialize(nameof(Name), ref Name);
  1405.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1406. @@ -2379,9 +2388,9 @@ namespace S2Library.Protocol
  1407.          public uint CellId;
  1408.          public uint PermId;
  1409.  
  1410. -        public override void Serialize(Serializer serializer)
  1411. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1412.          {
  1413. -            base.Serialize(serializer);
  1414. +            base.Serialize(serializer, fullHeader);
  1415.              serializer.Serialize(nameof(CellId), ref CellId);
  1416.              serializer.Serialize(nameof(PermId), ref PermId);
  1417.          }
  1418. @@ -2401,9 +2410,9 @@ namespace S2Library.Protocol
  1419.          public byte[] Data;
  1420.          public uint TicketId;
  1421.  
  1422. -        public override void Serialize(Serializer serializer)
  1423. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1424.          {
  1425. -            base.Serialize(serializer);
  1426. +            base.Serialize(serializer, fullHeader);
  1427.              serializer.Serialize(nameof(Name), ref Name);
  1428.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1429.              serializer.Serialize(nameof(Data), ref Data);
  1430. @@ -2427,9 +2436,9 @@ namespace S2Library.Protocol
  1431.          public uint Selection;
  1432.          public uint TicketId;
  1433.  
  1434. -        public override void Serialize(Serializer serializer)
  1435. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1436.          {
  1437. -            base.Serialize(serializer);
  1438. +            base.Serialize(serializer, fullHeader);
  1439.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1440.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1441.              serializer.Serialize(nameof(Name), ref Name);
  1442. @@ -2452,9 +2461,9 @@ namespace S2Library.Protocol
  1443.          public byte[] Data;
  1444.          public uint TicketId;
  1445.  
  1446. -        public override void Serialize(Serializer serializer)
  1447. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1448.          {
  1449. -            base.Serialize(serializer);
  1450. +            base.Serialize(serializer, fullHeader);
  1451.              serializer.Serialize(nameof(Name), ref Name);
  1452.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1453.              serializer.Serialize(nameof(Data), ref Data);
  1454. @@ -2472,9 +2481,9 @@ namespace S2Library.Protocol
  1455.          public uint GuildId;
  1456.          public uint TicketId;
  1457.  
  1458. -        public override void Serialize(Serializer serializer)
  1459. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1460.          {
  1461. -            base.Serialize(serializer);
  1462. +            base.Serialize(serializer, fullHeader);
  1463.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1464.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1465.          }
  1466. @@ -2498,9 +2507,9 @@ namespace S2Library.Protocol
  1467.          public byte[] Data;
  1468.          public uint TicketId;
  1469.  
  1470. -        public override void Serialize(Serializer serializer)
  1471. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1472.          {
  1473. -            base.Serialize(serializer);
  1474. +            base.Serialize(serializer, fullHeader);
  1475.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1476.              serializer.Serialize(nameof(Name), ref Name);
  1477.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1478. @@ -2534,9 +2543,9 @@ namespace S2Library.Protocol
  1479.          public byte GuildRole;
  1480.          public uint TicketId;
  1481.  
  1482. -        public override void Serialize(Serializer serializer)
  1483. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1484.          {
  1485. -            base.Serialize(serializer);
  1486. +            base.Serialize(serializer, fullHeader);
  1487.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1488.              serializer.Serialize(nameof(PermId), ref PermId);
  1489.              serializer.Serialize(nameof(Name), ref Name);
  1490. @@ -2569,9 +2578,9 @@ namespace S2Library.Protocol
  1491.          public byte[] Data;
  1492.          public uint TicketId;
  1493.  
  1494. -        public override void Serialize(Serializer serializer)
  1495. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1496.          {
  1497. -            base.Serialize(serializer);
  1498. +            base.Serialize(serializer, fullHeader);
  1499.              serializer.Serialize(nameof(Name), ref Name);
  1500.              serializer.Serialize(nameof(Cipher), ref Cipher);
  1501.              serializer.Serialize(nameof(Mail), ref Mail);
  1502. @@ -2594,9 +2603,9 @@ namespace S2Library.Protocol
  1503.          public byte Level;
  1504.          public uint TicketId;
  1505.  
  1506. -        public override void Serialize(Serializer serializer)
  1507. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1508.          {
  1509. -            base.Serialize(serializer);
  1510. +            base.Serialize(serializer, fullHeader);
  1511.              serializer.Serialize(nameof(Name), ref Name);
  1512.              serializer.Serialize(nameof(Level), ref Level);
  1513.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1514. @@ -2617,9 +2626,9 @@ namespace S2Library.Protocol
  1515.          public byte[] Data;
  1516.          public uint TicketId;
  1517.  
  1518. -        public override void Serialize(Serializer serializer)
  1519. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1520.          {
  1521. -            base.Serialize(serializer);
  1522. +            base.Serialize(serializer, fullHeader);
  1523.              serializer.Serialize(nameof(Name), ref Name);
  1524.              serializer.Serialize(nameof(UserId), ref UserId);
  1525.              serializer.Serialize(nameof(Data), ref Data);
  1526. @@ -2641,9 +2650,9 @@ namespace S2Library.Protocol
  1527.          public byte[] Data;
  1528.          public uint TicketId;
  1529.  
  1530. -        public override void Serialize(Serializer serializer)
  1531. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1532.          {
  1533. -            base.Serialize(serializer);
  1534. +            base.Serialize(serializer, fullHeader);
  1535.              serializer.Serialize(nameof(Name), ref Name);
  1536.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1537.              serializer.Serialize(nameof(Data), ref Data);
  1538. @@ -2675,9 +2684,9 @@ namespace S2Library.Protocol
  1539.          public uint PropertyMask;
  1540.          public uint TicketId;
  1541.  
  1542. -        public override void Serialize(Serializer serializer)
  1543. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1544.          {
  1545. -            base.Serialize(serializer);
  1546. +            base.Serialize(serializer, fullHeader);
  1547.              serializer.Serialize(nameof(UserId), ref UserId);
  1548.              serializer.Serialize(nameof(Name), ref Name);
  1549.              serializer.Serialize(nameof(Cipher), ref Cipher);
  1550. @@ -2706,9 +2715,9 @@ namespace S2Library.Protocol
  1551.          public byte Level;
  1552.          public uint TicketId;
  1553.  
  1554. -        public override void Serialize(Serializer serializer)
  1555. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1556.          {
  1557. -            base.Serialize(serializer);
  1558. +            base.Serialize(serializer, fullHeader);
  1559.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1560.              serializer.Serialize(nameof(PropertyMask), ref PropertyMask);
  1561.              serializer.Serialize(nameof(Name), ref Name);
  1562. @@ -2733,9 +2742,9 @@ namespace S2Library.Protocol
  1563.          public uint PropertyMask;
  1564.          public uint TicketId;
  1565.  
  1566. -        public override void Serialize(Serializer serializer)
  1567. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1568.          {
  1569. -            base.Serialize(serializer);
  1570. +            base.Serialize(serializer, fullHeader);
  1571.              serializer.Serialize(nameof(CharId), ref CharId);
  1572.              serializer.Serialize(nameof(Name), ref Name);
  1573.              serializer.Serialize(nameof(Data), ref Data);
  1574. @@ -2762,9 +2771,9 @@ namespace S2Library.Protocol
  1575.          public uint PropertyMask;
  1576.          public uint TicketId;
  1577.  
  1578. -        public override void Serialize(Serializer serializer)
  1579. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1580.          {
  1581. -            base.Serialize(serializer);
  1582. +            base.Serialize(serializer, fullHeader);
  1583.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1584.              serializer.Serialize(nameof(Name), ref Name);
  1585.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  1586. @@ -2784,9 +2793,9 @@ namespace S2Library.Protocol
  1587.          public uint UserId;
  1588.          public uint TicketId;
  1589.  
  1590. -        public override void Serialize(Serializer serializer)
  1591. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1592.          {
  1593. -            base.Serialize(serializer);
  1594. +            base.Serialize(serializer, fullHeader);
  1595.              serializer.Serialize(nameof(UserId), ref UserId);
  1596.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1597.          }
  1598. @@ -2802,9 +2811,9 @@ namespace S2Library.Protocol
  1599.          public uint GroupId;
  1600.          public uint TicketId;
  1601.  
  1602. -        public override void Serialize(Serializer serializer)
  1603. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1604.          {
  1605. -            base.Serialize(serializer);
  1606. +            base.Serialize(serializer, fullHeader);
  1607.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1608.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1609.          }
  1610. @@ -2820,9 +2829,9 @@ namespace S2Library.Protocol
  1611.          public uint CharId;
  1612.          public uint TicketId;
  1613.  
  1614. -        public override void Serialize(Serializer serializer)
  1615. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1616.          {
  1617. -            base.Serialize(serializer);
  1618. +            base.Serialize(serializer, fullHeader);
  1619.              serializer.Serialize(nameof(CharId), ref CharId);
  1620.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1621.          }
  1622. @@ -2838,9 +2847,9 @@ namespace S2Library.Protocol
  1623.          public uint GuildId;
  1624.          public uint TicketId;
  1625.  
  1626. -        public override void Serialize(Serializer serializer)
  1627. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1628.          {
  1629. -            base.Serialize(serializer);
  1630. +            base.Serialize(serializer, fullHeader);
  1631.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1632.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1633.          }
  1634. @@ -2860,9 +2869,9 @@ namespace S2Library.Protocol
  1635.          public ushort Keypool;
  1636.          public uint TicketId;
  1637.  
  1638. -        public override void Serialize(Serializer serializer)
  1639. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1640.          {
  1641. -            base.Serialize(serializer);
  1642. +            base.Serialize(serializer, fullHeader);
  1643.              serializer.Serialize(nameof(UserId), ref UserId);
  1644.              serializer.Serialize(nameof(CdKey), ref CdKey);
  1645.              serializer.Serialize(nameof(Keypool), ref Keypool);
  1646. @@ -2884,9 +2893,9 @@ namespace S2Library.Protocol
  1647.          public ushort Keypool;
  1648.          public uint TicketId;
  1649.  
  1650. -        public override void Serialize(Serializer serializer)
  1651. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1652.          {
  1653. -            base.Serialize(serializer);
  1654. +            base.Serialize(serializer, fullHeader);
  1655.              serializer.Serialize(nameof(UserId), ref UserId);
  1656.              serializer.Serialize(nameof(CdKey), ref CdKey);
  1657.              serializer.Serialize(nameof(Keypool), ref Keypool);
  1658. @@ -2906,9 +2915,9 @@ namespace S2Library.Protocol
  1659.          public uint BuddyId;
  1660.          public uint TicketId;
  1661.  
  1662. -        public override void Serialize(Serializer serializer)
  1663. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1664.          {
  1665. -            base.Serialize(serializer);
  1666. +            base.Serialize(serializer, fullHeader);
  1667.              serializer.Serialize(nameof(UserId), ref UserId);
  1668.              serializer.Serialize(nameof(BuddyId), ref BuddyId);
  1669.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1670. @@ -2927,9 +2936,9 @@ namespace S2Library.Protocol
  1671.          public uint BuddyId;
  1672.          public uint TicketId;
  1673.  
  1674. -        public override void Serialize(Serializer serializer)
  1675. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1676.          {
  1677. -            base.Serialize(serializer);
  1678. +            base.Serialize(serializer, fullHeader);
  1679.              serializer.Serialize(nameof(UserId), ref UserId);
  1680.              serializer.Serialize(nameof(BuddyId), ref BuddyId);
  1681.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1682. @@ -2948,9 +2957,9 @@ namespace S2Library.Protocol
  1683.          public uint UserId;
  1684.          public uint TicketId;
  1685.  
  1686. -        public override void Serialize(Serializer serializer)
  1687. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1688.          {
  1689. -            base.Serialize(serializer);
  1690. +            base.Serialize(serializer, fullHeader);
  1691.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1692.              serializer.Serialize(nameof(UserId), ref UserId);
  1693.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1694. @@ -2969,9 +2978,9 @@ namespace S2Library.Protocol
  1695.          public uint UserId;
  1696.          public uint TicketId;
  1697.  
  1698. -        public override void Serialize(Serializer serializer)
  1699. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1700.          {
  1701. -            base.Serialize(serializer);
  1702. +            base.Serialize(serializer, fullHeader);
  1703.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1704.              serializer.Serialize(nameof(UserId), ref UserId);
  1705.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1706. @@ -2990,9 +2999,9 @@ namespace S2Library.Protocol
  1707.          public uint GuildId;
  1708.          public uint TicketId;
  1709.  
  1710. -        public override void Serialize(Serializer serializer)
  1711. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1712.          {
  1713. -            base.Serialize(serializer);
  1714. +            base.Serialize(serializer, fullHeader);
  1715.              serializer.Serialize(nameof(PermId), ref PermId);
  1716.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1717.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1718. @@ -3011,9 +3020,9 @@ namespace S2Library.Protocol
  1719.          public uint GuildId;
  1720.          public uint TicketId;
  1721.  
  1722. -        public override void Serialize(Serializer serializer)
  1723. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1724.          {
  1725. -            base.Serialize(serializer);
  1726. +            base.Serialize(serializer, fullHeader);
  1727.              serializer.Serialize(nameof(PermId), ref PermId);
  1728.              serializer.Serialize(nameof(GuildId), ref GuildId);
  1729.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1730. @@ -3034,9 +3043,9 @@ namespace S2Library.Protocol
  1731.          public uint Access;
  1732.          public uint TicketId;
  1733.  
  1734. -        public override void Serialize(Serializer serializer)
  1735. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1736.          {
  1737. -            base.Serialize(serializer);
  1738. +            base.Serialize(serializer, fullHeader);
  1739.              serializer.Serialize(nameof(GroupId), ref GroupId);
  1740.              serializer.Serialize(nameof(AccessIndex), ref AccessIndex);
  1741.              serializer.Serialize(nameof(Access), ref Access);
  1742. @@ -3052,9 +3061,9 @@ namespace S2Library.Protocol
  1743.      {
  1744.          public uint TicketId;
  1745.  
  1746. -        public override void Serialize(Serializer serializer)
  1747. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1748.          {
  1749. -            base.Serialize(serializer);
  1750. +            base.Serialize(serializer, fullHeader);
  1751.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1752.          }
  1753.      }
  1754. @@ -3069,9 +3078,9 @@ namespace S2Library.Protocol
  1755.          public string Txt;
  1756.          public uint TicketId;
  1757.  
  1758. -        public override void Serialize(Serializer serializer)
  1759. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1760.          {
  1761. -            base.Serialize(serializer);
  1762. +            base.Serialize(serializer, fullHeader);
  1763.              serializer.Serialize(nameof(Txt), ref Txt);
  1764.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1765.          }
  1766. @@ -3085,9 +3094,9 @@ namespace S2Library.Protocol
  1767.      {
  1768.          public uint TicketId;
  1769.  
  1770. -        public override void Serialize(Serializer serializer)
  1771. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1772.          {
  1773. -            base.Serialize(serializer);
  1774. +            base.Serialize(serializer, fullHeader);
  1775.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1776.          }
  1777.      }
  1778. @@ -3100,9 +3109,9 @@ namespace S2Library.Protocol
  1779.      {
  1780.          public uint TicketId;
  1781.  
  1782. -        public override void Serialize(Serializer serializer)
  1783. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1784.          {
  1785. -            base.Serialize(serializer);
  1786. +            base.Serialize(serializer, fullHeader);
  1787.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1788.          }
  1789.      }
  1790. @@ -3117,9 +3126,9 @@ namespace S2Library.Protocol
  1791.          public uint UserId;
  1792.          public string Name;
  1793.  
  1794. -        public override void Serialize(Serializer serializer)
  1795. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1796.          {
  1797. -            base.Serialize(serializer);
  1798. +            base.Serialize(serializer, fullHeader);
  1799.              serializer.Serialize(nameof(UserId), ref UserId);
  1800.              serializer.Serialize(nameof(Name), ref Name);
  1801.          }
  1802. @@ -3133,9 +3142,9 @@ namespace S2Library.Protocol
  1803.      {
  1804.          public uint UserId;
  1805.  
  1806. -        public override void Serialize(Serializer serializer)
  1807. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1808.          {
  1809. -            base.Serialize(serializer);
  1810. +            base.Serialize(serializer, fullHeader);
  1811.              serializer.Serialize(nameof(UserId), ref UserId);
  1812.          }
  1813.      }
  1814. @@ -3148,9 +3157,9 @@ namespace S2Library.Protocol
  1815.      {
  1816.          public uint TicketId;
  1817.  
  1818. -        public override void Serialize(Serializer serializer)
  1819. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1820.          {
  1821. -            base.Serialize(serializer);
  1822. +            base.Serialize(serializer, fullHeader);
  1823.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1824.          }
  1825.      }
  1826. @@ -3163,9 +3172,9 @@ namespace S2Library.Protocol
  1827.      {
  1828.          public uint TicketId;
  1829.  
  1830. -        public override void Serialize(Serializer serializer)
  1831. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1832.          {
  1833. -            base.Serialize(serializer);
  1834. +            base.Serialize(serializer, fullHeader);
  1835.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1836.          }
  1837.      }
  1838. @@ -3178,9 +3187,9 @@ namespace S2Library.Protocol
  1839.      {
  1840.          public uint TicketId;
  1841.  
  1842. -        public override void Serialize(Serializer serializer)
  1843. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1844.          {
  1845. -            base.Serialize(serializer);
  1846. +            base.Serialize(serializer, fullHeader);
  1847.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1848.          }
  1849.      }
  1850. @@ -3193,9 +3202,9 @@ namespace S2Library.Protocol
  1851.      {
  1852.          public uint TicketId;
  1853.  
  1854. -        public override void Serialize(Serializer serializer)
  1855. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1856.          {
  1857. -            base.Serialize(serializer);
  1858. +            base.Serialize(serializer, fullHeader);
  1859.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1860.          }
  1861.      }
  1862. @@ -3210,9 +3219,9 @@ namespace S2Library.Protocol
  1863.          public bool SendAll;
  1864.          public uint TicketId;
  1865.  
  1866. -        public override void Serialize(Serializer serializer)
  1867. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1868.          {
  1869. -            base.Serialize(serializer);
  1870. +            base.Serialize(serializer, fullHeader);
  1871.              serializer.Serialize(nameof(SendAll), ref SendAll);
  1872.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1873.          }
  1874. @@ -3226,9 +3235,9 @@ namespace S2Library.Protocol
  1875.      {
  1876.          public uint TicketId;
  1877.  
  1878. -        public override void Serialize(Serializer serializer)
  1879. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1880.          {
  1881. -            base.Serialize(serializer);
  1882. +            base.Serialize(serializer, fullHeader);
  1883.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1884.          }
  1885.      }
  1886. @@ -3241,9 +3250,9 @@ namespace S2Library.Protocol
  1887.      {
  1888.          public uint TicketId;
  1889.  
  1890. -        public override void Serialize(Serializer serializer)
  1891. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1892.          {
  1893. -            base.Serialize(serializer);
  1894. +            base.Serialize(serializer, fullHeader);
  1895.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1896.          }
  1897.      }
  1898. @@ -3256,9 +3265,9 @@ namespace S2Library.Protocol
  1899.      {
  1900.          public uint TicketId;
  1901.  
  1902. -        public override void Serialize(Serializer serializer)
  1903. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1904.          {
  1905. -            base.Serialize(serializer);
  1906. +            base.Serialize(serializer, fullHeader);
  1907.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1908.          }
  1909.      }
  1910. @@ -3275,9 +3284,9 @@ namespace S2Library.Protocol
  1911.          public ushort Keypool;
  1912.          public uint TicketId;
  1913.  
  1914. -        public override void Serialize(Serializer serializer)
  1915. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1916.          {
  1917. -            base.Serialize(serializer);
  1918. +            base.Serialize(serializer, fullHeader);
  1919.              serializer.Serialize(nameof(CdKey), ref CdKey);
  1920.              serializer.Serialize(nameof(Keypool), ref Keypool);
  1921.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1922. @@ -3300,9 +3309,9 @@ namespace S2Library.Protocol
  1923.          public uint UserId;
  1924.          public uint TicketId;
  1925.  
  1926. -        public override void Serialize(Serializer serializer)
  1927. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1928.          {
  1929. -            base.Serialize(serializer);
  1930. +            base.Serialize(serializer, fullHeader);
  1931.              serializer.Serialize(nameof(CdKey), ref CdKey);
  1932.              serializer.Serialize(nameof(Keypool), ref Keypool);
  1933.              serializer.Serialize(nameof(Banned), ref Banned);
  1934. @@ -3325,9 +3334,9 @@ namespace S2Library.Protocol
  1935.          public uint Selection;
  1936.          public uint TicketId;
  1937.  
  1938. -        public override void Serialize(Serializer serializer)
  1939. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1940.          {
  1941. -            base.Serialize(serializer);
  1942. +            base.Serialize(serializer, fullHeader);
  1943.              serializer.Serialize(nameof(MachineId), ref MachineId);
  1944.              serializer.Serialize(nameof(Ip), ref Ip);
  1945.              serializer.Serialize(nameof(Selection), ref Selection);
  1946. @@ -3351,9 +3360,9 @@ namespace S2Library.Protocol
  1947.          public bool Active;
  1948.          public uint TicketId;
  1949.  
  1950. -        public override void Serialize(Serializer serializer)
  1951. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1952.          {
  1953. -            base.Serialize(serializer);
  1954. +            base.Serialize(serializer, fullHeader);
  1955.              serializer.Serialize(nameof(MachineId), ref MachineId);
  1956.              serializer.Serialize(nameof(Description), ref Description);
  1957.              serializer.Serialize(nameof(Ip), ref Ip);
  1958. @@ -3372,9 +3381,9 @@ namespace S2Library.Protocol
  1959.          public uint UserId;
  1960.          public uint TicketId;
  1961.  
  1962. -        public override void Serialize(Serializer serializer)
  1963. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1964.          {
  1965. -            base.Serialize(serializer);
  1966. +            base.Serialize(serializer, fullHeader);
  1967.              serializer.Serialize(nameof(UserId), ref UserId);
  1968.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1969.          }
  1970. @@ -3392,9 +3401,9 @@ namespace S2Library.Protocol
  1971.          public uint MachineId;
  1972.          public uint TicketId;
  1973.  
  1974. -        public override void Serialize(Serializer serializer)
  1975. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1976.          {
  1977. -            base.Serialize(serializer);
  1978. +            base.Serialize(serializer, fullHeader);
  1979.              serializer.Serialize(nameof(PermId), ref PermId);
  1980.              serializer.Serialize(nameof(MachineId), ref MachineId);
  1981.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1982. @@ -3411,9 +3420,9 @@ namespace S2Library.Protocol
  1983.          public uint UserId;
  1984.          public uint TicketId;
  1985.  
  1986. -        public override void Serialize(Serializer serializer)
  1987. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  1988.          {
  1989. -            base.Serialize(serializer);
  1990. +            base.Serialize(serializer, fullHeader);
  1991.              serializer.Serialize(nameof(UserId), ref UserId);
  1992.              serializer.Serialize(nameof(TicketId), ref TicketId);
  1993.          }
  1994. @@ -3429,9 +3438,9 @@ namespace S2Library.Protocol
  1995.          public uint CharId;
  1996.          public uint TicketId;
  1997.  
  1998. -        public override void Serialize(Serializer serializer)
  1999. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2000.          {
  2001. -            base.Serialize(serializer);
  2002. +            base.Serialize(serializer, fullHeader);
  2003.              serializer.Serialize(nameof(CharId), ref CharId);
  2004.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2005.          }
  2006. @@ -3447,9 +3456,9 @@ namespace S2Library.Protocol
  2007.          public uint CharId;
  2008.          public uint TicketId;
  2009.  
  2010. -        public override void Serialize(Serializer serializer)
  2011. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2012.          {
  2013. -            base.Serialize(serializer);
  2014. +            base.Serialize(serializer, fullHeader);
  2015.              serializer.Serialize(nameof(CharId), ref CharId);
  2016.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2017.          }
  2018. @@ -3469,9 +3478,9 @@ namespace S2Library.Protocol
  2019.          public string Filename;
  2020.          public uint TicketId;
  2021.  
  2022. -        public override void Serialize(Serializer serializer)
  2023. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2024.          {
  2025. -            base.Serialize(serializer);
  2026. +            base.Serialize(serializer, fullHeader);
  2027.              serializer.Serialize(nameof(UserId), ref UserId);
  2028.              serializer.Serialize(nameof(RestoreChars), ref RestoreChars);
  2029.              serializer.Serialize(nameof(Filename), ref Filename);
  2030. @@ -3491,9 +3500,9 @@ namespace S2Library.Protocol
  2031.          public string Filename;
  2032.          public uint TicketId;
  2033.  
  2034. -        public override void Serialize(Serializer serializer)
  2035. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2036.          {
  2037. -            base.Serialize(serializer);
  2038. +            base.Serialize(serializer, fullHeader);
  2039.              serializer.Serialize(nameof(CharId), ref CharId);
  2040.              serializer.Serialize(nameof(Filename), ref Filename);
  2041.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2042. @@ -3514,9 +3523,9 @@ namespace S2Library.Protocol
  2043.          public uint Port;
  2044.          public uint TicketId;
  2045.  
  2046. -        public override void Serialize(Serializer serializer)
  2047. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2048.          {
  2049. -            base.Serialize(serializer);
  2050. +            base.Serialize(serializer, fullHeader);
  2051.              serializer.Serialize(nameof(PermId), ref PermId);
  2052.              serializer.Serialize(nameof(Ip), ref Ip);
  2053.              serializer.Serialize(nameof(Port), ref Port);
  2054. @@ -3534,9 +3543,9 @@ namespace S2Library.Protocol
  2055.          public uint PermId;
  2056.          public uint TicketId;
  2057.  
  2058. -        public override void Serialize(Serializer serializer)
  2059. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2060.          {
  2061. -            base.Serialize(serializer);
  2062. +            base.Serialize(serializer, fullHeader);
  2063.              serializer.Serialize(nameof(PermId), ref PermId);
  2064.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2065.          }
  2066. @@ -3554,9 +3563,9 @@ namespace S2Library.Protocol
  2067.          public ushort Keypool;
  2068.          public uint TicketId;
  2069.  
  2070. -        public override void Serialize(Serializer serializer)
  2071. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2072.          {
  2073. -            base.Serialize(serializer);
  2074. +            base.Serialize(serializer, fullHeader);
  2075.              serializer.Serialize(nameof(CdKey), ref CdKey);
  2076.              serializer.Serialize(nameof(Keypool), ref Keypool);
  2077.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2078. @@ -3575,9 +3584,9 @@ namespace S2Library.Protocol
  2079.          public ushort Keypool;
  2080.          public uint TicketId;
  2081.  
  2082. -        public override void Serialize(Serializer serializer)
  2083. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2084.          {
  2085. -            base.Serialize(serializer);
  2086. +            base.Serialize(serializer, fullHeader);
  2087.              serializer.Serialize(nameof(CdKey), ref CdKey);
  2088.              serializer.Serialize(nameof(Keypool), ref Keypool);
  2089.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2090. @@ -3596,9 +3605,9 @@ namespace S2Library.Protocol
  2091.          public ushort Keypool;
  2092.          public uint TicketId;
  2093.  
  2094. -        public override void Serialize(Serializer serializer)
  2095. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2096.          {
  2097. -            base.Serialize(serializer);
  2098. +            base.Serialize(serializer, fullHeader);
  2099.              serializer.Serialize(nameof(CdKey), ref CdKey);
  2100.              serializer.Serialize(nameof(Keypool), ref Keypool);
  2101.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2102. @@ -3617,9 +3626,9 @@ namespace S2Library.Protocol
  2103.          public ushort Keypool;
  2104.          public uint TicketId;
  2105.  
  2106. -        public override void Serialize(Serializer serializer)
  2107. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2108.          {
  2109. -            base.Serialize(serializer);
  2110. +            base.Serialize(serializer, fullHeader);
  2111.              serializer.Serialize(nameof(CdKey), ref CdKey);
  2112.              serializer.Serialize(nameof(Keypool), ref Keypool);
  2113.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2114. @@ -3638,9 +3647,9 @@ namespace S2Library.Protocol
  2115.          public string Name;
  2116.          public uint TicketId;
  2117.  
  2118. -        public override void Serialize(Serializer serializer)
  2119. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2120.          {
  2121. -            base.Serialize(serializer);
  2122. +            base.Serialize(serializer, fullHeader);
  2123.              serializer.Serialize(nameof(PermId), ref PermId);
  2124.              serializer.Serialize(nameof(Name), ref Name);
  2125.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2126. @@ -3661,9 +3670,9 @@ namespace S2Library.Protocol
  2127.          public ushort PermIdType;
  2128.          public uint TicketId;
  2129.  
  2130. -        public override void Serialize(Serializer serializer)
  2131. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2132.          {
  2133. -            base.Serialize(serializer);
  2134. +            base.Serialize(serializer, fullHeader);
  2135.              serializer.Serialize(nameof(PermId), ref PermId);
  2136.              serializer.Serialize(nameof(Name), ref Name);
  2137.              serializer.Serialize(nameof(PermIdType), ref PermIdType);
  2138. @@ -3676,14 +3685,14 @@ namespace S2Library.Protocol
  2139.  //    (**(code**)(* piVar1 + 8))("perm_id",8);
  2140.  //    (**(code**)(* piVar1 + 8))("ticket_id",8);
  2141.  //    (**(code**)(* unaff_EDI + 4))(0x92,piVar1);
  2142. -    public class Payload146 : PayloadPrefix
  2143. +    public class PlayerJoinedServer : PayloadPrefix // Payload146
  2144.      {
  2145.          public uint PermId;
  2146.          public uint TicketId;
  2147.  
  2148. -        public override void Serialize(Serializer serializer)
  2149. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2150.          {
  2151. -            base.Serialize(serializer);
  2152. +            base.Serialize(serializer, fullHeader);
  2153.              serializer.Serialize(nameof(PermId), ref PermId);
  2154.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2155.          }
  2156. @@ -3701,9 +3710,9 @@ namespace S2Library.Protocol
  2157.          public uint Selection;
  2158.          public uint TicketId;
  2159.  
  2160. -        public override void Serialize(Serializer serializer)
  2161. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2162.          {
  2163. -            base.Serialize(serializer);
  2164. +            base.Serialize(serializer, fullHeader);
  2165.              serializer.Serialize(nameof(DeliveryTarget), ref DeliveryTarget);
  2166.              serializer.Serialize(nameof(Selection), ref Selection);
  2167.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2168. @@ -3722,9 +3731,9 @@ namespace S2Library.Protocol
  2169.          public byte Status;
  2170.          public uint TicketId;
  2171.  
  2172. -        public override void Serialize(Serializer serializer)
  2173. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2174.          {
  2175. -            base.Serialize(serializer);
  2176. +            base.Serialize(serializer, fullHeader);
  2177.              serializer.Serialize(nameof(MessageId), ref MessageId);
  2178.              serializer.Serialize(nameof(Status), ref Status);
  2179.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2180. @@ -3755,9 +3764,9 @@ namespace S2Library.Protocol
  2181.          public byte[] Data;
  2182.          public uint TicketId;
  2183.  
  2184. -        public override void Serialize(Serializer serializer)
  2185. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2186.          {
  2187. -            base.Serialize(serializer);
  2188. +            base.Serialize(serializer, fullHeader);
  2189.              serializer.Serialize(nameof(DeliveryTarget), ref DeliveryTarget);
  2190.              serializer.Serialize(nameof(MessageId), ref MessageId);
  2191.              serializer.Serialize(nameof(Creator), ref Creator);
  2192. @@ -3790,9 +3799,9 @@ namespace S2Library.Protocol
  2193.          public byte[] Data;
  2194.          public uint TicketId;
  2195.  
  2196. -        public override void Serialize(Serializer serializer)
  2197. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2198.          {
  2199. -            base.Serialize(serializer);
  2200. +            base.Serialize(serializer, fullHeader);
  2201.              serializer.Serialize(nameof(DeliveryTarget), ref DeliveryTarget);
  2202.              serializer.Serialize(nameof(Creator), ref Creator);
  2203.              serializer.Serialize(nameof(CreationTime), ref CreationTime);
  2204. @@ -3813,9 +3822,9 @@ namespace S2Library.Protocol
  2205.          public uint MessageId;
  2206.          public uint TicketId;
  2207.  
  2208. -        public override void Serialize(Serializer serializer)
  2209. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2210.          {
  2211. -            base.Serialize(serializer);
  2212. +            base.Serialize(serializer, fullHeader);
  2213.              serializer.Serialize(nameof(MessageId), ref MessageId);
  2214.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2215.          }
  2216. @@ -3835,9 +3844,9 @@ namespace S2Library.Protocol
  2217.          public byte GuildRole;
  2218.          public uint TicketId;
  2219.  
  2220. -        public override void Serialize(Serializer serializer)
  2221. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2222.          {
  2223. -            base.Serialize(serializer);
  2224. +            base.Serialize(serializer, fullHeader);
  2225.              serializer.Serialize(nameof(PermId), ref PermId);
  2226.              serializer.Serialize(nameof(GuildId), ref GuildId);
  2227.              serializer.Serialize(nameof(GuildRole), ref GuildRole);
  2228. @@ -3859,9 +3868,9 @@ namespace S2Library.Protocol
  2229.          public uint Id;
  2230.          public uint TicketId;
  2231.  
  2232. -        public override void Serialize(Serializer serializer)
  2233. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2234.          {
  2235. -            base.Serialize(serializer);
  2236. +            base.Serialize(serializer, fullHeader);
  2237.              serializer.Serialize(nameof(Errorcode), ref Errorcode);
  2238.              serializer.Serialize(nameof(Errormsg), ref Errormsg);
  2239.              serializer.Serialize(nameof(Id), ref Id);
  2240. @@ -3881,9 +3890,9 @@ namespace S2Library.Protocol
  2241.          public uint IgnoreId;
  2242.          public uint TicketId;
  2243.  
  2244. -        public override void Serialize(Serializer serializer)
  2245. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2246.          {
  2247. -            base.Serialize(serializer);
  2248. +            base.Serialize(serializer, fullHeader);
  2249.              serializer.Serialize(nameof(UserId), ref UserId);
  2250.              serializer.Serialize(nameof(IgnoreId), ref IgnoreId);
  2251.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2252. @@ -3902,9 +3911,9 @@ namespace S2Library.Protocol
  2253.          public uint IgnoreId;
  2254.          public uint TicketId;
  2255.  
  2256. -        public override void Serialize(Serializer serializer)
  2257. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2258.          {
  2259. -            base.Serialize(serializer);
  2260. +            base.Serialize(serializer, fullHeader);
  2261.              serializer.Serialize(nameof(UserId), ref UserId);
  2262.              serializer.Serialize(nameof(IgnoreId), ref IgnoreId);
  2263.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2264. @@ -3921,9 +3930,9 @@ namespace S2Library.Protocol
  2265.          public uint UserId;
  2266.          public uint TicketId;
  2267.  
  2268. -        public override void Serialize(Serializer serializer)
  2269. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2270.          {
  2271. -            base.Serialize(serializer);
  2272. +            base.Serialize(serializer, fullHeader);
  2273.              serializer.Serialize(nameof(UserId), ref UserId);
  2274.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2275.          }
  2276. @@ -3939,9 +3948,9 @@ namespace S2Library.Protocol
  2277.          public uint UserId;
  2278.          public uint TicketId;
  2279.  
  2280. -        public override void Serialize(Serializer serializer)
  2281. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2282.          {
  2283. -            base.Serialize(serializer);
  2284. +            base.Serialize(serializer, fullHeader);
  2285.              serializer.Serialize(nameof(UserId), ref UserId);
  2286.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2287.          }
  2288. @@ -3957,9 +3966,9 @@ namespace S2Library.Protocol
  2289.          public uint UserId;
  2290.          public uint TicketId;
  2291.  
  2292. -        public override void Serialize(Serializer serializer)
  2293. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2294.          {
  2295. -            base.Serialize(serializer);
  2296. +            base.Serialize(serializer, fullHeader);
  2297.              serializer.Serialize(nameof(UserId), ref UserId);
  2298.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2299.          }
  2300. @@ -3979,9 +3988,9 @@ namespace S2Library.Protocol
  2301.          public ushort Keypool;
  2302.          public uint TicketId;
  2303.  
  2304. -        public override void Serialize(Serializer serializer)
  2305. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2306.          {
  2307. -            base.Serialize(serializer);
  2308. +            base.Serialize(serializer, fullHeader);
  2309.              serializer.Serialize(nameof(UserId), ref UserId);
  2310.              serializer.Serialize(nameof(CdKey), ref CdKey);
  2311.              serializer.Serialize(nameof(Keypool), ref Keypool);
  2312. @@ -4011,9 +4020,9 @@ namespace S2Library.Protocol
  2313.          public string ServerName;
  2314.          public uint TicketId;
  2315.  
  2316. -        public override void Serialize(Serializer serializer)
  2317. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2318.          {
  2319. -            base.Serialize(serializer);
  2320. +            base.Serialize(serializer, fullHeader);
  2321.              serializer.Serialize(nameof(UserId), ref UserId);
  2322.              serializer.Serialize(nameof(IgnoreId), ref IgnoreId);
  2323.              serializer.Serialize(nameof(Name), ref Name);
  2324. @@ -4037,9 +4046,9 @@ namespace S2Library.Protocol
  2325.          public int Index;
  2326.          public uint TicketId;
  2327.  
  2328. -        public override void Serialize(Serializer serializer)
  2329. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2330.          {
  2331. -            base.Serialize(serializer);
  2332. +            base.Serialize(serializer, fullHeader);
  2333.              serializer.Serialize(nameof(Kategory), ref Kategory);
  2334.              serializer.Serialize(nameof(Index), ref Index);
  2335.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2336. @@ -4060,9 +4069,9 @@ namespace S2Library.Protocol
  2337.          public int Value;
  2338.          public uint TicketId;
  2339.  
  2340. -        public override void Serialize(Serializer serializer)
  2341. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2342.          {
  2343. -            base.Serialize(serializer);
  2344. +            base.Serialize(serializer, fullHeader);
  2345.              serializer.Serialize(nameof(Kategory), ref Kategory);
  2346.              serializer.Serialize(nameof(Index), ref Index);
  2347.              serializer.Serialize(nameof(Value), ref Value);
  2348. @@ -4084,9 +4093,9 @@ namespace S2Library.Protocol
  2349.          public int Value;
  2350.          public uint TicketId;
  2351.  
  2352. -        public override void Serialize(Serializer serializer)
  2353. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2354.          {
  2355. -            base.Serialize(serializer);
  2356. +            base.Serialize(serializer, fullHeader);
  2357.              serializer.Serialize(nameof(Kategory), ref Kategory);
  2358.              serializer.Serialize(nameof(Index), ref Index);
  2359.              serializer.Serialize(nameof(Value), ref Value);
  2360. @@ -4108,9 +4117,9 @@ namespace S2Library.Protocol
  2361.          public int Value;
  2362.          public uint TicketId;
  2363.  
  2364. -        public override void Serialize(Serializer serializer)
  2365. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2366.          {
  2367. -            base.Serialize(serializer);
  2368. +            base.Serialize(serializer, fullHeader);
  2369.              serializer.Serialize(nameof(Kategory), ref Kategory);
  2370.              serializer.Serialize(nameof(Index), ref Index);
  2371.              serializer.Serialize(nameof(Value), ref Value);
  2372. @@ -4128,9 +4137,9 @@ namespace S2Library.Protocol
  2373.          public string Txt;
  2374.          public uint FromId;
  2375.  
  2376. -        public override void Serialize(Serializer serializer)
  2377. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2378.          {
  2379. -            base.Serialize(serializer);
  2380. +            base.Serialize(serializer, fullHeader);
  2381.              serializer.Serialize(nameof(Txt), ref Txt);
  2382.              serializer.Serialize(nameof(FromId), ref FromId);
  2383.          }
  2384. @@ -4154,9 +4163,9 @@ namespace S2Library.Protocol
  2385.          public uint Selection;
  2386.          public uint TicketId;
  2387.  
  2388. -        public override void Serialize(Serializer serializer)
  2389. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2390.          {
  2391. -            base.Serialize(serializer);
  2392. +            base.Serialize(serializer, fullHeader);
  2393.              serializer.Serialize(nameof(ServerId), ref ServerId);
  2394.              serializer.Serialize(nameof(RoomId), ref RoomId);
  2395.              serializer.Serialize(nameof(ServerType), ref ServerType);
  2396. @@ -4178,9 +4187,9 @@ namespace S2Library.Protocol
  2397.          public uint Selection;
  2398.          public uint TicketId;
  2399.  
  2400. -        public override void Serialize(Serializer serializer)
  2401. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2402.          {
  2403. -            base.Serialize(serializer);
  2404. +            base.Serialize(serializer, fullHeader);
  2405.              serializer.Serialize(nameof(MachineId), ref MachineId);
  2406.              serializer.Serialize(nameof(Selection), ref Selection);
  2407.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2408. @@ -4237,9 +4246,9 @@ namespace S2Library.Protocol
  2409.          public byte[] Data;
  2410.          public uint TicketId;
  2411.  
  2412. -        public override void Serialize(Serializer serializer)
  2413. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2414.          {
  2415. -            base.Serialize(serializer);
  2416. +            base.Serialize(serializer, fullHeader);
  2417.              serializer.Serialize(nameof(Name), ref Name);
  2418.              serializer.Serialize(nameof(Description), ref Description);
  2419.              serializer.Serialize(nameof(Ip), ref Ip);
  2420. @@ -4271,15 +4280,15 @@ namespace S2Library.Protocol
  2421.  //    (**(code**)(* piVar1 + 8))("running",0xe);
  2422.  //    (**(code**)(* piVar1 + 8))("ticket_id",8);
  2423.  //    (**(code**)(* unaff_EDI + 4))(0xa9,piVar1);
  2424. -    public class Payload169 : PayloadPrefix
  2425. +    public class UnlistServer : PayloadPrefix // Payload169
  2426.      {
  2427.          public uint ServerId;
  2428.          public bool Running;
  2429.          public uint TicketId;
  2430.  
  2431. -        public override void Serialize(Serializer serializer)
  2432. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2433.          {
  2434. -            base.Serialize(serializer);
  2435. +            base.Serialize(serializer, fullHeader);
  2436.              serializer.Serialize(nameof(ServerId), ref ServerId);
  2437.              serializer.Serialize(nameof(Running), ref Running);
  2438.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2439. @@ -4340,9 +4349,9 @@ namespace S2Library.Protocol
  2440.          public byte[] Data;
  2441.          public uint TicketId;
  2442.  
  2443. -        public override void Serialize(Serializer serializer)
  2444. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2445.          {
  2446. -            base.Serialize(serializer);
  2447. +            base.Serialize(serializer, fullHeader);
  2448.              serializer.Serialize(nameof(ServerId), ref ServerId);
  2449.              serializer.Serialize(nameof(Name), ref Name);
  2450.              serializer.Serialize(nameof(OwnerId), ref OwnerId);
  2451. @@ -4392,9 +4401,9 @@ namespace S2Library.Protocol
  2452.          public uint Selection;
  2453.          public uint TicketId;
  2454.  
  2455. -        public override void Serialize(Serializer serializer)
  2456. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2457.          {
  2458. -            base.Serialize(serializer);
  2459. +            base.Serialize(serializer, fullHeader);
  2460.              serializer.Serialize(nameof(SendAll), ref SendAll);
  2461.              serializer.Serialize(nameof(ServerType), ref ServerType);
  2462.              serializer.Serialize(nameof(RoomId), ref RoomId);
  2463. @@ -4414,9 +4423,9 @@ namespace S2Library.Protocol
  2464.      {
  2465.          public uint TicketId;
  2466.  
  2467. -        public override void Serialize(Serializer serializer)
  2468. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2469.          {
  2470. -            base.Serialize(serializer);
  2471. +            base.Serialize(serializer, fullHeader);
  2472.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2473.          }
  2474.      }
  2475. @@ -4429,9 +4438,9 @@ namespace S2Library.Protocol
  2476.      {
  2477.          public uint TicketId;
  2478.  
  2479. -        public override void Serialize(Serializer serializer)
  2480. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2481.          {
  2482. -            base.Serialize(serializer);
  2483. +            base.Serialize(serializer, fullHeader);
  2484.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2485.          }
  2486.      }
  2487. @@ -4454,9 +4463,9 @@ namespace S2Library.Protocol
  2488.          public byte[] Password;
  2489.          public uint TicketId;
  2490.  
  2491. -        public override void Serialize(Serializer serializer)
  2492. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2493.          {
  2494. -            base.Serialize(serializer);
  2495. +            base.Serialize(serializer, fullHeader);
  2496.              serializer.Serialize(nameof(Ip), ref Ip);
  2497.              serializer.Serialize(nameof(Port), ref Port);
  2498.              serializer.Serialize(nameof(Name), ref Name);
  2499. @@ -4478,9 +4487,9 @@ namespace S2Library.Protocol
  2500.          public bool SendAll;
  2501.          public uint TicketId;
  2502.  
  2503. -        public override void Serialize(Serializer serializer)
  2504. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2505.          {
  2506. -            base.Serialize(serializer);
  2507. +            base.Serialize(serializer, fullHeader);
  2508.              serializer.Serialize(nameof(UserId), ref UserId);
  2509.              serializer.Serialize(nameof(SendAll), ref SendAll);
  2510.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2511. @@ -4497,9 +4506,9 @@ namespace S2Library.Protocol
  2512.          public uint UserId;
  2513.          public uint TicketId;
  2514.  
  2515. -        public override void Serialize(Serializer serializer)
  2516. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2517.          {
  2518. -            base.Serialize(serializer);
  2519. +            base.Serialize(serializer, fullHeader);
  2520.              serializer.Serialize(nameof(UserId), ref UserId);
  2521.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2522.          }
  2523. @@ -4543,9 +4552,9 @@ namespace S2Library.Protocol
  2524.          public uint PropertyMask;
  2525.          public uint TicketId;
  2526.  
  2527. -        public override void Serialize(Serializer serializer)
  2528. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2529.          {
  2530. -            base.Serialize(serializer);
  2531. +            base.Serialize(serializer, fullHeader);
  2532.              serializer.Serialize(nameof(Name), ref Name);
  2533.              serializer.Serialize(nameof(Description), ref Description);
  2534.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2535. @@ -4575,9 +4584,9 @@ namespace S2Library.Protocol
  2536.          public uint Patchlevel;
  2537.          public uint TicketId;
  2538.  
  2539. -        public override void Serialize(Serializer serializer)
  2540. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2541.          {
  2542. -            base.Serialize(serializer);
  2543. +            base.Serialize(serializer, fullHeader);
  2544.              serializer.Serialize(nameof(Patchlevel), ref Patchlevel);
  2545.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2546.          }
  2547. @@ -4593,9 +4602,9 @@ namespace S2Library.Protocol
  2548.          public string Txt;
  2549.          public uint TicketId;
  2550.  
  2551. -        public override void Serialize(Serializer serializer)
  2552. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2553.          {
  2554. -            base.Serialize(serializer);
  2555. +            base.Serialize(serializer, fullHeader);
  2556.              serializer.Serialize(nameof(Txt), ref Txt);
  2557.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2558.          }
  2559. @@ -4609,9 +4618,9 @@ namespace S2Library.Protocol
  2560.      {
  2561.          public uint TicketId;
  2562.  
  2563. -        public override void Serialize(Serializer serializer)
  2564. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2565.          {
  2566. -            base.Serialize(serializer);
  2567. +            base.Serialize(serializer, fullHeader);
  2568.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2569.          }
  2570.      }
  2571. @@ -4634,9 +4643,9 @@ namespace S2Library.Protocol
  2572.          public string Txt;
  2573.          public uint TicketId;
  2574.  
  2575. -        public override void Serialize(Serializer serializer)
  2576. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2577.          {
  2578. -            base.Serialize(serializer);
  2579. +            base.Serialize(serializer, fullHeader);
  2580.              serializer.Serialize(nameof(Starttime), ref Starttime);
  2581.              serializer.Serialize(nameof(Starttimestamp), ref Starttimestamp);
  2582.              serializer.Serialize(nameof(Time), ref Time);
  2583. @@ -4664,9 +4673,9 @@ namespace S2Library.Protocol
  2584.          public uint StartedGameservers;
  2585.          public uint TicketId;
  2586.  
  2587. -        public override void Serialize(Serializer serializer)
  2588. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2589.          {
  2590. -            base.Serialize(serializer);
  2591. +            base.Serialize(serializer, fullHeader);
  2592.              serializer.Serialize(nameof(Uptime), ref Uptime);
  2593.              serializer.Serialize(nameof(RegisteredUsers), ref RegisteredUsers);
  2594.              serializer.Serialize(nameof(Logins), ref Logins);
  2595. @@ -4686,9 +4695,9 @@ namespace S2Library.Protocol
  2596.          public byte Level;
  2597.          public uint TicketId;
  2598.  
  2599. -        public override void Serialize(Serializer serializer)
  2600. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2601.          {
  2602. -            base.Serialize(serializer);
  2603. +            base.Serialize(serializer, fullHeader);
  2604.              serializer.Serialize(nameof(Level), ref Level);
  2605.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2606.          }
  2607. @@ -4704,9 +4713,9 @@ namespace S2Library.Protocol
  2608.          public bool Visible;
  2609.          public uint TicketId;
  2610.  
  2611. -        public override void Serialize(Serializer serializer)
  2612. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2613.          {
  2614. -            base.Serialize(serializer);
  2615. +            base.Serialize(serializer, fullHeader);
  2616.              serializer.Serialize(nameof(Visible), ref Visible);
  2617.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2618.          }
  2619. @@ -4720,9 +4729,9 @@ namespace S2Library.Protocol
  2620.      {
  2621.          public uint TicketId;
  2622.  
  2623. -        public override void Serialize(Serializer serializer)
  2624. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2625.          {
  2626. -            base.Serialize(serializer);
  2627. +            base.Serialize(serializer, fullHeader);
  2628.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2629.          }
  2630.      }
  2631. @@ -4741,9 +4750,9 @@ namespace S2Library.Protocol
  2632.          public uint UserId;
  2633.          public uint TicketId;
  2634.  
  2635. -        public override void Serialize(Serializer serializer)
  2636. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2637.          {
  2638. -            base.Serialize(serializer);
  2639. +            base.Serialize(serializer, fullHeader);
  2640.              serializer.Serialize(nameof(OldGroupId), ref OldGroupId);
  2641.              serializer.Serialize(nameof(NewGroupId), ref NewGroupId);
  2642.              serializer.Serialize(nameof(UserId), ref UserId);
  2643. @@ -4769,9 +4778,9 @@ namespace S2Library.Protocol
  2644.          public ushort NewKeypool;
  2645.          public uint TicketId;
  2646.  
  2647. -        public override void Serialize(Serializer serializer)
  2648. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2649.          {
  2650. -            base.Serialize(serializer);
  2651. +            base.Serialize(serializer, fullHeader);
  2652.              serializer.Serialize(nameof(UserId), ref UserId);
  2653.              serializer.Serialize(nameof(OldCdKey), ref OldCdKey);
  2654.              serializer.Serialize(nameof(OldKeypool), ref OldKeypool);
  2655. @@ -4793,9 +4802,9 @@ namespace S2Library.Protocol
  2656.          public short Subversion;
  2657.          public uint TicketId;
  2658.  
  2659. -        public override void Serialize(Serializer serializer)
  2660. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2661.          {
  2662. -            base.Serialize(serializer);
  2663. +            base.Serialize(serializer, fullHeader);
  2664.              serializer.Serialize(nameof(Version), ref Version);
  2665.              serializer.Serialize(nameof(Subversion), ref Subversion);
  2666.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2667. @@ -4814,9 +4823,9 @@ namespace S2Library.Protocol
  2668.          public byte ServerSubtype;
  2669.          public uint TicketId;
  2670.  
  2671. -        public override void Serialize(Serializer serializer)
  2672. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2673.          {
  2674. -            base.Serialize(serializer);
  2675. +            base.Serialize(serializer, fullHeader);
  2676.              serializer.Serialize(nameof(ServerType), ref ServerType);
  2677.              serializer.Serialize(nameof(ServerSubtype), ref ServerSubtype);
  2678.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2679. @@ -4828,14 +4837,14 @@ namespace S2Library.Protocol
  2680.  //    (**(code**)(* piVar1 + 8))("perm_id",8);
  2681.  //    (**(code**)(* piVar1 + 8))("ticket_id",8);
  2682.  //    (**(code**)(* unaff_EDI + 4))(0xbe,piVar1);
  2683. -    public class Payload190 : PayloadPrefix
  2684. +    public class PlayerLeftServer : PayloadPrefix // Payload190
  2685.      {
  2686.          public uint PermId;
  2687.          public uint TicketId;
  2688.  
  2689. -        public override void Serialize(Serializer serializer)
  2690. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2691.          {
  2692. -            base.Serialize(serializer);
  2693. +            base.Serialize(serializer, fullHeader);
  2694.              serializer.Serialize(nameof(PermId), ref PermId);
  2695.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2696.          }
  2697. @@ -4855,9 +4864,9 @@ namespace S2Library.Protocol
  2698.          public ushort MaxPlayers;
  2699.          public uint TicketId;
  2700.  
  2701. -        public override void Serialize(Serializer serializer)
  2702. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2703.          {
  2704. -            base.Serialize(serializer);
  2705. +            base.Serialize(serializer, fullHeader);
  2706.              serializer.Serialize(nameof(Ip), ref Ip);
  2707.              serializer.Serialize(nameof(Port), ref Port);
  2708.              serializer.Serialize(nameof(MaxPlayers), ref MaxPlayers);
  2709. @@ -4885,9 +4894,9 @@ namespace S2Library.Protocol
  2710.          public byte[] Data;
  2711.          public uint TicketId;
  2712.  
  2713. -        public override void Serialize(Serializer serializer)
  2714. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2715.          {
  2716. -            base.Serialize(serializer);
  2717. +            base.Serialize(serializer, fullHeader);
  2718.              serializer.Serialize(nameof(ServerId), ref ServerId);
  2719.              serializer.Serialize(nameof(Ip), ref Ip);
  2720.              serializer.Serialize(nameof(Port), ref Port);
  2721. @@ -4908,9 +4917,9 @@ namespace S2Library.Protocol
  2722.          public uint PermId;
  2723.          public uint TicketId;
  2724.  
  2725. -        public override void Serialize(Serializer serializer)
  2726. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2727.          {
  2728. -            base.Serialize(serializer);
  2729. +            base.Serialize(serializer, fullHeader);
  2730.              serializer.Serialize(nameof(PermId), ref PermId);
  2731.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2732.          }
  2733. @@ -4930,9 +4939,9 @@ namespace S2Library.Protocol
  2734.          public uint UserAccess;
  2735.          public uint TicketId;
  2736.  
  2737. -        public override void Serialize(Serializer serializer)
  2738. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2739.          {
  2740. -            base.Serialize(serializer);
  2741. +            base.Serialize(serializer, fullHeader);
  2742.              serializer.Serialize(nameof(PermId), ref PermId);
  2743.              serializer.Serialize(nameof(Username), ref Username);
  2744.              serializer.Serialize(nameof(UserAccess), ref UserAccess);
  2745. @@ -4950,9 +4959,9 @@ namespace S2Library.Protocol
  2746.          public byte[] Key;
  2747.          public uint TicketId;
  2748.  
  2749. -        public override void Serialize(Serializer serializer)
  2750. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2751.          {
  2752. -            base.Serialize(serializer);
  2753. +            base.Serialize(serializer, fullHeader);
  2754.              serializer.Serialize(nameof(Key), ref Key);
  2755.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2756.          }
  2757. @@ -4968,9 +4977,9 @@ namespace S2Library.Protocol
  2758.          public byte[] Cipher;
  2759.          public uint TicketId;
  2760.  
  2761. -        public override void Serialize(Serializer serializer)
  2762. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2763.          {
  2764. -            base.Serialize(serializer);
  2765. +            base.Serialize(serializer, fullHeader);
  2766.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2767.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2768.          }
  2769. @@ -4986,9 +4995,9 @@ namespace S2Library.Protocol
  2770.          public byte[] Cipher;
  2771.          public uint TicketId;
  2772.  
  2773. -        public override void Serialize(Serializer serializer)
  2774. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2775.          {
  2776. -            base.Serialize(serializer);
  2777. +            base.Serialize(serializer, fullHeader);
  2778.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2779.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2780.          }
  2781. @@ -5004,9 +5013,9 @@ namespace S2Library.Protocol
  2782.          public byte[] Cipher;
  2783.          public uint TicketId;
  2784.  
  2785. -        public override void Serialize(Serializer serializer)
  2786. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2787.          {
  2788. -            base.Serialize(serializer);
  2789. +            base.Serialize(serializer, fullHeader);
  2790.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2791.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2792.          }
  2793. @@ -5022,9 +5031,9 @@ namespace S2Library.Protocol
  2794.          public byte[] Cipher;
  2795.          public uint TicketId;
  2796.  
  2797. -        public override void Serialize(Serializer serializer)
  2798. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2799.          {
  2800. -            base.Serialize(serializer);
  2801. +            base.Serialize(serializer, fullHeader);
  2802.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2803.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2804.          }
  2805. @@ -5040,9 +5049,9 @@ namespace S2Library.Protocol
  2806.          public byte[] Cipher;
  2807.          public uint TicketId;
  2808.  
  2809. -        public override void Serialize(Serializer serializer)
  2810. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2811.          {
  2812. -            base.Serialize(serializer);
  2813. +            base.Serialize(serializer, fullHeader);
  2814.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2815.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2816.          }
  2817. @@ -5060,9 +5069,9 @@ namespace S2Library.Protocol
  2818.          public byte[] Cipher;
  2819.          public uint TicketId;
  2820.  
  2821. -        public override void Serialize(Serializer serializer)
  2822. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2823.          {
  2824. -            base.Serialize(serializer);
  2825. +            base.Serialize(serializer, fullHeader);
  2826.              serializer.Serialize(nameof(PermId), ref PermId);
  2827.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2828.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2829. @@ -5077,9 +5086,9 @@ namespace S2Library.Protocol
  2830.      {
  2831.          public uint TicketId;
  2832.  
  2833. -        public override void Serialize(Serializer serializer)
  2834. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2835.          {
  2836. -            base.Serialize(serializer);
  2837. +            base.Serialize(serializer, fullHeader);
  2838.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2839.          }
  2840.      }
  2841. @@ -5094,9 +5103,9 @@ namespace S2Library.Protocol
  2842.          public byte[] Nonce;
  2843.          public uint TicketId;
  2844.  
  2845. -        public override void Serialize(Serializer serializer)
  2846. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2847.          {
  2848. -            base.Serialize(serializer);
  2849. +            base.Serialize(serializer, fullHeader);
  2850.              serializer.Serialize(nameof(Nonce), ref Nonce);
  2851.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2852.          }
  2853. @@ -5114,9 +5123,9 @@ namespace S2Library.Protocol
  2854.          public byte[] Cipher;
  2855.          public uint TicketId;
  2856.  
  2857. -        public override void Serialize(Serializer serializer)
  2858. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2859.          {
  2860. -            base.Serialize(serializer);
  2861. +            base.Serialize(serializer, fullHeader);
  2862.              serializer.Serialize(nameof(PermId), ref PermId);
  2863.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2864.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2865. @@ -5137,9 +5146,9 @@ namespace S2Library.Protocol
  2866.          public byte[] Nonce;
  2867.          public uint TicketId;
  2868.  
  2869. -        public override void Serialize(Serializer serializer)
  2870. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2871.          {
  2872. -            base.Serialize(serializer);
  2873. +            base.Serialize(serializer, fullHeader);
  2874.              serializer.Serialize(nameof(PermId), ref PermId);
  2875.              serializer.Serialize(nameof(Cipher), ref Cipher);
  2876.              serializer.Serialize(nameof(Nonce), ref Nonce);
  2877. @@ -5159,9 +5168,9 @@ namespace S2Library.Protocol
  2878.          public uint ServerId;
  2879.          public uint TicketId;
  2880.  
  2881. -        public override void Serialize(Serializer serializer)
  2882. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2883.          {
  2884. -            base.Serialize(serializer);
  2885. +            base.Serialize(serializer, fullHeader);
  2886.              serializer.Serialize(nameof(PermId), ref PermId);
  2887.              serializer.Serialize(nameof(ServerId), ref ServerId);
  2888.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2889. @@ -5190,9 +5199,9 @@ namespace S2Library.Protocol
  2890.          public string Errormsg;
  2891.          public uint TicketId;
  2892.  
  2893. -        public override void Serialize(Serializer serializer)
  2894. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2895.          {
  2896. -            base.Serialize(serializer);
  2897. +            base.Serialize(serializer, fullHeader);
  2898.              serializer.Serialize(nameof(PermId), ref PermId);
  2899.              serializer.Serialize(nameof(ServerId), ref ServerId);
  2900.              serializer.Serialize(nameof(Ip), ref Ip);
  2901. @@ -5228,9 +5237,9 @@ namespace S2Library.Protocol
  2902.          public byte GuildRole;
  2903.          public byte[] Data;
  2904.  
  2905. -        public override void Serialize(Serializer serializer)
  2906. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2907.          {
  2908. -            base.Serialize(serializer);
  2909. +            base.Serialize(serializer, fullHeader);
  2910.              serializer.Serialize(nameof(Nonce), ref Nonce);
  2911.              serializer.Serialize(nameof(CharId), ref CharId);
  2912.              serializer.Serialize(nameof(Name), ref Name);
  2913. @@ -5257,9 +5266,9 @@ namespace S2Library.Protocol
  2914.          public uint TicketId;
  2915.          public byte[] Password;
  2916.  
  2917. -        public override void Serialize(Serializer serializer)
  2918. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2919.          {
  2920. -            base.Serialize(serializer);
  2921. +            base.Serialize(serializer, fullHeader);
  2922.              serializer.Serialize(nameof(PermId), ref PermId);
  2923.              serializer.Serialize(nameof(Nonce), ref Nonce);
  2924.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2925. @@ -5283,9 +5292,9 @@ namespace S2Library.Protocol
  2926.          public byte Status;
  2927.          public uint TicketId;
  2928.  
  2929. -        public override void Serialize(Serializer serializer)
  2930. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2931.          {
  2932. -            base.Serialize(serializer);
  2933. +            base.Serialize(serializer, fullHeader);
  2934.              serializer.Serialize(nameof(FromId), ref FromId);
  2935.              serializer.Serialize(nameof(CellId), ref CellId);
  2936.              serializer.Serialize(nameof(MessageText), ref MessageText);
  2937. @@ -5310,9 +5319,9 @@ namespace S2Library.Protocol
  2938.          public byte Status;
  2939.          public uint TicketId;
  2940.  
  2941. -        public override void Serialize(Serializer serializer)
  2942. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2943.          {
  2944. -            base.Serialize(serializer);
  2945. +            base.Serialize(serializer, fullHeader);
  2946.              serializer.Serialize(nameof(FromId), ref FromId);
  2947.              serializer.Serialize(nameof(PermId), ref PermId);
  2948.              serializer.Serialize(nameof(MessageText), ref MessageText);
  2949. @@ -5339,9 +5348,9 @@ namespace S2Library.Protocol
  2950.          public byte Status;
  2951.          public uint TicketId;
  2952.  
  2953. -        public override void Serialize(Serializer serializer)
  2954. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2955.          {
  2956. -            base.Serialize(serializer);
  2957. +            base.Serialize(serializer, fullHeader);
  2958.              serializer.Serialize(nameof(FromId), ref FromId);
  2959.              serializer.Serialize(nameof(Name), ref Name);
  2960.              serializer.Serialize(nameof(PasswordRequired), ref PasswordRequired);
  2961. @@ -5371,9 +5380,9 @@ namespace S2Library.Protocol
  2962.          public byte Status;
  2963.          public uint TicketId;
  2964.  
  2965. -        public override void Serialize(Serializer serializer)
  2966. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2967.          {
  2968. -            base.Serialize(serializer);
  2969. +            base.Serialize(serializer, fullHeader);
  2970.              serializer.Serialize(nameof(FromId), ref FromId);
  2971.              serializer.Serialize(nameof(Id), ref Id);
  2972.              serializer.Serialize(nameof(Name), ref Name);
  2973. @@ -5396,9 +5405,9 @@ namespace S2Library.Protocol
  2974.          public uint Id;
  2975.          public uint TicketId;
  2976.  
  2977. -        public override void Serialize(Serializer serializer)
  2978. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2979.          {
  2980. -            base.Serialize(serializer);
  2981. +            base.Serialize(serializer, fullHeader);
  2982.              serializer.Serialize(nameof(FromId), ref FromId);
  2983.              serializer.Serialize(nameof(Id), ref Id);
  2984.              serializer.Serialize(nameof(TicketId), ref TicketId);
  2985. @@ -5419,9 +5428,9 @@ namespace S2Library.Protocol
  2986.          public string Password;
  2987.          public uint TicketId;
  2988.  
  2989. -        public override void Serialize(Serializer serializer)
  2990. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  2991.          {
  2992. -            base.Serialize(serializer);
  2993. +            base.Serialize(serializer, fullHeader);
  2994.              serializer.Serialize(nameof(FromId), ref FromId);
  2995.              serializer.Serialize(nameof(Id), ref Id);
  2996.              serializer.Serialize(nameof(Password), ref Password);
  2997. @@ -5441,9 +5450,9 @@ namespace S2Library.Protocol
  2998.          public uint Id;
  2999.          public uint TicketId;
  3000.  
  3001. -        public override void Serialize(Serializer serializer)
  3002. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3003.          {
  3004. -            base.Serialize(serializer);
  3005. +            base.Serialize(serializer, fullHeader);
  3006.              serializer.Serialize(nameof(FromId), ref FromId);
  3007.              serializer.Serialize(nameof(Id), ref Id);
  3008.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3009. @@ -5462,9 +5471,9 @@ namespace S2Library.Protocol
  3010.          public uint Id;
  3011.          public uint TicketId;
  3012.  
  3013. -        public override void Serialize(Serializer serializer)
  3014. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3015.          {
  3016. -            base.Serialize(serializer);
  3017. +            base.Serialize(serializer, fullHeader);
  3018.              serializer.Serialize(nameof(PermId), ref PermId);
  3019.              serializer.Serialize(nameof(Id), ref Id);
  3020.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3021. @@ -5483,9 +5492,9 @@ namespace S2Library.Protocol
  3022.          public uint Id;
  3023.          public uint TicketId;
  3024.  
  3025. -        public override void Serialize(Serializer serializer)
  3026. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3027.          {
  3028. -            base.Serialize(serializer);
  3029. +            base.Serialize(serializer, fullHeader);
  3030.              serializer.Serialize(nameof(PermId), ref PermId);
  3031.              serializer.Serialize(nameof(Id), ref Id);
  3032.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3033. @@ -5506,9 +5515,9 @@ namespace S2Library.Protocol
  3034.          public uint Id;
  3035.          public uint TicketId;
  3036.  
  3037. -        public override void Serialize(Serializer serializer)
  3038. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3039.          {
  3040. -            base.Serialize(serializer);
  3041. +            base.Serialize(serializer, fullHeader);
  3042.              serializer.Serialize(nameof(FromId), ref FromId);
  3043.              serializer.Serialize(nameof(PermId), ref PermId);
  3044.              serializer.Serialize(nameof(Id), ref Id);
  3045. @@ -5528,9 +5537,9 @@ namespace S2Library.Protocol
  3046.          public uint Id;
  3047.          public uint TicketId;
  3048.  
  3049. -        public override void Serialize(Serializer serializer)
  3050. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3051.          {
  3052. -            base.Serialize(serializer);
  3053. +            base.Serialize(serializer, fullHeader);
  3054.              serializer.Serialize(nameof(PermId), ref PermId);
  3055.              serializer.Serialize(nameof(Id), ref Id);
  3056.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3057. @@ -5551,9 +5560,9 @@ namespace S2Library.Protocol
  3058.          public uint UserAccess;
  3059.          public uint TicketId;
  3060.  
  3061. -        public override void Serialize(Serializer serializer)
  3062. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3063.          {
  3064. -            base.Serialize(serializer);
  3065. +            base.Serialize(serializer, fullHeader);
  3066.              serializer.Serialize(nameof(PermId), ref PermId);
  3067.              serializer.Serialize(nameof(Nick), ref Nick);
  3068.              serializer.Serialize(nameof(UserAccess), ref UserAccess);
  3069. @@ -5579,9 +5588,9 @@ namespace S2Library.Protocol
  3070.          public uint Custom1;
  3071.          public uint Custom2;
  3072.  
  3073. -        public override void Serialize(Serializer serializer)
  3074. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3075.          {
  3076. -            base.Serialize(serializer);
  3077. +            base.Serialize(serializer, fullHeader);
  3078.              serializer.Serialize(nameof(PermIdA), ref PermIdA);
  3079.              serializer.Serialize(nameof(PermIdB), ref PermIdB);
  3080.              serializer.Serialize(nameof(Result), ref Result);
  3081. @@ -5603,9 +5612,9 @@ namespace S2Library.Protocol
  3082.          public uint PermIdB;
  3083.          public uint ResultId;
  3084.  
  3085. -        public override void Serialize(Serializer serializer)
  3086. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3087.          {
  3088. -            base.Serialize(serializer);
  3089. +            base.Serialize(serializer, fullHeader);
  3090.              serializer.Serialize(nameof(PermIdA), ref PermIdA);
  3091.              serializer.Serialize(nameof(PermIdB), ref PermIdB);
  3092.              serializer.Serialize(nameof(ResultId), ref ResultId);
  3093. @@ -5622,9 +5631,9 @@ namespace S2Library.Protocol
  3094.          public ushort Ranktable;
  3095.          public uint PermId;
  3096.  
  3097. -        public override void Serialize(Serializer serializer)
  3098. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3099.          {
  3100. -            base.Serialize(serializer);
  3101. +            base.Serialize(serializer, fullHeader);
  3102.              serializer.Serialize(nameof(Ranktable), ref Ranktable);
  3103.              serializer.Serialize(nameof(PermId), ref PermId);
  3104.          }
  3105. @@ -5656,9 +5665,9 @@ namespace S2Library.Protocol
  3106.          public uint Tie;
  3107.          public uint Disconnected;
  3108.  
  3109. -        public override void Serialize(Serializer serializer)
  3110. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3111.          {
  3112. -            base.Serialize(serializer);
  3113. +            base.Serialize(serializer, fullHeader);
  3114.              serializer.Serialize(nameof(Ranktable), ref Ranktable);
  3115.              serializer.Serialize(nameof(PermId), ref PermId);
  3116.              serializer.Serialize(nameof(Nick), ref Nick);
  3117. @@ -5684,9 +5693,9 @@ namespace S2Library.Protocol
  3118.          public uint Rangestart;
  3119.          public uint Rangeend;
  3120.  
  3121. -        public override void Serialize(Serializer serializer)
  3122. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3123.          {
  3124. -            base.Serialize(serializer);
  3125. +            base.Serialize(serializer, fullHeader);
  3126.              serializer.Serialize(nameof(Ranktable), ref Ranktable);
  3127.              serializer.Serialize(nameof(Rangestart), ref Rangestart);
  3128.              serializer.Serialize(nameof(Rangeend), ref Rangeend);
  3129. @@ -5709,9 +5718,9 @@ namespace S2Library.Protocol
  3130.          public uint Count;
  3131.          public byte[] Rankdata;
  3132.  
  3133. -        public override void Serialize(Serializer serializer)
  3134. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3135.          {
  3136. -            base.Serialize(serializer);
  3137. +            base.Serialize(serializer, fullHeader);
  3138.              serializer.Serialize(nameof(Ranktable), ref Ranktable);
  3139.              serializer.Serialize(nameof(Rangestart), ref Rangestart);
  3140.              serializer.Serialize(nameof(Rangeend), ref Rangeend);
  3141. @@ -5732,9 +5741,9 @@ namespace S2Library.Protocol
  3142.          public uint Port;
  3143.          public uint TicketId;
  3144.  
  3145. -        public override void Serialize(Serializer serializer)
  3146. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3147.          {
  3148. -            base.Serialize(serializer);
  3149. +            base.Serialize(serializer, fullHeader);
  3150.              serializer.Serialize(nameof(Ip), ref Ip);
  3151.              serializer.Serialize(nameof(Port), ref Port);
  3152.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3153. @@ -5753,9 +5762,9 @@ namespace S2Library.Protocol
  3154.          public uint TicketId;
  3155.          public uint FromId;
  3156.  
  3157. -        public override void Serialize(Serializer serializer)
  3158. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3159.          {
  3160. -            base.Serialize(serializer);
  3161. +            base.Serialize(serializer, fullHeader);
  3162.              serializer.Serialize(nameof(CellId), ref CellId);
  3163.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3164.              serializer.Serialize(nameof(FromId), ref FromId);
  3165. @@ -5774,9 +5783,9 @@ namespace S2Library.Protocol
  3166.          public uint ConnectionPid;
  3167.          public uint UserPid;
  3168.  
  3169. -        public override void Serialize(Serializer serializer)
  3170. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3171.          {
  3172. -            base.Serialize(serializer);
  3173. +            base.Serialize(serializer, fullHeader);
  3174.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3175.              serializer.Serialize(nameof(ConnectionPid), ref ConnectionPid);
  3176.              serializer.Serialize(nameof(UserPid), ref UserPid);
  3177. @@ -5799,9 +5808,9 @@ namespace S2Library.Protocol
  3178.          public uint TicketId;
  3179.          public uint ResultId;
  3180.  
  3181. -        public override void Serialize(Serializer serializer)
  3182. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3183.          {
  3184. -            base.Serialize(serializer);
  3185. +            base.Serialize(serializer, fullHeader);
  3186.              serializer.Serialize(nameof(PermId), ref PermId);
  3187.              serializer.Serialize(nameof(Username), ref Username);
  3188.              serializer.Serialize(nameof(UserAccess), ref UserAccess);
  3189. @@ -5820,9 +5829,9 @@ namespace S2Library.Protocol
  3190.          public uint TicketId;
  3191.          public string Name;
  3192.  
  3193. -        public override void Serialize(Serializer serializer)
  3194. +        public override void Serialize(Serializer serializer, bool fullHeader = true)
  3195.          {
  3196. -            base.Serialize(serializer);
  3197. +            base.Serialize(serializer, fullHeader);
  3198.              serializer.Serialize(nameof(TicketId), ref TicketId);
  3199.              serializer.Serialize(nameof(Name), ref Name);
  3200.          }
  3201. diff --git a/S2Lobby/Accounts.cs b/S2Lobby/Accounts.cs
  3202. index 645fdf5..9757fe1 100644
  3203. --- a/S2Lobby/Accounts.cs
  3204. +++ b/S2Lobby/Accounts.cs
  3205. @@ -84,7 +84,21 @@ namespace S2Lobby
  3206.          public Account Get(SQLiteConnection sql, string name)
  3207.          {
  3208.              SQLiteParameter para1 = new SQLiteParameter();
  3209. +            para1.Value = name.ToUpperInvariant();
  3210. +
  3211. +            return GetInternal(sql, "user_name_upper", para1);
  3212. +        }
  3213. +
  3214. +        public Account Get(SQLiteConnection sql, uint id)
  3215. +        {
  3216. +            SQLiteParameter para1 = new SQLiteParameter();
  3217. +            para1.Value = id;
  3218.  
  3219. +            return GetInternal(sql, "account_id", para1);
  3220. +        }
  3221. +
  3222. +        private Account GetInternal(SQLiteConnection sql, string field, SQLiteParameter para1)
  3223. +        {
  3224.              StringBuilder cmd = new StringBuilder();
  3225.              cmd.AppendLine("SELECT ");
  3226.              cmd.AppendLine("    account_id");
  3227. @@ -95,9 +109,7 @@ namespace S2Lobby
  3228.              cmd.AppendLine(",   user_data");
  3229.              cmd.AppendLine(",   player_nickname");
  3230.              cmd.AppendLine("FROM accounts");
  3231. -            cmd.AppendLine("WHERE user_name_upper = ?;");
  3232. -
  3233. -            para1.Value = name.ToUpperInvariant();
  3234. +            cmd.AppendLine($"WHERE {field} = ?;");
  3235.  
  3236.              SQLiteCommand command = new SQLiteCommand(cmd.ToString(), sql);
  3237.              command.Parameters.Add(para1);
  3238. @@ -119,6 +131,7 @@ namespace S2Lobby
  3239.                  PlayerName = reader["player_nickname"] as string,
  3240.              };
  3241.  
  3242. +            reader.Close();
  3243.              command.Dispose();
  3244.  
  3245.              return account;
  3246. diff --git a/S2Lobby/Channels.cs b/S2Lobby/Channels.cs
  3247. new file mode 100644
  3248. index 0000000..7791a1c
  3249. --- /dev/null
  3250. +++ b/S2Lobby/Channels.cs
  3251. @@ -0,0 +1,243 @@
  3252. +using System.Collections.Generic;
  3253. +using System.Data.SQLite;
  3254. +using System.Text;
  3255. +
  3256. +namespace S2Lobby
  3257. +{
  3258. +    public class Channels
  3259. +    {
  3260. +        private Program _program;
  3261. +
  3262. +        public void Init(Program program)
  3263. +        {
  3264. +            _program = program;
  3265. +
  3266. +            SQLiteConnection sql = new SQLiteConnection("Data Source=channels.sqlite;");
  3267. +            sql.Open();
  3268. +
  3269. +            SQLiteTransaction transaction = sql.BeginTransaction();
  3270. +
  3271. +            StringBuilder cmd = new StringBuilder();
  3272. +            cmd.AppendLine("CREATE TABLE IF NOT EXISTS channels (");
  3273. +            cmd.AppendLine("    channel_id          INTEGER PRIMARY KEY AUTOINCREMENT");
  3274. +            cmd.AppendLine(",   channel_name        VARCHAR(127) NOT NULL");
  3275. +            cmd.AppendLine(",   channel_subject     VARCHAR(255)");
  3276. +            cmd.AppendLine(",   channel_creator     VARCHAR(127) NOT NULL");
  3277. +            cmd.AppendLine(",   creator_id          INTEGER NOT NULL");
  3278. +            cmd.AppendLine(",   channel_protected   INTEGER NOT NULL DEFAULT(0)");
  3279. +            cmd.AppendLine(",   channel_password    VARCHAR(127)");
  3280. +            cmd.AppendLine(",   channel_hidden      INTEGER NOT NULL DEFAULT(0)");
  3281. +            cmd.AppendLine(");");
  3282. +
  3283. +            SQLiteCommand command = new SQLiteCommand(cmd.ToString(), sql, transaction);
  3284. +            if (command.ExecuteNonQuery() >= 0)
  3285. +            {
  3286. +                string cmd1 = "INSERT INTO channels (channel_name, channel_subject, channel_creator, creator_id, channel_protected) VALUES ('System', 'System Channel', 'Admin', 0, 1);";
  3287. +                SQLiteCommand command1 = new SQLiteCommand(cmd1, sql, transaction);
  3288. +                command1.ExecuteNonQuery();
  3289. +
  3290. +                string cmd2 = "INSERT INTO channels (channel_name, channel_subject, channel_creator, creator_id, channel_protected) VALUES ('Lobby', 'Lobby Channel', 'Admin', 0, 1);";
  3291. +                SQLiteCommand command2 = new SQLiteCommand(cmd2, sql, transaction);
  3292. +                command2.ExecuteNonQuery();
  3293. +            }
  3294. +
  3295. +            transaction.Commit();
  3296. +
  3297. +            command.Dispose();
  3298. +            transaction.Dispose();
  3299. +
  3300. +            sql.Close();
  3301. +            sql.Dispose();
  3302. +
  3303. +            _program.Log($"[Channel database ready]");
  3304. +        }
  3305. +
  3306. +        public uint Create(SQLiteConnection sql, Channel channel)
  3307. +        {
  3308. +            Channel existing = Get(sql, channel.Id);
  3309. +            if (existing != null)
  3310. +            {
  3311. +                return 0;
  3312. +            }
  3313. +
  3314. +            SQLiteParameter para1 = new SQLiteParameter();
  3315. +            SQLiteParameter para2 = new SQLiteParameter();
  3316. +            SQLiteParameter para3 = new SQLiteParameter();
  3317. +            SQLiteParameter para4 = new SQLiteParameter();
  3318. +            SQLiteParameter para5 = new SQLiteParameter();
  3319. +            SQLiteParameter para6 = new SQLiteParameter();
  3320. +            SQLiteParameter para7 = new SQLiteParameter();
  3321. +
  3322. +            StringBuilder cmd = new StringBuilder();
  3323. +            cmd.AppendLine("INSERT INTO channels (channel_name, channel_subject, channel_creator, creator_id, channel_protected, channel_password, channel_hidden) VALUES (?, ?, ?, ?, ?, ?, ?);");
  3324. +
  3325. +            para1.Value = channel.Name;
  3326. +            para2.Value = channel.Subject;
  3327. +            para3.Value = channel.Creator;
  3328. +            para4.Value = channel.CreatorId;
  3329. +            para5.Value = channel.Protected ? 1 : 0;
  3330. +            para6.Value = channel.Password;
  3331. +            para7.Value = channel.Hidden ? 1 : 0;
  3332. +
  3333. +            SQLiteTransaction transaction = sql.BeginTransaction();
  3334. +
  3335. +            SQLiteCommand command = new SQLiteCommand(cmd.ToString(), sql, transaction);
  3336. +            command.Parameters.Add(para1);
  3337. +            command.Parameters.Add(para2);
  3338. +            command.Parameters.Add(para3);
  3339. +            command.Parameters.Add(para4);
  3340. +            command.Parameters.Add(para5);
  3341. +            command.Parameters.Add(para6);
  3342. +            command.Parameters.Add(para7);
  3343. +
  3344. +            command.ExecuteNonQuery();
  3345. +
  3346. +            transaction.Commit();
  3347. +
  3348. +            command.Dispose();
  3349. +            transaction.Dispose();
  3350. +
  3351. +            return (uint)GetLastAutoIncrement(sql);
  3352. +        }
  3353. +
  3354. +        public Channel Get(SQLiteConnection sql, uint id)
  3355. +        {
  3356. +            SQLiteParameter para1 = new SQLiteParameter();
  3357. +            para1.Value = id;
  3358. +
  3359. +            return GetInternal(sql, "channel_id", para1);
  3360. +        }
  3361. +
  3362. +        private Channel GetInternal(SQLiteConnection sql, string field, SQLiteParameter para1)
  3363. +        {
  3364. +            StringBuilder cmd = new StringBuilder();
  3365. +            cmd.AppendLine("SELECT ");
  3366. +            cmd.AppendLine("    channel_id");
  3367. +            cmd.AppendLine(",   channel_name");
  3368. +            cmd.AppendLine(",   channel_subject");
  3369. +            cmd.AppendLine(",   channel_creator");
  3370. +            cmd.AppendLine(",   creator_id");
  3371. +            cmd.AppendLine(",   channel_protected");
  3372. +            cmd.AppendLine(",   channel_password");
  3373. +            cmd.AppendLine(",   channel_hidden");
  3374. +            cmd.AppendLine("FROM channels");
  3375. +            cmd.AppendLine($"WHERE {field} = ?;");
  3376. +
  3377. +            SQLiteCommand command = new SQLiteCommand(cmd.ToString(), sql);
  3378. +            command.Parameters.Add(para1);
  3379. +
  3380. +            SQLiteDataReader reader = command.ExecuteReader();
  3381. +            if (!reader.Read())
  3382. +            {
  3383. +                return null;
  3384. +            }
  3385. +
  3386. +            Channel channel = new Channel()
  3387. +            {
  3388. +                Id = (uint)(long)reader["channel_id"],
  3389. +                Name = reader["channel_name"] as string,
  3390. +                Subject = reader["channel_subject"] as string,
  3391. +                Creator = reader["channel_creator"] as string,
  3392. +                CreatorId = (uint)(long)reader["creator_id"],
  3393. +                Protected = (long)reader["channel_protected"] != 0,
  3394. +                Password = reader["channel_password"] as string,
  3395. +                Hidden = (long)reader["channel_hidden"] != 0,
  3396. +                Persistent = true,
  3397. +            };
  3398. +
  3399. +            reader.Close();
  3400. +            command.Dispose();
  3401. +
  3402. +            return channel;
  3403. +        }
  3404. +
  3405. +        public List<Channel> GetAll(SQLiteConnection sql)
  3406. +        {
  3407. +            StringBuilder cmd = new StringBuilder();
  3408. +            cmd.AppendLine("SELECT ");
  3409. +            cmd.AppendLine("    channel_id");
  3410. +            cmd.AppendLine(",   channel_name");
  3411. +            cmd.AppendLine(",   channel_subject");
  3412. +            cmd.AppendLine(",   channel_creator");
  3413. +            cmd.AppendLine(",   creator_id");
  3414. +            cmd.AppendLine(",   channel_protected");
  3415. +            cmd.AppendLine(",   channel_password");
  3416. +            cmd.AppendLine(",   channel_hidden");
  3417. +            cmd.AppendLine("FROM channels");
  3418. +            cmd.AppendLine("ORDER BY channel_id;");
  3419. +
  3420. +            SQLiteCommand command = new SQLiteCommand(cmd.ToString(), sql);
  3421. +
  3422. +            List<Channel> result = new List<Channel>();
  3423. +
  3424. +            SQLiteDataReader reader = command.ExecuteReader();
  3425. +            while (reader.Read())
  3426. +            {
  3427. +                Channel channel = new Channel()
  3428. +                {
  3429. +                    Id = (uint)(long)reader["channel_id"],
  3430. +                    Name = reader["channel_name"] as string,
  3431. +                    Subject = reader["channel_subject"] as string,
  3432. +                    Creator = reader["channel_creator"] as string,
  3433. +                    CreatorId = (uint)(long)reader["creator_id"],
  3434. +                    Protected = (long)reader["channel_protected"] != 0,
  3435. +                    Password = reader["channel_password"] as string,
  3436. +                    Hidden = (long)reader["channel_hidden"] != 0,
  3437. +                    Persistent = true,
  3438. +                };
  3439. +
  3440. +                result.Add(channel);
  3441. +            }
  3442. +
  3443. +            reader.Close();
  3444. +            command.Dispose();
  3445. +
  3446. +            return result;
  3447. +        }
  3448. +
  3449. +        public void Delete(SQLiteConnection sql, uint id)
  3450. +        {
  3451. +            SQLiteParameter para1 = new SQLiteParameter();
  3452. +
  3453. +            StringBuilder cmd = new StringBuilder();
  3454. +            cmd.AppendLine("DELETE FROM channels WHERE channel_protected = 0 AND channel_id = ?;");
  3455. +
  3456. +            para1.Value = id;
  3457. +
  3458. +            SQLiteTransaction transaction = sql.BeginTransaction();
  3459. +
  3460. +            SQLiteCommand command = new SQLiteCommand(cmd.ToString(), sql, transaction);
  3461. +            command.Parameters.Add(para1);
  3462. +
  3463. +            command.ExecuteNonQuery();
  3464. +
  3465. +            transaction.Commit();
  3466. +
  3467. +            command.Dispose();
  3468. +            transaction.Dispose();
  3469. +        }
  3470. +
  3471. +        private static long GetLastAutoIncrement(SQLiteConnection sql)
  3472. +        {
  3473. +            string cmd= "SELECT last_insert_rowid();";
  3474. +            SQLiteCommand command2 = new SQLiteCommand(cmd, sql);
  3475. +            long scalar = (long) command2.ExecuteScalar();
  3476. +            command2.Dispose();
  3477. +            return scalar;
  3478. +        }
  3479. +    }
  3480. +
  3481. +    public class Channel
  3482. +    {
  3483. +        public uint Id;
  3484. +        public string Name;
  3485. +        public string Subject;
  3486. +        public string Creator;
  3487. +        public uint CreatorId;
  3488. +        public bool Protected;
  3489. +        public string Password;
  3490. +        public bool Hidden;
  3491. +        public bool Persistent;
  3492. +        public bool AutoDelete;
  3493. +    }
  3494. +}
  3495. diff --git a/S2Lobby/ChatProcessor.cs b/S2Lobby/ChatProcessor.cs
  3496. index d041d9c..7217523 100644
  3497. --- a/S2Lobby/ChatProcessor.cs
  3498. +++ b/S2Lobby/ChatProcessor.cs
  3499. @@ -1,24 +1,104 @@
  3500.  using System.IO;
  3501. +using System.Collections.Concurrent;
  3502. +using System.Collections.Generic;
  3503. +using System.Linq;
  3504. +
  3505.  using S2Library.Protocol;
  3506.  
  3507.  namespace S2Lobby
  3508.  {
  3509.      public class ChatProcessor : ServerProcessor
  3510.      {
  3511. -        private readonly byte[] _initial1 = Crypto.BytesFromHexString("620000000000370000000200000053430600000053797374656d0e00000053797374656d206368616e6e656c0500000041646d696e0000000000010000000000000100000000000000");
  3512. -        private readonly byte[] _initial2 = Crypto.BytesFromHexString("62000000000030000000020000005343050000004c6f6262790d0000004c6f626279204368616e6e656c000000000000000000010000000000000200000000000000");
  3513. +        private static readonly ConcurrentDictionary<uint, ConcurrentBag<uint>> _channelConnections = new ConcurrentDictionary<uint, ConcurrentBag<uint>>();
  3514. +        private static readonly ConcurrentDictionary<uint, Channel> _channels = new ConcurrentDictionary<uint, Channel>();
  3515.  
  3516.          public ChatProcessor(Program program, uint connection) : base(program, connection)
  3517.          {
  3518.          }
  3519.  
  3520. -        protected override void HandleInitialReply(MemoryStream replyStream)
  3521. +        public override void Close()
  3522.          {
  3523. -            BinaryWriter writer = new BinaryWriter(replyStream);
  3524. -            writer.Write(_initial1);
  3525. -            SendReply(MessageContainer.Types.ApplicationMessage, replyStream);
  3526. -            writer.Write(_initial2);
  3527. -            SendReply(MessageContainer.Types.ApplicationMessage, replyStream);
  3528. +            base.Close();
  3529. +            if (Account == null)
  3530. +            {
  3531. +                return;
  3532. +            }
  3533. +
  3534. +            KeyValuePair<uint, ConcurrentBag<uint>>[] channels = _channelConnections.ToArray();
  3535. +            foreach(KeyValuePair<uint, ConcurrentBag<uint>> channel in channels)
  3536. +            {
  3537. +                uint channelId = channel.Key;
  3538. +                uint[] connections = channel.Value.ToArray();
  3539. +
  3540. +                foreach(uint connection in connections)
  3541. +                {
  3542. +                    if (connection != Connection)
  3543. +                    {
  3544. +                        continue;
  3545. +                    }
  3546. +
  3547. +                    ChatDisconnected disconnected = Payloads.CreatePayload<ChatDisconnected>();
  3548. +                    disconnected.PermId = Account.Id;
  3549. +                    disconnected.CellId = channelId;
  3550. +
  3551. +                    SendAsChatReply(MessageContainer.ConnectionServer, disconnected, channelId);
  3552. +                }
  3553. +            }
  3554. +        }
  3555. +
  3556. +        protected override void HandleInitialReply()
  3557. +        {
  3558. +            List<Channel> channels = Program.Channels.GetAll(Database.Channels);
  3559. +
  3560. +            foreach (Channel channel in channels)
  3561. +            {
  3562. +                _channels[channel.Id] = channel;
  3563. +            }
  3564. +
  3565. +            List<uint> ids = _channels.Keys.ToList();
  3566. +            ids.Sort();
  3567. +
  3568. +            foreach (uint id in ids)
  3569. +            {
  3570. +                Channel channel = _channels[id];
  3571. +
  3572. +                ChannelData channelData = new ChannelData()
  3573. +                {
  3574. +                    Name = channel.Name,
  3575. +                    Subject = channel.Subject,
  3576. +                    Creator = channel.Creator,
  3577. +                    Password = channel.Password,
  3578. +                    Protected = channel.Protected,
  3579. +                    Persistent = channel.Persistent,
  3580. +                    Autodelete = channel.AutoDelete,
  3581. +                    Hidden = channel.Hidden,
  3582. +                    CreatorPid = channel.CreatorId,
  3583. +                };
  3584. +
  3585. +                ChannelInfo payload = ChatPayloads.CreateChatPayload<ChannelInfo>();
  3586. +                payload.Data = WriteChannelData(channelData);
  3587. +                payload.CellId = channel.Id;
  3588. +                payload.TicketId = 0;
  3589. +                SendChat(payload);
  3590. +            }
  3591. +        }
  3592. +
  3593. +        private void SendChat(ChatPayloadPrefix payload)
  3594. +        {
  3595. +            ChatPayloads.ChatTypes chatPayloadType = (ChatPayloads.ChatTypes)payload.Id;
  3596. +
  3597. +            Program.LogDebug($" --- Chat Payload sending: {chatPayloadType} ---");
  3598. +            payload.Serialize(Logger);
  3599. +
  3600. +            MemoryStream stream = new MemoryStream();
  3601. +            BinaryWriter writer = new BinaryWriter(stream);
  3602. +
  3603. +            PayloadWriter payloadWriter = new PayloadWriter(writer);
  3604. +            payload.Serialize(payloadWriter);
  3605. +            SendReply(MessageContainer.Types.ApplicationMessage, stream);
  3606. +
  3607. +            writer.Close();
  3608. +            stream.Close();
  3609.          }
  3610.  
  3611.          protected sealed override bool HandlePayloadType(Payloads.Types payloadType, PayloadPrefix payload, PayloadWriter writer)
  3612. @@ -36,6 +116,9 @@ namespace S2Lobby
  3613.                  case Payloads.Types.VerifyChatLogin:
  3614.                      HandleVerifyChatLogin((VerifyChatLogin)payload, writer);
  3615.                      return true;
  3616. +                case Payloads.Types.JoinChatChannel:
  3617. +                    HandleJoinChatChannel((JoinChatChannel)payload, writer);
  3618. +                    return true;
  3619.                  default:
  3620.                      return false;
  3621.              }
  3622. @@ -51,6 +134,9 @@ namespace S2Lobby
  3623.                  case ChatPayloads.ChatTypes.CreateChannel:
  3624.                      ChatHandleCreateChannel((CreateChannel)chatPayload, writer);
  3625.                      break;
  3626. +                case ChatPayloads.ChatTypes.ChatMessage:
  3627. +                    ChatHandleChatMessage((ChatMessage)chatPayload, writer);
  3628. +                    break;
  3629.                  default:
  3630.                      return;
  3631.              }
  3632. @@ -66,36 +152,214 @@ namespace S2Lobby
  3633.  
  3634.          private void HandleVerifyChatLogin(VerifyChatLogin payload, PayloadWriter writer)
  3635.          {
  3636. -            StatusWithId resultPayload = Payloads.CreatePayload<StatusWithId>();
  3637. -            resultPayload.Errorcode = 0;
  3638. -            resultPayload.Errormsg = null;
  3639. -            resultPayload.Id = 0;
  3640. -            resultPayload.TicketId = payload.TicketId;
  3641. -            SendReply(writer, resultPayload);
  3642. +            Account = Program.Accounts.Get(Database.Connection, payload.PermId);
  3643. +            if (Account == null || Account.Id != payload.PermId)
  3644. +            {
  3645. +                StatusWithId resultPayload1 = Payloads.CreatePayload<StatusWithId>();
  3646. +                resultPayload1.Errorcode = 1;
  3647. +                resultPayload1.Errormsg = "Account not found";
  3648. +                resultPayload1.Id = 0;
  3649. +                resultPayload1.TicketId = payload.TicketId;
  3650. +                SendReply(writer, resultPayload1);
  3651. +                return;
  3652. +            }
  3653. +
  3654. +            StatusWithId resultPayload2 = Payloads.CreatePayload<StatusWithId>();
  3655. +            resultPayload2.Errorcode = 0;
  3656. +            resultPayload2.Errormsg = null;
  3657. +            resultPayload2.Id = 0;
  3658. +            resultPayload2.TicketId = payload.TicketId;
  3659. +            SendReply(writer, resultPayload2);
  3660. +        }
  3661. +
  3662. +        private void HandleJoinChatChannel(JoinChatChannel payload, PayloadWriter writer)
  3663. +        {
  3664. +            ConcurrentBag<uint> connections;
  3665. +            if (!_channelConnections.TryGetValue(payload.CellId, out connections)) {
  3666. +                connections = new ConcurrentBag<uint>();
  3667. +                _channelConnections[payload.CellId] = connections;
  3668. +            }
  3669. +
  3670. +            connections.Add(Connection);
  3671. +            Program.LogDebug($" # User {Connection} joins channel {payload.CellId}");
  3672. +
  3673. +            ChannelJoined joined = ChatPayloads.CreateChatPayload<ChannelJoined>();
  3674. +            joined.CellId = payload.CellId;
  3675. +            joined.TicketId = payload.TicketId;
  3676. +            joined.Option = 0;
  3677. +
  3678. +            SendChat(joined);
  3679. +
  3680. +            StatusReply reply = ChatPayloads.CreateChatPayload<StatusReply>();
  3681. +            reply.CellId = payload.CellId;
  3682. +            reply.TicketId = payload.TicketId;
  3683. +            reply.ResultId = 0;
  3684. +
  3685. +            SendChat(reply);
  3686. +
  3687. +            ChatUserInfo userInfo = Payloads.CreatePayload<ChatUserInfo>();
  3688. +            userInfo.PermId = Account.Id;
  3689. +            userInfo.CellId = payload.CellId;
  3690. +            userInfo.Nick = Account.PlayerName;
  3691. +
  3692. +            SendAsChatReply(MessageContainer.ConnectionServer, userInfo, payload.CellId);
  3693. +
  3694. +            uint[] cellConnections = connections.ToArray();
  3695. +            foreach (uint connection in cellConnections)
  3696. +            {
  3697. +                if (connection == Connection)
  3698. +                {
  3699. +                    continue;
  3700. +                }
  3701. +
  3702. +                ChatProcessor processor = Program.GetChatProcessor(connection);
  3703. +                if (processor == null)
  3704. +                {
  3705. +                    continue;
  3706. +                }
  3707. +
  3708. +                ChatUserInfo info = Payloads.CreatePayload<ChatUserInfo>();
  3709. +                info.PermId = processor.Account.Id;
  3710. +                info.CellId = payload.CellId;
  3711. +                info.Nick = processor.Account.PlayerName;
  3712. +
  3713. +                SendChatReplyTo(this, info, payload.CellId);
  3714. +            }
  3715. +        }
  3716. +
  3717. +        private void SendAsChatReply(uint from, PayloadPrefix payload, uint cellId)
  3718. +        {
  3719. +            ConcurrentBag<uint> connections;
  3720. +            if (!_channelConnections.TryGetValue(cellId, out connections))
  3721. +            {
  3722. +                return;
  3723. +            }
  3724. +
  3725. +            MemoryStream stream = new MemoryStream();
  3726. +            BinaryWriter binaryWriter = new BinaryWriter(stream);
  3727. +            PayloadWriter payloadWriter = new PayloadWriter(binaryWriter);
  3728. +
  3729. +            payload.Serialize(payloadWriter, false);
  3730. +            byte[] data = stream.ToArray();
  3731. +
  3732. +            binaryWriter.Close();
  3733. +            stream.Close();
  3734. +
  3735. +            ChatReply chatReply = ChatPayloads.CreateChatPayload<ChatReply>();
  3736. +            chatReply.MessageId = payload.Type2;
  3737. +            chatReply.Data = data;
  3738. +            chatReply.CellId = cellId;
  3739. +            chatReply.FromId = from;
  3740. +            chatReply.Ispropset = true;
  3741. +
  3742. +            uint[] cellConnections = connections.ToArray();
  3743. +            foreach (uint connection in cellConnections)
  3744. +            {
  3745. +                ChatProcessor processor = Program.GetChatProcessor(connection);
  3746. +                if (processor != null)
  3747. +                {
  3748. +                    processor.SendChat(chatReply);
  3749. +                }
  3750. +            }
  3751. +        }
  3752. +
  3753. +        private void SendChatReplyTo(ChatProcessor to, PayloadPrefix payload, uint cellId)
  3754. +        {
  3755. +            MemoryStream stream = new MemoryStream();
  3756. +            BinaryWriter binaryWriter = new BinaryWriter(stream);
  3757. +            PayloadWriter payloadWriter = new PayloadWriter(binaryWriter);
  3758. +
  3759. +            payload.Serialize(payloadWriter, false);
  3760. +            byte[] data = stream.ToArray();
  3761. +
  3762. +            binaryWriter.Close();
  3763. +            stream.Close();
  3764. +
  3765. +            ChatReply chatReply = ChatPayloads.CreateChatPayload<ChatReply>();
  3766. +            chatReply.MessageId = payload.Type2;
  3767. +            chatReply.Data = data;
  3768. +            chatReply.CellId = cellId;
  3769. +            chatReply.FromId = MessageContainer.ConnectionServer;
  3770. +            chatReply.Ispropset = true;
  3771. +
  3772. +            to.SendChat(chatReply);
  3773.          }
  3774.  
  3775.          private void ChatHandleCreateChannel(CreateChannel chatPayload, PayloadWriter writer)
  3776.          {
  3777. -            UnknownData data = ReadUnknownData(chatPayload.Data);
  3778. +            ChannelData data = ReadChannelData(chatPayload.Data);
  3779.  
  3780.              Program.LogDebug($" --- Chat Create Channel Data ---");
  3781.              data.Serialize(Logger);
  3782. +
  3783. +            StatusReply reply = ChatPayloads.CreateChatPayload<StatusReply>();
  3784. +            reply.CellId = 3;
  3785. +            reply.TicketId = chatPayload.TicketId;
  3786. +            reply.ResultId = 0;
  3787. +
  3788. +            SendChat(reply);
  3789. +        }
  3790. +
  3791. +        private void ChatHandleChatMessage(ChatMessage chatPayload, PayloadWriter w)
  3792. +        {
  3793. +            if (chatPayload.MessageId != (ushort)Payloads.Types.ChatPayload)
  3794. +            {
  3795. +                Program.Log($" !!! Received chat message of invalid type {(Payloads.Types)chatPayload.MessageId}");
  3796. +                return;
  3797. +            }
  3798. +
  3799. +            MemoryStream stream = new MemoryStream(chatPayload.Data);
  3800. +            BinaryReader reader = new BinaryReader(stream);
  3801. +            PayloadReader payloadReader = new PayloadReader(reader);
  3802. +
  3803. +            ChatPayload chat = Payloads.CreatePayload<ChatPayload>();
  3804. +            chat.Serialize(payloadReader, false);
  3805. +
  3806. +            reader.Close();
  3807. +            stream.Close();
  3808. +
  3809. +            Program.LogDebug($" + Chat Payload +");
  3810. +            chat.Serialize(Logger);
  3811. +
  3812. +            ChatPayload resultPayload = Payloads.CreatePayload<ChatPayload>();
  3813. +            resultPayload.Mode = chat.Mode;
  3814. +            resultPayload.Txt = chat.Txt;
  3815. +            resultPayload.TicketId = chat.TicketId;
  3816. +            resultPayload.FromId = chat.FromId;
  3817. +
  3818. +            SendAsChatReply(Account.Id, resultPayload, chatPayload.CellId);
  3819.          }
  3820.  
  3821. -        private UnknownData ReadUnknownData(byte[] data)
  3822. +        private ChannelData ReadChannelData(byte[] data)
  3823.          {
  3824.              MemoryStream stream = new MemoryStream(data);
  3825.              BinaryReader reader = new BinaryReader(stream);
  3826.  
  3827.              Serializer dataReader = new PayloadReader(reader);
  3828.  
  3829. -            UnknownData unknownData = new UnknownData();
  3830. -            unknownData.Serialize(dataReader);
  3831. +            ChannelData channelData = new ChannelData();
  3832. +            channelData.Serialize(dataReader);
  3833.  
  3834.              reader.Close();
  3835.              stream.Close();
  3836.  
  3837. -            return unknownData;
  3838. +            return channelData;
  3839. +        }
  3840. +
  3841. +        private byte[] WriteChannelData(ChannelData data)
  3842. +        {
  3843. +            MemoryStream stream = new MemoryStream();
  3844. +            BinaryWriter writer = new BinaryWriter(stream);
  3845. +
  3846. +            Serializer dataWriter = new PayloadWriter(writer);
  3847. +            data.Serialize(dataWriter);
  3848. +
  3849. +            byte[] result = stream.ToArray();
  3850. +
  3851. +            writer.Close();
  3852. +            stream.Close();
  3853. +
  3854. +            return result;
  3855.          }
  3856.      }
  3857.  }
  3858. diff --git a/S2Lobby/Database.cs b/S2Lobby/Database.cs
  3859. index 6dea42a..fe372fb 100644
  3860. --- a/S2Lobby/Database.cs
  3861. +++ b/S2Lobby/Database.cs
  3862. @@ -7,6 +7,22 @@ namespace S2Lobby
  3863.      {
  3864.          public readonly SQLiteConnection Connection;
  3865.  
  3866. +        private SQLiteConnection _channelDB;
  3867. +
  3868. +        public SQLiteConnection Channels
  3869. +        {
  3870. +            get
  3871. +            {
  3872. +                if (_channelDB == null)
  3873. +                {
  3874. +                    string connectionString = "Data Source=channels.sqlite;";
  3875. +                    _channelDB = new SQLiteConnection(connectionString);
  3876. +                    _channelDB.Open();
  3877. +                }
  3878. +                return _channelDB;
  3879. +            }
  3880. +        }
  3881. +
  3882.          public Database()
  3883.          {
  3884.              string connectionString = "Data Source=accounts.sqlite;";
  3885. @@ -14,10 +30,23 @@ namespace S2Lobby
  3886.              Connection.Open();
  3887.          }
  3888.  
  3889. +        public void CloseChannelDB()
  3890. +        {
  3891. +            if (_channelDB != null)
  3892. +            {
  3893. +                _channelDB.Close();
  3894. +                _channelDB.Dispose();
  3895. +                _channelDB = null;
  3896. +            }
  3897. +        }
  3898. +
  3899.          public void Dispose()
  3900.          {
  3901. +            CloseChannelDB();
  3902. +
  3903.              Connection.Close();
  3904.              Connection.Dispose();
  3905.          }
  3906. +
  3907.      }
  3908.  }
  3909. diff --git a/S2Lobby/LobbyProcessor.cs b/S2Lobby/LobbyProcessor.cs
  3910. index dea2659..3ef4b1d 100644
  3911. --- a/S2Lobby/LobbyProcessor.cs
  3912. +++ b/S2Lobby/LobbyProcessor.cs
  3913. @@ -1,5 +1,7 @@
  3914. -using System.Collections.Concurrent;
  3915. +using System;
  3916. +using System.Collections.Concurrent;
  3917.  using System.Collections.Generic;
  3918. +
  3919.  using S2Library.Protocol;
  3920.  
  3921.  namespace S2Lobby
  3922. @@ -23,6 +25,7 @@ namespace S2Lobby
  3923.              if (_server != null)
  3924.              {
  3925.                  Program.Servers.Remove(_server.Id);
  3926. +                NotifyUnlistServer(_server.Id, _server.Running);
  3927.                  _server = null;
  3928.              }
  3929.          }
  3930. @@ -81,6 +84,12 @@ namespace S2Lobby
  3931.                  case Payloads.Types.UpdateServerInfo:
  3932.                      HandleUpdateServerInfo((UpdateServerInfo)payload, writer);
  3933.                      return true;
  3934. +                case Payloads.Types.PlayerJoinedServer:
  3935. +                    HandlePlayerJoinedServer((PlayerJoinedServer)payload, writer);
  3936. +                    return true;
  3937. +                case Payloads.Types.PlayerLeftServer:
  3938. +                    HandlePlayerLeftServer((PlayerLeftServer)payload, writer);
  3939. +                    return true;
  3940.                  default:
  3941.                      return false;
  3942.              }
  3943. @@ -345,6 +354,16 @@ namespace S2Lobby
  3944.              _server.Running = payload.Running;
  3945.              _server.LockedConfig = payload.LockedConfig;
  3946.              _server.Data = payload.Data;
  3947. +            if (payload.Cipher != null)
  3948. +            {
  3949. +                byte[] serverPassword = Crypto.HandleCipher(payload.Cipher, SessionKey);
  3950. +                int length = System.Array.FindIndex(serverPassword, b => b == 0);
  3951. +                string password = System.Text.Encoding.ASCII.GetString(serverPassword, 0, length);
  3952. +                Program.LogDebug($" Server password is: {password}");
  3953. +
  3954. +                _server.NeedsPassword = true;
  3955. +                _server.Password = password;
  3956. +            }
  3957.  
  3958.              SendServerUpdates();
  3959.  
  3960. @@ -398,7 +417,7 @@ namespace S2Lobby
  3961.              resultPayload1.ServerSubtype = server.SubType;
  3962.              resultPayload1.Version = "1.1";
  3963.              resultPayload1.MaxPlayers = server.MaxPlayers;
  3964. -            resultPayload1.CurPlayers = 0;
  3965. +            resultPayload1.CurPlayers = (ushort)server.Players.Count;
  3966.              resultPayload1.MaxSpectators = 0;
  3967.              resultPayload1.CurSpectators = 0;
  3968.              resultPayload1.AiPlayers = 0;
  3969. @@ -410,6 +429,7 @@ namespace S2Lobby
  3970.              resultPayload1.Running = server.Running;
  3971.              resultPayload1.LockedConfig = server.LockedConfig;
  3972.              resultPayload1.Data = server.Data; // Crypto.BytesFromHexString("25000000785e63607264d26567c00f001041007a");
  3973. +            resultPayload1.PasswordRequired = server.NeedsPassword;
  3974.              resultPayload1.TicketId = ticketId;
  3975.              return resultPayload1;
  3976.          }
  3977. @@ -507,6 +527,21 @@ namespace S2Lobby
  3978.              _server.Running = payload.Running;
  3979.              _server.LockedConfig = payload.LockedConfig;
  3980.              _server.Data = payload.Data;
  3981. +            if (payload.Cipher == null)
  3982. +            {
  3983. +                _server.NeedsPassword = false;
  3984. +                _server.Password = null;
  3985. +            }
  3986. +            else
  3987. +            {
  3988. +                byte[] serverPassword = Crypto.HandleCipher(payload.Cipher, SessionKey);
  3989. +                int length = System.Array.FindIndex(serverPassword, b => b == 0);
  3990. +                string password = System.Text.Encoding.ASCII.GetString(serverPassword, 0, length);
  3991. +                Program.LogDebug($" Server password is: {password}");
  3992. +
  3993. +                _server.NeedsPassword = true;
  3994. +                _server.Password = password;
  3995. +            }
  3996.  
  3997.              SendServerUpdates();
  3998.  
  3999. @@ -517,6 +552,29 @@ namespace S2Lobby
  4000.              SendReply(writer, resultPayload2);
  4001.          }
  4002.  
  4003. +        private void HandlePlayerJoinedServer(PlayerJoinedServer payload, PayloadWriter writer)
  4004. +        {
  4005. +            if (_server == null)
  4006. +            {
  4007. +                return;
  4008. +            }
  4009. +
  4010. +            _server.Players.TryAdd(payload.PermId, Connection);
  4011. +            SendServerUpdates();
  4012. +        }
  4013. +
  4014. +        private void HandlePlayerLeftServer(PlayerLeftServer payload, PayloadWriter writer)
  4015. +        {
  4016. +            if (_server == null)
  4017. +            {
  4018. +                return;
  4019. +            }
  4020. +
  4021. +            uint dummy;
  4022. +            _server.Players.TryRemove(payload.PermId, out dummy);
  4023. +            SendServerUpdates();
  4024. +        }
  4025. +
  4026.          private void SendServerUpdates()
  4027.          {
  4028.              ServerInfo serverInfo = CreateServerInfoPayload(_server, 0);
  4029. @@ -526,5 +584,17 @@ namespace S2Lobby
  4030.                  SendToLobbyConnection(server.Key, serverInfo);
  4031.              }
  4032.          }
  4033. +
  4034. +        private void NotifyUnlistServer(uint serverId, bool running)
  4035. +        {
  4036. +            UnlistServer unlistInfo = Payloads.CreatePayload<UnlistServer>();
  4037. +            unlistInfo.ServerId = serverId;
  4038. +            unlistInfo.Running = running;
  4039. +            KeyValuePair<uint, uint>[] servers = ServerUpdateReceivers.ToArray();
  4040. +            foreach (KeyValuePair<uint, uint> server in servers)
  4041. +            {
  4042. +                SendToLobbyConnection(server.Key, unlistInfo);
  4043. +            }
  4044. +        }
  4045.      }
  4046.  }
  4047. diff --git a/S2Lobby/NetworkProcessor.cs b/S2Lobby/NetworkProcessor.cs
  4048. index 15c69a3..ac823a4 100644
  4049. --- a/S2Lobby/NetworkProcessor.cs
  4050. +++ b/S2Lobby/NetworkProcessor.cs
  4051. @@ -1,6 +1,7 @@
  4052.  using System;
  4053.  using System.Collections.Concurrent;
  4054.  using System.IO;
  4055. +
  4056.  using S2Library.Protocol;
  4057.  
  4058.  namespace S2Lobby
  4059. @@ -197,7 +198,11 @@ namespace S2Lobby
  4060.                  writer.Write(handshake.Unknown1);
  4061.  
  4062.                  SendReply(MessageContainer.Types.HandShakeConnected, writeStream);
  4063. -                HandleInitialReply(writeStream);
  4064. +
  4065. +                writer.Close();
  4066. +                writeStream.Close();
  4067. +
  4068. +                HandleInitialReply();
  4069.              }
  4070.              else if (Message.Type == MessageContainer.Types.ApplicationMessage)
  4071.              {
  4072. @@ -208,6 +213,12 @@ namespace S2Lobby
  4073.                  BinaryWriter writer = new BinaryWriter(writeStream);
  4074.  
  4075.                  HandleMessage(reader, writer);
  4076. +
  4077. +                writer.Close();
  4078. +                writeStream.Close();
  4079. +
  4080. +                reader.Close();
  4081. +                readStream.Close();
  4082.              }
  4083.              else if (Message.Type == MessageContainer.Types.Ping)
  4084.              {
  4085. @@ -219,7 +230,7 @@ namespace S2Lobby
  4086.              }
  4087.          }
  4088.  
  4089. -        protected virtual void HandleInitialReply(MemoryStream replyStream)
  4090. +        protected virtual void HandleInitialReply()
  4091.          {
  4092.          }
  4093.  
  4094. diff --git a/S2Lobby/Program.cs b/S2Lobby/Program.cs
  4095. index 4930b3e..28d1acd 100644
  4096. --- a/S2Lobby/Program.cs
  4097. +++ b/S2Lobby/Program.cs
  4098. @@ -1,6 +1,7 @@
  4099.  using System;
  4100.  using System.Collections.Concurrent;
  4101.  using System.IO;
  4102. +
  4103.  using S2Library.Connection;
  4104.  using S2Library.Protocol;
  4105.  
  4106. @@ -13,8 +14,8 @@ namespace S2Lobby
  4107.              new Program().Run();
  4108.          }
  4109.  
  4110. -        private const uint LobbyPort = 6800;
  4111. -        public const uint ChatPort = 6801;
  4112. +        private uint LobbyPort { get; set; } = 6800;
  4113. +        public uint ChatPort { get; private set; } = 6801;
  4114.  
  4115.          public string Ip { get; private set; } = "127.0.0.1";
  4116.  
  4117. @@ -36,6 +37,7 @@ namespace S2Lobby
  4118.  
  4119.          public static readonly Accounts Accounts = new Accounts();
  4120.          public static readonly Servers Servers = new Servers();
  4121. +        public static readonly Channels Channels = new Channels();
  4122.  
  4123.          private void Run()
  4124.          {
  4125. @@ -46,6 +48,23 @@ namespace S2Lobby
  4126.                  {
  4127.                      Ip = lines[0];
  4128.                  }
  4129. +                if (lines.Length > 1)
  4130. +                {
  4131. +                    uint port;
  4132. +                    if (UInt32.TryParse(lines[1], out port))
  4133. +                    {
  4134. +                        LobbyPort = port;
  4135. +                        ChatPort = port + 1;
  4136. +                    }
  4137. +                }
  4138. +                if (lines.Length > 2)
  4139. +                {
  4140. +                    uint port;
  4141. +                    if (UInt32.TryParse(lines[2], out port))
  4142. +                    {
  4143. +                        ChatPort = port;
  4144. +                    }
  4145. +                }
  4146.              }
  4147.  
  4148.              lock (_sync)
  4149. @@ -61,6 +80,7 @@ namespace S2Lobby
  4150.  
  4151.              Accounts.Init(this);
  4152.              Servers.Init(this);
  4153. +            Channels.Init(this);
  4154.  
  4155.              _lobbyConnectionManager.Connected += LobbyConnectionManagerOnConnected;
  4156.              _lobbyConnectionManager.ConnectFailed += LobbyConnectionManagerOnConnectFailed;
  4157. @@ -183,9 +203,9 @@ namespace S2Lobby
  4158.                  NetworkProcessor incomingLobbyProcessor;
  4159.                  if (!_incomingLobbyProcessors.TryRemove(args.Conn.Id, out incomingLobbyProcessor))
  4160.                  {
  4161. -                    incomingLobbyProcessor.Close();
  4162.                      Log($" Can't remove from incoming lobby processors: {args.Conn.Id}");
  4163.                  }
  4164. +                incomingLobbyProcessor.Close();
  4165.  
  4166.                  ConcurrentQueue<byte[]> outgoingLobbyQueue;
  4167.                  if (!_outgoingLobbyQueues.TryRemove(args.Conn.Id, out outgoingLobbyQueue))
  4168. @@ -210,9 +230,9 @@ namespace S2Lobby
  4169.                  NetworkProcessor incomingChatProcessor;
  4170.                  if (!_incomingChatProcessors.TryRemove(args.Conn.Id, out incomingChatProcessor))
  4171.                  {
  4172. -                    incomingChatProcessor.Close();
  4173.                      Log($" Can't remove from incoming chat processors: {args.Conn.Id}");
  4174.                  }
  4175. +                incomingChatProcessor.Close();
  4176.  
  4177.                  ConcurrentQueue<byte[]> outgoingChatQueue;
  4178.                  if (!_outgoingChatQueues.TryRemove(args.Conn.Id, out outgoingChatQueue))
  4179. @@ -237,9 +257,9 @@ namespace S2Lobby
  4180.                  NetworkProcessor incomingLobbyProcessor;
  4181.                  if (!_incomingLobbyProcessors.TryRemove(args.Conn.Id, out incomingLobbyProcessor))
  4182.                  {
  4183. -                    incomingLobbyProcessor.Close();
  4184.                      Log($" Can't remove from incoming lobby processors: {args.Conn.Id}");
  4185.                  }
  4186. +                incomingLobbyProcessor.Close();
  4187.  
  4188.                  ConcurrentQueue<byte[]> outgoingLobbyQueue;
  4189.                  if (!_outgoingLobbyQueues.TryRemove(args.Conn.Id, out outgoingLobbyQueue))
  4190. @@ -264,9 +284,9 @@ namespace S2Lobby
  4191.                  NetworkProcessor incomingChatProcessor;
  4192.                  if (!_incomingChatProcessors.TryRemove(args.Conn.Id, out incomingChatProcessor))
  4193.                  {
  4194. -                    incomingChatProcessor.Close();
  4195.                      Log($" Can't remove from incoming chat processors: {args.Conn.Id}");
  4196.                  }
  4197. +                incomingChatProcessor.Close();
  4198.  
  4199.                  ConcurrentQueue<byte[]> outgoingChatQueue;
  4200.                  if (!_outgoingChatQueues.TryRemove(args.Conn.Id, out outgoingChatQueue))
  4201. @@ -384,23 +404,23 @@ namespace S2Lobby
  4202.              }
  4203.          }
  4204.  
  4205. -        public NetworkProcessor GetLobbyProcessor(uint connId)
  4206. +        public LobbyProcessor GetLobbyProcessor(uint connId)
  4207.          {
  4208.              NetworkProcessor incomingLobbyProcessor;
  4209.              if (_incomingLobbyProcessors.TryGetValue(connId, out incomingLobbyProcessor))
  4210.              {
  4211. -                return incomingLobbyProcessor;
  4212. +                return incomingLobbyProcessor as LobbyProcessor;
  4213.              }
  4214.  
  4215.              return null;
  4216.          }
  4217.  
  4218. -        public NetworkProcessor GetChatProcessor(uint connId)
  4219. +        public ChatProcessor GetChatProcessor(uint connId)
  4220.          {
  4221.              NetworkProcessor incomingChatProcessor;
  4222.              if (_incomingChatProcessors.TryGetValue(connId, out incomingChatProcessor))
  4223.              {
  4224. -                return incomingChatProcessor;
  4225. +                return incomingChatProcessor as ChatProcessor;
  4226.              }
  4227.  
  4228.              return null;
  4229. diff --git a/S2Lobby/S2Lobby.csproj b/S2Lobby/S2Lobby.csproj
  4230. index 9f8006e..16344cf 100644
  4231. --- a/S2Lobby/S2Lobby.csproj
  4232. +++ b/S2Lobby/S2Lobby.csproj
  4233. @@ -48,6 +48,7 @@
  4234.      <Reference Include="System.Xml" />
  4235.    </ItemGroup>
  4236.    <ItemGroup>
  4237. +    <Compile Include="Channels.cs" />
  4238.      <Compile Include="Accounts.cs" />
  4239.      <Compile Include="ChatProcessor.cs" />
  4240.      <Compile Include="Database.cs" />
  4241. diff --git a/S2Lobby/ServerProcessor.cs b/S2Lobby/ServerProcessor.cs
  4242. index 1690daf..bf9f027 100644
  4243. --- a/S2Lobby/ServerProcessor.cs
  4244. +++ b/S2Lobby/ServerProcessor.cs
  4245. @@ -1,5 +1,6 @@
  4246.  using System.IO;
  4247.  using System.Text;
  4248. +
  4249.  using S2Library.Protocol;
  4250.  
  4251.  namespace S2Lobby
  4252. @@ -12,6 +13,7 @@ namespace S2Lobby
  4253.          protected Account Account;
  4254.  
  4255.          private byte[] _sharedSecret;
  4256. +        protected byte[] SessionKey;
  4257.  
  4258.          public ServerProcessor(Program program, uint connection) : base(program, connection)
  4259.          {
  4260. @@ -26,7 +28,7 @@ namespace S2Lobby
  4261.  
  4262.          protected bool SendToLobbyConnection(uint connection, PayloadPrefix message)
  4263.          {
  4264. -            NetworkProcessor processor = Program.GetLobbyProcessor(connection);
  4265. +            LobbyProcessor processor = Program.GetLobbyProcessor(connection);
  4266.              if (processor == null)
  4267.              {
  4268.                  return false;
  4269. @@ -165,7 +167,7 @@ namespace S2Lobby
  4270.          {
  4271.              byte[] loginCipher = payload.Cipher;
  4272.  
  4273. -            byte[] result = Crypto.HandleUser(loginCipher, _sharedSecret);
  4274. +            byte[] result = Crypto.HandleCipher(loginCipher, _sharedSecret);
  4275.              Program.LogDebug($" User: {Serializer.DumpBytes(result)}");
  4276.  
  4277.              MemoryStream stream = new MemoryStream(result);
  4278. @@ -249,7 +251,8 @@ namespace S2Lobby
  4279.                  return;
  4280.              }
  4281.  
  4282. -            byte[] secret = Crypto.HandleSessionKey(Crypto.CreateSecretKey(), _sharedSecret);
  4283. +            SessionKey = Crypto.CreateSecretKey();
  4284. +            byte[] secret = Crypto.HandleSessionKey(SessionKey, _sharedSecret);
  4285.  
  4286.              LoginReplyCipher resultPayload2 = Payloads.CreatePayload<LoginReplyCipher>();
  4287.              resultPayload2.PermId = Account.Id;
  4288. @@ -264,7 +267,7 @@ namespace S2Lobby
  4289.          {
  4290.              byte[] loginCipher = payload.Cipher;
  4291.  
  4292. -            byte[] result = Crypto.HandleUser(loginCipher, _sharedSecret);
  4293. +            byte[] result = Crypto.HandleCipher(loginCipher, _sharedSecret);
  4294.              Program.LogDebug($" User: {Serializer.DumpBytes(result)}");
  4295.  
  4296.              MemoryStream stream = new MemoryStream(result);
  4297. @@ -331,7 +334,8 @@ namespace S2Lobby
  4298.                  return;
  4299.              }
  4300.  
  4301. -            byte[] secret = Crypto.HandleSessionKey(Crypto.CreateSecretKey(), _sharedSecret);
  4302. +            SessionKey = Crypto.CreateSecretKey();
  4303. +            byte[] secret = Crypto.HandleSessionKey(SessionKey, _sharedSecret);
  4304.  
  4305.              LoginReplyCipher resultPayload = Payloads.CreatePayload<LoginReplyCipher>();
  4306.              resultPayload.PermId = Account.Id;
  4307. @@ -346,7 +350,7 @@ namespace S2Lobby
  4308.          {
  4309.              byte[] loginCipher = payload.Cipher;
  4310.  
  4311. -            byte[] result = Crypto.HandleUser(loginCipher, _sharedSecret);
  4312. +            byte[] result = Crypto.HandleCipher(loginCipher, _sharedSecret);
  4313.              Program.LogDebug($" User: {Serializer.DumpBytes(result)}");
  4314.  
  4315.              MemoryStream stream = new MemoryStream(result);
  4316. @@ -413,7 +417,8 @@ namespace S2Lobby
  4317.                  return;
  4318.              }
  4319.  
  4320. -            byte[] secret = Crypto.HandleSessionKey(Crypto.CreateSecretKey(), _sharedSecret);
  4321. +            SessionKey = Crypto.CreateSecretKey();
  4322. +            byte[] secret = Crypto.HandleSessionKey(SessionKey, _sharedSecret);
  4323.  
  4324.              LoginReplyCipher resultPayload = Payloads.CreatePayload<LoginReplyCipher>();
  4325.              resultPayload.PermId = Account.Id;
  4326. diff --git a/S2Lobby/Servers.cs b/S2Lobby/Servers.cs
  4327. index 81d31d0..344b605 100644
  4328. --- a/S2Lobby/Servers.cs
  4329. +++ b/S2Lobby/Servers.cs
  4330. @@ -92,5 +92,9 @@ namespace S2Lobby
  4331.          public bool Running;
  4332.          public bool LockedConfig;
  4333.          public byte[] Data;
  4334. +        public bool NeedsPassword;
  4335. +        public string Password;
  4336. +
  4337. +        public ConcurrentDictionary<uint, uint> Players = new ConcurrentDictionary<uint, uint>();
  4338.      }
  4339.  }
  4340. --
RAW Paste Data