Updated the xseries dependency version
## 1.7.0
**Refactor:**
> Introduced RootService as composition root with explicit startup/shutdown order
> Introduced PlayerContext system unifying 18 scattered state maps with lifecycle state machine
> Introduced EventBus domain event system decoupling MinigameManager cross-domain calls
> Extracted infrastructure services: VersionService, EconomyService, SeasonsService, NmsAdapter, MaterialResolver
> Split GameSession into FishSelector, FishMovementSimulator, MinigameRenderer, FishValueCalculator
> Split Cmd into SellCommandHandler, GiveCommandHandler, CompeteCommandHandler, ConfigCommandHandler, AdminCommandHandler
> Split Fish into ChargeProgressTracker, HookProjectile, BiteCheckScheduler, FishItemFactory, FishAnimationService, FishBroadcastService
> Split GUI into GUICommons, HookMaterialGUIHandler, FishDexGUIHandler, CompetitionGUIHandler
**Fix:**
> Fixed startup NPE caused by MessageManager not initialized before Config
> Fixed Compete init NPE caused by scheduler not injected before manager construction
> Fixed BukkitRunnable cancel throwing "Not scheduled yet" on scheduler fallback path
> Fixed all log language keys silently falling back to hardcoded defaults
> Fixed hardcoded log messages across the codebase
> Fixed GUI permission check log output in non-debug mode
**Improve:**
> Removed 9 empty dead code files causing cross-package name confusion
> Removed ~1000 lines of dead code from GUI
> Fixed XSeries rule violations in EntityBatchProcessor
> Cleaned duplicate imports
## 1.6.1
**Fix:**
> Fixed hook float task leaks on session end
> Fixed rod charge-speed and float-area-size having no gameplay effect
> Fixed lava and void minigame difficulty multipliers not applied
> Fixed off-hand bait never consumed, bait detection and fish record parsing dependent on lore text
> Fixed minigame fish selection ignoring water type pools
> Fixed non-sell GUI empty slots accepting items via shift-click
> Fixed sell GUI drag events blocked for all GUIs
> Fixed Cmd add command feedback using string concatenation instead of format placeholders
> Fixed i18n formatting characters hardcoded in fish lore and floating text
> Fixed rod template fallback hardcoded Chinese
> Fixed MySQL migration running SQLite-specific queries before dialect check
> Fixed Math.random() scattered across 10 locations in game logic
> Fixed Material enum direct usage violating cross-version rules
> Fixed pools.yml referencing fish not defined in fish.yml
> Fixed config comments incorrect or incomplete (charge-speed, escape)
> Removed dead code: getRankPrefix(), ~75 lines of lore text parsing, duplicate sell deposit, unused config values
**Add:**
> Added ChargeSessionData for per-session rod attribute storage
> Added cross-version NBT read helpers for bait and fish item identification
> Added 7 i18n keys for fish lore formatting and rod template
> Added Folia compatibility with dedicated kkfish-folia.jar build
**Optimize:**
> Optimized DB migration to use dialect-specific column detection
> Optimized bait detection and fish record parsing from lore iteration to single NBT reads
## 1.6.0
**Fix:**
> Fixed fish item lore showing raw rarity level (e.g. "epic:90") instead of configured display name (e.g. "史诗")
> Fixed 100% charge being treated as overcharge (throw power became 0)
> Fixed hook floating effect task never terminating, causing task leaks
> Fixed hook trajectory task not tracked, unable to cancel on session end
> Fixed Particle API incompatibility on 1.21+ (extra parameter type mismatch)
> Fixed dangerZone array out of bounds in minigame (index 10 on size-10 array)
> Fixed severe performance issue: rod name parsed every tick in minigame
> Fixed duplicate session check missing in 2/3-argument startMinigame
> Fixed OP privilege escalation without try-finally in GUIAction
> Fixed fish selling losing items when player inventory is full
> Fixed ClassCastException from database Number types in GUI stats
> Fixed MySQL incompatibility: INSERT OR REPLACE and AUTOINCREMENT syntax
> Fixed getConnection() returning null causing NullPointerException (19 call sites)
> Fixed sellAllFish not collecting fish UUIDs for database cleanup
> Fixed clearAllCache clearing all players' cache on any player quit
> Fixed isVoidLocation always returning false, void fishing completely broken
> Fixed cleanupAndAnnounce callable twice, causing duplicate rewards
> Fixed PointsOnlyCompetition giving 1.0 points for fish not in fishList
> Fixed reflection method lookup every tick (now cached as static field)
> Fixed cross-world distance() call throwing IllegalArgumentException
> Fixed fishLevel.split NPE when fishLevel is null
> Fixed hookMaterial.toLowerCase NPE when database returns null
> Fixed isHookPassableBlock using hardcoded strings instead of Set lookup
> Fixed shared StringBuilder/Vector/Location instance fields causing thread safety issues
> Fixed new Random() created frequently instead of reusing instance field
> Fixed charge tick sound never playing due to millisecond precision mismatch
> Fixed checkAndConsumeBait setting null instead of AIR for empty offhand
> Fixed fishSize/maxSize division by zero when maxSize is 0
> Fixed rare fish getting double bonus (10% forced + rareFishBonus)
> Fixed invincibility period only increasing progress, never decreasing
> Fixed minigame run() without exception protection, leaving zombie sessions
> Fixed displayGameUI dead code with identical if-else branches
> Fixed player offline not handled during minigame, causing exceptions
> Fixed getRodNameByPlayer returning null instead of default "wood"
> Fixed duplicate actualFishValue declaration in inner class
> Fixed HashMap concurrency issues in GUI (6 maps changed to ConcurrentHashMap)
> Fixed GUIType.valueOf() throwing uncaught IllegalArgumentException
> Fixed direct Material enum usage in GUI violating XSeries rules (14 places)
> Fixed itemsPerPage inconsistency between GUI methods (36 vs 28)
> Fixed sellFishItem using unnecessary reflection for PDC access
> Fixed sellFishItem returning 1 for item rewards without depositing Vault value
> Fixed displayNameToHookNameMap not updating on config reload
> Fixed e.printStackTrace() violating logging rules
> Fixed onInventoryClose clearing search keywords for all GUI types
> Fixed SlotMapping getBorderSlotCount wrong calculation for 27-slot GUI
> Fixed RewardPreview isItemDisplaySlot range too small (27 instead of 54)
> Fixed GUI_SIZE_6 = 6 not being a valid inventory size (changed to 54)
> Fixed SQL injection risk from columnName concatenation (added whitelist)
> Fixed logFishing/updatePlayerStats using connection field instead of getConnection()
> Fixed cache returning mutable list reference allowing external pollution
> Fixed cache cleanup running every write instead of every 100 writes
> Fixed updatePlayerStats using two database round trips instead of one
> Fixed getConfigurationSection() NPE in Config (5 places)
> Fixed non-debug AuraSkills log output in production
> Fixed Double.parseDouble without exception handling
> Fixed isDebugMode/setDebugMode config path inconsistency
> Fixed dead code in ensureFishAnimationSubConfigs
> Fixed duplicated fish filtering logic in getAvailableFish/getAvailableFishFromPool
> Fixed Material.FISHING_ROD direct enum usage in Config
> Fixed parseMaterial returning null without warning in ItemValue
> Fixed Y-axis movement not restricted during fishing
> Fixed durability calculation overflow when maxSingleLoss < baseLoss
> Fixed getRodCurrentDurability missing rodType null check
> Fixed hook Y velocity unlimited descent in water mechanic
> Fixed lava mechanic missing Y<=0 boundary check
> Fixed lava/void hook messages using wrong language key (hook_in_water)
> Fixed hasEquipmentEffect based on Lore text matching, exploitable by players
> Fixed Compete shared mutable StringBuilder/ArrayList fields
> Fixed Compete containsKey+put TOCTOU race condition
> Fixed scheduleRecurring array index out of bounds on malformed config
> Fixed competition notification tasks not tracked, can't be cancelled
> Fixed scheduledTasks memory leak (completed tasks never removed)
> Fixed CompetitionData non-atomic operations on counters
> Fixed AmountCompetition/SingleValueCompetition/TotalValueCompetition not checking fishList filter
> Fixed PointsOnlyCompetition value double-counting in point calculation
> Fixed BarColor/BarStyle parse errors silently swallowed without warning
> Fixed hardcoded Chinese string in Cmd instead of MessageManager
> Fixed getFishValueFromItem querying database every call without cache
> Fixed getItemValue() null check missing in Cmd
> Fixed sellAllFish item rewards given multiple times for stacked items
> Fixed setFishUUIDString using unnecessary reflection for PDC
> Fixed Material.matchMaterial() in Cmd violating XSeries rules
> Fixed addGlowEffect empty method and dead guiCache code removed
**Add:**
> Added fishList filter check to AmountCompetition, SingleValueCompetition, TotalValueCompetition
> Added clearPlayerCache method to DB for single-player cache clearing
> Added hook_in_lava and hook_in_void language keys
> Added competition_invalid_duration language key
> Added CompetitionUtils.formatDuration shared utility
> Added columnName whitelist validation in DB
> Added fishValueCache in Cmd for database query optimization
## 1.5.1
**Fix:**
> Fixed fish broadcast displaying config base value instead of actual calculated value
> Fixed fish broadcast value not matching item displayed value (random fluctuation seed mismatch)
> Fixed hook GUI purchase doing nothing on click
> Fixed hook GUI showing purchase price for players who already have permission
> Fixed hook ID resolution failing after pagination
**Add:**
> Added i18n keys for hook purchase feedback
## 1.5.0
**Add:**
> Added lava and void fishing with strategy pattern, including new config sections `lava-fishing.*`, `void-fishing.*`, `styles.*` and independent `pools.yml`
> Added auto-complete feature for missing config defaults (broadcast, fish-animation, pools)
**Fix:**
> Fixed double event registration causing every Fishing handler to fire twice
> Fixed `checkRodDurability` always returned true (broken rods could still start charging)
> Fixed fragile string comparison `Action.name().contains("RIGHT_CLICK")` replaced with enum equality
> Fixed rod durability precision loss by storing remaining durability in PDC
> Fixed `levelName.contains("")` always true causing incorrect rarity display in broadcasts
> Fixed duplicate 16-entry block blacklist extracted to shared method
> Fixed EntityBatchProcessor never flushed (added 20-tick timer)
> Fixed empty catch blocks (particle spawn failures now logged)
> Fixed entity right-click swallowed mini-game green bar clicks — added `PlayerInteractEntityEvent` handler
> Removed unused `PlayerChatEvent` import
**Change:**
> Removed dead config nodes (13 entries), 6 unimplemented sound sections, 3 dead getters
> Aligned 14 code defaults with config.yml (trigger-mode, seasonal.enabled, increase-speed, etc.)
Add:
> Added commands to switch between vanilla fishing and plugin fishing(It can be configured whether the original fishing is able to catch custom items or just the original ones.The prerequisite for switching is that the current world is on the whitelist)
> Added automatic language file completion feature, which will use English as the template to fill in missing language keys (automatically runs language completion when the plugin starts and reloads)
Tip:
in message config add
fish_caught_broadcast: "§b[Fishing] %player% caught a %size% %rarity% fish %fish%, worth %value%!
Fix
> More hard-coded changes were made.
Tip
> It is recommended to regenerate the following configuration files as their content has been updated:
- competition_category.yml (under GUI configuration directory)
- reward_preview.yml (under GUI configuration directory)
- All language configuration files
Fix
> Resolved the issue of hard-coded Chinese text that could not be localized (e.g., "Durability" and rare fish catch chat notifications)
Add
> Added a global toggle for the economy system: when set to false, all KKfish-related buying and selling functions will be disabled
> Added individual enable/disable switches for competitions: you can now turn off specific competitions independently (e.g., the enabled: true/false parameter in weekly_amount_competition and other competition configurations)
Fix:
> Fix cant sell bug
> Fix cant load nbtapi bug
> Fix konw bug
Fix:
> Fix know bug
Add:
> Added nbt-api to handle NBT content
Change:
> Java 11 to Java 8 now you can use kkfish in catserver....and more java8 server core
Fix
> fix hook cant sel bug
> fix gui placeholder cant edit bug
Fix
>Fixed the bug where the historical maximum volume in the codex always showed 0.0
>Fixed a bug where successfully catching a fish would still show it as escaped.
Fix
> Optimized the logic for fish value calculation
> Fixed the bug where some configurations were missing in the default config
> Fixed the UUID detection bug for sell
Add
> Added support for more versions. Theoretical: 1.12-latest, Tested: 1.12, 1.21
Fix
> Fixed a bug where some configurations were missing in English
Add
> Add bstat
Fix
>Fixed the bug where durability displayed in the lore was not being deducted
>Fixed the bug where the wrong fishing rod's durability was deducted if the player switched items during durability settlement
Add
>Separated the sound configuration into an independent file
add gui file
now you can edit all kkfish's gui
and Fixed known issues and redesigned the GUI
Rewrote the configuration files: config and language files(It is recommended to back up the configuration and then delete and regenerate it.)
Fixed the bug where fish could not restore their hunger
Fixed a bug where fish in the fish encyclopedia would not carry NBT with custom-model-data, causing those with other textures to appear as normal vanilla fish.
Fixed a bug where '&' in fish descriptions would not convert correctly.
Added the command /kf unlock, allowing admins to directly unlock specified or all fish encyclopedia entries.
[1.1.3] - 2026-01-20
修复
- 修复rod.yml缺少模板配置的bug
- 修复通过工作台合成出来的鱼竿不使用配置模板的bug
- 优化自定义模型数据设置逻辑,只有当值不等于-1时才设置
Fixed a bug where using bait would prevent hooking.
||kkfish 1.1.1 |Fixed the bug where fish could not be sold |Removed the restriction that prevents fishing when y < 0 |Added the ability to customize logs in the language file |Optimized the update checking experience |Added "!" prompt similar to Stardew Valley (After charging is successful, the minigame will no longer start automatically. Instead, a sound effect and a floating "!" will appear only when a fish is about to bite. Players must right-click or sneak to enter the minigame. The "!" will disappear after n seconds (configurable in the config file, default 2 seconds), after which right-clicking or sneaking will have no effect) |Added a floating text "Got one!" that appears when you right-click or sneak during the "!" event. Both this text and the "!" can be customized via the language file |Rewrote the config file to make it more intuitive and less cluttered, adding detailed comments for all customizable options
1.0.9.1
优化了鱼动画实体卡顿bug
修复有了自定义模板后所有鱼都不能出售的bug (改成根据uuid记录价格,如果卖了就清除记录)
增加了钓鱼的难度
1.0.9.1
优化了鱼动画实体卡顿bug
修复有了自定义模板后所有鱼都不能出售的bug (改成根据uuid记录价格,如果卖了就清除记录)
增加了钓鱼的难度
1.0.8.1以下更新至1.0.9以上需要给fish.yml的每一条鱼尾部添加 template:
不然会只显示一个uuid
1.0.9updata - 大修复版本
原语言太广,导致制作时期需要修改很多,所以将语言改成只有zh_cn,en_us,其余语言就需要社区帮助了
调整了钓鱼成功后获得鱼的随机逻辑(原版为平等随机,现在为:
- 为每种鱼根据稀有度分配权重
- 实现加权随机选择算法
添加了可自定义的物品简介
修改了钓鱼成功后的动画,让其更符合星露谷的样子(ps:其实是不小心删了,没备份,解包后改不明白,只好重写了)
修复了如果在y大于水面的时候钓鱼成功后的鱼动画会钓到脚下而不是头上
修复了测试时期的鱼竿强制附魔代码未删除的bug
修复了一些debug在非debug模式也会显示的bug
修复有部分gui的物品没有在语言文件导致英文情况下会有中文的bug
修复hookgui的上一页和点击刷新都始终是中文(没有对应的语言键位)
修复鱼钩简介状态,图鉴gui里的物品简介,比赛gui的比赛奖励gui的“玩家”在语言文件中没有对应语言键名的bug
修复plugin.yml缩进问题
修复检测更新的url没有更换问题
修改了更新提示的文本(en)
修复plugin.yml缩进问题
修复检测更新的url没有更换问题
修复了默认配置缺少部分配置的bug
修复了之前的废弃功能未删除的问题
1.修复比赛价值是读取配置而非实际的bug
2.添加自定义进度条
添加功能:将建造出来的鱼竿替换成配置文件配置的初始鱼竿
优化:动态鱼动画向玩家力
添加:将建造出来的鱼竿替换成配置文件配置的初始鱼竿
优化:动态鱼动画向玩家力
更新日志:
修复了任何带有custom_model_data的物品都被误识别为鱼竿的bug
1.0.7不再付费,插件改为免费插件!
updata:
添加了各种粒子特效和音效的美化 添加了钓上鱼后的小动画
支持自定义鱼钩了((
修复了有部分gui物品的简介或者名字会有前缀的bug
修复了没有auraskill也会加载相关功能导致count load的bug
1.0.6 Updata
- 1.修复了季节获取失败的bug
- 2.修复了更新获取显示的却是当前版本的bug
- 3.修复了鱼钩数据库失效的bug
- 4.添加了/kf add fish\rods\baits name 将当前手上的物品添加到配置(包括nbt)的功能,变相支持itemsadder等自定义材质\模型插件
1.0.5 Update:
- 1. Added a competition module. Free players can enjoy up to 5 custom competitions, while paid users have no limits.
- 2. Optimized the GUI.
- 3. Free version restrictions changed to: 20 fish, 10 fishing rods, 10 baits, 5 competitions.
Fixed known issues.