COWMODSКаталог модов

Create-Aeronautics:Compatibility + Bug fixes

A fix mod targeting Sable and its related issues

27,5 тыс.32обновлён 10 авг. 2026 г.
Механики игрыУправлениеТехнологии

Описание

FuckSable

F**kSable

一个专门修 Sable 的 mod / A mod that fixes Sable 因为 Sable 的作者挖坑不填,我来填 / Because Sable's author left holes, I'm filling them

Sable 是个让 Minecraft 方块物理化的 mod,想法很酷。但 Rust + Java 的缝合架构嘛……你懂的。这个 mod 的存在就是为了补那些能让服务器血压直接拉满的洞。

Sable is a Minecraft mod that adds physics to blocks — a cool concept. But the Rust + Java hybrid architecture... you know the drill. This mod exists to patch the holes that'll send your server's blood pressure through the roof.


前置 / Dependency

  • Sable — 不是可选,毕竟我存在的意义就是擦它的屁股 / Not optional, after all, my whole reason for existing is to clean up its mess

版本说明 / Version Notes

当你发现某个版本标记为 Alpha(例如 v1.0.0-alpha.1),那大概是一个存在已知问题但未被下架的版本。Alpha 版本可能包含未完成的功能、已知的崩溃风险或性能问题,主要用于早期测试和反馈收集。

但请注意:Alpha 也包含 Beta 版本 —— 实际上某些 Beta 反而比 Alpha 更稳定。版本号只是个标签,不代表一切。

详细信息以 GitHub Releases 为准 —— 每个版本的发布说明都会清楚列出已知问题、适用范围和建议。不要只看版本号,看发布说明。也可从 OLKMO/FuckSable-Unofficial 获取。

生产环境请优先选择经过充分测试的版本。如果你在 Alpha/Beta 版本中遇到了问题,请理解——测试版就是测试版,崩了别意外。


When you see a version marked as Alpha (e.g., v1.0.0-alpha.1), it's probably a version with known issues that hasn't been taken down yet. Alpha releases may contain incomplete features, known crash risks, or performance problems — they're intended for early testing and feedback collection.

But note: Alpha includes Beta releases — in fact, some Betas are actually more stable than certain Alphas. Version numbers are just labels, they don't tell the whole story.

For detailed information, refer to GitHub Releases — each release's notes clearly list known issues, scope, and recommendations. Don't just look at the version number, read the release notes. Also available from OLKMO/FuckSable-Unofficial.

For production environments, choose thoroughly tested releases. If you encounter issues in an Alpha/Beta version, please understand — a test version is a test version, don't be surprised if it breaks.


修复项 / Fixes

默认全开,可通过配置文件单独关闭。依赖其他 mod 的修复项,缺 mod 会自动禁用。少数修复项因涉及前置依赖关系或基于 bug 的玩法,默认关闭(见下表标注)。

Enabled by default, can be disabled individually via config. Fixes that depend on other mods auto-disable if the mod is missing. A few fixes are disabled by default due to prerequisite dependencies or bug-based gameplay (see notes in the table below).

Sable 核心修复 / Core Fixes

