示例#1
0
    public static void AddMastery(GameSession session, FishMetadata fish, bool newFish)
    {
        if (newFish)
        {
            int exp = fish.Rarity * 2;
            session.Player.Levels.GainMasteryExp(MasteryType.Fishing, exp);
            session.Send(FishingPacket.IncreaseMastery(MasteryType.Fishing, fish.Id, exp));
            return;
        }

        int                 expChance;
        Random              rnd         = Random.Shared;
        MasteryExp          masteryExp  = session.Player.Levels.MasteryExp.FirstOrDefault(x => x.Type == MasteryType.Fishing);
        FishingSpotMetadata fishingSpot = FishingSpotMetadataStorage.GetMetadata(session.Player.MapId);

        if (masteryExp.CurrentExp > fishingSpot.MaxMastery)
        {
            expChance = rnd.Next(0, 200); // decrease chance of gaining mastery by half
        }
        else
        {
            expChance = rnd.Next(0, 100);
        }

        if (expChance <= 10)
        {
            int exp = rnd.Next(1, 3);
            session.Player.Levels.GainMasteryExp(MasteryType.Fishing, exp);
            session.Send(FishingPacket.IncreaseMastery(MasteryType.Fishing, fish.Id, exp));
        }
    }
示例#2
0
    public static void AddNewFish(GameSession session, FishMetadata fish, int size)
    {
        session.Player.FishAlbum[fish.Id] = new()
        {
            FishId      = fish.Id,
            TotalCaught = 1,
            LargestFish = size
        };

        AddMastery(session, fish, true);

        if (size >= fish.BigSize[0])
        {
            session.Player.FishAlbum[fish.Id].LargestFish = size;
        }
    }
示例#3
0
    public static void AddExistingFish(GameSession session, FishMetadata fish, int size)
    {
        session.Player.FishAlbum[fish.Id].TotalCaught += 1;

        if (size > session.Player.FishAlbum[fish.Id].LargestFish)
        {
            session.Player.FishAlbum[fish.Id].LargestFish = size;
        }

        AddMastery(session, fish, false);

        if (size >= fish.BigSize[0])
        {
            session.Player.FishAlbum[fish.Id].LargestFish = size;
        }
    }
示例#4
0
    private static void HandleCatch(GameSession session, PacketReader packet)
    {
        bool success = packet.ReadBool();

        CoordF guideBlock = Block.ClosestBlock(session.Player.Guide.Coord);

        guideBlock.Z -= Block.BLOCK_SIZE; // get liquid block coord
        MapBlock            block  = MapMetadataStorage.GetMapBlock(session.Player.MapId, guideBlock.ToShort());
        List <FishMetadata> fishes = FishMetadataStorage.GetValidFishes(session.Player.MapId, block.Attribute);

        //determine fish rarity
        List <FishMetadata> selectedFishRarities = FilterFishesByRarity(fishes);

        Random       rnd             = RandomProvider.Get();
        int          randomFishIndex = rnd.Next(selectedFishRarities.Count);
        FishMetadata fish            = selectedFishRarities[randomFishIndex];

        //determine fish size
        int fishSize = rnd.NextDouble() switch
        {
        public static Packet CatchFish(Player player, FishMetadata fish, int fishSize, bool success)
        {
            PacketWriter pWriter = PacketWriter.Of(SendOp.FISHING);

            pWriter.WriteEnum(FishingPacketMode.CatchFish);
            pWriter.WriteInt(fish.Id);
            pWriter.WriteInt(fishSize);
            pWriter.WriteBool(success);
            pWriter.WriteByte();

            if (success)
            {
                pWriter.WriteInt(fish.Id);
                pWriter.WriteInt(player.FishAlbum[fish.Id].TotalCaught);
                pWriter.WriteInt(player.FishAlbum[fish.Id].TotalPrizeFish);
                pWriter.WriteInt(player.FishAlbum[fish.Id].LargestFish);
            }

            return(pWriter);
        }