예제 #1
0
        private static TileFlags ParseTileFlags(ref ParsingStream stream)
        {
            var flags     = (TileFlags)stream.ReadUInt32();
            var tileFlags = TileFlags.None;

            if (TileFlagsExtensions.FlagsAreSet(flags, (TileFlags)OTBMTileFlag.NoLogout))
            {
                TileFlagsExtensions.AddFlags(tileFlags, (TileFlags)OTBMTileFlag.NoLogout);
            }

            if (TileFlagsExtensions.FlagsAreSet(flags, (TileFlags)OTBMTileFlag.NoPvpZone))
            {
                TileFlagsExtensions.AddFlags(tileFlags, (TileFlags)OTBMTileFlag.NoPvpZone);
            }
            else if (TileFlagsExtensions.FlagsAreSet(flags, (TileFlags)OTBMTileFlag.PvpZone))
            {
                TileFlagsExtensions.AddFlags(tileFlags, (TileFlags)OTBMTileFlag.PvpZone);
            }
            else if (TileFlagsExtensions.FlagsAreSet(flags, (TileFlags)OTBMTileFlag.ProtectionZone))
            {
                TileFlagsExtensions.AddFlags(tileFlags, (TileFlags)OTBMTileFlag.ProtectionZone);
            }

            return(tileFlags);
        }
예제 #2
0
        private static Tile ParseHouseTile(ref ParsingStream stream, UInt16 tileX, UInt16 tileY, byte tileZ)
        {
            var houseId = stream.ReadUInt32();
            var house   = HouseManager.Instance.CreateHouseOrGetReference(houseId);
            var tile    = HouseTile.CreateTileAndAddItToHouse(tileX, tileY, tileZ, house);

            return(tile);
        }
예제 #3
0
        private void ParseOTBVersion(ref ParsingStream stream)
        {
            stream.UnderlayingStream.Skip(4); // Skip flags
            var attr = (OTBAttributes)stream.ReadByte();

            if (attr == OTBAttributes.ROOT_VERSION)
            {
                var dataSize = stream.ReadUInt16();
                if (dataSize != 140)                     // VersionInfo : 4 UInt32(4bytes) = 12 + 128 * 1 byte = 140
                {
                    throw new MalformedWorldException(); // Lets use this for now
                }
                _majorVersion = stream.ReadUInt32();     // Otb version
                _minorVersion = stream.ReadUInt32();     // Client version
                _buildVersion = stream.ReadUInt32();     // Build version
                stream.UnderlayingStream.Skip(128);      // Skip CSD version
            }
        }
예제 #4
0
        public static WorldHeader GetWorldHeader(ParsingTree tree)
        {
            if (tree == null)
            {
                throw new ArgumentNullException(nameof(tree));
            }

            var parsingStream = new ParsingStream(tree, tree.Root);

            var worldEncodingVersion     = parsingStream.ReadUInt32();
            var worldWidth               = parsingStream.ReadUInt16();
            var worldHeight              = parsingStream.ReadUInt16();
            var itemEncodingMajorVersion = parsingStream.ReadUInt32();
            var itemEncodingMinorVersion = parsingStream.ReadUInt32();

            return(new WorldHeader(
                       worldEncodingVersion: worldEncodingVersion,
                       worldWidth: worldWidth,
                       worldHeight: worldHeight,
                       itemEncodingMajorVersion: itemEncodingMajorVersion,
                       itemEncodingMinorVersion: itemEncodingMinorVersion));
        }
예제 #5
0
        private void ParseItemNode(ref ParsingStream stream)
        {
            var flags = (SharedItemFlags)stream.ReadUInt32();
            var item  = new SharedItem(flags);

            while (!stream.IsOver)
            {
                var attr     = (OTBAttributes)stream.ReadByte();
                var dataSize = stream.ReadUInt16();

                switch (attr)
                {
                case OTBAttributes.ITEM_SERVERID:
                    if (dataSize != sizeof(UInt16))
                    {
                        throw new MalformedItemNodeException();
                    }

                    item.Id = stream.ReadUInt16();

                    if (item.Id > 30000 && item.Id < 30100)
                    {
                        item.Id -= 30000; // Correct ID in wrong range I guess
                    }
                    break;

                case OTBAttributes.ITEM_CLIENTID:
                    if (dataSize != sizeof(UInt16))
                    {
                        throw new MalformedItemNodeException();
                    }

                    item.ClientId = stream.ReadUInt16();
                    break;

                case OTBAttributes.ITEM_SPEED:
                    if (dataSize != sizeof(UInt16))
                    {
                        throw new MalformedItemNodeException();
                    }

                    item.Speed = stream.ReadUInt16();
                    break;

                case OTBAttributes.ITEM_LIGHT2:
                    if (dataSize != 2 * sizeof(UInt16)) // 2 UInt16 = 4 bytes
                    {
                        throw new MalformedItemNodeException();
                    }

                    item.LightLevel = (Byte)stream.ReadUInt16(); // Read UInt16
                    item.LightColor = (Byte)stream.ReadUInt16(); // But range is only to 255
                    break;

                case OTBAttributes.ITEM_TOPORDER:
                    if (dataSize != sizeof(Byte))
                    {
                        throw new MalformedItemNodeException();
                    }

                    item.AlwaysOnTopOrder = stream.ReadByte();
                    break;

                case OTBAttributes.ITEM_WAREID:
                    if (dataSize != sizeof(UInt16))
                    {
                        throw new MalformedItemNodeException();
                    }

                    item.WareId = stream.ReadUInt16();
                    break;

                default:
                    stream.Skip(dataSize);
                    break;
                }
            }

            if (item.Id > _sharedItems.Capacity + 100 || item.Id < 100)
            {
                throw new IndexOutOfRangeException();
            }

            _sharedItems.Insert(item.Id - 100, item);
        }