Example #1
0
        private void Initialize()
        {
            using (var reader = new FastBigEndianReader(File.ReadAllBytes(m_uri)))
            {
                int indexPos = reader.ReadInt();
                reader.Seek(indexPos, SeekOrigin.Begin);
                int indexLen = reader.ReadInt();

                for (int i = 0; i < indexLen; i += 9)
                {
                    int  key           = reader.ReadInt();     //4 byte
                    bool undiacritical = reader.ReadBoolean(); //1 byte
                    int  dataPos       = reader.ReadInt();     //4 byte
                    int  pos           = (int)reader.Position;
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    var text = reader.ReadUTF();
                    reader.Seek(pos, SeekOrigin.Begin);

                    if (undiacritical)
                    {
                        var criticalPos = reader.ReadInt();
                        i += 4;

                        pos = (int)reader.Position;
                        reader.Seek(criticalPos, SeekOrigin.Begin);
                        var undiacriticalText = reader.ReadUTF();
                        reader.Seek(pos, SeekOrigin.Begin);

                        m_entries.Add(key, new D2IEntry <int>(key, text, undiacriticalText));
                    }
                    else
                    {
                        m_entries.Add(key, new D2IEntry <int>(key, text));
                    }
                }
                indexLen = reader.ReadInt();

                while (indexLen > 0)
                {
                    var    pos     = reader.Position;
                    string key     = reader.ReadUTF();
                    int    dataPos = reader.ReadInt();
                    indexLen -= ((int)reader.Position - (int)pos);

                    textCount++;
                    pos = (int)reader.Position;
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    m_textEntries.Add(key, new D2IEntry <string>(key, reader.ReadUTF()));
                    reader.Seek(pos, SeekOrigin.Begin);
                }

                indexLen = reader.ReadInt();
                while (indexLen > 0)
                {
                    // don't really need it
                    m_textSortIndexes.Add(reader.ReadInt());
                    indexLen -= 4;
                }
            }
        }
Example #2
0
        private void Initialize()
        {
            using (var reader = new FastBigEndianReader(File.ReadAllBytes(m_uri)))
            {
                int indexPos = reader.ReadInt();
                reader.Seek(indexPos, SeekOrigin.Begin);
                int indexLen = reader.ReadInt();

                for (int i = 0; i < indexLen; i += 8)
                {
                    int key     = reader.ReadInt();
                    int dataPos = reader.ReadInt();
                    var pos     = (int)reader.Position;
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    m_indexes.Add(key, reader.ReadUTF());
                    reader.Seek(pos, SeekOrigin.Begin);
                }

                while (reader.BytesAvailable > 0)
                {
                    string key     = reader.ReadUTF();
                    int    dataPos = reader.ReadInt();
                    var    pos     = (int)reader.Position;
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    m_textIndexes.Add(key, reader.ReadUTF());
                    reader.Seek(pos, SeekOrigin.Begin);
                }
            }
        }
Example #3
0
 public void Read(FastBigEndianReader reader)
 {
     this.SoundId              = reader.ReadInt();
     this.BaseVolume           = reader.ReadShort();
     this.FullVolumeDistance   = reader.ReadInt();
     this.NullVolumeDistance   = reader.ReadInt();
     this.MinDelayBetweenLoops = reader.ReadShort();
     this.MaxDelayBetweenLoops = reader.ReadShort();
 }
Example #4
0
        protected virtual bool BuildMessage(BufferSegment buffer)
        {
            if (m_currentMessage == null)
            {
                m_currentMessage = new MessagePart(false);
            }

            var reader = new FastBigEndianReader(buffer)
            {
                Position    = buffer.Offset + m_readOffset,
                MaxPosition = buffer.Offset + m_readOffset + m_remainingLength,
            };

            // if message is complete
            if (m_currentMessage.Build(reader))
            {
                var dataPos = reader.Position;
                // prevent to read above
                reader.MaxPosition = dataPos + m_currentMessage.Length.Value;

                Message message;
                try
                {
                    message = MessageReceiver.BuildMessage((uint)m_currentMessage.MessageId.Value, reader);
                }
                catch (Exception)
                {
                    if (m_currentMessage.ReadData)
                    {
                        logger.Debug("Message = {0}", m_currentMessage.Data.ToString(" "));
                    }
                    else
                    {
                        reader.Seek(dataPos, SeekOrigin.Begin);
                        logger.Debug("Message = {0}", reader.ReadBytes(m_currentMessage.Length.Value).ToString(" "));
                    }
                    throw;
                }


                OnMessageReceived(message);

                m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
                m_writeOffset      = m_readOffset = (int)reader.Position - buffer.Offset;
                m_currentMessage   = null;

                return(m_remainingLength <= 0 || BuildMessage(buffer));
            }

            m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
            m_readOffset       = (int)reader.Position - buffer.Offset;
            m_writeOffset      = m_readOffset + m_remainingLength;

            EnsureBuffer(m_currentMessage.Length.HasValue ? m_currentMessage.Length.Value : 3);

            return(false);
        }
