コード例 #1
0
ファイル: Map.cs プロジェクト: FaNtA91/pokemonapi
        private IEnumerable<Tile> GetTiles(bool sameFloor, bool getWorldLocation)
        {
            Tile playerTile = null;
            uint startNumber = 0;
            uint endNumber = Addresses.Map.MaxTiles + 1;

            if (sameFloor)
            {
                playerTile = GetTileWithPlayer();

                if (playerTile != null)
                {
                    int playerFloor = playerTile.MemoryLocation.Z;
                    startNumber = new Location(0, 0, playerFloor).ToTileNumber();
                    endNumber = new Location(0, 0, playerFloor + 1).ToTileNumber();
                }
            }

            if (getWorldLocation && playerTile == null)
                playerTile = GetTileWithPlayer();

            for (uint i = startNumber; i < endNumber; i++)
            {
                if (getWorldLocation)
                    yield return GetTile(i, playerTile);
                else
                    yield return GetTile(i);
            }

        }
コード例 #2
0
ファイル: Map.cs プロジェクト: FaNtA91/pokemonapi
 public Tile GetTileWithPlayer()
 {
     /*
      * Credits goes to brunelli1989 for a fix
     */
     if (playerTile == null || playerTile.Location != client.GetPlayer().Location)
     {
         uint playerId = client.Player.Id;
         
         playerTile = GetTiles(false, false).FirstOrDefault(
             t => t.Objects.Any(
                 o => o.Id == 0x63 && o.Data == playerId));
         playerTile.Location = client.GetPlayer().Location;
     }
     return playerTile;
 }
コード例 #3
0
ファイル: MapPacket.cs プロジェクト: FaNtA91/pokemonapi
        protected void GetTileDescription(Tile tile, NetworkMessage msg)
        {
            if (tile != null)
            {
                List<TileObject> objects = tile.Objects;
                objects.Insert(0, new TileObject(tile.Ground.Id, tile.Ground.Count, 0));

                foreach (TileObject o in objects)
                {
                    if (o.Id <= 0)
                    {
                        return;
                    }
                    else if (o.Id == 0x0061 || o.Id == 0x0062 || o.Id == 0x0063)
                    {
                        // Add a creature
                        Creature c = Client.BattleList.GetCreatures().FirstOrDefault(cr => cr.Id == o.Data);

                        if (c == null)
                            throw new Exception("Creature does not exist.");

                        // Add as unknown
                        msg.AddUInt16((ushort)o.Id);

                        // No need to remove a creature
                        msg.AddUInt32(0);

                        // Add the creature id
                        msg.AddUInt32((uint)c.Id);

                        msg.AddString(c.Name);

                        msg.AddByte((byte)c.HPBar);

                        msg.AddByte((byte)c.Direction);

                        msg.AddOutfit(c.Outfit);

                        msg.AddByte((byte)c.Light);

                        msg.AddByte((byte)c.LightColor);

                        msg.AddUInt16((ushort)c.WalkSpeed);

                        msg.AddByte((byte)c.Skull);

                        msg.AddByte((byte)c.PartyShield);
                    }
                    else if (o.Id <= 9999)
                    {
                        // Add an item
                        Item item = new Item(Client, (uint)o.Id, (byte)o.Data, "",
                            ItemLocation.FromLocation(tile.Location, (byte)o.StackOrder));

                        msg.AddUInt16((ushort)o.Id);

                        try
                        {
                            if (item.HasExtraByte)
                            {
                                msg.AddByte(item.Count);
                            }
                        }
                        catch { }
                    }
                }
            }
        }
