0.8.0
Compatibility
Required content
Changes
0.8.0 fixes two things that were actually broken in 0.7.3. Both were found by decompiling Sable 1.2.2 -> 2.0.6 and CC:Tweaked 1.113.1 -> 1.120.2, not from changelogs.
1. The mod refused to load with modern Sable. neoforge.mods.toml pinned sable = [1.2.2,1.2.3), while every Sable since 2026-06-13 is 2.x (current 1.21.1 build: 2.0.6). The range is now [1.2.2,2.1). Safe because SubLevelAssemblyHelper.moveBlocks and AssemblyTransform (private final Rotation rotation, apply(BlockState) -> state.rotate(...)) are identical in 1.2.2 and 2.0.6.
2. The wired network refresh never ran. The refresher looked for a field named connectionsFormed; that name exists in no CC:Tweaked 1.21.1 build (checked 1.113.1, 1.114.0, 1.114.5, 1.116.2, 1.117.1, 1.118.0, 1.119.0, 1.120.0, 1.120.2 - the real field is refreshConnections). The lookup failed, Accessors.NONE was cached and the wired half of the fix silently did nothing. It now resolves the flag from a candidate list (refreshConnections first, connectionsFormed kept as a fallback), the flag became optional, and scheduleConnectionsChanged / queueRefresh are used when present. A failed refresh logs one warning instead of staying silent. The wireless refresh always worked.
3. Mixin failure now degrades instead of crashing the server: require = 0 on all four injections, "required": false and defaultRequire: 0 in the mixin config.
4. Startup log line now reports the detected Sable / CC:Tweaked versions and which members the wired refresher resolved, so you can confirm from latest.log that it is doing something.
5. SableLevelDetector checks the known Sable sub-level class names before its name heuristic.
Nothing upstream fixes the underlying problem: in Sable 2.0.6 the transfer still places blocks before destroying the source ones, and AssemblyTransform.apply still ignores the modem enum and the six cable connection flags; CC:Tweaked 1.120.2 still derives cable shape from neighbours in updateShape. The mod is still required.
Note: this build was verified by compilation and bytecode inspection, not by an in-game run - if the wired refresh is not right for your setup, the mod now says so in the log.
В 0.8.0 починены две вещи, которые в 0.7.3 действительно не работали. Найдено декомпиляцией Sable 1.2.2 -> 2.0.6 и CC:Tweaked 1.113.1 -> 1.120.2, а не по changelog.
1. Мод отказывался грузиться с современным Sable. neoforge.mods.toml пинил sable = [1.2.2,1.2.3), а весь Sable после 2026-06-13 - это 2.x (актуальная сборка для 1.21.1: 2.0.6). Диапазон теперь [1.2.2,2.1). Это безопасно: SubLevelAssemblyHelper.moveBlocks и AssemblyTransform (private final Rotation rotation, apply(BlockState) -> state.rotate(...)) идентичны в 1.2.2 и 2.0.6.
2. Перестройка проводной сети никогда не выполнялась. Искалось поле connectionsFormed - такого имени нет ни в одной сборке CC:Tweaked для 1.21.1 (проверено 1.113.1, 1.114.0, 1.114.5, 1.116.2, 1.117.1, 1.118.0, 1.119.0, 1.120.0, 1.120.2; настоящее поле - refreshConnections). Поиск падал, кэшировался Accessors.NONE, и проводная половина фикса молча не работала. Теперь флаг ищется по списку кандидатов (сначала refreshConnections, connectionsFormed как запасной), флаг стал необязательным, используются scheduleConnectionsChanged / queueRefresh. При неудаче пишется одно предупреждение вместо молчания. Беспроводной refresh работал всегда.
3. Ошибка mixin больше не крашит сервер: require = 0 во всех четырёх инъекциях, "required": false и defaultRequire: 0 в конфиге.
4. Строка запуска сообщает найденные версии Sable / CC:Tweaked и что реально разрешил проводной refresher - видно в latest.log.
5. SableLevelDetector сначала проверяет известные имена классов суб-уровней Sable.
Наверху ничего не починено: в Sable 2.0.6 перенос по-прежнему ставит блоки до уничтожения исходных, AssemblyTransform.apply по-прежнему игнорирует перечисление modem и шесть флагов кабеля; CC:Tweaked 1.120.2 по-прежнему выводит форму кабеля из соседей в updateShape. Мод по-прежнему нужен.
Примечание: сборка проверена компиляцией и байткодом, но не запуском в игре - если проводной refresh вам не подошёл, мод теперь сам об этом напишет в логе.
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:QN3qI4QK:5hZa314F"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:QN3qI4QK:5hZa314F"
}