Example #5
0
 private void Read(FastBigEndianReader reader)
 {
     this.FixtureId = reader.ReadInt();
     this.Offset    = new Point(reader.ReadShort(), reader.ReadShort());
     this.Rotation  = reader.ReadShort();
     this.Scale     = new Point(reader.ReadShort(), reader.ReadShort());
     this.Color     = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
     this.Hue       = Color.R | Color.G | Color.B;
     this.Alpha     = reader.ReadByte();
 }
Example #6
0
        public Map.Map ReadMap(int mapId)
        {
            D2pEntry            entry  = d2pEntries[mapId];
            FastBigEndianReader reader = new FastBigEndianReader(dataFile);

            reader.Seek(entry.BaseOffset + entry.Index, SeekOrigin.Begin);
            byte[]  data = reader.ReadBytes(entry.Size);
            Map.Map map  = new Map.Map(new FastBigEndianReader(data));
            return(map);
        }
Example #7
0
        private void Read(FastBigEndianReader reader)
        {
            List <IElement> allElements = new List <IElement>();

            this.CellId        = reader.ReadShort();
            this.ElementsCount = reader.ReadShort();
            for (int i = 0; i < ElementsCount; i++)
            {
                IElement be = BasicElement.GetElementFromType(Map, reader, reader.ReadByte());
                allElements.Add(be);
            }
            Elements = allElements.AsReadOnly();
        }
Example #8
0
        private void Read(FastBigEndianReader reader)
        {
            List <Cell> _cells = new List <Cell>();

            this.LayerId    = reader.ReadInt();
            this.CellsCount = reader.ReadShort();
            for (int i = 0; i < CellsCount; i++)
            {
                Cell c = new Cell(Map, reader);
                _cells.Add(c);
            }
            Cells = _cells.AsReadOnly();
        }
Example #9
0
        protected virtual bool BuildMessage(BufferSegment buffer)
        {
            if (m_messagePart == null)
            {
                m_messagePart = new IPCMessagePart();
            }

            var reader = new FastBigEndianReader(buffer)
            {
                Position    = buffer.Offset + m_readOffset,
                MaxPosition = buffer.Offset + m_readOffset + m_remainingLength,
            };

            // if message is complete
            if (m_messagePart.Build(reader))
            {
                var dataPos = reader.Position;
                // prevent to read above
                reader.MaxPosition = dataPos + m_messagePart.Length.Value;

                IPCMessage message;
                try
                {
                    message = IPCMessageSerializer.Instance.Deserialize(m_messagePart.Data);
                }
                catch (Exception)
                {
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    logger.Debug("Message = {0}", m_messagePart.Data.ToString(" "));
                    throw;
                }

                LastActivity = DateTime.Now;

                TaskPool.AddMessage(() => ProcessMessage(message));

                m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
                m_writeOffset      = m_readOffset = (int)reader.Position - buffer.Offset;
                m_messagePart      = null;

                return(m_remainingLength <= 0 || BuildMessage(buffer));
            }

            m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
            m_readOffset       = (int)reader.Position - buffer.Offset;
            m_writeOffset      = m_readOffset + m_remainingLength;

            EnsureBuffer(m_messagePart.Length.HasValue ? m_messagePart.Length.Value : 3);

            return(false);
        }
