Tags
Creators
Details
1.6.1-1.19.2
Compatibility
Required content
Changes
TinkersSearch-1.6.1
🆕 新增 / Added
-
全新统一动画系统:全局单例
AnimationManager+RenderTickEvent驱动,提供缓动枚举、ARGB 插值、触发型Animation、持久型Animator四层基础设施 -
面板滑入滑出动画迁移到统一动画系统,缓动
EASE_OUT_CUBIC,动画中途反向从当前 offset 平滑过渡 -
部件展开 / 收起动画:展开时尺寸先到位再淡入内容;收起时内容先淡出再收缩卡片,方向反转无跳变
-
部件邻居卡片位置平滑动画:展开 / 收起时其余卡片以 90ms 时间常数平滑让位,点击跟随动画中的视觉位置
-
详情页窗口开关动画:打开时 0.92 → 1.0 缩放 + 遮罩淡入;关闭时 1.0 → 0.96 缩放 + 遮罩淡出,完成后才切换屏幕
-
详情页翻页动画:点击
◀ / ▶或键盘← / →时,卡片网格先淡出滑出 40px,数据切换后从另一侧滑入淡入,标题、翻页按钮、页脚纹丝不动 -
触发型反馈动画:左键点击卡片缩放脉冲、点击收藏星标缩放脉冲、点击刷新按钮缩放脉冲,均带过冲缓动
-
持久型过渡动画:Tab hover 背景色过渡、Tab 指示器平滑滑动、卡片 hover 背景 / 边框过渡、刷新按钮 hover 颜色过渡、搜索框 focus 边框变亮、滚动条 thumb 位置平滑跟随(拖拽时立即跟随)
-
面板卡片图标延迟淡入淡出:面板滑入到 80% 位置时图标才开始淡入;面板刚开始滑出图标就淡出
-
详情页部件标题行显示浇筑模式标签:单页材料显示
[直接浇筑],复合页显示[浇筑于: 材料名],材料名跟随游戏语言动态本地化 -
1.19.2 完整移植:动画模块 + 详情页 + 面板层,全部重写适配
Component.literal/ForgeRegistries.FLUIDS.getKey()/GuiGraphics前的 API -
1.20.1 完整移植:
GuiGraphics全面替换PoseStack,renderWidget/updateWidgetNarration适配,AbstractWidget自有 x/y/width/height 字段 -
Brand-new unified animation system: global
AnimationManagersingleton driven byRenderTickEvent, with four-layer infrastructure — easing enum, ARGB interpolation, trigger-typeAnimation, persistentAnimator -
Panel slide in/out migrated to the unified animation system,
EASE_OUT_CUBICeasing, mid-animation reversal smoothly interpolates from the current offset -
Part card expand / collapse animation: expand grows size first then fades in content; collapse fades out content first then shrinks the card, no jump on direction reversal
-
Neighbor part card position smoothing: surrounding cards smoothly yield with a 90ms time constant, clicks follow the animated visual position
-
Detail window open/close animation: opens with 0.92 → 1.0 scale + mask fade-in; closes with 1.0 → 0.96 scale + mask fade-out, screen swap happens only after completion
-
Detail screen page-turn animation: clicking
◀ / ▶or pressing← / →fades + slides the card grid out by 40px, swaps data, then slides + fades the new page in from the opposite side — title, page buttons, and footer stay put -
Trigger-type feedback animations: card click pulse, favorite star pulse, refresh button pulse, all with overshoot easing
-
Persistent transition animations: Tab hover background, Tab indicator slide, card hover background / border, refresh button hover color, search box focus border, scrollbar thumb position (immediate while dragging, smooth otherwise)
-
Panel card icon delayed fade: icons only fade in once panel slide is at 80%; icons fade out immediately when panel starts sliding out
-
Detail screen part title row now shows the casting mode: single-page materials show
[Direct Casting], composite pages show[Cast onto: material], with the material name dynamically localized to the current language -
Full 1.19.2 port: animation module + detail screen + panel layer, all rewritten for
Component.literal/ForgeRegistries.FLUIDS.getKey()/ pre-GuiGraphicsAPI -
Full 1.20.1 port:
GuiGraphicsfully replacesPoseStack,renderWidget/updateWidgetNarrationadapted,AbstractWidgetuses its own x/y/width/height fields
🔄 变更 / Changed
-
面板滑入滑出动画状态外置:
PanelAnimationManager不再自持offset/targetOffset/animationStartTime/isAnimating,全部由AnimationManager的"panel.slide"动画 key 持有;对外接口保持不变 -
详情页部件收起流程重排:原来卡片立即缩小 + 内容立即消失,现改为先内容淡出(80ms)→ 卡片再收缩(180ms),节奏更清晰
-
详情页翻页仅作用于卡片网格:标题、翻页按钮、页脚不参与滑动,只有卡片网格先淡出滑出 → 数据切换 → 滑入淡入
-
窗口开关动画不做 alpha 合成:只做缩放 + 全屏遮罩 alpha,避免污染全局 GL 状态导致 tooltip 被"蒙层"覆盖
-
图标淡入淡出改为单曲线:
progress < 0.8时 alpha = 0,0.8 ≤ progress ≤ 1.0时线性到 1,同时表达"打开晚出现、关闭早消失" -
动画节奏整体加速:
EXPAND_DURATION250ms → 180ms,CONTENT_FADE_DURATION150ms → 80ms,PART_POS_TAU140ms → 90ms -
动画 key 命名约定化:
<模块>.<类型>[:<身份>],例如panel.slide/panel.card.hover:<fluidId>/detail.part.expand:<key>/detail.page.turn,便于按前缀批量清理 -
Panel slide animation state externalized:
PanelAnimationManagerno longer holdsoffset/targetOffset/animationStartTime/isAnimating; all of it lives in the"panel.slide"animation key insideAnimationManager; public API is unchanged -
Detail part collapse reordered: previously card shrank + content vanished at once; now content fades out first (80ms) → card shrinks after (180ms) for clearer pacing
-
Detail page turn only affects the card grid: title, page buttons, and footer do not slide — only the card grid fades + slides out, data is swapped, then slides + fades in
-
Window open/close no longer does alpha blending: only scale + full-screen mask alpha, avoiding pollution of global GL state that caused the "veil" over tooltips
-
Icon fade switched to a single curve: alpha = 0 while
progress < 0.8, linearly to 1 while0.8 ≤ progress ≤ 1.0, capturing both "late on open, early on close" -
Overall animation timing sped up:
EXPAND_DURATION250ms → 180ms,CONTENT_FADE_DURATION150ms → 80ms,PART_POS_TAU140ms → 90ms -
Animation key naming convention:
<module>.<type>[:<id>], e.g.panel.slide/panel.card.hover:<fluidId>/detail.part.expand:<key>/detail.page.turn, enabling prefix-based bulk cleanup
🐛 修复 / Fixed
-
修复面板关闭动画不播放:
startHideAnimation在读取当前 offset 之前就修改了targetVisible,导致动画起点与终点重合 -
修复面板渲染位置与命中检测不一致:
PanelRenderer在panel.getPanelX()之上再次叠加animationOffset,视觉位置是鼠标命中位置的两倍 -
修复面板关闭时滑出动画被立即杀死:
handleSmelteryClose改为调用forceHideImmediate(),不再启动随后被清空的滑出动画 -
修复详情页 tooltip 被"蒙层"覆盖:窗口内容不再修改全局
setShaderColor,改用缩放 + 颜色 alpha,tooltip 与窗口内容彻底分离 -
修复部件展开动画中途反向跳变:旧实现总从端点重新起播,新实现从当前插值位置起播
-
修复部件淡出 / 收缩过程中卡片溢出原槽位:布局尺寸由"视觉展开态"决定,淡出和收缩阶段保持扩展布局
-
修复
IMaterial.getDisplayName()在 1.19+ 被移除导致编译失败:材料名改为直接构造material.<ns>.<path>翻译键交给Component.translatable()解析,与流体卡片走同一套本地化机制 -
修复 1.19.2
Fluid#getRegistryName()被移除:统一替换为ForgeRegistries.FLUIDS.getKey(fluid) -
修复 1.19.2
TextComponent/TranslatableComponent弃用:统一替换为Component.literal/Component.translatable -
修复 1.20.1
AbstractWidget父类 x/y/width/height 变为私有:FloatingSearchPanel改为自有字段 + 独立 getter -
修复 1.20.1
renderButton被renderWidget取代:FloatingSearchPanel覆写renderWidget -
修复 1.20.1
updateNarration被updateWidgetNarration取代:同样覆写替换 -
Fixed panel close animation not playing:
startHideAnimationmutatedtargetVisiblebefore reading the current offset, making the animation start and end coincide -
Fixed panel render position mismatching hit detection:
PanelRendereraddedanimationOffseton top ofpanel.getPanelX(), making the visual position move at twice the mouse hit position -
Fixed slide-out animation being killed immediately on smeltery close:
handleSmelteryClosenow callsforceHideImmediate(), no longer spawning a slide-out that is subsequently cleared -
Fixed detail tooltip being covered by a "veil": window content no longer modifies global
setShaderColor, using scale + color alpha instead, fully separating tooltip from window content -
Fixed part expand animation jumping on mid-flight reversal: old implementation always restarted from an endpoint; new one restarts from the current interpolated value
-
Fixed part cards overflowing their slot during fade-out / shrink: layout size determined by "visual expanded state", keeping the expanded layout through fade-out and shrink
-
Fixed
IMaterial.getDisplayName()removal in 1.19+: material name now constructed directly as thematerial.<ns>.<path>translation key fed toComponent.translatable(), sharing the same localization path as fluid cards -
Fixed
Fluid#getRegistryName()removal in 1.19.2: uniformly replaced withForgeRegistries.FLUIDS.getKey(fluid) -
Fixed
TextComponent/TranslatableComponentdeprecation in 1.19.2: uniformly replaced withComponent.literal/Component.translatable -
Fixed
AbstractWidgetx/y/width/height becoming private in 1.20.1:FloatingSearchPanelswitched to its own fields + getters -
Fixed
renderButtonreplaced byrenderWidgetin 1.20.1:FloatingSearchPanelnow overridesrenderWidget -
Fixed
updateNarrationreplaced byupdateWidgetNarrationin 1.20.1: same override swap
⚡ 优化 / Improved
-
动画驱动统一化:移除
PanelRenderer每帧调用animationManager.updateAnimation()的旧驱动,改为TinkersSearch.onRenderTick每帧调用AnimationManager.update(),无活跃动画时几乎零成本 -
动画实例复用:同 key 的
Animation/Animator实例在AnimationManager内复用,避免每帧 new 对象 -
位置动画支持中途目标变化:使用
Animator的指数趋近模型,动画中途改变目标从当前值继续,不会跳变 -
详情页部件布局缓存优化:
useExpandedLayout一次判定视觉展开态,渲染与布局共用同一判据,避免每帧重复计算 -
详情页翻页 alpha 延迟应用:
currentPageAlpha ≤ 0.01时直接跳过卡片渲染并清空命中区,省去完全透明帧的绘制开销 -
Unified animation driving: removed the per-frame
animationManager.updateAnimation()call fromPanelRenderer, replaced withTinkersSearch.onRenderTickcallingAnimationManager.update()— nearly zero cost when no animation is active -
Animation instance reuse: same-key
Animation/Animatorinstances are reused insideAnimationManager, avoiding per-frame allocations -
Position animation supports mid-flight target changes: uses the
Animatorexponential-approach model, continuing from the current value when the target changes, no jump -
Detail part layout cache optimization:
useExpandedLayoutdecides the visual expanded state once and both render and layout share the same predicate, avoiding per-frame recomputation -
Detail page-turn alpha applied late: when
currentPageAlpha ≤ 0.01the card render is skipped and hit areas are cleared, saving draw cost on fully transparent frames
🔧 技术改进 / Technical Improvements
-
新增
client.animation.core包:Easing(11 种缓动)、ColorUtil(ARGB 插值 / 缩放)、Animation(触发型)、Animator(持久型)、AnimationManager(全局单例,注册 / 驱动 / 清理) -
新增
client.animation.controller包:PanelAnimations(卡片 hover / Tab / 指示器 / 空状态 / 刷新 / 脉冲)、WidgetAnimations(SearchBox focus / hover、ScrollBar thumb / hover)、DetailAnimations(窗口开关)、DetailPageAnimations(翻页) -
版本兼容层:
Easing/ColorUtil/Animation/Animator/AnimationManager为纯逻辑,无 MC 依赖,三版本共享同一份代码 -
SearchBox组件新增setAnimationId(String),focus / hover 平滑过渡;未指定 id 时退化为无动画,完全向后兼容 -
ScrollBar组件新增setAnimationId(String),thumb 位置平滑跟随、hover 颜色过渡;拖拽时立即跟随,滚轮滚动时平滑 -
SmelteryDataHelper.drawFluidIcon拆为两个重载,新增带外部alpha参数的版本,供面板图标延迟淡入淡出使用 -
PanelAnimationManager重写:新增hideImmediate()(父界面关闭时立即隐藏)与isTargetVisible()(暴露滑入滑出方向) -
FloatingSearchPanel新增forceHideImmediate()委托,与hideImmediate()语义对齐 -
TinkersSearch.onRenderTick挂载AnimationManager.update(),使用RenderTickEvent.Phase.START保证每帧渲染读到最新值 -
动画 key 前缀批量清理:
AnimationManager.stopPrefix("panel.")/stopPrefix("widget.")/stopPrefix("detail.part.")/stopPrefix("detail.page."),界面关闭时无残留 -
跨 1.18.2 / 1.19.2 / 1.20.1 三版本维护同一份动画系统代码,仅 UI 渲染入口有 API 差异(
PoseStack↔GuiGraphics) -
New
client.animation.corepackage:Easing(11 easings),ColorUtil(ARGB interpolation / scaling),Animation(trigger type),Animator(persistent type),AnimationManager(global singleton — register / drive / cleanup) -
New
client.animation.controllerpackage:PanelAnimations(card hover / Tab / indicator / empty state / refresh / pulses),WidgetAnimations(SearchBox focus / hover, ScrollBar thumb / hover),DetailAnimations(window open/close),DetailPageAnimations(page turn) -
Version-compat layer:
Easing/ColorUtil/Animation/Animator/AnimationManagerare pure logic with no MC dependency, shared across all three versions -
SearchBoxgainssetAnimationId(String)for smooth focus / hover transitions; falls back to no animation when unset, fully backward-compatible -
ScrollBargainssetAnimationId(String)for smooth thumb follow and hover color transition; immediate while dragging, smooth on wheel scroll -
SmelteryDataHelper.drawFluidIconsplit into two overloads, with a new version taking an externalalphaparameter for the panel icon delayed fade -
PanelAnimationManagerrewritten: addedhideImmediate()(immediate hide when parent screen closes) andisTargetVisible()(exposes slide direction) -
FloatingSearchPanelgains aforceHideImmediate()delegate aligned withhideImmediate() -
TinkersSearch.onRenderTickhooksAnimationManager.update(), usingRenderTickEvent.Phase.STARTso each frame reads the latest values -
Animation key prefix bulk cleanup:
AnimationManager.stopPrefix("panel.")/stopPrefix("widget.")/stopPrefix("detail.part.")/stopPrefix("detail.page."), no residue on screen close -
One animation system codebase maintained across 1.18.2 / 1.19.2 / 1.20.1, with only the UI rendering entry differing (
PoseStack↔GuiGraphics)
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:g0yMXsD6:XWIdEcZz"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:g0yMXsD6:XWIdEcZz"
}