コード例 #4
0
ファイル: MapPacket.cs プロジェクト: FaNtA91/pokemonapi
        protected bool ParseThing(NetworkMessage msg, Location pos, Tile tile, int n, NetworkMessage outMsg)
        {
            //get thing type
            ushort thingId = msg.GetUInt16();
            outMsg.AddUInt16(thingId);

            PacketCreature c;

            if (thingId == 0x0061 || thingId == 0x0062)
            {

                c = new PacketCreature(Client);
                c.Location = pos;

                //creatures
                if (thingId == 0x0062) //creature is known
                {
                    c.Type = PacketCreatureType.Known;
                    c.Id = msg.GetUInt32();
                    outMsg.AddUInt32(c.Id); //creatureid
                }
                else if (thingId == 0x0061)
                { //creature is not known
                    //perhaps we have to remove a known creature
                    c.RemoveId = msg.GetUInt32();
                    outMsg.AddUInt32(c.RemoveId);

                    //add a new creature
                    c.Type = PacketCreatureType.Unknown;
                    c.Id = msg.GetUInt32();
                    outMsg.AddUInt32(c.Id);

                    c.Name = msg.GetString();
                    outMsg.AddString(c.Name);
                }

                //read creature properties
                c.Health = msg.GetByte();
                outMsg.AddByte(c.Health);

                c.Direction = msg.GetByte();
                outMsg.AddByte(c.Direction);

                c.Outfit = msg.GetOutfit();
                outMsg.AddOutfit(c.Outfit);

                c.LightLevel = msg.GetByte();
                outMsg.AddByte(c.LightLevel);

                c.LightColor = msg.GetByte();
                outMsg.AddByte(c.LightColor);

                c.Speed = msg.GetUInt16();
                outMsg.AddUInt16(c.Speed);

                c.Skull = (Constants.Skull)msg.GetByte();
                outMsg.AddByte((byte)c.Skull);

                c.PartyShield = (Constants.PartyShield)msg.GetByte();
                outMsg.AddByte((byte)c.PartyShield);

                creatures.Add(c);

                return true;
            }
            else if (thingId == 0x0063)
            {
                //creature turn
                c = new PacketCreature(Client);
                c.Location = pos;
                c.Type = PacketCreatureType.Turn;
                c.Id = msg.GetUInt32();
                outMsg.AddUInt32(c.Id);

                c.Direction = msg.GetByte();
                outMsg.AddByte(c.Direction);

                creatures.Add(c);

                return true;
            }
            else
            {
                //item
                UInt16 itemId;
                if (thingId == UInt16.MaxValue)
                {
                    itemId = msg.GetUInt16();
                    outMsg.AddUInt16(itemId);
                }
                else
                    itemId = thingId;

                Item item = new Item(Client, itemId, 0, "", ItemLocation.FromLocation(pos, (byte)n));

                if (item.HasExtraByte)
                {
                    item.Count = msg.GetByte();
                    outMsg.AddByte(item.Count);
                }

                if (n == 0)
                    tile.Ground = item;
                else
                    tile.Items.Add(item);

                return true;
            }
        }
コード例 #5
0
ファイル: MapPacket.cs プロジェクト: FaNtA91/pokemonapi
        protected bool ParseTileDescription(NetworkMessage msg, Objects.Location pos, NetworkMessage outMsg)
        {
            int n = 0;
            bool ret = true;
            Tile tile = new Tile(Client, 0, pos);
            while (true)
            {
                ushort inspectTileId = msg.PeekUInt16();

                if (inspectTileId >= 0xFF00)
                {
                    //end of the tile
                    ret = true;
                    break;
                }
                else
                {
                    if (n > 10)
                    {
                        ret = false;
                        break;
                    }
                    //read tile things: items and creatures
                    ParseThing(msg, pos, tile, n, outMsg);
                }

                n++;
            }

            tiles.Add(tile);
            return ret;
        }