Example #10
0
        private void Ini()
        {
            stream = new FastBigEndianReader(File.ReadAllBytes(path));
            int pos = stream.ReadInt();

            stream.Seek(pos, SeekOrigin.Begin);

            int lenghtIndexes = stream.ReadInt();

            for (int i = 0; i < lenghtIndexes; i += 9)
            {
                int  key          = stream.ReadInt();
                bool criticalBool = stream.ReadBoolean();
                int  value        = stream.ReadInt();
                this.indexes[key] = value;
                if (criticalBool)
                {
                    i = i + 4;
                    this.unDiacriticalIndex[key] = stream.ReadInt();
                }
                else
                {
                    this.unDiacriticalIndex[key] = value;
                }
            }

            int lenghtTextIndexes = stream.ReadInt();

            while (lenghtTextIndexes > 0)
            {
                int    position = (int)stream.Position;
                string text     = stream.ReadUTF();
                int    val      = stream.ReadInt();
                textCount++;
                this.textIndexes[text] = val;
                lenghtTextIndexes      = (int)(lenghtTextIndexes - (stream.Position - position));
            }

            int textSortLenght = stream.ReadInt();
            int actuelValue    = 0;

            while (textSortLenght > 0)
            {
                int currentPos = (int)stream.Position;
                this.textSortIndex[stream.ReadInt()] = ++actuelValue;
                textSortLenght = (int)(textSortLenght - (stream.Position - currentPos));
            }
        }
Example #11
0
        public static IElement GetElementFromType(Map map, FastBigEndianReader reader, byte type)
        {
            IElement element = null;

            switch (type)
            {
            case (byte)ElementTypesEnum.GRAPHICAL:
                element = new GraphicalElement(map, reader);
                break;

            case (byte)ElementTypesEnum.SOUND:
                element = new SoundElement(map, reader);
                break;
            }
            return(element);
        }
Example #12
0
        private void Initialize()
        {
            using (var reader = new FastBigEndianReader(File.ReadAllBytes(uri)))
            {
                var indexPos = reader.ReadInt();
                reader.Seek(indexPos, SeekOrigin.Begin);
                var indexLen  = reader.ReadInt();
                int addOffset = 0;
                for (int i = 0; i < indexLen; i += 9)
                {
                    var  key = reader.ReadInt();
                    byte nbAdditionnalStrings = reader.ReadByte();
                    var  dataPos = reader.ReadInt();
                    var  pos     = (int)reader.Position;
                    reader.Seek(dataPos + addOffset, SeekOrigin.Begin);
                    indexes.Add(key, reader.ReadUTF());
                    reader.Seek(pos, SeekOrigin.Begin);
                    while (nbAdditionnalStrings-- > 0)
                    {
                        dataPos = reader.ReadInt();
                        pos     = (int)reader.Position;
                        reader.Seek(dataPos + addOffset, SeekOrigin.Begin);
                        string unusedString = reader.ReadUTF(); // Well, no real use to read that, as we don't use 'em
                        reader.Seek(pos, SeekOrigin.Begin);
                        i += 4;
                    }
                }
                int lastOffset = reader.ReadInt() + (int)reader.Position;

                int locpos = (int)reader.Position;

                while (locpos < lastOffset)
                {
                    var key     = reader.ReadUTF();
                    var dataPos = reader.ReadInt();
                    locpos = (int)reader.Position;
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    textIndexes.Add(key, reader.ReadUTF());
                    reader.Seek(locpos, SeekOrigin.Begin);
                }
            }
        }
Example #13
0
        private void Read(FastBigEndianReader reader)
        {
            this.ElementId = reader.ReadInt();
            this.Hue       = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
            this.Shadow    = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte());

            if (Map.Version <= 4)
            {
                this.Offset      = new Point(reader.ReadByte(), reader.ReadByte());
                this.PixelOffset = new Point((int)(this.Offset.X * CELL_HALF_WIDTH), (int)(this.Offset.Y * CELL_HALF_HEIGHT));
            }
            else
            {
                this.PixelOffset = new Point(reader.ReadShort(), reader.ReadShort());
                this.Offset      = new Point((int)(this.PixelOffset.X / CELL_HALF_WIDTH), (int)(this.PixelOffset.Y / CELL_HALF_HEIGHT));
            }

            this.Altitude   = reader.ReadByte();
            this.Identifier = (uint)reader.ReadInt();
        }
