public OtSpawn(Location location, int radius) { this.Location = location; this.Radius = radius; this.size = (radius * 2) + 1; creatures = new OtCreature[size, size]; }
public Tile(Location location) { Location = location; things = new List<Thing>(); #if DEBUG_TILE if (location.Equals(DEBUG_LOCATION)) debugEnable = true; #endif }
internal void OnCreatureSpeak(uint statementId, string name, ushort level, MessageClasses type, Location location, string text) { var creature = client.BattleList.GetCreature(name); if (creature == null) return; creature.Level = level; CreatureSpeak.Raise(this, new CreatureSpeakEventArgs { Id = statementId, Creature = creature, Text = text, Type = type, Location = location }); }
public bool HasTile(Location location) { return HasTile(location.ToIndex()); }
public OtTile GetTile(Location location) { return GetTile(location.ToIndex()); }
public void AddCreature(OtCreature creature) { if (!creatures.ContainsKey(creature.Id)) { var spawnLocation = new Location(creature.Location.X - (creature.Location.X % SPAWN_SIZE) + SPAWN_RADIUS, creature.Location.Y - (creature.Location.Y % SPAWN_SIZE) + SPAWN_RADIUS, creature.Location.Z); var spawnIndex = spawnLocation.ToIndex(); if (!spawns.ContainsKey(spawnIndex)) spawns.Add(spawnIndex, new OtSpawn(spawnLocation, SPAWN_RADIUS)); var spwan = spawns[spawnIndex]; if (spwan.AddCreature(creature)) { if (creature.Type == CreatureType.NPC) npcCount++; else if (creature.Type == CreatureType.MONSTER) monsterCount++; creatures.Add(creature.Id, creature); } } }
public void WriteLocation(Location location) { WriteUShort((ushort)location.X); WriteUShort((ushort)location.Y); WriteByte((byte)location.Z); }
public OtTile(Location location) { this.location = location; }
private Location GetRelativeLocation(Location loc) { return new Location(loc.X - Location.X, loc.Y - Location.Y, loc.Z); }
public Tile GetTile(Location location) { return tiles[location.X % 18, location.Y % 14, location.Z % 8]; }
private void ParseServerMoveWest(InMessage message) { var location = new Location(client.PlayerLocation.X - 1, client.PlayerLocation.Y, client.PlayerLocation.Z); client.PlayerLocation = location; var tiles = new List<Tile>(); ParseServerMapDescription(message, tiles, location.X - 8, location.Y - 6, location.Z, 1, 14); client.Map.OnMapUpdated(tiles); }
private void ParseServerMoveSouth(InMessage message) { var location = new Location(client.PlayerLocation.X, client.PlayerLocation.Y + 1, client.PlayerLocation.Z); client.PlayerLocation = location; var tiles = new List<Tile>(); ParseServerMapDescription(message, tiles, location.X - 8, location.Y + 7, location.Z, 18, 1); client.Map.OnMapUpdated(tiles); }
private void ParseServerFloorChangeUp(InMessage message) { Location myPos = client.PlayerLocation; myPos = new Location(myPos.X, myPos.Y, myPos.Z - 1); var tiles = new List<Tile>(); if (myPos.Z == 7) { int skip = 0; ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 5, 18, 14, 3, ref skip); //(floor 7 and 6 already set) ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 4, 18, 14, 4, ref skip); ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 3, 18, 14, 5, ref skip); ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 2, 18, 14, 6, ref skip); ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 1, 18, 14, 7, ref skip); ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 0, 18, 14, 8, ref skip); } else if (myPos.Z > 7) { int skip = 0; ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, myPos.Z - 3, 18, 14, 3, ref skip); } client.PlayerLocation = new Location(myPos.X + 1, myPos.Y + 1, myPos.Z); client.Map.OnMapUpdated(tiles); }
private void ParseServerFloorChangeDown(InMessage message) { Location myPos = client.PlayerLocation; myPos = new Location(myPos.X, myPos.Y, myPos.Z + 1); //going from surface to underground var tiles = new List<Tile>(); int skipTiles = 0; if (myPos.Z == 8) { int j, i; for (i = myPos.Z, j = -1; i < (int)myPos.Z + 3; ++i, --j) ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, i, 18, 14, j, ref skipTiles); } //going further down else if (myPos.Z > 8 && myPos.Z < 14) ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, myPos.Z + 2, 18, 14, -3, ref skipTiles); client.PlayerLocation = new Location(myPos.X - 1, myPos.Y - 1, myPos.Z); client.Map.OnMapUpdated(tiles); }
private Tile ParseServerTileDescription(InMessage message, Location location) { Tile tile = new Tile(location); if (message.PeekUShort() < 0xFF00) message.ReadUShort(); while (message.PeekUShort() < 0xFF00) tile.AddThing(GetThing(message)); client.Map.SetTile(tile); return tile; }
private void LoadSpawn(string fileName, ISet<ulong> tileLocations) { if (!File.Exists(fileName)) { Trace.WriteLine("Can't load map spawns."); return; } var spawns = XElement.Load(fileName); foreach (var spawn in spawns.Elements("spawn")) { var centerLocation = new Location(spawn.Attribute("centerx").GetInt32(), spawn.Attribute("centery").GetInt32(), spawn.Attribute("centerz").GetInt32()); foreach (var creature in spawn.Elements()) { var cr = new OtCreature(); cr.Id = ++loadCreatureId; cr.Name = creature.Attribute("name").GetString(); cr.Type = creature.Name.LocalName.Equals("npc") ? CreatureType.NPC : CreatureType.MONSTER; cr.Location = new Location(centerLocation.X + creature.Attribute("x").GetInt32(), centerLocation.Y + creature.Attribute("y").GetInt32(), creature.Attribute("z").GetInt32()); if (char.IsUpper(cr.Name[0])) cr.Type = CreatureType.NPC; if (tileLocations.Contains(cr.Location.ToIndex()) && (cr.Type != CreatureType.NPC || !npcs.Contains(cr.Name))) { AddCreature(cr); if (cr.Type == CreatureType.NPC) //Only one NPC allowed per name. npcs.Add(cr.Name); } } } }
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 PlayerGoTo(Location location) { if (IsClinentless || MemoryAddresses.PlayerGoX == 0 || !LoggedIn) return; Memory.WriteUInt16(ProcessHandle, MemoryAddresses.PlayerGoX, (ushort)location.X); Memory.WriteUInt16(ProcessHandle, MemoryAddresses.PlayerGoY, (ushort)location.Y); Memory.WriteByte(ProcessHandle, MemoryAddresses.PlayerGoZ, (byte)location.Z); Memory.WriteByte(ProcessHandle, MemoryAddresses.ClientBattleListStart + (PlayerBattleListIndex * MemoryAddresses.ClientBattleListStep) + MemoryAddresses.ClientBattleListCreatureWalkDistance, 1); }