private void Map_Updated(object sender, MapUpdatedEventArgs e) { try { lock (map) { miniMap.BeginUpdate(); foreach (var tile in e.Tiles) { if (ShareTrackedMap && !client.IsClinentless && !client.IsOpenTibiaServer) mapShare.Add(tile); if (TrackOnlyCurrentFloor && tile.Location.Z != Client.PlayerLocation.Z) continue; var index = tile.Location.ToIndex(); OtTile mapTile = map.GetTile(tile.Location); if (mapTile != null && !RetrackTiles) continue; else if (mapTile == null) mapTile = new OtTile(tile.Location); mapTile.Clear(); for (int i = 0; i < tile.ThingCount; i++) { var thing = tile.GetThing(i); if (thing is Creature) { var creature = thing as Creature; if (creature.Type == CreatureType.PLAYER || (!TrackMonsters && creature.Type == CreatureType.MONSTER) || (!TrackNPCs && creature.Type == CreatureType.NPC)) continue; map.AddCreature(new OtCreature { Id = creature.Id, Location = creature.Location, Name = creature.Name, Type = creature.Type }); } else if (thing is Item) { var item = tile.GetThing(i) as Item; var itemType = otItems.GetItemBySpriteId((ushort)item.Id); if (itemType == null) { Trace.TraceWarning("Tibia item not in items.otb. Details: item id " + item.Id.ToString()); continue; } if (item.Type.IsMoveable && !TrackMoveableItems) continue; if (item.IsSplash && !TrackSplashes) continue; OtItem mapItem = OtItem.Create(itemType); if (mapItem.Type.IsStackable) mapItem.SetAttribute(OtItemAttribute.COUNT, item.Count); else if (mapItem.Type.Group == OtItemGroup.Splash || mapItem.Type.Group == OtItemGroup.FluidContainer) mapItem.SetAttribute(OtItemAttribute.COUNT, OtConverter.TibiaFluidToOtFluid(item.SubType)); mapTile.AddItem(mapItem); } } map.SetTile(mapTile); } miniMap.CenterLocation = Client.PlayerLocation; miniMap.EndUpdate(); UpdateCounters(map.TileCount, map.NpcCount, map.MonsterCount); } } catch (Exception ex) { Trace.WriteLine("[Error] Unable to convert tibia tile to open tibia tile. Details: " + ex.Message); } }
public void SetTile(OtTile tile) { SetTile(tile.Location.ToIndex(), tile); }
private void ParseTileArea(OtFileReader reader, OtFileNode otbNode, bool replaceTiles, ISet<ulong> tileLocations) { OtPropertyReader props = reader.GetPropertyReader(otbNode); int baseX = props.ReadUInt16(); int baseY = props.ReadUInt16(); int baseZ = props.ReadByte(); OtFileNode nodeTile = otbNode.Child; while (nodeTile != null) { if (nodeTile.Type == (long)OtMapNodeTypes.TILE || nodeTile.Type == (long)OtMapNodeTypes.HOUSETILE) { props = reader.GetPropertyReader(nodeTile); var tileLocation = new Location(baseX + props.ReadByte(), baseY + props.ReadByte(), baseZ); var tile = new OtTile(tileLocation); if (nodeTile.Type == (long)OtMapNodeTypes.HOUSETILE) { tile.HouseId = props.ReadUInt32(); } while (props.PeekChar() != -1) { byte attribute = props.ReadByte(); switch ((OtMapAttribute)attribute) { case OtMapAttribute.TILE_FLAGS: { tile.Flags = props.ReadUInt32(); break; } case OtMapAttribute.ITEM: { ushort itemId = props.ReadUInt16(); var itemType = Items.GetItem(itemId); if (itemType == null) { throw new Exception("Unkonw item type " + itemId + " in position " + tileLocation + "."); } var item = OtItem.Create(itemType); tile.InternalAddItem(item); break; } default: throw new Exception(string.Format("{0} Unknown tile attribute.", tileLocation)); } } OtFileNode nodeItem = nodeTile.Child; while (nodeItem != null) { if (nodeItem.Type == (long)OtMapNodeTypes.ITEM) { props = reader.GetPropertyReader(nodeItem); ushort itemId = props.ReadUInt16(); var itemType = Items.GetItem(itemId); if (itemType == null) { throw new Exception("Unkonw item type " + itemId + " in position " + tileLocation + "."); } var item = OtItem.Create(itemType); item.Deserialize(reader, nodeItem, props, Items); tile.InternalAddItem(item); } else { throw new Exception(string.Format("{0} Unknown node type.", tileLocation)); } nodeItem = nodeItem.Next; } var index = tileLocation.ToIndex(); var hasTile = HasTile(index); if (!hasTile) { SetTile(tile); tileLocations.Add(tileLocation.ToIndex()); } else if (replaceTiles) SetTile(tile); } nodeTile = nodeTile.Next; } }
public void SetTile(ulong index, OtTile tile) { tiles[index] = tile; }
private void ParseTile() { var tile = new OtTile(message.ReadLocation()); //Console.WriteLine("[Debug] Tile received, location: " + tile.Location); var thingCount = message.ReadByte(); for (int i = 0; i < thingCount; i++) { var thingType = message.ReadByte(); if (thingType == 0x01) //Creature { var id = message.ReadUInt(); var name = message.ReadString(); var type = (CreatureType)message.ReadByte(); if (type != CreatureType.PLAYER) map.AddCreature(new OtCreature { Id = id, Name = name, Type = type, Location = tile.Location }); } else { var id = message.ReadUShort(); var subType = message.ReadByte(); var itemType = items.GetItemBySpriteId(id); if (itemType != null) { var item = OtItem.Create(itemType); if (item.Type.IsStackable) item.SetAttribute(OtItemAttribute.COUNT, subType); else if (item.Type.Group == OtItemGroup.Splash || item.Type.Group == OtItemGroup.FluidContainer) item.SetAttribute(OtItemAttribute.COUNT, OtConverter.TibiaFluidToOtFluid(subType)); tile.AddItem(item); } } } if (map.GetTile(tile.Location) == null) map.SetTile(tile); }
private void ParseTileArea(OtFileReader reader, OtFileNode otbNode, bool replaceTiles, ISet <ulong> tileLocations) { OtPropertyReader props = reader.GetPropertyReader(otbNode); int baseX = props.ReadUInt16(); int baseY = props.ReadUInt16(); int baseZ = props.ReadByte(); OtFileNode nodeTile = otbNode.Child; while (nodeTile != null) { if (nodeTile.Type == (long)OtMapNodeTypes.TILE || nodeTile.Type == (long)OtMapNodeTypes.HOUSETILE) { props = reader.GetPropertyReader(nodeTile); var tileLocation = new Location(baseX + props.ReadByte(), baseY + props.ReadByte(), baseZ); var tile = new OtTile(tileLocation); if (nodeTile.Type == (long)OtMapNodeTypes.HOUSETILE) { tile.HouseId = props.ReadUInt32(); } while (props.PeekChar() != -1) { byte attribute = props.ReadByte(); switch ((OtMapAttribute)attribute) { case OtMapAttribute.TILE_FLAGS: { tile.Flags = props.ReadUInt32(); break; } case OtMapAttribute.ITEM: { ushort itemId = props.ReadUInt16(); var itemType = Items.GetItem(itemId); if (itemType == null) { throw new Exception("Unkonw item type " + itemId + " in position " + tileLocation + "."); } var item = OtItem.Create(itemType); tile.InternalAddItem(item); break; } default: throw new Exception(string.Format("{0} Unknown tile attribute.", tileLocation)); } } OtFileNode nodeItem = nodeTile.Child; while (nodeItem != null) { if (nodeItem.Type == (long)OtMapNodeTypes.ITEM) { props = reader.GetPropertyReader(nodeItem); ushort itemId = props.ReadUInt16(); var itemType = Items.GetItem(itemId); if (itemType == null) { throw new Exception("Unkonw item type " + itemId + " in position " + tileLocation + "."); } var item = OtItem.Create(itemType); item.Deserialize(reader, nodeItem, props, Items); tile.InternalAddItem(item); } else { throw new Exception(string.Format("{0} Unknown node type.", tileLocation)); } nodeItem = nodeItem.Next; } var index = tileLocation.ToIndex(); var hasTile = HasTile(index); if (!hasTile) { SetTile(tile); tileLocations.Add(tileLocation.ToIndex()); } else if (replaceTiles) { SetTile(tile); } } nodeTile = nodeTile.Next; } }