Example #14
0
        private void Read(string path)
        {
            d2pEntries = new Dictionary <int, D2pEntry>();
            dataFile   = File.ReadAllBytes(path);
            FastBigEndianReader reader = new FastBigEndianReader(dataFile);

            if (!(reader.ReadByte() == 2) || !(reader.ReadByte() == 1))
            {
                //   log.Fatal("Erreur lecture map!");
            }
            else
            {
                reader.Seek(-24, SeekOrigin.End);

                var baseOffset = reader.ReadInt();
                var size       = reader.ReadInt();
                var mapsOffet  = reader.ReadInt();
                var mapsCount  = reader.ReadInt();
                var fileOffset = reader.ReadInt();
                var lenghtFile = reader.ReadInt();

                reader.Seek(fileOffset, SeekOrigin.Begin);
                for (int i = 0; i < lenghtFile; i++)
                {
                    string _loc15_ = reader.ReadUTF();
                    string _loc16_ = reader.ReadUTF();
                    //  _loc5_[_loc15_] = _loc16_;
                }

                reader.Seek(mapsOffet, SeekOrigin.Begin);
                for (int i = 0; i < mapsCount; i++)
                {
                    var mapId   = int.Parse(reader.ReadUTF().Remove(0, 2).Replace(".dlm", ""));
                    var index   = reader.ReadInt();
                    var sizeMap = reader.ReadInt();
                    d2pEntries[mapId] = new D2pEntry(index, sizeMap, baseOffset);
                }
            }
        }
Example #15
0
        private void Read(FastBigEndianReader reader)
        {
            this._floor = reader.ReadByte() * 10;
            if (this._floor == -1280)
            {
                return;
            }
            this._losmov       = reader.ReadByte();
            this.Speed         = reader.ReadByte();
            this.MapChangeData = reader.ReadByte();

            if (this.Map.Version > 5)
            {
                this.MoveZone = reader.ReadByte();
            }

            if (this.Map.Version > 7)
            {
                int tmpBits = reader.ReadByte();
                this._arrow = 15 & tmpBits;
            }

            this.Mov = (this._losmov & 1) == 1;
        }
Example #16
0
 public GraphicalElement(Map map, FastBigEndianReader reader)
 {
     Map = map;
     Read(reader);
 }
Example #17
0
 public Fixture(Map map, FastBigEndianReader reader)
 {
     Map = map;
     Read(reader);
 }
Example #18
0
 public Map(FastBigEndianReader reader)
 {
     ReaderMap(reader);
 }
Example #19
0
        internal void ReaderMap(FastBigEndianReader reader)
        {
            int header = reader.ReadByte();

            if (header != 77)
            {
                try
                {
                    reader.Seek(0, SeekOrigin.Begin);
                    var output = new MemoryStream();
                    ZipHelper.Deflate(new MemoryStream(reader.ReadBytes((int)reader.BytesAvailable)), output);

                    var uncompress = output.ToArray();

                    reader.Dispose();
                    reader = new FastBigEndianReader(uncompress);

                    header = reader.ReadByte();

                    if (header != 77)
                    {
                        throw new FileLoadException("Wrong header file");
                    }
                }
                catch (Exception ex)
                {
                    throw new FileLoadException("Wrong header file");
                }
            }

            this.Version = reader.ReadByte();
            this.Id      = reader.ReadInt();
            if (Version >= 7)
            {
                this.Encrypted         = reader.ReadBoolean();
                this.EncryptionVersion = reader.ReadByte();
                int    DataLen       = reader.ReadInt();
                byte[] decryptionKey = Encoding.Default.GetBytes(Map.DecryptionKey);
                if (this.Encrypted)
                {
                    byte[] encryptedData = reader.ReadBytes(DataLen);
                    for (int i = 0; i < encryptedData.Length; i++)
                    {
                        encryptedData[i] = (byte)(encryptedData[i] ^ decryptionKey[i % decryptionKey.Length]);
                    }
                    reader = new FastBigEndianReader(encryptedData);
                }
            }
            this.RelativeId            = (uint)reader.ReadInt();
            this.MapType               = reader.ReadByte();
            this.SubAreaId             = reader.ReadInt();
            this.TopNeighbourId        = reader.ReadInt();
            this.BottomNeighbourId     = reader.ReadInt();
            this.LeftNeighbourId       = reader.ReadInt();
            this.RightNeighbourId      = reader.ReadInt();
            this.ShadowBonusOnEntities = reader.ReadInt();

            if (this.Version >= 3)
            {
                this.BackgroundColor = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
            }

            if (this.Version >= 4)
            {
                ZoomScale   = reader.ReadUShort();
                ZoomOffsetX = reader.ReadShort();
                ZoomOffsetY = reader.ReadShort();
            }
            this.UseLowPassFilter = reader.ReadByte() == 1;
            this.UseReverb        = reader.ReadByte() == 1;
            if (UseReverb)
            {
                PresetId = reader.ReadInt();
            }
            {
                PresetId = -1;
            }

            int            backGroundsCount   = reader.ReadByte();
            List <Fixture> backgroundFixtures = new List <Fixture>();

            for (int i = 0; i < backGroundsCount; i++)
            {
                backgroundFixtures.Add(new Fixture(this, reader));
            }
            this.BackgroudFixtures = backgroundFixtures.AsReadOnly();


            int            foregroundsCount   = reader.ReadByte();
            List <Fixture> foregroundFixtures = new List <Fixture>();

            for (int i = 0; i < foregroundsCount; i++)
            {
                foregroundFixtures.Add(new Fixture(this, reader));
            }
            ForegroundFixtures = foregroundFixtures.AsReadOnly();

            int cellCount = 560;

            reader.ReadInt();
            this.GroundCRC = reader.ReadInt();

            int          layerCount = reader.ReadByte();
            List <Layer> layers     = new List <Layer>();

            for (int i = 0; i < layerCount; i++)
            {
                layers.Add(new Layer(this, reader));
            }
            this.Layers = layers.AsReadOnly();

            List <CellData> cells = new List <CellData>();

            for (int i = 0; i < cellCount; i++)
            {
                cells.Add(new CellData(this, reader));
            }
            this.Cells = cells.AsReadOnly();
        }
