Skip to content

升級 Minecraft 26.1.2 + 更新 GitHub Actions SHA pin#476

Draft
jimchen5209 wants to merge 26 commits into
masterfrom
26.1.2
Draft

升級 Minecraft 26.1.2 + 更新 GitHub Actions SHA pin#476
jimchen5209 wants to merge 26 commits into
masterfrom
26.1.2

Conversation

@jimchen5209
Copy link
Copy Markdown
Member

摘要

將 Galaxy 從 Minecraft 1.21.11 升級至 26.1.2,並更新 GitHub Actions CI 的版本。

建置變更

  • Minecraft:1.21.11 → 26.1.2
  • Fabric Loader:0.18.3 → 0.19.2
  • Fabric API:0.140.0+1.21.11 → 0.146.1+26.1.2
  • Galaxy Lib:2235da5 → 9546e40
  • Kotlin:2.3.0
  • Java:21 → 25
  • Gradle Wrapper:9.4.1
  • Fabric Loom:1.14-SNAPSHOT → 1.16.1

Minecraft 26.1.x 變更

  • 26.1 無混淆,不需要 mappings(移除 loom.officialMojangMappings()
  • 所有 fabric-api 依賴從 modImplementation 改為 implementation
  • Mixin 與核心程式碼更新以相容 26.1.2

GitHub Actions CI(已更新為 SHA pin)

Action 舊版 新版
actions/checkout v4(tag) de0fac2e4500dabe0009e67214ff5f5447ce83dd # 6.0.2
actions/cache v4(tag) 27d5ce7f107fe9357f9df03efb73ab90386fccae # 5.0.5
actions/setup-java v4(tag) be666c2fcd27ec809703dec50e508c2fdc7f6654 # 5.2.0
gradle/actions wrapper-validation@v4(tag) 50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
actions/upload-artifact v4(tag) 043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
actions/download-artifact v4(tag) 3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v4.1.0
docker/login-action v3(tag) 4907a6ddec9925e35a0a9e82d7399ccc52663121 # 4.1.0

Docker 映像檔

  • Minecraft 版本更新至 26.1.2
  • Fabric 版本更新至 0.19.2
  • Krypton 暫時停用(等待 26.1.2 支援)
  • 所有 mods 更新至 26.1.2 相容版本

其他更新

###破壞性變更

  • 需要 Java 25(原本是 Java 21)
  • 僅支援 Minecraft 26.1.2

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 19, 2026

Warning

Rate limit exceeded

@jimchen5209 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 26 minutes and 14 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 532fdcbc-2b9d-48c9-a31f-5d60775b48df

📥 Commits

Reviewing files that changed from the base of the PR and between 82fe804 and 0170867.

📒 Files selected for processing (3)
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinDisableHardLink_FileFixerUpper.java
  • src/main/kotlin/one/oktw/galaxy/player/Harvest.kt
  • src/main/resources/tweak.mixin.json
📝 Walkthrough

Walkthrough

Upgrades Java/Gradle/Fabric toolchains, migrates multiple Minecraft/Fabric APIs (click/tick/chunk/registry), retargets several mixin hook points, adds a ServerClockManager real-time tick mixin, updates CI action pins and submodule pointers, and adjusts messaging/networking and access-widener rules.

Changes

Cohort / File(s) Summary
CI / Build
/.circleci/config.yml, /.github/workflows/workflow.yml, gradle/wrapper/gradle-wrapper.properties, gradlew, build.gradle.kts
Bump Java toolchain 21→25, pin GitHub Actions to SHAs, upgrade Gradle wrapper to 9.4.1, update Loom/Fabric plugin and build constants, and simplify submodule checkout.
Docker Submodule
docker
Advance git submodule commit pointer to a new SHA.
Mixins — Chat Retargeting
src/main/java/one/oktw/galaxy/mixin/event/.../MixinPlayerChat_EmoteCommands.java, src/main/java/one/oktw/galaxy/mixin/event/.../MixinPlayerChat_SayCommand.java
Retarget mixin redirects/injects to lambda$register$1; handler behavior preserved.
Mixins — Chunk/Position Encoding
src/main/java/one/oktw/galaxy/mixin/tweak/.../MixinAsyncChunk_IOWorker.java, .../MixinAsyncChunk_ServerGamePacketListener.java, .../MixinMapExistingChunk_MapItem.java
Replace ChunkPos.toLong()/asLong() usages with ChunkPos.pack() for ordering, keys, and ticking checks.
Mixins — Projectile Injection
src/main/java/one/oktw/galaxy/mixin/tweak/MixinThrownCountdown_Entity.java
Retarget injection to updateFluidInteraction and change callback to CallbackInfoReturnable<Boolean>; logic unchanged.
Real-Time Clock
src/main/java/org/spongepowered/common/mixin/realtime/world/ServerClockManagerMixin_RealTime.java, src/main/java/org/spongepowered/common/mixin/realtime/world/ServerLevelMixin_RealTime.java, src/main/resources/sponge.realtime.mixin.json
Add ServerClockManager mixin to advance ClockInstance ticks based on real-time ticks when ADVANCE_TIME is enabled; remove prior ServerLevel time hook and register new mixin.
Networking / Payloads
src/main/kotlin/one/oktw/galaxy/Main.kt, src/main/kotlin/one/oktw/galaxy/chat/Exchange.kt
Register payloads under serverboundPlay/clientboundPlay and use ServerPlayNetworking.createClientboundPacket/send APIs.
GUI / Click API Migration
src/main/kotlin/one/oktw/galaxy/.../HTCraftingTableBlockEntity.kt, .../TestGuiBlockEntity.kt, .../Creative.kt, .../GUI.kt, .../GUIClickEvent.kt
Migrate UI click handling from ClickTypeContainerInput, update constructors/handlers and event types.
Messaging Changes
src/main/kotlin/one/oktw/galaxy/command/commands/*
Replace displayClientMessage(...) with sendSystemMessage(...) for player notifications; adopt Kotlin duration .milliseconds usages.
Model / BlockItem API
src/main/kotlin/one/oktw/galaxy/block*/ModelCustomBlock*.kt, src/main/kotlin/one/oktw/galaxy/block/*, src/main/kotlin/one/oktw/galaxy/block/entity/*, src/main/kotlin/one/oktw/galaxy/item/CustomBlockItem.kt
Switch model APIs to accept/store CustomBlockItem instead of ItemStack; update constructors/usages and related block registrations.
Block Entities & NBT
src/main/kotlin/one/oktw/galaxy/block/entity/ModelCustomBlockEntity.kt, CustomBlockEntity.kt, HarvestBlockEntity.kt, TrashcanBlockEntity.kt
Use BuiltInRegistries for block-entity keys, adjust NBT child access patterns, annotate removeComponentsFromTag as deprecated, and change model item types to CustomBlockItem.
Tick Event Refactor
src/main/kotlin/one/oktw/galaxy/block/event/*, src/main/kotlin/one/oktw/galaxy/player/Harvest.kt
Move cleanup/tick registrations from END_WORLD_TICK to END_LEVEL_TICK and simplify handlers to lambdas.
Recipes / Misc
src/main/kotlin/one/oktw/galaxy/item/recipe/CustomItemRecipe.kt, other small files
Minor internal logic tweaks (example name resolution, tag checks, copyright year bumps).
Manifest & Access Widener
src/main/resources/fabric.mod.json, src/main/resources/galaxy.accesswidener
Bump mod target to Minecraft 26.x, require Fabric Loader >=0.19.1 and Fabric API >=0.145.4; upgrade access widener to v2 official and expose ServerClockManager$ClockInstance.

Sequence Diagram(s)

sequenceDiagram
    participant Server as Server
    participant ClockMgr as ServerClockManager
    participant ClockInst as ClockInstance

    Note over Server,ClockMgr: on each server tick
    Server->>ClockMgr: tick()
    alt GameRule ADVANCE_TIME enabled
        ClockMgr->>Server: getRealTimeTicks()
        Server-->>ClockMgr: realTimeTicks (n)
        loop diff = n - 1 times
            ClockMgr->>ClockInst: tick() / advanceTick()
        end
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Suggested labels

type: enhancement, type: feature, status: needs testing, status: needs review, system: galaxy

Suggested reviewers

  • james58899
  • bill96012

Poem

🐰 I hopped from twenty-one up to twenty-five,
ClockInstances tick and now feel more alive,
Clicks became ContainerInput with a cheer,
pack() lined up chunks when the ticks draw near,
A little rabbit nods — real-time's in gear! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.13% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main changes: upgrading Minecraft to version 26.1.2 and updating GitHub Actions to use SHA pins, which are the primary objectives of this PR.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, covering build upgrades, Minecraft 26.1.x compatibility changes, GitHub Actions updates, Docker image changes, and breaking changes. It effectively communicates the scope and rationale of the PR.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the project to Minecraft 26.1.2, Java 25, and Gradle 9.4.1, involving extensive API migrations across Mixins, networking, and GUI systems. Key changes include the transition from ClickType to ContainerInput, updates to ChunkPos utility methods, and refactoring ModelCustomBlock to use lazy initialization for item stacks. Review feedback highlighted a bug in CustomItem where disabling caching results in the loss of custom item data, and a regression in ModelCustomBlockEntity where removing entity tag filters could cause the accidental deletion of unrelated decorative entities.

return this
}

open fun createItemStack(): ItemStack = if (cacheable) cacheItemStack.copy() else ItemStack(baseItem)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

目前的 createItemStack 實作在 cacheablefalse 時會回傳原始的 ItemStack(baseItem)。這會導致遺失所有自定義屬性(如名稱、模型、Galaxy 數據等),因為這些初始化邏輯目前僅存在於 cacheItemStack 的 lazy 初始化區塊中。建議將初始化邏輯提取到一個獨立的方法中,以便在 cacheablefalse 時也能正確建立包含自定義數據的 ItemStack

// Kill leak entities
(level as ServerLevel).getEntities(EntityType.ITEM_DISPLAY) { it.blockPosition() == worldPosition && it.tags.contains("BLOCK") }.forEach {
// Kill leak entities (remove tag check - tags is now Set<TagKey<?>> not Set<String> in 26.1)
(level as ServerLevel).getEntities(EntityType.ITEM_DISPLAY) { it.blockPosition() == worldPosition }.forEach {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

移除標籤檢查(tag check)是有風險的。這會導致此方塊實體在 tick 時刪除該位置的所有 ITEM_DISPLAY 實體,包括玩家或其他模組放置的裝飾性實體。雖然 Minecraft API 有所變動,但實體標籤(透過 addTag 添加的字串標籤)仍然存在且可用於過濾。建議保留 "BLOCK" 標籤的檢查,以確保僅刪除由本模組產生的實體。

Suggested change
(level as ServerLevel).getEntities(EntityType.ITEM_DISPLAY) { it.blockPosition() == worldPosition }.forEach {
(level as ServerLevel).getEntities(EntityType.ITEM_DISPLAY) { it.blockPosition() == worldPosition && it.tags.contains("BLOCK") }.forEach {

…romTag

- Remove unnecessary `?.` safe calls after `childOrEmpty("galaxy_data")` in `loadAdditional` and `readCopyableData`
- Add `@Deprecated` annotation to `removeComponentsFromTag` method
- Remove deprecated setDayTime/shadow from ServerLevelMixin_RealTime
- Add ServerClockManagerMixin_RealTime for real-time tick handling
- Register new mixin in sponge.realtime.mixin.json
- Expose ServerClockManager$ClockInstance in access widener

Real-time feature now uses ServerClockManager.tick() instead of ServerLevel.tickTime(), adapting to Minecraft 26.x API changes where getDayTime()/setDayTime() were removed.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/main/kotlin/one/oktw/galaxy/block/entity/ModelCustomBlockEntity.kt (1)

83-89: ⚠️ Potential issue | 🟡 Minor

Add missing super.removeComponentsFromTag(view) call.

All other overrides of removeComponentsFromTag in this codebase (HarvestBlockEntity and TestGuiBlockEntity) call super.removeComponentsFromTag(view) before performing their custom logic, even though they are marked @Deprecated("Deprecated in Java"). This override breaks that convention by skipping the super call, which may result in the parent class's cleanup logic not running. Add super.removeComponentsFromTag(view) as the first line of this method.

Additionally, the hard cast on line 85 (view as TagValueOutput) assumes the framework always passes TagValueOutput instances; if called with other ValueOutput types, this will throw ClassCastException. Consider verifying the method contract with Mojang's BlockEntity.removeComponentsFromTag documentation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/kotlin/one/oktw/galaxy/block/entity/ModelCustomBlockEntity.kt`
around lines 83 - 89, Add a call to super.removeComponentsFromTag(view) as the
first statement in the override of removeComponentsFromTag so the parent cleanup
runs, and avoid an unsafe cast by checking that view is a TagValueOutput (e.g.,
if (view !is TagValueOutput) return) before calling buildResult(); then cast
safely or use the smart-cast to access buildResult(), read "galaxy_data", remove
"model_entity" and "facing", and call view.discard("galaxy_data") if the
CompoundTag is empty to preserve the current behavior.
src/main/java/one/oktw/galaxy/mixin/tweak/MixinThrownCountdown_Entity.java (1)

40-50: ⚠️ Potential issue | 🔴 Critical

Critical behavioral regression: intoWater now increments every tick regardless of water contact — arrows will be discarded ~10 ticks after spawn.

The injection point changed from updateInWaterStateAndDoWaterCurrentPushing at the INVOKE of doWaterSplashEffect() (which fires only during water interaction) to updateFluidInteraction at RETURN (which is invoked every entity tick). Because intoWater++ executes unconditionally on every callback, arrows are now discarded ~10 ticks after spawn regardless of fluid contact.

The fix is to restore the water-contact guard using isInWater() or the CallbackInfoReturnable<Boolean> return value before incrementing the counter.

🛡️ Suggested guard so the counter only advances on actual water contact
     `@Inject`(method = "updateFluidInteraction",
         at = `@At`(value = "RETURN"))
     private void countIntoWater(CallbackInfoReturnable<Boolean> ci) {
+        // Only count ticks the entity is actually in water; otherwise arrows would be
+        // discarded ~10 ticks after spawn regardless of fluid contact.
+        Entity self = (Entity) (Object) this;
+        if (!self.isInWater()) return;
         //noinspection ConstantConditions
         if (((Object) this) instanceof Arrow || ((Object) this) instanceof SpectralArrow) {
             if (intoWater > 10) {
                 discard();
             }
         }
         intoWater++;
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/one/oktw/galaxy/mixin/tweak/MixinThrownCountdown_Entity.java`
around lines 40 - 50, The injected method countIntoWater on
updateFluidInteraction increments intoWater every tick causing arrows to be
discarded even when not in water; change the logic to only advance the counter
when the entity is actually in water by checking isInWater() (or by using
ci.getReturnValue() from CallbackInfoReturnable<Boolean> which indicates water
interaction) and only then increment intoWater and call discard() when > 10 for
Arrow/SpectralArrow.
🧹 Nitpick comments (9)
src/main/kotlin/one/oktw/galaxy/player/Harvest.kt (1)

35-35: Optional: drop the unused lambda parameter.

serverWorld is unused in the cleanup body. Replacing it with _ (or omitting the explicit name to use the implicit it) would be more idiomatic Kotlin and consistent with the style used in AngelBlock.kt. Functionally LGTM.

♻️ Proposed nit
-        ServerTickEvents.END_LEVEL_TICK.register { serverWorld -> justHarvested.clear() }
+        ServerTickEvents.END_LEVEL_TICK.register { _ -> justHarvested.clear() }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/kotlin/one/oktw/galaxy/player/Harvest.kt` at line 35, The lambda
passed to ServerTickEvents.END_LEVEL_TICK.register currently names an unused
parameter `serverWorld`; change the lambda to omit the explicit parameter or
replace it with `_` so the body simply calls justHarvested.clear() (i.e., update
the registration at ServerTickEvents.END_LEVEL_TICK.register to use an
unused-parameter underscore or implicit it, matching the style in AngelBlock.kt
and removing the unused symbol).
src/main/java/one/oktw/galaxy/mixin/tweak/MixinMapExistingChunk_MapItem.java (1)

38-43: Resolve the TODO and simplify the redundant ChunkPos allocations.

The TODO at line 39 is justified: this code uses chunkPos.pack() (instance method) while other mixins consistently use ChunkPos.pack(x, z) (static method). The web search confirms that pack() produces the canonical long encoding (chunkX | (chunkZ << 32)) consumed by isPositionTicking(), so the instance method is semantically correct. However, the inconsistency with the codebase pattern warrants resolving the TODO.

The code also allocates ChunkPos redundantly: once on line 38 for pack(), then again on line 43 for the fallback. Simplify by using the static form and eliminating both allocations:

Suggested refactor
-        ChunkPos chunkPos = new ChunkPos(x, z);
-        if (serverWorld.getChunkSource().isPositionTicking(chunkPos.pack())) { // TODO check this
+        if (serverWorld.getChunkSource().isPositionTicking(ChunkPos.pack(x, z))) {
             LevelChunk chunk = world.getChunkSource().getChunkNow(x, z);
             if (chunk != null) return chunk;
         }
         return new EmptyLevelChunk(world, new ChunkPos(x, z), world.registryAccess().lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.PLAINS));
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/one/oktw/galaxy/mixin/tweak/MixinMapExistingChunk_MapItem.java`
around lines 38 - 43, Replace the instance ChunkPos allocation and pack() call
with the static helper and avoid the redundant allocation: call ChunkPos.pack(x,
z) when calling serverWorld.getChunkSource().isPositionTicking(...) and only
construct a new ChunkPos(x, z) when creating the EmptyLevelChunk fallback; keep
the existing LevelChunk retrieval via world.getChunkSource().getChunkNow(x, z)
and preserve the
registryAccess().lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.PLAINS)
usage.
src/main/kotlin/one/oktw/galaxy/block/entity/HTCraftingTableBlockEntity.kt (1)

31-31: LGTM!

ContainerInput.PICKUP and ContainerInput.CLONE checks align with the new GUIClickEvent.action type. Behavior is preserved.

Optional nit: since ContainerInput.PICKUP is referenced in five places in this file, you could import it directly (e.g., import net.minecraft.world.inventory.ContainerInput.PICKUP) to reduce verbosity, mirroring the wildcard pattern used in GUI.kt.

Also applies to: 100-128, 163-163

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/kotlin/one/oktw/galaxy/block/entity/HTCraftingTableBlockEntity.kt`
at line 31, Add a direct static import for ContainerInput.PICKUP to reduce
verbosity where ContainerInput.PICKUP is referenced in
HTCraftingTableBlockEntity; update the imports in HTCraftingTableBlockEntity.kt
to include import net.minecraft.world.inventory.ContainerInput.PICKUP (you can
leave ContainerInput.CLONE as-is or similarly import CLONE if desired) so the
five occurrences use PICKUP directly, matching the import style used in GUI.kt
and keeping behavior unchanged.
src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_EmoteCommands.java (1)

36-40: Same lambda$register$1 fragility as MixinPlayerChat_SayCommand.

This @Redirect relies on the synthetic lambda index in EmoteCommands.register. The retarget is correct for 26.1.2, but identical caveats apply: future Mojang reorders/inserts inside register will break this silently. Consider adding require = 1 so a failed bind aborts mixin apply rather than silently no-oping the chat-event guard. Same recommendation as filed on MixinPlayerChat_SayCommand.java.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_EmoteCommands.java`
around lines 36 - 40, The `@Redirect` in MixinPlayerChat_EmoteCommands that
targets the synthetic method lambda$register$1 is fragile and may silently fail
if Mojang reorders lambdas; update the `@Redirect` annotation (the one with target
PlayerList.broadcastChatMessage and method = "lambda$register$1") to include
require = 1 so mixin application will abort on a failed bind instead of silently
no-oping the chat-event guard, matching the same fix applied to
MixinPlayerChat_SayCommand and keeping EmoteCommands.register guarded reliably.
src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_SayCommand.java (1)

37-45: Add require = 1 to the @Inject annotation to fail-fast on lambda resolution failure.

The synthetic lambda$register$1 target is indeed fragile across Minecraft updates. Since synthetic lambda names are derived from declaration order within SayCommand.register, any future Mojang refactor that adds, removes, or reorders a lambda in that method will silently shift the index and cause the injection to fail at runtime when the command is invoked.

Adding require = 1 to the @Inject annotation will make the mixin fail immediately at load time if the target cannot be found, rather than silently skipping the injection. This pattern is already used elsewhere in the codebase (e.g., MixinSkipSyncRegistry.java).

Additionally, verify that lambda$register$1 still targets the broadcastChatMessage invocation in the current 26.1.2 source.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_SayCommand.java`
around lines 37 - 45, Update the `@Inject` on MixinPlayerChat_SayCommand targeting
the synthetic method lambda$register$1 to include require = 1 (i.e.,
`@Inject`(..., require = 1, cancellable = true)) so the mixin fails fast if the
lambda/broadcastChatMessage target cannot be resolved; keep the same target
invocation (PlayerList.broadcastChatMessage) and after the change verify that
lambda$register$1 still maps to the broadcastChatMessage invocation in the
current 26.1.2 sources to ensure the injection point is correct.
src/main/java/org/spongepowered/common/mixin/realtime/world/ServerClockManagerMixin_RealTime.java (3)

46-48: Asymmetric null-handling on this.server.

realTimeBridge$getRealTimeTicks() (Lines 61–66) defensively checks this.server != null, but the @Inject at Line 48 dereferences this.server.getGlobalGameRules() without that guard. In vanilla 26.1, ServerClockManager.server is set in the constructor and is effectively non-null during tick(), so this is unlikely to NPE in practice — however the asymmetry is confusing for readers, and other mods could conceivably construct a ServerClockManager outside the normal lifecycle. Either tighten the bridge method (drop the null branch) or guard the inject for consistency.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/org/spongepowered/common/mixin/realtime/world/ServerClockManagerMixin_RealTime.java`
around lines 46 - 48, The inject method realTimeImpl$fixTimeOfDayForRealTime
dereferences this.server without the null guard used in
realTimeBridge$getRealTimeTicks, so add a defensive null check at the start of
realTimeImpl$fixTimeOfDayForRealTime (i.e., return early if this.server == null)
before calling this.server.getGlobalGameRules().get(GameRules.ADVANCE_TIME),
mirroring the null-handling in realTimeBridge$getRealTimeTicks to keep behavior
consistent and avoid potential NPEs from non-standard construction.

52-56: Invert the nested loop to advance each clock once with diff iterations.

The current shape iterates clocks.values() diff times, allocating a new iterator each pass. Iterating clocks once and advancing each by diff gives identical semantics with a single iterator allocation and better cache locality — relevant during long pauses where diff can be large (skipped-tick recovery / debugger stalls).

♻️ Proposed refactor
-            if (diff > 0) {
-                for (int i = 0; i < diff; i++) {
-                    this.clocks.values().forEach(ServerClockManager.ClockInstance::tick);
-                }
-            }
+            if (diff > 0) {
+                for (final ServerClockManager.ClockInstance clock : this.clocks.values()) {
+                    for (long i = 0; i < diff; i++) {
+                        clock.tick();
+                    }
+                }
+            }

Note: also widening the i counter to long since diff is a long (tick deltas in nanos/50_000_000 can exceed Integer.MAX_VALUE only after ~3.4 years of stall, but it removes the implicit narrowing risk and silences IDE warnings).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/org/spongepowered/common/mixin/realtime/world/ServerClockManagerMixin_RealTime.java`
around lines 52 - 56, The nested loops allocate a new iterator for clocks on
each of the diff iterations; invert them so you iterate clocks once and advance
each clock diff times to reduce iterator allocations and improve locality.
Replace the outer for (int i = 0; i < diff; i++)
this.clocks.values().forEach(ServerClockManager.ClockInstance::tick) with a
single iteration over this.clocks.values() (e.g. for
(ServerClockManager.ClockInstance ci : this.clocks.values()) { for (long i = 0;
i < diff; i++) ci.tick(); }) and widen the loop counter to long to match diff.

45-45: Add method descriptor to @Inject for robustness and clarity.

The method = "tick" parameter should include the explicit method descriptor ()V to prevent ambiguity if ServerClockManager gains an overloaded tick(...) method in the future. This is a Mixin best practice that makes the injection target explicit and fault-tolerant:

♻️ Proposed change
-    `@Inject`(method = "tick", at=@At("HEAD"))
+    `@Inject`(method = "tick()V", at = `@At`("HEAD"))
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/org/spongepowered/common/mixin/realtime/world/ServerClockManagerMixin_RealTime.java`
at line 45, The `@Inject` on ServerClockManagerMixin_RealTime currently targets
method = "tick" without a descriptor; update the injection to use the explicit
JVM descriptor by changing the annotation to target method = "tick()V" so the
mixin binds unambiguously to the no-arg void tick method and remains correct if
tick is later overloaded; locate the `@Inject` on ServerClockManagerMixin_RealTime
and replace the method string accordingly.
src/main/resources/fabric.mod.json (1)

32-32: Consider narrowing the minecraft range to 26.1.x.

"26.x" will satisfy any future 26.* (e.g., 26.2.0). Since this PR contains API migrations that are specific to 26.1 internals (ServerClockManager, ContainerInput, etc.), allowing 26.2+ at the manifest level risks Fabric Loader accepting the mod on a Minecraft version where these mixins/refs no longer resolve, producing harder-to-diagnose runtime/mixin errors instead of a clean dependency rejection.

♻️ Proposed tightened range
-    "minecraft": "26.x",
+    "minecraft": "~26.1",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/resources/fabric.mod.json` at line 32, The manifest currently allows
any 26.* Minecraft with "minecraft": "26.x", which could let the mod load on
26.2+ where internal APIs like ServerClockManager and ContainerInput may differ;
update the fabric.mod.json minecraft field to a tightened range that only
permits 26.1 series (e.g., "26.1.x") so Fabric Loader rejects incompatible 26.2+
versions and avoids mixin/runtime resolution errors referencing symbols such as
ServerClockManager and ContainerInput.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@src/main/java/one/oktw/galaxy/mixin/tweak/MixinThrownCountdown_Entity.java`:
- Around line 40-50: The injected method countIntoWater on
updateFluidInteraction increments intoWater every tick causing arrows to be
discarded even when not in water; change the logic to only advance the counter
when the entity is actually in water by checking isInWater() (or by using
ci.getReturnValue() from CallbackInfoReturnable<Boolean> which indicates water
interaction) and only then increment intoWater and call discard() when > 10 for
Arrow/SpectralArrow.

In `@src/main/kotlin/one/oktw/galaxy/block/entity/ModelCustomBlockEntity.kt`:
- Around line 83-89: Add a call to super.removeComponentsFromTag(view) as the
first statement in the override of removeComponentsFromTag so the parent cleanup
runs, and avoid an unsafe cast by checking that view is a TagValueOutput (e.g.,
if (view !is TagValueOutput) return) before calling buildResult(); then cast
safely or use the smart-cast to access buildResult(), read "galaxy_data", remove
"model_entity" and "facing", and call view.discard("galaxy_data") if the
CompoundTag is empty to preserve the current behavior.

---

Nitpick comments:
In
`@src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_EmoteCommands.java`:
- Around line 36-40: The `@Redirect` in MixinPlayerChat_EmoteCommands that targets
the synthetic method lambda$register$1 is fragile and may silently fail if
Mojang reorders lambdas; update the `@Redirect` annotation (the one with target
PlayerList.broadcastChatMessage and method = "lambda$register$1") to include
require = 1 so mixin application will abort on a failed bind instead of silently
no-oping the chat-event guard, matching the same fix applied to
MixinPlayerChat_SayCommand and keeping EmoteCommands.register guarded reliably.

In `@src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_SayCommand.java`:
- Around line 37-45: Update the `@Inject` on MixinPlayerChat_SayCommand targeting
the synthetic method lambda$register$1 to include require = 1 (i.e.,
`@Inject`(..., require = 1, cancellable = true)) so the mixin fails fast if the
lambda/broadcastChatMessage target cannot be resolved; keep the same target
invocation (PlayerList.broadcastChatMessage) and after the change verify that
lambda$register$1 still maps to the broadcastChatMessage invocation in the
current 26.1.2 sources to ensure the injection point is correct.

In
`@src/main/java/one/oktw/galaxy/mixin/tweak/MixinMapExistingChunk_MapItem.java`:
- Around line 38-43: Replace the instance ChunkPos allocation and pack() call
with the static helper and avoid the redundant allocation: call ChunkPos.pack(x,
z) when calling serverWorld.getChunkSource().isPositionTicking(...) and only
construct a new ChunkPos(x, z) when creating the EmptyLevelChunk fallback; keep
the existing LevelChunk retrieval via world.getChunkSource().getChunkNow(x, z)
and preserve the
registryAccess().lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.PLAINS)
usage.

In
`@src/main/java/org/spongepowered/common/mixin/realtime/world/ServerClockManagerMixin_RealTime.java`:
- Around line 46-48: The inject method realTimeImpl$fixTimeOfDayForRealTime
dereferences this.server without the null guard used in
realTimeBridge$getRealTimeTicks, so add a defensive null check at the start of
realTimeImpl$fixTimeOfDayForRealTime (i.e., return early if this.server == null)
before calling this.server.getGlobalGameRules().get(GameRules.ADVANCE_TIME),
mirroring the null-handling in realTimeBridge$getRealTimeTicks to keep behavior
consistent and avoid potential NPEs from non-standard construction.
- Around line 52-56: The nested loops allocate a new iterator for clocks on each
of the diff iterations; invert them so you iterate clocks once and advance each
clock diff times to reduce iterator allocations and improve locality. Replace
the outer for (int i = 0; i < diff; i++)
this.clocks.values().forEach(ServerClockManager.ClockInstance::tick) with a
single iteration over this.clocks.values() (e.g. for
(ServerClockManager.ClockInstance ci : this.clocks.values()) { for (long i = 0;
i < diff; i++) ci.tick(); }) and widen the loop counter to long to match diff.
- Line 45: The `@Inject` on ServerClockManagerMixin_RealTime currently targets
method = "tick" without a descriptor; update the injection to use the explicit
JVM descriptor by changing the annotation to target method = "tick()V" so the
mixin binds unambiguously to the no-arg void tick method and remains correct if
tick is later overloaded; locate the `@Inject` on ServerClockManagerMixin_RealTime
and replace the method string accordingly.

In `@src/main/kotlin/one/oktw/galaxy/block/entity/HTCraftingTableBlockEntity.kt`:
- Line 31: Add a direct static import for ContainerInput.PICKUP to reduce
verbosity where ContainerInput.PICKUP is referenced in
HTCraftingTableBlockEntity; update the imports in HTCraftingTableBlockEntity.kt
to include import net.minecraft.world.inventory.ContainerInput.PICKUP (you can
leave ContainerInput.CLONE as-is or similarly import CLONE if desired) so the
five occurrences use PICKUP directly, matching the import style used in GUI.kt
and keeping behavior unchanged.

In `@src/main/kotlin/one/oktw/galaxy/player/Harvest.kt`:
- Line 35: The lambda passed to ServerTickEvents.END_LEVEL_TICK.register
currently names an unused parameter `serverWorld`; change the lambda to omit the
explicit parameter or replace it with `_` so the body simply calls
justHarvested.clear() (i.e., update the registration at
ServerTickEvents.END_LEVEL_TICK.register to use an unused-parameter underscore
or implicit it, matching the style in AngelBlock.kt and removing the unused
symbol).

In `@src/main/resources/fabric.mod.json`:
- Line 32: The manifest currently allows any 26.* Minecraft with "minecraft":
"26.x", which could let the mod load on 26.2+ where internal APIs like
ServerClockManager and ContainerInput may differ; update the fabric.mod.json
minecraft field to a tightened range that only permits 26.1 series (e.g.,
"26.1.x") so Fabric Loader rejects incompatible 26.2+ versions and avoids
mixin/runtime resolution errors referencing symbols such as ServerClockManager
and ContainerInput.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f4a56a01-cf9d-4a75-94fd-4e5df3dfdb47

📥 Commits

Reviewing files that changed from the base of the PR and between 131f585 and cbf5800.

⛔ Files ignored due to path filters (1)
  • gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
📒 Files selected for processing (33)
  • .circleci/config.yml
  • .github/workflows/workflow.yml
  • build.gradle.kts
  • docker
  • gradle/wrapper/gradle-wrapper.properties
  • gradlew
  • src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_EmoteCommands.java
  • src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_SayCommand.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinAsyncChunk_IOWorker.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinAsyncChunk_ServerGamePacketListener.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinMapExistingChunk_MapItem.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinThrownCountdown_Entity.java
  • src/main/java/org/spongepowered/common/mixin/realtime/world/ServerClockManagerMixin_RealTime.java
  • src/main/java/org/spongepowered/common/mixin/realtime/world/ServerLevelMixin_RealTime.java
  • src/main/kotlin/one/oktw/galaxy/Main.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/CustomBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/HTCraftingTableBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/ModelCustomBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/TestGuiBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/event/AngelBlock.kt
  • src/main/kotlin/one/oktw/galaxy/block/event/BlockEvents.kt
  • src/main/kotlin/one/oktw/galaxy/chat/Exchange.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/Home.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/Join.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/Spawn.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/admin/Creative.kt
  • src/main/kotlin/one/oktw/galaxy/gui/GUI.kt
  • src/main/kotlin/one/oktw/galaxy/gui/GUIClickEvent.kt
  • src/main/kotlin/one/oktw/galaxy/item/recipe/CustomItemRecipe.kt
  • src/main/kotlin/one/oktw/galaxy/player/Harvest.kt
  • src/main/resources/fabric.mod.json
  • src/main/resources/galaxy.accesswidener
  • src/main/resources/sponge.realtime.mixin.json
💤 Files with no reviewable changes (1)
  • src/main/java/org/spongepowered/common/mixin/realtime/world/ServerLevelMixin_RealTime.java

- Remove unused `serverLevelData` shadow field from `ServerLevelMixin_RealTime`
- Convert Java `Duration`/`TimeUnit` delays to Kotlin `Duration.Companion.milliseconds` in `Join`, `Home`, and `Spawn` commands

Aligns with Kotlin best practices for time-based delays.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
src/main/kotlin/one/oktw/galaxy/player/Harvest.kt (1)

35-35: Optional: drop the unused serverWorld lambda parameter for consistency.

AngelBlock.kt uses the parameter-less form for the same cleanup. Aligning the style here is a minor readability nit.

♻️ Proposed tweak
-        ServerTickEvents.END_LEVEL_TICK.register { serverWorld -> justHarvested.clear() }
+        ServerTickEvents.END_LEVEL_TICK.register { justHarvested.clear() }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/kotlin/one/oktw/galaxy/player/Harvest.kt` at line 35, Remove the
unused lambda parameter by changing the registration of
ServerTickEvents.END_LEVEL_TICK to use a parameter-less lambda; specifically
update the call to ServerTickEvents.END_LEVEL_TICK.register so it invokes
justHarvested.clear() without the unused serverWorld parameter to match the
style used in AngelBlock.kt.
src/main/kotlin/one/oktw/galaxy/command/commands/Spawn.kt (1)

64-64: Optional: simplify to 1.seconds for idiomatic Kotlin Duration usage.

Since this commit migrates to the Kotlin Duration API, TimeUnit.SECONDS.toMillis(1).milliseconds could be expressed more directly as 1.seconds, dropping the TimeUnit indirection (and the java.util.concurrent.TimeUnit import if no other usage remains). Note: applying this here would diverge from the same pattern in Home.kt / Join.kt, so consider doing it consistently across all three commands or leaving as-is for parity.

♻️ Proposed change
-import java.util.concurrent.TimeUnit
-import kotlin.time.Duration.Companion.milliseconds
+import kotlin.time.Duration.Companion.seconds
@@
-                delay(TimeUnit.SECONDS.toMillis(1).milliseconds)
+                delay(1.seconds)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/kotlin/one/oktw/galaxy/command/commands/Spawn.kt` at line 64,
Replace the verbose Duration expression in Spawn.kt — the
delay(TimeUnit.SECONDS.toMillis(1).milliseconds) call — with the idiomatic
Kotlin Duration literal 1.seconds; update the import usage (remove
java.util.concurrent.TimeUnit if it's no longer used) and consider applying the
same change consistently to Home.kt and Join.kt to keep parity across the
command implementations (look for delay(...) calls in the Spawn command handler
or method where this line appears).
src/main/kotlin/one/oktw/galaxy/item/CustomBlockItem.kt (1)

29-37: Optional: avoid repeated as CustomBlockItem casts.

Since CustomItem.registry is typed as CustomRegistry<CustomItem>, register() returns the supertype and forces a cast on every entry. You can sidestep this with also, which preserves the subtype:

♻️ Proposed refactor
-        val HT_CRAFTING_TABLE = registry.register(CustomBlockItem("ht_crafting_table", "block.HT_CRAFTING_TABLE")) as CustomBlockItem
-        val ELEVATOR = registry.register(CustomBlockItem("elevator", "block.ELEVATOR")) as CustomBlockItem
-        val ANGEL_BLOCK = registry.register(CustomBlockItem("angel_block", "block.ANGEL_BLOCK")) as CustomBlockItem
-        val TRASHCAN = registry.register(CustomBlockItem("trashcan", "block.TRASHCAN")) as CustomBlockItem
-        val TELEPORTER_CORE_BASIC = registry.register(CustomBlockItem("teleporter_core_basic", "block.TELEPORTER")) as CustomBlockItem
-        val TELEPORTER_CORE_ADVANCE = registry.register(CustomBlockItem("teleporter_core_advance", "block.TELEPORTER_ADVANCED")) as CustomBlockItem
-        val TELEPORTER_FRAME = registry.register(CustomBlockItem("teleporter_frame", "block.TELEPORTER_FRAME")) as CustomBlockItem
-        val TEST_GUI = registry.register(CustomBlockItem("test_gui", "block.TEST_GUI")) as CustomBlockItem
-        val HARVEST = registry.register(CustomBlockItem("harvest", "block.HARVEST")) as CustomBlockItem
+        val HT_CRAFTING_TABLE = CustomBlockItem("ht_crafting_table", "block.HT_CRAFTING_TABLE").also { registry.register(it) }
+        val ELEVATOR = CustomBlockItem("elevator", "block.ELEVATOR").also { registry.register(it) }
+        val ANGEL_BLOCK = CustomBlockItem("angel_block", "block.ANGEL_BLOCK").also { registry.register(it) }
+        val TRASHCAN = CustomBlockItem("trashcan", "block.TRASHCAN").also { registry.register(it) }
+        val TELEPORTER_CORE_BASIC = CustomBlockItem("teleporter_core_basic", "block.TELEPORTER").also { registry.register(it) }
+        val TELEPORTER_CORE_ADVANCE = CustomBlockItem("teleporter_core_advance", "block.TELEPORTER_ADVANCED").also { registry.register(it) }
+        val TELEPORTER_FRAME = CustomBlockItem("teleporter_frame", "block.TELEPORTER_FRAME").also { registry.register(it) }
+        val TEST_GUI = CustomBlockItem("test_gui", "block.TEST_GUI").also { registry.register(it) }
+        val HARVEST = CustomBlockItem("harvest", "block.HARVEST").also { registry.register(it) }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/kotlin/one/oktw/galaxy/item/CustomBlockItem.kt` around lines 29 -
37, The registrations repeatedly cast registry.register(...) to CustomBlockItem;
instead instantiate the CustomBlockItem first and call registry.register on that
instance using also to preserve the subtype (e.g. val HT_CRAFTING_TABLE =
CustomBlockItem("ht_crafting_table","block.HT_CRAFTING_TABLE").also {
registry.register(it) }), doing the same for ELEVATOR, ANGEL_BLOCK, TRASHCAN,
TELEPORTER_CORE_BASIC, TELEPORTER_CORE_ADVANCE, TELEPORTER_FRAME, TEST_GUI, and
HARVEST so you avoid the repeated as CustomBlockItem casts while keeping the
same registry.register call.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/main/kotlin/one/oktw/galaxy/command/commands/Spawn.kt`:
- Line 64: Replace the verbose Duration expression in Spawn.kt — the
delay(TimeUnit.SECONDS.toMillis(1).milliseconds) call — with the idiomatic
Kotlin Duration literal 1.seconds; update the import usage (remove
java.util.concurrent.TimeUnit if it's no longer used) and consider applying the
same change consistently to Home.kt and Join.kt to keep parity across the
command implementations (look for delay(...) calls in the Spawn command handler
or method where this line appears).

In `@src/main/kotlin/one/oktw/galaxy/item/CustomBlockItem.kt`:
- Around line 29-37: The registrations repeatedly cast registry.register(...) to
CustomBlockItem; instead instantiate the CustomBlockItem first and call
registry.register on that instance using also to preserve the subtype (e.g. val
HT_CRAFTING_TABLE =
CustomBlockItem("ht_crafting_table","block.HT_CRAFTING_TABLE").also {
registry.register(it) }), doing the same for ELEVATOR, ANGEL_BLOCK, TRASHCAN,
TELEPORTER_CORE_BASIC, TELEPORTER_CORE_ADVANCE, TELEPORTER_FRAME, TEST_GUI, and
HARVEST so you avoid the repeated as CustomBlockItem casts while keeping the
same registry.register call.

In `@src/main/kotlin/one/oktw/galaxy/player/Harvest.kt`:
- Line 35: Remove the unused lambda parameter by changing the registration of
ServerTickEvents.END_LEVEL_TICK to use a parameter-less lambda; specifically
update the call to ServerTickEvents.END_LEVEL_TICK.register so it invokes
justHarvested.clear() without the unused serverWorld parameter to match the
style used in AngelBlock.kt.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: eb572651-8121-4192-991d-0a1c2178637c

📥 Commits

Reviewing files that changed from the base of the PR and between 01595b1 and 82fe804.

📒 Files selected for processing (32)
  • src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_EmoteCommands.java
  • src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_SayCommand.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinAsyncChunk_IOWorker.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinAsyncChunk_ServerGamePacketListener.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinMapExistingChunk_MapItem.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinThrownCountdown_Entity.java
  • src/main/java/org/spongepowered/common/mixin/realtime/world/ServerLevelMixin_RealTime.java
  • src/main/kotlin/one/oktw/galaxy/Main.kt
  • src/main/kotlin/one/oktw/galaxy/block/CustomBlock.kt
  • src/main/kotlin/one/oktw/galaxy/block/HTCraftingTable.kt
  • src/main/kotlin/one/oktw/galaxy/block/HarvestBlock.kt
  • src/main/kotlin/one/oktw/galaxy/block/ModelCustomBlock.kt
  • src/main/kotlin/one/oktw/galaxy/block/TestGuiBlock.kt
  • src/main/kotlin/one/oktw/galaxy/block/TrashcanBlock.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/CustomBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/HTCraftingTableBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/HarvestBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/ModelCustomBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/TestGuiBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/TrashcanBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/block/event/AngelBlock.kt
  • src/main/kotlin/one/oktw/galaxy/block/event/BlockEvents.kt
  • src/main/kotlin/one/oktw/galaxy/chat/Exchange.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/Home.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/Join.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/Spawn.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/admin/Creative.kt
  • src/main/kotlin/one/oktw/galaxy/gui/GUI.kt
  • src/main/kotlin/one/oktw/galaxy/gui/GUIClickEvent.kt
  • src/main/kotlin/one/oktw/galaxy/item/CustomBlockItem.kt
  • src/main/kotlin/one/oktw/galaxy/item/recipe/CustomItemRecipe.kt
  • src/main/kotlin/one/oktw/galaxy/player/Harvest.kt
✅ Files skipped from review due to trivial changes (5)
  • src/main/kotlin/one/oktw/galaxy/block/event/BlockEvents.kt
  • src/main/kotlin/one/oktw/galaxy/block/entity/CustomBlockEntity.kt
  • src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_SayCommand.java
  • src/main/kotlin/one/oktw/galaxy/chat/Exchange.kt
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinAsyncChunk_ServerGamePacketListener.java
🚧 Files skipped from review as they are similar to previous changes (10)
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinMapExistingChunk_MapItem.java
  • src/main/kotlin/one/oktw/galaxy/gui/GUIClickEvent.kt
  • src/main/kotlin/one/oktw/galaxy/Main.kt
  • src/main/java/one/oktw/galaxy/mixin/event/MixinPlayerChat_EmoteCommands.java
  • src/main/java/one/oktw/galaxy/mixin/tweak/MixinThrownCountdown_Entity.java
  • src/main/kotlin/one/oktw/galaxy/command/commands/Join.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/admin/Creative.kt
  • src/main/java/org/spongepowered/common/mixin/realtime/world/ServerLevelMixin_RealTime.java
  • src/main/kotlin/one/oktw/galaxy/block/entity/HTCraftingTableBlockEntity.kt
  • src/main/kotlin/one/oktw/galaxy/command/commands/Home.kt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant