From ecf5df9f4f4cfa2f2ee03b0c421b9d4828c20695 Mon Sep 17 00:00:00 2001 From: Julian Chang Date: Thu, 3 Sep 2026 02:32:57 -0400 Subject: [PATCH 1/2] fix MC-251068 breaking edit/recreate/cancel world flows --- .../helpers/mc251068/LastWorldDeleted.java | 20 ++++++++++++ .../basic/mc251068/WorldListEntryMixin.java | 32 +++++++++++++++++++ .../mc251068/WorldSelectionListMixin.java | 15 +++++++-- .../resources/debugify.client.mixins.json | 1 + 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 src/client/java/dev/isxander/debugify/client/helpers/mc251068/LastWorldDeleted.java create mode 100644 src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldListEntryMixin.java diff --git a/src/client/java/dev/isxander/debugify/client/helpers/mc251068/LastWorldDeleted.java b/src/client/java/dev/isxander/debugify/client/helpers/mc251068/LastWorldDeleted.java new file mode 100644 index 00000000..c263241d --- /dev/null +++ b/src/client/java/dev/isxander/debugify/client/helpers/mc251068/LastWorldDeleted.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2026 The Debugify Contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package dev.isxander.debugify.client.helpers.mc251068; + +public class LastWorldDeleted { + private static boolean marked = false; + + public static void mark() { + marked = true; + } + + public static boolean consume() { + boolean wasMarked = marked; + marked = false; + return wasMarked; + } +} diff --git a/src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldListEntryMixin.java b/src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldListEntryMixin.java new file mode 100644 index 00000000..5c3179af --- /dev/null +++ b/src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldListEntryMixin.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2026 The Debugify Contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package dev.isxander.debugify.client.mixins.basic.mc251068; + +import dev.isxander.debugify.client.helpers.mc251068.LastWorldDeleted; +import dev.isxander.debugify.fixes.BugFix; +import dev.isxander.debugify.fixes.FixCategory; +import net.minecraft.client.gui.screens.worldselection.WorldSelectionList; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@BugFix(id = "MC-251068", category = FixCategory.BASIC, env = BugFix.Env.CLIENT, description = "If you delete your only world, then you are no longer automatically thrown into the menu of creating a new world") +@Mixin(WorldSelectionList.WorldListEntry.class) +public abstract class WorldListEntryMixin { + @Shadow + @Final + private WorldSelectionList list; + + @Inject(method = "doDeleteWorld", at = @At("TAIL")) + private void markLastWorldDeleted(CallbackInfo ci) { + if (this.list.children().size() <= 1) { + LastWorldDeleted.mark(); + } + } +} diff --git a/src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldSelectionListMixin.java b/src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldSelectionListMixin.java index d2f9ae9f..f6b5faf9 100644 --- a/src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldSelectionListMixin.java +++ b/src/client/java/dev/isxander/debugify/client/mixins/basic/mc251068/WorldSelectionListMixin.java @@ -6,21 +6,26 @@ package dev.isxander.debugify.client.mixins.basic.mc251068; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import dev.isxander.debugify.client.helpers.mc251068.LastWorldDeleted; import dev.isxander.debugify.fixes.BugFix; import dev.isxander.debugify.fixes.FixCategory; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.components.ObjectSelectionList; -import net.minecraft.client.gui.screens.ConfirmScreen; -import net.minecraft.client.gui.screens.ProgressScreen; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; import net.minecraft.client.gui.screens.worldselection.WorldSelectionList; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @BugFix(id = "MC-251068", category = FixCategory.BASIC, env = BugFix.Env.CLIENT, description = "If you delete your only world, then you are no longer automatically thrown into the menu of creating a new world") @Mixin(WorldSelectionList.class) public abstract class WorldSelectionListMixin extends ObjectSelectionList { + @Shadow + @Final + private WorldSelectionList.EntryType entryType; public WorldSelectionListMixin(Minecraft minecraft, int i, int j, int k, int l) { super(minecraft, i, j, k, l); @@ -34,6 +39,10 @@ public WorldSelectionListMixin(Minecraft minecraft, int i, int j, int k, int l) ) ) private boolean dontShowEmptyWorldList(Gui gui, Screen screen) { - return (gui.screen() instanceof ProgressScreen || gui.screen() instanceof ConfirmScreen); + if (!LastWorldDeleted.consume() || this.entryType != WorldSelectionList.EntryType.SINGLEPLAYER) + return true; + + CreateWorldScreen.openFresh(this.minecraft, () -> this.minecraft.gui.setScreen(null)); + return false; } } diff --git a/src/client/resources/debugify.client.mixins.json b/src/client/resources/debugify.client.mixins.json index 0821ce70..806bca89 100644 --- a/src/client/resources/debugify.client.mixins.json +++ b/src/client/resources/debugify.client.mixins.json @@ -36,6 +36,7 @@ "basic.mc237493.TelemetryInfoScreenMixin", "basic.mc242809.DirectJoinServerScreenMixin", "basic.mc242809.ManageServerScreenMixin", + "basic.mc251068.WorldListEntryMixin", "basic.mc251068.WorldSelectionListMixin", "basic.mc267376.CameraMixin", "basic.mc268420.HudMixin", From 205c1693c81ec6f9113be8649627a1fece80b104 Mon Sep 17 00:00:00 2001 From: Julian Chang Date: Thu, 3 Sep 2026 03:56:06 -0400 Subject: [PATCH 2/2] properly gate bannable gameplay fixes --- .../java/dev/isxander/debugify/client/DebugifyClient.java | 4 ++++ .../client/mixins/gameplay/mc231097/LocalPlayerMixin.java | 3 ++- src/main/java/dev/isxander/debugify/Debugify.java | 5 ++++- .../debugify/mixins/gameplay/mc136249/LivingEntityMixin.java | 3 ++- src/main/resources/assets/debugify/lang/en_us.json | 1 + 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/client/java/dev/isxander/debugify/client/DebugifyClient.java b/src/client/java/dev/isxander/debugify/client/DebugifyClient.java index 687d472d..ff914911 100644 --- a/src/client/java/dev/isxander/debugify/client/DebugifyClient.java +++ b/src/client/java/dev/isxander/debugify/client/DebugifyClient.java @@ -5,7 +5,11 @@ */ package dev.isxander.debugify.client; +import dev.isxander.debugify.Debugify; +import dev.isxander.debugify.client.utils.ClientUtils; + public class DebugifyClient { public static void onInitializeClient() { + Debugify.inMultiplayerWorld = ClientUtils::isInMultiplayerWorld; } } diff --git a/src/client/java/dev/isxander/debugify/client/mixins/gameplay/mc231097/LocalPlayerMixin.java b/src/client/java/dev/isxander/debugify/client/mixins/gameplay/mc231097/LocalPlayerMixin.java index 3f49de30..2ea1bd62 100644 --- a/src/client/java/dev/isxander/debugify/client/mixins/gameplay/mc231097/LocalPlayerMixin.java +++ b/src/client/java/dev/isxander/debugify/client/mixins/gameplay/mc231097/LocalPlayerMixin.java @@ -5,6 +5,7 @@ */ package dev.isxander.debugify.client.mixins.gameplay.mc231097; +import dev.isxander.debugify.Debugify; import dev.isxander.debugify.fixes.BugFix; import dev.isxander.debugify.fixes.FixCategory; import net.minecraft.client.Minecraft; @@ -32,7 +33,7 @@ public abstract class LocalPlayerMixin { ) ) private void onDropItem(boolean all, CallbackInfoReturnable cir) { - if (isUsingItem()) { + if (isUsingItem() && Debugify.isGameplayFixesEnabled()) { minecraft.gameMode.releaseUsingItem((LocalPlayer) (Object) this); } } diff --git a/src/main/java/dev/isxander/debugify/Debugify.java b/src/main/java/dev/isxander/debugify/Debugify.java index 2ea896b2..5a312d50 100644 --- a/src/main/java/dev/isxander/debugify/Debugify.java +++ b/src/main/java/dev/isxander/debugify/Debugify.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Map; +import java.util.function.BooleanSupplier; public class Debugify { public static final Logger LOGGER = LoggerFactory.getLogger("Debugify"); @@ -46,7 +47,9 @@ public static BugFix.Env getEnv() { return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT ? BugFix.Env.CLIENT : BugFix.Env.SERVER; } + public static BooleanSupplier inMultiplayerWorld = () -> false; + public static boolean isGameplayFixesEnabled() { - return Debugify.CONFIG.gameplayFixesInMultiplayer; + return !inMultiplayerWorld.getAsBoolean() || Debugify.CONFIG.gameplayFixesInMultiplayer; } } diff --git a/src/main/java/dev/isxander/debugify/mixins/gameplay/mc136249/LivingEntityMixin.java b/src/main/java/dev/isxander/debugify/mixins/gameplay/mc136249/LivingEntityMixin.java index 4179df77..e00afb67 100644 --- a/src/main/java/dev/isxander/debugify/mixins/gameplay/mc136249/LivingEntityMixin.java +++ b/src/main/java/dev/isxander/debugify/mixins/gameplay/mc136249/LivingEntityMixin.java @@ -8,6 +8,7 @@ import com.llamalad7.mixinextras.expression.Definition; import com.llamalad7.mixinextras.expression.Expression; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import dev.isxander.debugify.Debugify; import dev.isxander.debugify.fixes.BugFix; import dev.isxander.debugify.fixes.FixCategory; import net.minecraft.world.entity.LivingEntity; @@ -26,6 +27,6 @@ public abstract class LivingEntityMixin{ @Expression("this.getAttributeValue(WATER_MOVEMENT_EFFICIENCY)") @ModifyExpressionValue(method = "travelInWater", at = @At("MIXINEXTRAS:EXPRESSION")) private double checkRiptide(double original) { - return this.isAutoSpinAttack() ? 0 : original; + return this.isAutoSpinAttack() && Debugify.isGameplayFixesEnabled() ? 0 : original; } } diff --git a/src/main/resources/assets/debugify/lang/en_us.json b/src/main/resources/assets/debugify/lang/en_us.json index bb907212..d8dff782 100644 --- a/src/main/resources/assets/debugify/lang/en_us.json +++ b/src/main/resources/assets/debugify/lang/en_us.json @@ -74,6 +74,7 @@ "debugify.fix_explanation.mc-132878": "Spawns breaking particles when armour stands are hurt.", "debugify.fix_explanation.mc-134110": "Correctly rotates double chests when a structure that is mirrored is placed.", "debugify.fix_explanation.mc-135971": "Overrides CTRL+Q behaviour in crafting slot to repeatedly CTRL+Q until there are no items left in the crafting slot.", + "debugify.fix_explanation.mc-136249": "Ignores the water movement efficiency attribute (granted by depth strider) while the player is riptide spin attacking.", "debugify.fix_explanation.mc-155509": "Checks if the pufferfish is alive before attempting to sting the player.", "debugify.fix_explanation.mc-159283": "Casts 32-bit integers to 64-bit equivalents to prevent integer overflow at high X and Z values.", "debugify.fix_effect.mc-159283": "Affects world generation.",