Example #20
0
 public CellData(Map map, FastBigEndianReader reader)
 {
     Map = map;
     Read(reader);
 }
Example #21
0
 public Layer(Map map, FastBigEndianReader reader)
 {
     Map = map;
     Read(reader);
 }
Example #22
0
        protected virtual bool BuildMessage(BufferSegment buffer)
        {
            if (m_semaphore.CurrentCount == 0)
            {
                Console.WriteLine("Client Busy");
            }

            m_semaphore.Wait();

            if (m_currentMessage == null)
            {
                m_currentMessage = new MessagePart(false);
            }

            var reader = new FastBigEndianReader(buffer)
            {
                Position    = buffer.Offset + m_readOffset,
                MaxPosition = buffer.Offset + m_readOffset + m_remainingLength,
            };

            // if message is complete
            if (m_currentMessage.Build(reader))
            {
                var dataPos = reader.Position;
                // prevent to read above
                reader.MaxPosition = dataPos + m_currentMessage.Length.Value;

                Message message;
                try
                {
                    message = MessageReceiver.BuildMessage((uint)m_currentMessage.MessageId.Value, reader);
                }
                catch (Exception)
                {
                    if (m_currentMessage.ReadData)
                    {
                        logger.Debug("Message = {0}", m_currentMessage.Data.ToString(" "));
                    }
                    else
                    {
                        reader.Seek(dataPos, SeekOrigin.Begin);
                        logger.Debug("Message = {0}", reader.ReadBytes(m_currentMessage.Length.Value).ToString(" "));
                    }
                    throw;
                }


                if (LogPackets)
                {
                    Console.WriteLine($"(RECV) {this} : {message}");
                }

                OnMessageReceived(message);

                m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
                m_writeOffset      = m_readOffset = (int)reader.Position - buffer.Offset;
                m_currentMessage   = null;

                return(m_remainingLength <= 0 || BuildMessage(buffer));
            }

            logger.Debug("Message truncated, ensure buffer is big enough ...");

            m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
            m_readOffset       = (int)reader.Position - buffer.Offset;
            m_writeOffset      = m_readOffset + m_remainingLength;

            EnsureBuffer(m_currentMessage.Length.HasValue ? m_currentMessage.Length.Value : 5); // 5 is the max header size

            m_semaphore.Release();

            return(false);
        }
Example #23
0
 public SoundElement(Map map, FastBigEndianReader reader)
 {
     Map = map;
     Read(reader);
 }