修复项 / Fix描述 / Description
async-saveSubLevel 保存操作重定向到异步 I/O 线程,防止保存时服务器冻结。Sable 的 Rust 原生层在主线程做同步 I/O —— 稍微大点的物理结构就能把整个服务器卡死。/ Redirects SubLevel saving to async I/O thread, preventing server freeze during save. Sable's Rust native layer does sync I/O on main thread — one slightly large physics structure can freeze the entire server.
panic-guard调用 Rust 原生代码前加安全检查,防止 Rust 侧 panic 把整个 JVM 带走。是的,Rust panic 会直接弄死 Java 进程,没有任何优雅处理。/ Adds safety checks before calling Rust native code, preventing Rust-side panic from taking down the entire JVM. Yes, Rust panic will kill the Java process directly, no graceful handling whatsoever.
write-flush更新存储文件头之前先刷盘,防止崩溃时数据变垃圾。Sable 的存储格式在异常退出后基本就是不可读的废数据。/ Ensures data is flushed to disk before updating storage file header, preventing data corruption on crashes. Sable's storage format becomes unreadable garbage after abnormal exit.
corrupted-cleanup清理 holding chunk 中损坏的 SubLevel 指针,防止反复加载报错。/ Removes corrupted sub-level pointers from holding chunks to prevent repeated load errors.
plot-holder-guardplot 区块的 holder 不存在时安全跳过方块更新,而不是直接崩溃。竹子长在物理结构旁边?服务器炸。/ Safely skips block updates when plot chunk's holder doesn't exist, instead of crashing. Bamboo growing next to a physics structure? Server dies.
sublevel-entity-guard防止 SubLevelInclusiveLevelEntityGetter 遍历异常 AABB 时服务器卡死。EntitySectionStorage 内部数据被并发修改损坏后,实体碰撞检测可能陷入无限循环 —— 一只蝙蝠的碰撞查询就能卡死服务器 60 秒以上。/ Prevents server freeze when SubLevelInclusiveLevelEntityGetter iterates over abnormal AABBs. After EntitySectionStorage internal data gets corrupted by concurrent modification, entity collision checks can enter infinite loops — a single bat's collision query can lock up the server for 60+ seconds.
command-block-sublevel-fix禁止命令方块(及其变体)被放到物理化结构上。原版只禁止直接物理化命令方块,但你可以先放方块再物理化 —— 显然不是预期行为。/ Prevents command blocks (and variants) from being placed on physics-enabled structures. Vanilla only prevents directly physics-enabling command blocks, but you can place first then enable — clearly not intended.
player-position-guard玩家坐标超出世界边界时自动拉回,防止 SubLevel 物理把玩家扔出世界导致崩溃。Y 轴上限扩展至原版 +1000 格。/ Clamps player position to world border when coordinates exceed boundaries, preventing server crashes from SubLevel physics. Y-axis limit extended to vanilla +1000.
light-engine-bounds-guard防止 SubLevel 区段超出世界高度限制时光照引擎崩溃。/ Prevents light engine crashes when SubLevel sections exceed world height limits during light propagation.
physics-ticket-guard防止 PhysicsChunkTicketManager 导致 DistanceManager 内部状态损坏(ArrayIndexOutOfBoundsException)。/ Prevents server crash when PhysicsChunkTicketManager triggers DistanceManager internal state corruption.
sublevel-volume-limit限制单个物理结构最大方块数量(8192,约 16x16x32 体积),防止过大的碰撞体导致 Rapier 原生崩溃。/ Limits maximum block count of a single physics structure (8192, approx 16x16x32), preventing Rapier native crashes from oversized collision bodies.
constraint-self-fix抑制 Sable 物理管道中的自约束错误:当约束在 SubLevel 和自身之间创建时返回 null 而非抛出异常。自动适配 Sable 1.x(ServerSubLevel 参数)和 2.x(PhysicsPipelineBody 参数)。/ Suppresses self-constraint errors in Sable physics pipeline: returns null instead of throwing when a constraint is added between a SubLevel and itself. Auto-adapts to Sable 1.x (ServerSubLevel params) and 2.x (PhysicsPipelineBody params).
sublevel-load-log-spam-fix限流 SubLevelStorage.attemptLoadSubLevel 在 sub-level 存储条目损坏/缺失时反复输出的 "Couldn't find sub-level" ERROR 日志:同一 chunk+index 每 60 秒只输出一次。/ Throttles repeated "Couldn't find sub-level" ERROR log spam from SubLevelStorage.attemptLoadSubLevel when a sub-level storage entry is corrupted/missing: logs once per chunk+index per 60s window.
udp-invalid-packet-guard静默丢弃 packet ID 越界的 UDP 数据包(如 MC 旧版服务器列表 ping 的 packet ID 254),防止 SableUDPPacketDecoder.decode 抛 IOException 触发 "Server UDP channel caught exception" ERROR 日志刷屏。合法 ID 上界通过反射读取 SableUDPPacketType.VALUES 长度并缓存。/ Silently drops UDP packets whose first byte is an invalid Sable packet ID (e.g. legacy server list ping packet ID 254) instead of letting SableUDPPacketDecoder.decode throw IOException and spam "Server UDP channel caught exception" ERROR logs. Valid ID upper bound is read via reflection from SableUDPPacketType.VALUES and cached.
entity-lookup-remove-guard拦截 PersistentEntitySectionManager.stopTracking 中的 EntityLookup.remove 调用,捕获 Int2ObjectLinkedOpenHashMap.fixPointers 抛出的 ArrayIndexOutOfBoundsException(index -1),防止 Sable 的 SubLevel 实体管理破坏 map 内部链表状态后导致整个 tick 崩溃。属治标修复,单次移除失败会被跳过并打 WARN 日志。/ Intercepts EntityLookup.remove inside PersistentEntitySectionManager.stopTracking, catches ArrayIndexOutOfBoundsException from Int2ObjectLinkedOpenHashMap.fixPointers (index -1) when Sable's SubLevel entity management corrupts the map's internal linked-list state. Prevents a single entity removal failure from crashing the entire tick. Symptomatic fix — failed removals are skipped with a WARN log.

兼容性修复 / Compatibility Fixes