コード例 #6
0
        public override void ToNetworkMessage(NetworkMessage msg)
        {
            Tile playerTile = Client.Map.GetTileWithPlayer();
            msg.AddByte((byte)Type);
            msg.AddLocation(playerTile.Location);

            //GetMapDescription(playerLocation.X - 8, playerLocation.Y - 6, playerLocation.Z, 18, 14, msg);

            int startz, endz, zstep;

            if (playerTile.Location.Z > 7)
            {
                startz = playerTile.Location.Z - 2;
                endz = Math.Min(15, playerTile.Location.Z + 2);
                zstep = 1;
            }
            else
            {
                startz = 7;
                endz = 0;
                zstep = -1;
            }

            uint mapStart = Client.Memory.ReadUInt32(Addresses.Map.MapPointer);

            for (int z = startz; z != endz + zstep; z += zstep)
            {
                for (int x = 0; x < 18; x++)
                {
                    for (int y = 0; y < 14; y++)
                    {
                        Location memLoc = new Location(x, y, z);
                        uint num = memLoc.ToTileNumber();
                        Tile pCurrent = new Tile(Client, mapStart + (Addresses.Map.StepTile * num), num);

                        foreach (TileObject o in pCurrent.Objects)
                        {
                            if (o.Id == 0x0063)
                            {
                                // Add a creature
                                Creature c = Client.BattleList.GetCreatures().FirstOrDefault(cr => cr.Id == o.Data);

                                if (c == null)
                                    throw new Exception("Creature does not exist.");

                                // Add as unknown
                                msg.AddUInt16((ushort)o.Id);

                                // No need to remove a creature
                                msg.AddUInt32(0);

                                // Add the creature id
                                msg.AddUInt32((uint)c.Id);

                                msg.AddString(c.Name);

                                msg.AddByte((byte)c.HPBar);

                                msg.AddByte((byte)c.Direction);

                                msg.AddOutfit(c.Outfit);

                                msg.AddByte((byte)c.Light);

                                msg.AddByte((byte)c.LightColor);

                                msg.AddUInt16((ushort)c.WalkSpeed);

                                msg.AddByte((byte)c.Skull);

                                msg.AddByte((byte)c.PartyShield);
                            }
                            else
                            {
                                Item item = new Item(Client, (uint)o.Id);

                                msg.AddUInt16((ushort)item.Id);

                                if (item.HasExtraByte)
                                    msg.AddByte(item.Count);
                            }
                        }

                        msg.AddByte(0x00);
                        msg.AddByte(0xFF);
                    }
                }
            }

        }
コード例 #7
0
ファイル: Map.cs プロジェクト: FaNtA91/pokemonapi
    private Tile GetTile(Location worldLocation, Tile playerTile)
    {
        // All credits goes to blaster_89 who solved this.
        if (playerTile == null) { playerTile = GetTileWithPlayer(); }
         Location memLoc = worldLocation.ToMemoryLocation(playerTile,client);
         uint num = memLoc.ToTileNumber();
 
        int minFloor = 0, maxFloor = 0;
        for (int i = 0; i < 8; i++)
        { 
            if (playerTile.TileNumber   >= Addresses.Map.MaxTiles  * i &&
                playerTile.TileNumber <= Addresses.Map.MaxTiles * (i + 1))
            {
         
                minFloor =  Convert.ToInt32(Addresses.Map.MaxTiles * i);
                maxFloor =  Convert.ToInt32(Addresses.Map.MaxTiles * (i + 1) - 1);
                break;
            }
        }
        if (num > maxFloor) { num = Convert.ToUInt32(num - maxFloor + minFloor - 1); }
        else if (num < minFloor) { num = Convert.ToUInt32(maxFloor - minFloor + num + 1); }
        return GetTile(num, playerTile);
    }
コード例 #8
0
ファイル: Map.cs プロジェクト: FaNtA91/pokemonapi
 private Tile GetTile(uint tileNumber, Tile playerTile)
 {
     Location worldLocation = tileNumber.ToMemoryLocation().ToWorldLocation(playerTile, client);
     return new Tile(client, tileNumber.ToMapTileAddress(client), tileNumber, worldLocation);
 }
コード例 #9
0
ファイル: Inventory.cs プロジェクト: FaNtA91/pokemonapi
 /// <summary>
 /// Use an item on a tile (eg. fishing)
 /// </summary>
 /// <param name="id"></param>
 /// <param name="onTile"></param>
 /// <returns></returns>
 public bool UseItemOnTile(uint id, Tile onTile)
 {
     return Packets.Outgoing.ItemUseOnPacket.Send(client, ItemLocation.FromHotkey().ToLocation(), (ushort)id, 0, onTile.Location, (ushort)onTile.Ground.Id, 0);
 }