public static MapInfoPacket Read(NBufferReader reader) { var ret = new MapInfoPacket(); ret.Width = reader.ReadUInt32(); ret.Height = reader.ReadUInt32(); ret.Name = reader.ReadUTF(); ret.Name2 = reader.ReadUTF(); ret.Seed = reader.ReadUInt32(); ret.Background = reader.ReadUInt32(); ret.Diffculty = reader.ReadUInt32(); ret.AllowTeleport = reader.ReadBoolean(); ret.ShowDisplays = reader.ReadBoolean(); ret.ClientXML = new string[reader.ReadUInt16()]; for (int i = 0; i < ret.ClientXML.Length; i++) { ret.ClientXML[i] = reader.Read32UTF(); } ret.ExtraXML = new string[reader.ReadUInt16()]; for (int i = 0; i < ret.ExtraXML.Length; i++) { ret.ExtraXML[i] = reader.Read32UTF(); } return(ret); }
private bool OnServerPacketReceived(ref byte id, ref byte[] content) { if (id == PacketTable.RECONNECT) { ReconnPacket reconn = ReconnPacket.Read(new NBufferReader(content)); var endPoint = (IPEndPoint)server.Client.RemoteEndPoint; int reconnId = rand.Next(); while (!reconnKeys.TryAdd(reconnId, Tuple.Create( string.IsNullOrEmpty(reconn.Host) ? endPoint.Address.ToString() : reconn.Host, reconn.Port == 0xffffffff ? endPoint.Port : (int)reconn.Port, reconn.Key))) { reconnId = rand.Next(); } if (reconn.Name.StartsWith("NexusPortal.")) { var entry = Dns.GetHostEntry(reconn.Host); serverNames[entry.AddressList[0].ToString()] = reconn.Name; } AppendLog("Reconnect to '{0}'.", reconnKeys[reconnId].Item1); reconn.Host = local; reconn.Port = 2050; reconn.Key = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(reconnId)); content = NWriter.Write(writer => reconn.Write(writer)); } else if (id == PacketTable.MAPINFO) { MapInfoPacket p = MapInfoPacket.Read(new NBufferReader(content)); if (ConnectionName == null) { ConnectionName = p.Name; } World = GameWorld.CreateWorld(p, this); if (MapCreated != null) { MapCreated(this, EventArgs.Empty); } } bool ret = true; var e = new PacketEventArgs(id, content); if (ServerPacketReceived != null) { ServerPacketReceived(this, e); id = e.ID; content = e.Content; ret &= e.Send; } if (ret && World != null) { World.OnPacketReceived(this, e); } if (ret && PostServerPacketReceived != null) { PostServerPacketReceived(this, e); id = e.ID; content = e.Content; ret &= e.Send; } return(ret); }