修复项 / Fix依赖 / Dependency描述 / Description
carryon-compatCarryOn修 CarryOn 把玩家放到物理化 sub-level 时传送到错误维度并崩溃。Sable 的射线检测返回局部坐标,CarryOn 当全局坐标用,玩家直接被扔进虚空。/ Fixes CarryOn teleporting players to wrong dimension and crashing when placing onto physics sub-level. Sable's raycasting returns local coordinates, CarryOn treats them as global — players get thrown into the void.
typewriter-server-fixSimulated修 Simulated 打字机在专用服务器上崩溃。服务端代码里出现了 net.minecraft.client.gui.screens.Screen —— 这玩意儿在专用服务器上根本不存在。客户端/服务端不分,离谱。/ Fixes Simulated typewriter crash on dedicated servers. Server code references net.minecraft.client.gui.screens.Screen — a class that doesn't exist on dedicated servers. Basic client/server separation failure, truly baffling.
aeronautics-server-fixAeronautics修航空学 SteamVentBlockEntity 在专用服务器上崩溃。又是客户端类引用,这次是 Minecraft.getInstance()。同一个坑踩两次,真有你的。/ Fixes Aeronautics SteamVentBlockEntity crash on dedicated servers. Another client class reference, this time Minecraft.getInstance(). Falling into the same pit twice, nice one.
aeronautics-slime-bearfixAeronautics修粘液球粘连结构时可以粘连旋转轴承导致其分离并产生穿模效应。默认关闭 —— 因为很多玩法基于这个 bug。/ Fixes slime blocks sticking to bearing structures causing them to separate and clip through blocks. Disabled by default — because many builds rely on this bug.
physics-staff-drag-clipfixSimulated修物理手杖高速拖动物理结构时穿模和飞出世界边界。在 updatePose 中钳制 SubLevel 位置到世界边界内,超出则清零速度。Y 轴上限扩展至原版 +1000 格。默认开启。/ Fixes physics structures clipping through blocks and flying out of world bounds when dragged at high speed. Clamps SubLevel position to world bounds in updatePose, zeroes velocity if out of bounds. Y-axis limit extended to vanilla +1000. Enabled by default.
copycats-lift-compatSable, Copycats修 Copycats 方块缺少 facing 属性时触发 sable$getNormal 导致服务器崩溃。/ Prevents server crash when Copycats blocks with missing facing property trigger sable$getNormal in onBlockChange.
ctt-concurrent-fixCreate ThreadedTrains修 CTT 和机械动力的并发问题。CTT 把火车 tick 移到工作线程,但只把 manageEntities 调度回主线程,updateContraptionAnchors 还在工作线程跑 —— 主线程读到不一致状态,EntitySectionStorage 里的 AVL 树被搞坏,轻则 NPE,重则整个服务器死循环卡死。/ Fixes concurrency issue between CTT and Create. CTT moves train ticking to worker threads but only schedules manageEntities back to main thread — updateContraptionAnchors still runs on workers. Main thread reads inconsistent state, corrupts AVL tree in EntitySectionStorage, resulting in NPE or entire server locking up in infinite loop.
ctt-log-spam-fixCreate ThreadedTrains抑制 CTT 列车计算失败时的重复 WARN 日志刷屏,每种异常类型只输出一次。/ Suppresses repeated warning logs from CTT when train calculation fails, only logs once per error type.
ctt-posttick-timeout-guardCreate ThreadedTrains防止 CTT postTick 在主线程 Future.get() 无限阻塞导致 Watchdog 超时崩溃:改为 10 秒超时,超时后取消任务并放行主线程。/ Prevents Watchdog server crash when CTT postTick blocks the main thread waiting for a stuck async train worker: replaces Future.get() with a 10s timeout, cancels and skips on timeout to keep the server alive.
create-trackgraph-null-guardCreate防止 Create 列车导航搜索时 TrackNode 为 null(CTT 并发问题导致的损坏状态)导致服务器崩溃:TrackGraph.getConnectionsFrom 返回空 Map 而非 null。/ Prevents server crash when Create train navigation searches with a null TrackNode (corrupted train state from CTT concurrent issues): TrackGraph.getConnectionsFrom returns empty Map instead of null.
create-train-detach-nulledge-guardCreate防止 TrackGraph.removeNode 触发 Train.detachFromTracks 时因 TravellingPoint.edge 为 null 导致服务器崩溃:跳过 edge 为 null 的点而非抛出 NPE。/ Prevents server crash when TrackGraph.removeNode triggers Train.detachFromTracks with null TravellingPoint.edge: skips points with null edge instead of throwing NPE.
frogport-extract-limitCreate防止洼港(FrogportBlockEntity)lazyTick 从超大相邻库存拉取物品时服务器卡死:当 IItemHandler 槽位数超过 256 时跳过 ItemHelper.extract,每 60 秒告警一次。/ Prevents server freeze when FrogportBlockEntity lazyTick pulls items from oversized adjacent inventories: skips ItemHelper.extract when IItemHandler slot count exceeds 256, logs once per 60s.
effortless-particle-fixEffortless, Sable修 Effortless 对着 Sable 物理结构操作时客户端崩溃。Sable 射线检测返回 Plot 存储区域的远端坐标,Effortless 用该坐标生成粒子时客户端未加载该区块导致崩溃。修复方式:跳过未加载区块的粒子生成。/ Fixes Effortless client crash when interacting with Sable physics structures. Sable raycasting returns Plot storage area coordinates (distant chunks), Effortless uses these to generate particles but the client hasn't loaded those chunks. Fix: skip particle generation for unloaded chunks.
vista-camera-chunk-fixVista, Sable修 Vista 摄像头区块加载与 Sable 物理结构不兼容:ViewFinder 在物理结构上时,其坐标是 SubLevel 内部坐标,Vista 用该坐标在主世界 force-load 区块导致 TPS 掉 0 和无限加载循环。修复方式:force-load 前将坐标投影到主世界坐标。/ Fixes Vista camera chunk loading incompatibility with Sable physics structures: when ViewFinder is on a physics structure, its coordinates are SubLevel-internal, Vista force-loads wrong chunks in the overworld causing TPS drop and infinite loading loops. Fix: project coordinates to world coordinates before force-loading.
sable-scalablelux-incompat-bypassSable绕过 Sable 的 neoforge.mods.toml 中对 ScalableLux 的 type = "incompatible" 声明,防止 NeoForge ModSorter 在启动阶段直接拒绝加载。fs 启动时自动写入 fml.toml 的 [dependencyOverrides] 配置。默认关闭 —— 是 scalablelux-compat 的前置项,需先启用并重启。/ Bypasses Sable's type = "incompatible" declaration against ScalableLux in neoforge.mods.toml, preventing NeoForge ModSorter from aborting startup. fs auto-writes the [dependencyOverrides] config to fml.toml on startup. Disabled by default — prerequisite for scalablelux-compat, must enable and restart first.
scalablelux-compatScalableLux, Sable修 ScalableLux 存在时 Sable SubLevel 光照完全失效:ScalableLux 清空了主世界 LevelLightEngine 的 blockEngine/skyEngine 字段,导致 Sable 误判 SubLevel 无方块光、无天空光。拦截 ServerLevelPlot 构造函数中的 new LevelLightEngine(...) 调用,通过 StarLightInterface 重新计算正确的光照参数。依赖 sable-scalablelux-incompat-bypass。/ Fixes Sable SubLevel lighting being completely disabled when ScalableLux is installed: ScalableLux clears the blockEngine/skyEngine fields of the main world LevelLightEngine, causing Sable to misjudge SubLevel as having no block light and no sky light. Intercepts new LevelLightEngine(...) in ServerLevelPlot constructor, recalculates correct light parameters via StarLightInterface. Depends on sable-scalablelux-incompat-bypass.
block-destroy-coordinate-guardSable防止某些 mod 物品触发方块破坏时坐标计算溢出至 Integer.MIN_VALUE/MAX_VALUE,导致大量区块被加载、服务器卡死或崩溃(Issue #14)。拦截 Level.setBlock 和 Level.destroyBlock,坐标超出可配置范围时跳过操作。坐标范围可通过 config/fucksable/config.json 的 fixParams 调整,用 /fucksable block-destroy-coordinate-guard reset 恢复默认值。/ Prevents server crash when modded items trigger block destruction at integer-overflow coordinates (Integer.MIN_VALUE/MAX_VALUE), causing massive chunk loading and server freeze (Issue #14). Intercepts Level.setBlock and Level.destroyBlock, skips operations when coordinates exceed configurable limits. Limits are configurable via fixParams in config/fucksable/config.json, reset with /fucksable block-destroy-coordinate-guard reset.

调试命令 / Debug Commands

命令 / Command作用 / Purpose
/fucksable查看所有修复项状态 / View status of all fixes
/fucksable <修复项/fix> on/off启用/禁用某个修复项 / Enable/disable a fix
/fucksable all on/off启用/禁用全部修复项 / Enable/disable all fixes
/fucksable default恢复所有修复项为默认配置 / Reset all fixes to defaults
/fucksable <修复项/fix> reset恢复指定修复项的参数到默认值 / Reset a fix's options to defaults

国际化 / Internationalization (i18n)

FuckSable 支持自定义语言包。所有可打印信息(命令反馈、日志等)都可以通过语言文件覆盖。

FuckSable supports custom language packs. All printable messages (command feedback, logs, etc.) can be overridden via language files.

使用方法 / Usage

/fucksablelang <语言文件名>
  • <语言文件名>: 语言文件的名称(不含路径,不含扩展名)/ Language file name (without path, without extension)

语言文件位于 .minecraft/config/fucksable/lang/(服务端则为 config/fucksable/lang/)。

Language files are located in .minecraft/config/fucksable/lang/ (or config/fucksable/lang/ for servers).

默认语言包 / Default Language Packs

文件名 / File Name语言 / Language
zh.yml简体中文 / Simplified Chinese
en.yml英文 / English

创建自定义语言包 / Creating Custom Language Packs

  1. 进入 config/fucksable/lang/ 目录
  2. 复制 en.yml 或 zh.yml 作为模板
  3. 重命名为你想要的语言文件名(例如 ja.yml、es.yml、fr.yml)
  4. 翻译 YAML 文件中的值(键名不要改)
  5. 在游戏中执行 /fucksablelang <文件名> 切换
1. Navigate to `config/fucksable/lang/`
2. Copy `en.yml` or `zh.yml` as a template
3. Rename it to your desired language file name (e.g., `ja.yml`, `es.yml`, `fr.yml`)
4. Translate the values in the YAML file (don't change the keys)
5. Run `/fucksablelang <filename>` in-game to switch

注意事项 / Notes

  • FuckSable 的可打印信息不是很多,所有文本加起来也就几十行

  • 你完全可以直接丢给 GPT 去翻译,几秒钟搞定

  • 切换语言后立即生效,不需要重启服务器

  • 如果语言文件格式错误(无效 YAML),会自动回退到默认语言(英文)

  • FuckSable's printable messages are not that many — all text combined is only a few dozen lines

  • You can just throw it at GPT for translation, takes a few seconds

  • Language switching takes effect immediately, no server restart required

  • If a language file has invalid YAML, it will automatically fall back to default language (English)

示例:自定义语言文件结构 / Example: Custom Language File Structure

# zh.yml - 简体中文示例 / Simplified Chinese example

command:
  fucksable:
    title: "=== FuckSable 修复状态 ==="
    fix:
      enabled: "✓ %s 已启用"
      disabled: "✗ %s 已禁用"
      missing_dep: "⚠ %s 已禁用 (缺少依赖: %s)"
    invalid_fix: "无效的修复项: %s"
    set:
      enabled: "已将 %s 设置为 %s"
    lang:
      switched: "语言已切换至: %s"
      file_not_found: "语言文件不存在: %s"
      invalid_yml: "语言文件格式错误,已回退至默认语言"
# en.yml - 英文示例 / English example

command:
  fucksable:
    title: "=== FuckSable Fix Status ==="
    fix:
      enabled: "✓ %s is enabled"
      disabled: "✗ %s is disabled"
      missing_dep: "⚠ %s is disabled (missing dependency: %s)"
    invalid_fix: "Invalid fix: %s"
    set:
      enabled: "Set %s to %s"
    lang:
      switched: "Language switched to: %s"
      file_not_found: "Language file not found: %s"
      invalid_yml: "Invalid YAML format, falling back to default language"

为什么是 All-in-One?/ Why All-in-One?

Q: 为什么不写单独的 mod 逐个修复,而是全部打包在一起?

A: 因为我讨厌为了修复几个问题还要到处找补丁、一个个安装、反复排查冲突。

Q: Why not write separate mods for each fix?

A: Because I'm tired of hunting down patches, installing them one by one, and debugging conflicts just to fix a few issues.

FuckSable 是全部打包:

  • 一个 mod,一次安装,所有修复同时生效
  • 每一个修复都在真实服务端环境测试过,不是纸上谈兵
  • 配置文件可以单独开关,不需要就不开
  • 不用记这个 bug 归哪个 mod 管,一个命令全看见

FuckSable is all-in-one:

  • One mod, one installation, all fixes work together
  • Every fix has been tested on a real server environment, not just theory
  • Config file lets you toggle individual fixes on/off
  • No need to remember which bug belongs to which mod — one command shows everything

简单说就是:省事。

Simply put: Less hassle.


吐槽 / Rant

Sable 的 Rust + Java 架构本身不是问题。问题在于两边几乎都没有错误处理:

Sable's Rust + Java architecture isn't the problem. The problem is the near-total lack of error handling on both sides:

  • Rust 侧 panic → 直接带走 JVM / Rust-side panic → directly takes down JVM
  • Java 侧对 Rust 返回值校验 ≈ 不存在 / Java-side validation of Rust return values ≈ nonexistent
  • 服务端引用客户端类?这不是边缘 case,是专用服务器一启动就崩的程度 / Server referencing client classes? Not edge cases, they crash dedicated servers at startup

依赖管理也是一坨屎:API 类散落在各种包路径下 —— SubLevelContainerHolder 在 mixinterface.plot 而不是 api.sublevel,JOMLConversion 在 companion.math。你永远猜不到下一个类在哪个包里。

Dependency management is also a mess: API classes scattered across random package paths — SubLevelContainerHolder in mixinterface.plot instead of api.sublevel, JOMLConversion in companion.math. You never know where the next class will be hiding.

但话说回来,方块物理化这个想法确实很酷。只是希望作者能多花点时间在稳定性上,而不是只追求功能。

But that said, the idea of block physics is indeed really cool. I just wish the author would spend more time on stability instead of just chasing features.


附加说明 / Additional Note

更新检查通过 GitHub Releases API(HTTPS)获取最新版本信息,启动时自动检查并在日志中提示。默认关闭,可通过配置文件开启。

Update checking uses the GitHub Releases API (HTTPS) to fetch the latest version info, automatically checks on startup and logs a notice if a new version is available. Disabled by default, can be enabled via config.

代码已开源,欢迎提交 Issue 和 PR。

The code is open source, feel free to submit Issues and PRs.


许可证 / License

MIT License - 详见 LICENSE 文件。

MIT License - see LICENSE file for details.

Последние версии

Все версии →
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.25

1.7.25
10 авг. 2026 г.13,3 тыс.Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.25] - 2026-08-10 ### 变更 / Changes - **测试功能标记机制 / Experimental fix tagging mechanism**: 在 `FixEntry` 中新增 `experimental` 字段,允许将修复项标记为测试功能。标记后在 `/fucksable` 命令列表和详情中以黄色 `[测试]` / `[Experimental]` 标签显示。已将 `world-height-override` 标记为测试功能。/ Added `experimental` field to `FixEntry`, allowing fixes to be tagged as experimental. Tagged fixes display a yellow `[测试]` / `[Experimental]` label in the `/fucksable` command list and details. `world-height-override` is now tagged as experimental.
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.24

1.7.24
10 авг. 2026 г.44Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.24] - 2026-08-10 ### Bug 修复 / Bug Fixes - **SubLevelStorage storageCache 并发崩溃修复 / SubLevelStorage storageCache concurrent crash fix (Issue #20)**: 修复 `SubLevelStorage.getRegionStorageFile` 中 `Long2ObjectLinkedOpenHashMap`(storageCache)并发访问导致 `ArrayIndexOutOfBoundsException: Index -1 out of bounds for length N` 崩溃的问题。当 async-save 修复项启用时,`attemptSaveSubLevel` 在异步线程执行访问 storageCache,若主线程同时通过 `getOrLoadHoldingChunk` → `attemptLoadSubLevel` → `getRegionStorageFile` 访问 storageCache,会导致 FastUtil 链表 map 的 prev/next 指针状态损坏。新增 `SubLevelStorageRegionCacheSyncMixin`,用 `synchronized(map)` 保护 `getAndMoveToFirst`、`removeLast`、`putAndMoveToFirst` 三个链表修改操作,确保并发安全。/ Fixed `ArrayIndexOutOfBoundsException: Index -1 out of bounds for length N` crash caused by concurrent access to `Long2ObjectLinkedOpenHashMap` (storageCache) in `SubLevelStorage.getRegionStorageFile`. When async-save fix is enabled, `attemptSaveSubLevel` runs on async thread accessing storageCache; if main thread simultaneously accesses it via `getOrLoadHoldingChunk` → `attemptLoadSubLevel` → `getRegionStorageFile`, the FastUtil linked-map's prev/next pointer state gets corrupted. Added `SubLevelStorageRegionCacheSyncMixin` to protect `getAndMoveToFirst`, `removeLast`, `putAndMoveToFirst` chain-modification operations with `synchronized(map)`, ensuring concurrent safety.
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.23

