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); }
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); }
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 } }
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)); }
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); }