From 46119603dacbf1e6394b326644db038b880c1ac3 Mon Sep 17 00:00:00 2001
From: FireOrchid <17222631+fireorchid@user.noreply.gitee.com>
Date: Sat, 8 Aug 2026 17:49:42 +0800
Subject: [PATCH 1/2] doc: Add zh-CN docs
---
.gitignore | 90 +++++++++++++++
CONTRIBUTING.zh-CN.md | 5 +
README.zh-CN.md | 49 +++++++++
changelog.zh-CN.md | 2 +
.../natives/sable_rapier/README.zh-CN.md | 2 +
wiki/Block Physics Properties.zh-CN.md | 97 +++++++++++++++++
wiki/Dimension Physics Data.zh-CN.md | 103 ++++++++++++++++++
wiki/Home.zh-CN.md | 95 ++++++++++++++++
wiki/Working with Entities.zh-CN.md | 40 +++++++
9 files changed, 483 insertions(+)
create mode 100644 CONTRIBUTING.zh-CN.md
create mode 100644 README.zh-CN.md
create mode 100644 changelog.zh-CN.md
create mode 100644 sable_rapier/src/main/resources/natives/sable_rapier/README.zh-CN.md
create mode 100644 wiki/Block Physics Properties.zh-CN.md
create mode 100644 wiki/Dimension Physics Data.zh-CN.md
create mode 100644 wiki/Home.zh-CN.md
create mode 100644 wiki/Working with Entities.zh-CN.md
diff --git a/.gitignore b/.gitignore
index 75c6db86..98260c4e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -138,3 +138,93 @@ runs/
macos/*.dmg
**/.intentionally-empty-file.o
+# AI agents and assistants
+#
+# Some common agent instruction and project configuration files are listed
+# below as commented-out examples. They are often intentionally committed and
+# shared with a team, so only uncomment them if they are local-only in your
+# project.
+
+# GEMINI.md
+# WARP.md
+# CRUSH.md
+# QWEN.md
+
+# OpenAI Codex
+AGENTS.md
+.codex/
+
+# Aider
+.aider.input.history
+.aider.chat.history.md
+.aider.llm.history
+.aider.tags.cache.v*
+# .aiderignore
+
+# Claude Code
+.claude/*.local.json
+.claude/**/*.log
+CLAUDE.local.md
+# .claude/
+
+# Gemini CLI
+gemini-debug.log
+.gemini-clipboard/
+# .gemini/
+
+# Cursor AI
+# .cursorrules
+# .cursor/
+# .cursor.json
+# .cursor-settings.yaml
+
+# Continue
+# .continue/
+# .continuerc.json
+
+# Cline
+# .cline/
+# .clinerules
+# cline.json
+
+# Other agent/editor project config
+# .warp/
+# .crush/
+# .codeium/
+# .deepseek/
+# .amazon-codewhisperer/
+# .tabnineignore
+# .tabnine/
+
+# GitHub Copilot
+# .github/copilot-instructions.md
+
+# Windsurf Editor
+# .windsurfrules
+# .windsurf/
+
+# Replit AI Development
+# .replit
+# replit.nix
+
+# Vim and Neovim
+# Swap
+[._]*.s[a-v][a-z]
+# comment out the next line if you don't need vector files
+!*.svg
+[._]*.sw[a-p]
+[._]s[a-rt-v][a-z]
+[._]ss[a-gi-z]
+[._]sw[a-p]
+
+# Session
+Session.vim
+Sessionx.vim
+
+# Temporary
+.netrwhist
+*~
+# Auto-generated tag files
+tags
+# Persistent undo
+[._]*.un~
diff --git a/CONTRIBUTING.zh-CN.md b/CONTRIBUTING.zh-CN.md
new file mode 100644
index 00000000..ac4ddc85
--- /dev/null
+++ b/CONTRIBUTING.zh-CN.md
@@ -0,0 +1,5 @@
+## 贡献
+
+当你向 Sable 提交拉取请求(PR)时,即表示你授予 [RyanHCode](https://github.com/ryanhcode) 依据 [Polyform Shield License (Version 1.0.0)](LICENSE.md) 许可你的贡献的权利,并且你不可撤销地允许 Sable 未来可能进行的、包含你贡献内容的再许可,许可方式为 [MIT 许可证](https://opensource.org/license/mit)。
+
+你提交的代码必须是你的原创作品,并且你拥有对其进行贡献的权利。
diff --git a/README.zh-CN.md b/README.zh-CN.md
new file mode 100644
index 00000000..7da08338
--- /dev/null
+++ b/README.zh-CN.md
@@ -0,0 +1,49 @@
+

+Sable
+
+
+
+Sable 是一个面向 Minecraft 的侵入式库 Mod,实现了我所设想的交互式移动方块结构,称为"子层级"(sub-levels)。子层级内包含普通的 Minecraft 区块、实体和方块实体,但存在于 Minecraft 世界中一个独立动态位置和朝向上。我的目标是尽可能最大化与子层级交互时的兼容性、性能与沉浸感,并且尽量简单。
+
+### 兼容性警告
+
+Sable 是一个侵入性极强的 Mod。它大量使用 mixin,极易与其他 Mod 产生兼容性问题。
+
+### 开发者
+
+如需添加可选且简单的兼容性,使某个 Mod 能与 Sable 协同工作,请查看 [Sable Companion](https://github.com/ryanhcode/sable-companion)。
+
+查看 [Sable 开发者 Wiki](https://github.com/ryanhcode/sable/wiki) 获取文档和指南。
+
+加入 sable zone 进行开发讨论:https://discord.gg/pnkzu2dtVA
+
+# 构建 Rust Natives
+
+1. 从 https://www.docker.com/get-started/ 或你的软件包管理器安装 Docker
+2. 运行 `gradlew common:buildImages`(只需执行一次)
+3. 运行 `gradlew common:buildRustNatives`
+
+### 致谢
+
+- Dimforge 的维护者与贡献者,感谢他们在默认物理管线中所包含的出色的 Rapier 物理引擎
+- Eriksonn,感谢他的子层级拆分区域算法、悬浮方块,以及惊人的数学魔法
+- Ocelot,感谢他出色的子层级渲染器,以及大量优化和 API 帮助
+- Cyvack,感谢他为 Create 兼容性所做的许多修复和功能、装配帮助,以及整体开发
+- BeeIsYou,感谢他的升力数学、兼容性修复、Bug 修复和大量整体开发
+- KyanBirb,感谢他的资源、兼容性修复、Bug 修复和大量整体开发
+- Cake,感谢他的 Bug 修复和整体开发帮助
+- Rhyguy1,感谢他带来的士气
+
+### 许可
+
+除非另有说明,本仓库中的全部内容均受 RyanHCode 的 [Polyform Shield License 1.0.0](LICENSE.md) 许可。
diff --git a/changelog.zh-CN.md b/changelog.zh-CN.md
new file mode 100644
index 00000000..215eb64c
--- /dev/null
+++ b/changelog.zh-CN.md
@@ -0,0 +1,2 @@
+- 修复子层级拆分(sub-level splitting)时的崩溃
+- 修复并增加了针对子层级因边界被设置为 [0,0,0,0,0,0] 而无法加载的问题的恢复机制
diff --git a/sable_rapier/src/main/resources/natives/sable_rapier/README.zh-CN.md b/sable_rapier/src/main/resources/natives/sable_rapier/README.zh-CN.md
new file mode 100644
index 00000000..b3bb350c
--- /dev/null
+++ b/sable_rapier/src/main/resources/natives/sable_rapier/README.zh-CN.md
@@ -0,0 +1,2 @@
+此文件夹中的 natives 用于 Sable 的 Rapier 物理管线。
+它们包含一个稍作修改的 Rapier 版本,可见于 https://github.com/ryanhcode/rapier (请查看 LICENSE-RAPIER)。
diff --git a/wiki/Block Physics Properties.zh-CN.md b/wiki/Block Physics Properties.zh-CN.md
new file mode 100644
index 00000000..1f4150d2
--- /dev/null
+++ b/wiki/Block Physics Properties.zh-CN.md
@@ -0,0 +1,97 @@
+Sable 按方块状态(block-state)存储与物理相关的属性。
+这些属性通过数据包(datapack)中的定义 JSON 进行配置。
+
+### 可用属性
+
+默认可用的属性包括:
+- `sable:mass` - 方块的质量,单位 `kpg`。默认 `1.0`
+- `sable:inertia` - 方块沿各轴的惯性(转动惯量)倍率,单位 `kpg*m^2`。使用前会乘以方块的质量。默认 `[1/6, 1/6, 1/6]`
+- `sable:volume` - 方块的体积,单位 `m^3`。用于浮力计算。默认 `1.0`
+- `sable:restitution` - 方块的弹性,范围 0-1。默认 `0.0`
+- `sable:friction` - 方块的摩擦倍率。默认 `1.0`
+- `sable:fragile` - 方块在受到撞击时是否应该破碎。默认 `false`
+- `sable:floating_material` - 要指定的悬浮方块材质。默认 `null`
+- `sable:floating_scale` - 悬浮方块材质的倍率。默认 `1.0`
+
+### JSON 结构
+
+方块物理属性定义 JSON 可以放在任意数据包(datapack)的 `physics_block_properties` 文件夹下。
+
+```js
+// /data/examplemod/physics_block_properties/example_block.json
+{
+ // 选择器可以是标签(tag),也可以是方块 ID。
+ // 如果使用标签,标签中的所有方块都会受到影响。
+ // 例如 `#examplemod:example_blocks` 或 `examplemod:example_block`
+ "selector": "examplemod:example_block"
+
+ // 优先级默认是 1000。
+ // 定义按照优先级升序应用
+ "priority": 1001,
+
+ "properties": {
+ // 任何属性都可以在此定义
+ "sable:mass": 2.0
+ },
+
+ "overrides": {
+ // 覆盖键是方块状态条件
+ "lit=true": {
+ // 任何属性都可以在此定义
+ // 所有满足条件的方块状态都会受到影响
+ "sable:mass": 3.0
+ }
+ }
+
+}
+```
+
+### 示例
+
+一个会弹跳的方块:
+
+```js
+// /data/examplemod/physics_block_properties/bouncy_block.json
+{
+ "selector": "examplemod:bouncy_block",
+
+ "properties": {
+ "sable:restitution": 0.5
+ }
+}
+```
+
+一个在伸出时没那么重的活塞:
+
+```js
+// /data/examplemod/physics_block_properties/piston.json
+{
+ "selector": "examplemod:piston",
+
+ "properties": {
+ "sable:mass": 1.0
+ },
+
+ "overrides": {
+ "extended=true": {
+ "sable:mass": 0.5
+ }
+ }
+}
+```
+
+### 标签(Tags)
+
+Sable 在其内置的数据包中包含了许多常用的物理方块属性标签。
+如果你的方块不需要自定义属性定义,建议将方块放入预定义的标签中:
+
+- `#sable:super_light` 质量 = 0.25
+- `#sable:light` 质量 = 0.5
+- `#sable:heavy` 质量 = 2.0
+- `#sable:super_heavy` 质量 = 4.0
+
+- `#sable:half_volume` 体积 = 0.5
+- `#sable:quarter_volume` 体积 = 0.25
+
+- `#sable:slippery` 摩擦 = 0.0
+- `#sable:bouncy` 弹性 = 0.5
diff --git a/wiki/Dimension Physics Data.zh-CN.md b/wiki/Dimension Physics Data.zh-CN.md
new file mode 100644
index 00000000..d888de66
--- /dev/null
+++ b/wiki/Dimension Physics Data.zh-CN.md
@@ -0,0 +1,103 @@
+Sable 允许数据包(datapack)为维度指定自定义物理参数。这些配置从 `/data//dimension_physics/.json` 加载。
+
+### 字段
+
+**`dimension`**(必填):此配置所适用的维度的资源位置(resource location)。
+
+**`priority`**(可选,默认 `1000`):当多个配置针对同一维度时,优先级最高的配置生效。Sable 内置的默认值使用优先级 `0`,因此任何数据包配置都会自动覆盖它们。
+
+**`base_gravity`**(可选,默认 `[0.0, -11.0, 0.0]`):重力加速度,为三维向量,单位 m/秒²。默认值以 11 m/s² 向下拉扯。
+
+**`base_pressure`**(可选,默认 `1.0`):应用于维度中所有位置的压强倍率。设为 `0` 即为真空。如果同时定义了 `pressure_function`,两者会合并。
+
+**`pressure_function`**(可选):用于控制空气压强随海拔变化的贝塞尔曲线控制点列表。每个点包含 `altitude`(y 层高度)、`value`(该高度处的压强)和 `slope`(变化速率)。省略此字段则以 `base_pressure` 保持均匀压强。
+
+**`universal_drag`**(可选,默认 `0.09`):应用于维度中所有运动的平直阻力系数。
+
+**`magnetic_north`**(可选,默认 `[0.0, 0.0, 0.0]`):指向磁北的方向向量。`[0, 0, 0]` 表示不存在磁场。
+
+### 示例
+
+一个重力更低、无阻力、无气压的月球维度:
+```js
+// /data/examplemod/dimension_physics/moon.json
+{
+ "dimension": "examplemod:moon",
+
+ // 默认优先级为 1000
+ // 优先级更高的配置"胜出"
+ "priority": 1000,
+
+ // 将重力修改为较低值
+ "base_gravity": [0.0, -4.0, 0.0],
+
+ // 无气压
+ "base_pressure": 0.0,
+
+ // 无平直阻力
+ "universal_drag": 0.0,
+
+ // 无磁北
+ "magnetic_north": [0.0, 0.0, 0.0]
+}
+```
+
+### 内置默认值
+
+Sable 会为原版维度生成这些配置。此处展示它们仅供参考,数值为近似值。
+`pressure_function` 是一条近似指数衰减的曲线,以海平面为中心,在地下被钳制为至多 1.5,并在建造上限处有 40 米的平滑下落。
+
+**主世界(Overworld)**:
+```json
+{
+ "dimension": "minecraft:overworld",
+ "priority": 0,
+ "universal_drag": 0.09,
+ "base_gravity": [0.0, -11.0, 0.0],
+ "base_pressure": 1.0,
+ "pressure_function": [
+ { "altitude": -38.366277, "value": 1.5, "slope": -0.006 },
+ { "altitude": 63.0, "value": 1.0, "slope": -0.004 },
+ { "altitude": 263.0, "value": 0.449329, "slope": -0.001797 },
+ { "altitude": 280.0, "value": 0.419786, "slope": -0.001679 },
+ { "altitude": 320.0, "value": 0.0, "slope": -0.020989 }
+ ],
+ "magnetic_north": [0.0, 0.0, 0.0]
+}
+```
+
+**下界(Nether)**:
+```json
+{
+ "dimension": "minecraft:the_nether",
+ "priority": 0,
+ "universal_drag": 0.09,
+ "base_gravity": [0.0, -11.0, 0.0],
+ "base_pressure": 1.0,
+ "pressure_function": [
+ { "altitude": 0.0, "value": 1.136553, "slope": -0.004546 },
+ { "altitude": 32.0, "value": 1.0, "slope": -0.004 },
+ { "altitude": 88.0, "value": 0.799315, "slope": -0.003197 },
+ { "altitude": 128.0, "value": 0.0, "slope": -0.039966 }
+ ],
+ "magnetic_north": [0.0, 0.0, 0.0]
+}
+```
+
+**末地(End)**:
+```json
+{
+ "dimension": "minecraft:the_end",
+ "priority": 0,
+ "universal_drag": 0.09,
+ "base_gravity": [0.0, -11.0, 0.0],
+ "base_pressure": 1.0,
+ "pressure_function": [
+ { "altitude": 0.0, "value": 1.0, "slope": -0.004 },
+ { "altitude": 200.0, "value": 0.449329, "slope": -0.001797 },
+ { "altitude": 216.0, "value": 0.421473, "slope": -0.001686 },
+ { "altitude": 256.0, "value": 0.0, "slope": -0.021074 }
+ ],
+ "magnetic_north": [0.0, 0.0, 0.0]
+}
+```
diff --git a/wiki/Home.zh-CN.md b/wiki/Home.zh-CN.md
new file mode 100644
index 00000000..bd57fbfc
--- /dev/null
+++ b/wiki/Home.zh-CN.md
@@ -0,0 +1,95 @@
+## 依赖 Sable
+[](https://maven.ryanhcode.dev/releases/dev/ryanhcode/sable/sable-common-1.21.1/)
+
+根据你的平台,将以下片段复制到你的 `build.gradle` 文件中:
+
+### NeoForge
+
+
+ 点击展开
+
+```groovy
+repositories {
+ exclusiveContent { // Sable
+ forRepository {
+ maven {
+ url = "https://maven.ryanhcode.dev/releases"
+ name = "RyanHCode Maven"
+ }
+ }
+ filter {
+ includeGroup("dev.ryanhcode.sable")
+ includeGroup("dev.ryanhcode.sable-companion")
+ }
+ }
+}
+
+dependencies {
+ api("dev.ryanhcode.sable:sable-common-${project.minecraft_version}:${project.sable_version}")
+}
+```
+
+
+
+### Fabric
+
+
+ 点击展开
+
+```groovy
+repositories {
+ exclusiveContent { // Sable
+ forRepository {
+ maven {
+ url = "https://maven.ryanhcode.dev/releases"
+ name = "RyanHCode Maven"
+ }
+ }
+ filter {
+ includeGroup("dev.ryanhcode.sable")
+ includeGroup("dev.ryanhcode.sable-companion")
+ }
+ }
+}
+
+dependencies {
+ modApi("dev.ryanhcode.sable:sable-fabric-${project.minecraft_version}:${project.sable_version}")
+}
+```
+
+
+
+### Common
+
+
+ 点击展开
+
+```groovy
+repositories {
+ exclusiveContent { // Sable
+ forRepository {
+ maven {
+ url = "https://maven.ryanhcode.dev/releases"
+ name = "RyanHCode Maven"
+ }
+ }
+ filter {
+ includeGroup("dev.ryanhcode.sable")
+ includeGroup("dev.ryanhcode.sable-companion")
+ }
+ }
+}
+
+dependencies {
+ api "dev.ryanhcode.sable:sable-common-${project.minecraft_version}:${project.sable_version}"
+}
+```
+
+
+
+### 使用 Sable
+
+- 通过 [Sable Companion](https://github.com/ryanhcode/sable-companion) 实现简单兼容
+- [与实体一起工作](https://github.com/ryanhcode/sable/wiki/Working-With-Entities)
+- [方块物理属性](https://github.com/ryanhcode/sable/wiki/Block-Physics-Properties)
+- [维度物理数据](https://github.com/ryanhcode/sable/wiki/Dimension-Physics-Data)
diff --git a/wiki/Working with Entities.zh-CN.md b/wiki/Working with Entities.zh-CN.md
new file mode 100644
index 00000000..f0898301
--- /dev/null
+++ b/wiki/Working with Entities.zh-CN.md
@@ -0,0 +1,40 @@
+## "实体踢出"(Entity Kicking)
+
+默认情况下,Sable 会将生成在子层级(sub-level)区域(plot)内的所有实体"踢出"到全局空间。
+该操作会把实体传送到其全局位置,应用来自子层级的速度,并将实体的速度和旋转从子层级坐标系中转换出来。
+
+对于某些实体,例如画或盔甲架,这种行为并不理想,预期的结果应是让实体留在子层级内部。
+因此,Sable 提供了用于自定义实体与实体踢出交互方式的标签:
+
+- `#sable:retain_in_sub_level` - 绝不将该实体从子层级中踢出。(例如:盔甲架、画)
+- `#sable:destroy_when_leaving_plot` - 当该实体位于子层级区域内、但超出了包含子层级方块的边界时,销毁该实体。
+- `#sable:destroy_with_sub_level` - 当包含该实体的子层级区域被销毁时,销毁该实体,而不是将其踢到全局世界。(例如:来自 Create 的超级胶水 Super Glue)
+
+### 示例
+
+要指定一个实体应留在子层级区域内、并且绝不被踢出:
+```js
+// /data/sable/tags/entity_type/retain_in_sub_level.json
+{
+ "replace": false,
+ "values": [
+ "examplemod:example_entity"
+ ]
+}
+```
+
+## 追踪(Tracking)
+实体可以位于子层级的区域*之外*,但仍随子层级一起移动(例如:站在子层级上的玩家,或子层级围栏里的牛)。当实体站在子层级上时,Sable 会将其标记为"追踪"该子层级。
+
+正在追踪某个子层级的实体:
+- 会相对于该子层级进行网络同步
+- 会相对于该子层级进行插值
+- 会随着子层级旋转和平移而一起移动
+
+正在追踪某个子层级的玩家,还会通过追踪点(tracking points)系统,以相对于子层级的位置进行登出和登入。
+
+Sable 提供了用于检查实体的追踪子层级的工具:
+```java
+Entity entity = ...;
+SubLevel subLevel = EntitySubLevelUtil.getTrackingSubLevel(this.entity);
+```
From 261f3a8a01068ce67f0dc25ff49aaabb113c67c7 Mon Sep 17 00:00:00 2001
From: FireOrchid <17222631+fireorchid@user.noreply.gitee.com>
Date: Sat, 8 Aug 2026 19:29:54 +0800
Subject: [PATCH 2/2] docs: Add class-level Javadoc to API, platform and mixin
classes
Add concise class-level documentation to all public API classes,
platform interfaces, core entry points, and mixin classes across
the common, fabric and neoforge modules. Comments are English-only
and describe the mixin target and intent without touching code.
---
common/src/main/java/dev/ryanhcode/sable/Sable.java | 4 ++++
common/src/main/java/dev/ryanhcode/sable/SableClient.java | 4 ++++
.../src/main/java/dev/ryanhcode/sable/SableClientConfig.java | 4 ++++
common/src/main/java/dev/ryanhcode/sable/SableConfig.java | 3 +++
.../src/main/java/dev/ryanhcode/sable/SableServerConfig.java | 3 +++
.../block/propeller/BlockEntitySubLevelPropellerActor.java | 4 ++++
.../ryanhcode/sable/api/command/SubLevelArgumentType.java | 5 +++++
.../ryanhcode/sable/api/sublevel/KinematicContraption.java | 4 ++++
.../sable/api/sublevel/ticket/SubLevelLoadingTicket.java | 4 ++++
.../sable/api/sublevel/ticket/SubLevelLoadingTicketType.java | 4 ++++
.../sable/api/sublevel/ticket/SubLevelTicketInfo.java | 3 +++
.../dev/ryanhcode/sable/mixin/AbstractSableMixinPlugin.java | 4 ++++
.../mixin/assembly/AbstractFurnaceBlockEntityMixin.java | 3 +++
.../camera_rotation/CompassItemPropertyFunctionMixin.java | 3 +++
.../sable/mixin/camera/camera_rotation/EntityMixin.java | 3 +++
.../sable/mixin/camera/camera_zoom/CameraMixin.java | 3 +++
.../sable/mixin/camera/camera_zoom/MouseHandlerMixin.java | 3 +++
.../mixin/camera/new_camera_types/GameRendererMixin.java | 3 +++
.../sable/mixin/camera/new_camera_types/MinecraftMixin.java | 3 +++
.../chunk_container_replacement/LevelChunkSectionMixin.java | 3 +++
.../sable/mixin/clip_overwrite/ClipContextMixin.java | 3 +++
.../ryanhcode/sable/mixin/clip_overwrite/EntityMixin.java | 3 +++
.../sable/mixin/command/ArgumentTypeInfosMixin.java | 3 +++
.../sable/mixin/command/ClientSuggestionProviderMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/command/DataCommandsMixin.java | 3 +++
.../compatibility/computercraft/WirelessNetworkMixin.java | 3 +++
.../mixin/compatibility/etched/StopListeningSoundMixin.java | 3 +++
.../sable/mixin/compatibility/exposure/CameraPosesMixin.java | 3 +++
.../mixin/compatibility/exposure/CameraStandEntityMixin.java | 3 +++
.../sable/mixin/compatibility/iris/ExtendedShaderMixin.java | 3 +++
.../mixin/compatibility/jade/BlockAccessorImplMixin.java | 3 +++
.../sable/mixin/compatibility/jade/RayTracingMixin.java | 3 +++
.../mixin/compatibility/jadeaddons/CreatePluginMixin.java | 3 +++
.../compatibility/shouldersurfing/EntityHelperMixin.java | 3 +++
.../compatibility/shouldersurfing/ObjectPickerMixin.java | 3 +++
.../compatibility/shouldersurfing/PerspectiveMixin.java | 3 +++
.../shouldersurfing/ShoulderSurfingCameraMixin.java | 3 +++
.../shouldersurfing/ShoulderSurfingImplMixin.java | 3 +++
.../ryanhcode/sable/mixin/compatibility/vista/LODMixin.java | 3 +++
.../mixin/compatibility/vista/ViewFinderAccessMixin.java | 3 +++
.../mixin/compatibility/vista/ViewFinderControllerMixin.java | 3 +++
.../sable/mixin/conduit/ConduitBlockEntityMixin.java | 3 +++
.../ryanhcode/sable/mixin/conduit/ConduitRendererMixin.java | 3 +++
.../ryanhcode/sable/mixin/config/GameRendererAccessor.java | 3 +++
.../sable/mixin/death_message/CombatTrackerMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/death_message/EntityMixin.java | 3 +++
.../sable/mixin/debug_render/DebugScreenOverlayMixin.java | 3 +++
.../sable/mixin/debug_render/LevelRendererMixin.java | 3 +++
.../ModelBlockRendererCacheMixin.java | 3 +++
.../dynamic_directional_shading/ModelBlockRendererMixin.java | 3 +++
.../enchanting_table/EnchantingTableBlockEntityMixin.java | 3 +++
.../sable/mixin/entity/entities_in_blocks/EntityMixin.java | 3 +++
.../entities_stick_sublevels/ClientPacketListenerMixin.java | 3 +++
.../EntityRenderDispatcherMixin.java | 3 +++
.../entity/entities_stick_sublevels/LivingEntityMixin.java | 3 +++
.../entity/entities_stick_sublevels/effects/EntityMixin.java | 3 +++
.../entities_stick_sublevels/effects/LivingEntityMixin.java | 3 +++
.../entities_stick_sublevels/effects/LocalPlayerMixin.java | 3 +++
.../packet_mixin/ClientboundMoveEntityPacketPosMixin.java | 3 +++
.../packet_mixin/ClientboundMoveEntityPacketPosRotMixin.java | 3 +++
.../packet_mixin/ClientboundTeleportEntityPacketMixin.java | 3 +++
.../entities_stick_sublevels/player/LocalPlayerMixin.java | 3 +++
.../entities_stick_sublevels/player/RemotePlayerMixin.java | 3 +++
.../player/ServerGamePacketListenerImplMixin.java | 3 +++
.../entities_stick_sublevels/player/ServerPlayerMixin.java | 3 +++
.../player/ServerboundMovePlayerPacketMixin.java | 3 +++
.../entities_turn_with_sub_levels/GameRendererMixin.java | 3 +++
.../sable/mixin/entity/entity_ai/EatBlockGoalMixin.java | 3 +++
.../mixin/entity/entity_collision/CollisionContextMixin.java | 3 +++
.../sable/mixin/entity/entity_collision/EntityMixin.java | 3 +++
.../mixin/entity/entity_interaction/ProjectileUtilMixin.java | 3 +++
.../sable/mixin/entity/entity_kicking/BlockMixin.java | 3 +++
.../mixin/entity/entity_leashing/EntityRendererMixin.java | 3 +++
.../sable/mixin/entity/entity_leashing/LeashableMixin.java | 3 +++
.../entity/entity_pathfinding/FlyNodeEvaluatorMixin.java | 3 +++
.../entity/entity_pathfinding/GroundPathNavigationMixin.java | 3 +++
.../sable/mixin/entity/entity_pathfinding/PathMixin.java | 3 +++
.../mixin/entity/entity_pathfinding/PathNavigationMixin.java | 3 +++
.../entity/entity_pathfinding/PathfindingContextMixin.java | 3 +++
.../mixin/entity/entity_pathfinding/RandomPosMixin.java | 3 +++
.../entity/entity_pathfinding/WalkNodeEvaluatorMixin.java | 3 +++
.../mixin/entity/entity_rendering/EntityRendererMixin.java | 3 +++
.../mixin/entity/entity_rendering/LevelRendererMixin.java | 3 +++
.../mixin/entity/entity_rotations_and_riding/BlockMixin.java | 3 +++
.../ClientPacketListenerMixin.java | 3 +++
.../entity/entity_rotations_and_riding/EntityMixin.java | 3 +++
.../entity_rotations_and_riding/EntityRendererMixin.java | 3 +++
.../entity/entity_rotations_and_riding/EntityTypeMixin.java | 3 +++
.../entity_rotations_and_riding/LivingEntityMixin.java | 3 +++
.../entity/entity_rotations_and_riding/LocalPlayerMixin.java | 3 +++
.../entity_rotations_and_riding/ServerEntityMixin.java | 3 +++
.../entity_rotations_and_riding/ServerPlayerMixin.java | 3 +++
.../entity_sublevel_collision/AbstractMinecartMixin.java | 3 +++
.../mixin/entity/entity_sublevel_collision/CameraMixin.java | 3 +++
.../mixin/entity/entity_sublevel_collision/EntityMixin.java | 3 +++
.../entity/entity_sublevel_collision/ItemEntityMixin.java | 3 +++
.../mixin/entity/entity_sublevel_collision/LevelMixin.java | 3 +++
.../entity/entity_sublevel_collision/LivingEntityMixin.java | 3 +++
.../mixin/entity/entity_sublevel_collision/PlayerMixin.java | 3 +++
.../ServerGamePacketListenerImplMixin.java | 3 +++
.../sable/mixin/entity/entity_swimming/CameraMixin.java | 3 +++
.../mixin/entity/entity_tracking/TrackedEntityMixin.java | 3 +++
.../mixin/entity/falling_block/FallingBlockEntityMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/entity/parrot/ParrotMixin.java | 3 +++
.../mixin/entity/server_entities_tick/ChunkMapMixin.java | 3 +++
.../mixin/entity/server_entities_tick/ServerLevelMixin.java | 3 +++
.../entity/sublevels_block_sky/SubLevelsBlockSkyMixin.java | 3 +++
.../mixin/entity/tamed_teleport/TamableAnimalMixin.java | 3 +++
.../mixin/entity/teleport_players/ServerPlayerMixin.java | 3 +++
.../sable/mixin/entity/tnt_jumps/PrimedTntMixin.java | 3 +++
.../sable/mixin/entity/trident/ThrownTridentMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/explosion/ExplosionMixin.java | 3 +++
.../ryanhcode/sable/mixin/explosion/ServerLevelMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/extension/EntityMixin.java | 3 +++
.../ryanhcode/sable/mixin/game_test/GameTestInfoMixin.java | 3 +++
.../ryanhcode/sable/mixin/game_test/StructureUtilsMixin.java | 3 +++
.../ryanhcode/sable/mixin/game_test/TestCommandMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/impact/BeehiveBlockMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/impact/BellBlockMixin.java | 3 +++
.../mixin/level_accelerator/ServerChunkCacheAccessor.java | 3 +++
.../mixin/loaded_chunk_debug/BlockUpdatePacketMixin.java | 3 +++
.../mixin/loaded_chunk_debug/ChunkBorderRendererMixin.java | 3 +++
.../loaded_chunk_debug/ClientChunkCacheStorageAccessor.java | 3 +++
.../sable/mixin/loaded_chunk_debug/LevelChunkMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/particle/BlockMarkerMixin.java | 3 +++
.../ryanhcode/sable/mixin/particle/FlameParticleMixin.java | 3 +++
.../ryanhcode/sable/mixin/particle/LevelRendererMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/particle/ParticleMixin.java | 3 +++
.../sable/mixin/particle/SuspendedParticleMixin.java | 3 +++
.../ryanhcode/sable/mixin/particle/TerrainParticleMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/physics/ServerLevelMixin.java | 3 +++
.../sable/mixin/player_freezing/LocalPlayerMixin.java | 3 +++
.../sable/mixin/player_freezing/PlayerListMixin.java | 3 +++
.../ryanhcode/sable/mixin/player_freezing/PlayerMixin.java | 3 +++
.../sable/mixin/player_freezing/ServerPlayerMixin.java | 3 +++
.../ryanhcode/sable/mixin/player_standup/PlayerMixin.java | 3 +++
.../java/dev/ryanhcode/sable/mixin/plot/MinecraftMixin.java | 3 +++
.../sable/mixin/plot/lighting/BlockAndTintGetterMixin.java | 3 +++
.../sable/mixin/plot/lighting/ClientPacketListenerMixin.java | 3 +++
.../ryanhcode/sable/mixin/plot/lighting/LevelChunkMixin.java | 3 +++
.../sable/mixin/plot/lighting/RenderChunkRegionMixin.java | 3 +++
.../sable/mixin/plot/serialization/ChunkMapMixin.java | 3 +++
.../sable/mixin/plot/serialization/LevelChunkTicksMixin.java | 3 +++
.../ryanhcode/sable/mixin/portal/NetherPortalBlockMixin.java | 3 +++
.../ryanhcode/sable/mixin/prevent_freezing/BiomeMixin.java | 3 +++
.../sable/mixin/prevent_overgrowth/VineBlockMixin.java | 3 +++
.../java/dev/ryanhcode/sable/mixin/punching/ItemInvoker.java | 3 +++
.../dev/ryanhcode/sable/mixin/punching/MinecraftMixin.java | 3 +++
.../sable/mixin/punching/MultiPlayerGameModeMixin.java | 3 +++
.../respawn_point/sleeping/LivingEntityRendererMixin.java | 3 +++
.../EuclideanGameEventListenerRegistryMixin.java | 3 +++
.../mixin/sculk_vibrations/GameEventDispatcherMixin.java | 3 +++
.../mixin/sculk_vibrations/VibrationSystemListenerMixin.java | 3 +++
.../mixin/sculk_vibrations/VibrationSystemTickerMixin.java | 3 +++
.../ryanhcode/sable/mixin/stop_rain/LevelRenderMixin.java | 3 +++
.../sublevel_render/BlockEntityRenderDispatcherMixin.java | 3 +++
.../sable/mixin/sublevel_render/LevelRendererMixin.java | 3 +++
.../sable/mixin/sublevel_render/RenderSectionAccessor.java | 3 +++
.../block_entity_render/LevelRendererMixin.java | 3 +++
.../sable/mixin/sublevel_render/fancy/ProgramMixin.java | 3 +++
.../sublevel_render/impl/sodium/LevelRendererMixin.java | 3 +++
.../impl/sodium/SodiumWorldRendererMixin.java | 3 +++
.../sublevel_render/impl/vanilla/LevelRendererMixin.java | 3 +++
.../impl/vanilla/water_occlusion/LevelRendererMixin.java | 3 +++
.../mixin/sublevel_sounds/AbstractSoundInstanceMixin.java | 3 +++
.../sable/mixin/sublevel_sounds/ChannelAccessor.java | 3 +++
.../sable/mixin/sublevel_sounds/SoundEngineMixin.java | 3 +++
.../ryanhcode/sable/mixin/toast/IntegratedServerMixin.java | 3 +++
.../ryanhcode/sable/mixin/tracking_points/EntityMixin.java | 3 +++
.../sable/mixin/tracking_points/ServerPlayerMixin.java | 3 +++
.../java/dev/ryanhcode/sable/mixin/udp/ConnectionMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/udp/MinecraftServerMixin.java | 3 +++
.../sable/mixin/udp/ServerConnectionListenerMixin.java | 3 +++
.../BitSetDiscreteVoxelShapeAccessor.java | 3 +++
.../voxel_shape_iteration/DiscreteVoxelShapeAccessor.java | 3 +++
.../sable/mixin/voxel_shape_iteration/VoxelShapeMixin.java | 3 +++
.../ryanhcode/sable/mixin/water_occlusion/CameraMixin.java | 3 +++
.../sable/mixin/water_occlusion/GameRendererMixin.java | 3 +++
.../dev/ryanhcode/sable/mixin/world_border/LevelMixin.java | 3 +++
.../ryanhcode/sable/mixin/world_border/WorldBorderMixin.java | 3 +++
.../dev/ryanhcode/sable/platform/SableAssemblyPlatform.java | 3 +++
.../ryanhcode/sable/platform/SableChunkEventPlatform.java | 3 +++
.../java/dev/ryanhcode/sable/platform/SablePlatformUtil.java | 3 +++
.../java/dev/ryanhcode/sable/platform/SablePlotPlatform.java | 3 +++
.../sable/platform/SableSubLevelRenderPlatform.java | 3 +++
.../sable/fabric/mixin/assembly/LevelChunkMixin.java | 4 ++++
.../ryanhcode/sable/fabric/mixin/assembly/LevelMixin.java | 4 ++++
.../sable/fabric/mixin/camera_rotation/CameraMixin.java | 3 +++
.../dynamic_directional_shading/SectionCompilerMixin.java | 4 ++++
.../mixin/fix_bundle_packet/ClientPacketListenerMixin.java | 4 ++++
.../fabric/mixin/sound/MovingSoundInstanceDelegateMixin.java | 4 ++++
.../mixin/block_entity_visible/LevelRendererMixin.java | 4 ++++
.../sable/neoforge/mixin/camera_rotation/CameraMixin.java | 4 ++++
.../compatibility/backpacks/BackpackPickupEventsMixin.java | 4 ++++
.../mixin/compatibility/create/airflow/AirCurrentMixin.java | 4 ++++
.../compatibility/create/airflow/FanProcessingTypeMixin.java | 4 ++++
.../create/basin_interactions/BasinBlockEntityMixin.java | 4 ++++
.../basin_interactions/BasinOperatingBlockEntityMixin.java | 4 ++++
.../behaviour_compatibility/BlockEntityBehaviourMixin.java | 4 ++++
.../BlockBreakingMovementBehaviourMixin.java | 4 ++++
.../block_breaking_behaviour/SawMovementBehaviourMixin.java | 4 ++++
.../harvester_behaviour/HarvesterMovementBehaviourMixin.java | 4 ++++
.../harvester_block_entity/HarvesterBlockEntityMixin.java | 4 ++++
.../HarvesterBlockEntityUsageMixin.java | 4 ++++
.../harvester_block_entity/HarvesterBlockMixin.java | 4 ++++
.../harvester_block_entity/HarvesterRendererMixin.java | 4 ++++
.../compatibility/create/belt/BeltBlockEntityMixin.java | 4 ++++
.../compatibility/create/belt/BeltMovementHandlerMixin.java | 4 ++++
.../create/blaze_burner/BlazeBurnerBlockEntityMixin.java | 4 ++++
.../BlockBreakingKineticBlockEntityDamageMixin.java | 4 ++++
.../compatibility/create/blueprint/BlueprintEntityMixin.java | 4 ++++
.../create/chain_conveyor/ChainConveyorBlockEntityMixin.java | 4 ++++
.../create/chain_conveyor/ChainConveyorBlockMixin.java | 4 ++++
.../create/contraptions/AbstractContraptionEntityMixin.java | 4 ++++
.../create/contraptions/ContraptionColliderMixin.java | 4 ++++
.../compatibility/create/contraptions/Matrix3dAccessor.java | 4 ++++
.../create/contraptions/VisualizationEventHandlerMixin.java | 4 ++++
.../create/crushing_wheel/CrushingWheelBlockMixin.java | 4 ++++
.../CrushingWheelControllerBlockEntityMixin.java | 4 ++++
.../create/deployer/DeployerBlockEntityMixin.java | 4 ++++
.../mixin/compatibility/create/depot/DepotRendererMixin.java | 4 ++++
.../create/display_link/ClickToLinkBlockItemMixin.java | 4 ++++
.../create/display_link/DisplayLinkBlockEntityMixin.java | 4 ++++
.../create/display_link/DisplayLinkBlockMixin.java | 4 ++++
.../compatibility/create/ejector/EjectorBlockMixin.java | 4 ++++
.../entity_falls_on_block/BeltMillstoneBlocksMixin.java | 4 ++++
.../create/entity_falls_on_block/SawBlockMixin.java | 4 ++++
.../factory_panel/FactoryPanelConnectionHandlerMixin.java | 4 ++++
.../fans_provide_force/EncasedFanBlockEntityMixin.java | 4 ++++
.../create/fluid_handling/OpenEndedPipeMixin.java | 4 ++++
.../create/fluid_handling/PipeConnectionMixin.java | 4 ++++
.../create/fluid_tank_heating/BoilerDataMixin.java | 4 ++++
.../create/flywheel/FlywheelBlockEntityMixin.java | 4 ++++
.../create/frogports/ChainConveyorBlockEntityMixin.java | 4 ++++
.../frogports/ChainConveyorInteractionHandlerMixin.java | 4 ++++
.../create/frogports/ChainConveyorRidingHandlerMixin.java | 4 ++++
.../create/frogports/ChainConveyorShapeAccessor.java | 4 ++++
.../frogports/ChainPackageInteractionHandlerMixin.java | 4 ++++
.../create/frogports/ChainPackageInteractionPacketMixin.java | 4 ++++
.../compatibility/create/frogports/FrogportBlockMixin.java | 4 ++++
.../create/frogports/PackagePortTargetMixin.java | 4 ++++
.../frogports/PackagePortTargetSelectionHandlerMixin.java | 4 ++++
.../create/frogports/SmartBlockEntityRendererMixin.java | 4 ++++
.../create/hose_pulley/HosePulleyBlockEntityMixin.java | 4 ++++
.../create/hose_pulley/HosePulleyFluidHandlerMixin.java | 4 ++++
.../create/impact/AbstractBellBlockAccessor.java | 4 ++++
.../compatibility/create/impact/AbstractBellBlockMixin.java | 4 ++++
.../CapManipulationBehaviourBaseMixin.java | 4 ++++
.../create/inventory_manipulation/ChuteBlockEntityMixin.java | 4 ++++
.../LecternControllerBlockEntityMixin.java | 4 ++++
.../lectern_controller/LecternControllerBlockMixin.java | 4 ++++
.../create/mechnical_arm/MechanicalArmBlockEntity.java | 4 ++++
.../create/mechnical_arm/MechanicalArmSublevelFailure.java | 4 ++++
.../create/nozzle/NozzleBlockEntityAccessor.java | 4 ++++
.../create/nozzle/block_entity/NozzleBEFixesMixin.java | 4 ++++
.../create/nozzle/block_entity/NozzleHoveringMixin.java | 4 ++++
.../nozzle/block_entity/ValidNozzledirectionMixin.java | 4 ++++
.../compatibility/create/particles/AirFlowParticleMixin.java | 4 ++++
.../compatibility/create/particles/AirParticleMixin.java | 4 ++++
.../create/redstone_contacts/AllBlockEntityTypesMixin.java | 4 ++++
.../create/redstone_contacts/RedstoneContactBlockMixin.java | 4 ++++
.../compatibility/create/render_fixes/AABBOutlineMixin.java | 4 ++++
.../compatibility/create/render_fixes/BeltRendererMixin.java | 4 ++++
.../create/render_fixes/BlockClusterOutlineMixin.java | 4 ++++
.../create/render_fixes/ChainConveyorRendererMixin.java | 4 ++++
.../create/render_fixes/ChasingAABBOutlineMixin.java | 4 ++++
.../create/render_fixes/ChasingAABBOutlinerMixin.java | 4 ++++
.../create/render_fixes/FilteringRendererMixin.java | 4 ++++
.../create/render_fixes/GhostBlockValueBoxMixin.java | 4 ++++
.../compatibility/create/render_fixes/LineOutlineMixin.java | 4 ++++
.../compatibility/create/render_fixes/LinkRendererMixin.java | 4 ++++
.../compatibility/create/render_fixes/OutlineMixin.java | 4 ++++
.../create/render_fixes/PlacementClientMixin.java | 4 ++++
.../create/render_fixes/SafeBlockEntityRendererMixin.java | 4 ++++
.../compatibility/create/render_fixes/ValueBoxMixin.java | 4 ++++
.../create/sails_providing_lift/SailBlockMixin.java | 4 ++++
.../compatibility/create/schematics/DeployToolMixin.java | 4 ++++
.../create/schematics/SchematicAndQuillHandlerMixin.java | 4 ++++
.../create/schematics/SchematicExportMixin.java | 4 ++++
.../create/schematics/SchematicHandlerMixin.java | 4 ++++
.../compatibility/create/schematics/SchematicLevelMixin.java | 4 ++++
.../create/schematics/SchematicPlacePacketMixin.java | 4 ++++
.../create/schematics/SchematicPrinterMixin.java | 4 ++++
.../create/schematics/SchematicRendererMixin.java | 4 ++++
.../create/schematics/SchematicToolBaseMixin.java | 4 ++++
.../create/schematics/SchematicTransformMixin.java | 4 ++++
.../create/schematics/StructureTemplateMixin.java | 4 ++++
.../create/sticker/StickerBlockEntityMixin.java | 4 ++++
.../compatibility/create/sticker/StickerBlockMixin.java | 4 ++++
.../compatibility/create/stock_ticker/EntityHatsMixin.java | 4 ++++
.../stock_ticker/StockTickerInteractionHandlerMixin.java | 4 ++++
.../mixin/compatibility/create/super_glue/LevelAccessor.java | 4 ++++
.../create/super_glue/SuperGlueEntityMixin.java | 4 ++++
.../create/tracks/CurvedTrackDestroyPacketMixin.java | 4 ++++
.../compatibility/create/tracks/TrackBlockItemMixin.java | 4 ++++
.../mixin/compatibility/create/tracks/TrackBlockMixin.java | 4 ++++
.../compatibility/create/tracks/TrackBlockOutlineMixin.java | 4 ++++
.../create/tracks/TrackGraphVisualizerMixin.java | 4 ++++
.../compatibility/create/tracks/TrackPlacementMixin.java | 4 ++++
.../create/tracks/TrackTargetingClientMixin.java | 4 ++++
.../create/trains/CarriageContraptionVisualMixin.java | 4 ++++
.../compatibility/create/turntable/TurntableBlockMixin.java | 4 ++++
.../create/wand_of_symmetry/SymmetryHandlerMixin.java | 4 ++++
.../flywheel/AbstractBlockEntityVisualMixin.java | 4 ++++
.../compatibility/flywheel/EmbeddedEnvironmentMixin.java | 4 ++++
.../mixin/compatibility/flywheel/EngineImplMixin.java | 4 ++++
.../compatibility/flywheel/EnvironmentStorageMixin.java | 4 ++++
.../mixin/compatibility/flywheel/LightStorageAccessor.java | 4 ++++
.../mixin/compatibility/flywheel/MatrixBufferMixin.java | 4 ++++
.../compatibility/flywheel/RenderDispatcherImplMixin.java | 4 ++++
.../mixin/compatibility/flywheel/ShaderSourcesMixin.java | 4 ++++
.../mixin/compatibility/flywheel/VisualManagerImplMixin.java | 4 ++++
.../compatibility/pmweather/AnemometerBlockEntityMixin.java | 4 ++++
.../mixin/compatibility/pmweather/AnemometerBlockMixin.java | 4 ++++
.../mixin/compatibility/pmweather/RadarRendererMixin.java | 4 ++++
.../mixin/compatibility/sodiumextras/EmbyToolsMixin.java | 4 ++++
.../dynamic_directional_shading/SectionCompilerMixin.java | 4 ++++
.../entities_stick_sublevels/effects/LivingEntityMixin.java | 4 ++++
.../neoforge/mixin/entity/entity_swimming/EntityMixin.java | 4 ++++
.../mixin/sound/MovingSoundInstanceDelegateMixin.java | 4 ++++
320 files changed, 1104 insertions(+)
diff --git a/common/src/main/java/dev/ryanhcode/sable/Sable.java b/common/src/main/java/dev/ryanhcode/sable/Sable.java
index 54dff6fb..d3536c23 100644
--- a/common/src/main/java/dev/ryanhcode/sable/Sable.java
+++ b/common/src/main/java/dev/ryanhcode/sable/Sable.java
@@ -24,6 +24,10 @@
import java.time.LocalDate;
import java.util.List;
+/**
+ * Common entry point for the Sable mod: mod constants, shared init, crash headers, and the default sub-level container
+ * initializer that wires up physics, tracking, and ticket-loading systems.
+ */
public final class Sable {
public static final String MOD_NAME = "Sable";
diff --git a/common/src/main/java/dev/ryanhcode/sable/SableClient.java b/common/src/main/java/dev/ryanhcode/sable/SableClient.java
index 32efaed8..72d29e51 100644
--- a/common/src/main/java/dev/ryanhcode/sable/SableClient.java
+++ b/common/src/main/java/dev/ryanhcode/sable/SableClient.java
@@ -14,6 +14,10 @@
import foundry.veil.platform.VeilEventPlatform;
import net.minecraft.client.Minecraft;
+/**
+ * Client-side entry point for the Sable mod: registers shader pre-processors, the sky-light shadow pass, gizmo
+ * handling, and the ImGui sub-level container inspector.
+ */
public class SableClient {
public static final SableClientGizmoHandler GIZMO_HANDLER = new SableClientGizmoHandler();
diff --git a/common/src/main/java/dev/ryanhcode/sable/SableClientConfig.java b/common/src/main/java/dev/ryanhcode/sable/SableClientConfig.java
index 55491dbe..9a8e046c 100644
--- a/common/src/main/java/dev/ryanhcode/sable/SableClientConfig.java
+++ b/common/src/main/java/dev/ryanhcode/sable/SableClientConfig.java
@@ -18,6 +18,10 @@
import java.util.Arrays;
+/**
+ * Client-side configuration options for Sable's rendering and networking, defined as a NeoForge
+ * {@link ModConfigSpec}. Changes are applied by {@link #onUpdate(boolean)}.
+ */
public final class SableClientConfig {
public static final ModConfigSpec SPEC;
diff --git a/common/src/main/java/dev/ryanhcode/sable/SableConfig.java b/common/src/main/java/dev/ryanhcode/sable/SableConfig.java
index 8fa1b91a..ce409d63 100644
--- a/common/src/main/java/dev/ryanhcode/sable/SableConfig.java
+++ b/common/src/main/java/dev/ryanhcode/sable/SableConfig.java
@@ -2,6 +2,9 @@
import net.neoforged.neoforge.common.ModConfigSpec;
+/**
+ * Common (server-agnostic) configuration options for Sable, defined as a NeoForge {@link ModConfigSpec}.
+ */
public final class SableConfig {
public static final ModConfigSpec SPEC;
diff --git a/common/src/main/java/dev/ryanhcode/sable/SableServerConfig.java b/common/src/main/java/dev/ryanhcode/sable/SableServerConfig.java
index 257a1241..454f43a8 100644
--- a/common/src/main/java/dev/ryanhcode/sable/SableServerConfig.java
+++ b/common/src/main/java/dev/ryanhcode/sable/SableServerConfig.java
@@ -2,6 +2,9 @@
import net.neoforged.neoforge.common.ModConfigSpec;
+/**
+ * Server-side configuration options for Sable's physics simulation, defined as a NeoForge {@link ModConfigSpec}.
+ */
public final class SableServerConfig {
public static final ModConfigSpec SPEC;
diff --git a/common/src/main/java/dev/ryanhcode/sable/api/block/propeller/BlockEntitySubLevelPropellerActor.java b/common/src/main/java/dev/ryanhcode/sable/api/block/propeller/BlockEntitySubLevelPropellerActor.java
index cf663aaa..b15ce116 100644
--- a/common/src/main/java/dev/ryanhcode/sable/api/block/propeller/BlockEntitySubLevelPropellerActor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/api/block/propeller/BlockEntitySubLevelPropellerActor.java
@@ -9,6 +9,10 @@
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3d;
+/**
+ * An interface for {@link net.minecraft.world.level.block.entity.BlockEntity} sub-classes that apply thrust to a
+ * sub-level via a {@link BlockEntityPropeller}. Forces are applied on each physics tick while the propeller is active.
+ */
public interface BlockEntitySubLevelPropellerActor extends BlockEntitySubLevelActor {
Vector3d THRUST_VECTOR = new Vector3d();
diff --git a/common/src/main/java/dev/ryanhcode/sable/api/command/SubLevelArgumentType.java b/common/src/main/java/dev/ryanhcode/sable/api/command/SubLevelArgumentType.java
index 634c51af..d5b5e7fc 100644
--- a/common/src/main/java/dev/ryanhcode/sable/api/command/SubLevelArgumentType.java
+++ b/common/src/main/java/dev/ryanhcode/sable/api/command/SubLevelArgumentType.java
@@ -33,6 +33,11 @@
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
+/**
+ * A Brigadier argument type that parses a {@link SubLevelTarget} from a command string. Supports {@code @} selectors,
+ * UUIDs, and an optional {@code static_world} target, with configurable single/multiple result and static-level
+ * permissions.
+ */
public class SubLevelArgumentType implements ArgumentType {
public static final Function NO_SUGGESTIONS = b -> b;
diff --git a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/KinematicContraption.java b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/KinematicContraption.java
index a589cc4a..77ed9022 100644
--- a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/KinematicContraption.java
+++ b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/KinematicContraption.java
@@ -13,6 +13,10 @@
import java.util.Map;
+/**
+ * A kinematic (position and orientation driven) moving structure that can be hosted on a sub-level. Provides access to
+ * the local bounds, block state, mass, pose, lift providers, and floating clusters of the contraption.
+ */
public interface KinematicContraption {
void sable$getLocalBounds(final BoundingBox3i bounds);
diff --git a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicket.java b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicket.java
index e2940118..10de4190 100644
--- a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicket.java
+++ b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicket.java
@@ -2,6 +2,10 @@
import java.util.UUID;
+/**
+ * A request to keep a specific sub-level loaded, scoped to a {@link SubLevelLoadingTicketType}. Multiple tickets can
+ * reference the same sub-level with different keys.
+ */
public record SubLevelLoadingTicket(SubLevelLoadingTicketType type, UUID subLevelId, T key) {
public String toCompactString() {
diff --git a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicketType.java b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicketType.java
index 76a74d2f..e2ce6cbd 100644
--- a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicketType.java
+++ b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelLoadingTicketType.java
@@ -10,6 +10,10 @@
import java.util.HashMap;
import java.util.Map;
+/**
+ * A registry entry describing the kind of loading ticket a sub-level can be held by, along with the codec used to
+ * serialize its key. Types are created and looked up by {@link ResourceLocation}.
+ */
public record SubLevelLoadingTicketType(ResourceLocation name, Codec codec) {
private static final Map> REGISTRY = new HashMap<>();
diff --git a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelTicketInfo.java b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelTicketInfo.java
index 8efa14c7..2476684f 100644
--- a/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelTicketInfo.java
+++ b/common/src/main/java/dev/ryanhcode/sable/api/sublevel/ticket/SubLevelTicketInfo.java
@@ -6,6 +6,9 @@
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
+/**
+ * Internal holder of the loading tickets and (optional) saved-world pointer associated with a single sub-level.
+ */
@ApiStatus.Internal
public class SubLevelTicketInfo {
private final ObjectSet> tickets = new ObjectArraySet<>();
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/AbstractSableMixinPlugin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/AbstractSableMixinPlugin.java
index 1265e07b..6d251bb7 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/AbstractSableMixinPlugin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/AbstractSableMixinPlugin.java
@@ -25,6 +25,10 @@
import java.util.List;
import java.util.Set;
+/**
+ * Base {@link IMixinConfigPlugin} used by all Sable mixin configs. Conditionally applies renderer mixins (Sodium vs
+ * vanilla) and compatibility mixins, honoring {@link MixinModVersionConstraint} version ranges on target mods.
+ */
public abstract class AbstractSableMixinPlugin implements IMixinConfigPlugin {
public static final Logger LOGGER = LogUtils.getLogger();
private final Object2BooleanMap modLoadedCache = new Object2BooleanOpenHashMap<>();
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/assembly/AbstractFurnaceBlockEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/assembly/AbstractFurnaceBlockEntityMixin.java
index 332e64e2..2180b4a7 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/assembly/AbstractFurnaceBlockEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/assembly/AbstractFurnaceBlockEntityMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity} to also clear the recipes used map when the container is cleared.
+ */
@Mixin(AbstractFurnaceBlockEntity.class)
public abstract class AbstractFurnaceBlockEntityMixin extends BaseContainerBlockEntity implements Clearable {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/CompassItemPropertyFunctionMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/CompassItemPropertyFunctionMixin.java
index 59d8c2f0..c01dc2fc 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/CompassItemPropertyFunctionMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/CompassItemPropertyFunctionMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
+/**
+ * Make the compass target angle calculation take sub-level transforms into account.
+ */
@Mixin(CompassItemPropertyFunction.class)
public abstract class CompassItemPropertyFunctionMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/EntityMixin.java
index 4b976799..26058086 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_rotation/EntityMixin.java
@@ -16,6 +16,9 @@
import java.util.function.Function;
+/**
+ * Apply the sub-level orientation to the entity's view vector calculation.
+ */
@Mixin(Entity.class)
public abstract class EntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/CameraMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/CameraMixin.java
index ea7d00d0..8b5cc9ca 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/CameraMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/CameraMixin.java
@@ -32,6 +32,9 @@
import java.util.Collection;
+/**
+ * Implement camera zoom in sub-level view, smoothly interpolating and clamping the maximum zoom distance to the sub-level bounds.
+ */
@Mixin(Camera.class)
public abstract class CameraMixin implements CameraZoomExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/MouseHandlerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/MouseHandlerMixin.java
index 3fca8f46..579bcaab 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/MouseHandlerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/camera_zoom/MouseHandlerMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Make the scroll wheel control camera zoom in sub-level view instead of cycling the hotbar.
+ */
@Mixin(MouseHandler.class)
public class MouseHandlerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/GameRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/GameRendererMixin.java
index 97e80c46..16c7353e 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/GameRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/GameRendererMixin.java
@@ -16,6 +16,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Fall back to first-person view when rendering the level if the sub-level view is invalid.
+ */
@Mixin(GameRenderer.class)
public class GameRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/MinecraftMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/MinecraftMixin.java
index a5c3628d..ba8e9f84 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/MinecraftMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/camera/new_camera_types/MinecraftMixin.java
@@ -24,6 +24,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Handle the enter and exit logic of the sub-level view when cycling camera types.
+ */
@Mixin(Minecraft.class)
public class MinecraftMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/chunk_container_replacement/LevelChunkSectionMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/chunk_container_replacement/LevelChunkSectionMixin.java
index 84e5b01c..d84ffa89 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/chunk_container_replacement/LevelChunkSectionMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/chunk_container_replacement/LevelChunkSectionMixin.java
@@ -3,6 +3,9 @@
import net.minecraft.world.level.chunk.LevelChunkSection;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.world.level.chunk.LevelChunkSection} to support replacing chunk sections inside sub-level plots.
+ */
@Mixin(LevelChunkSection.class)
public class LevelChunkSectionMixin {
}
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/ClipContextMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/ClipContextMixin.java
index 448fa45f..c56ff5da 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/ClipContextMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/ClipContextMixin.java
@@ -9,6 +9,9 @@
import java.util.function.Predicate;
+/**
+ * Mixin into {@link net.minecraft.world.level.ClipContext} to add fields allowing raytraces to ignore or restrict sub-levels, implementing {@link dev.ryanhcode.sable.mixinterface.clip_overwrite.ClipContextExtension}.
+ */
@Mixin(ClipContext.class)
public class ClipContextMixin implements ClipContextExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/EntityMixin.java
index 5b044b91..1abef99b 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/clip_overwrite/EntityMixin.java
@@ -7,6 +7,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to use an eye position that accounts for sub-level transforms during {@code pick()}.
+ */
@Mixin(Entity.class)
public class EntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/command/ArgumentTypeInfosMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/command/ArgumentTypeInfosMixin.java
index 712276b2..e5145d3a 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/command/ArgumentTypeInfosMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/command/ArgumentTypeInfosMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.commands.synchronization.ArgumentTypeInfos} to register Sable's custom command argument types.
+ */
@Mixin(ArgumentTypeInfos.class)
public abstract class ArgumentTypeInfosMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/command/ClientSuggestionProviderMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/command/ClientSuggestionProviderMixin.java
index 4ab817eb..d4317fc4 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/command/ClientSuggestionProviderMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/command/ClientSuggestionProviderMixin.java
@@ -10,6 +10,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link net.minecraft.client.multiplayer.ClientSuggestionProvider} to implement {@link dev.ryanhcode.sable.command.argument.SubLevelSuggestionProvider}, returning the sub-level under the player's crosshair.
+ */
@Mixin(ClientSuggestionProvider.class)
public class ClientSuggestionProviderMixin implements SubLevelSuggestionProvider {
@Shadow
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/command/DataCommandsMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/command/DataCommandsMixin.java
index 17e034ed..c24dd666 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/command/DataCommandsMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/command/DataCommandsMixin.java
@@ -11,6 +11,9 @@
import java.util.function.Function;
+/**
+ * Mixin into {@link net.minecraft.server.commands.data.DataCommands} to register the sub-level data accessor provider.
+ */
@Mixin(DataCommands.class)
public class DataCommandsMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/computercraft/WirelessNetworkMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/computercraft/WirelessNetworkMixin.java
index ae619d32..3da109ca 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/computercraft/WirelessNetworkMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/computercraft/WirelessNetworkMixin.java
@@ -9,6 +9,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * ComputerCraft compatibility: make the wireless transmission distance calculation in {@link WirelessNetwork#tryTransmit} account for sub-levels.
+ */
@Mixin(WirelessNetwork.class)
public class WirelessNetworkMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/etched/StopListeningSoundMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/etched/StopListeningSoundMixin.java
index 8e7cd22b..21b71f16 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/etched/StopListeningSoundMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/etched/StopListeningSoundMixin.java
@@ -5,6 +5,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Etched compatibility: make StopListeningSound implement {@link SoundInstanceDelegated} to support delegating moving sound instances in sub-levels.
+ */
@Mixin(targets = "gg.moonflower.etched.api.sound.StopListeningSound")
public class StopListeningSoundMixin implements SoundInstanceDelegated {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraPosesMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraPosesMixin.java
index e9e2caed..dbc679b1 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraPosesMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraPosesMixin.java
@@ -9,6 +9,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Exposure compatibility: project the camera stand's eye position out of the sub-level so camera poses stay correct.
+ */
@Mixin(CameraPoses.class)
public class CameraPosesMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraStandEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraStandEntityMixin.java
index c4fc79fe..a94b90e2 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraStandEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/exposure/CameraStandEntityMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Exposure compatibility: adapt the camera stand's eye position and interaction range checks to the sub-level coordinate system.
+ */
@Mixin(CameraStandEntity.class)
public abstract class CameraStandEntityMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/iris/ExtendedShaderMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/iris/ExtendedShaderMixin.java
index add5705a..ec0e8eec 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/iris/ExtendedShaderMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/iris/ExtendedShaderMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Iris compatibility: add a model matrix refresh method to {@link ExtendedShader} so sub-level render transforms take effect.
+ */
@Mixin(ExtendedShader.class)
public class ExtendedShaderMixin implements ExtendedShaderExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/BlockAccessorImplMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/BlockAccessorImplMixin.java
index 8eca919c..71b7d21a 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/BlockAccessorImplMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/BlockAccessorImplMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import snownee.jade.impl.BlockAccessorImpl;
+/**
+ * Jade compatibility: make the validation distance calculation in block access requests account for sub-levels.
+ */
@Mixin(BlockAccessorImpl.class)
public class BlockAccessorImplMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/RayTracingMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/RayTracingMixin.java
index ca77a49c..0188b062 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/RayTracingMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jade/RayTracingMixin.java
@@ -15,6 +15,9 @@
import java.util.Optional;
+/**
+ * Jade compatibility: run entity ray tracing in the sub-level local coordinate system and compute the correct distance.
+ */
@Mixin(RayTracing.class)
public class RayTracingMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jadeaddons/CreatePluginMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jadeaddons/CreatePluginMixin.java
index 57d60007..08802251 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jadeaddons/CreatePluginMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/jadeaddons/CreatePluginMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import snownee.jade.addon.create.CreatePlugin;
+/**
+ * Compatibility with Jade's Create addon: transform the player eye position and view direction into the sub-level local coordinate system.
+ */
@Mixin(CreatePlugin.class)
public class CreatePluginMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/EntityHelperMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/EntityHelperMixin.java
index 57f06e14..6a5b7778 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/EntityHelperMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/EntityHelperMixin.java
@@ -9,6 +9,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
+/**
+ * Shoulder Surfing compatibility: project the look target position out of the sub-level.
+ */
@Mixin(EntityHelper.class)
public class EntityHelperMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ObjectPickerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ObjectPickerMixin.java
index ee752b2e..b864b616 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ObjectPickerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ObjectPickerMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Shoulder Surfing compatibility: make the object picker distance calculation account for sub-levels.
+ */
@Mixin(ObjectPicker.class)
public class ObjectPickerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/PerspectiveMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/PerspectiveMixin.java
index 89e36d9c..c5973e63 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/PerspectiveMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/PerspectiveMixin.java
@@ -20,6 +20,9 @@
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Shoulder Surfing compatibility: register the sub-level perspectives and integrate them into its switching logic.
+ */
@Mixin(Perspective.class)
public class PerspectiveMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingCameraMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingCameraMixin.java
index 35f820fd..43a7d8e9 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingCameraMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingCameraMixin.java
@@ -10,6 +10,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Shoulder Surfing compatibility: make the camera zoom distance calculation account for sub-levels.
+ */
@Mixin(ShoulderSurfingCamera.class)
public class ShoulderSurfingCameraMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingImplMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingImplMixin.java
index 9383d519..815dabd1 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingImplMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/shouldersurfing/ShoulderSurfingImplMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Shoulder Surfing compatibility: skip the sub-level perspectives when cycling unless the player is inside a sub-level vehicle.
+ */
@Mixin(ShoulderSurfingImpl.class)
public class ShoulderSurfingImplMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/LODMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/LODMixin.java
index 60e2849a..4fbd3254 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/LODMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/LODMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Vista compatibility: make the LOD checks account for sub-levels by projecting the object center and transforming the plane normals.
+ */
@Mixin(LOD.class)
public class LODMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderAccessMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderAccessMixin.java
index 36f17475..4e7c172f 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderAccessMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderAccessMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Vista compatibility: make the view finder block validity distance calculation account for sub-levels.
+ */
@Mixin(ViewFinderAccess.Block.class)
public class ViewFinderAccessMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderControllerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderControllerMixin.java
index 9adc5cb8..a2ee12b8 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderControllerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/compatibility/vista/ViewFinderControllerMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Vista compatibility: apply the sub-level orientation to the camera rotation when setting up the camera.
+ */
@Mixin(ViewFinderController.class)
public class ViewFinderControllerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitBlockEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitBlockEntityMixin.java
index 14a8e149..ae83e3c9 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitBlockEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitBlockEntityMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.entity.ConduitBlockEntity} to measure the conduit effect range across sub-level poses.
+ */
@Mixin(ConduitBlockEntity.class)
public class ConduitBlockEntityMixin {
@Redirect(method = "applyEffects", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/BlockPos;closerThan(Lnet/minecraft/core/Vec3i;D)Z"))
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitRendererMixin.java
index 5c3122cf..1c8fa5a4 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/conduit/ConduitRendererMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.blockentity.ConduitRenderer} to reorient the conduit eye render to the sub-level pose.
+ */
@Mixin(ConduitRenderer.class)
public class ConduitRendererMixin {
@Inject(method = "render(Lnet/minecraft/world/level/block/entity/ConduitBlockEntity;FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;II)V",
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/config/GameRendererAccessor.java b/common/src/main/java/dev/ryanhcode/sable/mixin/config/GameRendererAccessor.java
index de8e34e2..2a860ada 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/config/GameRendererAccessor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/config/GameRendererAccessor.java
@@ -7,6 +7,9 @@
import java.util.Map;
+/**
+ * Accessor exposing the private shaders field of {@link net.minecraft.client.renderer.GameRenderer}.
+ */
@Mixin(GameRenderer.class)
public interface GameRendererAccessor {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/CombatTrackerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/CombatTrackerMixin.java
index fe41febc..438d6738 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/CombatTrackerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/CombatTrackerMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.damagesource.CombatTracker} to include the source sub-level name in fall death messages.
+ */
@Mixin(CombatTracker.class)
public class CombatTrackerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/EntityMixin.java
index 08a72bba..0a181bad 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/death_message/EntityMixin.java
@@ -9,6 +9,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to clear the last tracked sub-level when the entity lands on the ground.
+ */
@Mixin(Entity.class)
public abstract class EntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/DebugScreenOverlayMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/DebugScreenOverlayMixin.java
index aa3dc73d..898ea861 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/DebugScreenOverlayMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/DebugScreenOverlayMixin.java
@@ -14,6 +14,9 @@
import java.util.List;
+/**
+ * Mixin into {@link net.minecraft.client.gui.components.DebugScreenOverlay} to append Sable debug information to the F3 screen.
+ */
@Mixin(DebugScreenOverlay.class)
public abstract class DebugScreenOverlayMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/LevelRendererMixin.java
index 2cd51e81..4532abb0 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/debug_render/LevelRendererMixin.java
@@ -25,6 +25,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.LevelRenderer} to render sub-level bounding boxes and poses when hitboxes are shown.
+ */
@Mixin(LevelRenderer.class)
public class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererCacheMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererCacheMixin.java
index 3170c820..d41e5dd0 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererCacheMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererCacheMixin.java
@@ -5,6 +5,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.block.ModelBlockRenderer.Cache} to track whether the current block is on a sub-level, implementing {@link dev.ryanhcode.sable.mixinterface.dynamic_directional_shading.ModelBlockRendererCacheExtension}.
+ */
@Mixin(ModelBlockRenderer.Cache.class)
public class ModelBlockRendererCacheMixin implements ModelBlockRendererCacheExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererMixin.java
index b22fbc8b..a13c3972 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/dynamic_directional_shading/ModelBlockRendererMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.block.ModelBlockRenderer} to apply dynamic directional shading to blocks rendered inside sub-levels.
+ */
@Mixin(ModelBlockRenderer.class)
public class ModelBlockRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/enchanting_table/EnchantingTableBlockEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/enchanting_table/EnchantingTableBlockEntityMixin.java
index 6d54016a..c7e3a401 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/enchanting_table/EnchantingTableBlockEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/enchanting_table/EnchantingTableBlockEntityMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.entity.EnchantingTableBlockEntity} to transform player coordinates into sub-level local space for the book animation.
+ */
@Mixin(EnchantingTableBlockEntity.class)
public class EnchantingTableBlockEntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_in_blocks/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_in_blocks/EntityMixin.java
index 5a616845..29b50559 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_in_blocks/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_in_blocks/EntityMixin.java
@@ -17,6 +17,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} so entities inside sub-levels also trigger the "inside block" checks.
+ */
@Mixin(Entity.class)
public abstract class EntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/ClientPacketListenerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/ClientPacketListenerMixin.java
index b8bc2e5e..ad5b4d05 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/ClientPacketListenerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/ClientPacketListenerMixin.java
@@ -23,6 +23,9 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.client.multiplayer.ClientPacketListener} to handle custom position interpolation for entities moving or teleporting inside sub-levels.
+ */
@Mixin(ClientPacketListener.class)
public abstract class ClientPacketListenerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/EntityRenderDispatcherMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/EntityRenderDispatcherMixin.java
index 9dd2d39a..c96242af 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/EntityRenderDispatcherMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/EntityRenderDispatcherMixin.java
@@ -24,6 +24,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.entity.EntityRenderDispatcher} to render the hitbox of entities tracking sub-levels.
+ */
@Mixin(EntityRenderDispatcher.class)
public class EntityRenderDispatcherMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/LivingEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/LivingEntityMixin.java
index b54bfb91..7fa2d1e1 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/LivingEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/LivingEntityMixin.java
@@ -27,6 +27,9 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.LivingEntity} to provide sub-level position based custom interpolation and walk animation for living entities stuck to sub-levels.
+ */
@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin extends Entity implements LivingEntityStickExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/EntityMixin.java
index 0ebe8e5c..9e458acb 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/EntityMixin.java
@@ -29,6 +29,9 @@
import java.util.Optional;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to fix the particle effects spawned by entities on sub-levels and the block position below their feet.
+ */
@Mixin(Entity.class)
public abstract class EntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LivingEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LivingEntityMixin.java
index 349afa16..63b190ed 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LivingEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LivingEntityMixin.java
@@ -9,6 +9,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.entity.LivingEntity} so fall particles spawn correctly when landing on sub-level blocks.
+ */
@Mixin(LivingEntity.class)
public class LivingEntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LocalPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LocalPlayerMixin.java
index 7368e77f..f27c4e79 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LocalPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/effects/LocalPlayerMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.player.LocalPlayer} to play sounds from the local player's feet position when it has a custom orientation.
+ */
@Mixin(LocalPlayer.class)
public abstract class LocalPlayerMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosMixin.java
index 4e16623b..60523fa0 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosMixin.java
@@ -10,6 +10,9 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.network.protocol.game.ClientboundMoveEntityPacket.Pos} to add a flag marking whether the entity is actually inside a sub-level.
+ */
@Mixin(ClientboundMoveEntityPacket.Pos.class)
public class ClientboundMoveEntityPacketPosMixin implements PacketActuallyInSubLevelExtension {
/**
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosRotMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosRotMixin.java
index d10d7a29..b26022cb 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosRotMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundMoveEntityPacketPosRotMixin.java
@@ -10,6 +10,9 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.network.protocol.game.ClientboundMoveEntityPacket.PosRot} to add a flag marking whether the entity is actually inside a sub-level.
+ */
@Mixin(ClientboundMoveEntityPacket.PosRot.class)
public class ClientboundMoveEntityPacketPosRotMixin implements PacketActuallyInSubLevelExtension {
/**
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundTeleportEntityPacketMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundTeleportEntityPacketMixin.java
index 890a821f..05b82729 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundTeleportEntityPacketMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/packet_mixin/ClientboundTeleportEntityPacketMixin.java
@@ -9,6 +9,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket} to add a flag marking whether the entity is actually inside a sub-level.
+ */
@Mixin(ClientboundTeleportEntityPacket.class)
public class ClientboundTeleportEntityPacketMixin implements PacketActuallyInSubLevelExtension {
/**
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/LocalPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/LocalPlayerMixin.java
index b11fd8e2..740c7243 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/LocalPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/LocalPlayerMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.player.LocalPlayer} to send the position in sub-level local coordinates when the local player is tracking a sub-level.
+ */
@Mixin(LocalPlayer.class)
public abstract class LocalPlayerMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/RemotePlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/RemotePlayerMixin.java
index b98256e1..63c32366 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/RemotePlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/RemotePlayerMixin.java
@@ -7,6 +7,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.player.RemotePlayer} to apply the sub-level position interpolation updates to remote players.
+ */
@Mixin(RemotePlayer.class)
public abstract class RemotePlayerMixin implements LivingEntityStickExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerGamePacketListenerImplMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerGamePacketListenerImplMixin.java
index d7e9008b..302fe36f 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerGamePacketListenerImplMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerGamePacketListenerImplMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.server.network.ServerGamePacketListenerImpl} to handle sub-level tracking in player movement packets and bypass the related speed checks.
+ */
@Mixin(ServerGamePacketListenerImpl.class)
public class ServerGamePacketListenerImplMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerPlayerMixin.java
index 23a238ba..e4059091 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerPlayerMixin.java
@@ -17,6 +17,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerPlayer} to make the server player inherit the motion of the tracked sub-level each tick.
+ */
@Mixin(ServerPlayer.class)
public abstract class ServerPlayerMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerboundMovePlayerPacketMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerboundMovePlayerPacketMixin.java
index c3c2047d..94512df0 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerboundMovePlayerPacketMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_stick_sublevels/player/ServerboundMovePlayerPacketMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link net.minecraft.network.protocol.game.ServerboundMovePlayerPacket} to convert the player's movement packet position into sub-level local coordinates.
+ */
@Mixin(ServerboundMovePlayerPacket.class)
public class ServerboundMovePlayerPacketMixin implements ServerboundMovePlayerPacketExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_turn_with_sub_levels/GameRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_turn_with_sub_levels/GameRendererMixin.java
index a281335a..1c9bbf09 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_turn_with_sub_levels/GameRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entities_turn_with_sub_levels/GameRendererMixin.java
@@ -20,6 +20,9 @@
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.GameRenderer} to adjust the view as the sub-level rotates while the player stands on it.
+ */
@Mixin(GameRenderer.class)
public class GameRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_ai/EatBlockGoalMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_ai/EatBlockGoalMixin.java
index 6a1680c0..12e817c9 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_ai/EatBlockGoalMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_ai/EatBlockGoalMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.entity.ai.goal.EatBlockGoal} so mobs can eat blocks correctly while on sub-levels.
+ */
@Mixin(EatBlockGoal.class)
public class EatBlockGoalMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/CollisionContextMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/CollisionContextMixin.java
index 1a7ec557..1cfbd69e 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/CollisionContextMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/CollisionContextMixin.java
@@ -7,6 +7,9 @@
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link net.minecraft.world.phys.shapes.CollisionContext} so entities use the pre-allocated collision context.
+ */
@Mixin(CollisionContext.class)
public interface CollisionContextMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/EntityMixin.java
index a7f50295..b9ae65b7 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_collision/EntityMixin.java
@@ -6,6 +6,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to provide entities with a pre-allocated, efficient collision context.
+ */
@Mixin(Entity.class)
public class EntityMixin implements EntityExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_interaction/ProjectileUtilMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_interaction/ProjectileUtilMixin.java
index ea305630..236ab410 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_interaction/ProjectileUtilMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_interaction/ProjectileUtilMixin.java
@@ -19,6 +19,9 @@
import java.util.Optional;
+/**
+ * Mixin into {@link net.minecraft.world.entity.projectile.ProjectileUtil} so projectile hit detection accounts for sub-level position transforms.
+ */
@Mixin(ProjectileUtil.class)
public class ProjectileUtilMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_kicking/BlockMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_kicking/BlockMixin.java
index fc2b5aff..ad11b7c2 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_kicking/BlockMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_kicking/BlockMixin.java
@@ -17,6 +17,9 @@
import java.util.function.Supplier;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.Block} to transform the item entity's initial velocity when dropping items from blocks inside sub-levels.
+ */
@Mixin(Block.class)
public abstract class BlockMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/EntityRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/EntityRendererMixin.java
index 1b2de938..7478a665 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/EntityRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/EntityRendererMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.entity.EntityRenderer} so leash rendering correctly handles entities inside sub-levels.
+ */
@Mixin(EntityRenderer.class)
public class EntityRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/LeashableMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/LeashableMixin.java
index 100c4554..621c0cb6 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/LeashableMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_leashing/LeashableMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Leashable} so the leash behaviour accounts for sub-level position and velocity transforms.
+ */
@Mixin(Leashable.class)
public interface LeashableMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/FlyNodeEvaluatorMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/FlyNodeEvaluatorMixin.java
index f500e8ef..b7b4d713 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/FlyNodeEvaluatorMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/FlyNodeEvaluatorMixin.java
@@ -22,6 +22,9 @@
import java.util.List;
+/**
+ * Mixin into {@link net.minecraft.world.level.pathfinder.FlyNodeEvaluator} so flying pathfinding computes the start node in local coordinates on sub-levels.
+ */
@Mixin(FlyNodeEvaluator.class)
public abstract class FlyNodeEvaluatorMixin extends NodeEvaluator {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/GroundPathNavigationMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/GroundPathNavigationMixin.java
index 8eeb87a2..94771eb7 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/GroundPathNavigationMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/GroundPathNavigationMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.world.entity.ai.navigation.GroundPathNavigation} so ground pathfinding creates paths in local coordinates on sub-levels.
+ */
@Mixin(GroundPathNavigation.class)
public abstract class GroundPathNavigationMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathMixin.java
index 52baebcb..85aecf66 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.level.pathfinder.Path} to project path node positions on sub-levels back into global coordinates.
+ */
@Mixin(Path.class)
public class PathMixin implements PathExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathNavigationMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathNavigationMixin.java
index 4d3e63e2..aa0d3c43 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathNavigationMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathNavigationMixin.java
@@ -26,6 +26,9 @@
import java.util.Iterator;
import java.util.Set;
+/**
+ * Mixin into {@link net.minecraft.world.entity.ai.navigation.PathNavigation} to support pathfinding inside sub-levels by converting the target to local coordinates.
+ */
@Mixin(PathNavigation.class)
public abstract class PathNavigationMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathfindingContextMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathfindingContextMixin.java
index b67f3edf..2a6c5ee8 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathfindingContextMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/PathfindingContextMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.level.pathfinder.PathfindingContext} to convert the mob's position in the pathfinding context into sub-level local coordinates.
+ */
@Mixin(PathfindingContext.class)
public class PathfindingContextMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/RandomPosMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/RandomPosMixin.java
index 8779d204..bba50a00 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/RandomPosMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/RandomPosMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
+/**
+ * Mixin into {@link net.minecraft.world.entity.ai.util.RandomPos} so wandering target positions are generated in local coordinates on sub-levels.
+ */
@Mixin(RandomPos.class)
public class RandomPosMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/WalkNodeEvaluatorMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/WalkNodeEvaluatorMixin.java
index d911a733..16a21fd4 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/WalkNodeEvaluatorMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_pathfinding/WalkNodeEvaluatorMixin.java
@@ -20,6 +20,9 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.world.level.pathfinder.WalkNodeEvaluator} so walking pathfinding computes the start node in local coordinates on sub-levels.
+ */
@Mixin(WalkNodeEvaluator.class)
public abstract class WalkNodeEvaluatorMixin extends NodeEvaluator {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/EntityRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/EntityRendererMixin.java
index c0fa4744..692498b2 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/EntityRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/EntityRendererMixin.java
@@ -28,6 +28,9 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.entity.EntityRenderer} so entity light coordinates and culling checks account for sub-levels.
+ */
@Mixin(EntityRenderer.class)
public abstract class EntityRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/LevelRendererMixin.java
index b5450c09..d669e3a5 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rendering/LevelRendererMixin.java
@@ -27,6 +27,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.LevelRenderer} to render entities inside sub-levels using the sub-level's render pose.
+ */
@Mixin(LevelRenderer.class)
public class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/BlockMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/BlockMixin.java
index 4c2b9aea..f2c88f0b 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/BlockMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/BlockMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.Block} to rotate the landing velocity damping along with the entity's orientation.
+ */
@Mixin(Block.class)
public class BlockMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ClientPacketListenerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ClientPacketListenerMixin.java
index f402bf26..d04a20fb 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ClientPacketListenerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ClientPacketListenerMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.multiplayer.ClientPacketListener} to project the player position out of the sub-level when handling position correction packets.
+ */
@Mixin(ClientPacketListener.class)
public class ClientPacketListenerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityMixin.java
index 0a60981a..20a2e967 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityMixin.java
@@ -31,6 +31,9 @@
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to correctly transform entity movement, riding and saving according to the sub-level's orientation and position.
+ */
@Mixin(Entity.class)
public abstract class EntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityRendererMixin.java
index 32ffc342..3495a060 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityRendererMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.entity.EntityRenderer} to correctly orient the name tags of entities inside sub-levels.
+ */
@Mixin(EntityRenderer.class)
public class EntityRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityTypeMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityTypeMixin.java
index 1a8ac0a4..6be20d34 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityTypeMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/EntityTypeMixin.java
@@ -17,6 +17,9 @@
import java.util.function.Function;
+/**
+ * Mixin into {@link net.minecraft.world.entity.EntityType} to fix entity positions when loading and riding with sub-level vehicles.
+ */
@Mixin(EntityType.class)
public class EntityTypeMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LivingEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LivingEntityMixin.java
index 0a2ef25c..4fef31e2 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LivingEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LivingEntityMixin.java
@@ -24,6 +24,9 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.LivingEntity} to correctly transform jumping and dismounting behavior on sub-levels according to orientation.
+ */
@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin extends Entity{
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LocalPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LocalPlayerMixin.java
index 9e32066a..203b65fe 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LocalPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/LocalPlayerMixin.java
@@ -26,6 +26,9 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.client.player.LocalPlayer} to handle the local player's riding, dismounting and flight direction on sub-level vehicles.
+ */
@Mixin(LocalPlayer.class)
public abstract class LocalPlayerMixin extends Player {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerEntityMixin.java
index bb388b2c..5c3fec12 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerEntityMixin.java
@@ -13,6 +13,9 @@
import java.util.List;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerEntity} to correctly record the passenger list of entities inside sub-levels.
+ */
@Mixin(ServerEntity.class)
public abstract class ServerEntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerPlayerMixin.java
index 880d004f..5d2cc6b4 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_rotations_and_riding/ServerPlayerMixin.java
@@ -20,6 +20,9 @@
import java.util.Set;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerPlayer} to adjust the position of sent teleport packets when riding a sub-level vehicle.
+ */
@Mixin(ServerPlayer.class)
public abstract class ServerPlayerMixin extends Player {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/AbstractMinecartMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/AbstractMinecartMixin.java
index a31c7a46..845f245c 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/AbstractMinecartMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/AbstractMinecartMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.vehicle.AbstractMinecart} to destroy minecarts tagged as destroy-when-leaving-plot once they leave the sub-level plot.
+ */
@Mixin(AbstractMinecart.class)
public abstract class AbstractMinecartMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/CameraMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/CameraMixin.java
index fda99dae..bd03a87b 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/CameraMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/CameraMixin.java
@@ -17,6 +17,9 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.client.Camera} to move the camera position along with the tracked or ridden sub-level.
+ */
@Mixin(Camera.class)
public class CameraMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java
index dcd86f47..dfa58dd3 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java
@@ -39,6 +39,9 @@
import java.util.Iterator;
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to implement collision, tracking and inherited motion between entities and sub-levels.
+ */
@Mixin(value = Entity.class, priority = 1100)
public abstract class EntityMixin implements EntityMovementExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ItemEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ItemEntityMixin.java
index e3936d07..e01f8e0c 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ItemEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ItemEntityMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.world.entity.item.ItemEntity} to force item entities tracking a sub-level to run physics updates more often.
+ */
@Mixin(ItemEntity.class)
public abstract class ItemEntityMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LevelMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LevelMixin.java
index 365be2a8..fd9d716a 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LevelMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LevelMixin.java
@@ -6,6 +6,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link net.minecraft.world.level.Level} to provide a pool of reusable JOML vectors for collision computation.
+ */
@Mixin(Level.class)
public class LevelMixin implements LevelExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LivingEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LivingEntityMixin.java
index f772cf8c..3ab4cd18 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LivingEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/LivingEntityMixin.java
@@ -25,6 +25,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.LivingEntity} to handle inherited velocity and collision effects when mobs collide with sub-levels.
+ */
@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin extends Entity implements LivingEntityMovementExtension {
@Shadow public abstract LivingEntity.Fallsounds getFallSounds();
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/PlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/PlayerMixin.java
index 7db256ed..7debe52b 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/PlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/PlayerMixin.java
@@ -27,6 +27,9 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.world.entity.player.Player} to run the player's edge back-off check according to the sub-level's orientation.
+ */
@Mixin(Player.class)
public abstract class PlayerMixin extends LivingEntity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ServerGamePacketListenerImplMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ServerGamePacketListenerImplMixin.java
index 21ed4a44..ff644b78 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ServerGamePacketListenerImplMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/ServerGamePacketListenerImplMixin.java
@@ -8,6 +8,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.server.network.ServerGamePacketListenerImpl} to disable the vanilla movement check for sub-level collision.
+ */
@Mixin(ServerGamePacketListenerImpl.class)
public class ServerGamePacketListenerImplMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_swimming/CameraMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_swimming/CameraMixin.java
index 681e8c70..20ab4923 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_swimming/CameraMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_swimming/CameraMixin.java
@@ -25,6 +25,9 @@
import java.util.Arrays;
+/**
+ * Mixin into {@link net.minecraft.client.Camera} to correctly return the fog type when the camera is inside a fluid in a sub-level.
+ */
@Mixin(Camera.class)
public abstract class CameraMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_tracking/TrackedEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_tracking/TrackedEntityMixin.java
index ee8f0539..4d6b642f 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_tracking/TrackedEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_tracking/TrackedEntityMixin.java
@@ -9,6 +9,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.server.level.ChunkMap.TrackedEntity} to make server entity tracking transform the positions of entities inside sub-levels into global coordinates.
+ */
@Mixin(targets = "net.minecraft.server.level.ChunkMap$TrackedEntity")
public class TrackedEntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/falling_block/FallingBlockEntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/falling_block/FallingBlockEntityMixin.java
index 4646b14f..9ff97495 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/falling_block/FallingBlockEntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/falling_block/FallingBlockEntityMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.item.FallingBlockEntity} to make falling blocks check for landing in local coordinates on sub-levels.
+ */
@Mixin(FallingBlockEntity.class)
public abstract class FallingBlockEntityMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/parrot/ParrotMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/parrot/ParrotMixin.java
index dbd426e0..7fab5f3a 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/parrot/ParrotMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/parrot/ParrotMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.world.entity.animal.Parrot} to make parrot distance checks account for sub-levels.
+ */
@Mixin(Parrot.class)
public abstract class ParrotMixin extends ShoulderRidingEntity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ChunkMapMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ChunkMapMixin.java
index d24c1820..47837363 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ChunkMapMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ChunkMapMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.server.level.ChunkMap} to keep chunks inside plots within entity ticking range at all times.
+ */
@Mixin(ChunkMap.class)
public class ChunkMapMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ServerLevelMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ServerLevelMixin.java
index 6eabbe89..db2fa935 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ServerLevelMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/server_entities_tick/ServerLevelMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerLevel} to keep chunks inside plots within entity ticking range at all times.
+ */
@Mixin(ServerLevel.class)
public class ServerLevelMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/sublevels_block_sky/SubLevelsBlockSkyMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/sublevels_block_sky/SubLevelsBlockSkyMixin.java
index 6f38334d..02551b82 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/sublevels_block_sky/SubLevelsBlockSkyMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/sublevels_block_sky/SubLevelsBlockSkyMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Mob}, {@link net.minecraft.world.entity.ai.goal.FleeSunGoal} and {@link net.minecraft.world.entity.ai.navigation.GroundPathNavigation} to make sub-levels block the sky, affecting the relevant logic.
+ */
@Mixin({Mob.class, FleeSunGoal.class, GroundPathNavigation.class})
public class SubLevelsBlockSkyMixin {
@WrapOperation(method = "*", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;canSeeSky(Lnet/minecraft/core/BlockPos;)Z"))
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tamed_teleport/TamableAnimalMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tamed_teleport/TamableAnimalMixin.java
index 81cd05a8..d969b599 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tamed_teleport/TamableAnimalMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tamed_teleport/TamableAnimalMixin.java
@@ -16,6 +16,9 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.entity.TamableAnimal} to make tamed animals consider sub-levels when teleporting to their owner.
+ */
@Mixin(TamableAnimal.class)
public class TamableAnimalMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/teleport_players/ServerPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/teleport_players/ServerPlayerMixin.java
index d753c5e5..a895f228 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/teleport_players/ServerPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/teleport_players/ServerPlayerMixin.java
@@ -12,6 +12,9 @@
import java.util.Set;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerPlayer} to project coordinates from sub-levels to the global frame when the player teleports.
+ */
@Mixin(ServerPlayer.class)
public abstract class ServerPlayerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tnt_jumps/PrimedTntMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tnt_jumps/PrimedTntMixin.java
index cead44b5..348e278a 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tnt_jumps/PrimedTntMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/tnt_jumps/PrimedTntMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.item.PrimedTnt} to convert the initial velocity of TNT spawned inside a sub-level into local coordinates.
+ */
@Mixin(PrimedTnt.class)
public abstract class PrimedTntMixin extends Entity {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/trident/ThrownTridentMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/trident/ThrownTridentMixin.java
index a39bb4ee..03d494bb 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/trident/ThrownTridentMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/trident/ThrownTridentMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.projectile.ThrownTrident} to kick tridents out of sub-levels when they start returning.
+ */
@Mixin(ThrownTrident.class)
public abstract class ThrownTridentMixin extends Entity {
public ThrownTridentMixin(final EntityType> entityType, final Level level) {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ExplosionMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ExplosionMixin.java
index 559aef5c..0bed6ef4 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ExplosionMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ExplosionMixin.java
@@ -38,6 +38,9 @@
import java.util.Optional;
import java.util.Set;
+/**
+ * Mixin into {@link net.minecraft.world.level.Explosion} to propagate blast rays into sub-levels in local space and apply impulses to the physics system.
+ */
@Mixin(Explosion.class)
public class ExplosionMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ServerLevelMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ServerLevelMixin.java
index 73005ac9..e1ca8685 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ServerLevelMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/explosion/ServerLevelMixin.java
@@ -16,6 +16,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerLevel} to project explosion positions out of sub-level space before exploding.
+ */
@Mixin(ServerLevel.class)
public abstract class ServerLevelMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/extension/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/extension/EntityMixin.java
index 3743af7b..0d678bd3 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/extension/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/extension/EntityMixin.java
@@ -8,6 +8,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to implement {@link dev.ryanhcode.sable.mixinterface.EntityExtension}, exposing raw position setting and the vanilla collide method.
+ */
@Mixin(Entity.class)
public abstract class EntityMixin implements EntityExtension {
@Shadow
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/GameTestInfoMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/GameTestInfoMixin.java
index 7808b3ec..6c5549bc 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/GameTestInfoMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/GameTestInfoMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.gametest.framework.GameTestInfo} to remove intersecting sub-levels when a game test succeeds.
+ */
@Mixin(GameTestInfo.class)
public abstract class GameTestInfoMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/StructureUtilsMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/StructureUtilsMixin.java
index 9d9ec196..c41c2907 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/StructureUtilsMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/StructureUtilsMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.gametest.framework.StructureUtils} to remove sub-levels when clearing space for a structure.
+ */
@Mixin(StructureUtils.class)
public class StructureUtilsMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/TestCommandMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/TestCommandMixin.java
index 2d2db457..1ae6c495 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/TestCommandMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/game_test/TestCommandMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.gametest.framework.TestCommand} to remove intersecting sub-levels when a game test is reset.
+ */
@Mixin(TestCommand.class)
public class TestCommandMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BeehiveBlockMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BeehiveBlockMixin.java
index 72577842..20fb9c9b 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BeehiveBlockMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BeehiveBlockMixin.java
@@ -6,6 +6,9 @@
import net.minecraft.world.level.block.BeehiveBlock;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.BeehiveBlock} to attach its sub-level collision callback.
+ */
@Mixin(BeehiveBlock.class)
public abstract class BeehiveBlockMixin implements BlockWithSubLevelCollisionCallback {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BellBlockMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BellBlockMixin.java
index 669f23f4..2c82ac77 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BellBlockMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/impact/BellBlockMixin.java
@@ -6,6 +6,9 @@
import net.minecraft.world.level.block.BellBlock;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.BellBlock} to attach its sub-level collision callback.
+ */
@Mixin(BellBlock.class)
public abstract class BellBlockMixin implements BlockWithSubLevelCollisionCallback {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/level_accelerator/ServerChunkCacheAccessor.java b/common/src/main/java/dev/ryanhcode/sable/mixin/level_accelerator/ServerChunkCacheAccessor.java
index ef13a107..a286041e 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/level_accelerator/ServerChunkCacheAccessor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/level_accelerator/ServerChunkCacheAccessor.java
@@ -5,6 +5,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
+/**
+ * Invoker exposing the private getVisibleChunkIfPresent method of {@link net.minecraft.server.level.ServerChunkCache}.
+ */
@Mixin(ServerChunkCache.class)
public interface ServerChunkCacheAccessor {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/BlockUpdatePacketMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/BlockUpdatePacketMixin.java
index 16f52858..be4ff115 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/BlockUpdatePacketMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/BlockUpdatePacketMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket} to mark the affected chunk as updated for the loaded chunk debug overlay.
+ */
@Mixin(ClientboundBlockUpdatePacket.class)
public class BlockUpdatePacketMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ChunkBorderRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ChunkBorderRendererMixin.java
index a719b7c2..32c8791c 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ChunkBorderRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ChunkBorderRendererMixin.java
@@ -10,6 +10,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.debug.ChunkBorderRenderer} to render the loaded chunk debug overlay when enabled.
+ */
@Mixin(ChunkBorderRenderer.class)
public class ChunkBorderRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ClientChunkCacheStorageAccessor.java b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ClientChunkCacheStorageAccessor.java
index 0fdd1317..4b809486 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ClientChunkCacheStorageAccessor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/ClientChunkCacheStorageAccessor.java
@@ -6,6 +6,9 @@
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.concurrent.atomic.AtomicReferenceArray;
+/**
+ * Accessor exposing the private chunks array of {@link net.minecraft.client.multiplayer.ClientChunkCache.Storage}.
+ */
@Mixin(ClientChunkCache.Storage.class)
public interface ClientChunkCacheStorageAccessor {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/LevelChunkMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/LevelChunkMixin.java
index 5f0da22b..f96ad36c 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/LevelChunkMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/loaded_chunk_debug/LevelChunkMixin.java
@@ -5,6 +5,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link net.minecraft.world.level.chunk.LevelChunk} to implement {@link dev.ryanhcode.sable.mixinterface.loaded_chunk_debug.DebugLevelChunkExtension}, tracking the last update time for the debug overlay.
+ */
@Mixin(LevelChunk.class)
public class LevelChunkMixin implements DebugLevelChunkExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/BlockMarkerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/BlockMarkerMixin.java
index 28e97619..29d658ed 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/BlockMarkerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/BlockMarkerMixin.java
@@ -4,6 +4,9 @@
import net.minecraft.client.particle.BlockMarker;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.client.particle.BlockMarker} to keep block marker particles from being kicked out of sub-level tracking and from colliding with the tracked sub-level.
+ */
@Mixin(BlockMarker.class)
public class BlockMarkerMixin implements ParticleSubLevelKickable {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/FlameParticleMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/FlameParticleMixin.java
index b95cb3ef..114026bc 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/FlameParticleMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/FlameParticleMixin.java
@@ -13,6 +13,9 @@
import org.joml.Vector3dc;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.client.particle.FlameParticle} to make flame particles move along with their tracked sub-level.
+ */
@Mixin(FlameParticle.class)
public abstract class FlameParticleMixin extends Particle implements ParticleExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/LevelRendererMixin.java
index 7dd2bcbd..dc638db7 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/LevelRendererMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.LevelRenderer} to make the distance check when adding particles account for sub-levels.
+ */
@Mixin(LevelRenderer.class)
public class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/ParticleMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/ParticleMixin.java
index a9e201ab..3ffb6892 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/ParticleMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/ParticleMixin.java
@@ -44,6 +44,9 @@
import java.util.List;
+/**
+ * Mixin into {@link net.minecraft.client.particle.Particle} to add sub-level tracking, movement, collision and light color support to particles.
+ */
@Mixin(Particle.class)
public abstract class ParticleMixin implements ParticleExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/SuspendedParticleMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/SuspendedParticleMixin.java
index e0badc3f..2f0838e5 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/SuspendedParticleMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/SuspendedParticleMixin.java
@@ -8,6 +8,9 @@
import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.client.particle.SuspendedParticle} to keep suspended particles from being kicked out of sub-level tracking and to remove them when occluded by water.
+ */
@Mixin(SuspendedParticle.class)
public abstract class SuspendedParticleMixin extends Particle implements ParticleSubLevelKickable {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/TerrainParticleMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/TerrainParticleMixin.java
index 4f552c75..f3f510f7 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/particle/TerrainParticleMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/particle/TerrainParticleMixin.java
@@ -21,6 +21,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.client.particle.TerrainParticle} to scale the light color of terrain particles when inside a sub-level.
+ */
@Mixin(TerrainParticle.class)
public abstract class TerrainParticleMixin extends Particle {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/physics/ServerLevelMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/physics/ServerLevelMixin.java
index 4ab4c74f..5030b4e8 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/physics/ServerLevelMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/physics/ServerLevelMixin.java
@@ -5,6 +5,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerLevel} to implement {@link dev.ryanhcode.sable.mixinterface.physics.ServerLevelSceneExtension}, holding the physics scene ID.
+ */
@Mixin(ServerLevel.class)
public class ServerLevelMixin implements ServerLevelSceneExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/LocalPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/LocalPlayerMixin.java
index 8ac46679..eec27aa2 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/LocalPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/LocalPlayerMixin.java
@@ -14,6 +14,9 @@
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.client.player.LocalPlayer} to freeze client ticking while frozen to a sub-level that is not yet finalized.
+ */
@Mixin(LocalPlayer.class)
public abstract class LocalPlayerMixin extends Player implements PlayerFreezeExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerListMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerListMixin.java
index 0d3d6a90..cec63ba5 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerListMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerListMixin.java
@@ -17,6 +17,9 @@
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.server.players.PlayerList} to send the freeze packet on join and carry the frozen state across respawns.
+ */
@Mixin(PlayerList.class)
public class PlayerListMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerMixin.java
index 0d98116c..be1589f9 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/PlayerMixin.java
@@ -20,6 +20,9 @@
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.world.entity.player.Player} to implement {@link dev.ryanhcode.sable.mixinterface.player_freezing.PlayerFreezeExtension}, managing the frozen-to sub-level state and teleporting on finalization.
+ */
@Mixin(Player.class)
public abstract class PlayerMixin extends Entity implements PlayerFreezeExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/ServerPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/ServerPlayerMixin.java
index 58be3f01..80dfad44 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/ServerPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/player_freezing/ServerPlayerMixin.java
@@ -17,6 +17,9 @@
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerPlayer} to keep frozen players tracked to their sub-level and teleport them once it becomes available.
+ */
@Mixin(ServerPlayer.class)
public abstract class ServerPlayerMixin extends Player implements PlayerFreezeExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/player_standup/PlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/player_standup/PlayerMixin.java
index c92d306d..77210f06 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/player_standup/PlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/player_standup/PlayerMixin.java
@@ -10,6 +10,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.entity.player.Player} to also check sub-level blocks when determining whether a player can stand up.
+ */
@Mixin(Player.class)
public class PlayerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/MinecraftMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/MinecraftMixin.java
index 1f6bcd7e..ef77e3a2 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/MinecraftMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/MinecraftMixin.java
@@ -11,6 +11,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Runs the network event queue and advances the plot container during the client tick.
+ */
@Mixin(Minecraft.class)
public class MinecraftMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/BlockAndTintGetterMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/BlockAndTintGetterMixin.java
index 888e5bb5..e3293aa3 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/BlockAndTintGetterMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/BlockAndTintGetterMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Makes brightness queries inside plots use the plot's own light engine.
+ */
@Mixin(BlockAndTintGetter.class)
public interface BlockAndTintGetterMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/ClientPacketListenerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/ClientPacketListenerMixin.java
index efc4ecb7..61774089 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/ClientPacketListenerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/ClientPacketListenerMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Makes chunk light updates inside plots run immediately when their packets are received.
+ */
@Mixin(ClientPacketListener.class)
public class ClientPacketListenerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/LevelChunkMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/LevelChunkMixin.java
index 50deb318..44efd193 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/LevelChunkMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/LevelChunkMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Makes block updates of chunks inside plots use the plot's light engine.
+ */
@Mixin(LevelChunk.class)
public class LevelChunkMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/RenderChunkRegionMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/RenderChunkRegionMixin.java
index 3265582b..f08bec17 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/RenderChunkRegionMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/lighting/RenderChunkRegionMixin.java
@@ -8,6 +8,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Makes render chunk regions implement {@link SubLevelContainerHolder}, exposing their plot container.
+ */
@Mixin(RenderChunkRegion.class)
public class RenderChunkRegionMixin implements SubLevelContainerHolder {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/ChunkMapMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/ChunkMapMixin.java
index e4ace63a..bcf4920c 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/ChunkMapMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/ChunkMapMixin.java
@@ -29,6 +29,9 @@
import java.util.concurrent.Executor;
import java.util.function.Supplier;
+/**
+ * Makes the chunk map use a concurrent unload queue and syncs chunk status changes to the sub-level storage.
+ */
@Mixin(ChunkMap.class)
public class ChunkMapMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/LevelChunkTicksMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/LevelChunkTicksMixin.java
index 099f384a..740542f0 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/LevelChunkTicksMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/plot/serialization/LevelChunkTicksMixin.java
@@ -12,6 +12,9 @@
import java.util.List;
import java.util.Set;
+/**
+ * Provides {@link LevelChunkTicks} with the ability to copy scheduled ticks, used for sub-level chunk serialization.
+ */
@Mixin(LevelChunkTicks.class)
public class LevelChunkTicksMixin implements LevelChunkTicksExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/portal/NetherPortalBlockMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/portal/NetherPortalBlockMixin.java
index 87eca100..250a8641 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/portal/NetherPortalBlockMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/portal/NetherPortalBlockMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.NetherPortalBlock} to compute portal destinations from coordinates projected out of sub-level space.
+ */
@Mixin(NetherPortalBlock.class)
public class NetherPortalBlockMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_freezing/BiomeMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_freezing/BiomeMixin.java
index 6842e50c..dcb3dec3 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_freezing/BiomeMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_freezing/BiomeMixin.java
@@ -12,6 +12,9 @@
import net.minecraft.world.level.biome.Biome;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.world.level.biome.Biome} to prevent water from freezing beneath sub-level blocks projected into the same space.
+ */
@Mixin(Biome.class)
public class BiomeMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_overgrowth/VineBlockMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_overgrowth/VineBlockMixin.java
index 590f7755..ba9f3036 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_overgrowth/VineBlockMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/prevent_overgrowth/VineBlockMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.level.block.VineBlock} to stop vines growing inside a sub-level from spreading beyond its plot bounds.
+ */
@Mixin(VineBlock.class)
public class VineBlockMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/punching/ItemInvoker.java b/common/src/main/java/dev/ryanhcode/sable/mixin/punching/ItemInvoker.java
index 175ac27e..17a15c42 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/punching/ItemInvoker.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/punching/ItemInvoker.java
@@ -8,6 +8,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
+/**
+ * Invoker exposing the static private getPlayerPOVHitResult method of {@link net.minecraft.world.item.Item}.
+ */
@Mixin(Item.class)
public interface ItemInvoker {
@Invoker("getPlayerPOVHitResult")
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MinecraftMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MinecraftMixin.java
index 009a7da4..ae7a5a40 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MinecraftMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MinecraftMixin.java
@@ -17,6 +17,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.client.Minecraft} to attempt a sub-level paddle punch when attacking with a paddle item.
+ */
@Mixin(Minecraft.class)
public abstract class MinecraftMixin {
@Shadow
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MultiPlayerGameModeMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MultiPlayerGameModeMixin.java
index cfcbc2e8..f04c4fba 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MultiPlayerGameModeMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/punching/MultiPlayerGameModeMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.client.multiplayer.MultiPlayerGameMode} to also try punching sub-level blocks when starting to destroy a block.
+ */
@Mixin(MultiPlayerGameMode.class)
public class MultiPlayerGameModeMixin {
@Shadow
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/respawn_point/sleeping/LivingEntityRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/respawn_point/sleeping/LivingEntityRendererMixin.java
index 6a103932..82ef0a03 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/respawn_point/sleeping/LivingEntityRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/respawn_point/sleeping/LivingEntityRendererMixin.java
@@ -17,6 +17,9 @@
import java.util.Optional;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.entity.LivingEntityRenderer} to rotate a sleeping entity's render pose into the sub-level orientation.
+ */
@Mixin(LivingEntityRenderer.class)
public class LivingEntityRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/EuclideanGameEventListenerRegistryMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/EuclideanGameEventListenerRegistryMixin.java
index 25bb103f..4ab32271 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/EuclideanGameEventListenerRegistryMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/EuclideanGameEventListenerRegistryMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.world.level.gameevent.EuclideanGameEventListenerRegistry} to compute listener distances across sub-level poses.
+ */
@Mixin(EuclideanGameEventListenerRegistry.class)
public class EuclideanGameEventListenerRegistryMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/GameEventDispatcherMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/GameEventDispatcherMixin.java
index 5879161a..61a033fa 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/GameEventDispatcherMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/GameEventDispatcherMixin.java
@@ -25,6 +25,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.level.gameevent.GameEventDispatcher} to propagate game events into intersecting sub-levels with local-space positions and bounds.
+ */
@Mixin(GameEventDispatcher.class)
public class GameEventDispatcherMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemListenerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemListenerMixin.java
index 7b2adcc5..da039932 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemListenerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemListenerMixin.java
@@ -13,6 +13,9 @@
import net.minecraft.world.phys.Vec3;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.minecraft.world.level.gameevent.vibrations.VibrationSystem.Listener} to project vibration positions into global space and check occlusion across sub-levels.
+ */
@Mixin(VibrationSystem.Listener.class)
public class VibrationSystemListenerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemTickerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemTickerMixin.java
index 1f174211..6841113e 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemTickerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sculk_vibrations/VibrationSystemTickerMixin.java
@@ -16,6 +16,9 @@
import java.util.Optional;
+/**
+ * Mixin into {@link net.minecraft.world.level.gameevent.vibrations.VibrationSystem.Ticker} to project vibration positions and destination sources into global space.
+ */
@Mixin(VibrationSystem.Ticker.class)
public interface VibrationSystemTickerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/stop_rain/LevelRenderMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/stop_rain/LevelRenderMixin.java
index f17ef5b7..c28a9c6e 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/stop_rain/LevelRenderMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/stop_rain/LevelRenderMixin.java
@@ -19,6 +19,9 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.LevelRenderer} to include sub-level blocks when computing the height used for rain and splash rendering.
+ */
@Mixin(LevelRenderer.class)
public class LevelRenderMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/BlockEntityRenderDispatcherMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/BlockEntityRenderDispatcherMixin.java
index c9b9bd96..06595fac 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/BlockEntityRenderDispatcherMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/BlockEntityRenderDispatcherMixin.java
@@ -15,6 +15,9 @@
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Makes block entity render light colors account for sub-levels and uses the sub-level local camera position for visibility checks.
+ */
@Mixin(BlockEntityRenderDispatcher.class)
public abstract class BlockEntityRenderDispatcherMixin implements BlockEntityRenderDispatcherExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/LevelRendererMixin.java
index b22388f2..33c87178 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/LevelRendererMixin.java
@@ -19,6 +19,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Rebuilds and renders sub-level data during the level render pipeline.
+ */
@Mixin(LevelRenderer.class)
public class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/RenderSectionAccessor.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/RenderSectionAccessor.java
index ac7a9c4f..f3722b15 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/RenderSectionAccessor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/RenderSectionAccessor.java
@@ -7,6 +7,9 @@
import java.util.Set;
+/**
+ * Exposes an accessor for the global block entity set of {@link SectionRenderDispatcher.RenderSection}.
+ */
@Mixin(SectionRenderDispatcher.RenderSection.class)
public interface RenderSectionAccessor {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/block_entity_render/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/block_entity_render/LevelRendererMixin.java
index 95944a70..85f78048 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/block_entity_render/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/block_entity_render/LevelRendererMixin.java
@@ -39,6 +39,9 @@
import java.util.List;
import java.util.SortedSet;
+/**
+ * Renders block entities inside sub-levels with the sub-level transform when rendering the level.
+ */
@Mixin(LevelRenderer.class)
public class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/fancy/ProgramMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/fancy/ProgramMixin.java
index 9b7f37f7..cb0a2fba 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/fancy/ProgramMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/fancy/ProgramMixin.java
@@ -7,6 +7,9 @@
import static org.lwjgl.opengl.GL20C.glGetShaderSource;
+/**
+ * Provides {@link Program} with shader source access for fancy rendering parsing.
+ */
@Mixin(Program.class)
public class ProgramMixin implements ProgramExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/LevelRendererMixin.java
index a8da06ce..1bcc2dda 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/LevelRendererMixin.java
@@ -16,6 +16,9 @@
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * On the Sodium render path, makes the chunk compiled-state check apply to chunks inside sub-levels.
+ */
@Mixin(value = LevelRenderer.class, priority = 1002)
public class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java
index 07f5587b..aabd0718 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/sodium/SodiumWorldRendererMixin.java
@@ -35,6 +35,9 @@
import java.util.List;
import java.util.Objects;
+/**
+ * On the Sodium render path, wires sub-levels into terrain building, culling and chunk layer rendering.
+ */
@Mixin(value = SodiumWorldRenderer.class, remap = false)
public abstract class SodiumWorldRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/LevelRendererMixin.java
index faf750d6..398996c2 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/LevelRendererMixin.java
@@ -37,6 +37,9 @@
import java.util.Objects;
+/**
+ * On the vanilla render path, wires sub-levels into chunk compilation, culling and chunk layer rendering.
+ */
@Mixin(value = LevelRenderer.class, priority = 1002) // Higher priority to go after Flywheel
public abstract class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/water_occlusion/LevelRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/water_occlusion/LevelRendererMixin.java
index 68fafa3c..af3a5a95 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/water_occlusion/LevelRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_render/impl/vanilla/water_occlusion/LevelRendererMixin.java
@@ -12,6 +12,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Routes translucent chunk layer rendering through the water occlusion renderer to implement sub-level water occlusion.
+ */
@Mixin(LevelRenderer.class)
public class LevelRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/AbstractSoundInstanceMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/AbstractSoundInstanceMixin.java
index 0640a958..0b912d61 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/AbstractSoundInstanceMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/AbstractSoundInstanceMixin.java
@@ -6,6 +6,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link net.minecraft.client.resources.sounds.AbstractSoundInstance} to implement {@link dev.ryanhcode.sable.sound.SoundInstanceDelegated}, holding a moving sound delegate.
+ */
@Mixin(AbstractSoundInstance.class)
public class AbstractSoundInstanceMixin implements SoundInstanceDelegated {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/ChannelAccessor.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/ChannelAccessor.java
index 48c484e8..144c0d31 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/ChannelAccessor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/ChannelAccessor.java
@@ -4,6 +4,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
+/**
+ * Accessor exposing the private source field of {@link com.mojang.blaze3d.audio.Channel}.
+ */
@Mixin(Channel.class)
public interface ChannelAccessor {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/SoundEngineMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/SoundEngineMixin.java
index 9f3d7d54..8744e5ab 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/SoundEngineMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/sublevel_sounds/SoundEngineMixin.java
@@ -21,6 +21,9 @@
import java.util.Iterator;
+/**
+ * Mixin into {@link net.minecraft.client.sounds.SoundEngine} to wrap sounds inside sub-levels in a moving delegate that follows the sub-level's motion.
+ */
@Mixin(SoundEngine.class)
public class SoundEngineMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/toast/IntegratedServerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/toast/IntegratedServerMixin.java
index 2b3cc916..bf4d2212 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/toast/IntegratedServerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/toast/IntegratedServerMixin.java
@@ -14,6 +14,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link net.minecraft.client.server.IntegratedServer} to implement {@link dev.ryanhcode.sable.mixinterface.toast.SableToastableServer}, showing toasts for sub-level load/save/physics failures.
+ */
@Mixin(IntegratedServer.class)
public class IntegratedServerMixin implements SableToastableServer {
@Shadow @Final private Minecraft minecraft;
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/EntityMixin.java
index 4d957a46..64d8ec53 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/EntityMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/EntityMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} to restore a player's position from a saved tracking point on load, freezing them into the corresponding sub-level.
+ */
@Mixin(Entity.class)
public abstract class EntityMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/ServerPlayerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/ServerPlayerMixin.java
index eaa58880..8ab49675 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/ServerPlayerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/tracking_points/ServerPlayerMixin.java
@@ -12,6 +12,9 @@
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.server.level.ServerPlayer} to generate and store a tracking point when saving player data.
+ */
@Mixin(ServerPlayer.class)
public abstract class ServerPlayerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ConnectionMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ConnectionMixin.java
index 80a8722b..f72e72fc 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ConnectionMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ConnectionMixin.java
@@ -25,6 +25,9 @@
import java.net.InetSocketAddress;
import java.net.SocketAddress;
+/**
+ * Mixin into {@link net.minecraft.network.Connection} to implement {@link dev.ryanhcode.sable.mixinterface.udp.ConnectionExtension}, opening a UDP channel for sub-level packet streaming on connect and closing it on disconnect.
+ */
@Mixin(Connection.class)
public abstract class ConnectionMixin implements ConnectionExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/udp/MinecraftServerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/udp/MinecraftServerMixin.java
index b1107665..30fd3778 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/udp/MinecraftServerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/udp/MinecraftServerMixin.java
@@ -10,6 +10,9 @@
import java.util.function.BooleanSupplier;
+/**
+ * Mixin into {@link net.minecraft.server.MinecraftServer} to periodically send pings keeping the UDP sockets alive.
+ */
@Mixin(MinecraftServer.class)
public class MinecraftServerMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ServerConnectionListenerMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ServerConnectionListenerMixin.java
index f3df9e77..c90fd81f 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ServerConnectionListenerMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/udp/ServerConnectionListenerMixin.java
@@ -30,6 +30,9 @@
import java.net.SocketAddress;
import java.util.List;
+/**
+ * Mixin into {@link net.minecraft.server.network.ServerConnectionListener} to implement {@link dev.ryanhcode.sable.mixinterface.udp.ServerConnectionListenerExtension}, starting the UDP server channels alongside the TCP listener.
+ */
@Mixin(ServerConnectionListener.class)
public class ServerConnectionListenerMixin implements ServerConnectionListenerExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/BitSetDiscreteVoxelShapeAccessor.java b/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/BitSetDiscreteVoxelShapeAccessor.java
index c71fa921..da721a92 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/BitSetDiscreteVoxelShapeAccessor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/BitSetDiscreteVoxelShapeAccessor.java
@@ -7,6 +7,9 @@
import java.util.BitSet;
+/**
+ * Accessor and invoker interface exposing the private storage field and strip-rectangle methods of {@link net.minecraft.world.phys.shapes.BitSetDiscreteVoxelShape}.
+ */
@Mixin(BitSetDiscreteVoxelShape.class)
public interface BitSetDiscreteVoxelShapeAccessor extends DiscreteVoxelShapeAccessor {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/DiscreteVoxelShapeAccessor.java b/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/DiscreteVoxelShapeAccessor.java
index 11e1e0b8..0025733b 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/DiscreteVoxelShapeAccessor.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/DiscreteVoxelShapeAccessor.java
@@ -4,6 +4,9 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
+/**
+ * Accessor exposing the private x/y/z size fields of {@link net.minecraft.world.phys.shapes.DiscreteVoxelShape}.
+ */
@Mixin(DiscreteVoxelShape.class)
public interface DiscreteVoxelShapeAccessor {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/VoxelShapeMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/VoxelShapeMixin.java
index ac6b9d06..453a2432 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/VoxelShapeMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/voxel_shape_iteration/VoxelShapeMixin.java
@@ -16,6 +16,9 @@
import java.util.Iterator;
+/**
+ * Mixin into {@link net.minecraft.world.phys.shapes.VoxelShape} to implement {@link dev.ryanhcode.sable.mixinterface.voxel_shape_iteration.FastVoxelShapeIterable}, providing a fast per-thread iterator over the shape's bounding boxes.
+ */
@Mixin(VoxelShape.class)
public abstract class VoxelShapeMixin implements FastVoxelShapeIterable {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/CameraMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/CameraMixin.java
index f53f2349..40df0c91 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/CameraMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/CameraMixin.java
@@ -13,6 +13,9 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Makes the camera stop returning underwater fog types when inside a water-occluded area.
+ */
@Mixin(Camera.class)
public class CameraMixin implements CameraWaterOcclusionExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/GameRendererMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/GameRendererMixin.java
index 9a10ce07..c2d4a87e 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/GameRendererMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/water_occlusion/GameRendererMixin.java
@@ -8,6 +8,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Updates the water occlusion manager at the start of each frame render.
+ */
@Mixin(GameRenderer.class)
public class GameRendererMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/LevelMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/LevelMixin.java
index 217c107f..2b82486b 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/LevelMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/LevelMixin.java
@@ -16,6 +16,9 @@
import java.util.function.Supplier;
+/**
+ * Mixin into {@link net.minecraft.world.level.Level} to bind the level to its world border extension for sub-level-aware border checks.
+ */
@Mixin(Level.class)
public class LevelMixin {
diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/WorldBorderMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/WorldBorderMixin.java
index 1d028dea..1f2e39dc 100644
--- a/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/WorldBorderMixin.java
+++ b/common/src/main/java/dev/ryanhcode/sable/mixin/world_border/WorldBorderMixin.java
@@ -16,6 +16,9 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.minecraft.world.level.border.WorldBorder} to implement {@link dev.ryanhcode.sable.mixinterface.world_border.WorldBorderExtension}, treating sub-level plots as within bounds.
+ */
@Mixin(WorldBorder.class)
public class WorldBorderMixin implements WorldBorderExtension {
diff --git a/common/src/main/java/dev/ryanhcode/sable/platform/SableAssemblyPlatform.java b/common/src/main/java/dev/ryanhcode/sable/platform/SableAssemblyPlatform.java
index 9ffa4345..8e28f578 100644
--- a/common/src/main/java/dev/ryanhcode/sable/platform/SableAssemblyPlatform.java
+++ b/common/src/main/java/dev/ryanhcode/sable/platform/SableAssemblyPlatform.java
@@ -3,6 +3,9 @@
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.ApiStatus;
+/**
+ * Loader-specific hooks for block assembly behaviour, such as suppressing block place events while assembling.
+ */
@ApiStatus.Internal
public interface SableAssemblyPlatform {
SableAssemblyPlatform INSTANCE = SablePlatformUtil.load(SableAssemblyPlatform.class);
diff --git a/common/src/main/java/dev/ryanhcode/sable/platform/SableChunkEventPlatform.java b/common/src/main/java/dev/ryanhcode/sable/platform/SableChunkEventPlatform.java
index b7e009c1..a62aaa5e 100644
--- a/common/src/main/java/dev/ryanhcode/sable/platform/SableChunkEventPlatform.java
+++ b/common/src/main/java/dev/ryanhcode/sable/platform/SableChunkEventPlatform.java
@@ -3,6 +3,9 @@
import net.minecraft.world.level.chunk.LevelChunk;
import org.jetbrains.annotations.ApiStatus;
+/**
+ * Loader-specific events fired around chunk loading/unloading for sub-level plots.
+ */
@ApiStatus.Internal
public interface SableChunkEventPlatform {
SableChunkEventPlatform INSTANCE = SablePlatformUtil.load(SableChunkEventPlatform.class);
diff --git a/common/src/main/java/dev/ryanhcode/sable/platform/SablePlatformUtil.java b/common/src/main/java/dev/ryanhcode/sable/platform/SablePlatformUtil.java
index 6b1ce2a8..bbe3af93 100644
--- a/common/src/main/java/dev/ryanhcode/sable/platform/SablePlatformUtil.java
+++ b/common/src/main/java/dev/ryanhcode/sable/platform/SablePlatformUtil.java
@@ -2,6 +2,9 @@
import java.util.ServiceLoader;
+/**
+ * Resolves the loader-specific implementation of a {@link SablePlatform} interface via {@link ServiceLoader}.
+ */
public class SablePlatformUtil {
public static T load(Class clazz) {
return ServiceLoader.load(clazz, SablePlatformUtil.class.getClassLoader())
diff --git a/common/src/main/java/dev/ryanhcode/sable/platform/SablePlotPlatform.java b/common/src/main/java/dev/ryanhcode/sable/platform/SablePlotPlatform.java
index 64f44b9c..055ddaa8 100644
--- a/common/src/main/java/dev/ryanhcode/sable/platform/SablePlotPlatform.java
+++ b/common/src/main/java/dev/ryanhcode/sable/platform/SablePlotPlatform.java
@@ -4,6 +4,9 @@
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.chunk.LevelChunk;
+/**
+ * Loader-specific serialization hooks for reading and writing chunk light data and attachments of sub-level plots.
+ */
public interface SablePlotPlatform {
SablePlotPlatform INSTANCE = SablePlatformUtil.load(SablePlotPlatform.class);
diff --git a/common/src/main/java/dev/ryanhcode/sable/platform/SableSubLevelRenderPlatform.java b/common/src/main/java/dev/ryanhcode/sable/platform/SableSubLevelRenderPlatform.java
index a2490ed2..ce5baa67 100644
--- a/common/src/main/java/dev/ryanhcode/sable/platform/SableSubLevelRenderPlatform.java
+++ b/common/src/main/java/dev/ryanhcode/sable/platform/SableSubLevelRenderPlatform.java
@@ -14,6 +14,9 @@
import java.util.List;
+/**
+ * Loader-specific render hooks for tessellating sub-level blocks and attaching renderer-specific visuals.
+ */
@ApiStatus.Internal
public interface SableSubLevelRenderPlatform {
SableSubLevelRenderPlatform INSTANCE = SablePlatformUtil.load(SableSubLevelRenderPlatform.class);
diff --git a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelChunkMixin.java b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelChunkMixin.java
index 55a24ef5..daab6b67 100644
--- a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelChunkMixin.java
+++ b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelChunkMixin.java
@@ -10,6 +10,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Fabric mixin into {@link LevelChunk} to skip {@link BlockState#onPlace} events while blocks are being assembled
+ * into a sub-level.
+ */
@Mixin(LevelChunk.class)
public class LevelChunkMixin {
diff --git a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelMixin.java b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelMixin.java
index 3120399e..0b8556df 100644
--- a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelMixin.java
+++ b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/assembly/LevelMixin.java
@@ -5,6 +5,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Fabric mixin into {@link Level} to add the {@link LevelExtension} interface, tracking whether {@code onPlace}
+ * events should be ignored while assembling sub-levels.
+ */
@Mixin(Level.class)
public class LevelMixin implements LevelExtension {
diff --git a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/camera_rotation/CameraMixin.java b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/camera_rotation/CameraMixin.java
index b84b2735..334d4af3 100644
--- a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/camera_rotation/CameraMixin.java
+++ b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/camera_rotation/CameraMixin.java
@@ -16,6 +16,9 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Fabric mixin into {@link Camera} to rotate the player camera with the sub-level they are riding or standing on.
+ */
@Mixin(Camera.class)
public abstract class CameraMixin {
diff --git a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/dynamic_directional_shading/SectionCompilerMixin.java b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/dynamic_directional_shading/SectionCompilerMixin.java
index 5a5034d2..15008af1 100644
--- a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/dynamic_directional_shading/SectionCompilerMixin.java
+++ b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/dynamic_directional_shading/SectionCompilerMixin.java
@@ -16,6 +16,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Fabric mixin into {@link SectionCompiler} to switch the model renderer cache to sub-level mode while compiling
+ * chunk sections that belong to a sub-level plot.
+ */
@Mixin(SectionCompiler.class)
public class SectionCompilerMixin {
diff --git a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/fix_bundle_packet/ClientPacketListenerMixin.java b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/fix_bundle_packet/ClientPacketListenerMixin.java
index af972b10..e1bb241c 100644
--- a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/fix_bundle_packet/ClientPacketListenerMixin.java
+++ b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/fix_bundle_packet/ClientPacketListenerMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Fabric mixin into {@link ClientPacketListener} that disables the main-thread re-dispatch of bundle packets, as the
+ * sub-level packet handling already runs on the correct thread.
+ */
@Mixin(ClientPacketListener.class)
public class ClientPacketListenerMixin {
diff --git a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/sound/MovingSoundInstanceDelegateMixin.java b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/sound/MovingSoundInstanceDelegateMixin.java
index e42e812b..0a0901fd 100644
--- a/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/sound/MovingSoundInstanceDelegateMixin.java
+++ b/fabric/src/main/java/dev/ryanhcode/sable/fabric/mixin/sound/MovingSoundInstanceDelegateMixin.java
@@ -10,6 +10,10 @@
import java.util.concurrent.CompletableFuture;
+/**
+ * Fabric mixin into {@link MovingSoundInstanceDelegate} to make the delegate implement {@link SoundInstance} and
+ * forward audio stream loading to the wrapped sound instance.
+ */
@Mixin(MovingSoundInstanceDelegate.class)
public abstract class MovingSoundInstanceDelegateMixin implements SoundInstance {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/block_entity_visible/LevelRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/block_entity_visible/LevelRendererMixin.java
index 7352df0a..52dba20d 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/block_entity_visible/LevelRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/block_entity_visible/LevelRendererMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.LevelRenderer} to make block entity render visibility checks account for sub-levels.
+ */
+
@Mixin(value = LevelRenderer.class, priority = 2000)
public class LevelRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/camera_rotation/CameraMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/camera_rotation/CameraMixin.java
index 61cc7338..d022e4c4 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/camera_rotation/CameraMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/camera_rotation/CameraMixin.java
@@ -24,6 +24,10 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.client.Camera} to correctly rotate and position the camera when riding sub-level machinery.
+ */
+
@Mixin(Camera.class)
public abstract class CameraMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/backpacks/BackpackPickupEventsMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/backpacks/BackpackPickupEventsMixin.java
index bebe345c..c8138c74 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/backpacks/BackpackPickupEventsMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/backpacks/BackpackPickupEventsMixin.java
@@ -15,6 +15,10 @@
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
+/**
+ * Compatibility mixin for {@link com.spydnel.backpacks.events.BackpackPickupEvents} (Backpacks for Dummies), making backpack pickup checks account for sub-levels.
+ */
+
@Mixin(BackpackPickupEvents.class)
public class BackpackPickupEventsMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/AirCurrentMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/AirCurrentMixin.java
index d5f9fca2..b009b885 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/AirCurrentMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/AirCurrentMixin.java
@@ -26,6 +26,10 @@
import java.lang.ref.WeakReference;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.AirCurrent} so fan airflow correctly pushes entities in sub-levels.
+ */
+
@Mixin(AirCurrent.class)
public abstract class AirCurrentMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/FanProcessingTypeMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/FanProcessingTypeMixin.java
index 28a1223f..8a3b2ec9 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/FanProcessingTypeMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/airflow/FanProcessingTypeMixin.java
@@ -9,6 +9,10 @@
import net.minecraft.world.level.Level;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.processing.FanProcessingType} so fan processing can resolve blocks in sub-levels.
+ */
+
@Mixin(FanProcessingType.class)
public interface FanProcessingTypeMixin {
@WrapMethod(method = "getAt")
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinBlockEntityMixin.java
index 957c20fb..df36f8c6 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinBlockEntityMixin.java
@@ -18,6 +18,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link com.simibubi.create.content.processing.basin.BasinBlockEntity} so the basin can find heat sources in sub-levels.
+ */
+
@Mixin(BasinBlockEntity.class)
public class BasinBlockEntityMixin extends BlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinOperatingBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinOperatingBlockEntityMixin.java
index d1362efc..ee00b98b 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinOperatingBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/basin_interactions/BasinOperatingBlockEntityMixin.java
@@ -15,6 +15,10 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.processing.basin.BasinOperatingBlockEntity} to locate basins in sub-levels and force periodic updates.
+ */
+
@Mixin(BasinOperatingBlockEntity.class)
public abstract class BasinOperatingBlockEntityMixin {
@Shadow
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/BlockEntityBehaviourMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/BlockEntityBehaviourMixin.java
index 9dc6638b..540e6db1 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/BlockEntityBehaviourMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/BlockEntityBehaviourMixin.java
@@ -20,6 +20,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour} to find behaviours on block entities in sub-levels.
+ */
+
@Mixin(BlockEntityBehaviour.class)
public abstract class BlockEntityBehaviourMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java
index 97570110..6b0bb8bd 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/BlockBreakingMovementBehaviourMixin.java
@@ -27,6 +27,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.base.BlockBreakingMovementBehaviour} so contraption block breaking can locate targets in sub-levels.
+ */
+
@Mixin(BlockBreakingMovementBehaviour.class)
public abstract class BlockBreakingMovementBehaviourMixin implements MovementBehaviour {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/SawMovementBehaviourMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/SawMovementBehaviourMixin.java
index 27d73b00..f9b64ca5 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/SawMovementBehaviourMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/block_breaking_behaviour/SawMovementBehaviourMixin.java
@@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.saw.SawMovementBehaviour} so saw drop item speed and distance calculations are correct across sub-levels.
+ */
+
@Mixin(SawMovementBehaviour.class)
public class SawMovementBehaviourMixin {
@Redirect(method = "dropItemFromCutTree", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;distanceTo(Lnet/minecraft/world/phys/Vec3;)D"))
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_behaviour/HarvesterMovementBehaviourMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_behaviour/HarvesterMovementBehaviourMixin.java
index 72d4de11..6a6b27db 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_behaviour/HarvesterMovementBehaviourMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_behaviour/HarvesterMovementBehaviourMixin.java
@@ -10,6 +10,10 @@
import net.minecraft.core.BlockPos;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.actors.harvester.HarvesterMovementBehaviour} so harvesting can check target positions in sub-levels.
+ */
+
@Mixin(HarvesterMovementBehaviour.class)
public class HarvesterMovementBehaviourMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityMixin.java
index 02357aa4..c742323d 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.actors.harvester.HarvesterBlockEntity} to add client and sub-level ticks that drive the harvester.
+ */
+
@Mixin(HarvesterBlockEntity.class)
public abstract class HarvesterBlockEntityMixin extends CachedRenderBBBlockEntity implements HarvesterLerpedSpeed, BlockEntitySubLevelActor {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityUsageMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityUsageMixin.java
index 0cc64efb..5b0fb610 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityUsageMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockEntityUsageMixin.java
@@ -10,6 +10,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.actors.harvester.HarvesterMovementBehaviour} to handle item drops for static sub-level harvesters.
+ */
+
@Mixin(HarvesterMovementBehaviour.class)
public class HarvesterBlockEntityUsageMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockMixin.java
index 8ba2c3cf..88221cfa 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterBlockMixin.java
@@ -12,6 +12,10 @@
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.actors.harvester.HarvesterBlock} to provide a custom client ticker for the harvester.
+ */
+
@Mixin(HarvesterBlock.class)
public abstract class HarvesterBlockMixin extends AttachedActorBlock implements IBE {
protected HarvesterBlockMixin(final Properties properties) {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterRendererMixin.java
index d3ff2316..45f7f05a 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/behaviour_compatibility/harvester_block_entity/HarvesterRendererMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.actors.harvester.HarvesterRenderer} to drive harvester animations with smoothed sub-level speed.
+ */
+
@Mixin(HarvesterRenderer.class)
public class HarvesterRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltBlockEntityMixin.java
index 52626340..985c124c 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltBlockEntityMixin.java
@@ -13,6 +13,10 @@
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.belt.BeltBlockEntity} to wake up physics objects when the belt speed changes.
+ */
+
@Mixin(BeltBlockEntity.class)
public abstract class BeltBlockEntityMixin extends KineticBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltMovementHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltMovementHandlerMixin.java
index 35e319c5..2dfd119c 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltMovementHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/belt/BeltMovementHandlerMixin.java
@@ -18,6 +18,10 @@
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.belt.transport.BeltMovementHandler} so belts correctly transport entities in sub-levels.
+ */
+
@Mixin(BeltMovementHandler.class)
public class BeltMovementHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blaze_burner/BlazeBurnerBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blaze_burner/BlazeBurnerBlockEntityMixin.java
index bb2e3c5d..5d6b7851 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blaze_burner/BlazeBurnerBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blaze_burner/BlazeBurnerBlockEntityMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.processing.burner.BlazeBurnerBlockEntity} to project the player position into sub-levels to drive animations.
+ */
+
@Mixin(BlazeBurnerBlockEntity.class)
public abstract class BlazeBurnerBlockEntityMixin extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/block_breakers/BlockBreakingKineticBlockEntityDamageMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/block_breakers/BlockBreakingKineticBlockEntityDamageMixin.java
index 17245a92..fcaa9522 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/block_breakers/BlockBreakingKineticBlockEntityDamageMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/block_breakers/BlockBreakingKineticBlockEntityDamageMixin.java
@@ -18,6 +18,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.saw.SawBlock} and {@link com.simibubi.create.content.kinetics.drill.DrillBlock} to compute damage checks against entities in sub-levels using oriented bounding boxes.
+ */
+
@Mixin({SawBlock.class, DrillBlock.class})
public class BlockBreakingKineticBlockEntityDamageMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blueprint/BlueprintEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blueprint/BlueprintEntityMixin.java
index d46bfa9c..59be673f 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blueprint/BlueprintEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/blueprint/BlueprintEntityMixin.java
@@ -9,6 +9,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
+/**
+ * Mixin into {@link com.simibubi.create.content.equipment.blueprint.BlueprintEntity} (Create < 6.0.11) to use the sub-level aware Player#canInteractWithEntity check.
+ */
+
@MixinModVersionConstraint("(,6.0.11)")
@Mixin(BlueprintEntity.class)
public abstract class BlueprintEntityMixin extends Entity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockEntityMixin.java
index 71831659..d9005c4e 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockEntityMixin.java
@@ -13,6 +13,10 @@
import java.util.List;
import java.util.Map;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity} to drop travelling packages when a connection is removed.
+ */
+
@Mixin(ChainConveyorBlockEntity.class)
public abstract class ChainConveyorBlockEntityMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockMixin.java
index 467d746c..339b32a9 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/chain_conveyor/ChainConveyorBlockMixin.java
@@ -8,6 +8,10 @@
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlock} to re-validate connections on connected conveyors after moving into a sub-level.
+ */
+
@Mixin(ChainConveyorBlock.class)
public class ChainConveyorBlockMixin implements BlockSubLevelAssemblyListener {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/AbstractContraptionEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/AbstractContraptionEntityMixin.java
index 08ced754..26734b04 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/AbstractContraptionEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/AbstractContraptionEntityMixin.java
@@ -46,6 +46,10 @@
import java.util.List;
import java.util.Map;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.AbstractContraptionEntity} to connect Create contraptions to sub-level physics as kinematic rigid bodies.
+ */
+
@Mixin(AbstractContraptionEntity.class)
public abstract class AbstractContraptionEntityMixin extends Entity implements KinematicContraption {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/ContraptionColliderMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/ContraptionColliderMixin.java
index 4b77a68c..c640e5c0 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/ContraptionColliderMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/ContraptionColliderMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.ContraptionCollider} so Create contraptions interact with sub-levels.
+ */
+
@Mixin(value = ContraptionCollider.class, remap = false)
public class ContraptionColliderMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/Matrix3dAccessor.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/Matrix3dAccessor.java
index 427ed199..966a9777 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/Matrix3dAccessor.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/Matrix3dAccessor.java
@@ -4,6 +4,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.collision.Matrix3d} to expose matrix elements for sub-level transforms.
+ */
+
@Mixin(Matrix3d.class)
public interface Matrix3dAccessor {
@Accessor("m00")
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/VisualizationEventHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/VisualizationEventHandlerMixin.java
index 8128a8e2..e3057073 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/VisualizationEventHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/contraptions/VisualizationEventHandlerMixin.java
@@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.impl.visualization.VisualizationEventHandler} to create Flywheel render info when an entity joins a sub-level.
+ */
+
@Mixin(VisualizationEventHandler.class)
public class VisualizationEventHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel/CrushingWheelBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel/CrushingWheelBlockMixin.java
index 6dea2537..446b9ba3 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel/CrushingWheelBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel/CrushingWheelBlockMixin.java
@@ -15,6 +15,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.crusher.CrushingWheelBlock} so crushing wheels correctly push entities in sub-levels.
+ */
+
@Mixin(CrushingWheelBlock.class)
public abstract class CrushingWheelBlockMixin extends RotatedPillarKineticBlock implements IBE {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel_entity_processing/CrushingWheelControllerBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel_entity_processing/CrushingWheelControllerBlockEntityMixin.java
index 7ee2b01c..b415253e 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel_entity_processing/CrushingWheelControllerBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/crushing_wheel_entity_processing/CrushingWheelControllerBlockEntityMixin.java
@@ -19,6 +19,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.crusher.CrushingWheelControllerBlockEntity} so the crushing wheel controller can process entities in sub-levels.
+ */
+
@Mixin(CrushingWheelControllerBlockEntity.class)
public abstract class CrushingWheelControllerBlockEntityMixin extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/deployer/DeployerBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/deployer/DeployerBlockEntityMixin.java
index 1de3fdea..ada06125 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/deployer/DeployerBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/deployer/DeployerBlockEntityMixin.java
@@ -22,6 +22,10 @@
import javax.annotation.Nullable;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.deployer.DeployerBlockEntity} so the deployer can compute distances and find targets in sub-levels.
+ */
+
@Mixin(DeployerBlockEntity.class)
public abstract class DeployerBlockEntityMixin extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/depot/DepotRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/depot/DepotRendererMixin.java
index 86e2a9d6..40d975ce 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/depot/DepotRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/depot/DepotRendererMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.logistics.depot.DepotRenderer} so items render correctly when the depot is in a sub-level.
+ */
+
@Mixin(DepotRenderer.class)
public class DepotRendererMixin {
@ModifyExpressionValue(method = "renderItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;getPosition()Lnet/minecraft/world/phys/Vec3;"))
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/ClickToLinkBlockItemMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/ClickToLinkBlockItemMixin.java
index d08964b4..75c3f7f3 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/ClickToLinkBlockItemMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/ClickToLinkBlockItemMixin.java
@@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.redstone.displayLink.ClickToLinkBlockItem} so the click-to-link item's distance check accounts for sub-levels.
+ */
+
@Mixin(ClickToLinkBlockItem.class)
public class ClickToLinkBlockItemMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockEntityMixin.java
index eced13c1..ac27560f 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockEntityMixin.java
@@ -12,6 +12,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link com.simibubi.create.content.redstone.displayLink.DisplayLinkBlockEntity} so display link distance checks account for sub-levels.
+ */
+
@Mixin(DisplayLinkBlockEntity.class)
public abstract class DisplayLinkBlockEntityMixin extends LinkWithBulbBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockMixin.java
index fdc94003..308967c6 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/display_link/DisplayLinkBlockMixin.java
@@ -8,6 +8,10 @@
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.redstone.displayLink.DisplayLinkBlock} to preserve the display link target when moving into a sub-level.
+ */
+
@Mixin(DisplayLinkBlock.class)
public class DisplayLinkBlockMixin implements BlockSubLevelAssemblyListener {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/ejector/EjectorBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/ejector/EjectorBlockMixin.java
index 172c9c61..9dc94dcc 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/ejector/EjectorBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/ejector/EjectorBlockMixin.java
@@ -12,6 +12,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.logistics.depot.EjectorBlock} so the ejector accounts for sub-levels when flinging entities.
+ */
+
@Mixin(EjectorBlock.class)
public class EjectorBlockMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/BeltMillstoneBlocksMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/BeltMillstoneBlocksMixin.java
index b80816cf..5cc44a62 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/BeltMillstoneBlocksMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/BeltMillstoneBlocksMixin.java
@@ -15,6 +15,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.belt.BeltBlock} and {@link com.simibubi.create.content.kinetics.millstone.MillstoneBlock} to find block entities in sub-levels when entities land on them.
+ */
+
@Mixin({ BeltBlock.class, MillstoneBlock.class })
public class BeltMillstoneBlocksMixin extends Block {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/SawBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/SawBlockMixin.java
index 79acc1d5..116a3024 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/SawBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/entity_falls_on_block/SawBlockMixin.java
@@ -7,6 +7,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.saw.SawBlock} to use the standing position when entities land on a saw in a sub-level.
+ */
+
@Mixin(SawBlock.class)
public class SawBlockMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/factory_panel/FactoryPanelConnectionHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/factory_panel/FactoryPanelConnectionHandlerMixin.java
index c7b134c3..0441427f 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/factory_panel/FactoryPanelConnectionHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/factory_panel/FactoryPanelConnectionHandlerMixin.java
@@ -10,6 +10,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.logistics.factoryBoard.FactoryPanelConnectionHandler} so panel connection distance checks account for sub-levels.
+ */
+
@Mixin(FactoryPanelConnectionHandler.class)
public class FactoryPanelConnectionHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fans_provide_force/EncasedFanBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fans_provide_force/EncasedFanBlockEntityMixin.java
index 98407f45..6a000192 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fans_provide_force/EncasedFanBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fans_provide_force/EncasedFanBlockEntityMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.EncasedFanBlockEntity} to act as a propeller providing airflow and thrust in sub-levels.
+ */
+
@Mixin(EncasedFanBlockEntity.class)
public class EncasedFanBlockEntityMixin extends KineticBlockEntity implements BlockEntitySubLevelPropellerActor, BlockEntityPropeller {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/OpenEndedPipeMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/OpenEndedPipeMixin.java
index c59c7a03..e3227364 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/OpenEndedPipeMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/OpenEndedPipeMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.fluids.OpenEndedPipe} so open-ended pipes can interact with blocks and place fluids in sub-levels.
+ */
+
@Mixin(OpenEndedPipe.class)
public abstract class OpenEndedPipeMixin {
@Shadow
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/PipeConnectionMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/PipeConnectionMixin.java
index 14db0b93..a4f6013c 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/PipeConnectionMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_handling/PipeConnectionMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.fluids.PipeConnection} so pipe render distance checks account for sub-levels.
+ */
+
@Mixin(PipeConnection.class)
public class PipeConnectionMixin {
@Redirect(method = "isRenderEntityWithinDistance", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;distanceTo(Lnet/minecraft/world/phys/Vec3;)D"))
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_tank_heating/BoilerDataMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_tank_heating/BoilerDataMixin.java
index a19e8656..38717ee4 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_tank_heating/BoilerDataMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/fluid_tank_heating/BoilerDataMixin.java
@@ -16,6 +16,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.fluids.tank.BoilerData} so the boiler can find heat sources in sub-levels and force temperature refreshes.
+ */
+
@Mixin(BoilerData.class)
public class BoilerDataMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/flywheel/FlywheelBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/flywheel/FlywheelBlockEntityMixin.java
index 4b53a835..2d4e0f43 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/flywheel/FlywheelBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/flywheel/FlywheelBlockEntityMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.flywheel.FlywheelBlockEntity} to provide smoothed angular velocity for sub-level physics.
+ */
+
@Mixin(FlywheelBlockEntity.class)
public abstract class FlywheelBlockEntityMixin extends KineticBlockEntity implements BlockEntitySubLevelReactionWheel {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorBlockEntityMixin.java
index 7fbcf308..07d25a88 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorBlockEntityMixin.java
@@ -18,6 +18,10 @@
import java.util.Map;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorBlockEntity} to account for sub-level distances when exporting packages to frogports.
+ */
+
@Mixin(ChainConveyorBlockEntity.class)
public abstract class ChainConveyorBlockEntityMixin extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorInteractionHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorInteractionHandlerMixin.java
index d08ae962..22e099cb 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorInteractionHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorInteractionHandlerMixin.java
@@ -21,6 +21,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorInteractionHandler} so chain conveyors correctly interact and render in sub-levels.
+ */
+
@Mixin(ChainConveyorInteractionHandler.class)
public class ChainConveyorInteractionHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorRidingHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorRidingHandlerMixin.java
index a934eea3..1f8cd31d 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorRidingHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorRidingHandlerMixin.java
@@ -15,6 +15,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRidingHandler} so riding chain conveyors compute position and orientation correctly in sub-levels.
+ */
+
@Mixin(ChainConveyorRidingHandler.class)
public class ChainConveyorRidingHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorShapeAccessor.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorShapeAccessor.java
index 7f8d3cf6..f563a55f 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorShapeAccessor.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainConveyorShapeAccessor.java
@@ -7,6 +7,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorShape} to expose drawOutline for sub-level selection box rendering.
+ */
+
@Mixin(ChainConveyorShape.class)
public interface ChainConveyorShapeAccessor {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionHandlerMixin.java
index 10517bac..764a870e 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionHandlerMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionHandler} so package interaction rays account for sub-levels.
+ */
+
@Mixin(ChainPackageInteractionHandler.class)
public class ChainPackageInteractionHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionPacketMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionPacketMixin.java
index 9f9c0ecd..c8ea70b2 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionPacketMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/ChainPackageInteractionPacketMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainPackageInteractionPacket} to initialise package world positions for sub-level distance checks.
+ */
+
@Mixin(ChainPackageInteractionPacket.class)
public class ChainPackageInteractionPacketMixin {
@Shadow @Final private BlockPos selectedConnection;
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/FrogportBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/FrogportBlockMixin.java
index 8051daca..097907b1 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/FrogportBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/FrogportBlockMixin.java
@@ -12,6 +12,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.logistics.packagePort.frogport.FrogportBlock} to project the player position into a sub-level when placing a frogport.
+ */
+
@Mixin(FrogportBlock.class)
public class FrogportBlockMixin {
@WrapOperation(method = "lambda$setPlacedBy$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;position()Lnet/minecraft/world/phys/Vec3;"))
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetMixin.java
index c18b65a8..5c2f09e3 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into PackagePortTarget.ChainConveyorFrogportTarget to account for sub-level distances when exporting from package ports.
+ */
+
@Mixin(PackagePortTarget.ChainConveyorFrogportTarget.class)
public class PackagePortTargetMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetSelectionHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetSelectionHandlerMixin.java
index 4f1f3240..64129e19 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetSelectionHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/PackagePortTargetSelectionHandlerMixin.java
@@ -16,6 +16,10 @@
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
+/**
+ * Mixin into {@link com.simibubi.create.content.logistics.packagePort.PackagePortTargetSelectionHandler} so package port target validation accounts for sub-levels.
+ */
+
@Mixin(PackagePortTargetSelectionHandler.class)
public class PackagePortTargetSelectionHandlerMixin {
@Shadow
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/SmartBlockEntityRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/SmartBlockEntityRendererMixin.java
index 23b30c16..a2031a42 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/SmartBlockEntityRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/frogports/SmartBlockEntityRendererMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.blockEntity.renderer.SmartBlockEntityRenderer} so name plates render correctly in sub-levels.
+ */
+
@Mixin(SmartBlockEntityRenderer.class)
public class SmartBlockEntityRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyBlockEntityMixin.java
index 2aae528f..f4d3ed65 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyBlockEntityMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.fluids.hosePulley.HosePulleyBlockEntity} so the hose pulley can find fluids and blocks in sub-levels.
+ */
+
@Mixin(HosePulleyBlockEntity.class)
public abstract class HosePulleyBlockEntityMixin extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyFluidHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyFluidHandlerMixin.java
index 35e0389f..c614b649 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyFluidHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/hose_pulley/HosePulleyFluidHandlerMixin.java
@@ -19,6 +19,10 @@
import java.util.function.Supplier;
+/**
+ * Mixin into {@link com.simibubi.create.content.fluids.hosePulley.HosePulleyFluidHandler} so the hose pulley can drain fluids from sub-levels.
+ */
+
@Mixin(HosePulleyFluidHandler.class)
public abstract class HosePulleyFluidHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockAccessor.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockAccessor.java
index be838031..835cb582 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockAccessor.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockAccessor.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
+/**
+ * Mixin into {@link com.simibubi.create.content.equipment.bell.AbstractBellBlock} to expose the ring method for sub-level collision callbacks.
+ */
+
@Mixin(AbstractBellBlock.class)
public interface AbstractBellBlockAccessor {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockMixin.java
index e765d50c..df8f3e09 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/impact/AbstractBellBlockMixin.java
@@ -6,6 +6,10 @@
import dev.ryanhcode.sable.neoforge.physics.callback.AbstractBellBlockCallback;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.equipment.bell.AbstractBellBlock} to register a collision callback so bells ring when hit in sub-levels.
+ */
+
@Mixin(AbstractBellBlock.class)
public class AbstractBellBlockMixin implements BlockWithSubLevelCollisionCallback {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/CapManipulationBehaviourBaseMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/CapManipulationBehaviourBaseMixin.java
index 542edd36..05c59a40 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/CapManipulationBehaviourBaseMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/CapManipulationBehaviourBaseMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.blockEntity.behaviour.inventory.CapManipulationBehaviourBase} so inventory capability lookups account for sub-levels.
+ */
+
@Mixin(CapManipulationBehaviourBase.class)
public class CapManipulationBehaviourBaseMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/ChuteBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/ChuteBlockEntityMixin.java
index ca4eb138..a84f0d46 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/ChuteBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/inventory_manipulation/ChuteBlockEntityMixin.java
@@ -17,6 +17,10 @@
import org.joml.Vector3d;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.logistics.chute.ChuteBlockEntity} so chutes can grab inventory capabilities across sub-levels.
+ */
+
@Mixin(ChuteBlockEntity.class)
public abstract class ChuteBlockEntityMixin extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockEntityMixin.java
index faa0f898..359f56f4 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockEntityMixin.java
@@ -23,6 +23,10 @@
import java.util.UUID;
+/**
+ * Mixin into {@link com.simibubi.create.content.redstone.link.controller.LecternControllerBlockEntity} so controller drops and distance checks are correct across sub-levels.
+ */
+
@Mixin(LecternControllerBlockEntity.class)
public abstract class LecternControllerBlockEntityMixin extends SmartBlockEntity implements LecternControllerBlockEntityExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockMixin.java
index 54390ddb..55afcbbe 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/lectern_controller/LecternControllerBlockMixin.java
@@ -9,6 +9,10 @@
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.redstone.link.controller.LecternControllerBlock} to prevent the controller from dropping when moved into a sub-level.
+ */
+
@Mixin(LecternControllerBlock.class)
public class LecternControllerBlockMixin implements BlockSubLevelAssemblyListener {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmBlockEntity.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmBlockEntity.java
index 402f3871..e0c97f57 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmBlockEntity.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmBlockEntity.java
@@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.mechanicalArm.ArmBlockEntity} to force mechanical arms to load sub-level areas.
+ */
+
@Mixin(ArmBlockEntity.class)
public abstract class MechanicalArmBlockEntity extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmSublevelFailure.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmSublevelFailure.java
index fb4ab54e..5b51cbd8 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmSublevelFailure.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/mechnical_arm/MechanicalArmSublevelFailure.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.mechanicalArm.ArmInteractionPointHandler} to filter cross-sub-level arm interaction points and give feedback.
+ */
+
@Mixin(ArmInteractionPointHandler.class)
public class MechanicalArmSublevelFailure {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/NozzleBlockEntityAccessor.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/NozzleBlockEntityAccessor.java
index c7e3aca8..d1913802 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/NozzleBlockEntityAccessor.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/NozzleBlockEntityAccessor.java
@@ -4,6 +4,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.NozzleBlockEntity} to expose its range field.
+ */
+
@Mixin(NozzleBlockEntity.class)
public interface NozzleBlockEntityAccessor {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleBEFixesMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleBEFixesMixin.java
index b79517fe..c32c2560 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleBEFixesMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleBEFixesMixin.java
@@ -20,6 +20,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.NozzleBlockEntity} to fix position calculations and particle direction checks in sub-levels.
+ */
+
@Mixin(NozzleBlockEntity.class)
public abstract class NozzleBEFixesMixin extends SmartBlockEntity {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleHoveringMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleHoveringMixin.java
index b8bf9c12..334aff7b 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleHoveringMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/NozzleHoveringMixin.java
@@ -29,6 +29,10 @@
import java.util.List;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.NozzleBlockEntity} to provide wind lift as a sub-level actor.
+ */
+
@Mixin(NozzleBlockEntity.class)
public abstract class NozzleHoveringMixin extends SmartBlockEntity implements BlockEntitySubLevelActor {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/ValidNozzledirectionMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/ValidNozzledirectionMixin.java
index b71c7ea8..55e83e5f 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/ValidNozzledirectionMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/nozzle/block_entity/ValidNozzledirectionMixin.java
@@ -15,6 +15,10 @@
import java.util.EnumSet;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.NozzleBlockEntity} to maintain the set of valid output directions for the nozzle.
+ */
+
@Mixin(NozzleBlockEntity.class)
public abstract class ValidNozzledirectionMixin extends SmartBlockEntity implements NozzleBlockEntityExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirFlowParticleMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirFlowParticleMixin.java
index 64a3a489..ab679ad2 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirFlowParticleMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirFlowParticleMixin.java
@@ -20,6 +20,10 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.fan.AirFlowParticle} so airflow particles move correctly within sub-levels.
+ */
+
@Mixin(AirFlowParticle.class)
public abstract class AirFlowParticleMixin extends SimpleAnimatedParticle {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirParticleMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirParticleMixin.java
index 60a72387..e16d3ee8 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirParticleMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/particles/AirParticleMixin.java
@@ -20,6 +20,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.particle.AirParticle} so air particles can track target positions across sub-levels.
+ */
+
@Mixin(AirParticle.class)
public abstract class AirParticleMixin extends SimpleAnimatedParticle implements ParticleSubLevelKickable {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/AllBlockEntityTypesMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/AllBlockEntityTypesMixin.java
index 24e8ac47..c228ba48 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/AllBlockEntityTypesMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/AllBlockEntityTypesMixin.java
@@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link com.simibubi.create.AllBlockEntityTypes} to register the redstone contact block entity type used by Sable.
+ */
+
@Mixin(AllBlockEntityTypes.class)
public class AllBlockEntityTypesMixin implements RedstoneContactBlockEntityTypeGetter {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/RedstoneContactBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/RedstoneContactBlockMixin.java
index 2d193540..538699fc 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/RedstoneContactBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/redstone_contacts/RedstoneContactBlockMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
+/**
+ * Mixin into {@link com.simibubi.create.content.redstone.contact.RedstoneContactBlock} so the redstone contact block uses Sable's custom block entity.
+ */
+
@Mixin(RedstoneContactBlock.class)
public class RedstoneContactBlockMixin extends WrenchableDirectionalBlock implements IBE {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/AABBOutlineMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/AABBOutlineMixin.java
index 9e0f9b18..e2422b27 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/AABBOutlineMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/AABBOutlineMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.createmod.catnip.outliner.AABBOutline} to apply sub-level offsets when rendering outlines.
+ */
+
@Mixin(value = AABBOutline.class, remap = false)
public abstract class AABBOutlineMixin extends Outline implements AABBOutlineRenderingOptions {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BeltRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BeltRendererMixin.java
index 55721290..48fd7673 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BeltRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BeltRendererMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.belt.BeltRenderer} so belt item render distances account for sub-levels.
+ */
+
@Mixin(BeltRenderer.class)
public class BeltRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BlockClusterOutlineMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BlockClusterOutlineMixin.java
index 12a3dc3f..a6a0a8b7 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BlockClusterOutlineMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/BlockClusterOutlineMixin.java
@@ -15,6 +15,10 @@
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.createmod.catnip.outliner.BlockClusterOutline} so block cluster outlines render correctly in sub-levels.
+ */
+
@Mixin(BlockClusterOutline.class)
public class BlockClusterOutlineMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChainConveyorRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChainConveyorRendererMixin.java
index 11ee1cde..0a4e4c89 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChainConveyorRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChainConveyorRendererMixin.java
@@ -9,6 +9,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.chainConveyor.ChainConveyorRenderer} so chain render distances account for sub-levels.
+ */
+
@Mixin(ChainConveyorRenderer.class)
public class ChainConveyorRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlineMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlineMixin.java
index a30c18be..a975f4c1 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlineMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlineMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.createmod.catnip.outliner.ChasingAABBOutline} to apply sub-level offsets when rendering chasing outlines.
+ */
+
@Mixin(value = ChasingAABBOutline.class, remap = false)
public abstract class ChasingAABBOutlineMixin extends AABBOutline {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlinerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlinerMixin.java
index 482b1b4c..9326ea50 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlinerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ChasingAABBOutlinerMixin.java
@@ -7,6 +7,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link net.createmod.catnip.outliner.ChasingAABBOutline} to avoid interpolating bounding boxes across sub-levels.
+ */
+
@Mixin(ChasingAABBOutline.class)
public class ChasingAABBOutlinerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/FilteringRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/FilteringRendererMixin.java
index 92c8ff98..3ebdcc27 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/FilteringRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/FilteringRendererMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringRenderer} so filter render distances account for sub-levels.
+ */
+
@Mixin(FilteringRenderer.class)
public class FilteringRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/GhostBlockValueBoxMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/GhostBlockValueBoxMixin.java
index 05177881..22960968 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/GhostBlockValueBoxMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/GhostBlockValueBoxMixin.java
@@ -9,6 +9,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into GhostBlockRenderer.TransparentGhostBlockRenderer to apply sub-level offsets when rendering ghost blocks.
+ */
+
@Mixin(targets = "net.createmod.catnip.ghostblock.GhostBlockRenderer$TransparentGhostBlockRenderer")
public abstract class GhostBlockValueBoxMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LineOutlineMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LineOutlineMixin.java
index 28cbe2a4..c3ff5bdc 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LineOutlineMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LineOutlineMixin.java
@@ -18,6 +18,10 @@
import org.joml.Vector4f;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.createmod.catnip.outliner.LineOutline} so line outlines can render across sub-levels.
+ */
+
@Mixin(LineOutline.class)
public abstract class LineOutlineMixin extends Outline {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LinkRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LinkRendererMixin.java
index 4db7cf60..905ab355 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LinkRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/LinkRendererMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.redstone.link.LinkRenderer} so link render distances account for sub-levels.
+ */
+
@Mixin(LinkRenderer.class)
public class LinkRendererMixin {
@Redirect(method = "renderOnBlockEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;distanceToSqr(Lnet/minecraft/world/phys/Vec3;)D"))
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/OutlineMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/OutlineMixin.java
index 73c6cb8f..6e5f5871 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/OutlineMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/OutlineMixin.java
@@ -3,6 +3,10 @@
import net.createmod.catnip.outliner.Outline;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link net.createmod.catnip.outliner.Outline} so Create outlines work correctly with sub-levels.
+ */
+
@Mixin(Outline.class)
public class OutlineMixin {
}
\ No newline at end of file
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/PlacementClientMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/PlacementClientMixin.java
index c57dab55..6fcdb8c5 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/PlacementClientMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/PlacementClientMixin.java
@@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link net.createmod.catnip.placement.PlacementClient} to project the placement direction indicator out of sub-levels.
+ */
+
@Mixin(PlacementClient.class)
public class PlacementClientMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/SafeBlockEntityRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/SafeBlockEntityRendererMixin.java
index c4c2bbfe..e37e8d6e 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/SafeBlockEntityRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/SafeBlockEntityRendererMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer} so item culling checks work correctly across sub-levels.
+ */
+
@Mixin(SafeBlockEntityRenderer.class)
public class SafeBlockEntityRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ValueBoxMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ValueBoxMixin.java
index 27869934..7303dd46 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ValueBoxMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/render_fixes/ValueBoxMixin.java
@@ -10,6 +10,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.foundation.blockEntity.behaviour.ValueBox} to apply sub-level offsets when rendering value boxes.
+ */
+
@Mixin(ValueBox.class)
public abstract class ValueBoxMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sails_providing_lift/SailBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sails_providing_lift/SailBlockMixin.java
index da2c62a8..c6a89d5c 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sails_providing_lift/SailBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sails_providing_lift/SailBlockMixin.java
@@ -12,6 +12,10 @@
import org.joml.Vector3dc;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.bearing.SailBlock} to provide lift and a custom center of mass for sub-levels.
+ */
+
@Mixin(SailBlock.class)
public class SailBlockMixin implements BlockSubLevelLiftProvider, BlockSubLevelCustomCenterOfMass {
@Override
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/DeployToolMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/DeployToolMixin.java
index a85bf66c..a4d5f339 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/DeployToolMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/DeployToolMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.client.tools.DeployTool} so the deploy tool outline renders correctly in sub-levels.
+ */
+
@Mixin(DeployTool.class)
public abstract class DeployToolMixin extends SchematicToolBase {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicAndQuillHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicAndQuillHandlerMixin.java
index 3c819668..e439f44e 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicAndQuillHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicAndQuillHandlerMixin.java
@@ -27,6 +27,10 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.client.SchematicAndQuillHandler} so schematic selection works across sub-levels and highlights intersecting ones.
+ */
+
@Mixin(SchematicAndQuillHandler.class)
public abstract class SchematicAndQuillHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicExportMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicExportMixin.java
index c0fdec3a..e46176b9 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicExportMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicExportMixin.java
@@ -32,6 +32,10 @@
import java.nio.file.Path;
import java.util.UUID;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.SchematicExport} to include sub-level data when exporting schematics.
+ */
+
@Mixin(SchematicExport.class)
public class SchematicExportMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicHandlerMixin.java
index d2847db5..36e61ba9 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicHandlerMixin.java
@@ -19,6 +19,10 @@
import java.util.List;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.client.SchematicHandler} to place sub-level templates into the schematic render world.
+ */
+
@Mixin(SchematicHandler.class)
public class SchematicHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicLevelMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicLevelMixin.java
index 12c980b2..bba409a4 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicLevelMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicLevelMixin.java
@@ -8,6 +8,10 @@
import java.util.List;
+/**
+ * Mixin into {@link net.createmod.catnip.levelWrappers.SchematicLevel} to store sub-level templates in the schematic world.
+ */
+
@Mixin(SchematicLevel.class)
public class SchematicLevelMixin implements SchematicLevelExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPlacePacketMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPlacePacketMixin.java
index 5456a1bc..a918830a 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPlacePacketMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPlacePacketMixin.java
@@ -51,6 +51,10 @@
import java.util.Map;
import java.util.UUID;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.packet.SchematicPlacePacket} to spawn sub-levels when placing schematics.
+ */
+
@Mixin(SchematicPlacePacket.class)
public class SchematicPlacePacketMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPrinterMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPrinterMixin.java
index e3dc88a5..d7dd9f4f 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPrinterMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicPrinterMixin.java
@@ -27,6 +27,10 @@
import java.util.List;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.SchematicPrinter} to load and transform sub-level templates in schematics.
+ */
+
@Mixin(SchematicPrinter.class)
public class SchematicPrinterMixin implements SchematicPrinterExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicRendererMixin.java
index 6acef9af..1beea1c0 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicRendererMixin.java
@@ -27,6 +27,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.client.SchematicRenderer} to render sub-level blocks in the schematic preview.
+ */
+
@Mixin(SchematicRenderer.class)
public class SchematicRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicToolBaseMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicToolBaseMixin.java
index 1ea7789c..fcc3891b 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicToolBaseMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicToolBaseMixin.java
@@ -21,6 +21,10 @@
import java.util.function.Predicate;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.client.tools.SchematicToolBase} so schematic tool rays and selection account for sub-levels.
+ */
+
@Mixin(SchematicToolBase.class)
public class SchematicToolBaseMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicTransformMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicTransformMixin.java
index 78a47750..a99a1538 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicTransformMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/SchematicTransformMixin.java
@@ -16,6 +16,10 @@
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.schematics.client.SchematicTransformation} to apply sub-level offsets when rendering schematic transformations.
+ */
+
@Mixin(SchematicTransformation.class)
public abstract class SchematicTransformMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/StructureTemplateMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/StructureTemplateMixin.java
index a313f4fc..2bf5be34 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/StructureTemplateMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/schematics/StructureTemplateMixin.java
@@ -28,6 +28,10 @@
import java.util.List;
import java.util.UUID;
+/**
+ * Mixin into {@link net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate} to load and filter entities belonging to sub-levels.
+ */
+
@Mixin(StructureTemplate.class)
public abstract class StructureTemplateMixin implements StructureTemplateExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockEntityMixin.java
index 76094ee1..839784ea 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockEntityMixin.java
@@ -40,6 +40,10 @@
import java.util.Objects;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.chassis.StickerBlockEntity} so stickers can create fixed constraints between sub-levels.
+ */
+
@Mixin(StickerBlockEntity.class)
public abstract class StickerBlockEntityMixin extends SmartBlockEntity implements StickerBlockEntityExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockMixin.java
index e6bb3941..d2d93192 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/sticker/StickerBlockMixin.java
@@ -8,6 +8,10 @@
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.chassis.StickerBlock} to remove sticker constraints when moved into sub-levels.
+ */
+
@Mixin(StickerBlock.class)
public class StickerBlockMixin implements BlockSubLevelAssemblyListener {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/EntityHatsMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/EntityHatsMixin.java
index 03c35c6c..18f14b00 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/EntityHatsMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/EntityHatsMixin.java
@@ -9,6 +9,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.equipment.hats.EntityHats} to use the vehicle position when checking for stock ticker hats on sub-level contraptions.
+ */
+
@Mixin(EntityHats.class)
public class EntityHatsMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/StockTickerInteractionHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/StockTickerInteractionHandlerMixin.java
index 7c31842f..cf97ca9a 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/StockTickerInteractionHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/stock_ticker/StockTickerInteractionHandlerMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.logistics.stockTicker.StockTickerInteractionHandler} to use the vehicle position when riding sub-level contraptions.
+ */
+
@Mixin(StockTickerInteractionHandler.class)
public class StockTickerInteractionHandlerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/LevelAccessor.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/LevelAccessor.java
index 836e3edb..8ac8d26d 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/LevelAccessor.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/LevelAccessor.java
@@ -6,6 +6,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
+/**
+ * Mixin into {@link net.minecraft.world.level.Level} to expose getEntities for sub-level aware entity queries.
+ */
+
@Mixin(Level.class)
public interface LevelAccessor {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/SuperGlueEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/SuperGlueEntityMixin.java
index 32792778..c37558c7 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/SuperGlueEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/super_glue/SuperGlueEntityMixin.java
@@ -14,6 +14,10 @@
import java.util.List;
+/**
+ * Mixin into {@link com.simibubi.create.content.contraptions.glue.SuperGlueEntity} to avoid entering sub-levels when collecting super glue entities.
+ */
+
@Mixin(value = SuperGlueEntity.class, remap = false)
public class SuperGlueEntityMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/CurvedTrackDestroyPacketMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/CurvedTrackDestroyPacketMixin.java
index 466fb17a..b2fcd604 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/CurvedTrackDestroyPacketMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/CurvedTrackDestroyPacketMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.track.CurvedTrackDestroyPacket} so curved track destruction operates in world coordinates.
+ */
+
@Mixin(CurvedTrackDestroyPacket.class)
public class CurvedTrackDestroyPacketMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockItemMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockItemMixin.java
index 750940f5..f0a17b0e 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockItemMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockItemMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.track.TrackBlockItem} and {@link com.simibubi.create.content.trains.track.TrackTargetingBlockItem} to account for sub-level orientation when placing tracks.
+ */
+
@Mixin({ TrackBlockItem.class, TrackTargetingBlockItem.class })
public class TrackBlockItemMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockMixin.java
index e3dfdcef..d49a518c 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.track.TrackBlock} to account for sub-levels when computing placement orientation.
+ */
+
@Mixin(TrackBlock.class)
public class TrackBlockMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockOutlineMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockOutlineMixin.java
index e374f7d6..cfdb3ca2 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockOutlineMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackBlockOutlineMixin.java
@@ -29,6 +29,10 @@
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.track.TrackBlockOutline} so track outline rendering and picking account for sub-levels.
+ */
+
@Mixin(TrackBlockOutline.class)
public class TrackBlockOutlineMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackGraphVisualizerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackGraphVisualizerMixin.java
index 000ae0cb..a0ff77c9 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackGraphVisualizerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackGraphVisualizerMixin.java
@@ -15,6 +15,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.graph.TrackGraphVisualizer} so track graph visualization displays correctly in sub-levels.
+ */
+
@Mixin(TrackGraphVisualizer.class)
public class TrackGraphVisualizerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackPlacementMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackPlacementMixin.java
index 6e38589d..afa60cf1 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackPlacementMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackPlacementMixin.java
@@ -12,6 +12,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.track.TrackPlacement} to account for sub-level orientation when connecting tracks.
+ */
+
@Mixin(TrackPlacement.class)
public class TrackPlacementMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackTargetingClientMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackTargetingClientMixin.java
index 6d24adc5..42d3d56d 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackTargetingClientMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/tracks/TrackTargetingClientMixin.java
@@ -17,6 +17,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.track.TrackTargetingClient} to render track targeting using sub-level poses.
+ */
+
@Mixin(TrackTargetingClient.class)
public class TrackTargetingClientMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/trains/CarriageContraptionVisualMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/trains/CarriageContraptionVisualMixin.java
index 98c8ab8f..6e1d9642 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/trains/CarriageContraptionVisualMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/trains/CarriageContraptionVisualMixin.java
@@ -20,6 +20,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.trains.entity.CarriageContraptionVisual} so train contraption visuals translate correctly in sub-levels.
+ */
+
@Mixin(CarriageContraptionVisual.class)
public abstract class CarriageContraptionVisualMixin extends ContraptionVisual {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/turntable/TurntableBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/turntable/TurntableBlockMixin.java
index b05b9e27..8616696c 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/turntable/TurntableBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/turntable/TurntableBlockMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.kinetics.turntable.TurntableBlock} to account for sub-level positions when rotating entities.
+ */
+
@Mixin(TurntableBlock.class)
public class TurntableBlockMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/wand_of_symmetry/SymmetryHandlerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/wand_of_symmetry/SymmetryHandlerMixin.java
index d75a62bc..c5abef1f 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/wand_of_symmetry/SymmetryHandlerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/create/wand_of_symmetry/SymmetryHandlerMixin.java
@@ -11,6 +11,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link com.simibubi.create.content.equipment.symmetryWand.SymmetryHandler} to apply sub-level offsets when rendering the symmetry wand effect.
+ */
+
@Mixin(SymmetryHandler.class)
public class SymmetryHandlerMixin {
@Redirect(method = "onRenderWorld", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(DDD)V", ordinal = 0))
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/AbstractBlockEntityVisualMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/AbstractBlockEntityVisualMixin.java
index 97c8e3c6..603f6ded 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/AbstractBlockEntityVisualMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/AbstractBlockEntityVisualMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual} to scale lighting for block entity visuals in sub-levels.
+ */
+
@Mixin(AbstractBlockEntityVisual.class)
public class AbstractBlockEntityVisualMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EmbeddedEnvironmentMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EmbeddedEnvironmentMixin.java
index 2824ef21..b28ae997 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EmbeddedEnvironmentMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EmbeddedEnvironmentMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.backend.engine.embed.EmbeddedEnvironment} to write scene and sky light uniforms for sub-level embeddings.
+ */
+
@Mixin(EmbeddedEnvironment.class)
public class EmbeddedEnvironmentMixin implements EmbeddedEnvironmentExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EngineImplMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EngineImplMixin.java
index 8e3c56a5..747fb5de 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EngineImplMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EngineImplMixin.java
@@ -13,6 +13,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.backend.engine.EngineImpl} to replace the default light storage with Sable's sub-level aware implementation.
+ */
+
@Mixin(EngineImpl.class)
public class EngineImplMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EnvironmentStorageMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EnvironmentStorageMixin.java
index aadff0da..25840891 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EnvironmentStorageMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/EnvironmentStorageMixin.java
@@ -7,6 +7,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.backend.engine.embed.EnvironmentStorage} to enlarge element size to hold sub-level scene info.
+ */
+
@Mixin(EnvironmentStorage.class)
public class EnvironmentStorageMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/LightStorageAccessor.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/LightStorageAccessor.java
index 73a8323d..5db7a507 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/LightStorageAccessor.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/LightStorageAccessor.java
@@ -5,6 +5,10 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.backend.engine.LightStorage} to expose its collector and LUT rebuild flag.
+ */
+
@Mixin(LightStorage.class)
public interface LightStorageAccessor {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/MatrixBufferMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/MatrixBufferMixin.java
index 1435ef73..624eccec 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/MatrixBufferMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/MatrixBufferMixin.java
@@ -7,6 +7,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.backend.engine.indirect.MatrixBuffer} to enlarge the matrix buffer stride to hold sub-level scene info.
+ */
+
@Debug(export = true)
@Mixin(MatrixBuffer.class)
public class MatrixBufferMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/RenderDispatcherImplMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/RenderDispatcherImplMixin.java
index 0c960cc3..0dbe717d 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/RenderDispatcherImplMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/RenderDispatcherImplMixin.java
@@ -12,6 +12,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into VisualizationManagerImpl.RenderDispatcherImpl to update sub-level embeddings before each frame.
+ */
+
@Mixin(targets = "dev.engine_room.flywheel.impl.visualization.VisualizationManagerImpl$RenderDispatcherImpl")
public class RenderDispatcherImplMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/ShaderSourcesMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/ShaderSourcesMixin.java
index d3aa663b..e6d1cac3 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/ShaderSourcesMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/ShaderSourcesMixin.java
@@ -3,6 +3,10 @@
import dev.engine_room.flywheel.backend.glsl.ShaderSources;
import org.spongepowered.asm.mixin.Mixin;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.backend.glsl.ShaderSources} to load shader sources used for sub-level rendering.
+ */
+
@Mixin(ShaderSources.class)
public class ShaderSourcesMixin {
}
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/VisualManagerImplMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/VisualManagerImplMixin.java
index c6b68d17..0033a3cc 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/VisualManagerImplMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/flywheel/VisualManagerImplMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+/**
+ * Mixin into {@link dev.engine_room.flywheel.impl.visualization.VisualManagerImpl} to provide visualization contexts for sub-level embeddings.
+ */
+
@Mixin(value = VisualManagerImpl.class, remap = false)
public abstract class VisualManagerImplMixin> implements VisualManager {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockEntityMixin.java
index 3637245b..bbec4f12 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockEntityMixin.java
@@ -10,6 +10,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link dev.protomanly.pmweather.block.entity.AnemometerBlockEntity} (Protomanly's Weather) to query wind from sub-level positions.
+ */
+
@Mixin(AnemometerBlockEntity.class)
public class AnemometerBlockEntityMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockMixin.java
index 3ca60c52..7dcf4305 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/AnemometerBlockMixin.java
@@ -10,6 +10,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link dev.protomanly.pmweather.block.AnemometerBlock} (Protomanly's Weather) to query wind from sub-level positions.
+ */
+
@Mixin(AnemometerBlock.class)
public class AnemometerBlockMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/RadarRendererMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/RadarRendererMixin.java
index 2dfa8d88..956c578b 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/RadarRendererMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/pmweather/RadarRendererMixin.java
@@ -14,6 +14,10 @@
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
+/**
+ * Mixin into {@link dev.protomanly.pmweather.render.RadarRenderer} (Protomanly's Weather) so radar rendering accounts for sub-levels.
+ */
+
@Mixin(RadarRenderer.class)
public class RadarRendererMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/sodiumextras/EmbyToolsMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/sodiumextras/EmbyToolsMixin.java
index 580c77b2..272f1036 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/sodiumextras/EmbyToolsMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/compatibility/sodiumextras/EmbyToolsMixin.java
@@ -8,6 +8,10 @@
import org.spongepowered.asm.mixin.Overwrite;
import toni.sodiumextras.EmbyTools;
+/**
+ * Mixin into {@link toni.sodiumextras.EmbyTools} (Sodium Extras) so distance checks account for sub-levels.
+ */
+
@Mixin(EmbyTools.class)
public class EmbyToolsMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/dynamic_directional_shading/SectionCompilerMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/dynamic_directional_shading/SectionCompilerMixin.java
index 728b2701..f94df6bb 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/dynamic_directional_shading/SectionCompilerMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/dynamic_directional_shading/SectionCompilerMixin.java
@@ -19,6 +19,10 @@
import java.util.List;
+/**
+ * Mixin into {@link net.minecraft.client.renderer.chunk.SectionCompiler} to mark sub-level sections to enable dynamic directional shading.
+ */
+
@Mixin(SectionCompiler.class)
public class SectionCompilerMixin {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entities_stick_sublevels/effects/LivingEntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entities_stick_sublevels/effects/LivingEntityMixin.java
index e1f995c1..1f006ba8 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entities_stick_sublevels/effects/LivingEntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entities_stick_sublevels/effects/LivingEntityMixin.java
@@ -12,6 +12,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.LivingEntity} to use the standing position when playing fall sounds on sub-levels.
+ */
+
@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin extends Entity {
public LivingEntityMixin(final EntityType> entityType, final Level level) {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entity/entity_swimming/EntityMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entity/entity_swimming/EntityMixin.java
index 70cd5950..6e482fa9 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entity/entity_swimming/EntityMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/entity/entity_swimming/EntityMixin.java
@@ -36,6 +36,10 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+/**
+ * Mixin into {@link net.minecraft.world.entity.Entity} so swimming and fluid height calculations account for fluid in sub-levels.
+ */
+
@Mixin(value = Entity.class, priority = 500)
public abstract class EntityMixin implements IEntityExtension {
diff --git a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/sound/MovingSoundInstanceDelegateMixin.java b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/sound/MovingSoundInstanceDelegateMixin.java
index 56a951f0..f123395a 100644
--- a/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/sound/MovingSoundInstanceDelegateMixin.java
+++ b/neoforge/src/main/java/dev/ryanhcode/sable/neoforge/mixin/sound/MovingSoundInstanceDelegateMixin.java
@@ -11,6 +11,10 @@
import java.util.concurrent.CompletableFuture;
+/**
+ * Mixin into {@link dev.ryanhcode.sable.sound.MovingSoundInstanceDelegate} to delegate audio stream loading for moving sound instances.
+ */
+
@Mixin(MovingSoundInstanceDelegate.class)
public abstract class MovingSoundInstanceDelegateMixin implements SoundInstance {