1.7.23
10 авг. 2026 г.20Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.23] - 2026-08-09 ### Bug 修复 / Bug Fixes - **async-save 存档卡顿回归修复 / async-save save freeze regression fix**: 修复 v1.7.12 起的"存档时服务器卡顿"回归。v1.7.12 在 `saveAll` 返回前 join 所有异步磁盘 IO(`fucksable$awaitPendingIO`),导致主线程在每次存档时阻塞等待全部磁盘 IO(含 gzip 压缩和 `flush` 的磁盘同步)完成,表现为存档时服务器明显卡顿。改为"非阻塞提交 + 屏障 drain"模式:`saveAll` 只把磁盘 IO 提交到异步线程且不在 `saveAll` 内阻塞;`flush` 也推迟到异步线程、在本批待写 IO 完成后执行;任何后续磁盘读取(`getOrLoadHoldingChunk`)以及下一次 `saveAll` / `close` 之前先 drain(join)未完成的异步 IO,既避免主线程与异步线程并发访问非线程安全的 `regionCache`/`storageCache`,又让磁盘 IO 与主线程序列化流水线重叠。/ Fixed the "server freezes during saves" regression introduced in v1.7.12. v1.7.12 joined all async disk IO (`fucksable$awaitPendingIO`) before `saveAll` returned, blocking the main thread on every save while waiting for all disk IO (gzip compression + `flush` disk sync) to finish. Changed to a "non-blocking submit + drain barrier" model: `saveAll` only submits disk IO to the async thread and never blocks inside `saveAll`; `flush` is deferred to the async thread and runs after the current batch of pending writes; before any later disk read (`getOrLoadHoldingChunk`) and before the next `saveAll` / `close`, pending async IO is drained (joined). This keeps the non-thread-safe `regionCache`/`storageCache` from being accessed concurrently by both threads while letting disk IO overlap with main-thread serialization.
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.20

