Beispiel #1
0
        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);
        }