///<summary> ///Creates a new object that is a copy of the current instance. ///</summary> /// ///<returns> ///A new object that is a copy of this instance. ///</returns> ///<filterpriority>2</filterpriority> public object Clone() { GameServer srv = new GameServer(); srv.code = code; srv.endPoint = endPoint; srv.gameType = gameType; srv.isActive = isActive; srv.map = map; srv.playersCount = playersCount; srv.serverName = serverName; srv.startTime = srv.startTime; return srv; }
private void serverInfoListener(object parameters) { GameServer srv = null; object[] param = null; Socket handler = null; byte[] buf = null; try { param = (object[]) parameters; handler = (Socket) param[0]; buf = (byte[]) param[1]; } catch (Exception ex) { LogEvent(EventType.ERROR, ex, "server handler has incorrect parameters"); if (handler != null) { handler.Close(5); } return; } uint packetLength, unknown1; while (true) { using (var mem = new MemoryStream(buf)) { mem.Seek(0, SeekOrigin.Begin); var binRead = new BinaryReader(mem); packetLength = binRead.ReadUInt32(); unknown1 = binRead.ReadUInt32(); var decoded = new byte[packetLength]; Buffer.BlockCopy(buf, (int) binRead.BaseStream.Position, decoded, 0, (int) packetLength); Console.WriteLine("recieved packet"); decoded = NetworkHelper.PacketDecoding(decoded); NetworkHelper.DumpArray(Console.OpenStandardOutput(), decoded); using (var mstr = new MemoryStream(decoded)) { var br = new BinaryReader(mstr); byte packetID = br.ReadByte(); switch (packetID) { /// bad code warning! /// section below contains processing of 2 in series case 0xD1: { //ident server br.BaseStream.Seek(5, SeekOrigin.Begin); byte length = br.ReadByte(); br.BaseStream.Seek(1, SeekOrigin.Current); string addr = Encoding.Default.GetString(br.ReadBytes(length)); string[] arr = addr.Split(':'); var buffer = new byte[0x8e]; EndPoint ep = new IPEndPoint(IPAddress.Parse(arr[0]), Int32.Parse(arr[1])); srv = new GameServer(); srv.EndPoint = ep; srv.Code = ep.ToString(); handler.Send(PrepareMessageToSend(serverWelcome())); break; } case 0xd2: { if (srv == null) { break; } byte pID = br.ReadByte(); byte pcount = br.ReadByte(); byte difficulty = br.ReadByte(); byte srvType = br.ReadByte(); byte mapSize = br.ReadByte(); if (pcount == 0xff && difficulty == 0xff && srvType == 0xff && mapSize == 0xff) { lock (registeredServers) { handler.Close(5); registeredServers.Remove(srv); srv = null; return; break; } } byte ln = br.ReadByte(); br.BaseStream.Seek(1, SeekOrigin.Current); string mapName = Encoding.Default.GetString(br.ReadBytes(ln)); int idx = -1; if (registeredServers.Contains(srv)) { idx = registeredServers.IndexOf(srv); } srv.PlayersCount = pcount; srv.ServerType = (ServerType) srvType; srv.Map = new GameMap(); srv.Map.Difficulty = (Difficulty) difficulty; srv.Map.Name = mapName; srv.Map.Height = srv.Map.Width = mapSize; if (idx == -1) { registeredServers.Add(srv); } else { registeredServers[idx] = srv; } handler.Send(PrepareMessageToSend(null)); break; } case 0xd4: // arena results { LogEvent(EventType.DEBUG, "arena results not supported"); handler.Send(PrepareMessageToSend(null)); break; } case 0xE0: { // chr_recv update character ///structure: /// 0x00 - packet type /// 0x01 - size /// 0x02 - charID 1 /// 0x06 - charID 2 /// 0x0A - log_size /// 0x0B - chr_size /// 0x12 - characterData /// 0x12 + chrSize - log_name byte size = br.ReadByte(); if (size == 1) { break; } Int32 characterID1 = br.ReadInt32(); Int32 characterID2 = br.ReadInt32(); Int32 logSize = br.ReadInt32(); byte chr_size = br.ReadByte(); byte[] chrData = br.ReadBytes(chr_size); string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize)); var chr = new HatCharacter(); // stub if (chr == null) { chr = new HatCharacter(); chr.IDs[0] = characterID1; chr.IDs[1] = characterID2; chr.CharacterData = chrData; } else { chr.CharacterData = chrData; } //saving break; } case 0xcf: // chr_recv return character { ///structure: /// 0x00 - packet type /// 0x01 - size /// 0x02 - charID 1 /// 0x06 - charID 2 /// 0x0A - log_size /// 0x0B - chr_size /// 0x12 - characterData /// 0x12 + chrSize - log_name byte size = br.ReadByte(); Int32 characterID1 = br.ReadInt32(); Int32 characterID2 = br.ReadInt32(); Int32 logSize = br.ReadInt32(); byte chr_size = br.ReadByte(); byte[] chrData = br.ReadBytes(chr_size); string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize)); var chr = new HatCharacter(); if (chr == null) { chr = new HatCharacter(); chr.IDs[0] = characterID1; chr.IDs[1] = characterID2; chr.CharacterData = chrData; } else { chr.CharacterData = chrData; } //save handler.Send(PrepareMessageToSend(simpleServerEntrance(loginIP))); break; } case 0xd8: // accept character case 0xd9: // reject character case 0xE1: // server reconnect case 0x64: default: //keep alive Console.WriteLine("default response send"); handler.Send(PrepareMessageToSend(null)); break; } } } try { handler.Receive(buf); } catch { return; } } }
private void serverInfoListener(object parameters) { GameServer srv = null; object[] param = null; Socket handler = null; byte[] buf = null; try { param = (object[])parameters; handler = (Socket)param[0]; buf = (byte[])param[1]; } catch (Exception ex) { LogEvent(EventType.ERROR, ex, "server handler has incorrect parameters"); if (handler != null) { handler.Close(5); } return; } uint packetLength, unknown1; while (true) { using (var mem = new MemoryStream(buf)) { mem.Seek(0, SeekOrigin.Begin); var binRead = new BinaryReader(mem); packetLength = binRead.ReadUInt32(); unknown1 = binRead.ReadUInt32(); var decoded = new byte[packetLength]; Buffer.BlockCopy(buf, (int)binRead.BaseStream.Position, decoded, 0, (int)packetLength); Console.WriteLine("recieved packet"); decoded = NetworkHelper.PacketDecoding(decoded); NetworkHelper.DumpArray(Console.OpenStandardOutput(), decoded); using (var mstr = new MemoryStream(decoded)) { var br = new BinaryReader(mstr); byte packetID = br.ReadByte(); switch (packetID) { /// bad code warning! /// section below contains processing of 2 in series case 0xD1: { //ident server br.BaseStream.Seek(5, SeekOrigin.Begin); byte length = br.ReadByte(); br.BaseStream.Seek(1, SeekOrigin.Current); string addr = Encoding.Default.GetString(br.ReadBytes(length)); string[] arr = addr.Split(':'); var buffer = new byte[0x8e]; EndPoint ep = new IPEndPoint(IPAddress.Parse(arr[0]), Int32.Parse(arr[1])); srv = new GameServer(); srv.EndPoint = ep; srv.Code = ep.ToString(); handler.Send(PrepareMessageToSend(serverWelcome())); break; } case 0xd2: { if (srv == null) { break; } byte pID = br.ReadByte(); byte pcount = br.ReadByte(); byte difficulty = br.ReadByte(); byte srvType = br.ReadByte(); byte mapSize = br.ReadByte(); if (pcount == 0xff && difficulty == 0xff && srvType == 0xff && mapSize == 0xff) { lock (registeredServers) { handler.Close(5); registeredServers.Remove(srv); srv = null; return; break; } } byte ln = br.ReadByte(); br.BaseStream.Seek(1, SeekOrigin.Current); string mapName = Encoding.Default.GetString(br.ReadBytes(ln)); int idx = -1; if (registeredServers.Contains(srv)) { idx = registeredServers.IndexOf(srv); } srv.PlayersCount = pcount; srv.ServerType = (ServerType)srvType; srv.Map = new GameMap(); srv.Map.Difficulty = (Difficulty)difficulty; srv.Map.Name = mapName; srv.Map.Height = srv.Map.Width = mapSize; if (idx == -1) { registeredServers.Add(srv); } else { registeredServers[idx] = srv; } handler.Send(PrepareMessageToSend(null)); break; } case 0xd4: // arena results { LogEvent(EventType.DEBUG, "arena results not supported"); handler.Send(PrepareMessageToSend(null)); break; } case 0xE0: { // chr_recv update character ///structure: /// 0x00 - packet type /// 0x01 - size /// 0x02 - charID 1 /// 0x06 - charID 2 /// 0x0A - log_size /// 0x0B - chr_size /// 0x12 - characterData /// 0x12 + chrSize - log_name byte size = br.ReadByte(); if (size == 1) { break; } Int32 characterID1 = br.ReadInt32(); Int32 characterID2 = br.ReadInt32(); Int32 logSize = br.ReadInt32(); byte chr_size = br.ReadByte(); byte[] chrData = br.ReadBytes(chr_size); string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize)); var chr = new HatCharacter(); // stub if (chr == null) { chr = new HatCharacter(); chr.IDs[0] = characterID1; chr.IDs[1] = characterID2; chr.CharacterData = chrData; } else { chr.CharacterData = chrData; } //saving break; } case 0xcf: // chr_recv return character { ///structure: /// 0x00 - packet type /// 0x01 - size /// 0x02 - charID 1 /// 0x06 - charID 2 /// 0x0A - log_size /// 0x0B - chr_size /// 0x12 - characterData /// 0x12 + chrSize - log_name byte size = br.ReadByte(); Int32 characterID1 = br.ReadInt32(); Int32 characterID2 = br.ReadInt32(); Int32 logSize = br.ReadInt32(); byte chr_size = br.ReadByte(); byte[] chrData = br.ReadBytes(chr_size); string loginIP = Encoding.Default.GetString(br.ReadBytes(logSize)); var chr = new HatCharacter(); if (chr == null) { chr = new HatCharacter(); chr.IDs[0] = characterID1; chr.IDs[1] = characterID2; chr.CharacterData = chrData; } else { chr.CharacterData = chrData; } //save handler.Send(PrepareMessageToSend(simpleServerEntrance(loginIP))); break; } case 0xd8: // accept character case 0xd9: // reject character case 0xE1: // server reconnect case 0x64: default: //keep alive Console.WriteLine("default response send"); handler.Send(PrepareMessageToSend(null)); break; } } } try { handler.Receive(buf); } catch { return; } } }