Releases: XSY-Team/fuck-sable
Release list
v1.7.13
v1.7.13
block-destroy-coordinate-guard mixin 注入失败修复 / block-destroy-coordinate-guard mixin injection failure fix (Issue #15)
修复 v1.7.12 引入的 LevelDestroyBlockGuardMixin 中 destroyBlock 方法签名错误导致 mixin 注入失败、游戏启动崩溃的问题。
Fixed the LevelDestroyBlockGuardMixin crash introduced in v1.7.12, caused by incorrect destroyBlock method signature leading to mixin injection failure at game startup.
问题原因 / Root cause:
1.21.1 中 Level.destroyBlock 的真实签名是 4 个参数 destroyBlock(BlockPos, boolean, Entity, int),但 v1.7.12 的 mixin 错误地使用了 3 个参数的签名 destroyBlock(BlockPos, boolean, Entity),导致 mixin 找不到目标方法,抛出 InvalidInjectionException: Critical injection failure。
In 1.21.1, Level.destroyBlock has 4 parameters destroyBlock(BlockPos, boolean, Entity, int), but the v1.7.12 mixin incorrectly used a 3-parameter signature destroyBlock(BlockPos, boolean, Entity), causing the mixin to fail finding the target method and throwing InvalidInjectionException: Critical injection failure.
影响 / Impact:
安装 v1.7.12 后游戏无法启动,崩溃日志显示 Mixin apply for mod fucksable failed。
After installing v1.7.12, the game cannot start, with crash log showing Mixin apply for mod fucksable failed.
兼容性 / Compatibility
- Sable 1.x 和 2.x / Sable 1.x and 2.x
- NeoForge 1.21.1
- Mohist/Youer 混合服务端 / Mohist/Youer hybrid servers
v1.7.12
v1.7.12
async-save PalettedContainer 多线程崩溃修复 / async-save PalettedContainer Multithreading Crash Fix
修复 async-save 把整个 saveAll 重定向到异步线程,导致 PalettedContainer.pack 触发 ThreadingDetector 崩溃的问题。改为统一"主线程序列化 + 异步磁盘 I/O"模式:序列化在主线程执行,磁盘 I/O 提交到异步线程。
Fixed async-save redirecting entire saveAll to async thread causing PalettedContainer.pack ThreadingDetector crash. Changed to unified "main-thread serialization + async disk I/O" model: serialization runs on main thread, disk I/O submitted to async thread.
为什么序列化必须在主线程 / Why serialization must be on main thread:
PalettedContainer 内部有 ThreadingDetector,不允许跨线程访问。原来的方案把整个 saveAll(包括序列化)放异步线程,触发了 ThreadingDetector 崩溃。磁盘 I/O 是真正的阻塞操作(会触发看门狗),序列化是 CPU 操作(不会阻塞线程),所以只把磁盘 I/O 放异步线程即可。
PalettedContainer has an internal ThreadingDetector that disallows cross-thread access. The old approach put entire saveAll (including serialization) on async thread, triggering ThreadingDetector crash. Disk I/O is a true blocking operation (triggers watchdog), serialization is a CPU operation (doesn't block thread), so only disk I/O needs to be on async thread.
整数极限方块破坏坐标防护 / Integer-Overflow Block Destruction Coordinate Guard (Issue #14)
新增 block-destroy-coordinate-guard 修复项,防止某些 mod 物品触发方块破坏时坐标计算溢出至 Integer.MIN_VALUE/MAX_VALUE,导致大量区块被加载、光照更新范围极大,最终服务器卡死或崩溃。
Added block-destroy-coordinate-guard fix: prevents server crash when modded items trigger block destruction at integer-overflow coordinates (Integer.MIN_VALUE/MAX_VALUE), which causes massive chunk loading and lighting updates.
配置 / Configuration:
坐标范围可通过 config/fucksable/config.json 的 fixParams.block-destroy-coordinate-guard 节点调整:
Coordinate limits are configurable via fixParams.block-destroy-coordinate-guard in config/fucksable/config.json:
"fixParams": {
"block-destroy-coordinate-guard": {
"xLimit": 30000000,
"yMin": -512,
"yMax": 1024
}
}如果调整后需要恢复默认值,使用命令 /fucksable block-destroy-coordinate-guard reset。
To reset to defaults after adjustment, use command /fucksable block-destroy-coordinate-guard reset.
修复项参数恢复命令 / Fix Options Reset Command
新增 /fucksable <fix> reset 命令,恢复指定修复项的参数到默认值。适用于用户手动修改 config.json 中的 fixParams 后参数写错、需要恢复的情况。
Added /fucksable <fix> reset command to reset a fix's options to defaults. Useful when users manually edit fixParams in config.json and need to recover from invalid values.
兼容性 / Compatibility
- Sable 1.x 和 2.x / Sable 1.x and 2.x
- NeoForge 1.21.1
- Mohist/Youer 混合服务端 / Mohist/Youer hybrid servers
- ScalableLux(光照优化)兼容 / ScalableLux (lighting optimization) compatible
- c2me 兼容 / c2me compatible
v1.7.10
v1.7.10
ScalableLux 不兼容声明绕过 / ScalableLux Incompatibility Declaration Bypass
使用 NeoForge 官方的 fml.toml 依赖覆盖([dependencyOverrides])机制,绕过 Sable 对 ScalableLux 的 type = "incompatible" 声明,避免 NeoForge ModSorter 在启动阶段直接拒绝加载。fs 启动时自动检查并写入 fml.toml,无需用户手动配置。
Uses NeoForge's official fml.toml dependency override ([dependencyOverrides]) mechanism to bypass Sable's type = "incompatible" declaration against ScalableLux, preventing NeoForge ModSorter from aborting startup. fs automatically checks and writes fml.toml on startup, no manual configuration required.
如何让 NeoForge 忽略 Sable 对 ScalableLux 的不兼容检查 / How to make NeoForge ignore Sable's incompatibility with ScalableLux:
fs 启动时会自动在 <游戏目录>/config/fml.toml 写入以下配置(若不存在):
fs automatically writes the following to <game_dir>/config/fml.toml on startup (if not present):
[dependencyOverrides]
sable = ["-scalablelux"]如果你想手动配置,在 config/fml.toml 末尾添加上述两行即可。-scalablelux 表示移除 Sable 对 ScalableLux 的所有依赖约束(包括 INCOMPATIBLE 声明)。
To configure manually, add the above two lines to the end of config/fml.toml. -scalablelux removes all dependency constraints from Sable against ScalableLux (including the INCOMPATIBLE declaration).
注意 / Note: 如果 fs 和 ScalableLux 同时首次安装,fs 没有机会执行自动写入(游戏在 ModSorter 阶段就崩溃)。此时请先单独启动一次 fs,再安装 ScalableLux。/ If fs and ScalableLux are installed simultaneously for the first time, fs has no chance to auto-write (game crashes at ModSorter stage). In this case, launch the game with fs alone first, then install ScalableLux.
ScalableLux 兼容性修复项 / ScalableLux Compatibility Fixes
fs 提供两个与 ScalableLux 相关的修复项:
fs provides two ScalableLux-related fixes:
-
sable-scalablelux-incompat-bypass(默认不启用 / disabled by default): 绕过 Sable 的neoforge.mods.toml中对 ScalableLux 的type = "incompatible"声明,防止 NeoForge ModSorter 在启动阶段报Mod sable is incompatible with scalablelux并拒绝启动。fs 启动时自动写入fml.toml的[dependencyOverrides]配置。/ Bypasses Sable'stype = "incompatible"declaration against ScalableLux, preventing NeoForge ModSorter from aborting startup withMod sable is incompatible with scalablelux. fs automatically writes the[dependencyOverrides]config tofml.tomlon startup. -
scalablelux-compat(默认启用 / enabled by default): 修复 ScalableLux 存在时 Sable SubLevel 光照完全失效的问题。ScalableLux 清空了主世界LevelLightEngine的blockEngine/skyEngine字段,导致 Sable 误判 SubLevel 无方块光、无天空光。本修复拦截ServerLevelPlot构造函数中的new LevelLightEngine(...)调用,通过StarLightInterface.hasBlockLight()/hasSkyLight()重新计算正确的光照参数。/ Fixes Sable SubLevel lighting being completely disabled when ScalableLux is installed. ScalableLux clears theblockEngine/skyEnginefields of the main worldLevelLightEngine, causing Sable to misjudge SubLevel as having no block light and no sky light. This fix interceptsnew LevelLightEngine(...)inServerLevelPlotconstructor and recalculates correct light parameters viaStarLightInterface.hasBlockLight()/hasSkyLight().
前置依赖关系 / Prerequisite dependency:
scalablelux-compat 依赖 sable-scalablelux-incompat-bypass。如果 scalablelux-compat 启用但 sable-scalablelux-incompat-bypass 未启用,fs 会在日志中输出警告,提醒用户先启用 sable-scalablelux-incompat-bypass 并重启服务器。
scalablelux-compat depends on sable-scalablelux-incompat-bypass. If scalablelux-compat is enabled but sable-scalablelux-incompat-bypass is not, fs will log a warning reminding the user to enable sable-scalablelux-incompat-bypass and restart the server.
使用步骤 / Usage steps:
- 在配置中启用
sable-scalablelux-incompat-bypass,重启服务器(fs 会自动写入fml.toml的依赖覆盖配置)/ Enablesable-scalablelux-incompat-bypassin config, restart server (fs will auto-write thefml.tomldependency override) - 确认 ScalableLux 正常加载后,
scalablelux-compat会自动生效(默认已启用)/ After confirming ScalableLux loads correctly,scalablelux-compatwill work automatically (enabled by default)
ScalableLux 兼容性 mixin 注入修复 / ScalableLux Compat Mixin Injection Fix
修复 ScalableLuxCompatMixin 的 @At("NEW") target 格式不正确导致 mixin 扫描 0 个目标,simulated mod 加载时崩溃。将 target 从 new <类名>(<描述符>)V 改为纯类名。
Fixed ScalableLuxCompatMixin @At("NEW") target format causing mixin to scan 0 targets and crash when simulated mod loads. Changed target from new <class>(<descriptor>)V to plain class name.
控制台刷屏修复 / Console Log Spam Fix
修复无物理结构时 Attempted to teleport invalid/removed body (id=0), skipping 警告每 tick 刷屏的问题,警告改为 60 秒节流窗口。
Fixed Attempted to teleport invalid/removed body (id=0), skipping warning spamming console every tick when no physics structures exist. Warning now throttled to once per 60s window.
兼容性 / Compatibility
- Sable 1.x 和 2.x / Sable 1.x and 2.x
- NeoForge 1.21.1
- Mohist/Youer 混合服务端 / Mohist/Youer hybrid servers
- ScalableLux(光照优化)兼容 / ScalableLux (lighting optimization) compatible
- c2me 兼容 / c2me compatible
v1.7.9: 修复 ScalableLuxCompatMixin target 格式 / fix ScalableLuxCompatMixin target format
修复 v1.7.8 中 ScalableLuxCompatMixin 的 @At("NEW") target 使用了错误的方法描述符格式,导致 mixin 扫描 0 个目标,服务端启动崩溃(Issue #13)。
Fixed v1.7.8 ScalableLuxCompatMixin @At("NEW") target using incorrect method descriptor format, causing mixin to scan 0 targets and crash server startup (Issue #13).
问题 / Issue: @At("NEW") 要求 new 格式,但代码误用了方法描述符格式,导致 Scanned 0 target(s)。
@At("NEW") requires new format, but code mistakenly used method descriptor format, causing Scanned 0 target(s).
修复 / Fix: 将 target 改为 new 格式。
Changed target to new format.
v1.7.8: 修复 ScalableLuxCompatMixin remap=false 崩溃 / fix ScalableLuxCompatMixin remap=false crash
v1.7.7 - ScalableLux 兼容性修复 / ScalableLux Compatibility Fix
ScalableLux 兼容性修复 / ScalableLux Compatibility Fix
修复 ScalableLux 与 Sable 的光照引擎不兼容问题(Issue #8)。
Fixed ScalableLux incompatibility with Sable''s light engine (Issue #8).
根因 / Root cause: Sable 的 ServerLevelPlot 构造函数从主世界 LevelLightEngine 读取 blockEngine/skyEngine 字段判断 SubLevel 是否有方块光/天空光。ScalableLux 的 LevelLightEngineMixin.construct 清空了这两个字段(用 StarLightInterface 替代 vanilla 光照引擎),导致 Sable 误判 SubLevel 无方块光、无天空光,SubLevel 光照完全失效。
Sable''s ServerLevelPlot constructor reads blockEngine/skyEngine fields of the main world LevelLightEngine to determine SubLevel light type. ScalableLux''s LevelLightEngineMixin.construct clears these fields (replaced by StarLightInterface), causing Sable to misjudge SubLevel as having no light, completely disabling SubLevel lighting.
修复 / Fix: 新增 scalablelux-compat 修复项,拦截 new LevelLightEngine(...) 调用,当 ScalableLux 存在时通过 StarLightInterface.hasBlockLight()/hasSkyLight() 重新计算正确的光照参数。
Added scalablelux-compat fix: intercepts new LevelLightEngine(...) call, recalculates correct light parameters via StarLightInterface.hasBlockLight()/hasSkyLight() when ScalableLux is present.
物理结构崩溃修复 / Physics Crash Fix
修复 RuntimeException: Body has been removed 崩溃。新增 RigidBodyHandleMixin,拦截 getLinearVelocity/getAngularVelocity,捕获异常返回零向量,复用 panic-guard 开关。
Fixed RuntimeException: Body has been removed crash. Added RigidBodyHandleMixin: intercepts getLinearVelocity/getAngularVelocity, catches exception and returns zero vector, reuses panic-guard toggle.
配置文件修复 / Config Fix
修复配置文件不存在时未重新生成、命令修改配置后未立即保存的问题。
Fixed config not regenerating when missing, and not saving immediately after command modification.
兼容性 / Compatibility: Sable 1.x/2.x, NeoForge 1.21.1, ScalableLux, c2me, Mohist/Youer
v1.7.6 - c2me 兼容性修复 / c2me Compatibility Fix
v1.7.6 - c2me 兼容性修复 / c2me Compatibility Fix
修复 fucksable 的 async-save 修复项与 c2me 的 preventAsyncEntityUnload mixin 冲突问题。
Fixed conflict between fucksable's async-save fix and c2me's preventAsyncEntityUnload mixin.
问题 / Issue
fucksable 把 SubLevelHoldingChunkMap.saveAll 整体放到异步 IO 线程执行,异步线程执行 processUnloads → removeSubLevel → removeEntity 时,c2me 检测到异步线程调用 ChunkMap.removeEntity 并抛出 ConcurrentModificationException: Async entity unload,导致 sub-level 保存流程中断。
fucksable ran saveAll entirely on async IO thread; when the async thread called processUnloads → removeSubLevel → removeEntity, c2me detected async ChunkMap.removeEntity call and threw ConcurrentModificationException: Async entity unload, interrupting the sub-level save flow.
修复 / Fix
检测 c2me 存在时,saveAll 在主线程执行(unload 部分不触发 c2me 冲突),但磁盘 IO(attemptSaveSubLevel、attemptSaveHoldingChunk)提交到异步 IO 线程执行,saveAll 返回前等待所有异步磁盘 IO 完成。
When c2me is present, saveAll runs on main thread (unload does not trigger c2me conflict), but disk IO (attemptSaveSubLevel, attemptSaveHoldingChunk) is submitted to async IO thread; saveAll waits for all async disk IO to complete before returning.
c2me 不存在时行为不变(saveAll 整体在异步 IO 线程执行)。
Behavior unchanged when c2me is absent (saveAll runs entirely on async IO thread).
兼容性 / Compatibility
- Sable 1.x 和 2.x / Sable 1.x and 2.x
- NeoForge 1.21.1
- Mohist/Youer 混合服务端 / Mohist/Youer hybrid servers
- c2me(Concurrent Chunk Management Engine)兼容 / c2me compatible
v1.7.5 - 开源到 XSY-Team 组织 / Open-sourced to XSY-Team org
v1.7.5 - 开源到 XSY-Team 组织 / Open-sourced to XSY-Team org
代码现在开源到 XSY-Team/fuck-sable 组织仓库,与个人仓库 OLKMO/FuckSable-Unofficial 同步维护。两个仓库内容一致。
Code is now open-sourced to the XSY-Team/fuck-sable org repo, maintained in sync with the personal repo OLKMO/FuckSable-Unofficial. Both repos have identical content.
变更 / Changes
- jar 产物重命名 / jar artifact renamed:
FuckSable-Unofficial-x.x.x.jar→fuck-sable-x.x.x.jar,与新仓库名一致。/ Renamed to match the new repo name. - UpdateChecker 双源查询 / UpdateChecker dual-source query: 更新检查器现在同时查询
OLKMO/FuckSable-Unofficial和XSY-Team/fuck-sable两个仓库的 latest release,取版本号更高的作为更新提示。单个仓库查询失败不影响另一个。/ Update checker now queries bothOLKMO/FuckSable-UnofficialandXSY-Team/fuck-sablerepos for the latest release, using the higher version as the update notification. Failure of one repo query does not affect the other. - README 链接调整 / README link updates: README 中的图片 URL 和 Releases 链接主链接改为
XSY-Team/fuck-sable,同时保留OLKMO/FuckSable-Unofficial作为备用下载源。/ README image URL and Releases links now point toXSY-Team/fuck-sableas the main source, withOLKMO/FuckSable-Unofficialkept as a backup download source.
兼容性 / Compatibility
- Sable 1.x 和 2.x / Sable 1.x and 2.x
- NeoForge 1.21.1
- Mohist/Youer 混合服务端 / Mohist/Youer hybrid servers
注意 / Note
旧版本 jar 文件名是 FuckSable-Unofficial-x.x.x.jar,从 v1.7.5 开始改为 fuck-sable-x.x.x.jar。如果用脚本自动更新,请调整文件名匹配规则。
Old jar filename was FuckSable-Unofficial-x.x.x.jar. From v1.7.5 onwards it is fuck-sable-x.x.x.jar. If you use an auto-update script, adjust the filename pattern accordingly.
v1.6.8
v1.6.7
- Fix CTT log spam fix mixin crash: correct Logger.warn target signature
- Fix RapierPhysicsPipelineMixin crash: remove unused poseCache @shadow field
- Fix startup animation character misalignment
⚠️ 警告/WARNING:本版本存在一定代码错误问题导致和在 Aeronautics 1.3.0 上崩溃!!请使用168 /⚠️ Warning: This version has certain code errors that cause crashes with Aeronautics 1.3.0!! Please use 1.6.8 instead
详细问题可以查看issues#6/For details, please refer to issues#6.