1.7.20
9 авг. 2026 г.390Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.20] - 2026-08-04 ### 重构 / Refactor - **统一日志节流代理 / Unified log throttle proxy**: 创建 `ThrottledLogger` 统一输出代理类,按 key 限制日志输出频率(默认 60 秒窗口),支持永久去重(`warnOnce`)和转发到外部 Logger(`warnTo`/`errorTo`)。删除各 mixin 中分散的节流字段和逻辑,统一改为调用 `ThrottledLogger`。/ Created `ThrottledLogger` unified output proxy class, throttles log output by key (default 60s window), supports permanent dedup (`warnOnce`) and forwarding to external Logger (`warnTo`/`errorTo`). Removed scattered throttle fields and logic across mixins, unified to use `ThrottledLogger`. - 改造的文件 / Modified files: `RapierPhysicsPipelineMixin`, `LevelDestroyBlockGuardMixin`, `FrogportItemExtractLimitMixin`, `SubLevelStorageLogSpamMixin`, `CttLogSpamFixMixin`, `RapierConstraintSelfFixMixinV1`, `RapierConstraintSelfFixMixinV2` - `RapierPhysicsPipelineMixin` 中之前未节流的 warn 调用(`readPose`、`addVelocity`、`applyImpulse`、`applyForce`、`wakeUp`、`onStatsChanged`)现在也通过 `ThrottledLogger` 节流。/ Previously unthrottled warn calls in `RapierPhysicsPipelineMixin` (`readPose`, `addVelocity`, `applyImpulse`, `applyForce`, `wakeUp`, `onStatsChanged`) are now also throttled via `ThrottledLogger`.
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.19

