zifeng_s_custom_skill_tree-26.1.2-NeoForge-1.5.3.jar
Curse Maven Snippet
What's new
==================================================
子枫·自定义技能树 — 更新日志【26.1.2 专用】(中英双语,复制即用)
==================================================
(纯文本,直接选中复制粘贴到 CurseForge / Modrinth 的 Changelog 输入框即可)
⚠️ 本文件为 26.1.2 平台的【单独】更新日志。
原因:26.1.2 是【全新平台】,不是 1.20.1 / 1.21.1 的同步升级。
自下一次发布起,全平台共用一份更新日志;仅影响单一平台的改动会标注平台,例如
【仅 1.20.1】/【仅 26.1.2】。
==================================================
=== ENGLISH VERSION ===
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
v1.5.3 · 2026-10-16 · 26.1.2 NeoForge [NEW PLATFORM]
NEW PLATFORM — ported from 1.21.1 to Minecraft 26.1.2 (NeoForge 26.1.2.122, Java 25)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ℹ️ STANDALONE CHANGELOG. 26.1.2 is a brand-new platform, not a sync of 1.20.1 / 1.21.1.
From the next release onward all platforms share one changelog, and fixes that affect
only one platform will be tagged, e.g. [1.20.1 only] / [26.1.2 only].
🎯 GAMEPLAY IS IDENTICAL to 1.21.1 - this is a platform port, not a feature change.
It is deliberately NOT a line-by-line port: wherever 26.1.2 offers a better official
way of doing something, that way is used instead of forcing the old code to compile.
✅ Verified: 0 compile errors (818 at the start), clean build passes, and an actual
client + dedicated-server launch test passes with ZERO errors.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🧱 ARCHITECTURE UPGRADES (official 26.1.2 entry points, not workarounds)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1) World-space custom rendering moved to the new "submit geometry" model.
Old: RenderLevelStageEvent + Tesselator/BufferBuilder + manually toggling global state
(RenderSystem.enableBlend / enableCull / enableDepthTest ...).
New: SubmitCustomGeometryEvent + submitNodeCollector.submitCustomGeometry(...), which is
the official entry point in 26.1.2.
Note: RenderStateShard and all those RenderSystem toggles, plus BufferUploader, were
REMOVED in 26.1.2 - the old approach is no longer possible.
Benefit: render state is declared once by the RenderType, so there is no longer any way
to "leak" a disabled depth test and have selection boxes show through terrain.
It also gets you unloaded-chunk culling and opaque/translucent layer sorting for free.
2) "See-through" outlines now use a registered custom pipeline.
New WorldRender helper is the single entry point for world-space drawing
(normalLines / seeThroughLines / translucentFill / lineBox / boxFaces / quad).
The see-through lines use RegisterRenderPipelinesEvent with
DepthStencilState(CompareOp.ALWAYS_PASS, false) - exactly the old
RenderSystem.disableDepthTest() semantics, but without polluting global state.
3) Two mixins deleted because 26.1.2 provides official events for them.
- FogRendererMixin: ViewportEvent.RenderFog now fires INSIDE FogRenderer#setupFog and
carries a mutable FogData, so fog can be disabled directly by setting
environmentalStart/End + renderDistanceStart/End. (In 1.21.1 the timing made a mixin
unavoidable - that reason is gone.)
- PlayerRendererMixin: the target class no longer exists (the player renderer is now
AvatarRenderer + AvatarRenderState). The star ring is registered through the official
EntityRenderersEvent.AddLayers instead.
4) Capability system migrated to the new transfer API.
- IEnergyStorage (marked forRemoval) -> EnergyHandler, with transactional insert/extract
and a SnapshotJournal so only the fields that must roll back are snapshotted.
- IItemHandler (removed upstream) -> ResourceHandler<ItemResource> +
ItemUtil / EnergyHandlerUtil helpers.
- The creative energy block now uses the official InfiniteEnergyHandler.INSTANCE.
- The converter's getCapacityAsLong() now reports the TRUE long capacity (it used to be
truncated to int).
5) Saved data migrated to SavedDataType + Codec.
SavedData.Factory is gone. The original raw-NBT logic is wrapped into a Codec via
CompoundTag.CODEC.xmap(load, save), so all the existing migration / validation /
level-compression / refund code in the old format is preserved unchanged.
6) Other new APIs adopted along the way.
- Shield breaking: no longer instanceof ShieldItem + hard-coded 100 ticks; it reads the
item's own BLOCKS_ATTACKS component, so modded shields/blocking items work automatically.
- Permissions: hasPermission(int) -> Commands.LEVEL_* / Permissions predicates.
- GameProfile -> NameAndId record (never null).
- Spawn eggs: the old BY_ID static table is gone, so modded eggs are found as long as they
register their ENTITY_DATA component; a defensive try-catch from the 1.21.1 days was
removed as it is no longer needed.
- Pickaxe detection: instanceof PickaxeItem (class removed) -> ItemTags.PICKAXES, which
also works for modded pickaxes that join the tag.
- Registry lookup: get(id).map(Holder::value) -> Registry#getValue(Identifier).
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🐞 BUGS FOUND AND FIXED DURING THE PORT
(each was reproduced in an actual game launch, not guessed)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
A) [26.1.2 only] CRASH ON STARTUP: "Block id not set"
BlockBehaviour.Properties now REQUIRES an explicit id - effectiveDrops() derives the loot
table key from it, and without one the game throws NullPointerException while registering
blocks, which kills startup. Fixed by using
DeferredRegister.Blocks#registerBlock(name, ctor, props -> ...), which sets the id itself.
B) [26.1.2 only] Recipe failed to load: 'star_energy_converter'
The old ingredient form {"item": "minecraft:furnace"} is no longer accepted - NeoForge's
backwards-compatible codec was removed in this version. Fixed by using the plain string
form "F": "minecraft:furnace", which is what vanilla 26.1.2 recipes use.
C) [26.1.2 only] CRASH ON STARTUP: "Components not bound yet" (main menu, ~1s in)
ItemStack construction now reads the item's default components immediately, but components
are only bound once you join a world / receive registry data. Anything creating an
ItemStack in a static initializer therefore crashes on the main menu, and because it
happens inside <clinit> it escalates to ExceptionInInitializerError.
Fixed by making the HUD icon lazily created on first draw, guarded by the official
Holder#areComponentsBound(). Note for other modders: never create an ItemStack during
class init or mod construction in 26.1.2.
D) [26.1.2 only] Skill tree UI mis-scaled: category row clipped, hidden skills still clickable
enableScissor now APPLIES the current pose (it calls transformAxisAligned(this.pose)),
whereas in 1.21.1 it did not. The port had kept the 1.21.1 workaround of pre-multiplying
by the UI scale factor, but the calls already sit inside pose.scale(r), so the scale was
applied twice (effectively r squared). When zoomed out this shrank the scissor box by up
to 33%, clipping the category capsules and making the render clip region smaller than the
hit-test region - so skills below the fold were invisible yet still responded to clicks.
Fixed by passing design-space coordinates straight through and letting enableScissor
apply the pose. Render and hit-test regions are now exactly identical.
E) [26.1.2 only] Item icons would have rendered as missing (purple/black)
Item model definitions moved: 26.1.2 loads assets/<ns>/items/<name>.json, and the old
models/item/*.json is no longer an entry point. Added items/*.json and removed the now
dead models/item/*.json.
F) [26.1.2 only] Key-binding category showed a raw translation key
KeyMapping.Category uses an Identifier, so the translation key is now
key.category.<namespace>.<path>. Added it for all 4 languages.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ PLATFORM DIFFERENCES (not bugs - caused by the platform or by other mods)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
* [26.1.2 only] NO GUN COLUMN. TaCZ has no 26.1.2 release yet, so this platform has
11 categories / 153 skills. The 12 gun language entries are kept but the whole column is
hidden. When TaCZ updates, the column will be brought back.
(1.20.1 has the 12-skill gun column; 1.21.1 and 26.1.2 do not.)
* [26.1.2 only] OLD WORLDS DO NOT AUTO-MIGRATE skill points / machine bindings / magnet
exclusion zones. 26.1.2 forces SavedData into data/<namespace>/<path>.dat (the old file was
data/<modid>_player_data.dat) and wraps the contents in an extra "data" key. This is a
platform-wide behaviour that applies to every mod, not something this mod can avoid;
you simply start from empty data.
* [26.1.2 only] MODDED CONTAINER BINDING is narrower. It relies on the new transfer
capability (ResourceHandler<ItemResource>). Upstream removed Capabilities.ItemHandler, so
older modded containers that have not updated to 26.1.2 may fail to bind (vanilla chests
and hoppers are fine).
* [26.1.2 only] DO NOT INSTALL ON NEOFORGE 26.3. 26.3 ships FML loader 12, which REMOVED
ModConfig.Type.COMMON (split into LOCAL and SYNCED), so this build fails with
NoSuchFieldError on startup. Use NeoForge 26.1.2.122 / Minecraft 26.1.2.
(26.2 is fine - it still uses loader 11.)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📦 BUILD
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
zifeng_s_custom_skill_tree-26.1.2-NeoForge-1.5.3.jar 709,035 bytes
Minecraft 26.1.2 / NeoForge 26.1.2.122 / Java 25
Requires: neoforge [26.1,) · minecraft [26.1,27)
Optional: jecharacters (pinyin search in the skill tree)
=== 中文版 ===
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
v1.5.3 · 2026-10-16 · 26.1.2 NeoForge 【全新平台】
全新平台 —— 从 1.21.1 移植到 Minecraft 26.1.2(NeoForge 26.1.2.122 / Java 25)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ℹ️ 本文件为【单独】更新日志。26.1.2 是全新平台,不是 1.20.1 / 1.21.1 的同步升级。
自下一次发布起,全平台共用一份更新日志;仅影响单一平台的改动会标注平台,
例如【仅 1.20.1】/【仅 26.1.2】。
🎯 玩法与 1.21.1 完全一致 —— 这是平台移植,不是功能改动。
刻意<b>不</b>追求一比一复刻:凡是 26.1.2 有更好的官方写法,就用新写法,
而不是硬把老代码改成能编译。
✅ 已验证:编译错误 818 → 0,完整构建通过,并且【实机客户端 + 专用服务端】启动测试零报错。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🧱 架构级升级(改用官方入口,不是权宜之计)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1) 世界空间自绘改用新版「提交几何体」模型。
旧:RenderLevelStageEvent + Tesselator/BufferBuilder + 手工开关全局渲染状态
(RenderSystem.enableBlend / enableCull / enableDepthTest …)。
新:SubmitCustomGeometryEvent + submitNodeCollector.submitCustomGeometry(…)
—— 这是 26.1.2 官方指定的自定义世界几何体入口。
注意:RenderStateShard、上面那些 RenderSystem 开关、以及 BufferUploader
在 26.1.2 已【全部删除】,老写法根本走不通。
收益:渲染状态由 RenderType 一次性声明,<b>不再可能出现「深度测试忘了还原 →
线框穿透山体」</b>;还免费获得未加载区块裁剪与不透明/半透明分层排序。
2) 「穿墙可见」改为注册自定义管线。
新增 WorldRender 工具类作为世界空间绘制的统一入口
(normalLines / seeThroughLines / translucentFill / lineBox / boxFaces / quad)。
穿墙线框用 RegisterRenderPipelinesEvent + DepthStencilState(CompareOp.ALWAYS_PASS, false)
—— 正是旧 RenderSystem.disableDepthTest() 的语义,但不再污染全局状态。
3) 删除 2 个 Mixin(26.1.2 已提供官方事件)。
- FogRendererMixin:ViewportEvent.RenderFog 现在在 FogRenderer#setupFog <b>内部</b>触发,
并携带<b>可变 FogData</b>,直接改 environmentalStart/End + renderDistanceStart/End
即可彻底去雾。(1.21.1 时因为触发时机够不着才不得不写 Mixin,这个理由现在没了。)
- PlayerRendererMixin:目标类已不存在(玩家渲染器统一为 AvatarRenderer +
AvatarRenderState)。星空环改用官方 EntityRenderersEvent.AddLayers 注册。
4) 能力系统迁移到新版 transfer API。
- IEnergyStorage(已标记 forRemoval)→ EnergyHandler,事务化 insert/extract,
并用 SnapshotJournal 只快照需要回滚的字段。
- IItemHandler(上游已移除)→ ResourceHandler<ItemResource> +
ItemUtil / EnergyHandlerUtil 辅助类。
- 创造能量方块改用官方现成的 InfiniteEnergyHandler.INSTANCE。
- 转换机对外 getCapacityAsLong() 现在返回<b>真实 long 上限</b>(旧版被截断到 int)。
5) 存档改用 SavedDataType + Codec。
SavedData.Factory 已删除。用 CompoundTag.CODEC.xmap(load, save) 把<b>原有裸 NBT 逻辑
原样包成 Codec</b>,因此旧存档里的迁移 / 校验 / 等级压缩 / 退点代码<b>一行未改</b>全部保留。
6) 顺带用上的新版能力。
- 破盾:不再 instanceof ShieldItem + 硬编码 100 tick,改读物品自身的 BLOCKS_ATTACKS
组件 → 模组盾牌 / 格挡物品<b>自动兼容</b>。
- 权限:hasPermission(int) → Commands.LEVEL_* / Permissions 谓词。
- GameProfile → NameAndId record(天然非空)。
- 刷怪蛋:旧 BY_ID 静态表被删后坑天然消失,模组蛋只要注册 ENTITY_DATA 组件就能被找到;
顺带删掉 1.21.1 时代为防崩服加的 try-catch(已不再需要)。
- 万物可掘:instanceof PickaxeItem(类已删)→ ItemTags.PICKAXES,
模组镐子只要进标签就生效。
- 注册表读取:get(id).map(Holder::value) → Registry#getValue(Identifier)。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🐞 移植期实机复现并修掉的问题
(每条都是真实启动复现,不是靠猜)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
A)【仅 26.1.2】启动即崩:Block id not set
BlockBehaviour.Properties 现在<b>必须</b>显式设置 id —— effectiveDrops() 会据 id 推导
战利品表键,缺 id 就在注册方块时抛 NullPointerException 直接崩启动。
改用 DeferredRegister.Blocks#registerBlock(name, ctor, props -> …),它内部会设 id。
B)【仅 26.1.2】配方加载失败:'star_energy_converter'
旧 Ingredient 写法 {"item": "minecraft:furnace"} 已不被接受 —— NeoForge 的向后兼容
codec 在这个版本被移除了。改用原版 26.1.2 的裸字符串写法 "F": "minecraft:furnace"。
C)【仅 26.1.2】启动即崩:Components not bound yet(主菜单约 1 秒后)
ItemStack 构造现在会<b>立即读取物品默认组件</b>,而组件要到「进入世界 / 收到注册表数据」
才绑定。因此在静态初始化器里创建 ItemStack 会在主菜单崩溃;又因发生在 <clinit> 里,
会升级成 ExceptionInInitializerError。
已改为首次绘制时惰性创建,并用官方 Holder#areComponentsBound() 精确判断。
★ 给其他模组作者的经验:26.1.2 下<b>不要在类初始化 / 模组构造期创建 ItemStack</b>。
D)【仅 26.1.2】技能树缩放后界面错位:类别栏被裁切、且看不见的技能仍能点
enableScissor 现在<b>会套用当前 pose</b>(内部调 transformAxisAligned(this.pose)),
而 1.21.1 不会。移植时保留了 1.21.1 的手动乘缩放倍率补偿,但调用点本就已在
pose.scale(r) 之内 → 缩放生效了<b>两次</b>(等效 r²)。
缩小时裁剪框会被压小最多 33%,于是裁掉类别胶囊,且<b>渲染裁剪区小于命中判定区</b>
→ 列表下方的技能看不见却仍响应点击。
已改为直接透传设计空间坐标,把缩放交给 enableScissor 自己套 pose。
现在渲染区与命中区<b>完全一致</b>。
E)【仅 26.1.2】物品图标本会显示为缺失(紫黑格)
物品模型定义路径变了:26.1.2 读取 assets/<ns>/items/<name>.json,
旧的 models/item/*.json 已不再是入口。已新增 items/*.json 并删除失效的 models/item/*.json。
F)【仅 26.1.2】设置页按键分类显示原始翻译键名
KeyMapping.Category 现在用 Identifier,翻译键变成 key.category.<命名空间>.<路径>。
已补 4 语系。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ 平台差异(不是 bug —— 由平台或外部模组导致)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
* 【仅 26.1.2】<b>没有枪械列</b>。TaCZ 尚无 26.1.2 版本,故本平台为 <b>11 列 / 153 项技能</b>。
枪械相关 12 条语言条目保留,但整列隐藏。等 TaCZ 更新后再把该列接回来。
(1.20.1 有 12 项枪械列;1.21.1 与 26.1.2 均无。)
* 【仅 26.1.2】<b>旧世界不会自动迁移</b>技能点 / 机器绑定 / 磁铁屏蔽区。
26.1.2 强制 SavedData 存到 data/<命名空间>/<路径>.dat(旧文件是
data/<modid>_player_data.dat),且内容多包一层 "data" 键。
这是平台对所有模组的统一行为,本模组无法绕过;从空数据重新开始即可。
* 【仅 26.1.2】<b>模组容器绑定范围收窄</b>。它依赖新的 transfer 能力
(ResourceHandler<ItemResource>)。上游移除了 Capabilities.ItemHandler,
因此未适配 26.1.2 的旧模组容器可能「绑定不上」(原版箱子 / 漏斗正常)。
* 【仅 26.1.2】<b>不要装在 NeoForge 26.3 上</b>。26.3 用的是 FML loader 12,
其中 <b>ModConfig.Type.COMMON 已被删除</b>(拆成 LOCAL / SYNCED),
本构建会在启动时抛 NoSuchFieldError。请使用 NeoForge 26.1.2.122 / Minecraft 26.1.2。
(26.2 可以用 —— 它仍是 loader 11。)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📦 构建产物
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
zifeng_s_custom_skill_tree-26.1.2-NeoForge-1.5.3.jar 709,035 字节
Minecraft 26.1.2 / NeoForge 26.1.2.122 / Java 25
依赖:neoforge [26.1,) · minecraft [26.1,27)
可选:jecharacters(技能树拼音搜索)
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects