From e6200546a149be13829da28c5e572c5a5bb02d51 Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Thu, 29 Oct 2026 09:54:32 -0400 Subject: [PATCH 01/17] Remove the unused Lua fishing data tables --- scripts/globals/hobbies/fishing/data.lua | 248 ----------------------- 1 file changed, 248 deletions(-) delete mode 100644 scripts/globals/hobbies/fishing/data.lua diff --git a/scripts/globals/hobbies/fishing/data.lua b/scripts/globals/hobbies/fishing/data.lua deleted file mode 100644 index f78fb07f0cd..00000000000 --- a/scripts/globals/hobbies/fishing/data.lua +++ /dev/null @@ -1,248 +0,0 @@ ------------------------------------ --- Fishing Data ------------------------------------ -xi = xi or {} -xi.fishing = xi.fishing or {} ------------------------------------ - --- TODO: Remove unnecesary data. For instance, if brokenRodId is 0, then the rod is obviously unbreakable. -xi.fishing.rodData = -{ - -- [rod Id] = { material, size, flags, minRank, maxRank, attack, bonusAttack, recovery, time, timeBonus, delay, move, delay2, move2, isBreakable, brokenRodId, isMMM, isLegendary, rating } - [xi.item.BAMBOO_FISHING_ROD ] = { 0, 0, 0, 1, 8, 140, 0, 60, 30, 0, 2, 1, 1, 0, 2, true, xi.item.BROKEN_BAMBOO_FISHING_ROD, false, false, 3 }, - [xi.item.CARBON_FISHING_ROD ] = { 1, 0, 0, 1, 13, 100, 0, 75, 43, 0, 2, 1, 1, 0, 4, true, xi.item.BROKEN_CARBON_FISHING_ROD, false, false, 7 }, - [xi.item.CLOTHESPOLE ] = { 0, 1, 1, 12, 16, 170, 0, 50, 30, 0, 0, 0, 1, 0, 3, true, xi.item.BROKEN_CLOTHESPOLE, false, false, 10 }, - [xi.item.COMPOSITE_FISHING_ROD ] = { 1, 1, 1, 11, 24, 100, 0, 70, 43, 0, 0, 0, 1, 0, 2, true, xi.item.BROKEN_COMPOSITE_FISHING_ROD, false, false, 13 }, - [xi.item.EBISU_FISHING_ROD ] = { 1, 0, 4, 1, 30, 100, 50, 50, 30, 10, 2, 1, 1, 0, 3, false, xi.item.NONE, false, true, 15 }, - [xi.item.EBISU_FISHING_ROD_P1 ] = { 1, 0, 4, 1, 30, 100, 50, 50, 40, 10, 2, 1, 1, 0, 3, false, xi.item.NONE, false, true, 15 }, - [xi.item.FASTWATER_FISHING_ROD ] = { 0, 0, 0, 1, 7, 135, 0, 65, 30, 0, 2, 1, 1, 0, 2, true, xi.item.BROKEN_FASTWATER_FISHING_ROD, false, false, 4 }, - [xi.item.GLASS_FIBER_FISHING_ROD ] = { 1, 0, 0, 1, 12, 100, 0, 80, 45, 0, 2, 1, 1, 0, 4, true, xi.item.BROKEN_GLASS_FIBER_FISHING_ROD, false, false, 8 }, - [xi.item.GOLDFISH_BASKET ] = { 0, 0, 8, 1, 5, 100, 0, 50, 20, 0, 0, 0, 0, 0, 0, false, xi.item.NONE, false, false, 0 }, - [xi.item.HALCYON_FISHING_ROD ] = { 1, 0, 2, 1, 18, 100, 0, 70, 41, 0, 2, 1, 0, 2, 3, true, xi.item.BROKEN_HALCYON_FISHING_ROD, false, false, 9 }, - [xi.item.HUME_FISHING_ROD ] = { 0, 0, 2, 1, 10, 125, 0, 65, 30, 0, 2, 1, 0, 2, 3, true, xi.item.BROKEN_HUME_FISHING_ROD, false, false, 6 }, - [xi.item.JUDGES_ROD ] = { 1, 0, 0, 1, 40, 200, 100, 100, 60, 30, 2, 1, 1, 0, 5, false, xi.item.NONE, false, true, 16 }, - [xi.item.LU_SHANGS_FISHING_ROD ] = { 0, 0, 0, 1, 28, 110, 20, 100, 40, 10, 2, 1, 1, 0, 2, true, xi.item.BROKEN_LU_SHANGS_FISHING_ROD, false, true, 14 }, - [xi.item.LU_SHANGS_FISHING_ROD_P1] = { 0, 0, 0, 1, 28, 110, 20, 100, 50, 10, 2, 1, 1, 0, 2, true, xi.item.BROKEN_LU_SHANGS_FISHING_ROD_P1, false, true, 14 }, - [xi.item.MAZE_MONGER_FISHING_ROD ] = { 1, 0, 0, 1, 25, 100, 0, 100, 30, 0, 2, 1, 1, 10, 2, true, xi.item.BROKEN_MMM_FISHING_ROD, true, false, 0 }, - [xi.item.MITHRAN_FISHING_ROD ] = { 0, 1, 1, 8, 18, 130, 0, 65, 30, 0, 0, 0, 1, 0, 3, true, xi.item.BROKEN_MITHRAN_FISHING_ROD, false, false, 12 }, - [xi.item.SINGLE_HOOK_FISHING_ROD ] = { 1, 1, 1, 14, 22, 100, 0, 80, 45, 0, 0, 0, 1, 0, 3, true, xi.item.BROKEN_SINGLE_HOOK_FISHING_ROD, false, false, 11 }, - [xi.item.TARUTARU_FISHING_ROD ] = { 0, 0, 0, 1, 9, 130, 0, 70, 30, 0, 2, 1, 1, 0, 4, true, xi.item.BROKEN_TARUTARU_FISHING_ROD, false, false, 5 }, - [xi.item.WILLOW_FISHING_ROD ] = { 0, 0, 0, 1, 5, 150, 0, 50, 30, 0, 2, 1, 1, 0, 2, true, xi.item.BROKEN_WILLOW_FISHING_ROD, false, false, 1 }, - [xi.item.YEW_FISHING_ROD ] = { 0, 0, 0, 1, 6, 145, 0, 55, 30, 0, 2, 1, 1, 0, 2, true, xi.item.BROKEN_YEW_FISHING_ROD, false, false, 2 }, -} - -xi.fishing.baitData = -{ - -- [bait Id] = { isConsumable, maxHook, isLosable, flags, isMMM, rankMod } - [xi.item.BALL_OF_CRAYFISH_PASTE ] = { 0, 1, true, 0, false, 0 }, - [xi.item.BALL_OF_INSECT_PASTE ] = { 0, 1, true, 0, false, 0 }, - [xi.item.BALL_OF_SARDINE_PASTE ] = { 0, 1, true, 0, false, 0 }, - [xi.item.BALL_OF_TROUT_PASTE ] = { 0, 1, true, 0, false, 0 }, - [xi.item.DRIED_SQUID ] = { 2, 1, true, 0, false, 0 }, - [xi.item.DRILL_CALAMARY ] = { 0, 1, true, 0, false, 0 }, - [xi.item.DWARF_PUGIL ] = { 0, 1, true, 0, false, 0 }, - [xi.item.FLY_LURE ] = { 1, 1, true, 16, false, 0 }, - [xi.item.FROG_LURE ] = { 1, 1, true, 0, false, 0 }, - [xi.item.GIANT_SHELL_BUG ] = { 0, 1, true, 0, false, 0 }, - [xi.item.GOLIATH_WORM ] = { 0, 1, true, 0, false, 0 }, - [xi.item.JUDGE_FLY ] = { 1, 1, false, 0, false, 0 }, - [xi.item.JUDGE_MINNOW ] = { 1, 1, false, 0, false, 0 }, - [xi.item.JUDGES_LURE ] = { 1, 1, false, 0, false, 0 }, - [xi.item.LARGE_MAZE_MONGER_BALL ] = { 1, 1, true, 0, true, 0 }, - [xi.item.LITTLE_WORM ] = { 0, 1, true, 0, false, 0 }, - [xi.item.LIZARD_LURE ] = { 1, 1, true, 0, false, 0 }, - [xi.item.LUFAISE_FLY ] = { 0, 1, true, 0, false, 0 }, - [xi.item.LUGWORM ] = { 0, 1, true, 0, false, 0 }, - [xi.item.MAZE_MONGER_MINNOW ] = { 2, 1, true, 0, true, 0 }, - [xi.item.MEATBALL ] = { 0, 1, true, 0, false, 0 }, - [xi.item.MINNOW ] = { 1, 1, true, 0, false, 0 }, - [xi.item.PEELED_CRAYFISH ] = { 0, 1, true, 0, false, 0 }, - [xi.item.PEELED_LOBSTER ] = { 0, 1, true, 0, false, 0 }, - [xi.item.PIECE_OF_ROTTEN_MEAT ] = { 0, 1, true, 0, false, 0 }, - [xi.item.REGULAR_MAZE_MONGER_BALL] = { 1, 1, true, 0, true, 0 }, - [xi.item.ROBBER_RIG ] = { 1, 1, true, 72, false, 0 }, - [xi.item.ROGUE_RIG ] = { 1, 1, true, 72, false, 0 }, - [xi.item.SABIKI_RIG ] = { 1, 3, true, 0, false, 0 }, - [xi.item.SEA_DRAGON_LIVER ] = { 0, 1, true, 0, false, 0 }, - [xi.item.SHELL_BUG ] = { 0, 1, true, 0, false, 0 }, - [xi.item.SHRIMP_LURE ] = { 1, 1, true, 0, false, 0 }, - [xi.item.SINKING_MINNOW ] = { 1, 1, true, 1, false, 0 }, - [xi.item.SLICE_OF_BLUETAIL ] = { 0, 1, true, 0, false, 0 }, - [xi.item.SLICE_OF_COD ] = { 0, 1, true, 0, false, 0 }, - [xi.item.SLICE_OF_MOAT_CARP ] = { 0, 1, true, 0, false, 0 }, - [xi.item.SLICE_OF_SARDINE ] = { 0, 1, true, 0, false, 0 }, - [xi.item.SUPER_SCOOP ] = { 0, 3, true, 32, false, 0 }, - [xi.item.WORM_LURE ] = { 1, 1, true, 0, false, 0 }, -} - --- TODO: unnecesary data -> ranking is always 0, waterType is unused in the code???, requiredCatches is always '', family is always 0, isQuestOnly is probably unneeded, isDisabled doesnt need to exist. -xi.fishing.catchData = -{ - -- [item Id] = { skillLvl, difficulty, delay, move, minLength, maxLength, ranking, isBig, waterType, questLog, questId, questStatus, flags, hourPattern, moonPattern, monthPattern, isLegendary, legendFlags, isDebris, maxHookAmount, rarity, ki, requiredCatches, family, isQuestOnly, isContested, isDisabled } - -- Fish - [xi.item.ABAIA ] = { 150, 37, 7, 13, 269, 317, 34, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.AHTAPOT ] = { 90, 31, 8, 7, 55, 145, 25, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 4, false, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ALABALIGI ] = { 37, 16, 5, 11, 1, 1, 15, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 10, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ARMORED_PISCES ] = { 108, 22, 9, 12, 50, 125, 19, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 350, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.BASTORE_BREAM ] = { 86, 31, 7, 9, 1, 1, 22, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 250, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BASTORE_SARDINE_1 ] = { 9, 21, 11, 6, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 1, 2, 2, 3, false, 0, false, 3, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BASTORE_SARDINE_2 ] = { 9, 21, 11, 6, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 1, 2, 2, 3, false, 0, false, 3, 500, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.BASTORE_SWEEPER ] = { 12, 17, 4, 2, 1, 1, 99, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 2, 3, false, 0, false, 1, 950, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BETTA ] = { 68, 16, 3, 12, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 7, 4, 9, false, 0, false, 1, 600, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BHEFHEL_MARLIN_1 ] = { 61, 20, 10, 11, 60, 140, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 7, 1, 8, false, 0, false, 1, 700, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.BHEFHEL_MARLIN_2 ] = { 61, 20, 10, 11, 60, 140, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 7, 1, 8, false, 0, false, 1, 700, xi.keyItem.NONE, '', 0, false, 1, false }, -- Has 2 different item Ids - [xi.item.BIBIKI_URCHIN ] = { 3, 20, 13, 1, 1, 1, 1, false, 1, xi.questLog.NONE, 255, 0, 0, 3, 1, 1, false, 0, false, 1, 50, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BIBIKIBO ] = { 8, 22, 12, 3, 1, 1, 1, false, 1, xi.questLog.NONE, 255, 0, 0, 5, 2, 2, false, 0, false, 1, 100, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BLACK_EEL_1 ] = { 47, 24, 5, 8, 1, 1, 15, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 4, 3, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BLACK_EEL_2 ] = { 47, 24, 5, 8, 1, 1, 15, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 4, 3, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.BLACK_GHOST ] = { 88, 36, 9, 11, 1, 1, 18, false, 0, xi.questLog.NONE, 255, 0, 0, 1, 1, 8, false, 0, false, 1, 450, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BLACK_SOLE ] = { 96, 33, 5, 11, 1, 1, 23, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 0, false, 0, false, 1, 150, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BLADEFISH_1 ] = { 71, 21, 6, 12, 40, 120, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 4, 4, false, 0, false, 1, 750, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.BLADEFISH_2 ] = { 71, 21, 6, 12, 40, 120, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 4, 4, false, 0, false, 1, 750, xi.keyItem.NONE, '', 0, false, 1, false }, -- Has 2 different item Ids - [xi.item.BLINDFISH ] = { 28, 18, 6, 8, 1, 1, 18, false, 0, xi.questLog.NONE, 255, 0, 0, 7, 2, 8, false, 0, false, 1, 750, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BLUETAIL_1 ] = { 55, 24, 4, 12, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 3, false, 0, false, 1, 650, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BLUETAIL_2 ] = { 55, 24, 4, 12, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 3, false, 0, false, 1, 650, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.BRASS_LOACH ] = { 42, 27, 11, 7, 1, 1, 99, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 5, 8, false, 0, false, 1, 750, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CA_CUONG ] = { 78, 17, 12, 6, 1, 1, 99, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CAEDARVA_FROG ] = { 30, 17, 6, 13, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 2, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CAVE_CHERAX ] = { 130, 36, 7, 4, 115, 235, 32, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.CHEVAL_SALMON ] = { 21, 21, 7, 7, 1, 1, 17, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.COBALT_JELLYFISH ] = { 5, 28, 13, 0, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 1, 1, 0, false, 0, false, 1, 700, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CONE_CALAMARY ] = { 48, 40, 10, 5, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 1, 3, 1, 3, false, 0, false, 3, 850, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.COPPER_FROG_1 ] = { 16, 22, 8, 4, 1, 1, 9, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.COPPER_FROG_2 ] = { 16, 22, 8, 4, 1, 1, 9, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.CORAL_BUTTERFLY ] = { 40, 26, 10, 8, 1, 1, 19, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 3, 8, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CRAYFISH_1 ] = { 7, 24, 13, 6, 1, 1, 8, false, 0, xi.questLog.NONE, 255, 0, 0, 2, 2, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CRAYFISH_2 ] = { 7, 24, 13, 6, 1, 1, 8, false, 0, xi.questLog.NONE, 255, 0, 0, 2, 2, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.CRESCENT_FISH ] = { 69, 28, 7, 8, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 4, 3, false, 0, false, 1, 450, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CRYSTAL_BASS ] = { 35, 24, 7, 12, 1, 1, 17, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 2, 7, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.DARK_BASS_1 ] = { 33, 23, 7, 8, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 9, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.DARK_BASS_2 ] = { 33, 23, 7, 8, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 9, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.DENIZANASI ] = { 5, 28, 13, 0, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 1, 1, 0, false, 0, false, 1, 700, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.DIL ] = { 96, 33, 5, 11, 1, 1, 23, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 0, false, 0, false, 1, 150, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ELSHIMO_FROG ] = { 30, 25, 6, 13, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 4, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ELSHIMO_NEWT ] = { 60, 26, 8, 11, 1, 1, 19, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 1, 1, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.EMPEROR_FISH ] = { 91, 36, 4, 13, 60, 180, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 8, false, 0, false, 1, 100, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.FAT_GREEDIE ] = { 24, 30, 10, 8, 1, 1, 11, false, 1, xi.questLog.NONE, 255, 0, 0, 1, 4, 4, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.FOREST_CARP ] = { 20, 11, 9, 11, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 2, 1, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GARPIKE ] = { 83, 24, 3, 10, 1, 1, 99, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 4, 4, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GAVIAL_FISH ] = { 81, 30, 14, 15, 40, 130, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 4, 4, false, 0, false, 1, 400, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.GERROTHORAX ] = { 134, 29, 7, 8, 210, 250, 30, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 2, 9, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GIANT_CATFISH_1 ] = { 31, 13, 6, 12, 40, 130, 19, true, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 6, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.GIANT_CATFISH_2 ] = { 31, 13, 6, 12, 40, 130, 19, true, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 6, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 1, false }, -- Has 2 different item Ids - [xi.item.GIANT_CHIRAI ] = { 110, 25, 4, 15, 75, 170, 27, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.GIANT_DONKO_1 ] = { 50, 17, 14, 8, 45, 150, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 5, 4, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.GIANT_DONKO_2 ] = { 50, 17, 14, 8, 45, 150, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 5, 4, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 1, false }, -- Has 2 different item Ids - [xi.item.GIGANT_OCTOPUS_1 ] = { 80, 18, 6, 9, 65, 170, 99, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GIGANT_OCTOPUS_2 ] = { 80, 18, 6, 9, 65, 170, 99, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.GIGANT_SQUID ] = { 91, 43, 7, 13, 80, 170, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 4, false, 0, false, 1, 100, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.GOLD_CARP ] = { 56, 18, 10, 14, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 8, false, 0, false, 1, 750, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GOLD_LOBSTER_1 ] = { 46, 35, 4, 3, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 1, 3, 1, 0, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GOLD_LOBSTER_2 ] = { 46, 35, 4, 3, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 1, 3, 1, 0, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.GREEDIE ] = { 14, 10, 7, 14, 1, 1, 10, false, 1, xi.questLog.NONE, 255, 0, 0, 1, 3, 7, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GRIMMONITE ] = { 90, 31, 8, 7, 55, 145, 25, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 4, false, 0, false, 1, 450, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.GUGRU_TUNA_1 ] = { 41, 16, 6, 13, 40, 120, 22, true, 1, xi.questLog.NONE, 255, 0, 16, 1, 1, 0, false, 0, false, 1, 850, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.GUGRU_TUNA_2 ] = { 41, 16, 6, 13, 40, 120, 22, true, 1, xi.questLog.NONE, 255, 0, 16, 1, 1, 0, false, 0, false, 1, 850, xi.keyItem.NONE, '', 0, false, 1, false }, -- Has 2 different item Ids - [xi.item.GUGRUSAURUS ] = { 140, 39, 6, 5, 145, 425, 33, true, 1, xi.questLog.NONE, 255, 0, 0, 3, 1, 4, true, 7, false, 1, 350, xi.keyItem.SERPENT_RUMORS, '', 0, false, 1, false }, - [xi.item.GURNARD ] = { 26, 13, 11, 9, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 6, 4, 3, false, 0, false, 1, 550, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.HAMSI ] = { 9, 21, 11, 6, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 1, 7, 1, 6, false, 0, false, 3, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ICEFISH ] = { 49, 38, 11, 7, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 3, false, 0, false, 3, 900, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ISTAKOZ ] = { 46, 35, 4, 3, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 3, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ISTAVRIT_1 ] = { 37, 13, 11, 5, 10, 20, 16, true, 0, xi.questLog.NONE, 255, 0, 0, 1, 2, 6, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ISTAVRIT_2 ] = { 37, 13, 11, 5, 10, 20, 16, true, 0, xi.questLog.NONE, 255, 0, 0, 1, 2, 6, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.ISTIRIDYE ] = { 53, 27, 13, 2, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 1, 3, 2, 4, false, 0, false, 1, 850, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.JUNGLE_CATFISH ] = { 80, 26, 9, 11, 40, 110, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 6, false, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.KALAMAR ] = { 48, 40, 10, 5, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 1, 3, 1, 3, false, 0, false, 3, 850, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.KALKANBALIGI ] = { 105, 19, 6, 12, 60, 120, 27, true, 1, xi.questLog.NONE, 255, 0, 16, 3, 5, 8, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.KAPLUMBAGA ] = { 53, 28, 8, 5, 1, 1, 11, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 5, 4, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.KAYABALIGI ] = { 75, 30, 7, 8, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 2, false, 0, false, 1, 650, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.KILICBALIGI ] = { 62, 18, 10, 11, 1, 1, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 7, 1, 8, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.LAKERDA ] = { 41, 16, 6, 13, 55, 100, 22, true, 0, xi.questLog.NONE, 255, 0, 0, 1, 4, 0, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.LAMP_MARIMO ] = { 3, 26, 13, 2, 1, 1, 1, false, 0, xi.questLog.NONE, 255, 0, 0, 6, 2, 5, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.LIK ] = { 140, 48, 2, 14, 185, 465, 33, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 6, true, 8, false, 1, 850, xi.keyItem.SERPENT_RUMORS, '', 0, false, 1, false }, - [xi.item.LUNGFISH ] = { 32, 16, 4, 8, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 1, 1, 8, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MATSYA ] = { 150, 31, 5, 12, 163, 331, 99, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 1, 0, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MEGALODON ] = { 87, 33, 10, 11, 446, 625, 99, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MERCANBALIGI ] = { 86, 31, 7, 9, 1, 1, 22, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 400, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MOAT_CARP_1 ] = { 11, 16, 10, 9, 1, 1, 7, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MOAT_CARP_2 ] = { 11, 16, 10, 9, 1, 1, 7, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.MOLA_MOLA ] = { 135, 16, 12, 12, 110, 200, 30, true, 1, xi.questLog.NONE, 255, 0, 16, 1, 5, 8, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MONKE_ONKE_1 ] = { 51, 17, 11, 9, 45, 115, 18, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 4, false, 0, false, 1, 550, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.MONKE_ONKE_2 ] = { 51, 17, 11, 9, 45, 115, 18, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 4, false, 0, false, 1, 550, xi.keyItem.NONE, '', 0, false, 1, false }, -- Has 2 different item Ids - [xi.item.MOORISH_IDOL ] = { 26, 18, 6, 11, 1, 1, 9, false, 1, xi.questLog.NONE, 255, 0, 0, 3, 2, 4, false, 0, false, 1, 700, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MORINABALIGI ] = { 94, 36, 4, 13, 1, 1, 23, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 8, false, 0, false, 1, 450, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MUDDY_SIREDON ] = { 18, 23, 12, 11, 1, 1, 1, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 1, 1, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.NEBIMONITE ] = { 27, 30, 9, 5, 1, 1, 10, false, 1, xi.questLog.NONE, 255, 0, 0, 3, 1, 2, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.NOBLE_LADY ] = { 66, 30, 7, 10, 1, 1, 13, false, 1, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 700, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.NOSTEAU_HERRING_1 ] = { 39, 21, 7, 8, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 3, false, 0, false, 1, 950, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.NOSTEAU_HERRING_2 ] = { 39, 21, 7, 8, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 3, false, 0, false, 1, 950, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.OGRE_EEL_1 ] = { 35, 29, 13, 11, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 2, 3, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.OGRE_EEL_2 ] = { 35, 29, 13, 11, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 2, 3, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.PHANAUET_NEWT ] = { 4, 13, 10, 11, 1, 1, 1, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 2, 1, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.PIPIRA_1 ] = { 29, 11, 6, 14, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 5, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.PIPIRA_2 ] = { 29, 11, 6, 14, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 5, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.PIRARUCU ] = { 89, 24, 13, 11, 161, 210, 99, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 1, 3, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.PTERYGOTUS ] = { 99, 28, 8, 7, 25, 260, 24, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 9, false, 0, false, 1, 400, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.QUUS_1 ] = { 19, 12, 7, 11, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 2, 3, false, 0, false, 3, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.QUUS_2 ] = { 19, 12, 7, 11, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 2, 3, false, 0, false, 3, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.RED_TERRAPIN ] = { 53, 28, 8, 5, 1, 1, 11, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 5, 2, false, 0, false, 1, 750, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RHINOCHIMERA_1 ] = { 72, 17, 5, 14, 10, 90, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 7, false, 0, false, 1, 450, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RHINOCHIMERA_2 ] = { 72, 17, 5, 14, 10, 90, 23, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 7, false, 0, false, 1, 450, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.RYUGU_TITAN ] = { 150, 48, 1, 15, 200, 490, 34, true, 1, xi.questLog.NONE, 255, 0, 0, 0, 1, 8, true, 0, false, 1, 700, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.SANDFISH ] = { 50, 36, 3, 10, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 1, 3, 3, 7, false, 0, false, 3, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.SAZANBALIGI ] = { 56, 18, 10, 14, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 1, false, 0, false, 1, 650, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.SEA_ZOMBIE ] = { 100, 39, 3, 15, 80, 195, 28, true, 1, xi.questLog.NONE, 255, 0, 0, 4, 1, 2, true, 0, false, 1, 350, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.SHALL_SHELL ] = { 53, 27, 13, 2, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 1, 3, 4, 8, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.SHINING_TROUT_1 ] = { 37, 16, 5, 11, 1, 1, 15, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.SHINING_TROUT_2 ] = { 37, 16, 5, 11, 1, 1, 15, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.SILVER_SHARK ] = { 76, 35, 3, 9, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 0, false, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.TAKITARO ] = { 101, 18, 3, 14, 55, 130, 28, true, 0, xi.questLog.NONE, 255, 0, 16, 3, 5, 2, true, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.TAVNAZIAN_GOBY ] = { 75, 30, 7, 8, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 4, 2, false, 0, false, 1, 850, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.THREE_EYED_FISH_1 ] = { 79, 22, 10, 10, 50, 120, 25, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 4, 8, false, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.THREE_EYED_FISH_2 ] = { 79, 22, 10, 10, 50, 120, 25, true, 0, xi.questLog.NONE, 255, 0, 0, 3, 4, 8, false, 0, false, 1, 500, xi.keyItem.NONE, '', 0, false, 1, false }, -- Has 2 different item Ids - [xi.item.TIGER_COD_1 ] = { 29, 23, 9, 9, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 8, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.TIGER_COD_2 ] = { 29, 23, 9, 9, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 8, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.TINY_GOLDFISH ] = { 20, 22, 0, 14, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 5, 1, 7, false, 0, false, 3, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.TITANIC_SAWFISH ] = { 125, 39, 6, 13, 75, 210, 29, true, 1, xi.questLog.NONE, 255, 0, 0, 0, 1, 9, true, 0, false, 1, 400, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.TITANICTUS ] = { 101, 28, 3, 12, 75, 210, 28, true, 1, xi.questLog.NONE, 255, 0, 0, 3, 5, 8, true, 0, false, 1, 350, xi.keyItem.NONE, '', 0, false, 1, false }, - [xi.item.TRICOLORED_CARP ] = { 27, 19, 12, 12, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 8, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.TRICORN ] = { 128, 38, 11, 9, 105, 210, 31, true, 0, xi.questLog.NONE, 255, 0, 0, 0, 4, 10, true, 0, false, 1, 500, xi.keyItem.FROG_FISHING, '', 0, false, 1, false }, - [xi.item.TRILOBITE ] = { 59, 27, 5, 6, 1, 1, 14, false, 1, xi.questLog.NONE, 255, 0, 0, 3, 2, 10, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.TRUMPET_SHELL ] = { 63, 18, 10, 5, 1, 1, 99, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 1, 3, false, 0, false, 1, 550, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.TURNABALIGI ] = { 104, 30, 7, 12, 65, 175, 24, true, 0, xi.questLog.NONE, 255, 0, 16, 6, 1, 7, false, 0, false, 1, 450, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.USKUMRU ] = { 55, 24, 4, 12, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 2, 3, false, 0, false, 1, 550, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.VEYDAL_WRASSE_1 ] = { 35, 13, 11, 5, 40, 125, 25, true, 0, xi.questLog.NONE, 255, 0, 0, 6, 4, 3, false, 0, false, 1, 400, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.VEYDAL_WRASSE_2 ] = { 35, 13, 11, 5, 40, 125, 25, true, 0, xi.questLog.NONE, 255, 0, 0, 6, 4, 3, false, 0, false, 1, 400, xi.keyItem.NONE, '', 0, false, 0, false }, -- Has 2 different item Ids - [xi.item.VONGOLA_CLAM ] = { 53, 20, 8, 4, 1, 1, 13, false, 1, xi.questLog.NONE, 255, 0, 1, 3, 1, 3, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.YAYINBALIGI ] = { 31, 13, 6, 12, 40, 130, 19, true, 0, xi.questLog.NONE, 255, 0, 0, 4, 1, 6, false, 0, false, 1, 900, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.YELLOW_GLOBE ] = { 17, 17, 8, 8, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 2, 1, false, 0, false, 3, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.YILANBALIGI ] = { 47, 24, 5, 8, 1, 1, 15, false, 0, xi.questLog.NONE, 255, 0, 0, 4, 4, 3, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ZAFMLUG_BASS ] = { 43, 27, 6, 7, 1, 1, 15, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 10, false, 0, false, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.ZEBRA_EEL ] = { 71, 32, 10, 10, 1, 1, 23, false, 0, xi.questLog.NONE, 255, 0, 0, 3, 1, 8, false, 0, false, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - - -- Debris - [xi.item.ARROWWOOD_LOG ] = { 4, 18, 13, 2, 1, 3, 18, true, 0, xi.questLog.NONE, 255, 0, 0, 2, 2, 0, false, 0, true, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.BUGBEAR_MASK ] = { 54, 42, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 2, 1, 0, false, 0, true, 1, 700, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CLUMP_OF_ADOULINIAN_KELP] = { 6, 18, 13, 2, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 4, 0, false, 0, true, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CLUMP_OF_PAMTAM_KELP ] = { 3, 24, 13, 2, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 0, 2, 4, 0, false, 0, true, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.COPPER_RING ] = { 24, 40, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 1, 0, 0, 0, false, 0, true, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.CORAL_FRAGMENT ] = { 74, 47, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 1, 7, 1, 0, false, 0, true, 1, 200, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.DAMP_SCROLL ] = { 20, 35, 13, 2, 1, 1, 1, false, 0, xi.questLog.NONE, 255, 0, 0, 1, 2, 0, false, 0, true, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.FISH_SCALE_SHIELD ] = { 7, 15, 13, 2, 1, 1, 13, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, true, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.GIL ] = { 1, 22, 13, 2, 1, 1, 1, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, true, 1, 100, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.HYDROGAUGE ] = { 7, 25, 13, 2, 1, 1, 1, false, 0, xi.questLog.AHT_URHGAN, 25, 0, 0, 0, 0, 0, false, 0, true, 1, 1000, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MITHRA_SNARE ] = { 30, 22, 13, 2, 1, 1, 1, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, true, 1, 1000, xi.keyItem.NONE, '', 0, true , 0, false }, - [xi.item.MOBLIN_MASK ] = { 54, 44, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, true, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MYTHRIL_DAGGER ] = { 90, 78, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, true, 1, 80, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.MYTHRIL_SWORD ] = { 90, 15, 13, 2, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, true, 1, 60, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.NORG_SHELL ] = { 14, 31, 13, 2, 1, 1, 14, false, 0, xi.questLog.NONE, 255, 0, 0, 2, 2, 0, false, 0, true, 1, 600, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RIPPED_CAP ] = { 20, 36, 13, 2, 1, 1, 13, false, 0, xi.questLog.WINDURST, 23, 0, 0, 1, 3, 0, false, 0, true, 1, 400, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RUSTY_BUCKET ] = { 1, 19, 13, 2, 1, 1, 10, false, 0, xi.questLog.NONE, 255, 0, 9, 1, 1, 0, false, 0, true, 1, 900, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RUSTY_CAP ] = { 30, 38, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 9, 7, 1, 0, false, 0, true, 1, 800, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RUSTY_GREATSWORD ] = { 60, 57, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 8, 0, 0, 0, false, 0, true, 1, 400, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RUSTY_LEGGINGS ] = { 7, 26, 13, 2, 1, 1, 18, false, 0, xi.questLog.NONE, 255, 0, 9, 2, 0, 0, false, 0, true, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RUSTY_PICK ] = { 40, 47, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 8, 2, 1, 0, false, 0, true, 1, 400, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.RUSTY_SUBLIGAR ] = { 5, 22, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 8, 2, 0, 0, false, 0, true, 1, 500, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.SILVER_RING ] = { 34, 40, 13, 2, 1, 1, 5, false, 0, xi.questLog.NONE, 255, 0, 1, 0, 0, 0, false, 0, true, 1, 300, xi.keyItem.NONE, '', 0, false, 0, false }, - [xi.item.TARUTARU_SNARE ] = { 30, 22, 13, 2, 1, 1, 1, false, 0, xi.questLog.NONE, 255, 0, 0, 0, 0, 0, false, 0, true, 1, 1000, xi.keyItem.NONE, '', 0, true, 0, false }, -} From 17b203d7344b748e68697b8159d94dab28a9a61d Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:07 -0400 Subject: [PATCH 02/17] Remove fishing stock pools --- sql/fishing_group.sql | 2142 ++++++++++++++++---------------- src/map/time_server.cpp | 2 - src/map/utils/fishingutils.cpp | 108 +- src/map/utils/fishingutils.h | 33 - 4 files changed, 1072 insertions(+), 1213 deletions(-) diff --git a/sql/fishing_group.sql b/sql/fishing_group.sql index c048b32e692..cf07d464a2b 100644 --- a/sql/fishing_group.sql +++ b/sql/fishing_group.sql @@ -26,8 +26,6 @@ CREATE TABLE `fishing_group` ( `groupid` int(10) unsigned NOT NULL, `fishid` int(10) unsigned NOT NULL, `rarity` smallint(5) unsigned NOT NULL DEFAULT '0', - `pool_size` smallint(5) unsigned NOT NULL DEFAULT '0', - `restock_rate` smallint(5) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`groupid`,`fishid`) ) ENGINE=Aria TRANSACTIONAL=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -41,1486 +39,1486 @@ LOCK TABLES `fishing_group` WRITE; -- East Sarutabaruta, Lake Tepokalipuka -INSERT INTO `fishing_group` VALUES (1,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (1,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (1,4462,550,160,5); -- Monke Onke -INSERT INTO `fishing_group` VALUES (1,4464,1000,500,15); -- Pipira -INSERT INTO `fishing_group` VALUES (1,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (1,4473,450,245,5); -- Crescent Fish -INSERT INTO `fishing_group` VALUES (1,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (1,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (1,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (1,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (1,4462,550); -- Monke Onke +INSERT INTO `fishing_group` VALUES (1,4464,1000); -- Pipira +INSERT INTO `fishing_group` VALUES (1,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (1,4473,450); -- Crescent Fish +INSERT INTO `fishing_group` VALUES (1,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (1,14242,500); -- Rusty Subligar -- East Sarutabaruta, Seaside -INSERT INTO `fishing_group` VALUES (2,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (2,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (2,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (2,4383,800,290,7); -- Gold Lobster -INSERT INTO `fishing_group` VALUES (2,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (2,4461,250,230,6); -- Bastore Bream -INSERT INTO `fishing_group` VALUES (2,4471,750,145,4); -- Bladefish -INSERT INTO `fishing_group` VALUES (2,4481,1000,500,15); -- Ogre Eel -INSERT INTO `fishing_group` VALUES (2,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (2,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (2,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (2,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (2,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (2,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (2,4383,800); -- Gold Lobster +INSERT INTO `fishing_group` VALUES (2,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (2,4461,250); -- Bastore Bream +INSERT INTO `fishing_group` VALUES (2,4471,750); -- Bladefish +INSERT INTO `fishing_group` VALUES (2,4481,1000); -- Ogre Eel +INSERT INTO `fishing_group` VALUES (2,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (2,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (2,14242,500); -- Rusty Subligar -- East Sarutabaruta, Other Waterside (south) / East Sarutabaruta, Other Waterside (west) / East Sarutabaruta, Other Waterside (rivers) -INSERT INTO `fishing_group` VALUES (3,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (3,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (3,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (3,14242,500); -- Rusty Subligar -- Port Windurst, Whole Zone -INSERT INTO `fishing_group` VALUES (4,591,1000,300,9); -- Ripped Cap -INSERT INTO `fishing_group` VALUES (4,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (4,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (4,4461,250,230,6); -- Bastore Bream -INSERT INTO `fishing_group` VALUES (4,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (4,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (4,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (4,65535,1000,300,9); -- Gil +INSERT INTO `fishing_group` VALUES (4,591,1000); -- Ripped Cap +INSERT INTO `fishing_group` VALUES (4,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (4,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (4,4461,250); -- Bastore Bream +INSERT INTO `fishing_group` VALUES (4,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (4,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (4,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (4,65535,1000); -- Gil -- Bastok Markets, North Side -INSERT INTO `fishing_group` VALUES (5,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (5,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (5,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (5,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (5,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (5,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (5,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (5,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (5,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (5,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (5,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (5,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (5,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (5,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (5,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (5,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (5,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (5,14242,500); -- Rusty Subligar -- Bastok Markets, South Side -INSERT INTO `fishing_group` VALUES (6,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (6,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (6,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (6,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (6,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (6,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (6,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (6,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (6,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (6,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (6,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (6,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (6,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (6,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (6,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (6,14242,500); -- Rusty Subligar -- Port Bastok, Whole Zone -INSERT INTO `fishing_group` VALUES (7,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (7,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (7,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (7,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (7,4461,250,230,6); -- Bastore Bream -INSERT INTO `fishing_group` VALUES (7,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (7,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (7,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (7,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (7,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (7,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (7,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (7,4461,250); -- Bastore Bream +INSERT INTO `fishing_group` VALUES (7,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (7,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (7,14242,500); -- Rusty Subligar -- Bastok Mines, Whole Zone -INSERT INTO `fishing_group` VALUES (8,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (8,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (8,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (8,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (8,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (8,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (8,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (8,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (8,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (8,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (8,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (8,14242,500); -- Rusty Subligar -- Northern San d'Oria, Whole Zone -INSERT INTO `fishing_group` VALUES (9,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (9,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (9,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (9,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (9,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (9,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (9,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (9,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (9,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (9,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (9,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (9,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (9,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (9,14242,500); -- Rusty Subligar -- Port San d'Oria, Whole Zone -INSERT INTO `fishing_group` VALUES (10,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (10,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (10,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (10,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (10,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (10,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (10,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (10,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (10,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (10,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (10,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (10,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (10,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (10,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (10,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (10,14242,500); -- Rusty Subligar -- Windurst Waters, Whole Zone / Windurst Walls, Whole Zone / Windurst Woods, Whole Zone -INSERT INTO `fishing_group` VALUES (11,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (11,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (11,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (11,4464,1000,500,15); -- Pipira -INSERT INTO `fishing_group` VALUES (11,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (11,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (11,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (11,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (11,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (11,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (11,4464,1000); -- Pipira +INSERT INTO `fishing_group` VALUES (11,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (11,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (11,14242,500); -- Rusty Subligar -- Heavens Tower, Whole Zone -INSERT INTO `fishing_group` VALUES (12,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (12,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (12,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (12,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (12,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (12,14242,500); -- Rusty Subligar -- Lower Jeuno, Whole Zone -INSERT INTO `fishing_group` VALUES (13,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (13,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (13,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (13,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (13,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (13,4482,950,500,15); -- Nosteau Herring -INSERT INTO `fishing_group` VALUES (13,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (13,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (13,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (13,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (13,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (13,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (13,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (13,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (13,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (13,4482,950); -- Nosteau Herring +INSERT INTO `fishing_group` VALUES (13,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (13,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (13,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (13,14242,500); -- Rusty Subligar -- Port Jeuno, Whole Zone -INSERT INTO `fishing_group` VALUES (14,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (14,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (14,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (14,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (14,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (14,4482,950,500,15); -- Nosteau Herring -INSERT INTO `fishing_group` VALUES (14,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (14,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (14,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (14,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (14,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (14,16451,80,10,2); -- Mythril Dagger +INSERT INTO `fishing_group` VALUES (14,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (14,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (14,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (14,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (14,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (14,4482,950); -- Nosteau Herring +INSERT INTO `fishing_group` VALUES (14,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (14,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (14,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (14,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (14,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (14,16451,80); -- Mythril Dagger -- Bostaunieux Oubliette, Whole Zone -INSERT INTO `fishing_group` VALUES (15,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (15,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (15,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (15,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (15,16537,60,10,2); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (15,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (15,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (15,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (15,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (15,16537,60); -- Mythril Sword -- East Ronfaure, Whole Zone -INSERT INTO `fishing_group` VALUES (16,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (16,4354,1000,500,15); -- Shining Trout -INSERT INTO `fishing_group` VALUES (16,4379,1000,500,15); -- Cheval Salmon -INSERT INTO `fishing_group` VALUES (16,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (16,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (16,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (16,13454,800,300,9); -- Copper Ring +INSERT INTO `fishing_group` VALUES (16,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (16,4354,1000); -- Shining Trout +INSERT INTO `fishing_group` VALUES (16,4379,1000); -- Cheval Salmon +INSERT INTO `fishing_group` VALUES (16,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (16,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (16,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (16,13454,800); -- Copper Ring -- West Ronfaure, Knightwell -INSERT INTO `fishing_group` VALUES (17,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (17,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (17,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (17,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (17,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (17,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (17,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (17,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (17,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (17,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (17,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (17,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (17,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (17,14117,500); -- Rusty Leggings -- Ghelsba Outpost, Pond North / Ghelsba Outpost, Pond South -INSERT INTO `fishing_group` VALUES (18,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (18,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (18,4472,1000,500,15); -- Crayfish +INSERT INTO `fishing_group` VALUES (18,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (18,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (18,4472,1000); -- Crayfish -- Ghelsba Outpost, River -INSERT INTO `fishing_group` VALUES (19,4354,1000,500,15); -- Shining Trout -INSERT INTO `fishing_group` VALUES (19,4379,1000,500,15); -- Cheval Salmon -INSERT INTO `fishing_group` VALUES (19,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (19,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (19,4472,1000,500,15); -- Crayfish +INSERT INTO `fishing_group` VALUES (19,4354,1000); -- Shining Trout +INSERT INTO `fishing_group` VALUES (19,4379,1000); -- Cheval Salmon +INSERT INTO `fishing_group` VALUES (19,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (19,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (19,4472,1000); -- Crayfish -- Yughott Grotto, Whole Zone -INSERT INTO `fishing_group` VALUES (20,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (20,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (20,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (20,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (20,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (20,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (20,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (20,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (20,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (20,16655,400); -- Rusty Pick -- Gusgen Mines, Interior Pool West / Gusgen Mines, Interior Pool Center / Gusgen Mines, Interior Pool East -INSERT INTO `fishing_group` VALUES (21,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (21,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (21,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (21,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (21,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (21,4477,550,145,4); -- Gavial Fish -INSERT INTO `fishing_group` VALUES (21,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (21,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (21,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (21,16537,60,10,2); -- Mythril Sword -INSERT INTO `fishing_group` VALUES (21,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (21,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (21,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (21,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (21,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (21,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (21,4477,550); -- Gavial Fish +INSERT INTO `fishing_group` VALUES (21,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (21,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (21,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (21,16537,60); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (21,16655,400); -- Rusty Pick -- Gusgen Mines, Pool Upper West / Gusgen Mines, Pool Upper East / Gusgen Mines, Pool Lower East -INSERT INTO `fishing_group` VALUES (22,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (22,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (22,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (22,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (22,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (22,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (22,16537,60,10,2); -- Mythril Sword -INSERT INTO `fishing_group` VALUES (22,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (22,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (22,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (22,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (22,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (22,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (22,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (22,16537,60); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (22,16655,400); -- Rusty Pick -- La Theine Plateau, Whole Zone -INSERT INTO `fishing_group` VALUES (23,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (23,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (23,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (23,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (23,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (23,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (23,12522,200,10,1); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (23,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (23,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (23,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (23,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (23,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (23,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (23,12522,200); -- Rusty Cap -- Ordelle's Caves, Whole Zone -INSERT INTO `fishing_group` VALUES (24,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (24,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (24,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (24,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (24,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (24,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (24,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (24,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (24,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (24,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (24,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (24,14242,500); -- Rusty Subligar -- Selbina, Whole Zone -INSERT INTO `fishing_group` VALUES (25,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (25,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (25,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (25,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (25,4500,1000,500,15); -- Greedie -INSERT INTO `fishing_group` VALUES (25,4501,1000,500,15); -- Fat Greedie -INSERT INTO `fishing_group` VALUES (25,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (25,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (25,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (25,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (25,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (25,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (25,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (25,4500,1000); -- Greedie +INSERT INTO `fishing_group` VALUES (25,4501,1000); -- Fat Greedie +INSERT INTO `fishing_group` VALUES (25,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (25,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (25,14242,500); -- Rusty Subligar -- Valkurm Dunes, Whole Zone -INSERT INTO `fishing_group` VALUES (26,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (26,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (26,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (26,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (26,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (26,4484,600,275,6); -- Shall Shell -INSERT INTO `fishing_group` VALUES (26,4500,1000,500,15); -- Greedie -INSERT INTO `fishing_group` VALUES (26,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (26,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (26,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (26,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (26,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (26,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (26,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (26,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (26,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (26,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (26,4484,600); -- Shall Shell +INSERT INTO `fishing_group` VALUES (26,4500,1000); -- Greedie +INSERT INTO `fishing_group` VALUES (26,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (26,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (26,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (26,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (26,14242,500); -- Rusty Subligar -- Valkurm Dunes, Pirate's Chart mini-quest -INSERT INTO `fishing_group` VALUES (140,5329,500,300,9); -- Tarutaru Snare -INSERT INTO `fishing_group` VALUES (140,5330,500,300,9); -- Mithra Snare +INSERT INTO `fishing_group` VALUES (140,5329,500); -- Tarutaru Snare +INSERT INTO `fishing_group` VALUES (140,5330,500); -- Mithra Snare -- Batallia Downs, North Seaside / Batallia Downs, South Seaside -INSERT INTO `fishing_group` VALUES (27,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (27,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (27,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (27,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (27,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (27,4451,500,245,5); -- Silver Shark -INSERT INTO `fishing_group` VALUES (27,4482,950,500,15); -- Nosteau Herring -INSERT INTO `fishing_group` VALUES (27,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (27,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (27,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (27,16537,60,10,2); -- Mythril Sword -INSERT INTO `fishing_group` VALUES (27,16606,400,300,9); -- Rusty Greatsword -INSERT INTO `fishing_group` VALUES (27,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (27,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (27,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (27,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (27,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (27,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (27,4451,500); -- Silver Shark +INSERT INTO `fishing_group` VALUES (27,4482,950); -- Nosteau Herring +INSERT INTO `fishing_group` VALUES (27,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (27,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (27,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (27,16537,60); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (27,16606,400); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (27,16655,400); -- Rusty Pick -- Carpenters' Landing, South Landing / Carpenters' Landing, North Landing -INSERT INTO `fishing_group` VALUES (28,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (28,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (28,4354,1000,500,15); -- Shining Trout -INSERT INTO `fishing_group` VALUES (28,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (28,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (28,5126,1000,500,15); -- Muddy Siredont -INSERT INTO `fishing_group` VALUES (28,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (28,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (28,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (28,4354,1000); -- Shining Trout +INSERT INTO `fishing_group` VALUES (28,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (28,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (28,5126,1000); -- Muddy Siredont +INSERT INTO `fishing_group` VALUES (28,14117,500); -- Rusty Leggings -- Carpenters' Landing, Other Waterside South / Carpenters' Landing, Other Waterside Center / Carpenters' Landing, Other Waterside North -INSERT INTO `fishing_group` VALUES (29,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (29,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (29,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (29,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (29,5125,1000,500,15); -- Phanauet Newt -INSERT INTO `fishing_group` VALUES (29,5126,1000,500,15); -- Muddy Siredont +INSERT INTO `fishing_group` VALUES (29,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (29,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (29,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (29,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (29,5125,1000); -- Phanauet Newt +INSERT INTO `fishing_group` VALUES (29,5126,1000); -- Muddy Siredont -- Carpenters' Landing, Central Landing -INSERT INTO `fishing_group` VALUES (30,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (30,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (30,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (30,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (30,5126,1000,500,15); -- Muddy Siredont +INSERT INTO `fishing_group` VALUES (30,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (30,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (30,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (30,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (30,5126,1000); -- Muddy Siredont -- Davoi, Basin of a Waterfall -INSERT INTO `fishing_group` VALUES (31,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (31,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (31,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (31,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (31,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (31,4463,500,50,6); -- Takitaro -INSERT INTO `fishing_group` VALUES (31,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (31,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (31,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (31,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (31,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (31,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (31,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (31,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (31,4463,500); -- Takitaro +INSERT INTO `fishing_group` VALUES (31,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (31,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (31,16655,400); -- Rusty Pick -- Davoi, Wailing Pond -INSERT INTO `fishing_group` VALUES (32,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (32,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (32,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (32,16606,400,300,9); -- Rusty Greatsword -INSERT INTO `fishing_group` VALUES (32,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (32,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (32,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (32,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (32,16606,400); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (32,16655,400); -- Rusty Pick -- Davoi, Pond -INSERT INTO `fishing_group` VALUES (33,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (33,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (33,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (33,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (33,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (33,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (33,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (33,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (33,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (33,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (33,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (33,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (33,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (33,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (33,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (33,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (33,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (33,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (33,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (33,16655,400); -- Rusty Pick -- Davoi, Other Waterside -INSERT INTO `fishing_group` VALUES (34,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (34,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (34,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (34,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (34,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (34,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (34,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (34,14117,500); -- Rusty Leggings -- Jugner Forest, Crystalwater Spring -INSERT INTO `fishing_group` VALUES (35,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (35,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (35,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (35,4528,1000,500,15); -- Crystal Bass -INSERT INTO `fishing_group` VALUES (35,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (35,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (35,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (35,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (35,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (35,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (35,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (35,4528,1000); -- Crystal Bass +INSERT INTO `fishing_group` VALUES (35,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (35,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (35,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (35,16655,400); -- Rusty Pick -- Jugner Forest, Lake Mechieume - Mouth -INSERT INTO `fishing_group` VALUES (36,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (36,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (36,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (36,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (36,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (36,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (36,4454,200,115,3); -- Emperor Fish -INSERT INTO `fishing_group` VALUES (36,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (36,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (36,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (36,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (36,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (36,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (36,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (36,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (36,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (36,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (36,4454,200); -- Emperor Fish +INSERT INTO `fishing_group` VALUES (36,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (36,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (36,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (36,14117,500); -- Rusty Leggings -- Jugner Forest, Lake Mechieume - Main -INSERT INTO `fishing_group` VALUES (37,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (37,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (37,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (37,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (37,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (37,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (37,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (37,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (37,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (37,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (37,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (37,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (37,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (37,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (37,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (37,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (37,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (37,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (37,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (37,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (37,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (37,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (37,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (37,14117,500); -- Rusty Leggings -- Jugner Forest, Maidens Spring -INSERT INTO `fishing_group` VALUES (38,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (38,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (38,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (38,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (38,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (38,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (38,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (38,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (38,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (38,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (38,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (38,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (38,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (38,16655,400); -- Rusty Pick -- Jugner Forest, River -INSERT INTO `fishing_group` VALUES (39,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (39,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (39,4354,1000,500,15); -- Shining Trout -INSERT INTO `fishing_group` VALUES (39,4379,1000,500,15); -- Cheval Salmon -INSERT INTO `fishing_group` VALUES (39,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (39,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (39,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (39,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (39,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (39,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (39,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (39,4354,1000); -- Shining Trout +INSERT INTO `fishing_group` VALUES (39,4379,1000); -- Cheval Salmon +INSERT INTO `fishing_group` VALUES (39,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (39,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (39,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (39,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (39,14117,500); -- Rusty Leggings -- Tavnazian Safehold, Whole Zone / Mamook, Other Waterside / Dangruf Wadi, Whole Zone -INSERT INTO `fishing_group` VALUES (40,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (40,4472,1000,500,15); -- Crayfish +INSERT INTO `fishing_group` VALUES (40,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (40,4472,1000); -- Crayfish -- Korroloka Tunnel, Salt Water -INSERT INTO `fishing_group` VALUES (41,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (41,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (41,4291,1000,500,15); -- Sandfish -INSERT INTO `fishing_group` VALUES (41,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (41,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (41,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (41,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (41,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (41,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (41,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (41,16606,400,300,9); -- Rusty Greatsword -INSERT INTO `fishing_group` VALUES (41,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (41,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (41,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (41,4291,1000); -- Sandfish +INSERT INTO `fishing_group` VALUES (41,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (41,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (41,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (41,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (41,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (41,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (41,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (41,16606,400); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (41,16655,400); -- Rusty Pick -- Korroloka Tunnel, Fresh Water -INSERT INTO `fishing_group` VALUES (42,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (42,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (42,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (42,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (42,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (42,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (42,16606,400,300,9); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (42,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (42,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (42,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (42,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (42,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (42,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (42,16606,400); -- Rusty Greatsword -- North Gustaberg, Basin of Waterfall -INSERT INTO `fishing_group` VALUES (43,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (43,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (43,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (43,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (43,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (43,4477,550,145,4); -- Gavial Fish -INSERT INTO `fishing_group` VALUES (43,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (43,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (43,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (43,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (43,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (43,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (43,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (43,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (43,4477,550); -- Gavial Fish +INSERT INTO `fishing_group` VALUES (43,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (43,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (43,14242,500); -- Rusty Subligar -- North Gustaberg, River -INSERT INTO `fishing_group` VALUES (44,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (44,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (44,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (44,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (44,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (44,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (44,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (44,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (44,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (44,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (44,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (44,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (44,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (44,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (44,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (44,14242,500); -- Rusty Subligar -- Palborough Mines, Whole Zone -INSERT INTO `fishing_group` VALUES (45,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (45,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (45,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (45,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (45,4515,1000,500,15); -- Copper Frog +INSERT INTO `fishing_group` VALUES (45,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (45,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (45,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (45,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (45,4515,1000); -- Copper Frog -- South Gustaberg, Hot Springs -INSERT INTO `fishing_group` VALUES (46,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (46,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (46,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (46,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (46,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (46,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (46,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (46,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (46,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (46,14242,500); -- Rusty Subligar -- South Gustaberg, Seaside -INSERT INTO `fishing_group` VALUES (47,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (47,4383,800,290,7); -- Gold Lobster -INSERT INTO `fishing_group` VALUES (47,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (47,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (47,4461,250,230,6); -- Bastore Bream -INSERT INTO `fishing_group` VALUES (47,4471,750,145,4); -- Bladefish -INSERT INTO `fishing_group` VALUES (47,4481,1000,500,15); -- Ogre Eel -INSERT INTO `fishing_group` VALUES (47,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (47,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (47,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (47,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (47,4383,800); -- Gold Lobster +INSERT INTO `fishing_group` VALUES (47,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (47,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (47,4461,250); -- Bastore Bream +INSERT INTO `fishing_group` VALUES (47,4471,750); -- Bladefish +INSERT INTO `fishing_group` VALUES (47,4481,1000); -- Ogre Eel +INSERT INTO `fishing_group` VALUES (47,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (47,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (47,14242,500); -- Rusty Subligar -- Zeruhn Mines, River -INSERT INTO `fishing_group` VALUES (48,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (48,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (48,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (48,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (48,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (48,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (48,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (48,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (48,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (48,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (48,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (48,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (48,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (48,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (48,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (48,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (48,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (48,14242,500); -- Rusty Subligar -- Zeruhn Mines, Pool -INSERT INTO `fishing_group` VALUES (49,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (49,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (49,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (49,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (49,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (49,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (49,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (49,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (49,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (49,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (49,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (49,14242,500); -- Rusty Subligar -- Pashhow Marshlands, Whole Zone -INSERT INTO `fishing_group` VALUES (50,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (50,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (50,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (50,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (50,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (50,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (50,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (50,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (50,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (50,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (50,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (50,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (50,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (50,16655,400); -- Rusty Pick -- Rolanberry Fields, Small Fountain 1 -INSERT INTO `fishing_group` VALUES (51,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (51,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (51,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (51,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (51,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (51,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (51,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (51,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (51,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (51,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (51,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (51,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (51,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (51,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (51,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (51,16655,400); -- Rusty Pick -- Rolanberry Fields, Fountain of Promises -INSERT INTO `fishing_group` VALUES (52,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (52,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (52,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (52,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (52,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (52,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (52,12316,500,260,5); -- Fish Scale Shield -INSERT INTO `fishing_group` VALUES (52,16537,60,10,2); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (52,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (52,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (52,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (52,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (52,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (52,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (52,12316,500); -- Fish Scale Shield +INSERT INTO `fishing_group` VALUES (52,16537,60); -- Mythril Sword -- Rolanberry Fields, Fountain of Partings -INSERT INTO `fishing_group` VALUES (53,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (53,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (53,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (53,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (53,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (53,4472,1000,500,15); -- Crayfish +INSERT INTO `fishing_group` VALUES (53,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (53,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (53,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (53,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (53,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (53,4472,1000); -- Crayfish -- Rolanberry Fields, Small Fountain 2 -INSERT INTO `fishing_group` VALUES (54,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (54,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (54,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (54,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (54,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (54,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (54,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (54,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (54,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (54,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (54,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (54,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (54,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (54,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (54,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (54,16655,400); -- Rusty Pick -- Giddeus, Giddeus Spring -INSERT INTO `fishing_group` VALUES (55,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (55,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (55,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (55,4462,550,160,5); -- Monke Onke -INSERT INTO `fishing_group` VALUES (55,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (55,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (55,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (55,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (55,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (55,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (55,4462,550); -- Monke Onke +INSERT INTO `fishing_group` VALUES (55,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (55,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (55,14117,500); -- Rusty Leggings -- Giddeus, Pond - West -INSERT INTO `fishing_group` VALUES (56,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (56,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (56,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (56,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (56,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (56,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (56,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (56,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (56,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (56,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (56,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (56,14117,500); -- Rusty Leggings -- Giddeus, Pond - North -INSERT INTO `fishing_group` VALUES (57,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (57,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (57,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (57,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (57,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (57,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (57,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (57,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (57,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (57,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (57,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (57,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (57,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (57,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (57,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (57,14117,500); -- Rusty Leggings -- Giddeus, Misc Puddles -INSERT INTO `fishing_group` VALUES (58,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (58,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (58,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (58,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (58,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (58,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (58,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (58,14117,500); -- Rusty Leggings -- West Sarutabaruta, Pond -INSERT INTO `fishing_group` VALUES (59,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (59,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (59,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (59,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (59,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (59,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (59,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (59,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (59,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (59,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (59,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (59,14242,500); -- Rusty Subligar -- West Sarutabaruta, Seaside -INSERT INTO `fishing_group` VALUES (60,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (60,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (60,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (60,4383,800,290,7); -- Gold Lobster -INSERT INTO `fishing_group` VALUES (60,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (60,4461,250,230,6); -- Bastore Bream -INSERT INTO `fishing_group` VALUES (60,4471,750,145,4); -- Bladefish -INSERT INTO `fishing_group` VALUES (60,4481,1000,500,15); -- Ogre Eel -INSERT INTO `fishing_group` VALUES (60,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (60,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (60,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (60,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (60,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (60,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (60,4383,800); -- Gold Lobster +INSERT INTO `fishing_group` VALUES (60,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (60,4461,250); -- Bastore Bream +INSERT INTO `fishing_group` VALUES (60,4471,750); -- Bladefish +INSERT INTO `fishing_group` VALUES (60,4481,1000); -- Ogre Eel +INSERT INTO `fishing_group` VALUES (60,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (60,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (60,14242,500); -- Rusty Subligar -- Bibiki Bay, PI - South Beach -INSERT INTO `fishing_group` VALUES (61,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (61,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (61,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (61,4314,850,500,15); -- Bibikibo -INSERT INTO `fishing_group` VALUES (61,4317,1000,500,15); -- Trilobite -INSERT INTO `fishing_group` VALUES (61,4318,100,50,6); -- Bibiki Urchin -INSERT INTO `fishing_group` VALUES (61,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (61,4484,600,275,6); -- Shall Shell -INSERT INTO `fishing_group` VALUES (61,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (61,5121,700,275,6); -- Moorish Idol -INSERT INTO `fishing_group` VALUES (61,5131,900,290,7); -- Vongola Clam -INSERT INTO `fishing_group` VALUES (61,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (61,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (61,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (61,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (61,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (61,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (61,4314,850); -- Bibikibo +INSERT INTO `fishing_group` VALUES (61,4317,1000); -- Trilobite +INSERT INTO `fishing_group` VALUES (61,4318,100); -- Bibiki Urchin +INSERT INTO `fishing_group` VALUES (61,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (61,4484,600); -- Shall Shell +INSERT INTO `fishing_group` VALUES (61,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (61,5121,700); -- Moorish Idol +INSERT INTO `fishing_group` VALUES (61,5131,900); -- Vongola Clam +INSERT INTO `fishing_group` VALUES (61,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (61,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (61,14242,500); -- Rusty Subligar -- Bibiki Bay, PI - North Beach -INSERT INTO `fishing_group` VALUES (62,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (62,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (62,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (62,4317,1000,500,15); -- Trilobite -INSERT INTO `fishing_group` VALUES (62,4318,100,50,6); -- Bibiki Urchin -INSERT INTO `fishing_group` VALUES (62,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (62,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (62,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (62,4484,600,275,6); -- Shall Shell -INSERT INTO `fishing_group` VALUES (62,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (62,5121,700,275,6); -- Moorish Idol -INSERT INTO `fishing_group` VALUES (62,5131,900,290,7); -- Vongola Clam -INSERT INTO `fishing_group` VALUES (62,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (62,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (62,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (62,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (62,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (62,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (62,4317,1000); -- Trilobite +INSERT INTO `fishing_group` VALUES (62,4318,100); -- Bibiki Urchin +INSERT INTO `fishing_group` VALUES (62,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (62,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (62,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (62,4484,600); -- Shall Shell +INSERT INTO `fishing_group` VALUES (62,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (62,5121,700); -- Moorish Idol +INSERT INTO `fishing_group` VALUES (62,5131,900); -- Vongola Clam +INSERT INTO `fishing_group` VALUES (62,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (62,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (62,14242,500); -- Rusty Subligar -- Bibiki Bay, PI - West Beach / Bibiki Bay, PI - East Beach -INSERT INTO `fishing_group` VALUES (63,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (63,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (63,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (63,4318,100,50,6); -- Bibiki Urchin -INSERT INTO `fishing_group` VALUES (63,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (63,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (63,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (63,4484,600,275,6); -- Shall Shell -INSERT INTO `fishing_group` VALUES (63,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (63,5121,700,275,6); -- Moorish Idol -INSERT INTO `fishing_group` VALUES (63,5131,900,290,7); -- Vongola Clam -INSERT INTO `fishing_group` VALUES (63,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (63,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (63,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (63,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (63,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (63,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (63,4318,100); -- Bibiki Urchin +INSERT INTO `fishing_group` VALUES (63,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (63,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (63,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (63,4484,600); -- Shall Shell +INSERT INTO `fishing_group` VALUES (63,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (63,5121,700); -- Moorish Idol +INSERT INTO `fishing_group` VALUES (63,5131,900); -- Vongola Clam +INSERT INTO `fishing_group` VALUES (63,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (63,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (63,14242,500); -- Rusty Subligar -- Bibiki Bay, BB - South Seaside -INSERT INTO `fishing_group` VALUES (64,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (64,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (64,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (64,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (64,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (64,4471,750,145,4); -- Bladefish -INSERT INTO `fishing_group` VALUES (64,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (64,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (64,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (64,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (64,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (64,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (64,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (64,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (64,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (64,4471,750); -- Bladefish +INSERT INTO `fishing_group` VALUES (64,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (64,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (64,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (64,14242,500); -- Rusty Subligar -- Bibiki Bay, BB - Other Seaside -INSERT INTO `fishing_group` VALUES (65,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (65,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (65,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (65,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (65,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (65,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (65,12316,500,260,5); -- Fish Scale Shield -INSERT INTO `fishing_group` VALUES (65,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (65,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (65,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (65,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (65,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (65,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (65,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (65,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (65,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (65,12316,500); -- Fish Scale Shield +INSERT INTO `fishing_group` VALUES (65,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (65,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (65,14242,500); -- Rusty Subligar -- Buburimu Peninsula, Whole Zone -INSERT INTO `fishing_group` VALUES (66,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (66,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (66,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (66,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (66,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (66,4484,600,275,6); -- Shall Shell -INSERT INTO `fishing_group` VALUES (66,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (66,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (66,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (66,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (66,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (66,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (66,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (66,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (66,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (66,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (66,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (66,4484,600); -- Shall Shell +INSERT INTO `fishing_group` VALUES (66,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (66,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (66,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (66,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (66,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (66,16655,400); -- Rusty Pick -- Labyrinth of Onzozo, Whole Zone -INSERT INTO `fishing_group` VALUES (67,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (67,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (67,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (67,14117,500); -- Rusty Leggings -- Manaclipper, Dhalmel Rock -INSERT INTO `fishing_group` VALUES (68,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (68,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (68,4305,700,50,6); -- Ryugu Titan -INSERT INTO `fishing_group` VALUES (68,4314,850,500,15); -- Bibikibo -INSERT INTO `fishing_group` VALUES (68,4317,1000,500,15); -- Trilobite -INSERT INTO `fishing_group` VALUES (68,4318,100,50,6); -- Bibiki Urchin -INSERT INTO `fishing_group` VALUES (68,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (68,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (68,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (68,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (68,4471,750,145,4); -- Bladefish -INSERT INTO `fishing_group` VALUES (68,4476,500,50,6); -- Titanictus -INSERT INTO `fishing_group` VALUES (68,4480,900,400,12); -- Gugru Tuna -INSERT INTO `fishing_group` VALUES (68,4485,700,260,5); -- Noble Lady -INSERT INTO `fishing_group` VALUES (68,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (68,5120,700,20,2); -- Titanic Sawfish -INSERT INTO `fishing_group` VALUES (68,5121,700,275,6); -- Moorish Idol -INSERT INTO `fishing_group` VALUES (68,5127,700,50,6); -- Gugrusaurus -INSERT INTO `fishing_group` VALUES (68,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (68,5131,900,290,7); -- Vongola Clam +INSERT INTO `fishing_group` VALUES (68,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (68,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (68,4305,700); -- Ryugu Titan +INSERT INTO `fishing_group` VALUES (68,4314,850); -- Bibikibo +INSERT INTO `fishing_group` VALUES (68,4317,1000); -- Trilobite +INSERT INTO `fishing_group` VALUES (68,4318,100); -- Bibiki Urchin +INSERT INTO `fishing_group` VALUES (68,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (68,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (68,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (68,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (68,4471,750); -- Bladefish +INSERT INTO `fishing_group` VALUES (68,4476,500); -- Titanictus +INSERT INTO `fishing_group` VALUES (68,4480,900); -- Gugru Tuna +INSERT INTO `fishing_group` VALUES (68,4485,700); -- Noble Lady +INSERT INTO `fishing_group` VALUES (68,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (68,5120,700); -- Titanic Sawfish +INSERT INTO `fishing_group` VALUES (68,5121,700); -- Moorish Idol +INSERT INTO `fishing_group` VALUES (68,5127,700); -- Gugrusaurus +INSERT INTO `fishing_group` VALUES (68,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (68,5131,900); -- Vongola Clam -- Mhaura, Whole Zone -INSERT INTO `fishing_group` VALUES (71,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (71,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (71,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (71,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (71,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (71,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (71,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (71,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (71,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (71,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (71,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (71,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (71,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (71,14117,500); -- Rusty Leggings -- Phomiuna Aqueducts, Whole Zone / Castle Oztroja, Whole Zone / Ranguemont Pass, Whole Zone -INSERT INTO `fishing_group` VALUES (72,4472,1000,500,15); -- Crayfish +INSERT INTO `fishing_group` VALUES (72,4472,1000); -- Crayfish -- Sauromugue Champaign, Whole Zone -INSERT INTO `fishing_group` VALUES (73,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (73,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (73,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (73,4451,500,245,5); -- Silver Shark -INSERT INTO `fishing_group` VALUES (73,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (73,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (73,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (73,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (73,16537,60,10,2); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (73,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (73,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (73,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (73,4451,500); -- Silver Shark +INSERT INTO `fishing_group` VALUES (73,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (73,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (73,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (73,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (73,16537,60); -- Mythril Sword -- Beaucedine Glacier, Seaside -INSERT INTO `fishing_group` VALUES (74,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (74,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (74,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (74,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (74,4474,100,115,3); -- Gigant Squid -INSERT INTO `fishing_group` VALUES (74,4482,950,500,15); -- Nosteau Herring -INSERT INTO `fishing_group` VALUES (74,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (74,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (74,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (74,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (74,16537,60,10,2); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (74,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (74,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (74,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (74,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (74,4474,100); -- Gigant Squid +INSERT INTO `fishing_group` VALUES (74,4482,950); -- Nosteau Herring +INSERT INTO `fishing_group` VALUES (74,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (74,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (74,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (74,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (74,16537,60); -- Mythril Sword -- Beaucedine Glacier, Ponds -INSERT INTO `fishing_group` VALUES (75,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (75,4454,200,115,3); -- Emperor Fish -INSERT INTO `fishing_group` VALUES (75,4470,900,290,7); -- Icefish -INSERT INTO `fishing_group` VALUES (75,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (75,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (75,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (75,16451,80,10,2); -- Mythril Dagger +INSERT INTO `fishing_group` VALUES (75,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (75,4454,200); -- Emperor Fish +INSERT INTO `fishing_group` VALUES (75,4470,900); -- Icefish +INSERT INTO `fishing_group` VALUES (75,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (75,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (75,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (75,16451,80); -- Mythril Dagger -- Fei'Yin, Whole Zone -INSERT INTO `fishing_group` VALUES (76,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (76,13456,300,275,6); -- Silver Ring +INSERT INTO `fishing_group` VALUES (76,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (76,13456,300); -- Silver Ring -- Middle Delkfutt's Tower, Whole Zone / Upper Delkfutt's Tower, Whole Zone / Lower Delkfutt's Tower, Whole Zone -INSERT INTO `fishing_group` VALUES (77,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (77,14117,500); -- Rusty Leggings -- Qufim Island, Northwest Seaside -INSERT INTO `fishing_group` VALUES (78,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (78,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (78,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (78,4474,100,115,3); -- Gigant Squid -INSERT INTO `fishing_group` VALUES (78,4482,950,500,15); -- Nosteau Herring -INSERT INTO `fishing_group` VALUES (78,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (78,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (78,12316,500,260,5); -- Fish Scale Shield -INSERT INTO `fishing_group` VALUES (78,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (78,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (78,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (78,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (78,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (78,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (78,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (78,4474,100); -- Gigant Squid +INSERT INTO `fishing_group` VALUES (78,4482,950); -- Nosteau Herring +INSERT INTO `fishing_group` VALUES (78,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (78,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (78,12316,500); -- Fish Scale Shield +INSERT INTO `fishing_group` VALUES (78,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (78,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (78,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (78,14242,500); -- Rusty Subligar -- Qufim Island, Southwest Seaside -INSERT INTO `fishing_group` VALUES (79,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (79,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (79,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (79,4478,500,130,3); -- Three Eyed Fish -INSERT INTO `fishing_group` VALUES (79,4482,950,500,15); -- Nosteau Herring -INSERT INTO `fishing_group` VALUES (79,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (79,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (79,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (79,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (79,16537,60,10,2); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (79,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (79,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (79,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (79,4478,500); -- Three Eyed Fish +INSERT INTO `fishing_group` VALUES (79,4482,950); -- Nosteau Herring +INSERT INTO `fishing_group` VALUES (79,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (79,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (79,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (79,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (79,16537,60); -- Mythril Sword -- Qufim Island, Other Seaside -INSERT INTO `fishing_group` VALUES (80,4384,750,215,6); -- Black Sole -INSERT INTO `fishing_group` VALUES (80,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (80,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (80,4482,950,500,15); -- Nosteau Herring -INSERT INTO `fishing_group` VALUES (80,4483,1000,500,15); -- Tiger Cod -INSERT INTO `fishing_group` VALUES (80,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (80,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (80,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (80,4384,750); -- Black Sole +INSERT INTO `fishing_group` VALUES (80,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (80,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (80,4482,950); -- Nosteau Herring +INSERT INTO `fishing_group` VALUES (80,4483,1000); -- Tiger Cod +INSERT INTO `fishing_group` VALUES (80,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (80,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (80,14242,500); -- Rusty Subligar -- The Boyahda Tree, Waterfall Basin -INSERT INTO `fishing_group` VALUES (81,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (81,4308,500,50,6); -- Giant Chirai -INSERT INTO `fishing_group` VALUES (81,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (81,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (81,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (81,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (81,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (81,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (81,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (81,4308,500); -- Giant Chirai +INSERT INTO `fishing_group` VALUES (81,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (81,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (81,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (81,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (81,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (81,14117,500); -- Rusty Leggings -- The Boyahda Tree, Waterfall Basin - Hidden -INSERT INTO `fishing_group` VALUES (82,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (82,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (82,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (82,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (82,4454,200,115,3); -- Emperor Fish -INSERT INTO `fishing_group` VALUES (82,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (82,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (82,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (82,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (82,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (82,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (82,4454,200); -- Emperor Fish +INSERT INTO `fishing_group` VALUES (82,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (82,14117,500); -- Rusty Leggings -- The Boyahda Tree, Other Waterside -INSERT INTO `fishing_group` VALUES (83,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (83,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (83,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (83,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (83,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (83,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (83,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (83,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (83,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (83,14117,500); -- Rusty Leggings -- Dragon's Aery, Whole Zone -INSERT INTO `fishing_group` VALUES (84,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (84,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (84,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (84,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (84,4473,450,245,5); -- Crescent Fish -INSERT INTO `fishing_group` VALUES (84,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (84,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (84,16451,80,10,2); -- Mythril Dagger -INSERT INTO `fishing_group` VALUES (84,16537,60,10,2); -- Mythril Sword +INSERT INTO `fishing_group` VALUES (84,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (84,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (84,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (84,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (84,4473,450); -- Crescent Fish +INSERT INTO `fishing_group` VALUES (84,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (84,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (84,16451,80); -- Mythril Dagger +INSERT INTO `fishing_group` VALUES (84,16537,60); -- Mythril Sword -- Ro'Maeve, Whole Zone -INSERT INTO `fishing_group` VALUES (85,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (85,13456,300,275,6); -- Silver Ring +INSERT INTO `fishing_group` VALUES (85,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (85,13456,300); -- Silver Ring -- The Sanctuary of Zi'Tah, Whole Zone -INSERT INTO `fishing_group` VALUES (86,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (86,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (86,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (86,4528,1000,500,15); -- Crystal Bass +INSERT INTO `fishing_group` VALUES (86,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (86,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (86,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (86,4528,1000); -- Crystal Bass -- Eastern Altepa Desert, Whole Zone -INSERT INTO `fishing_group` VALUES (87,4291,1000,500,15); -- Sandfish -INSERT INTO `fishing_group` VALUES (87,4306,900,190,6); -- Giant Donko -INSERT INTO `fishing_group` VALUES (87,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (87,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (87,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (87,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (87,16606,400,300,9); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (87,4291,1000); -- Sandfish +INSERT INTO `fishing_group` VALUES (87,4306,900); -- Giant Donko +INSERT INTO `fishing_group` VALUES (87,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (87,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (87,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (87,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (87,16606,400); -- Rusty Greatsword -- Quicksand Caves, Whole Zone -INSERT INTO `fishing_group` VALUES (88,4309,500,50,6); -- Cave Cherax -INSERT INTO `fishing_group` VALUES (88,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (88,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (88,4309,500); -- Cave Cherax +INSERT INTO `fishing_group` VALUES (88,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (88,14242,500); -- Rusty Subligar -- Rabao, Whole Zone -INSERT INTO `fishing_group` VALUES (89,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (89,4291,1000,500,15); -- Sandfish -INSERT INTO `fishing_group` VALUES (89,4306,900,190,6); -- Giant Donko -INSERT INTO `fishing_group` VALUES (89,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (89,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (89,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (89,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (89,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (89,4291,1000); -- Sandfish +INSERT INTO `fishing_group` VALUES (89,4306,900); -- Giant Donko +INSERT INTO `fishing_group` VALUES (89,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (89,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (89,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (89,14117,500); -- Rusty Leggings -- Western Altepa Desert, Oasis of Hubol -INSERT INTO `fishing_group` VALUES (90,4291,1000,500,15); -- Sandfish -INSERT INTO `fishing_group` VALUES (90,4306,900,190,6); -- Giant Donko -INSERT INTO `fishing_group` VALUES (90,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (90,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (90,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (90,4477,550,145,4); -- Gavial Fish -INSERT INTO `fishing_group` VALUES (90,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (90,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (90,4291,1000); -- Sandfish +INSERT INTO `fishing_group` VALUES (90,4306,900); -- Giant Donko +INSERT INTO `fishing_group` VALUES (90,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (90,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (90,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (90,4477,550); -- Gavial Fish +INSERT INTO `fishing_group` VALUES (90,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (90,14117,500); -- Rusty Leggings -- Western Altepa Desert, Central Spring -INSERT INTO `fishing_group` VALUES (91,4291,1000,500,15); -- Sandfish -INSERT INTO `fishing_group` VALUES (91,4306,900,190,6); -- Giant Donko -INSERT INTO `fishing_group` VALUES (91,4401,1000,1000,36); -- Moat Carp -INSERT INTO `fishing_group` VALUES (91,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (91,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (91,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (91,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (91,4291,1000); -- Sandfish +INSERT INTO `fishing_group` VALUES (91,4306,900); -- Giant Donko +INSERT INTO `fishing_group` VALUES (91,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (91,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (91,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (91,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (91,14117,500); -- Rusty Leggings -- Cape Teriggan, Whole Zone -INSERT INTO `fishing_group` VALUES (92,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (92,4385,1000,500,15); -- Zafmlug Bass -INSERT INTO `fishing_group` VALUES (92,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (92,4484,600,275,6); -- Shall Shell -INSERT INTO `fishing_group` VALUES (92,4500,1000,500,15); -- Greedie -INSERT INTO `fishing_group` VALUES (92,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (92,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (92,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (92,4385,1000); -- Zafmlug Bass +INSERT INTO `fishing_group` VALUES (92,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (92,4484,600); -- Shall Shell +INSERT INTO `fishing_group` VALUES (92,4500,1000); -- Greedie +INSERT INTO `fishing_group` VALUES (92,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (92,14117,500); -- Rusty Leggings -- Kuftal Tunnel, Whole Zone -INSERT INTO `fishing_group` VALUES (93,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (93,4291,1000,500,15); -- Sandfish -INSERT INTO `fishing_group` VALUES (93,4306,900,190,6); -- Giant Donko -INSERT INTO `fishing_group` VALUES (93,4309,500,50,6); -- Cave Cherax -INSERT INTO `fishing_group` VALUES (93,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (93,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (93,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (93,4291,1000); -- Sandfish +INSERT INTO `fishing_group` VALUES (93,4306,900); -- Giant Donko +INSERT INTO `fishing_group` VALUES (93,4309,500); -- Cave Cherax +INSERT INTO `fishing_group` VALUES (93,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (93,14242,500); -- Rusty Subligar -- Kazham, Whole Zone -INSERT INTO `fishing_group` VALUES (94,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (94,591,1000,300,9); -- Ripped Cap -INSERT INTO `fishing_group` VALUES (94,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (94,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (94,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (94,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (94,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (94,4580,900,290,7); -- Coral Butterfly -INSERT INTO `fishing_group` VALUES (94,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (94,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (94,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (94,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (94,591,1000); -- Ripped Cap +INSERT INTO `fishing_group` VALUES (94,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (94,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (94,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (94,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (94,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (94,4580,900); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (94,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (94,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (94,14242,500); -- Rusty Subligar -- Norg, Whole Zone -INSERT INTO `fishing_group` VALUES (95,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (95,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (95,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (95,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (95,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (95,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (95,4580,900,290,7); -- Coral Butterfly -INSERT INTO `fishing_group` VALUES (95,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (95,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (95,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (95,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (95,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (95,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (95,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (95,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (95,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (95,4580,900); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (95,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (95,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (95,14242,500); -- Rusty Subligar -- Sea Serpent Grotto, Other Seaside -INSERT INTO `fishing_group` VALUES (96,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (96,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (96,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (96,1135,600,50,6); -- Norg Shell -INSERT INTO `fishing_group` VALUES (96,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (96,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (96,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (96,4580,900,290,7); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (96,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (96,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (96,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (96,1135,600); -- Norg Shell +INSERT INTO `fishing_group` VALUES (96,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (96,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (96,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (96,4580,900); -- Coral Butterfly -- Sea Serpent Grotto, Pond Under a Bridge -INSERT INTO `fishing_group` VALUES (97,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (97,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (97,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (97,1135,600,50,6); -- Norg Shell -INSERT INTO `fishing_group` VALUES (97,1210,1000,300,9); -- Damp Scroll -INSERT INTO `fishing_group` VALUES (97,4304,450,100,4); -- Grimmonite -INSERT INTO `fishing_group` VALUES (97,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (97,4361,1000,500,15); -- Nebimonite -INSERT INTO `fishing_group` VALUES (97,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (97,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (97,4461,250,230,6); -- Bastore Bream -INSERT INTO `fishing_group` VALUES (97,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (97,4580,900,290,7); -- Coral Butterfly -INSERT INTO `fishing_group` VALUES (97,16606,400,300,9); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (97,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (97,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (97,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (97,1135,600); -- Norg Shell +INSERT INTO `fishing_group` VALUES (97,1210,1000); -- Damp Scroll +INSERT INTO `fishing_group` VALUES (97,4304,450); -- Grimmonite +INSERT INTO `fishing_group` VALUES (97,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (97,4361,1000); -- Nebimonite +INSERT INTO `fishing_group` VALUES (97,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (97,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (97,4461,250); -- Bastore Bream +INSERT INTO `fishing_group` VALUES (97,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (97,4580,900); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (97,16606,400); -- Rusty Greatsword -- Sea Serpent Grotto, Interior of Hidden Door - Mythril -INSERT INTO `fishing_group` VALUES (98,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (98,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (98,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (98,1135,600,50,6); -- Norg Shell -INSERT INTO `fishing_group` VALUES (98,4304,450,100,4); -- Grimmonite -INSERT INTO `fishing_group` VALUES (98,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (98,4361,1000,500,15); -- Nebimonite -INSERT INTO `fishing_group` VALUES (98,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (98,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (98,4451,500,245,5); -- Silver Shark -INSERT INTO `fishing_group` VALUES (98,4461,250,230,6); -- Bastore Bream -INSERT INTO `fishing_group` VALUES (98,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (98,4580,900,290,7); -- Coral Butterfly -INSERT INTO `fishing_group` VALUES (98,16606,400,300,9); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (98,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (98,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (98,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (98,1135,600); -- Norg Shell +INSERT INTO `fishing_group` VALUES (98,4304,450); -- Grimmonite +INSERT INTO `fishing_group` VALUES (98,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (98,4361,1000); -- Nebimonite +INSERT INTO `fishing_group` VALUES (98,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (98,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (98,4451,500); -- Silver Shark +INSERT INTO `fishing_group` VALUES (98,4461,250); -- Bastore Bream +INSERT INTO `fishing_group` VALUES (98,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (98,4580,900); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (98,16606,400); -- Rusty Greatsword -- Sea Serpent Grotto, Interior of Hidden Door - Gold -INSERT INTO `fishing_group` VALUES (99,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (99,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (99,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (99,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (99,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (99,4580,900,290,7); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (99,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (99,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (99,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (99,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (99,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (99,4580,900); -- Coral Butterfly -- Sea Serpent Grotto, Misc Puddles -INSERT INTO `fishing_group` VALUES (100,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (100,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (100,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (100,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (100,4514,1000,500,15); -- Quus +INSERT INTO `fishing_group` VALUES (100,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (100,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (100,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (100,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (100,4514,1000); -- Quus -- Yuhtunga Jungle, Northeast Pond -INSERT INTO `fishing_group` VALUES (101,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (101,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (101,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (101,4290,1000,500,15); -- Elshimo Frog -INSERT INTO `fishing_group` VALUES (101,4307,500,115,3); -- Jungle Catfish -INSERT INTO `fishing_group` VALUES (101,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (101,4462,550,160,5); -- Monke Onke -INSERT INTO `fishing_group` VALUES (101,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (101,4473,450,245,5); -- Crescent Fish -INSERT INTO `fishing_group` VALUES (101,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (101,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (101,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (101,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (101,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (101,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (101,4290,1000); -- Elshimo Frog +INSERT INTO `fishing_group` VALUES (101,4307,500); -- Jungle Catfish +INSERT INTO `fishing_group` VALUES (101,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (101,4462,550); -- Monke Onke +INSERT INTO `fishing_group` VALUES (101,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (101,4473,450); -- Crescent Fish +INSERT INTO `fishing_group` VALUES (101,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (101,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (101,14242,500); -- Rusty Subligar -- Yuhtunga Jungle, Gremini Falls -INSERT INTO `fishing_group` VALUES (102,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (102,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (102,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (102,4290,1000,500,15); -- Elshimo Frog -INSERT INTO `fishing_group` VALUES (102,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (102,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (102,4473,450,245,5); -- Crescent Fish -INSERT INTO `fishing_group` VALUES (102,4579,900,290,7); -- Elshimo Newt -INSERT INTO `fishing_group` VALUES (102,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (102,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (102,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (102,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (102,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (102,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (102,4290,1000); -- Elshimo Frog +INSERT INTO `fishing_group` VALUES (102,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (102,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (102,4473,450); -- Crescent Fish +INSERT INTO `fishing_group` VALUES (102,4579,900); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (102,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (102,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (102,14242,500); -- Rusty Subligar -- Yuhtunga Jungle, Southwest Pond -INSERT INTO `fishing_group` VALUES (103,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (103,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (103,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (103,4307,500,115,3); -- Jungle Catfish -INSERT INTO `fishing_group` VALUES (103,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (103,4464,1000,500,15); -- Pipira -INSERT INTO `fishing_group` VALUES (103,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (103,4579,900,290,7); -- Elshimo Newt -INSERT INTO `fishing_group` VALUES (103,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (103,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (103,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (103,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (103,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (103,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (103,4307,500); -- Jungle Catfish +INSERT INTO `fishing_group` VALUES (103,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (103,4464,1000); -- Pipira +INSERT INTO `fishing_group` VALUES (103,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (103,4579,900); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (103,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (103,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (103,14242,500); -- Rusty Subligar -- Yuhtunga Jungle, Southwest Waterfall - South -INSERT INTO `fishing_group` VALUES (104,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (104,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (104,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (104,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (104,4464,1000,500,15); -- Pipira -INSERT INTO `fishing_group` VALUES (104,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (104,4579,900,290,7); -- Elshimo Newt -INSERT INTO `fishing_group` VALUES (104,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (104,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (104,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (104,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (104,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (104,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (104,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (104,4464,1000); -- Pipira +INSERT INTO `fishing_group` VALUES (104,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (104,4579,900); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (104,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (104,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (104,14242,500); -- Rusty Subligar -- Yuhtunga Jungle, Southwest Waterfall - North -INSERT INTO `fishing_group` VALUES (105,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (105,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (105,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (105,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (105,4464,1000,500,15); -- Pipira -INSERT INTO `fishing_group` VALUES (105,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (105,4579,900,290,7); -- Elshimo Newt -INSERT INTO `fishing_group` VALUES (105,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (105,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (105,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (105,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (105,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (105,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (105,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (105,4464,1000); -- Pipira +INSERT INTO `fishing_group` VALUES (105,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (105,4579,900); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (105,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (105,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (105,14242,500); -- Rusty Subligar -- Yuhtunga Jungle, Other Waterside -INSERT INTO `fishing_group` VALUES (106,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (106,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (106,4290,1000,500,15); -- Elshimo Frog -INSERT INTO `fishing_group` VALUES (106,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (106,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (106,4579,900,290,7); -- Elshimo Newt -INSERT INTO `fishing_group` VALUES (106,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (106,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (106,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (106,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (106,4290,1000); -- Elshimo Frog +INSERT INTO `fishing_group` VALUES (106,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (106,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (106,4579,900); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (106,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (106,14117,500); -- Rusty Leggings -- Den of Rancor, Pool E-8 -INSERT INTO `fishing_group` VALUES (107,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (107,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (107,4288,800,260,5); -- Zebra Eel -INSERT INTO `fishing_group` VALUES (107,4383,800,290,7); -- Gold Lobster -INSERT INTO `fishing_group` VALUES (107,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (107,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (107,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (107,4580,900,290,7); -- Coral Butterfly -INSERT INTO `fishing_group` VALUES (107,12522,200,10,1); -- Rusty Cap -INSERT INTO `fishing_group` VALUES (107,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (107,16606,400,300,9); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (107,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (107,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (107,4288,800); -- Zebra Eel +INSERT INTO `fishing_group` VALUES (107,4383,800); -- Gold Lobster +INSERT INTO `fishing_group` VALUES (107,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (107,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (107,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (107,4580,900); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (107,12522,200); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (107,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (107,16606,400); -- Rusty Greatsword -- Den of Rancor, Pool F-11 -INSERT INTO `fishing_group` VALUES (108,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (108,887,200,50,6); -- Coral Fragment -INSERT INTO `fishing_group` VALUES (108,4305,700,50,6); -- Ryugu Titan -INSERT INTO `fishing_group` VALUES (108,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (108,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (108,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (108,4580,900,290,7); -- Coral Butterfly -INSERT INTO `fishing_group` VALUES (108,12316,500,260,5); -- Fish Scale Shield -INSERT INTO `fishing_group` VALUES (108,14242,500,300,9); -- Rusty Subligar -INSERT INTO `fishing_group` VALUES (108,16606,400,300,9); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (108,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (108,887,200); -- Coral Fragment +INSERT INTO `fishing_group` VALUES (108,4305,700); -- Ryugu Titan +INSERT INTO `fishing_group` VALUES (108,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (108,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (108,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (108,4580,900); -- Coral Butterfly +INSERT INTO `fishing_group` VALUES (108,12316,500); -- Fish Scale Shield +INSERT INTO `fishing_group` VALUES (108,14242,500); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (108,16606,400); -- Rusty Greatsword -- Den of Rancor, Misc Water -INSERT INTO `fishing_group` VALUES (109,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (109,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (109,12522,200,10,1); -- Rusty Cap +INSERT INTO `fishing_group` VALUES (109,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (109,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (109,12522,200); -- Rusty Cap -- Temple of Uggalepih, Whole Zone -INSERT INTO `fishing_group` VALUES (110,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (110,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (110,13454,800,300,9); -- Copper Ring +INSERT INTO `fishing_group` VALUES (110,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (110,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (110,13454,800); -- Copper Ring -- Yhoator Jungle, Front of Temple - East Side -INSERT INTO `fishing_group` VALUES (111,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (111,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (111,4290,1000,500,15); -- Elshimo Frog -INSERT INTO `fishing_group` VALUES (111,4307,500,115,3); -- Jungle Catfish -INSERT INTO `fishing_group` VALUES (111,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (111,4464,1000,500,15); -- Pipira -INSERT INTO `fishing_group` VALUES (111,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (111,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (111,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (111,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (111,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (111,4290,1000); -- Elshimo Frog +INSERT INTO `fishing_group` VALUES (111,4307,500); -- Jungle Catfish +INSERT INTO `fishing_group` VALUES (111,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (111,4464,1000); -- Pipira +INSERT INTO `fishing_group` VALUES (111,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (111,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (111,14242,500); -- Rusty Subligar -- Yhoator Jungle, Front of Temple - West Side -INSERT INTO `fishing_group` VALUES (112,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (112,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (112,4290,1000,500,15); -- Elshimo Frog -INSERT INTO `fishing_group` VALUES (112,4307,500,115,3); -- Jungle Catfish -INSERT INTO `fishing_group` VALUES (112,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (112,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (112,4579,900,290,7); -- Elshimo Newt -INSERT INTO `fishing_group` VALUES (112,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (112,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (112,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (112,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (112,4290,1000); -- Elshimo Frog +INSERT INTO `fishing_group` VALUES (112,4307,500); -- Jungle Catfish +INSERT INTO `fishing_group` VALUES (112,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (112,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (112,4579,900); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (112,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (112,14242,500); -- Rusty Subligar -- Yhoator Jungle, Teardrop Spring -INSERT INTO `fishing_group` VALUES (113,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (113,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (113,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (113,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (113,13456,300,275,6); -- Silver Ring -INSERT INTO `fishing_group` VALUES (113,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (113,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (113,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (113,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (113,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (113,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (113,13456,300); -- Silver Ring +INSERT INTO `fishing_group` VALUES (113,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (113,14242,500); -- Rusty Subligar -- Yhoator Jungle, Underground Pool 1 -INSERT INTO `fishing_group` VALUES (114,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (114,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (114,4307,500,115,3); -- Jungle Catfish -INSERT INTO `fishing_group` VALUES (114,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (114,4462,550,160,5); -- Monke Onke -INSERT INTO `fishing_group` VALUES (114,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (114,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (114,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (114,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (114,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (114,4307,500); -- Jungle Catfish +INSERT INTO `fishing_group` VALUES (114,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (114,4462,550); -- Monke Onke +INSERT INTO `fishing_group` VALUES (114,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (114,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (114,14242,500); -- Rusty Subligar -- Yhoator Jungle, Bloodlet Spring -INSERT INTO `fishing_group` VALUES (115,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (115,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (115,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (115,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (115,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (115,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (115,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (115,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (115,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (115,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (115,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (115,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (115,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (115,14242,500); -- Rusty Subligar -- Yhoator Jungle, Underground Pool 3 -INSERT INTO `fishing_group` VALUES (116,4290,1000,500,15); -- Elshimo Frog -INSERT INTO `fishing_group` VALUES (116,4579,900,290,7); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (116,4290,1000); -- Elshimo Frog +INSERT INTO `fishing_group` VALUES (116,4579,900); -- Elshimo Newt -- Yhoator Jungle, Underground Pool 2 -INSERT INTO `fishing_group` VALUES (117,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (117,4289,1000,500,15); -- Forest Carp -INSERT INTO `fishing_group` VALUES (117,4290,1000,500,15); -- Elshimo Frog -INSERT INTO `fishing_group` VALUES (117,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (117,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (117,4579,900,290,7); -- Elshimo Newt -INSERT INTO `fishing_group` VALUES (117,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (117,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (117,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (117,4289,1000); -- Forest Carp +INSERT INTO `fishing_group` VALUES (117,4290,1000); -- Elshimo Frog +INSERT INTO `fishing_group` VALUES (117,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (117,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (117,4579,900); -- Elshimo Newt +INSERT INTO `fishing_group` VALUES (117,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (117,14242,500); -- Rusty Subligar -- Ru'Aun Gardens, Whole Zone / The Shrine of Ru'Avitau, Whole Zone -INSERT INTO `fishing_group` VALUES (118,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (118,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (118,13456,300,275,6); -- Silver Ring +INSERT INTO `fishing_group` VALUES (118,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (118,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (118,13456,300); -- Silver Ring -- Oldton Movalpolos, Whole Zone -INSERT INTO `fishing_group` VALUES (119,1624,700,300,9); -- Bugbear Mask -INSERT INTO `fishing_group` VALUES (119,1638,800,300,9); -- Moblin Mask -INSERT INTO `fishing_group` VALUES (119,4313,750,275,6); -- Blindfish -INSERT INTO `fishing_group` VALUES (119,4316,500,100,4); -- Armored Pisces -INSERT INTO `fishing_group` VALUES (119,4429,800,290,7); -- Black Eel -INSERT INTO `fishing_group` VALUES (119,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (119,4515,1000,500,15); -- Copper Frog -INSERT INTO `fishing_group` VALUES (119,13454,800,300,9); -- Copper Ring -INSERT INTO `fishing_group` VALUES (119,16606,400,300,9); -- Rusty Greatsword -INSERT INTO `fishing_group` VALUES (119,16655,400,290,7); -- Rusty Pick +INSERT INTO `fishing_group` VALUES (119,1624,700); -- Bugbear Mask +INSERT INTO `fishing_group` VALUES (119,1638,800); -- Moblin Mask +INSERT INTO `fishing_group` VALUES (119,4313,750); -- Blindfish +INSERT INTO `fishing_group` VALUES (119,4316,500); -- Armored Pisces +INSERT INTO `fishing_group` VALUES (119,4429,800); -- Black Eel +INSERT INTO `fishing_group` VALUES (119,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (119,4515,1000); -- Copper Frog +INSERT INTO `fishing_group` VALUES (119,13454,800); -- Copper Ring +INSERT INTO `fishing_group` VALUES (119,16606,400); -- Rusty Greatsword +INSERT INTO `fishing_group` VALUES (119,16655,400); -- Rusty Pick -- Lufaise Meadows, Leremieu Lagoon -INSERT INTO `fishing_group` VALUES (120,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (120,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (120,4454,200,115,3); -- Emperor Fish -INSERT INTO `fishing_group` VALUES (120,5129,850,50,6); -- Lik -INSERT INTO `fishing_group` VALUES (120,5130,850,260,5); -- Tavnazian Goby +INSERT INTO `fishing_group` VALUES (120,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (120,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (120,4454,200); -- Emperor Fish +INSERT INTO `fishing_group` VALUES (120,5129,850); -- Lik +INSERT INTO `fishing_group` VALUES (120,5130,850); -- Tavnazian Goby -- Lufaise Meadows, Seaside / Misareaux Coast, Seaside -INSERT INTO `fishing_group` VALUES (121,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (121,4500,1000,500,15); -- Greedie -INSERT INTO `fishing_group` VALUES (121,4514,1000,500,15); -- Quus +INSERT INTO `fishing_group` VALUES (121,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (121,4500,1000); -- Greedie +INSERT INTO `fishing_group` VALUES (121,4514,1000); -- Quus -- Lufaise Meadows, Rafeloux River / Misareaux Coast, Rafeloux River -INSERT INTO `fishing_group` VALUES (122,688,500,200,6); -- Arrowwood Log -INSERT INTO `fishing_group` VALUES (122,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (122,5130,850,260,5); -- Tavnazian Goby +INSERT INTO `fishing_group` VALUES (122,688,500); -- Arrowwood Log +INSERT INTO `fishing_group` VALUES (122,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (122,5130,850); -- Tavnazian Goby -- Misareaux Coast, Cascade Edellaine -INSERT INTO `fishing_group` VALUES (123,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (123,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (123,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (123,4463,500,50,6); -- Takitaro -INSERT INTO `fishing_group` VALUES (123,5130,850,260,5); -- Tavnazian Goby -INSERT INTO `fishing_group` VALUES (123,13456,300,275,6); -- Silver Ring +INSERT INTO `fishing_group` VALUES (123,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (123,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (123,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (123,4463,500); -- Takitaro +INSERT INTO `fishing_group` VALUES (123,5130,850); -- Tavnazian Goby +INSERT INTO `fishing_group` VALUES (123,13456,300); -- Silver Ring -- Aht Urhgan Whitegate, Whole Zone -INSERT INTO `fishing_group` VALUES (124,2341,1000,300,9); -- Hydrogauge -INSERT INTO `fishing_group` VALUES (124,5447,1000,500,15); -- Denizanasi -INSERT INTO `fishing_group` VALUES (124,5448,850,290,7); -- Kalamar -INSERT INTO `fishing_group` VALUES (124,5449,1000,500,15); -- Hamsi -INSERT INTO `fishing_group` VALUES (124,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (124,2341,1000); -- Hydrogauge +INSERT INTO `fishing_group` VALUES (124,5447,1000); -- Denizanasi +INSERT INTO `fishing_group` VALUES (124,5448,850); -- Kalamar +INSERT INTO `fishing_group` VALUES (124,5449,1000); -- Hamsi +INSERT INTO `fishing_group` VALUES (124,14242,500); -- Rusty Subligar -- Al Zahbi, Whole Zone -INSERT INTO `fishing_group` VALUES (125,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (125,2341,1000,300,9); -- Hydrogauge -INSERT INTO `fishing_group` VALUES (125,4310,1000,500,15); -- Tiny Goldfish -INSERT INTO `fishing_group` VALUES (125,4401,1000,1000,36);-- Moat Carp -INSERT INTO `fishing_group` VALUES (125,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (125,5458,800,290,7); -- Yilanbaligi -INSERT INTO `fishing_group` VALUES (125,5459,650,275,6); -- Sazanbaligi -INSERT INTO `fishing_group` VALUES (125,5460,650,260,5); -- Kayabaligi -INSERT INTO `fishing_group` VALUES (125,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (125,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (125,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (125,2341,1000); -- Hydrogauge +INSERT INTO `fishing_group` VALUES (125,4310,1000); -- Tiny Goldfish +INSERT INTO `fishing_group` VALUES (125,4401,1000); -- Moat Carp +INSERT INTO `fishing_group` VALUES (125,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (125,5458,800); -- Yilanbaligi +INSERT INTO `fishing_group` VALUES (125,5459,650); -- Sazanbaligi +INSERT INTO `fishing_group` VALUES (125,5460,650); -- Kayabaligi +INSERT INTO `fishing_group` VALUES (125,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (125,14242,500); -- Rusty Subligar -- Bhaflau Thickets, Whole Zone -INSERT INTO `fishing_group` VALUES (126,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (126,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (126,5137,450,115,3); -- Turnabaligi -INSERT INTO `fishing_group` VALUES (126,5458,800,290,7); -- Yilanbaligi -INSERT INTO `fishing_group` VALUES (126,5459,650,275,6); -- Sazanbaligi -INSERT INTO `fishing_group` VALUES (126,5460,650,260,5); -- Kayabaligi -INSERT INTO `fishing_group` VALUES (126,5461,1000,200,6); -- Alabaligi -INSERT INTO `fishing_group` VALUES (126,5462,450,230,6); -- Morinabaligi -INSERT INTO `fishing_group` VALUES (126,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (126,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (126,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (126,5137,450); -- Turnabaligi +INSERT INTO `fishing_group` VALUES (126,5458,800); -- Yilanbaligi +INSERT INTO `fishing_group` VALUES (126,5459,650); -- Sazanbaligi +INSERT INTO `fishing_group` VALUES (126,5460,650); -- Kayabaligi +INSERT INTO `fishing_group` VALUES (126,5461,1000); -- Alabaligi +INSERT INTO `fishing_group` VALUES (126,5462,450); -- Morinabaligi +INSERT INTO `fishing_group` VALUES (126,14242,500); -- Rusty Subligar -- Aydeewa Subterrane, Whole Zone -INSERT INTO `fishing_group` VALUES (127,2216,1000,200,6); -- Lamp Marimo -INSERT INTO `fishing_group` VALUES (127,4309,500,50,6); -- Cave Cherax -INSERT INTO `fishing_group` VALUES (127,4313,750,275,6); -- Blindfish -INSERT INTO `fishing_group` VALUES (127,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (127,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (127,2216,1000); -- Lamp Marimo +INSERT INTO `fishing_group` VALUES (127,4309,500); -- Cave Cherax +INSERT INTO `fishing_group` VALUES (127,4313,750); -- Blindfish +INSERT INTO `fishing_group` VALUES (127,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (127,14242,500); -- Rusty Subligar -- Mamook, Pond -INSERT INTO `fishing_group` VALUES (128,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (128,5139,600,290,7); -- Betta -INSERT INTO `fishing_group` VALUES (128,5458,800,290,7); -- Yilanbaligi -INSERT INTO `fishing_group` VALUES (128,5459,650,275,6); -- Sazanbaligi -INSERT INTO `fishing_group` VALUES (128,5460,650,260,5); -- Kayabaligi -INSERT INTO `fishing_group` VALUES (128,5461,1000,200,6); -- Alabaligi -INSERT INTO `fishing_group` VALUES (128,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (128,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (128,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (128,5139,600); -- Betta +INSERT INTO `fishing_group` VALUES (128,5458,800); -- Yilanbaligi +INSERT INTO `fishing_group` VALUES (128,5459,650); -- Sazanbaligi +INSERT INTO `fishing_group` VALUES (128,5460,650); -- Kayabaligi +INSERT INTO `fishing_group` VALUES (128,5461,1000); -- Alabaligi +INSERT INTO `fishing_group` VALUES (128,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (128,14242,500); -- Rusty Subligar -- Wajaom Woodlands, Whole Zone -INSERT INTO `fishing_group` VALUES (129,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (129,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (129,5137,450,115,3); -- Turnabaligi -INSERT INTO `fishing_group` VALUES (129,5458,800,290,7); -- Yilanbaligi -INSERT INTO `fishing_group` VALUES (129,5459,650,275,6); -- Sazanbaligi -INSERT INTO `fishing_group` VALUES (129,5460,650,260,5); -- Kayabaligi -INSERT INTO `fishing_group` VALUES (129,5461,1000,200,6); -- Alabaligi -INSERT INTO `fishing_group` VALUES (129,5462,450,230,6); -- Morinabaligi -INSERT INTO `fishing_group` VALUES (129,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (129,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (129,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (129,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (129,5137,450); -- Turnabaligi +INSERT INTO `fishing_group` VALUES (129,5458,800); -- Yilanbaligi +INSERT INTO `fishing_group` VALUES (129,5459,650); -- Sazanbaligi +INSERT INTO `fishing_group` VALUES (129,5460,650); -- Kayabaligi +INSERT INTO `fishing_group` VALUES (129,5461,1000); -- Alabaligi +INSERT INTO `fishing_group` VALUES (129,5462,450); -- Morinabaligi +INSERT INTO `fishing_group` VALUES (129,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (129,14242,500); -- Rusty Subligar -- Mount Zhayolm, Whole Zone -INSERT INTO `fishing_group` VALUES (130,5447,1000,500,15); -- Denizanasi -INSERT INTO `fishing_group` VALUES (130,5448,850,290,7); -- Kalamar -INSERT INTO `fishing_group` VALUES (130,5449,1000,500,15); -- Hamsi -INSERT INTO `fishing_group` VALUES (130,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (130,5447,1000); -- Denizanasi +INSERT INTO `fishing_group` VALUES (130,5448,850); -- Kalamar +INSERT INTO `fishing_group` VALUES (130,5449,1000); -- Hamsi +INSERT INTO `fishing_group` VALUES (130,14242,500); -- Rusty Subligar -- Arrapago Reef, Whole Zone -INSERT INTO `fishing_group` VALUES (131,5135,450,115,3); -- Rhinochimera -INSERT INTO `fishing_group` VALUES (131,5453,1000,290,7); -- Istakoz -INSERT INTO `fishing_group` VALUES (131,5454,400,230,6); -- Mercanbaligi -INSERT INTO `fishing_group` VALUES (131,5455,500,115,3); -- Ahtapot -INSERT INTO `fishing_group` VALUES (131,5456,850,275,6); -- Istiridye -INSERT INTO `fishing_group` VALUES (131,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (131,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (131,5135,450); -- Rhinochimera +INSERT INTO `fishing_group` VALUES (131,5453,1000); -- Istakoz +INSERT INTO `fishing_group` VALUES (131,5454,400); -- Mercanbaligi +INSERT INTO `fishing_group` VALUES (131,5455,500); -- Ahtapot +INSERT INTO `fishing_group` VALUES (131,5456,850); -- Istiridye +INSERT INTO `fishing_group` VALUES (131,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (131,14242,500); -- Rusty Subligar -- Caedarva Mire, Whole Zone -INSERT INTO `fishing_group` VALUES (132,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (132,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (132,5138,450,260,5); -- Black Ghost -INSERT INTO `fishing_group` VALUES (132,5463,900,175,5); -- Yayinbaligi -INSERT INTO `fishing_group` VALUES (132,5464,800,200,6); -- Kaplumbaga -INSERT INTO `fishing_group` VALUES (132,5465,1000,500,15); -- Caedarva Frog -INSERT INTO `fishing_group` VALUES (132,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (132,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (132,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (132,5138,450); -- Black Ghost +INSERT INTO `fishing_group` VALUES (132,5463,900); -- Yayinbaligi +INSERT INTO `fishing_group` VALUES (132,5464,800); -- Kaplumbaga +INSERT INTO `fishing_group` VALUES (132,5465,1000); -- Caedarva Frog +INSERT INTO `fishing_group` VALUES (132,14117,500); -- Rusty Leggings -- Nashmau, Whole Zone -INSERT INTO `fishing_group` VALUES (133,2341,1000,300,9); -- Hydrogauge -INSERT INTO `fishing_group` VALUES (133,5133,400,100,4); -- Pterygotus -INSERT INTO `fishing_group` VALUES (133,5453,1000,290,7); -- Istakoz -INSERT INTO `fishing_group` VALUES (133,5454,400,230,6); -- Mercanbaligi -INSERT INTO `fishing_group` VALUES (133,5455,500,115,3); -- Ahtapot -INSERT INTO `fishing_group` VALUES (133,5456,850,275,6); -- Istiridye -INSERT INTO `fishing_group` VALUES (133,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (133,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (133,2341,1000); -- Hydrogauge +INSERT INTO `fishing_group` VALUES (133,5133,400); -- Pterygotus +INSERT INTO `fishing_group` VALUES (133,5453,1000); -- Istakoz +INSERT INTO `fishing_group` VALUES (133,5454,400); -- Mercanbaligi +INSERT INTO `fishing_group` VALUES (133,5455,500); -- Ahtapot +INSERT INTO `fishing_group` VALUES (133,5456,850); -- Istiridye +INSERT INTO `fishing_group` VALUES (133,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (133,14242,500); -- Rusty Subligar -- Talacca Cove, Whole Zone -INSERT INTO `fishing_group` VALUES (134,5136,1000,400,12); -- Istavrit -INSERT INTO `fishing_group` VALUES (134,5453,1000,290,7); -- Istakoz -INSERT INTO `fishing_group` VALUES (134,5454,400,230,6); -- Mercanbaligi -INSERT INTO `fishing_group` VALUES (134,5455,500,115,3); -- Ahtapot -INSERT INTO `fishing_group` VALUES (134,5457,750,215,6); -- Dil -INSERT INTO `fishing_group` VALUES (134,14117,500,300,9); -- Rusty Leggings -INSERT INTO `fishing_group` VALUES (134,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (134,5136,1000); -- Istavrit +INSERT INTO `fishing_group` VALUES (134,5453,1000); -- Istakoz +INSERT INTO `fishing_group` VALUES (134,5454,400); -- Mercanbaligi +INSERT INTO `fishing_group` VALUES (134,5455,500); -- Ahtapot +INSERT INTO `fishing_group` VALUES (134,5457,750); -- Dil +INSERT INTO `fishing_group` VALUES (134,14117,500); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (134,14242,500); -- Rusty Subligar -- Open sea route to Al Zahbi, Whole Zone / Open sea route to Mhaura, Whole Zone -INSERT INTO `fishing_group` VALUES (135,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (135,624,1000,300,9); -- Clump Of Pamtam Kelp -INSERT INTO `fishing_group` VALUES (135,4403,1000,500,15); -- Yellow Globe -INSERT INTO `fishing_group` VALUES (135,4443,1000,500,15); -- Cobalt Jellyfish -INSERT INTO `fishing_group` VALUES (135,4480,900,400,12); -- Gugru Tuna -INSERT INTO `fishing_group` VALUES (135,4485,700,260,5); -- Noble Lady -INSERT INTO `fishing_group` VALUES (135,5127,700,50,6); -- Gugrusaurus -INSERT INTO `fishing_group` VALUES (135,5132,550,245,5); -- Gurnard -INSERT INTO `fishing_group` VALUES (135,5134,500,50,6); -- Mola Mola -INSERT INTO `fishing_group` VALUES (135,5141,400,145,4); -- Veydal Wrasse -INSERT INTO `fishing_group` VALUES (135,14117,500,300,9); -- Rusty Leggings +INSERT INTO `fishing_group` VALUES (135,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (135,624,1000); -- Clump Of Pamtam Kelp +INSERT INTO `fishing_group` VALUES (135,4403,1000); -- Yellow Globe +INSERT INTO `fishing_group` VALUES (135,4443,1000); -- Cobalt Jellyfish +INSERT INTO `fishing_group` VALUES (135,4480,900); -- Gugru Tuna +INSERT INTO `fishing_group` VALUES (135,4485,700); -- Noble Lady +INSERT INTO `fishing_group` VALUES (135,5127,700); -- Gugrusaurus +INSERT INTO `fishing_group` VALUES (135,5132,550); -- Gurnard +INSERT INTO `fishing_group` VALUES (135,5134,500); -- Mola Mola +INSERT INTO `fishing_group` VALUES (135,5141,400); -- Veydal Wrasse +INSERT INTO `fishing_group` VALUES (135,14117,500); -- Rusty Leggings -- Ship bound for Selbina, Whole Zone / Ship bound for Mhaura, Whole Zone -INSERT INTO `fishing_group` VALUES (136,4305,700,50,6); -- Ryugu Titan -INSERT INTO `fishing_group` VALUES (136,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (136,4361,1000,500,15); -- Nebimonite -INSERT INTO `fishing_group` VALUES (136,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (136,4451,500,245,5); -- Silver Shark -INSERT INTO `fishing_group` VALUES (136,4476,500,50,6); -- Titanictus -INSERT INTO `fishing_group` VALUES (136,4479,700,160,5); -- Bhefhel Marlin -INSERT INTO `fishing_group` VALUES (136,4480,900,400,12); -- Gugru Tuna -INSERT INTO `fishing_group` VALUES (136,4485,700,260,5); -- Noble Lady -INSERT INTO `fishing_group` VALUES (136,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (136,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (136,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (136,4305,700); -- Ryugu Titan +INSERT INTO `fishing_group` VALUES (136,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (136,4361,1000); -- Nebimonite +INSERT INTO `fishing_group` VALUES (136,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (136,4451,500); -- Silver Shark +INSERT INTO `fishing_group` VALUES (136,4476,500); -- Titanictus +INSERT INTO `fishing_group` VALUES (136,4479,700); -- Bhefhel Marlin +INSERT INTO `fishing_group` VALUES (136,4480,900); -- Gugru Tuna +INSERT INTO `fishing_group` VALUES (136,4485,700); -- Noble Lady +INSERT INTO `fishing_group` VALUES (136,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (136,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (136,14242,500); -- Rusty Subligar -- Ship bound for Selbina (with Pirates), Whole Zone / Ship bound for Mhaura (with Pirates), Whole Zone -INSERT INTO `fishing_group` VALUES (137,4305,700,50,6); -- Ryugu Titan -INSERT INTO `fishing_group` VALUES (137,4360,1000,500,15); -- Bastore Sardine -INSERT INTO `fishing_group` VALUES (137,4361,1000,500,15); -- Nebimonite -INSERT INTO `fishing_group` VALUES (137,4399,650,275,6); -- Bluetail -INSERT INTO `fishing_group` VALUES (137,4451,500,245,5); -- Silver Shark -INSERT INTO `fishing_group` VALUES (137,4475,700,50,6); -- Sea Zombie -INSERT INTO `fishing_group` VALUES (137,4476,500,50,6); -- Titanictus -INSERT INTO `fishing_group` VALUES (137,4479,700,160,5); -- Bhefhel Marlin -INSERT INTO `fishing_group` VALUES (137,4480,900,400,12); -- Gugru Tuna -INSERT INTO `fishing_group` VALUES (137,4485,700,260,5); -- Noble Lady -INSERT INTO `fishing_group` VALUES (137,4514,1000,500,15); -- Quus -INSERT INTO `fishing_group` VALUES (137,5127,700,50,6); -- Gugrusaurus -INSERT INTO `fishing_group` VALUES (137,5128,850,290,7); -- Cone Calamary -INSERT INTO `fishing_group` VALUES (137,14242,500,300,9); -- Rusty Subligar +INSERT INTO `fishing_group` VALUES (137,4305,700); -- Ryugu Titan +INSERT INTO `fishing_group` VALUES (137,4360,1000); -- Bastore Sardine +INSERT INTO `fishing_group` VALUES (137,4361,1000); -- Nebimonite +INSERT INTO `fishing_group` VALUES (137,4399,650); -- Bluetail +INSERT INTO `fishing_group` VALUES (137,4451,500); -- Silver Shark +INSERT INTO `fishing_group` VALUES (137,4475,700); -- Sea Zombie +INSERT INTO `fishing_group` VALUES (137,4476,500); -- Titanictus +INSERT INTO `fishing_group` VALUES (137,4479,700); -- Bhefhel Marlin +INSERT INTO `fishing_group` VALUES (137,4480,900); -- Gugru Tuna +INSERT INTO `fishing_group` VALUES (137,4485,700); -- Noble Lady +INSERT INTO `fishing_group` VALUES (137,4514,1000); -- Quus +INSERT INTO `fishing_group` VALUES (137,5127,700); -- Gugrusaurus +INSERT INTO `fishing_group` VALUES (137,5128,850); -- Cone Calamary +INSERT INTO `fishing_group` VALUES (137,14242,500); -- Rusty Subligar -- Silver Sea route to Nashmau, Whole Zone / Silver Sea route to Al Zahbi, Whole Zone -INSERT INTO `fishing_group` VALUES (138,2341,1000,300,9); -- Hydrogauge -INSERT INTO `fishing_group` VALUES (138,5140,500,50,6); -- Kalkanbaligi -INSERT INTO `fishing_group` VALUES (138,5448,850,290,7); -- Kalamar -INSERT INTO `fishing_group` VALUES (138,5449,1000,500,15); -- Hamsi -INSERT INTO `fishing_group` VALUES (138,5450,900,190,6); -- Lakerda -INSERT INTO `fishing_group` VALUES (138,5451,800,245,5); -- Kilicbaligi -INSERT INTO `fishing_group` VALUES (138,5452,550,275,6); -- Uskumru +INSERT INTO `fishing_group` VALUES (138,2341,1000); -- Hydrogauge +INSERT INTO `fishing_group` VALUES (138,5140,500); -- Kalkanbaligi +INSERT INTO `fishing_group` VALUES (138,5448,850); -- Kalamar +INSERT INTO `fishing_group` VALUES (138,5449,1000); -- Hamsi +INSERT INTO `fishing_group` VALUES (138,5450,900); -- Lakerda +INSERT INTO `fishing_group` VALUES (138,5451,800); -- Kilicbaligi +INSERT INTO `fishing_group` VALUES (138,5452,550); -- Uskumru -- Phanauet Channel, Whole Zone -INSERT INTO `fishing_group` VALUES (139,90,900,300,9); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (139,4315,450,50,8); -- Lungfish -INSERT INTO `fishing_group` VALUES (139,4319,650,50,8); -- Tricorn -INSERT INTO `fishing_group` VALUES (139,4354,1000,500,15); -- Shining Trout -INSERT INTO `fishing_group` VALUES (139,4402,750,260,5); -- Red Terrapin -INSERT INTO `fishing_group` VALUES (139,4426,1000,500,15); -- Tricolored Carp -INSERT INTO `fishing_group` VALUES (139,4427,750,275,6); -- Gold Carp -INSERT INTO `fishing_group` VALUES (139,4428,1000,500,15); -- Dark Bass -INSERT INTO `fishing_group` VALUES (139,4469,900,190,6); -- Giant Catfish -INSERT INTO `fishing_group` VALUES (139,4472,1000,500,15); -- Crayfish -INSERT INTO `fishing_group` VALUES (139,5125,1000,500,15); -- Phanauet Newt -INSERT INTO `fishing_group` VALUES (139,5126,1000,500,15); -- Muddy Siredont +INSERT INTO `fishing_group` VALUES (139,90,900); -- Rusty Bucket +INSERT INTO `fishing_group` VALUES (139,4315,450); -- Lungfish +INSERT INTO `fishing_group` VALUES (139,4319,650); -- Tricorn +INSERT INTO `fishing_group` VALUES (139,4354,1000); -- Shining Trout +INSERT INTO `fishing_group` VALUES (139,4402,750); -- Red Terrapin +INSERT INTO `fishing_group` VALUES (139,4426,1000); -- Tricolored Carp +INSERT INTO `fishing_group` VALUES (139,4427,750); -- Gold Carp +INSERT INTO `fishing_group` VALUES (139,4428,1000); -- Dark Bass +INSERT INTO `fishing_group` VALUES (139,4469,900); -- Giant Catfish +INSERT INTO `fishing_group` VALUES (139,4472,1000); -- Crayfish +INSERT INTO `fishing_group` VALUES (139,5125,1000); -- Phanauet Newt +INSERT INTO `fishing_group` VALUES (139,5126,1000); -- Muddy Siredont /*!40000 ALTER TABLE `fishing_group` ENABLE KEYS */; UNLOCK TABLES; diff --git a/src/map/time_server.cpp b/src/map/time_server.cpp index b4c0c68d995..7a9b532eac1 100644 --- a/src/map/time_server.cpp +++ b/src/map/time_server.cpp @@ -30,7 +30,6 @@ #include "roe.h" #include "spawn_handler.h" #include "timetriggers.h" -#include "utils/fishingutils.h" #include "utils/guildutils.h" #include "utils/instanceutils.h" #include "utils/moduleutils.h" @@ -161,7 +160,6 @@ auto time_server(Scheduler& scheduler, MapConfig config) -> Task TracyZoneScoped; zoneutils::TOTDChange(vanaTotd); - fishingutils::RestockFishingAreas(); zoneutils::ForEachZone( [](CZone* PZone) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 9419a2d6813..75b34c87aa0 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -69,7 +69,6 @@ namespace fishingutils { std::map MessageOffset; -std::map FishingPools; std::map FishList; std::map> ChestList; std::map FishingRods; @@ -80,92 +79,6 @@ std::map> FishingCatchLists; // std::map> FishingGroups; // groupid, fishid, rarity std::map> FishingBaitAffinities; // baitid, fishid, power -/************************************************************************ - * * - * CATCH POOLS * - * * - ************************************************************************/ -namespace -{ - -auto findFishStock(const xi::ZoneId zoneId, const uint8 areaId, const uint16 fishId) -> fish_pool* -{ - const auto zoneIter = FishingPools.find(zoneId); - if (zoneIter == FishingPools.end()) - { - return nullptr; - } - - const auto areaIter = zoneIter->second.catchPools.find(areaId); - if (areaIter == zoneIter->second.catchPools.end()) - { - return nullptr; - } - - const auto stockIter = areaIter->second.stock.find(fishId); - return stockIter != areaIter->second.stock.end() ? &stockIter->second : nullptr; -} - -auto isFishPoolDepleted(const xi::ZoneId zoneId, const uint8 areaId, const uint16 fishId) -> bool -{ - const auto* stock = findFishStock(zoneId, areaId, fishId); - return stock == nullptr || stock->quantity == 0; -} - -} // namespace - -void ReduceFishPool(const xi::ZoneId zoneId, const uint8 areaId, const uint16 fishId) -{ - if (FishList[fishId] && FishList[fishId]->quest_only) - { - return; - } - - if (auto* stock = findFishStock(zoneId, areaId, fishId); stock != nullptr && stock->quantity > 0) - { - stock->quantity -= 1; - } -} - -void RestockFishingAreas() -{ - for (auto& FishingPool : FishingPools | std::views::values) - { - for (const auto& a : FishingPool.catchPools) - { - for (const auto& s : a.second.stock) - { - if (s.second.quantity < s.second.maxQuantity) - { - int qty = s.second.quantity; - int maxqty = s.second.maxQuantity; - int restock = s.second.restockRate; - FishingPool.catchPools[a.first].stock[s.first].quantity = std::min(maxqty, qty + restock); - } - } - } - } -} - -void CreateFishingPools() -{ - const auto rset = db::preparedStmt("SELECT fc.zoneid, fc.areaid, fg.fishid, fg.pool_size, fg.restock_rate " - "FROM fishing_group fg " - "JOIN fishing_catch fc USING(groupid)"); - FOR_DB_MULTIPLE_RESULTS(rset) - { - const auto zoneId = rset->get("zoneid"); - const auto areaId = rset->get("areaid"); - const auto fishId = rset->get("fishid"); - const auto pSize = rset->get("pool_size"); - const auto rRate = rset->get("restock_rate"); - - FishingPools[zoneId].catchPools[areaId].stock[fishId].quantity = pSize; - FishingPools[zoneId].catchPools[areaId].stock[fishId].maxQuantity = pSize; - FishingPools[zoneId].catchPools[areaId].stock[fishId].restockRate = rRate; - } -} - /************************************************************************ * * * CALCULATIONS * @@ -2218,7 +2131,6 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba ChestPool = GetChestPool(PChar->getZone()); std::set RemoveList; - std::set NoCatchList; // Build Hookable Fish Pool if (!FishPool.empty()) @@ -2237,11 +2149,6 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba // uint16 baitPower = fish.second; //@TODO: implement this in later patch if ((fishingSkill >= fishIter->maxSkill || fishIter->maxSkill - fishingSkill <= 100) && (fishIter->reqKeyItem == xi::KeyItem::None || charutils::hasKeyItem(PChar, fishIter->reqKeyItem))) { // Key item okay - if (!fishIter->quest_only && isFishPoolDepleted(PChar->getZone(), area->areaId, fishIter->fishID)) - { - NoCatchList.insert(fishIter->fishID); - } - uint16 hookChance = CalculateHookChance(fishingSkill, fishIter, bait, rod); FishHookPool.insert(std::make_pair(fishIter, hookChance)); FishHookChanceTotal += hookChance; @@ -2275,11 +2182,6 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba } else { - if (!item->quest_only && isFishPoolDepleted(PChar->getZone(), area->areaId, item->fishID)) - { - NoCatchList.insert(item->fishID); - } - float chanceMultiplier = (float)item->rarity / 1000.0f; uint16 actualHookChance = (uint16)std::floor(hookChance * chanceMultiplier); ItemHookChanceTotal += actualHookChance; @@ -2412,7 +2314,7 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba uint16 hookChance = fishIter.second; hookChanceAggregate += hookChance; - if (hookSelect < hookChanceAggregate && !NoCatchList.contains(fish->fishID)) + if (hookSelect < hookChanceAggregate) { FishSelection = fish; uint8 skilldiff = 0; @@ -2448,7 +2350,7 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba uint16 hookChance = itemIter.second; hookChanceAggregate += hookChance; - if (hookSelect < hookChanceAggregate && !NoCatchList.contains(item->fishID)) + if (hookSelect < hookChanceAggregate) { ItemSelection = item; break; @@ -2804,11 +2706,6 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, uint8 fishingSkill = GetFishingSkill(PChar); response = FishingCheck(PChar, fishingSkill, FishingRod, FishingBait, fishingArea); PChar->hookedFish = response; - - if (response->catchtype > FISHINGCATCHTYPE_NONE && response->catchtype < FISHINGCATCHTYPE_MOB) - { - ReduceFishPool(PChar->getZone(), fishingArea->areaId, response->catchid); - } } } } @@ -3302,7 +3199,6 @@ void InitializeFishingSystem() LoadFishingAreas(); LoadFishGroups(); LoadFishingCatchLists(); - CreateFishingPools(); } void CleanupFishing() diff --git a/src/map/utils/fishingutils.h b/src/map/utils/fishingutils.h index 8b0105b299e..ae3277a4970 100644 --- a/src/map/utils/fishingutils.h +++ b/src/map/utils/fishingutils.h @@ -419,34 +419,6 @@ struct weights_t } }; -struct fish_pool -{ - uint16 quantity; - uint16 maxQuantity; - uint16 restockRate; - - fish_pool() - : quantity(0) - , maxQuantity(0) - , restockRate(0) - { - } -}; - -struct fishing_catch_pool -{ - std::map stock; - - fishing_catch_pool() = default; -}; - -struct fishing_area_pool -{ - std::map catchPools; - - fishing_area_pool() = default; -}; - struct fishing_gear_t { uint32 head; @@ -911,11 +883,6 @@ using BigFish = xi::Flag; using CancelOnMobLoadFailBait = xi::Flag; using Lost = xi::Flag; -// Catch Pools -void ReduceFishPool(xi::ZoneId zoneId, uint8 areaId, uint16 fishId); -void RestockFishingAreas(); -void CreateFishingPools(); - // Calculations auto GetMoonPhase() -> uint8; auto GetHookTime(CCharEntity* PChar) -> uint8; From 2d4edc49cd684c72739894151ca44194bbfe731d Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:09 -0400 Subject: [PATCH 03/17] Remove moon phase fishing skillup modifiers --- src/map/utils/fishingutils.cpp | 47 ---------------------------------- 1 file changed, 47 deletions(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 75b34c87aa0..7bc5376c5ac 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -1755,53 +1755,6 @@ void FishingSkillup(CCharEntity* PChar, uint8 catchLevel, uint8 successType) // Configuration multiplier. maxChance = maxChance * settings::get("map.FISHING_SKILL_MULTIPLIER"); - vanadiel_time::time_point vanaTime = vanadiel_time::now(); - - // Moon phase skillup modifiers - uint8 phase = static_cast(vanadiel_time::moon::get_phase(vanaTime)); - uint8 moonDirection = vanadiel_time::moon::get_direction(vanaTime); - - switch (moonDirection) - { - case 0: // None - if (phase == 0) - { - skillRoll -= 20; - bonusChanceRoll -= 3; - } - else if (phase == 100) - { - skillRoll += 10; - bonusChanceRoll += 3; - } - break; - - case 1: // Waning (decending) - if (phase <= 10) - { - skillRoll -= 15; - bonusChanceRoll -= 2; - } - else if (phase >= 95 && phase <= 100) - { - skillRoll += 5; - bonusChanceRoll += 2; - } - break; - - case 2: // Waxing (increasing) - if (phase <= 5) - { - skillRoll -= 10; - bonusChanceRoll -= 1; - } - else if (phase >= 90 && phase <= 100) - { - bonusChanceRoll += 1; - } - break; - } - // Not in City bonus CZone* PZone = zoneutils::GetZone(PChar->getZone()); if (!(PZone && (PZone->GetTypeMask() & xi::ZoneType::City) != xi::ZoneType::Unknown)) From e9ffffc9198d154c1a090e062468caa5491ae055 Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:09 -0400 Subject: [PATCH 04/17] Remove quest gating from fishing NM hooks --- src/map/utils/fishingutils.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 7bc5376c5ac..9cbffe9028a 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -2160,15 +2160,7 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba if (mob->nm && (mob->areaId == 0 || mob->areaId == area->areaId) && ((mob->reqBaitId == 0 || mob->reqBaitId == bait->baitID) || (mob->altBaitId > 0 && mob->altBaitId == bait->baitID))) { bool mobAdd = false; - if (mob->quest < 255 && mob->log < 255) - { - if (charutils::getQuestStatus(PChar, mob->log, mob->quest) == QUEST_ACCEPTED) - { - mobAdd = true; - MobPoolWeight += 1000; - } - } - else if (mob->rarity < 1000) + if (mob->rarity < 1000) { uint16 randomizer = xirand::GetRandomNumber(1, 1000); randomizer -= std::clamp((uint16)std::floor((1 - MOONPATTERN_2(GetMoonPhase())) * 100), 0, randomizer); From f122f063ee5ea60dc62014ce0cafb319f477f4fd Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:07 -0400 Subject: [PATCH 05/17] Stop fishing lookups from inserting null catalog entries --- src/map/utils/fishingutils.cpp | 123 ++++++++++++++++++++++++++------- 1 file changed, 97 insertions(+), 26 deletions(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 9cbffe9028a..db7b4ec6136 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -21,6 +21,7 @@ #include "fishingutils.h" +#include "common/database.h" #include "common/logging.h" #include "common/utils.h" #include "common/vana_time.h" @@ -79,6 +80,61 @@ std::map> FishingCatchLists; // std::map> FishingGroups; // groupid, fishid, rarity std::map> FishingBaitAffinities; // baitid, fishid, power +namespace +{ + +auto findRod(const uint16 rodId) -> rod_t* +{ + const auto it = FishingRods.find(rodId); + if (it == FishingRods.end()) + { + return nullptr; + } + return it->second; +} + +auto findBait(const uint16 baitId) -> bait_t* +{ + const auto it = FishingBaits.find(baitId); + if (it == FishingBaits.end()) + { + return nullptr; + } + return it->second; +} + +auto findFishingArea(const xi::ZoneId zoneId, const uint8 areaId) -> fishingarea_t* +{ + const auto zoneIt = FishingAreaList.find(zoneId); + if (zoneIt == FishingAreaList.end()) + { + return nullptr; + } + const auto areaIt = zoneIt->second.find(areaId); + if (areaIt == zoneIt->second.end()) + { + return nullptr; + } + return areaIt->second; +} + +auto findFishMob(const xi::ZoneId zoneId, const uint32 mobId) -> fishmob_t* +{ + const auto zoneIt = FishZoneMobList.find(zoneId); + if (zoneIt == FishZoneMobList.end()) + { + return nullptr; + } + const auto mobIt = zoneIt->second.find(mobId); + if (mobIt == zoneIt->second.end()) + { + return nullptr; + } + return mobIt->second; +} + +} // namespace + /************************************************************************ * * * CALCULATIONS * @@ -272,7 +328,13 @@ auto GetLuckyMoonModifier() -> uint8 auto GetWeatherModifier(const CCharEntity* PChar) -> float { - const auto weather = zoneutils::GetZone(PChar->getZone())->weather().current(); + const auto* PZone = zoneutils::GetZone(PChar->getZone()); + if (PZone == nullptr) + { + return 1.0f; + } + + const auto weather = PZone->weather().current(); float weatherMod = 1.0f; if (weather == xi::Weather::Rain) @@ -1021,9 +1083,15 @@ auto GetFishPool(const xi::ZoneId zoneID, const uint8 areaID, const uint16 BaitI for (auto fish : FishingGroups[groupId]) { - if ((!FishList[fish.first]->item) && FishingBaitAffinities.contains(BaitID) && FishingBaitAffinities[BaitID].contains(fish.first)) + auto* fishEntry = GetFish(fish.first); + if (fishEntry == nullptr) + { + continue; + } + + if (!fishEntry->item && FishingBaitAffinities.contains(BaitID) && FishingBaitAffinities[BaitID].contains(fish.first)) { - pool.insert(std::make_pair(FishList[fish.first], fish.second)); + pool.insert(std::make_pair(fishEntry, fish.second)); } } @@ -1037,9 +1105,10 @@ auto GetItemPool(const xi::ZoneId zoneID, const uint8 areaID) -> std::vectoritem) + auto* fishEntry = GetFish(fish.first); + if (fishEntry != nullptr && fishEntry->item) { - pool.emplace_back(FishList[fish.first]); + pool.emplace_back(fishEntry); } } @@ -1237,7 +1306,7 @@ auto GetFishingArea(CCharEntity* PChar) -> fishingarea_t* for (auto area : FishingAreaList[zoneId]) { - fishingarea_t* fishingArea = FishingAreaList[zoneId][area.first]; + fishingarea_t* fishingArea = area.second; switch (fishingArea->areatype) { @@ -1323,7 +1392,7 @@ void RodBreak(CCharEntity* PChar) return; } - rod_t* PRod = FishingRods[PRanged->getID()]; + rod_t* PRod = findRod(PRanged->getID()); if (PRod == nullptr) { ShowWarning("PRod was null."); @@ -1531,7 +1600,7 @@ auto CatchMonster(CCharEntity* PChar, uint32 MobID) -> int32 { uint16 MessageOffset = GetMessageOffset(PChar->getZone()); CMobEntity* PMob = dynamic_cast(zoneutils::GetEntity(MobID, TYPE_MOB)); - fishmob_t* mob = FishZoneMobList[PChar->getZone()][MobID]; + fishmob_t* mob = findFishMob(PChar->getZone(), MobID); if (!PMob || !mob) { @@ -1920,8 +1989,8 @@ void StartFishing(CCharEntity* PChar) return; } - rod_t* rod = FishingRods[Rod->getID()]; - bait_t* bait = FishingBaits[Bait->getID()]; + rod_t* rod = findRod(Rod->getID()); + bait_t* bait = findBait(Bait->getID()); if (rod != nullptr && bait != nullptr) { @@ -2623,11 +2692,11 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, if (PChar->getZone() == xi::ZoneId::ValkurmDunes && PChar->GetLocalVar("pChartActive") == 1) { - fishingArea = FishingAreaList[xi::ZoneId::ValkurmDunes][2]; + fishingArea = findFishingArea(xi::ZoneId::ValkurmDunes, 2); } else if (PChar->getZone() == xi::ZoneId::BuburimuPeninsula && PChar->GetLocalVar("bChartActive") == 1) { - fishingArea = FishingAreaList[xi::ZoneId::BuburimuPeninsula][2]; + fishingArea = findFishingArea(xi::ZoneId::BuburimuPeninsula, 2); } if (PChar->hookedFish != nullptr) @@ -2643,8 +2712,8 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, if (Rod != nullptr && Bait != nullptr) { - rod_t* FishingRod = FishingRods[Rod->getID()]; - bait_t* FishingBait = FishingBaits[Bait->getID()]; + rod_t* FishingRod = findRod(Rod->getID()); + bait_t* FishingBait = findBait(Bait->getID()); if (FishingRod != nullptr && FishingBait != nullptr) { @@ -2689,10 +2758,19 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, { if (stamina <= 4) { - CItemWeapon* Rod = nullptr; - Rod = dynamic_cast(PChar->getEquip(SLOT_RANGED)); + CItemWeapon* Rod = dynamic_cast(PChar->getEquip(SLOT_RANGED)); + rod_t* FishingRod = [&]() -> rod_t* + { + if (Rod == nullptr) + { + return nullptr; + } + + return findRod(Rod->getID()); + }(); - if (PChar->hookedFish == nullptr || Rod == nullptr) + // Lose the catch if the rod was unequipped or isn't a known fishing rod + if (PChar->hookedFish == nullptr || FishingRod == nullptr) { LoseCatch(PChar, FISHINGFAILTYPE_NONE); UnhookMob(PChar, Lost::Yes); @@ -2700,8 +2778,7 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, } else { - rod_t* FishingRod = FishingRods[Rod->getID()]; - catchresponse_t* response = ReelCheck(PChar, PChar->hookedFish, FishingRod); + catchresponse_t* response = ReelCheck(PChar, PChar->hookedFish, FishingRod); if (response->fishingToken != PChar->fishingToken || PChar->hookedFish->special != special) { @@ -2841,7 +2918,7 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, auto GetFish(uint16 itemid) -> std::unique_ptr { - if (!FishList[itemid]) + if (!FishList.contains(itemid)) { return nullptr; } @@ -3187,12 +3264,6 @@ void CleanupFishing() fishArealist.second.clear(); } FishingAreaList.clear(); - - for (auto fish : FishList) - { - destroy(fish.second); - } - FishList.clear(); }; } // namespace fishingutils From dbc024a8fe92e23b81fda3355bc0fa819ead6ddb Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:08 -0400 Subject: [PATCH 06/17] Block menu actions while fishing --- src/map/packets/c2s/0x036_item_transfer.cpp | 2 +- src/map/packets/c2s/0x050_equip_set.cpp | 2 +- src/map/packets/c2s/0x051_equipset_set.cpp | 2 +- src/map/packets/c2s/0x096_combine_ask.cpp | 2 +- src/map/packets/c2s/0x0e7_reqlogout.cpp | 2 +- src/map/packets/c2s/0x0e8_camp.cpp | 2 +- src/map/packets/c2s/0x0ea_sit.cpp | 2 +- src/map/packets/c2s/0x113_sitchair.cpp | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/map/packets/c2s/0x036_item_transfer.cpp b/src/map/packets/c2s/0x036_item_transfer.cpp index 8f3e5b9a791..42c4703d87f 100644 --- a/src/map/packets/c2s/0x036_item_transfer.cpp +++ b/src/map/packets/c2s/0x036_item_transfer.cpp @@ -48,7 +48,7 @@ auto GP_CLI_COMMAND_ITEM_TRANSFER::validate(MapSession* PSession, const CCharEnt { // A Monipulator can only trade with the Feretory's NPCs. return PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent }) + .blockedBy({ BlockedState::InEvent, BlockedState::Fishing }) .mustEqual(PChar->m_PMonstrosity == nullptr || PChar->getZone() == xi::ZoneId::Feretory, true, "Monipulators only trade in the Feretory") .range("ItemNum", this->ItemNum, 1, MAX_TRADE_SLOTS); } diff --git a/src/map/packets/c2s/0x050_equip_set.cpp b/src/map/packets/c2s/0x050_equip_set.cpp index 04733e85fca..b879c4e6870 100644 --- a/src/map/packets/c2s/0x050_equip_set.cpp +++ b/src/map/packets/c2s/0x050_equip_set.cpp @@ -80,7 +80,7 @@ const auto validContainers = [](const CCharEntity* PChar) -> std::set PacketValidationResult { return PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus }) + .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus, BlockedState::Fishing }) .oneOf(this->EquipKind) .oneOf("Category", static_cast(this->Category), validContainers(PChar)); } diff --git a/src/map/packets/c2s/0x051_equipset_set.cpp b/src/map/packets/c2s/0x051_equipset_set.cpp index 820f7883df5..0e6f5fa72a9 100644 --- a/src/map/packets/c2s/0x051_equipset_set.cpp +++ b/src/map/packets/c2s/0x051_equipset_set.cpp @@ -83,7 +83,7 @@ auto GP_CLI_COMMAND_EQUIPSET_SET::validate(MapSession* PSession, const CCharEnti // JP wiki: a Monipulator cannot use /equipset. auto pv = PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus, BlockedState::Monstrosity }) + .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus, BlockedState::Fishing, BlockedState::Monstrosity }) .range("Count", this->Count, 1, 16); if (this->Count <= 16) diff --git a/src/map/packets/c2s/0x096_combine_ask.cpp b/src/map/packets/c2s/0x096_combine_ask.cpp index bedef724c12..85b7af04c1c 100644 --- a/src/map/packets/c2s/0x096_combine_ask.cpp +++ b/src/map/packets/c2s/0x096_combine_ask.cpp @@ -71,7 +71,7 @@ const std::set validCrystals = { auto GP_CLI_COMMAND_COMBINE_ASK::validate(MapSession* PSession, const CCharEntity* PChar) const -> PacketValidationResult { return PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::PreventAction, BlockedState::Monstrosity }) + .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::Fishing, BlockedState::PreventAction, BlockedState::Monstrosity }) .oneOf("Crystal", static_cast(this->Crystal), validCrystals) .range("Items", this->Items, 1, 8); } diff --git a/src/map/packets/c2s/0x0e7_reqlogout.cpp b/src/map/packets/c2s/0x0e7_reqlogout.cpp index 500eca35f2a..4fe222c8b7b 100644 --- a/src/map/packets/c2s/0x0e7_reqlogout.cpp +++ b/src/map/packets/c2s/0x0e7_reqlogout.cpp @@ -28,7 +28,7 @@ auto GP_CLI_COMMAND_REQLOGOUT::validate(MapSession* PSession, const CCharEntity* PChar) const -> PacketValidationResult { return PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::PreventAction }) + .blockedBy({ BlockedState::InEvent, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::Fishing, BlockedState::PreventAction }) .oneOf(this->Mode) .oneOf(this->Kind); } diff --git a/src/map/packets/c2s/0x0e8_camp.cpp b/src/map/packets/c2s/0x0e8_camp.cpp index 55d090e8c26..03cea5e2595 100644 --- a/src/map/packets/c2s/0x0e8_camp.cpp +++ b/src/map/packets/c2s/0x0e8_camp.cpp @@ -33,7 +33,7 @@ auto GP_CLI_COMMAND_CAMP::validate(MapSession* PSession, const CCharEntity* PCha { // JP wiki: a Monipulator cannot /heal. return PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent, BlockedState::Dead, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::PreventAction, BlockedState::Engaged, BlockedState::Monstrosity }) + .blockedBy({ BlockedState::InEvent, BlockedState::Dead, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::Fishing, BlockedState::PreventAction, BlockedState::Engaged, BlockedState::Monstrosity }) .oneOf(this->Mode) .mustNotEqual( PChar->animation == xi::Animation::Healing && diff --git a/src/map/packets/c2s/0x0ea_sit.cpp b/src/map/packets/c2s/0x0ea_sit.cpp index 0db714482e8..bb4d5f2dcef 100644 --- a/src/map/packets/c2s/0x0ea_sit.cpp +++ b/src/map/packets/c2s/0x0ea_sit.cpp @@ -29,7 +29,7 @@ auto GP_CLI_COMMAND_SIT::validate(MapSession* PSession, const CCharEntity* PChar) const -> PacketValidationResult { return PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent, BlockedState::Dead, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::PreventAction }) + .blockedBy({ BlockedState::InEvent, BlockedState::Dead, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::Fishing, BlockedState::PreventAction }) .oneOf(this->Mode); } diff --git a/src/map/packets/c2s/0x113_sitchair.cpp b/src/map/packets/c2s/0x113_sitchair.cpp index e5230d3d92e..405f5570b7f 100644 --- a/src/map/packets/c2s/0x113_sitchair.cpp +++ b/src/map/packets/c2s/0x113_sitchair.cpp @@ -29,7 +29,7 @@ auto GP_CLI_COMMAND_SITCHAIR::validate(MapSession* PSession, const CCharEntity* PChar) const -> PacketValidationResult { return PacketValidator(PChar) - .blockedBy({ BlockedState::InEvent, BlockedState::Dead, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::PreventAction }) + .blockedBy({ BlockedState::InEvent, BlockedState::Dead, BlockedState::AbnormalStatus, BlockedState::Crafting, BlockedState::Fishing, BlockedState::PreventAction }) .oneOf(this->Mode) .range("ChairId", this->ChairId, 0, 20); // 10 chairs + 10 reserved slots for future use } From b6dac2a30857ff3f7e77c47de17af65cfd49996a Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:08 -0400 Subject: [PATCH 07/17] Clean up fishing hook state between casts --- src/map/utils/fishingutils.cpp | 104 ++++++++++++++++++++++++--------- src/map/utils/fishingutils.h | 2 + 2 files changed, 78 insertions(+), 28 deletions(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index db7b4ec6136..b8f0c543d60 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -1637,6 +1637,7 @@ auto CatchMonster(CCharEntity* PChar, uint32 MobID) -> int32 PMob->setMobMod(xi::MobMod::IdleDespawn, 180); PMob->SetDespawnTime(180s); PMob->SetLocalVar("hooked", 0); + PMob->SetLocalVar("hookedBy", 0); if (mob->maxRespawn > mob->minRespawn) { @@ -1746,7 +1747,7 @@ auto SendHookResponse(CCharEntity* PChar, fishresponse_t* response, CancelOnMobL break; case FISHINGCATCHTYPE_MOB: { - CMobEntity* PMob = dynamic_cast(zoneutils::GetEntity(PChar->hookedFish->catchid, TYPE_MOB)); + CMobEntity* PMob = dynamic_cast(zoneutils::GetEntity(response->catchid, TYPE_MOB)); if (CanFishMob(PMob)) { @@ -1951,6 +1952,12 @@ void StartFishing(CCharEntity* PChar) if (FishingAreaID > 0) { + // The previous cast left a fish on the line without sending an end packet + if (PChar->hookedFish != nullptr && PChar->hookedFish->hooked && PChar->fishingToken != 0) + { + AbandonHook(PChar); + } + PChar->fishingToken = 1 + xirand::GetRandomNumber(9999); destroy(PChar->hookedFish); @@ -2053,9 +2060,11 @@ auto UnhookMob(CCharEntity* PChar, Lost lost) -> uint8 { CMobEntity* PMob = dynamic_cast(zoneutils::GetEntity(PChar->hookedFish->catchid, TYPE_MOB)); - if (PMob != nullptr) + // Only the angler who hooked the mob may clear it, or a stale cleanup could free someone else's hook + if (PMob != nullptr && PMob->GetLocalVar("hookedBy") == PChar->id) { PMob->SetLocalVar("hooked", 0); + PMob->SetLocalVar("hookedBy", 0); if (lost && PChar->hookedFish->nm && PChar->hookedFish->nmFlags & FISHINGNM_RESET_RESPAWN_ON_FAIL) { @@ -2548,6 +2557,7 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba if (PMob != nullptr && PMob->GetLocalVar("hooked") == 0) { PMob->SetLocalVar("hooked", 1); + PMob->SetLocalVar("hookedBy", PChar->id); PMob->SetLocalVar("hookedTime", earth_time::timestamp()); response->hooked = true; @@ -2647,6 +2657,39 @@ auto ReelCheck(CCharEntity* PChar, fishresponse_t* fishResponse, rod_t* rod) -> return catchResponse; } +// Same cost as giving up in the minigame +void AbandonHook(CCharEntity* PChar) +{ + BaitLoss(PChar, RemoveFly::No, SendUpdate::Yes); + UnhookMob(PChar, Lost::Yes); +} + +void ReleaseFishing(CCharEntity* PChar) +{ + if (PChar->hookedFish != nullptr) + { + UnhookMob(PChar, Lost::No); + + // Only a landed fish can skill up + if (PChar->hookedFish->successtype == FISHINGSUCCESSTYPE_CATCHSMALL || PChar->hookedFish->successtype == FISHINGSUCCESSTYPE_CATCHLARGE) + { + const uint16 skillUpChances = 1 + PChar->getMod(xi::Mod::PELICAN_RING_EFFECT); + + for (uint16 i = 0; i < skillUpChances; i++) + { + FishingSkillup(PChar, PChar->hookedFish->catchlevel, PChar->hookedFish->successtype); + } + } + + destroy(PChar->hookedFish); + PChar->hookedFish = nullptr; + } + + PChar->fishingToken = 0; + PChar->animation = xi::Animation::None; + PChar->updatemask |= UPDATE_HP; +} + void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, const uint32 para, const uint32 para2) { const uint32 stamina = para; @@ -2663,18 +2706,21 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, uint16 MessageOffset = GetMessageOffset(PChar->getZone()); uint32 vanaTime = earth_time::vanadiel_timestamp(); - // Ending the minigame clears the token before the client requests release. - // Release must still clean up the catch and restore the idle animation. - if (PChar->fishingToken == 0 && mode != GP_CLI_COMMAND_FISHING_2_MODE::RequestRelease) - { - PChar->animation = xi::Animation::NewFishingStop; - return; - } - switch (mode) { case GP_CLI_COMMAND_FISHING_2_MODE::RequestCheckHook: { + if (PChar->fishingToken == 0) + { + return; + } + + // Ignore another check while a fish is on the line + if (PChar->animation == xi::Animation::NewFishingFish) + { + return; + } + if (PChar->animation != xi::Animation::NewFishingStart) { CatchNothing(PChar, FISHINGFAILTYPE_NONE); @@ -2735,6 +2781,10 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, // send catch message if (!SendHookResponse(PChar, response, CancelOnMobLoadFailBait::Yes)) { + // The angler saw nothing bite, so drop the hook before it can cost bait later + UnhookMob(PChar, Lost::No); + destroy(PChar->hookedFish); + PChar->hookedFish = nullptr; return; } @@ -2756,6 +2806,11 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, case GP_CLI_COMMAND_FISHING_2_MODE::RequestEndMiniGame: { + if (PChar->fishingToken == 0) + { + return; + } + if (stamina <= 4) { CItemWeapon* Rod = dynamic_cast(PChar->getEquip(SLOT_RANGED)); @@ -2881,37 +2936,30 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, case GP_CLI_COMMAND_FISHING_2_MODE::RequestPotentialTimeout: { + if (PChar->fishingToken == 0) + { + return; + } + // message: "You don't know how much longer you can keep this one on the line..." PChar->pushPacket(PChar, MessageOffset + FISHMESSAGEOFFSET_WARNING); return; } - default: + // Sent after the minigame ends, when the token is already cleared case GP_CLI_COMMAND_FISHING_2_MODE::RequestRelease: { - if (PChar->hookedFish != nullptr) + if (PChar->isFishing()) { - UnhookMob(PChar, Lost::No); - - // No skillups for items or mobs. - if (PChar->hookedFish->catchtype == FISHINGCATCHTYPE_SMALLFISH || PChar->hookedFish->catchtype == FISHINGCATCHTYPE_BIGFISH) + // A release mid-fight without an end packet counts as giving up + if (PChar->hookedFish != nullptr && PChar->hookedFish->hooked && PChar->fishingToken != 0) { - uint16 skillUpChances = 1 + PChar->getMod(xi::Mod::PELICAN_RING_EFFECT); - - for (int i = 0; i < skillUpChances; i++) - { - FishingSkillup(PChar, PChar->hookedFish->catchlevel, PChar->hookedFish->successtype); - } + AbandonHook(PChar); } - destroy(PChar->hookedFish); - PChar->hookedFish = nullptr; + ReleaseFishing(PChar); } - - PChar->animation = xi::Animation::None; - PChar->updatemask |= UPDATE_HP; } - break; } } diff --git a/src/map/utils/fishingutils.h b/src/map/utils/fishingutils.h index ae3277a4970..9d48c29cdb5 100644 --- a/src/map/utils/fishingutils.h +++ b/src/map/utils/fishingutils.h @@ -946,6 +946,8 @@ void FishingSkillup(CCharEntity* PChar, uint8 catchLevel, uint8 successType); // Fishing void InterruptFishing(CCharEntity* PChar); +void AbandonHook(CCharEntity* PChar); +void ReleaseFishing(CCharEntity* PChar); void StartFishing(CCharEntity* PChar); void ReelInCatch(CCharEntity* PChar); auto UnhookMob(CCharEntity* PChar, Lost lost) -> uint8; From 83548e819850eb863d7ae5948de4ca91e0f806fc Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:08 -0400 Subject: [PATCH 08/17] Land fished gil and Rare items correctly --- src/map/utils/fishingutils.cpp | 45 +++++++++++++++++++++++++++++++--- src/map/utils/fishingutils.h | 1 + 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index b8f0c543d60..a705c65bebf 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -28,6 +28,7 @@ #include "packets/char_status.h" #include "packets/char_sync.h" +#include "packets/s2c/0x009_message.h" #include "packets/s2c/0x017_chat_std.h" #include "packets/s2c/0x01d_item_same.h" #include "packets/s2c/0x027_talknumwork2.h" @@ -57,6 +58,7 @@ #include "enums/msg_basic.h" #include "enums/msg_std.h" #include "item_container.h" +#include "items.h" #include "items/exdata/fish.h" #include "items/transactions/item_claim.h" #include "itemutils.h" @@ -1518,6 +1520,13 @@ auto CatchFish(CCharEntity* PChar, uint16 FishID, BigFish bigFish, uint16 length return 0; } + // Check before the give, which would refuse it anyway but log an error + if (Fish->hasFlag(xi::ItemFlag::Rare) && charutils::HasItem(PChar, FishID)) + { + PChar->pushPacket(PChar, FishID, 0, MsgStd::ItemEx); + return 0; + } + if (bigFish && length > 1 && weight > 1) { auto& fishData = Fish->exdata(); @@ -1559,9 +1568,25 @@ auto CatchItem(CCharEntity* PChar, uint16 ItemID, uint8 Count = 1) -> int32 PChar->animation = xi::Animation::NewFishingCaught; PChar->updatemask |= UPDATE_HP; + // Gil has no item entry and needs no free slot + if (ItemID == ITEMID::GIL) + { + auto transaction = ItemClaimTransaction::start(PChar); + if (!transaction || !transaction->earn(1) || !transaction->commit()) + { + ShowErrorFmt("fishingutils: {} did not receive the gil they caught", PChar->getName()); + return 0; + } + + // TODO: The text id matches the client, but the gil amount and packet params are guesses + PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, std::make_unique(PChar, 1, MessageOffset + FISHMESSAGEOFFSET_CATCH_GIL, 1)); + return 1; + } + if (PChar->getStorage(LOC_INVENTORY)->GetFreeSlotsCount() != 0) { - if (xi::items::lookup(ItemID) == nullptr) + const auto* PItem = xi::items::lookup(ItemID); + if (PItem == nullptr) { ShowError("Invalid ItemID %i for fished item", ItemID); PChar->animation = xi::Animation::NewFishingStop; @@ -1570,6 +1595,12 @@ auto CatchItem(CCharEntity* PChar, uint16 ItemID, uint8 Count = 1) -> int32 return 0; } + if (PItem->hasFlag(xi::ItemFlag::Rare) && charutils::HasItem(PChar, ItemID)) + { + PChar->pushPacket(PChar, ItemID, 0, MsgStd::ItemEx); + return 0; + } + auto transaction = ItemClaimTransaction::start(PChar); if (!transaction || !transaction->give(LOC_INVENTORY, ItemID, Count) || !transaction->commit()) { @@ -2024,6 +2055,8 @@ void ReelInCatch(CCharEntity* PChar) { if (PChar->hookedFish != nullptr) { + int32 landed = 0; + switch (PChar->hookedFish->catchtype) { case FISHINGCATCHTYPE_NONE: @@ -2032,11 +2065,11 @@ void ReelInCatch(CCharEntity* PChar) break; case FISHINGCATCHTYPE_SMALLFISH: PChar->hookedFish->successtype = FISHINGSUCCESSTYPE_CATCHSMALL; - CatchFish(PChar, PChar->hookedFish->catchid, BigFish::No, 0, 0, PChar->hookedFish->count); + landed = CatchFish(PChar, PChar->hookedFish->catchid, BigFish::No, 0, 0, PChar->hookedFish->count); break; case FISHINGCATCHTYPE_BIGFISH: PChar->hookedFish->successtype = FISHINGSUCCESSTYPE_CATCHLARGE; - CatchFish(PChar, PChar->hookedFish->catchid, BigFish::Yes, PChar->hookedFish->length, PChar->hookedFish->weight, PChar->hookedFish->count); + landed = CatchFish(PChar, PChar->hookedFish->catchid, BigFish::Yes, PChar->hookedFish->length, PChar->hookedFish->weight, PChar->hookedFish->count); break; case FISHINGCATCHTYPE_ITEM: PChar->hookedFish->successtype = FISHINGSUCCESSTYPE_CATCHITEM; @@ -2051,6 +2084,12 @@ void ReelInCatch(CCharEntity* PChar) CatchChest(PChar, PChar->hookedFish->catchid, PChar->hookedFish->distance, PChar->hookedFish->angle); break; } + + // No skillup for a fish that didn't reach the inventory + if (!landed && (PChar->hookedFish->catchtype == FISHINGCATCHTYPE_SMALLFISH || PChar->hookedFish->catchtype == FISHINGCATCHTYPE_BIGFISH)) + { + PChar->hookedFish->successtype = FISHINGSUCCESSTYPE_NONE; + } } } diff --git a/src/map/utils/fishingutils.h b/src/map/utils/fishingutils.h index 9d48c29cdb5..9dc8f83e112 100644 --- a/src/map/utils/fishingutils.h +++ b/src/map/utils/fishingutils.h @@ -494,6 +494,7 @@ enum FISHMESSAGEOFFSET : uint8 FISHMESSAGEOFFSET_LOST_TOOBIG = 0x3C, // You lost your catch. Whatever caught the hook was too large to catch with this rod. FISHMESSAGEOFFSET_GIVEUP_BAITLOSS = 0x24, // You give up and reel in your line. FISHMESSAGEOFFSET_GIVEUP = 0x25, // You give up. + FISHMESSAGEOFFSET_CATCH_GIL = 0x26, // obtains gil. FISHMESSAGEOFFSET_CATCH = 0x27, // caught FISHMESSAGEOFFSET_CATCH_MULTI = 0x0E, // caught X FISHMESSAGEOFFSET_CATCH_INV_FULL = 0x0A, // caught , but cannot carry any more items. ≺Player≻ regretfully releases the From 331f08ee7a192dcbfb5e243f2ce8dbcd9336826e Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:08 -0400 Subject: [PATCH 09/17] Let multi-hook bait reach its top hook count --- src/map/utils/fishingutils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index a705c65bebf..2658a2da68a 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -2522,7 +2522,8 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba if (FishSelection->maxhook > 1 && bait->maxhook > 1) { - response->count = (uint8)xirand::GetRandomNumber(1, bait->maxhook); + // GetRandomNumber excludes the upper bound + response->count = (uint8)xirand::GetRandomNumber(1, bait->maxhook + 1); } else { From 4e36a6e68920f1a49aa54911ee5b5c9d87ec62f5 Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:08 -0400 Subject: [PATCH 10/17] Show the fishing sweat animation to nearby players --- src/map/utils/fishingutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 2658a2da68a..433ad3dd6e9 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -2831,7 +2831,7 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, // send then response sense message SendSenseMessage(PChar, response); // play the sweating animation - PChar->pushPacket(PChar, PChar, FourCC::Sweating); + PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE_SELF, std::make_unique(PChar, PChar, FourCC::Sweating)); PChar->updatemask |= UPDATE_HP; // send the fishing packet PChar->animation = xi::Animation::NewFishingFish; From 52e5abc78c428b26f5ffa5672c244073210e18e4 Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:09 -0400 Subject: [PATCH 11/17] Add fishing calculation and area tests --- src/test/CMakeLists.txt | 1 + src/test/tests/fishing_tests.cpp | 76 ++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/test/tests/fishing_tests.cpp diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 784fd2755b7..b9c22515abe 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -62,6 +62,7 @@ xi_add_executable(xi_test testserver.rc ${CMAKE_CURRENT_SOURCE_DIR}/tests/data/zones/regions_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/data/zones/settings_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/entity_list_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/tests/fishing_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/item_container_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/rng_runtime_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tests/pathfind_region_tests.cpp diff --git a/src/test/tests/fishing_tests.cpp b/src/test/tests/fishing_tests.cpp new file mode 100644 index 00000000000..2641da55951 --- /dev/null +++ b/src/test/tests/fishing_tests.cpp @@ -0,0 +1,76 @@ +/* +=========================================================================== + + Copyright (c) 2026 LandSandBoat Dev Teams + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see http://www.gnu.org/licenses/ + +=========================================================================== +*/ + +#include "map/utils/fishingutils.h" + +#include + +TEST_CASE("Fishing legendary attack bonuses also increase wrong-arrow healing", "[fishing]") +{ + auto rod = rod_t{}; + rod.fishAttack = 100; + rod.lgdBonusAtk = 50; + rod.fishRecovery = 50; + + CHECK(fishingutils::CalculateAttack(fishingutils::Legendary::No, 20, &rod) == 400); + CHECK(fishingutils::CalculateAttack(fishingutils::Legendary::Yes, 20, &rod) == 600); + CHECK(fishingutils::CalculateHeal(fishingutils::Legendary::No, 20, &rod) == 100); + CHECK(fishingutils::CalculateHeal(fishingutils::Legendary::Yes, 20, &rod) == 150); +} + +TEST_CASE("Fishing area segments intersect at crossings, endpoints and overlaps", "[fishing]") +{ + CHECK(fishingutils::doIntersect({ 0, 0, 0 }, { 10, 0, 10 }, { 0, 0, 10 }, { 10, 0, 0 })); + CHECK(fishingutils::doIntersect({ 0, 0, 0 }, { 10, 0, 0 }, { 10, 0, 0 }, { 20, 0, 0 })); + CHECK(fishingutils::doIntersect({ 0, 0, 0 }, { 10, 0, 0 }, { 5, 0, 0 }, { 15, 0, 0 })); + CHECK_FALSE(fishingutils::doIntersect({ 0, 0, 0 }, { 10, 0, 0 }, { 11, 0, 0 }, { 20, 0, 0 })); + CHECK_FALSE(fishingutils::doIntersect({ 0, 0, 0 }, { 10, 0, 0 }, { 0, 0, 1 }, { 10, 0, 1 })); +} + +TEST_CASE("Fishing polygon boundaries include edges and enforce height", "[fishing]") +{ + areavector_t polygon[] = { { 0, 0, 0 }, { 10, 0, 0 }, { 10, 0, 10 }, { 0, 0, 10 } }; + + CHECK(fishingutils::isInsidePoly(polygon, 4, { 5, 0, 5 }, 0, 4)); + CHECK(fishingutils::isInsidePoly(polygon, 4, { 0, 0, 5 }, 0, 4)); + CHECK(fishingutils::isInsidePoly(polygon, 4, { 5, 2, 5 }, 0, 4)); + CHECK(fishingutils::isInsidePoly(polygon, 4, { 5, -2, 5 }, 0, 4)); + CHECK_FALSE(fishingutils::isInsidePoly(polygon, 4, { 11, 0, 5 }, 0, 4)); + CHECK_FALSE(fishingutils::isInsidePoly(polygon, 4, { 5, 3, 5 }, 0, 4)); + CHECK_FALSE(fishingutils::isInsidePoly(polygon, 4, { 5, -3, 5 }, 0, 4)); + CHECK_FALSE(fishingutils::isInsidePoly(polygon, 2, { 5, 0, 5 }, 0, 4)); +} + +TEST_CASE("Fishing cylinders include the radius and reject points beyond it", "[fishing]") +{ + const auto center = areavector_t{ 10, 20, 30 }; + + CHECK(fishingutils::isInsideCylinder(center, { 10, 20, 30 }, 5, 4)); + CHECK(fishingutils::isInsideCylinder(center, { 13, 20, 34 }, 5, 4)); + CHECK(fishingutils::isInsideCylinder(center, { 7, 20, 26 }, 5, 4)); + CHECK(fishingutils::isInsideCylinder(center, { 10, 22, 30 }, 5, 4)); + CHECK(fishingutils::isInsideCylinder(center, { 10, 18, 30 }, 5, 4)); + CHECK_FALSE(fishingutils::isInsideCylinder(center, { 14, 20, 34 }, 5, 4)); + CHECK_FALSE(fishingutils::isInsideCylinder(center, { 16, 20, 30 }, 5, 4)); + CHECK_FALSE(fishingutils::isInsideCylinder(center, { 10, 20, 36 }, 5, 4)); + CHECK_FALSE(fishingutils::isInsideCylinder(center, { 10, 23, 30 }, 5, 4)); + CHECK_FALSE(fishingutils::isInsideCylinder(center, { 10, 17, 30 }, 5, 4)); +} From a4d8870410fe9c7104e3fe3c0e5c8ce547dbd578 Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:09 -0400 Subject: [PATCH 12/17] Rework fishing loss, line snap and rod break chances --- src/map/utils/fishingutils.cpp | 62 +++------- src/map/utils/fishingutils.h | 3 + src/test/tests/fishing_tests.cpp | 205 +++++++++++++++++++++++++++++++ 3 files changed, 228 insertions(+), 42 deletions(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 433ad3dd6e9..483bdd94e27 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -733,29 +733,14 @@ auto CalculateLoseChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, ui { if (sizeType > rod->sizeType && ranking > rod->maxRank) { - tooBigChance = 50; - if (fishingSkill < maxSkill) - { - tooBigChance += maxSkill - fishingSkill; - } - - if (fishingSkill > maxSkill) - { - tooBigChance -= fishingSkill - maxSkill; - } + // Capped at 50 so the certain low-skill loss below always wins + const auto skillGap = static_cast(fishingSkill) - static_cast(maxSkill); + tooBigChance = static_cast(std::clamp(50 - skillGap, 0, 50)); } - else if (sizeType < rod->sizeType && ranking < rod->minRank) + else if (sizeType < rod->sizeType) { - tooSmallChance = 50; - if (fishingSkill < maxSkill) - { - tooSmallChance += maxSkill - fishingSkill; - } - - if (fishingSkill > maxSkill) - { - tooSmallChance -= std::min(fishingSkill - maxSkill, tooSmallChance); - } + // Scales with the fish's level, the angler's skill doesn't reduce it + tooSmallChance = static_cast(std::min(90, static_cast(std::floor(maxSkill * 1.8f)))); } } @@ -763,23 +748,28 @@ auto CalculateLoseChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, ui { uint8 diff = maxSkill - (fishingSkill + 7); float diffAdd = diff * 0.8f; - lowSkillChance = (uint8)std::floor(diffAdd); // min 5, max 85 + lowSkillChance = (uint8)std::floor(diffAdd); + + if (fishingSkill + 50 <= maxSkill) + { + lowSkillChance = 100; + } } if (tooBigChance > 0 && tooBigChance > lowSkillChance) { lsb.failReason = FISHINGFAILTYPE_LOST_TOOBIG; - lsb.chance = std::clamp(tooBigChance, 0, 50); + lsb.chance = tooBigChance; } else if (tooSmallChance > 0 && tooSmallChance > lowSkillChance) { lsb.failReason = FISHINGFAILTYPE_LOST_TOOSMALL; - lsb.chance = std::clamp(tooSmallChance, 0, 50); + lsb.chance = std::clamp(tooSmallChance, 0, 100); } else if (catchType < FISHINGCATCHTYPE_ITEM && lowSkillChance > 0) { lsb.failReason = FISHINGFAILTYPE_LOST_LOWSKILL; - lsb.chance = std::clamp(lowSkillChance, 0, 55); + lsb.chance = std::clamp(lowSkillChance, 0, 100); } return lsb; @@ -788,18 +778,12 @@ auto CalculateLoseChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, ui auto CalculateSnapChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, uint8 sizeType, bool legendary, uint8 ranking, rod_t* rod) -> lsbret_t { lsbret_t lsb; - uint8 levelDiffBonus = 0; uint8 sizePenalty = 0; uint8 legendaryBonus = 0; uint8 totalDurability = 0; lsb.failReason = FISHINGFAILTYPE_NONE; lsb.chance = 0; - if (fishingSkill + 10 > maxSkill) - { - levelDiffBonus = 2; - } - if (!rod->legendary && sizeType > rod->sizeType) { sizePenalty = 2; @@ -817,13 +801,13 @@ auto CalculateSnapChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, ui } } - totalDurability = rod->maxRank + levelDiffBonus + legendaryBonus - sizePenalty; + totalDurability = rod->maxRank + legendaryBonus - sizePenalty; if (ranking > totalDurability) { uint8 strDuraDiff = ranking - totalDurability; lsb.failReason = FISHINGFAILTYPE_LINESNAP; - lsb.chance = std::clamp((uint8)std::floor(strDuraDiff * 8.5f), 0, 55); + lsb.chance = static_cast(std::min(55, strDuraDiff * 19)); } return lsb; @@ -832,7 +816,6 @@ auto CalculateSnapChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, ui auto CalculateBreakChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, uint8 sizeType, bool legendary, uint8 ranking, rod_t* rod) -> lsbret_t { lsbret_t lsb; - uint8 levelDiffBonus = 0; uint8 legendaryBonus = 0; uint8 sizePenalty = 0; lsb.failReason = FISHINGFAILTYPE_NONE; @@ -843,11 +826,6 @@ auto CalculateBreakChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, u return lsb; } - if (fishingSkill + 10 > maxSkill) - { - levelDiffBonus = 2; - } - if (!rod->legendary && sizeType > rod->sizeType) { sizePenalty = 2; @@ -862,11 +840,11 @@ auto CalculateBreakChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, u sizePenalty = 5; } - if (ranking > rod->maxRank + levelDiffBonus + legendaryBonus) + if (ranking > rod->maxRank + legendaryBonus) { - uint8 strDuraDiff = ranking - (rod->maxRank + levelDiffBonus + legendaryBonus); + uint8 strDuraDiff = ranking - (rod->maxRank + legendaryBonus); lsb.failReason = FISHINGFAILTYPE_RODBREAK; - lsb.chance = std::clamp((uint8)std::floor((strDuraDiff + sizePenalty) * 1.3f), 0, 55); + lsb.chance = static_cast(std::min(20, (strDuraDiff + sizePenalty) * 10)); } return lsb; diff --git a/src/map/utils/fishingutils.h b/src/map/utils/fishingutils.h index 9dc8f83e112..f53251489b0 100644 --- a/src/map/utils/fishingutils.h +++ b/src/map/utils/fishingutils.h @@ -901,6 +901,9 @@ auto CalculateLuckyTiming(CCharEntity* PChar, uint8 fishingSkill, uint8 catchSki auto CalculateHookChance(uint8 fishingSkill, fish_t* fish, bait_t* bait, rod_t* rod) -> uint16; auto CalculateDelay(CCharEntity* PChar, uint8 baseDelay, uint8 sizeType, rod_t* rod, uint8 count) -> uint8; auto CalculateMovement(CCharEntity* PChar, uint8 baseMove, uint8 sizeType, rod_t* rod, uint8 count) -> uint8; +auto CalculateLoseChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, uint8 sizeType, bool legendary, uint8 ranking, rod_t* rod) -> lsbret_t; +auto CalculateSnapChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, uint8 sizeType, bool legendary, uint8 ranking, rod_t* rod) -> lsbret_t; +auto CalculateBreakChance(uint8 catchType, uint8 fishingSkill, uint8 maxSkill, uint8 sizeType, bool legendary, uint8 ranking, rod_t* rod) -> lsbret_t; auto CalculateFishSense(CCharEntity* PChar, fishresponse_t* response, uint8 fishingSkill, uint8 catchType, uint8 sizeType, uint8 maxSkill, Legendary legendary, uint16 minLength, uint16 maxLength, uint8 ranking, rod_t* rod) -> uint8; auto CalculateCriticalBite(uint8 fishingSkill, uint8 fishSkill, rod_t* rod) -> uint16; auto CalculateBigFishStats(uint16 minLength, uint16 maxLength) -> big_fish_stats_t; diff --git a/src/test/tests/fishing_tests.cpp b/src/test/tests/fishing_tests.cpp index 2641da55951..64a34232988 100644 --- a/src/test/tests/fishing_tests.cpp +++ b/src/test/tests/fishing_tests.cpp @@ -74,3 +74,208 @@ TEST_CASE("Fishing cylinders include the radius and reject points beyond it", "[ CHECK_FALSE(fishingutils::isInsideCylinder(center, { 10, 23, 30 }, 5, 4)); CHECK_FALSE(fishingutils::isInsideCylinder(center, { 10, 17, 30 }, 5, 4)); } + +TEST_CASE("Fishing small-fish losses depend on fish level, not angler skill or rank", "[fishing]") +{ + auto rod = rod_t{}; + rod.rodID = COMPOSITE; + rod.sizeType = FISHINGSIZETYPE_LARGE; + rod.minRank = 1; + + for (const auto skill : { 20, 100 }) + { + for (const auto rank : { 0, 10 }) + { + CAPTURE(skill, rank); + const auto result = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_SMALLFISH, skill, 20, FISHINGSIZETYPE_SMALL, false, rank, &rod); + CHECK(result.failReason == FISHINGFAILTYPE_LOST_TOOSMALL); + CHECK(result.chance == 36); + } + } +} + +TEST_CASE("Fishing small-fish loss chance stops at ninety percent", "[fishing]") +{ + auto rod = rod_t{}; + rod.sizeType = FISHINGSIZETYPE_LARGE; + + for (const auto level : { 50, 100 }) + { + CAPTURE(level); + const auto result = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_SMALLFISH, 100, level, FISHINGSIZETYPE_SMALL, false, 0, &rod); + CHECK(result.failReason == FISHINGFAILTYPE_LOST_TOOSMALL); + CHECK(result.chance == 90); + } +} + +TEST_CASE("Fishing legendary rods bypass size losses", "[fishing]") +{ + auto rod = rod_t{}; + rod.legendary = true; + rod.sizeType = FISHINGSIZETYPE_LARGE; + + const auto result = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_SMALLFISH, 100, 50, FISHINGSIZETYPE_SMALL, false, 0, &rod); + CHECK(result.failReason == FISHINGFAILTYPE_NONE); + CHECK(result.chance == 0); +} + +TEST_CASE("Fishing skill losses start beyond seven levels and become certain at fifty", "[fishing]") +{ + auto rod = rod_t{}; + + struct SkillCase + { + uint8 maxSkill; + uint8 chance; + uint8 reason; + }; + + const SkillCase cases[] = { + { 27, 0, FISHINGFAILTYPE_NONE }, + { 28, 0, FISHINGFAILTYPE_NONE }, + { 29, 1, FISHINGFAILTYPE_LOST_LOWSKILL }, + { 69, 33, FISHINGFAILTYPE_LOST_LOWSKILL }, + { 70, 100, FISHINGFAILTYPE_LOST_LOWSKILL }, + { 71, 100, FISHINGFAILTYPE_LOST_LOWSKILL }, + }; + + for (const auto& entry : cases) + { + CAPTURE(entry.maxSkill); + const auto result = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_SMALLFISH, 20, entry.maxSkill, FISHINGSIZETYPE_SMALL, false, 0, &rod); + CHECK(result.failReason == entry.reason); + CHECK(result.chance == entry.chance); + } +} + +TEST_CASE("Fishing guaranteed skill loss takes precedence over rod size loss", "[fishing]") +{ + auto rod = rod_t{}; + rod.rodID = SINGLE_HOOK; + rod.sizeType = FISHINGSIZETYPE_LARGE; + + const auto result = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_SMALLFISH, 0, 50, FISHINGSIZETYPE_SMALL, false, 0, &rod); + CHECK(result.failReason == FISHINGFAILTYPE_LOST_LOWSKILL); + CHECK(result.chance == 100); +} + +TEST_CASE("Fishing items and monsters do not incur low-skill losses", "[fishing]") +{ + auto rod = rod_t{}; + + for (const auto type : { FISHINGCATCHTYPE_ITEM, FISHINGCATCHTYPE_MOB }) + { + CAPTURE(type); + const auto result = fishingutils::CalculateLoseChance(type, 0, 100, FISHINGSIZETYPE_SMALL, false, 0, &rod); + CHECK(result.failReason == FISHINGFAILTYPE_NONE); + CHECK(result.chance == 0); + } +} + +TEST_CASE("Fishing oversized catches have a fifty percent size-loss ceiling", "[fishing]") +{ + auto rod = rod_t{}; + rod.maxRank = 10; + + const auto result = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_BIGFISH, 20, 40, FISHINGSIZETYPE_LARGE, false, 11, &rod); + CHECK(result.failReason == FISHINGFAILTYPE_LOST_TOOBIG); + CHECK(result.chance == 50); +} + +TEST_CASE("Fishing oversized catches never outrank a certain low-skill loss or punish a master angler", "[fishing]") +{ + auto rod = rod_t{}; + rod.maxRank = 10; + + struct SizeCase + { + uint8 fishingSkill; + uint8 maxSkill; + uint8 ranking; + uint8 reason; + uint8 chance; + }; + + // Row 1 checks the 50-level rule beats the size loss, row 2 checks the size chance can't go below zero + const SizeCase cases[] = { + { 0, 51, 11, FISHINGFAILTYPE_LOST_LOWSKILL, 100 }, + { 100, 18, 16, FISHINGFAILTYPE_NONE, 0 }, + }; + + for (const auto& [fishingSkill, maxSkill, ranking, reason, chance] : cases) + { + CAPTURE(fishingSkill, maxSkill, ranking); + const auto result = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_BIGFISH, fishingSkill, maxSkill, FISHINGSIZETYPE_LARGE, false, ranking, &rod); + CHECK(result.failReason == reason); + CHECK(result.chance == chance); + } +} + +TEST_CASE("Fishing line snaps begin above rod durability and cap at fifty-five", "[fishing]") +{ + auto rod = rod_t{}; + rod.maxRank = 10; + + struct SnapCase + { + uint8 rank; + uint8 chance; + }; + + // Rank 24 is the first gap whose uncapped chance overflows uint8 + const SnapCase cases[] = { + { 10, 0 }, + { 11, 19 }, + { 12, 38 }, + { 13, 55 }, + { 24, 55 }, + }; + + for (const auto& [rank, chance] : cases) + { + CAPTURE(rank); + const auto result = fishingutils::CalculateSnapChance(FISHINGCATCHTYPE_SMALLFISH, 0, 10, FISHINGSIZETYPE_SMALL, false, rank, &rod); + CHECK(result.chance == chance); + if (rank == 10) + { + CHECK(result.failReason == FISHINGFAILTYPE_NONE); + } + else + { + CHECK(result.failReason == FISHINGFAILTYPE_LINESNAP); + } + } +} + +TEST_CASE("Fishing unbreakable rods cannot break on legendary oversized fish", "[fishing]") +{ + auto rod = rod_t{}; + + const auto result = fishingutils::CalculateBreakChance(FISHINGCATCHTYPE_BIGFISH, 0, 100, FISHINGSIZETYPE_LARGE, true, 100, &rod); + CHECK(result.failReason == FISHINGFAILTYPE_NONE); + CHECK(result.chance == 0); +} + +TEST_CASE("Fishing rod breaks begin above durability and cap at twenty", "[fishing]") +{ + auto rod = rod_t{}; + rod.breakable = true; + rod.maxRank = 10; + + const auto safe = fishingutils::CalculateBreakChance(FISHINGCATCHTYPE_SMALLFISH, 0, 10, FISHINGSIZETYPE_SMALL, false, 10, &rod); + CHECK(safe.failReason == FISHINGFAILTYPE_NONE); + CHECK(safe.chance == 0); + + const auto weak = fishingutils::CalculateBreakChance(FISHINGCATCHTYPE_SMALLFISH, 0, 10, FISHINGSIZETYPE_SMALL, false, 11, &rod); + CHECK(weak.failReason == FISHINGFAILTYPE_RODBREAK); + CHECK(weak.chance == 10); + + const auto capped = fishingutils::CalculateBreakChance(FISHINGCATCHTYPE_SMALLFISH, 0, 10, FISHINGSIZETYPE_SMALL, false, 100, &rod); + CHECK(capped.failReason == FISHINGFAILTYPE_RODBREAK); + CHECK(capped.chance == 20); + + // Rank 37 is the first gap whose uncapped chance overflows uint8 + const auto wide = fishingutils::CalculateBreakChance(FISHINGCATCHTYPE_SMALLFISH, 0, 10, FISHINGSIZETYPE_SMALL, false, 37, &rod); + CHECK(wide.failReason == FISHINGFAILTYPE_RODBREAK); + CHECK(wide.chance == 20); +} From de095fc3485cb92ac24c3158db26c5e74c2099bb Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Thu, 29 Oct 2026 09:55:26 -0400 Subject: [PATCH 13/17] Adjust fishing rod max ranks --- sql/fishing_rod.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sql/fishing_rod.sql b/sql/fishing_rod.sql index 2a974ca3f10..2cbc158e2de 100644 --- a/sql/fishing_rod.sql +++ b/sql/fishing_rod.sql @@ -58,18 +58,18 @@ LOCK TABLES `fishing_rod` WRITE; INSERT INTO `fishing_rod` VALUES (17011,'Ebisu Fishing Rod',1,0,4,1,30,100,50,50,30,10,2,1,1,0,3,0,0,0,1,15); INSERT INTO `fishing_rod` VALUES (17012,'Judges Rod',1,0,0,1,40,200,100,100,60,30,2,1,1,0,5,0,0,0,1,16); INSERT INTO `fishing_rod` VALUES (17013,'Goldfish Basket',0,0,8,1,5,100,0,50,20,0,0,0,0,0,0,0,0,0,0,0); -INSERT INTO `fishing_rod` VALUES (17014,'Hume Fishing Rod',0,0,2,1,10,125,0,65,30,0,2,1,0,2,3,1,1832,0,0,6); +INSERT INTO `fishing_rod` VALUES (17014,'Hume Fishing Rod',0,0,2,1,15,125,0,65,30,0,2,1,0,2,3,1,1832,0,0,6); INSERT INTO `fishing_rod` VALUES (17015,'Halcyon Rod',1,0,2,1,18,100,0,70,41,0,2,1,0,2,3,1,1833,0,0,9); INSERT INTO `fishing_rod` VALUES (17380,'Mithran Fishing Rod',0,1,1,8,18,130,0,65,30,0,0,0,1,0,3,1,483,0,0,12); INSERT INTO `fishing_rod` VALUES (17381,'Composite Fishing Rod',1,1,1,11,24,100,0,70,43,0,0,0,1,0,2,1,473,0,0,13); -INSERT INTO `fishing_rod` VALUES (17382,'Single Hook Fishing Rod',1,1,1,14,22,100,0,80,45,0,0,0,1,0,3,1,472,0,0,11); -INSERT INTO `fishing_rod` VALUES (17383,'Clothespole',0,1,1,12,16,170,0,50,30,0,0,0,1,0,3,1,482,0,0,10); +INSERT INTO `fishing_rod` VALUES (17382,'Single Hook Fishing Rod',1,1,1,14,13,100,0,80,45,0,0,0,1,0,3,1,472,0,0,11); +INSERT INTO `fishing_rod` VALUES (17383,'Clothespole',0,1,1,12,12,170,0,50,30,0,0,0,1,0,3,1,482,0,0,10); INSERT INTO `fishing_rod` VALUES (17384,'Carbon Fishing Rod',1,0,0,1,13,100,0,75,43,0,2,1,1,0,4,1,490,0,0,7); INSERT INTO `fishing_rod` VALUES (17385,'Glass Fiber Fishing Rod',1,0,0,1,12,100,0,80,45,0,2,1,1,0,4,1,491,0,0,8); INSERT INTO `fishing_rod` VALUES (17386,'Lu Shang\'s Fishing Rod',0,0,0,1,28,110,20,100,40,10,2,1,1,0,2,1,489,0,1,14); INSERT INTO `fishing_rod` VALUES (17387,'Tarutaru Fishing Rod',0,0,0,1,9,130,0,70,30,0,2,1,1,0,4,1,484,0,0,5); -INSERT INTO `fishing_rod` VALUES (17388,'Fastwater Fishing Rod',0,0,0,1,7,135,0,65,30,0,2,1,1,0,2,1,488,0,0,4); -INSERT INTO `fishing_rod` VALUES (17389,'Bamboo Fishing Rod',0,0,0,1,8,140,0,60,30,0,2,1,1,0,2,1,487,0,0,3); +INSERT INTO `fishing_rod` VALUES (17388,'Fastwater Fishing Rod',0,0,0,1,8,135,0,65,30,0,2,1,1,0,2,1,488,0,0,4); +INSERT INTO `fishing_rod` VALUES (17389,'Bamboo Fishing Rod',0,0,0,1,7,140,0,60,30,0,2,1,1,0,2,1,487,0,0,3); INSERT INTO `fishing_rod` VALUES (17390,'Yew Fishing Rod',0,0,0,1,6,145,0,55,30,0,2,1,1,0,2,1,486,0,0,2); INSERT INTO `fishing_rod` VALUES (17391,'Willow Fishing Rod',0,0,0,1,5,150,0,50,30,0,2,1,1,0,2,1,485,0,0,1); INSERT INTO `fishing_rod` VALUES (19319,'Maze Monger Fishing Rod',1,0,0,1,25,100,0,100,30,0,2,1,1,10,2,1,2526,1,0,0); From 72fd81283f31848b30b55aa3136fec21eacefa44 Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:09 -0400 Subject: [PATCH 14/17] Settle the fishing reel outcome when the fish bites --- src/map/utils/fishingutils.cpp | 61 +++++++----- src/test/tests/fishing_tests.cpp | 158 +++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+), 26 deletions(-) diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 483bdd94e27..83f984897be 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -868,44 +868,53 @@ auto CalculateFishSense(CCharEntity* PChar, fishresponse_t* response, uint8 fish lsbret_t lsnap = CalculateSnapChance(catchType, fishingSkill, maxSkill, sizeType, legendary, ranking, rod); lsbret_t rbreak = CalculateBreakChance(catchType, fishingSkill, maxSkill, sizeType, legendary, ranking, rod); - if (lose.chance > 0 && lsnap.chance == 0 && rbreak.chance == 0) + // Roll the outcome at the bite, in the same order ReelCheck checks them + const bool lost = xirand::GetRandomNumber(0, 100) < lose.chance; + const bool snapped = !lost && xirand::GetRandomNumber(0, 100) < lsnap.chance; + const bool broken = !lost && !snapped && xirand::GetRandomNumber(0, 100) < rbreak.chance; + const bool willLand = !lost && !snapped && !broken; + + // Warn of the rolled outcome, and sometimes falsely on a catch that will land + if (broken || (willLand && xirand::GetRandomNumber(0, 100) < rbreak.chance / 2)) { - if (lose.failReason == FISHINGFAILTYPE_LOST_TOOSMALL) - { - sense = FISHINGSENSETYPE_GOOD; - } - else - { - if (lose.chance < 20) - { - sense = FISHINGSENSETYPE_NOSKILL_FEELING + (uint8)xirand::GetRandomNumber(2); - } - else if (lose.chance < 45) - { - sense = FISHINGSENSETYPE_NOSKILL_SURE_FEELING; - } - else - { - sense = FISHINGSENSETYPE_NOSKILL_POSITIVEFEELING; - } - } + sense = FISHINGSENSETYPE_TERRIBLE; + } + else if (snapped || (willLand && xirand::GetRandomNumber(0, 100) < lsnap.chance / 2)) + { + sense = FISHINGSENSETYPE_BAD; } - else if (lsnap.chance > 0 || rbreak.chance > 0) + else if (lose.failReason == FISHINGFAILTYPE_LOST_LOWSKILL || lose.failReason == FISHINGFAILTYPE_LOST_TOOBIG) { - if (lsnap.chance < 30 && rbreak.chance < 30) + // Based on the loss chance itself, so it can show on a catch that lands + if (lose.chance < 20) { - sense = FISHINGSENSETYPE_BAD; + sense = FISHINGSENSETYPE_NOSKILL_FEELING + (uint8)xirand::GetRandomNumber(0, 2); } - else if (lsnap.chance < 45 && rbreak.chance < 45) + else if (lose.chance < 45) { - sense = FISHINGSENSETYPE_BAD + (uint8)xirand::GetRandomNumber(2); + sense = FISHINGSENSETYPE_NOSKILL_SURE_FEELING; } else { - sense = FISHINGSENSETYPE_TERRIBLE; + sense = FISHINGSENSETYPE_NOSKILL_POSITIVEFEELING; } } + // ReelCheck rolls against these again, so store the outcome as 100 or 0 + const auto asOutcome = [](const bool happened) -> uint8 + { + if (happened) + { + return 100; + } + + return 0; + }; + + lose.chance = asOutcome(lost); + lsnap.chance = asOutcome(snapped); + rbreak.chance = asOutcome(broken); + response->lose = lose; response->lsnap = lsnap; response->rbreak = rbreak; diff --git a/src/test/tests/fishing_tests.cpp b/src/test/tests/fishing_tests.cpp index 64a34232988..0f9c0a6f769 100644 --- a/src/test/tests/fishing_tests.cpp +++ b/src/test/tests/fishing_tests.cpp @@ -19,10 +19,14 @@ =========================================================================== */ +#include "common/xirand.h" #include "map/utils/fishingutils.h" #include +#include +#include + TEST_CASE("Fishing legendary attack bonuses also increase wrong-arrow healing", "[fishing]") { auto rod = rod_t{}; @@ -279,3 +283,157 @@ TEST_CASE("Fishing rod breaks begin above durability and cap at twenty", "[fishi CHECK(wide.failReason == FISHINGFAILTYPE_RODBREAK); CHECK(wide.chance == 20); } + +TEST_CASE("Fishing a Nebimonite from the Selbina ship warns without promising", "[fishing][simulation]") +{ + // Seeded so every run checks the same reels + xirand::rng().seed(1); + + // Stats from fishing_rod.sql and fishing_fish.sql, and Nebimonite is the only fish in zone 220 that takes Ball of Crayfish Paste + auto rod = rod_t{}; + rod.rodID = TARUTARU; + rod.sizeType = FISHINGSIZETYPE_SMALL; + rod.minRank = 1; + rod.maxRank = 9; + rod.breakable = true; + rod.legendary = false; + + constexpr uint8 fishLevel = 27; + constexpr uint8 fishRanking = 10; + constexpr int reels = 100000; + + for (const auto anglerSkill : { 0, 30 }) + { + CAPTURE(anglerSkill); + + const auto lose = fishingutils::CalculateLoseChance(FISHINGCATCHTYPE_SMALLFISH, anglerSkill, fishLevel, FISHINGSIZETYPE_SMALL, false, fishRanking, &rod); + const auto snap = fishingutils::CalculateSnapChance(FISHINGCATCHTYPE_SMALLFISH, anglerSkill, fishLevel, FISHINGSIZETYPE_SMALL, false, fishRanking, &rod); + const auto crack = fishingutils::CalculateBreakChance(FISHINGCATCHTYPE_SMALLFISH, anglerSkill, fishLevel, FISHINGSIZETYPE_SMALL, false, fishRanking, &rod); + + // Skill doesn't change the snap or break chance + CHECK(snap.chance == 19); + CHECK(crack.chance == 10); + + const double loseRate = lose.chance / 100.0; + const double snapRate = (1.0 - loseRate) * (snap.chance / 100.0); + const double crackRate = (1.0 - loseRate) * (1.0 - snap.chance / 100.0) * (crack.chance / 100.0); + const double landRate = 1.0 - loseRate - snapRate - crackRate; + + int good = 0; + int bad = 0; + int terrible = 0; + int doubt = 0; + + int goodLanded = 0; + int badSnapped = 0; + int terribleBroke = 0; + int doubtLost = 0; + + int landed = 0; + int snapped = 0; + int cracked = 0; + int lostSkill = 0; + int quietBreak = 0; + + for (int reel = 0; reel < reels; ++reel) + { + auto response = fishresponse_t{}; + + const auto sense = fishingutils::CalculateFishSense(nullptr, &response, anglerSkill, FISHINGCATCHTYPE_SMALLFISH, FISHINGSIZETYPE_SMALL, fishLevel, fishingutils::Legendary::No, 1, 1, fishRanking, &rod); + + auto* outcome = fishingutils::ReelCheck(nullptr, &response, &rod); + + if (sense == FISHINGSENSETYPE_TERRIBLE) + { + ++terrible; + if (outcome->rodbreak) + { + ++terribleBroke; + } + } + else if (sense == FISHINGSENSETYPE_BAD) + { + ++bad; + if (outcome->linebreak) + { + ++badSnapped; + } + } + else if (sense == FISHINGSENSETYPE_GOOD) + { + ++good; + if (outcome->caught) + { + ++goodLanded; + } + } + else + { + ++doubt; + if (outcome->failReason == FISHINGFAILTYPE_LOST_LOWSKILL) + { + ++doubtLost; + } + } + + // A good feeling can still lose a too-small fish, but never the line or rod + if ((outcome->linebreak || outcome->rodbreak) && sense == FISHINGSENSETYPE_GOOD) + { + ++quietBreak; + } + + if (outcome->caught) + { + ++landed; + } + else if (outcome->linebreak) + { + ++snapped; + } + else if (outcome->rodbreak) + { + ++cracked; + } + else + { + ++lostSkill; + } + + destroy(outcome); + } + + INFO("Nebimonite, Tarutaru Fishing Rod, skill " << anglerSkill << ", over " << reels << " reels" + << "\n rolled chances loss " << static_cast(lose.chance) + << ", snap " << static_cast(snap.chance) + << ", break " << static_cast(crack.chance) + << "\n good shown " << good << ", landed " << goodLanded + << "\n unsure shown " << doubt << ", lost to skill " << doubtLost + << "\n bad shown " << bad << ", line snapped " << badSnapped + << "\n terrible shown " << terrible << ", rod broke " << terribleBroke + << "\n outcomes landed " << landed << " (expected " << static_cast(landRate * reels) << ")" + << ", snapped " << snapped << " (" << static_cast(snapRate * reels) << ")" + << ", broke " << cracked << " (" << static_cast(crackRate * reels) << ")" + << ", lost to skill " << lostSkill << " (" << static_cast(loseRate * reels) << ")"); + + // Warnings come true most of the time but not always + CHECK(badSnapped * 100 > bad * 60); + CHECK(badSnapped * 100 < bad * 90); + CHECK(terribleBroke * 100 > terrible * 55); + CHECK(terribleBroke * 100 < terrible * 85); + + // Skill messages come from the loss chance, so they are wrong more often than right + if (lose.chance > 0) + { + CHECK(doubtLost * 100 < doubt * 40); + } + + CHECK(quietBreak == 0); + CHECK(terrible > reels / 100); + + // A 1% band is many standard deviations at 100000 reels, so these can't flake + CHECK(std::abs(landed - static_cast(landRate * reels)) < reels / 100); + CHECK(std::abs(snapped - static_cast(snapRate * reels)) < reels / 100); + CHECK(std::abs(cracked - static_cast(crackRate * reels)) < reels / 100); + CHECK(std::abs(lostSkill - static_cast(loseRate * reels)) < reels / 100); + } +} From 17675f45ec0d55d2969d9f356d5e922691512e46 Mon Sep 17 00:00:00 2001 From: Skold <113406182+Skold177@users.noreply.github.com> Date: Fri, 23 Oct 2026 12:26:05 -0400 Subject: [PATCH 15/17] Move quest fishing catches into the interaction framework --- .../interaction/interaction_global.lua | 4 ++ .../interaction/interaction_lookup.lua | 5 ++ ...COR_AF2_Navigating_the_Unfriendly_Seas.lua | 32 +++++++++++++ .../outlands/Secret_of_the_Damp_Scroll.lua | 19 ++++++++ scripts/quests/windurst/All_At_Sea.lua | 21 +++++++++ scripts/specs/types/Container.lua | 1 + scripts/tests/quests/fishing_catches.lua | 46 +++++++++++++++++++ sql/fishing_fish.sql | 2 +- sql/fishing_group.sql | 7 --- src/map/lua/luautils.cpp | 46 +++++++++++++++++++ src/map/lua/luautils.h | 1 + src/map/utils/fishingutils.cpp | 46 +++++++++++++------ tools/ci/sanity_checks/lua_binding_usage.py | 1 + 13 files changed, 208 insertions(+), 23 deletions(-) create mode 100644 scripts/tests/quests/fishing_catches.lua diff --git a/scripts/globals/interaction/interaction_global.lua b/scripts/globals/interaction/interaction_global.lua index f396addf438..b50340108d6 100644 --- a/scripts/globals/interaction/interaction_global.lua +++ b/scripts/globals/interaction/interaction_global.lua @@ -139,4 +139,8 @@ function InteractionGlobal.onEventUpdate(player, csid, option, npc, fallbackFn) return InteractionGlobal.lookup:onEventUpdate(player, csid, option, npc, fallbackFn) end +function InteractionGlobal.onFishingCheck(player, areaId) + return InteractionGlobal.lookup:onFishingCheck(player, areaId) +end + return InteractionGlobal diff --git a/scripts/globals/interaction/interaction_lookup.lua b/scripts/globals/interaction/interaction_lookup.lua index 9a97215760a..42fb8078248 100644 --- a/scripts/globals/interaction/interaction_lookup.lua +++ b/scripts/globals/interaction/interaction_lookup.lua @@ -95,6 +95,7 @@ local function addHandlers(secondLevel, lookupSecondLevel, checkFunc, container) 'onZoneIn', 'onZoneOut', 'afterZoneIn', + 'onFishingCheck', } for _, keyName in ipairs(wrappedDefinitions) do @@ -498,3 +499,7 @@ end function InteractionLookup:onEventUpdate(player, csid, option, npc, fallbackFn) return onHandler(self.data, 'onEventUpdate', csid, { player, csid, option, npc }, fallbackFn) end + +function InteractionLookup:onFishingCheck(player, areaId) + return runHandlersInData(self.data, player, 'onFishingCheck', 1, { player, areaId }) +end diff --git a/scripts/quests/ahtUrhgan/COR_AF2_Navigating_the_Unfriendly_Seas.lua b/scripts/quests/ahtUrhgan/COR_AF2_Navigating_the_Unfriendly_Seas.lua index 7ebac852d9a..137a0fbc61a 100644 --- a/scripts/quests/ahtUrhgan/COR_AF2_Navigating_the_Unfriendly_Seas.lua +++ b/scripts/quests/ahtUrhgan/COR_AF2_Navigating_the_Unfriendly_Seas.lua @@ -73,6 +73,10 @@ quest.sections = end, }, + onFishingCheck = function(player) + return { xi.item.HYDROGAUGE } + end, + onEventFinish = { [283] = function(player, csid, option, npc) @@ -137,6 +141,34 @@ quest.sections = end, }, }, + + [xi.zone.AL_ZAHBI] = + { + onFishingCheck = function(player) + return { xi.item.HYDROGAUGE } + end, + }, + + [xi.zone.AHT_URHGAN_WHITEGATE] = + { + onFishingCheck = function(player) + return { xi.item.HYDROGAUGE } + end, + }, + + [xi.zone.SILVER_SEA_ROUTE_TO_NASHMAU] = + { + onFishingCheck = function(player) + return { xi.item.HYDROGAUGE } + end, + }, + + [xi.zone.SILVER_SEA_ROUTE_TO_AL_ZAHBI] = + { + onFishingCheck = function(player) + return { xi.item.HYDROGAUGE } + end, + }, }, } diff --git a/scripts/quests/outlands/Secret_of_the_Damp_Scroll.lua b/scripts/quests/outlands/Secret_of_the_Damp_Scroll.lua index e1cbd14f6e6..95b148f926c 100644 --- a/scripts/quests/outlands/Secret_of_the_Damp_Scroll.lua +++ b/scripts/quests/outlands/Secret_of_the_Damp_Scroll.lua @@ -70,6 +70,25 @@ quest.sections = }, }, }, + + { + check = function(player, status, vars) + return status ~= xi.questStatus.QUEST_COMPLETED and + not player:hasItem(xi.item.DAMP_SCROLL) + end, + + [xi.zone.SEA_SERPENT_GROTTO] = + { + onFishingCheck = function(player, areaId) + -- It only bites in fishing area 2, the pond under the bridge + if areaId ~= 2 then + return {} + end + + return { xi.item.DAMP_SCROLL } + end, + }, + }, } return quest diff --git a/scripts/quests/windurst/All_At_Sea.lua b/scripts/quests/windurst/All_At_Sea.lua index ac8a3e2cc5b..4286c2f4d7a 100644 --- a/scripts/quests/windurst/All_At_Sea.lua +++ b/scripts/quests/windurst/All_At_Sea.lua @@ -17,6 +17,27 @@ quest.reward = quest.sections = { + { + check = function(player, status, vars) + return status ~= xi.questStatus.QUEST_COMPLETED and + not player:hasItem(xi.item.RIPPED_CAP) + end, + + [xi.zone.PORT_WINDURST] = + { + onFishingCheck = function(player) + return { xi.item.RIPPED_CAP } + end, + }, + + [xi.zone.KAZHAM] = + { + onFishingCheck = function(player) + return { xi.item.RIPPED_CAP } + end, + }, + }, + { check = function(player, status, vars) return status == xi.questStatus.QUEST_AVAILABLE and diff --git a/scripts/specs/types/Container.lua b/scripts/specs/types/Container.lua index 18301262d20..27c7d9f8a46 100644 --- a/scripts/specs/types/Container.lua +++ b/scripts/specs/types/Container.lua @@ -9,6 +9,7 @@ ---@field onEventFinish? onEventHandler ---@field onTriggerAreaEnter? onTriggerAreaHandler ---@field onTriggerAreaLeave? onTriggerAreaHandler +---@field onFishingCheck? fun(player: CBaseEntity, areaId: integer): integer[] ---@field [string]? EntitySection|TAction|fun(player: CBaseEntity, npc: CBaseEntity): TAction? ---@alias onZoneHandler fun(player: CBaseEntity): TAction? diff --git a/scripts/tests/quests/fishing_catches.lua b/scripts/tests/quests/fishing_catches.lua new file mode 100644 index 00000000000..89887425237 --- /dev/null +++ b/scripts/tests/quests/fishing_catches.lua @@ -0,0 +1,46 @@ +-- Zone-wide quest catches ignore the fishing area +local anyArea = 1 + +-- Flattens onFishingCheck answers the same way luautils::OnFishingCheck does +local function offeredCatches(player, areaId) + local catches = {} + for _, answer in ipairs(InteractionGlobal.onFishingCheck(player, areaId)) do + for _, catchId in ipairs(answer) do + catches[catchId] = true + end + end + + return catches +end + +describe('Quest fishing catches', function() + it('offers the Ripped Cap in Port Windurst until the angler holds one', function() + local player = xi.test.world:spawnPlayer({ zone = xi.zone.PORT_WINDURST }) + assert(offeredCatches(player, anyArea)[xi.item.RIPPED_CAP], 'Ripped Cap was not offered') + + player:addItem(xi.item.RIPPED_CAP) + assert(not offeredCatches(player, anyArea)[xi.item.RIPPED_CAP], 'Ripped Cap was offered to an angler holding one') + end) + + it('offers the Hydrogauge only while Navigating the Unfriendly Seas is accepted', function() + local player = xi.test.world:spawnPlayer({ zone = xi.zone.NASHMAU }) + assert(not offeredCatches(player, anyArea)[xi.item.HYDROGAUGE], 'Hydrogauge was offered before the quest') + + player:addQuest(xi.questLog.AHT_URHGAN, xi.quest.id.ahtUrhgan.NAVIGATING_THE_UNFRIENDLY_SEAS) + assert(offeredCatches(player, anyArea)[xi.item.HYDROGAUGE], 'Hydrogauge was not offered during the quest') + end) + + it('offers the Damp Scroll only in the pond under the bridge until Secret of the Damp Scroll is done', function() + local pond = 2 + local player = xi.test.world:spawnPlayer({ zone = xi.zone.SEA_SERPENT_GROTTO }) + assert(offeredCatches(player, pond)[xi.item.DAMP_SCROLL], 'Damp Scroll was not offered in the pond') + assert(not offeredCatches(player, 1)[xi.item.DAMP_SCROLL], 'Damp Scroll was offered outside the pond') + + player:addItem(xi.item.DAMP_SCROLL) + assert(not offeredCatches(player, pond)[xi.item.DAMP_SCROLL], 'Damp Scroll was offered to an angler holding one') + + player:delItem(xi.item.DAMP_SCROLL, 1) + player:completeQuest(xi.questLog.OUTLANDS, xi.quest.id.outlands.SECRET_OF_THE_DAMP_SCROLL) + assert(not offeredCatches(player, pond)[xi.item.DAMP_SCROLL], 'Damp Scroll was offered after the quest') + end) +end) diff --git a/sql/fishing_fish.sql b/sql/fishing_fish.sql index 2ccdd014950..bd188edb758 100644 --- a/sql/fishing_fish.sql +++ b/sql/fishing_fish.sql @@ -120,7 +120,7 @@ INSERT INTO `fishing_fish` VALUES (4480,'Gugru Tuna',41,16,6,13,40,120,22,1,1,25 INSERT INTO `fishing_fish` VALUES (5127,'Gugrusaurus',140,39,6,5,155,420,33,1,1,255,255,0,0,3,1,4,1,7,0,1,350,1977,'',0,0,1,0); INSERT INTO `fishing_fish` VALUES (5132,'Gurnard',26,13,11,9,1,1,5,0,0,255,255,0,0,6,4,3,0,0,0,1,550,0,'',0,0,0,0); INSERT INTO `fishing_fish` VALUES (5449,'Hamsi',9,21,11,6,1,1,10,0,0,255,255,0,1,7,1,6,0,0,0,3,1000,0,'',0,0,0,0); -INSERT INTO `fishing_fish` VALUES (2341,'Hydrogauge',7,25,13,2,1,1,1,0,0,6,25,0,0,0,0,0,0,0,1,1,1000,0,'',0,0,0,0); +INSERT INTO `fishing_fish` VALUES (2341,'Hydrogauge',7,25,13,2,1,1,1,0,0,6,25,0,0,0,0,0,0,0,1,1,1000,0,'',0,1,0,0); INSERT INTO `fishing_fish` VALUES (4470,'Icefish',49,38,11,7,1,1,14,0,0,255,255,0,0,3,1,3,0,0,0,3,900,0,'',0,0,0,0); INSERT INTO `fishing_fish` VALUES (5453,'Istakoz',46,35,4,3,1,1,14,0,0,255,255,0,0,3,1,3,0,0,0,1,1000,0,'',0,0,0,0); INSERT INTO `fishing_fish` VALUES (5136,'Istavrit',18,13,11,5,10,20,16,1,0,255,255,0,0,1,2,6,0,0,0,1,1000,0,'',0,0,0,0); diff --git a/sql/fishing_group.sql b/sql/fishing_group.sql index cf07d464a2b..f0663a9d44f 100644 --- a/sql/fishing_group.sql +++ b/sql/fishing_group.sql @@ -69,7 +69,6 @@ INSERT INTO `fishing_group` VALUES (3,14242,500); -- Rusty Subligar -- Port Windurst, Whole Zone -INSERT INTO `fishing_group` VALUES (4,591,1000); -- Ripped Cap INSERT INTO `fishing_group` VALUES (4,624,1000); -- Clump Of Pamtam Kelp INSERT INTO `fishing_group` VALUES (4,4360,1000); -- Bastore Sardine INSERT INTO `fishing_group` VALUES (4,4461,250); -- Bastore Bream @@ -1012,7 +1011,6 @@ INSERT INTO `fishing_group` VALUES (93,14242,500); -- Rusty Subligar -- Kazham, Whole Zone INSERT INTO `fishing_group` VALUES (94,90,900); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (94,591,1000); -- Ripped Cap INSERT INTO `fishing_group` VALUES (94,624,1000); -- Clump Of Pamtam Kelp INSERT INTO `fishing_group` VALUES (94,688,500); -- Arrowwood Log INSERT INTO `fishing_group` VALUES (94,4360,1000); -- Bastore Sardine @@ -1053,7 +1051,6 @@ INSERT INTO `fishing_group` VALUES (97,90,900); -- Rusty Bucket INSERT INTO `fishing_group` VALUES (97,624,1000); -- Clump Of Pamtam Kelp INSERT INTO `fishing_group` VALUES (97,887,200); -- Coral Fragment INSERT INTO `fishing_group` VALUES (97,1135,600); -- Norg Shell -INSERT INTO `fishing_group` VALUES (97,1210,1000); -- Damp Scroll INSERT INTO `fishing_group` VALUES (97,4304,450); -- Grimmonite INSERT INTO `fishing_group` VALUES (97,4360,1000); -- Bastore Sardine INSERT INTO `fishing_group` VALUES (97,4361,1000); -- Nebimonite @@ -1338,7 +1335,6 @@ INSERT INTO `fishing_group` VALUES (123,13456,300); -- Silver Ring -- Aht Urhgan Whitegate, Whole Zone -INSERT INTO `fishing_group` VALUES (124,2341,1000); -- Hydrogauge INSERT INTO `fishing_group` VALUES (124,5447,1000); -- Denizanasi INSERT INTO `fishing_group` VALUES (124,5448,850); -- Kalamar INSERT INTO `fishing_group` VALUES (124,5449,1000); -- Hamsi @@ -1347,7 +1343,6 @@ INSERT INTO `fishing_group` VALUES (124,14242,500); -- Rusty Subligar -- Al Zahbi, Whole Zone INSERT INTO `fishing_group` VALUES (125,90,900); -- Rusty Bucket -INSERT INTO `fishing_group` VALUES (125,2341,1000); -- Hydrogauge INSERT INTO `fishing_group` VALUES (125,4310,1000); -- Tiny Goldfish INSERT INTO `fishing_group` VALUES (125,4401,1000); -- Moat Carp INSERT INTO `fishing_group` VALUES (125,4472,1000); -- Crayfish @@ -1430,7 +1425,6 @@ INSERT INTO `fishing_group` VALUES (132,14117,500); -- Rusty Leggings -- Nashmau, Whole Zone -INSERT INTO `fishing_group` VALUES (133,2341,1000); -- Hydrogauge INSERT INTO `fishing_group` VALUES (133,5133,400); -- Pterygotus INSERT INTO `fishing_group` VALUES (133,5453,1000); -- Istakoz INSERT INTO `fishing_group` VALUES (133,5454,400); -- Mercanbaligi @@ -1497,7 +1491,6 @@ INSERT INTO `fishing_group` VALUES (137,14242,500); -- Rusty Subligar -- Silver Sea route to Nashmau, Whole Zone / Silver Sea route to Al Zahbi, Whole Zone -INSERT INTO `fishing_group` VALUES (138,2341,1000); -- Hydrogauge INSERT INTO `fishing_group` VALUES (138,5140,500); -- Kalkanbaligi INSERT INTO `fishing_group` VALUES (138,5448,850); -- Kalamar INSERT INTO `fishing_group` VALUES (138,5449,1000); -- Hamsi diff --git a/src/map/lua/luautils.cpp b/src/map/lua/luautils.cpp index 76edb8449c3..7bcbc90aa74 100644 --- a/src/map/lua/luautils.cpp +++ b/src/map/lua/luautils.cpp @@ -5116,6 +5116,52 @@ auto OnSteal(CBattleEntity* PChar, CBattleEntity* PMob, CAbility* PAbility, acti return 0; } +auto OnFishingCheck(CCharEntity* PChar, const uint8 areaId) -> std::vector +{ + TracyZoneScoped; + + std::vector catchIds; + + if (PChar == nullptr) + { + return catchIds; + } + + auto onFishingCheckFramework = lua["InteractionGlobal"]["onFishingCheck"]; + + auto result = onFishingCheckFramework(PChar, areaId); + if (!result.valid()) + { + sol::error err = result; + ShowError("luautils::onFishingCheck: %s", err.what()); + return catchIds; + } + + if (result.get_type(0) != sol::type::table) + { + return catchIds; + } + + // Each handler returns a list of catch ids, which may be empty + for (const auto& [key, answer] : result.get(0)) + { + if (answer.get_type() != sol::type::table) + { + continue; + } + + for (const auto& [index, catchId] : answer.as()) + { + if (catchId.get_type() == sol::type::number) + { + catchIds.emplace_back(catchId.as()); + } + } + } + + return catchIds; +} + auto OnCanUseSpell(CBattleEntity* PChar, CSpell* PSpell) -> bool // triggers when CanUseSpell is invoked on spell.cpp for PCs only { TracyZoneScoped; diff --git a/src/map/lua/luautils.h b/src/map/lua/luautils.h index 667cb3ba1c8..a6900f51f56 100644 --- a/src/map/lua/luautils.h +++ b/src/map/lua/luautils.h @@ -503,6 +503,7 @@ auto OnPetAbility(CBaseEntity* PTarget, CPetEntity* PPet, CPetSkill* PMobSkill, auto OnUseWeaponSkill(CBattleEntity* PUser, CBaseEntity* PMob, CWeaponSkill* wskill, uint16 tp, bool primary, action_t& action, CBattleEntity* taChar) -> std::tuple; // returns: damage, tphits landed, extra hits landed auto OnUseAbility(CBattleEntity* PUser, CBattleEntity* PTarget, CAbility* PAbility, action_t* action) -> int32; auto OnSteal(CBattleEntity* PChar, CBattleEntity* PTarget, CAbility* PAbility, action_t* action) -> int32; +auto OnFishingCheck(CCharEntity* PChar, uint8 areaId) -> std::vector; auto OnCanUseSpell(CBattleEntity* PChar, CSpell* Spell) -> bool; // triggers when CanUseSpell is invoked on spell.cpp for PCs only diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 83f984897be..811f21d5145 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -2229,21 +2229,37 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba if (item->quest_only || item->reqKeyItem == xi::KeyItem::None || charutils::hasKeyItem(PChar, item->reqKeyItem)) { // Key item okay uint16 hookChance = 100; - if (item->quest < 255 && item->log < 255) - { - if (charutils::getQuestStatus(PChar, item->log, item->quest) == QUEST_ACCEPTED) - { - ItemHookPool.insert(std::make_pair(item, 100)); - ItemPoolWeight += 1000; - } - } - else - { - float chanceMultiplier = (float)item->rarity / 1000.0f; - uint16 actualHookChance = (uint16)std::floor(hookChance * chanceMultiplier); - ItemHookChanceTotal += actualHookChance; - ItemHookPool.insert(std::make_pair(item, actualHookChance)); - } + + float chanceMultiplier = static_cast(item->rarity) / 1000.0f; + uint16 actualHookChance = static_cast(std::floor(hookChance * chanceMultiplier)); + ItemHookChanceTotal += actualHookChance; + ItemHookPool.insert(std::make_pair(item, actualHookChance)); + } + } + } + + for (const auto itemId : luautils::OnFishingCheck(PChar, area->areaId)) + { + auto* item = GetFish(itemId); + if (item == nullptr) + { + ShowWarningFmt("fishingutils: onFishingCheck returned item {} which is not in fishing_fish", itemId); + continue; + } + + if (item->quest_only) + { + if (ItemHookPool.insert(std::make_pair(item, 100)).second) + { + ItemPoolWeight += 1000; + } + } + else + { + const auto hookChance = static_cast(std::floor(100.0f * item->rarity / 1000.0f)); + if (ItemHookPool.insert(std::make_pair(item, hookChance)).second) + { + ItemHookChanceTotal += hookChance; } } } diff --git a/tools/ci/sanity_checks/lua_binding_usage.py b/tools/ci/sanity_checks/lua_binding_usage.py index 40bac501576..fc6e46bb6a9 100644 --- a/tools/ci/sanity_checks/lua_binding_usage.py +++ b/tools/ci/sanity_checks/lua_binding_usage.py @@ -70,6 +70,7 @@ def main(): function_names.append("onTrigger") function_names.append("onTrade") function_names.append("onSteal") + function_names.append("onFishingCheck") function_names.append("onMobDeath") function_names.append("onZoneIn") function_names.append("noAction") From 29abdbc56bfb3b2466c83f2102318f644fa5adfd Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Sat, 24 Oct 2026 00:41:56 -0400 Subject: [PATCH 16/17] Let Hook, Line, and Sinker anglers fish up the Qufim Kraken --- scripts/quests/jeuno/Hook_Line_and_Sinker.lua | 10 +++ scripts/tests/quests/fishing_catches.lua | 22 ++++++ scripts/zones/Qufim_Island/IDs.lua | 1 + sql/fishing_mob.sql | 2 + src/map/utils/fishingutils.cpp | 70 ++++++++++++------- 5 files changed, 78 insertions(+), 27 deletions(-) diff --git a/scripts/quests/jeuno/Hook_Line_and_Sinker.lua b/scripts/quests/jeuno/Hook_Line_and_Sinker.lua index c4bbb75735b..358cd5ca8f6 100644 --- a/scripts/quests/jeuno/Hook_Line_and_Sinker.lua +++ b/scripts/quests/jeuno/Hook_Line_and_Sinker.lua @@ -3,6 +3,8 @@ -- Omer, Lower Jeuno: !pos -89.43 0 -124.1 245 -- EGRET_FISHING_ROD: !additem 1726 ----------------------------------- +local qufimID = zones[xi.zone.QUFIM_ISLAND] +----------------------------------- local quest = Quest:new(xi.questLog.JEUNO, xi.quest.id.jeuno.HOOK_LINE_AND_SINKER) @@ -72,6 +74,14 @@ quest.sections = end, }, }, + + -- Since the 2004-12-09 update only anglers on this quest can fish up the Kraken that drops the rod + [xi.zone.QUFIM_ISLAND] = + { + onFishingCheck = function(player) + return qufimID.mob.KRAKEN_FISHED_NM + end, + }, }, } diff --git a/scripts/tests/quests/fishing_catches.lua b/scripts/tests/quests/fishing_catches.lua index 89887425237..aadbac67dd9 100644 --- a/scripts/tests/quests/fishing_catches.lua +++ b/scripts/tests/quests/fishing_catches.lua @@ -43,4 +43,26 @@ describe('Quest fishing catches', function() player:completeQuest(xi.questLog.OUTLANDS, xi.quest.id.outlands.SECRET_OF_THE_DAMP_SCROLL) assert(not offeredCatches(player, pond)[xi.item.DAMP_SCROLL], 'Damp Scroll was offered after the quest') end) + + it('offers both fished Krakens only while Hook, Line, and Sinker is accepted', function() + local qufimID = zones[xi.zone.QUFIM_ISLAND] + local player = xi.test.world:spawnPlayer({ zone = xi.zone.QUFIM_ISLAND }) + local krakens = qufimID.mob.KRAKEN_FISHED_NM + + assert(#krakens == 2, 'expected two fished Krakens in Qufim Island') + for _, krakenId in ipairs(krakens) do + assert(krakenId ~= qufimID.mob.KRAKEN_NM, 'the roaming Kraken was listed as a fished one') + assert(not offeredCatches(player, anyArea)[krakenId], 'a Kraken was offered before the quest') + end + + player:addQuest(xi.questLog.JEUNO, xi.quest.id.jeuno.HOOK_LINE_AND_SINKER) + for _, krakenId in ipairs(krakens) do + assert(offeredCatches(player, anyArea)[krakenId], 'a Kraken was not offered during the quest') + end + + player:completeQuest(xi.questLog.JEUNO, xi.quest.id.jeuno.HOOK_LINE_AND_SINKER) + for _, krakenId in ipairs(krakens) do + assert(not offeredCatches(player, anyArea)[krakenId], 'a Kraken was offered after the quest') + end + end) end) diff --git a/scripts/zones/Qufim_Island/IDs.lua b/scripts/zones/Qufim_Island/IDs.lua index 7a0870b6301..2ef27db9395 100644 --- a/scripts/zones/Qufim_Island/IDs.lua +++ b/scripts/zones/Qufim_Island/IDs.lua @@ -67,6 +67,7 @@ zones[xi.zone.QUFIM_ISLAND] = HOBGOBLIN_THIEF = GetFirstID('Hobgoblin_Thief'), HOBGOBLIN_WARRIOR = GetFirstID('Hobgoblin_Warrior'), HOBGOBLIN_WHITE_MAGE = GetFirstID('Hobgoblin_White_Mage'), + KRAKEN_FISHED_NM = { GetTableOfIDs('Kraken')[1], GetTableOfIDs('Kraken')[2] }, KRAKEN_NM = GetTableOfIDs('Kraken')[3], OPHIOTAURUS = GetFirstID('Ophiotaurus'), SLIPPERY_SUCKER = GetFirstID('Slippery_Sucker'), diff --git a/sql/fishing_mob.sql b/sql/fishing_mob.sql index 059a5293a7d..34c93e96c3c 100644 --- a/sql/fishing_mob.sql +++ b/sql/fishing_mob.sql @@ -258,6 +258,8 @@ INSERT INTO `fishing_mob` VALUES (17289221,'Razorjaw_Pugil',125,40,1,1,10,16,10, INSERT INTO `fishing_mob` VALUES (17293313,'Qufim_Pugil',126,10,1,1,10,16,10,15,255,255,0,0,0,1000,0,0,0,0,0,0,0); INSERT INTO `fishing_mob` VALUES (17293315,'Sea_Bishop',126,10,1,1,10,16,10,15,255,255,0,0,0,1000,0,0,0,0,0,0,0); INSERT INTO `fishing_mob` VALUES (17293316,'Vepar',126,10,1,1,10,16,10,15,255,255,0,0,0,1000,0,0,0,0,0,0,0); +INSERT INTO `fishing_mob` VALUES (17293317,'Kraken',126,10,1,1,10,16,10,15,3,71,1,0,0,1000,0,0,0,0,0,1,0); -- Capture needed +INSERT INTO `fishing_mob` VALUES (17293318,'Kraken',126,10,1,1,10,16,10,15,3,71,1,0,0,1000,0,0,0,0,0,1,0); -- Capture needed INSERT INTO `fishing_mob` VALUES (17350657,'Pugil',140,10,1,1,10,16,10,15,255,255,0,0,0,1000,0,0,0,0,0,0,0); INSERT INTO `fishing_mob` VALUES (17350658,'Pugil',140,10,1,1,10,16,10,15,255,255,0,0,0,1000,0,0,0,0,0,0,0); INSERT INTO `fishing_mob` VALUES (17350659,'Pug_Pugil',140,10,1,1,10,16,10,15,255,255,0,0,0,1000,0,0,0,0,0,0,0); diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index 811f21d5145..a74285ee0a0 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -1629,7 +1629,7 @@ auto CatchMonster(CCharEntity* PChar, uint32 MobID) -> int32 return 0; } - if (PMob->isAlive() || (mob->questOnly && PMob->GetLocalVar("catchable") == 0)) + if (PMob->isAlive()) { PChar->animation = xi::Animation::NewFishingStop; PChar->updatemask |= UPDATE_HP; @@ -2238,32 +2238,6 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba } } - for (const auto itemId : luautils::OnFishingCheck(PChar, area->areaId)) - { - auto* item = GetFish(itemId); - if (item == nullptr) - { - ShowWarningFmt("fishingutils: onFishingCheck returned item {} which is not in fishing_fish", itemId); - continue; - } - - if (item->quest_only) - { - if (ItemHookPool.insert(std::make_pair(item, 100)).second) - { - ItemPoolWeight += 1000; - } - } - else - { - const auto hookChance = static_cast(std::floor(100.0f * item->rarity / 1000.0f)); - if (ItemHookPool.insert(std::make_pair(item, hookChance)).second) - { - ItemHookChanceTotal += hookChance; - } - } - } - // Build Hookable Mob Pool if (!MobPool.empty()) { @@ -2317,6 +2291,48 @@ auto FishingCheck(CCharEntity* PChar, uint8 fishingSkill, rod_t* rod, bait_t* ba } } + // Catches offered by interaction framework quests, as fishing_fish item ids or fishing_mob mob ids + for (const auto catchId : luautils::OnFishingCheck(PChar, area->areaId)) + { + if (auto* mob = findFishMob(PChar->getZone(), catchId)) + { + // The quest decides when it bites, the fishing_mob row still decides the area and bait + auto* PMob = dynamic_cast(zoneutils::GetEntity(mob->mobId, TYPE_MOB)); + const bool inArea = mob->areaId == 0 || mob->areaId == area->areaId; + const bool onBait = mob->reqBaitId == 0 || mob->reqBaitId == bait->baitID || (mob->altBaitId > 0 && mob->altBaitId == bait->baitID); + + if (PMob != nullptr && PMob->GetLocalVar("hooked") == 0 && !PMob->isAlive() && inArea && onBait && MobHookPool.insert(std::make_pair(mob, 100)).second) + { + MobPoolWeight += 1000; + } + + continue; + } + + auto* item = GetFish(catchId); + if (item == nullptr) + { + ShowWarningFmt("fishingutils: onFishingCheck returned {} which is neither a fishing_fish catch nor a fishing_mob in this zone", catchId); + continue; + } + + if (item->quest_only) + { + if (ItemHookPool.insert(std::make_pair(item, 100)).second) + { + ItemPoolWeight += 1000; + } + } + else + { + const auto hookChance = static_cast(std::floor(100.0f * item->rarity / 1000.0f)); + if (ItemHookPool.insert(std::make_pair(item, hookChance)).second) + { + ItemHookChanceTotal += hookChance; + } + } + } + FishPoolWeight = (uint16)std::floor(FishPoolWeight * GetWeatherModifier(PChar)); if (area->difficulty > 0) From a2276d522cc57f11546720da58eeb67f660929d7 Mon Sep 17 00:00:00 2001 From: Frankie-hz <105882754+Frankie-hz@users.noreply.github.com> Date: Fri, 23 Oct 2026 11:07:10 -0400 Subject: [PATCH 17/17] Add fishing fatigue and a daily catch limit --- src/map/items.h | 4 + src/map/utils/fishingutils.cpp | 197 ++++++++++++++++++++++++++++++- src/map/utils/fishingutils.h | 4 + src/test/tests/fishing_tests.cpp | 70 +++++++++++ 4 files changed, 271 insertions(+), 4 deletions(-) diff --git a/src/map/items.h b/src/map/items.h index e6dbda52bde..a3b4545c219 100644 --- a/src/map/items.h +++ b/src/map/items.h @@ -120,11 +120,15 @@ enum ITEMID : uint16 AURORA_CRYSTAL = 4244, TWILIGHT_CRYSTAL = 4245, GYSAHL_GREENS = 4545, + GUGRUSAURUS = 5127, + LIK = 5129, COPY_OF_THE_BALLISTA_REDBOOK = 5300, PAGE_OF_THE_BALLISTA_WHITEBOOK = 5303, COPY_OF_THE_BRENNER_BLUEBOOK = 5323, PAGE_OF_THE_BRENNER_BLACKBOOK = 5326, GLOWING_LAMP = 5414, + MATSYA = 5468, + ABAIA = 5476, PYRE_CRYSTAL = 6506, FROST_CRYSTAL = 6507, VORTEX_CRYSTAL = 6508, diff --git a/src/map/utils/fishingutils.cpp b/src/map/utils/fishingutils.cpp index a74285ee0a0..a1c8f4c3f2f 100644 --- a/src/map/utils/fishingutils.cpp +++ b/src/map/utils/fishingutils.cpp @@ -85,6 +85,8 @@ std::map> FishingBaitAffinities; // namespace { +constexpr auto superLegendaryFish = std::array{ ITEMID::GUGRUSAURUS, ITEMID::LIK, ITEMID::MATSYA, ITEMID::ABAIA }; + auto findRod(const uint16 rodId) -> rod_t* { const auto it = FishingRods.find(rodId); @@ -135,8 +137,171 @@ auto findFishMob(const xi::ZoneId zoneId, const uint32 mobId) -> fishmob_t* return mobIt->second; } +// Fishing meters reset at JST midnight +void addFishingMeter(CCharEntity* PChar, const std::string& varName, const int32 amount) +{ + if (amount == 0) + { + return; + } + + PChar->setCharVar(varName, PChar->getCharVar(varName) + amount, luautils::JstMidnight()); +} + +// Must run before the rod can break, since the equipped rod sets the fatigue discount +void chargeFishing(CCharEntity* PChar, const int32 daily, const int32 fatigue) +{ + const auto* rod = PChar->getEquip(SLOT_RANGED); + + const auto owed = [&]() -> int32 + { + if (rod == nullptr) + { + return fatigue; + } + + return RodFatigue(rod->getID(), fatigue); + }(); + + addFishingMeter(PChar, "[Fish]DailyPoints", daily); + addFishingMeter(PChar, "[Fish]Fatigue", owed); +} + +// The 2006-04-18 update named coral fragment, rusty cap and rusty pick, and 97 gil is the cheapest of the three +auto itemFatigue(const fishresponse_t& hooked) -> int32 +{ + const auto* item = xi::items::lookup(static_cast(hooked.catchid)); + + if (item == nullptr || item->getBasePrice() == 0) + { + return 0; + } + + if (item->getBasePrice() >= 97) + { + return 400; + } + + return 25; +} + +void chargeCatch(CCharEntity* PChar) +{ + const auto& hooked = *PChar->hookedFish; + + if (hooked.catchtype == FISHINGCATCHTYPE_ITEM) + { + const auto fatigue = itemFatigue(hooked); + + if (fatigue > 0) + { + chargeFishing(PChar, 1, fatigue); + } + + return; + } + + chargeFishing(PChar, 1, CatchFatigue(GetFishingSkill(PChar), hooked)); +} + +// A loss adds fatigue but doesn't count toward the 200 daily catches +void chargeFailedCatch(CCharEntity* PChar) +{ + const auto isChargedCatch = [](const fishresponse_t& hooked) -> bool + { + return hooked.catchtype == FISHINGCATCHTYPE_SMALLFISH || hooked.catchtype == FISHINGCATCHTYPE_BIGFISH || hooked.catchtype == FISHINGCATCHTYPE_ITEM; + }; + + if (PChar->hookedFish == nullptr || !PChar->hookedFish->hooked || !isChargedCatch(*PChar->hookedFish)) + { + return; + } + + const auto& hooked = *PChar->hookedFish; + const auto skill = GetFishingSkill(PChar); + + if (hooked.catchtype == FISHINGCATCHTYPE_ITEM) + { + const auto fatigue = [&]() -> int32 + { + if (hooked.catchlevel >= skill + 40) + { + return 1000; + } + + return itemFatigue(hooked); + }(); + + if (fatigue > 0) + { + chargeFishing(PChar, 0, fatigue); + } + + return; + } + + chargeFishing(PChar, 0, FailedCatchFatigue(skill, hooked)); +} + } // namespace +auto RodFatigue(const uint16 rodId, const int32 fatigue) -> int32 +{ + if (rodId == EBISU || rodId == EBISU_1) + { + return fatigue * 85 / 100; + } + + if (rodId == LU_SHANG || rodId == LU_SHANG_1) + { + return fatigue * 95 / 100; + } + + return fatigue; +} + +auto CatchFatigue(const uint8 fishingSkill, const fishresponse_t& hooked) -> int32 +{ + const bool large = hooked.catchtype == FISHINGCATCHTYPE_BIGFISH; + + if (hooked.legendary) + { + if (std::ranges::contains(superLegendaryFish, hooked.catchid)) + { + return 780; + } + + return 140; + } + + if (hooked.catchlevel >= fishingSkill + 17) + { + if (large) + { + return 200; + } + + return 100; + } + + if (large) + { + return 50; + } + + return 25; +} + +auto FailedCatchFatigue(const uint8 fishingSkill, const fishresponse_t& hooked) -> int32 +{ + if (hooked.catchlevel >= fishingSkill + 40) + { + return 1000; + } + + return CatchFatigue(fishingSkill, hooked); +} + /************************************************************************ * * * CALCULATIONS * @@ -2060,7 +2225,7 @@ void ReelInCatch(CCharEntity* PChar) break; case FISHINGCATCHTYPE_ITEM: PChar->hookedFish->successtype = FISHINGSUCCESSTYPE_CATCHITEM; - CatchItem(PChar, PChar->hookedFish->catchid, PChar->hookedFish->count); + landed = CatchItem(PChar, PChar->hookedFish->catchid, PChar->hookedFish->count); break; case FISHINGCATCHTYPE_MOB: PChar->hookedFish->successtype = FISHINGSUCCESSTYPE_CATCHMOB; @@ -2072,8 +2237,12 @@ void ReelInCatch(CCharEntity* PChar) break; } - // No skillup for a fish that didn't reach the inventory - if (!landed && (PChar->hookedFish->catchtype == FISHINGCATCHTYPE_SMALLFISH || PChar->hookedFish->catchtype == FISHINGCATCHTYPE_BIGFISH)) + // No fatigue or skillup for a catch that didn't reach the inventory + if (landed) + { + chargeCatch(PChar); + } + else if (PChar->hookedFish->catchtype == FISHINGCATCHTYPE_SMALLFISH || PChar->hookedFish->catchtype == FISHINGCATCHTYPE_BIGFISH) { PChar->hookedFish->successtype = FISHINGSUCCESSTYPE_NONE; } @@ -2794,14 +2963,17 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, fishingarea_t* fishingArea = GetFishingArea(PChar); fishresponse_t* response = nullptr; + bool chartActive = false; if (PChar->getZone() == xi::ZoneId::ValkurmDunes && PChar->GetLocalVar("pChartActive") == 1) { fishingArea = findFishingArea(xi::ZoneId::ValkurmDunes, 2); + chartActive = true; } else if (PChar->getZone() == xi::ZoneId::BuburimuPeninsula && PChar->GetLocalVar("bChartActive") == 1) { fishingArea = findFishingArea(xi::ZoneId::BuburimuPeninsula, 2); + chartActive = true; } if (PChar->hookedFish != nullptr) @@ -2820,7 +2992,18 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, rod_t* FishingRod = findRod(Rod->getID()); bait_t* FishingBait = findBait(Bait->getID()); - if (FishingRod != nullptr && FishingBait != nullptr) + const auto mayBite = [PChar, chartActive]() -> bool + { + // A chart quest that already used its chart ignores the daily limits + if (chartActive) + { + return true; + } + + return PChar->getCharVar("[Fish]DailyPoints") < 200 && PChar->getCharVar("[Fish]Fatigue") < 20000; // Daily limits of 200 catches and 20000 fatigue + }; + + if (FishingRod != nullptr && FishingBait != nullptr && mayBite()) { uint8 fishingSkill = GetFishingSkill(PChar); response = FishingCheck(PChar, fishingSkill, FishingRod, FishingBait, fishingArea); @@ -2908,6 +3091,8 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, } else { + chargeFailedCatch(PChar); + if (response->linebreak) { BaitLoss(PChar, RemoveFly::Yes, SendUpdate::Yes); @@ -2936,6 +3121,7 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, // lose bait but keep lure PChar->animation = xi::Animation::NewFishingLineBreak; PChar->updatemask |= UPDATE_HP; + chargeFailedCatch(PChar); BaitLoss(PChar, RemoveFly::No, SendUpdate::Yes); PChar->pushPacket(PChar, MessageOffset + FISHMESSAGEOFFSET_LOST_LOWSKILL); @@ -2949,6 +3135,7 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, // message: "Your line breaks!" PChar->animation = xi::Animation::NewFishingLineBreak; PChar->updatemask |= UPDATE_HP; + chargeFailedCatch(PChar); BaitLoss(PChar, RemoveFly::Yes, SendUpdate::Yes); PChar->pushPacket(PChar, MessageOffset + FISHMESSAGEOFFSET_LINEBREAK); @@ -2964,6 +3151,7 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, PChar->updatemask |= UPDATE_HP; PChar->lastCastTime = 0; + // Giving up costs bait but no fatigue if (PChar->hookedFish && PChar->hookedFish->hooked && BaitLoss(PChar, RemoveFly::No, SendUpdate::Yes)) { PChar->pushPacket(PChar, MessageOffset + FISHMESSAGEOFFSET_GIVEUP_BAITLOSS); @@ -2980,6 +3168,7 @@ void FishingAction(CCharEntity* PChar, const GP_CLI_COMMAND_FISHING_2_MODE mode, // message: "You lost your catch!" PChar->animation = xi::Animation::NewFishingStop; PChar->updatemask |= UPDATE_HP; + chargeFailedCatch(PChar); BaitLoss(PChar, RemoveFly::No, SendUpdate::Yes); PChar->pushPacket(PChar, MessageOffset + FISHMESSAGEOFFSET_LOST); diff --git a/src/map/utils/fishingutils.h b/src/map/utils/fishingutils.h index f53251489b0..d9d0e17376d 100644 --- a/src/map/utils/fishingutils.h +++ b/src/map/utils/fishingutils.h @@ -884,6 +884,10 @@ using BigFish = xi::Flag; using CancelOnMobLoadFailBait = xi::Flag; using Lost = xi::Flag; +auto RodFatigue(uint16 rodId, int32 fatigue) -> int32; +auto CatchFatigue(uint8 fishingSkill, const fishresponse_t& hooked) -> int32; +auto FailedCatchFatigue(uint8 fishingSkill, const fishresponse_t& hooked) -> int32; + // Calculations auto GetMoonPhase() -> uint8; auto GetHookTime(CCharEntity* PChar) -> uint8; diff --git a/src/test/tests/fishing_tests.cpp b/src/test/tests/fishing_tests.cpp index 0f9c0a6f769..c850b46af75 100644 --- a/src/test/tests/fishing_tests.cpp +++ b/src/test/tests/fishing_tests.cpp @@ -437,3 +437,73 @@ TEST_CASE("Fishing a Nebimonite from the Selbina ship warns without promising", CHECK(std::abs(lostSkill - static_cast(loseRate * reels)) < reels / 100); } } + +TEST_CASE("Fishing fatigue for a landed fish follows size, level gap and legend", "[fishing][fatigue]") +{ + auto hooked = fishresponse_t{}; + + struct FatigueCase + { + uint8 catchtype; + uint8 catchlevel; + bool legendary; + uint32 catchid; + uint8 fishingSkill; + int32 fatigue; + }; + + // Four times the cost from 17 levels up. Legendary fish ignore size and skill. + const FatigueCase cases[] = { + { FISHINGCATCHTYPE_SMALLFISH, 30, false, 4401, 30, 25 }, + { FISHINGCATCHTYPE_BIGFISH, 30, false, 4401, 30, 50 }, + { FISHINGCATCHTYPE_SMALLFISH, 47, false, 4401, 30, 100 }, + { FISHINGCATCHTYPE_BIGFISH, 47, false, 4401, 30, 200 }, + { FISHINGCATCHTYPE_SMALLFISH, 46, false, 4401, 30, 25 }, + { FISHINGCATCHTYPE_BIGFISH, 90, true, 5455, 0, 140 }, + { FISHINGCATCHTYPE_BIGFISH, 90, true, 5127, 100, 780 }, + }; + + for (const auto& entry : cases) + { + CAPTURE(entry.catchtype, entry.catchlevel, entry.legendary, entry.catchid, entry.fishingSkill); + hooked.catchtype = entry.catchtype; + hooked.catchlevel = entry.catchlevel; + hooked.legendary = entry.legendary; + hooked.catchid = entry.catchid; + CHECK(fishingutils::CatchFatigue(entry.fishingSkill, hooked) == entry.fatigue); + } +} + +TEST_CASE("Fishing fatigue for a lost fish matches landing it until the fish was hopeless", "[fishing][fatigue]") +{ + auto hooked = fishresponse_t{}; + hooked.catchtype = FISHINGCATCHTYPE_BIGFISH; + + // 39 levels up costs the same as landing it, 40 and above is a flat 1000 + hooked.catchlevel = 69; + CHECK(fishingutils::FailedCatchFatigue(30, hooked) == fishingutils::CatchFatigue(30, hooked)); + CHECK(fishingutils::FailedCatchFatigue(30, hooked) == 200); + + hooked.catchlevel = 70; + CHECK(fishingutils::FailedCatchFatigue(30, hooked) == 1000); + + hooked.legendary = true; + hooked.catchid = 5127; + CHECK(fishingutils::FailedCatchFatigue(30, hooked) == 1000); + + hooked.catchlevel = 20; + CHECK(fishingutils::FailedCatchFatigue(30, hooked) == 780); +} + +TEST_CASE("Fishing fatigue relief belongs to the legendary rods alone", "[fishing][fatigue]") +{ + // Integer division rounds down, so 25 becomes 21 and 23 + CHECK(fishingutils::RodFatigue(EBISU, 100) == 85); + CHECK(fishingutils::RodFatigue(EBISU_1, 100) == 85); + CHECK(fishingutils::RodFatigue(LU_SHANG, 100) == 95); + CHECK(fishingutils::RodFatigue(LU_SHANG_1, 100) == 95); + CHECK(fishingutils::RodFatigue(EBISU, 25) == 21); + CHECK(fishingutils::RodFatigue(LU_SHANG, 25) == 23); + CHECK(fishingutils::RodFatigue(COMPOSITE, 100) == 100); + CHECK(fishingutils::RodFatigue(TARUTARU, 1000) == 1000); +}