1.7.19
6 авг. 2026 г.878Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.19] - 2026-08-04 ### Bug 修复 / Bug Fixes - **velocity 查询警告刷屏修复 / velocity query warning spam fix**: 修复 `getLinearVelocity` 和 `getAngularVelocity` 在访问无效/已移除的物理 body 时每 tick 输出警告导致控制台刷屏的问题。改为 60 秒节流窗口,窗口内只输出一次警告,和 `teleport` 警告的处理方式一致。/ Fixed `getLinearVelocity` and `getAngularVelocity` warning spamming console every tick when accessing invalid/removed physics bodies. Changed to 60s throttle window, only logging once per window, consistent with the `teleport` warning handling.
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.18

1.7.18
2 авг. 2026 г.607Minecraft: 1.21.1neoforge
Скачать
Что нового
## v1.7.18 ### Bug 修复 / Bug Fixes - **i18n 中文乱码修复 / i18n Chinese garbled text fix**: 修复 `LanguageManager` 读写语言文件时未指定 UTF-8 字符集导致中文乱码的问题。/ Fixed `LanguageManager` not specifying UTF-8 charset when reading/writing language files, causing garbled Chinese text. ### 变更 / Changes - **硬编码中文国际化 / Hardcoded Chinese i18n**: 将 `FuckSableCommand`、`LevelSetBlockMonitorMixin`、`BlockUpdateMonitorMixin` 中的硬编码中文输出改为 i18n 调用,新增对应的翻译键到 `zh.yml` 和 `en.yml`(语言包版本升至 1.3)。/ Replaced hardcoded Chinese strings in `FuckSableCommand`, `LevelSetBlockMonitorMixin`, `BlockUpdateMonitorMixin` with i18n calls, added corresponding translation keys to `zh.yml` and `en.yml` (lang pack version bumped to 1.3). ### 历史版本累积 / Accumulated changes since v1.7.14 - **Issue #17 — Y 轴上限可配置化 / Y-axis limit configurable (Issue #17)**: `player-position-guard` 和 `physics-staff-drag-clipfix` 的 Y 轴上限从硬编码 `+1000` 改为可配置选项 `yMaxMargin`(默认 1000)。/ Changed Y-axis limit of `player-position-guard` and `physics-staff-drag-clipfix` from hardcoded `+1000` to configurable option `yMaxMargin` (default 1000). - **配置文件自动迁移 / Config file auto-migration**: 每次启动都保存配置文件,老版本升级时自动补全新选项,用户已有配置不丢失。/ Config file is saved on every startup, automatically adding new options when upgrading from older versions without losing existing user config. - **`/fucksable all reset` 命令修复 / `/fucksable all reset` command fix**: 修复 `resetFixOptions` 方法漏了处理 `all` 参数导致提示"all不是配置项"的问题。/ Fixed `resetFixOptions` method not handling the `all` argument, causing "all is not a valid fix" error.
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.14