Example #24
0
        public static DlmMap ReadFromStream(IDataReader givenReader, DlmReader dlmReader)
        {
            DlmMap map = null;

            try
            {
                var reader = givenReader;
                map = new DlmMap
                {
                    Version = reader.ReadByte(),
                    Id      = reader.ReadInt()
                };

                if (map.Version > DlmReader.VERSION)
                {
                    throw new Exception(string.Format("Reader outdated for this map (old version:{0} new version:{1})",
                                                      DlmReader.VERSION, map.Version));
                }

                if (map.Version >= 7)
                {
                    map.Encrypted         = reader.ReadBoolean();
                    map.EncryptionVersion = reader.ReadByte();

                    var len = reader.ReadInt();

                    if (map.Encrypted)
                    {
                        var key = dlmReader.DecryptionKey;

                        if (key == null && dlmReader.DecryptionKeyProvider != null)
                        {
                            key = dlmReader.DecryptionKeyProvider(map.Id);
                        }

                        if (key == null)
                        {
                            throw new InvalidOperationException(string.Format("Cannot decrypt the map {0} without decryption key", map.Id));
                        }

                        var data       = reader.ReadBytes(len);
                        var encodedKey = Encoding.Default.GetBytes(key);

                        if (key.Length > 0)
                        {
                            for (var i = 0; i < data.Length; i++)
                            {
                                data[i] = (byte)(data[i] ^ encodedKey[i % key.Length]);
                            }

                            reader = new FastBigEndianReader(data);
                        }
                    }
                }

                map.RelativeId = reader.ReadUInt();
                map.MapType    = reader.ReadByte();

                // temp, just to know if the result is coherent
                if (map.MapType < 0 || map.MapType > 1)
                {
                    throw new Exception("Invalid decryption key");
                }

                map.SubAreaId             = reader.ReadInt();
                map.TopNeighbourId        = reader.ReadInt();
                map.BottomNeighbourId     = reader.ReadInt();
                map.LeftNeighbourId       = reader.ReadInt();
                map.RightNeighbourId      = reader.ReadInt();
                map.ShadowBonusOnEntities = reader.ReadInt();

                if (map.Version >= 9)
                {
                    map.BackgroundColor = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
                    map.GridColor       = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
                }

                else if (map.Version >= 3)
                {
                    map.BackgroundColor = Color.FromArgb(reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
                }

                if (map.Version >= 4)
                {
                    map.ZoomScale   = reader.ReadUShort();
                    map.ZoomOffsetX = reader.ReadShort();
                    map.ZoomOffsetY = reader.ReadShort();
                }

                map.UseLowPassFilter = reader.ReadByte() == 1;
                map.UseReverb        = reader.ReadByte() == 1;

                if (map.UseReverb)
                {
                    map.PresetId = reader.ReadInt();
                }
                {
                    map.PresetId = -1;
                }

                map.BackgroudFixtures = new DlmFixture[reader.ReadByte()];
                for (var i = 0; i < map.BackgroudFixtures.Length; i++)
                {
                    map.BackgroudFixtures[i] = DlmFixture.ReadFromStream(map, reader);
                }

                map.ForegroundFixtures = new DlmFixture[reader.ReadByte()];
                for (var i = 0; i < map.ForegroundFixtures.Length; i++)
                {
                    map.ForegroundFixtures[i] = DlmFixture.ReadFromStream(map, reader);
                }

                reader.ReadInt();
                map.GroundCRC = reader.ReadInt();

                map.Layers = new DlmLayer[reader.ReadByte()];
                for (var i = 0; i < map.Layers.Length; i++)
                {
                    map.Layers[i] = DlmLayer.ReadFromStream(map, reader);
                }

                map.Cells = new DlmCellData[CellCount];
                int?lastMoveZone = null;
                for (short i = 0; i < map.Cells.Length; i++)
                {
                    map.Cells[i] = DlmCellData.ReadFromStream(i, map.Version, reader);
                    if (!lastMoveZone.HasValue)
                    {
                        lastMoveZone = map.Cells[i].MoveZone;
                    }
                    else if (lastMoveZone != map.Cells[i].MoveZone) // if a cell is different the new system is used
                    {
                        map.UsingNewMovementSystem = true;
                    }
                }

                return(map);
            }
            catch (Exception ex)
            {
                throw new BadEncodedMapException(ex, map);
            }
        }
Example #25
0
        protected virtual bool BuildMessage(BufferSegment buffer)
        {
            if (m_messagePart == null)
            {
                m_messagePart = new IPCMessagePart();
            }

            var reader = new FastBigEndianReader(buffer)
            {
                Position    = buffer.Offset + m_readOffset,
                MaxPosition = buffer.Offset + m_readOffset + m_remainingLength,
            };

            bool built;

            try
            {
                built = m_messagePart.Build(reader);
            }
            catch
            {
                logger.Error("Cannot build message. Length={0} LengthSize={3} RemainingLength={1} Data={2}", m_messagePart.Length, m_remainingLength, m_messagePart.Data, m_messagePart.LengthBytesCount);
                throw;
            }

            // if message is complete
            if (built)
            {
                var dataPos = reader.Position;
                // prevent to read above
                reader.MaxPosition = dataPos + m_messagePart.Length.Value;

                IPCMessage message;
                try
                {
                    message = IPCMessageSerializer.Instance.Deserialize(m_messagePart.Data);
                }
                catch (Exception ex)
                {
                    reader.Seek(dataPos, SeekOrigin.Begin);
                    logger.Debug("Message = {0}", m_messagePart.Data.ToString(" "));
                    logger.Error("Error while deserializing IPC Message : " + ex);

                    return(m_remainingLength <= 0 || BuildMessage(buffer));
                }

                TaskPool.AddMessage(() => ProcessMessage(message));

                m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
                m_writeOffset      = m_readOffset = (int)reader.Position - buffer.Offset;
                m_messagePart      = null;

                return(m_remainingLength <= 0 || BuildMessage(buffer));
            }

            m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
            m_readOffset       = (int)reader.Position - buffer.Offset;
            m_writeOffset      = m_readOffset + m_remainingLength;

            EnsureBuffer(m_messagePart.Length.HasValue ? m_messagePart.Length.Value : 5);

            return(false);
        }
Example #26
0
        protected virtual bool BuildMessage(BufferSegment buffer)
        {
            if (m_currentMessage == null)
            {
                m_currentMessage = new MessagePart(false);
            }

            var reader = new FastBigEndianReader(buffer)
            {
                Position    = buffer.Offset + m_readOffset,
                MaxPosition = buffer.Offset + m_readOffset + m_remainingLength,
            };

            // if message is complete
            if (m_currentMessage.Build(reader))
            {
                var dataPos = reader.Position;
                // prevent to read above
                reader.MaxPosition = dataPos + m_currentMessage.Length.Value;

                Message message;
                try
                {
                    message = MessageReceiver.BuildMessage((uint)m_currentMessage.MessageId.Value, reader);
                }
                catch (Exception)
                {
                    if (m_currentMessage.ReadData)
                    {
                        logger.Debug("Message = {0}", m_currentMessage.Data.ToString(" "));
                    }
                    else
                    {
                        reader.Seek(dataPos, SeekOrigin.Begin);
                        logger.Debug("Message = {0}", reader.ReadBytes(m_currentMessage.Length.Value).ToString(" "));
                    }
                    throw;
                }

                if (!MessagesWhitelist.Contains(message.ToString()))
                {
                    m_messagesHistory.Push(new Pair <DateTime, Message>(DateTime.Now, message));
                }

                var time = m_messagesHistory.Last.Value.First.Subtract(m_messagesHistory.First.Value.First);

                //Flood check,
                if (FloodCheck && (m_messagesHistory.Count == m_messagesHistory.MaxItems && time.TotalSeconds < FloodMinTime))
                {
                    logger.Error($"Forced disconnection {this}: Flood: {m_messagesHistory.Count} messages in {time.TotalSeconds} seconds ! - LastMessages: {m_messagesHistory.Select(x => x.Second).ToCSV(",")}");
                    Disconnect();

                    return(false);
                }

                if (LogPackets)
                {
                    Console.WriteLine($"(RECV) {this} : {message}");
                }

                OnMessageReceived(message);

                m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
                m_writeOffset      = m_readOffset = (int)reader.Position - buffer.Offset;
                m_currentMessage   = null;

                return(m_remainingLength <= 0 || BuildMessage(buffer));
            }

            logger.Debug("Message truncated, ensure buffer is big enough ...");

            m_remainingLength -= (int)(reader.Position - (buffer.Offset + m_readOffset));
            m_readOffset       = (int)reader.Position - buffer.Offset;
            m_writeOffset      = m_readOffset + m_remainingLength;

            EnsureBuffer(m_currentMessage.Length.HasValue ? m_currentMessage.Length.Value : 5); // 5 is the max header size

            return(false);
        }
 public D2iFile(string uri)
 {
     this.uri = uri;
     reader   = new FastBigEndianReader(File.ReadAllBytes(uri));
     Initialize();
 }