1.7.14
1 авг. 2026 г.310Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.14] - 2026-08-01 ### 变更 / Changes - **ScalableLux 兼容性光照修复 / ScalableLux compat lighting fix (PR #16)**: 修复 `ScalableLuxCompatMixin` 中 `chunkGetter instanceof Level` 判断在 SubLevel 场景下失败导致 ScalableLux 兼容修复逻辑不执行、SubLevel 光照失效的问题。SubLevel 传入的 `LightChunkGetter` 本身可能不是 `Level` 实例(而是包装器),但 `getLevel()` 返回真正的 `Level`。改为 `chunkGetter.getLevel() instanceof Level` 后能正确识别。/ Fixed `ScalableLuxCompatMixin` `chunkGetter instanceof Level` check failing in SubLevel scenarios, causing ScalableLux compat logic to be skipped and SubLevel lighting to break. The `LightChunkGetter` passed for SubLevels may not be a `Level` instance itself (it's a wrapper), but `getLevel()` returns the real `Level`. Changed to `chunkGetter.getLevel() instanceof Level` for correct detection. - 感谢 [Variapolis](https://github.com/Variapolis) 的贡献。/ Thanks to [Variapolis](https://github.com/Variapolis) for the contribution.
alpha

Create-Aeronautics:Compatibility + Bug fixes 1.7.13

1.7.13
1 авг. 2026 г.241Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.13] - 2026-07-31 ### 变更 / Changes - **block-destroy-coordinate-guard mixin 注入失败修复 / block-destroy-coordinate-guard mixin injection failure fix (Issue #15)**: 修复 `LevelDestroyBlockGuardMixin` 中 `destroyBlock` 方法签名错误导致 mixin 注入失败、游戏启动崩溃的问题。1.21.1 中 `Level.destroyBlock` 的真实签名是 4 个参数 `destroyBlock(BlockPos, boolean, Entity, int)`,之前错误地使用了 3 个参数的签名。/ Fixed `LevelDestroyBlockGuardMixin` crash caused by incorrect `destroyBlock` method signature. In 1.21.1, `Level.destroyBlock` has 4 parameters `destroyBlock(BlockPos, boolean, Entity, int)`, but the mixin incorrectly used a 3-parameter signature.
alpha

Create-Aeronautics:Compatibility + Bug fixes 1.7.12

1.7.12
31 июл. 2026 г.92Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.12] - 2026-07-31 ### 变更 / Changes - **async-save PalettedContainer 多线程崩溃修复 / async-save PalettedContainer multithreading crash fix**: 修复 `async-save` 把整个 `saveAll` 重定向到异步线程导致 `PalettedContainer.pack` 触发 ThreadingDetector 崩溃的问题。改为统一"主线程序列化 + 异步磁盘 I/O"模式:序列化(`PalettedContainer.pack` → NBT 编码)在主线程执行,磁盘 I/O(`attemptSaveSubLevel`/`attemptSaveHoldingChunk`)提交到异步线程执行。/ 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 (`PalettedContainer.pack` → NBT encoding) runs on main thread, disk I/O (`attemptSaveSubLevel`/`attemptSaveHoldingChunk`) submitted to async thread. - 移除 c2me 特殊处理,统一行为。/ Removed c2me special handling, unified behavior. - **整数极限方块破坏坐标防护 / Integer-overflow block destruction coordinate guard (Issue #14)**: 新增 `block-destroy-coordinate-guard` 修复项,拦截 `Level.setBlock` 和 `Level.destroyBlock`,当坐标超出可配置范围(默认 X/Z ±30M, Y -512~1024)时跳过操作并记录警告(60 秒节流)。/ Added `block-destroy-coordinate-guard` fix: intercepts `Level.setBlock` and `Level.destroyBlock`, skips operations when coordinates exceed configurable limits (default X/Z ±30M, Y -512~1024) and logs throttled warnings (60s). - 坐标范围可通过 `config/fucksable/config.json` 的 `fixParams.block-destroy-coordinate-guard` 节点调整。/ Coordinate limits are configurable via `fixParams.block-destroy-coordinate-guard` in `config/fucksable/config.json`. - **修复项参数恢复命令 / Fix options reset command**: 新增 `/fucksable <fix> reset` 命令,恢复指定修复项的参数到默认值。/ Added `/fucksable <fix> reset` command to reset a fix's options to defaults.
release

Create-Aeronautics:Compatibility + Bug fixes 1.7.10

1.7.10
31 июл. 2026 г.90Minecraft: 1.21.1neoforge
Скачать
Что нового
## [1.7.10] - 2026-07-31 ### 变更 / Changes - **ScalableLux 不兼容声明绕过 / ScalableLux incompatibility declaration bypass**: 使用 NeoForge 官方的 `fml.toml` 依赖覆盖(`[dependencyOverrides]`)机制,绕过 Sable 的 `neoforge.mods.toml` 中对 ScalableLux 的 `type = "incompatible"` 声明,避免 NeoForge ModSorter 在启动阶段直接拒绝加载。/ Uses NeoForge's official `fml.toml` dependency override (`[dependencyOverrides]`) mechanism to bypass Sable's `type = "incompatible"` declaration against ScalableLux in `neoforge.mods.toml`, preventing NeoForge ModSorter from aborting startup. - fs 启动时自动检查并写入 `fml.toml`,无需用户手动配置。/ fs automatically checks and writes `fml.toml` on startup, no manual configuration required. - 替代了 v1.7.9 中复杂且易出问题的 CoreMod 方案。/ Replaces the complex and error-prone CoreMod approach from v1.7.9. - **ScalableLux 兼容性 mixin 注入修复 / ScalableLux compat mixin injection fix**: 修复 `ScalableLuxCompatMixin` 的 `@At("NEW")` target 格式不正确导致 mixin 扫描 0 个目标,simulated mod 加载时崩溃(`Scanned 0 target(s)`)。/ Fixed `ScalableLuxCompatMixin` `@At("NEW")` target format causing mixin to scan 0 targets and crash when simulated mod loads (`Scanned 0 target(s)`). - 将 target 从 `new <类名>(<描述符>)V` 改为纯类名 `net/minecraft/world/level/lighting/LevelLightEngine`。/ Changed target from `new <class>(<descriptor>)V` to plain class name `net/minecraft/world/level/lighting/LevelLightEngine`. - **控制台刷屏修复 / Console log spam fix**: 修复无物理结构时 `Attempted to teleport invalid/removed body (id=0), skipping` 警告每 tick 刷屏的问题。/ Fixed `Attempted to teleport invalid/removed body (id=0), skipping` warning spamming console every tick when no physics structures exist. - 警告改为 60 秒节流窗口,窗口内只输出一次。/ Warning now throttled to once per 60s window.