Skip to content

Commit 9989f64

Browse files
isXanderclaude
andcommitted
update 26.1 compat: sodium rewrite + dynamic registry guard + enable deps
- Enable deps.sodium and deps.iris in 26.1-fabric gradle.properties - Guard radial menu editing behind level != null to prevent ItemStack construction before dynamic registries are loaded - Rewrite Sodium compat for new VideoSettingsScreen API (replaces SodiumOptionsGUI): new mixin targets VideoSettingsScreen, tracks current page via onSectionFocused injection, implements page navigation using ConfigManager.CONFIG, injects into init() for initial focus and processor notification - Update SliderControlElementMixin: target renamed $Button -> $SliderControlElement, use IntegerOption.getSteppedValidator() and modifyValue() instead of removed interval/min/max fields - Update CycleControlElementMixin and TickBoxControlElementMixin: cycleControl/toggleControl are now private, use @shadow private - Update FlatButtonWidgetMixin: render -> extractRenderState, remove setLabel injection (field is now final, method removed) Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
1 parent d39d063 commit 9989f64

15 files changed

Lines changed: 152 additions & 147 deletions

src/main/java/dev/isxander/controlify/compatibility/iris/mixins/BaseOptionElementWidgetMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//? if iris {
2-
/*package dev.isxander.controlify.compatibility.iris.mixins;
2+
package dev.isxander.controlify.compatibility.iris.mixins;
33

44
import dev.isxander.controlify.compatibility.iris.screenop.BaseOptionElementComponentProcessor;
55
import dev.isxander.controlify.screenop.ComponentProcessor;
@@ -33,4 +33,4 @@ private void cycle(boolean reverse) {
3333
}
3434

3535
}
36-
*///?}
36+
//?}

src/main/java/dev/isxander/controlify/compatibility/iris/screenop/BaseOptionElementComponentProcessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//? if iris {
2-
/*package dev.isxander.controlify.compatibility.iris.screenop;
2+
package dev.isxander.controlify.compatibility.iris.screenop;
33

44
import dev.isxander.controlify.screenop.compat.AbstractSliderComponentProcessor;
55

@@ -17,4 +17,4 @@ protected void incrementSlider(boolean reverse) {
1717
this.cycleMethod.accept(reverse);
1818
}
1919
}
20-
*///?}
20+
//?}

src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/AbstractWidgetMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*? if sodium {*/
2-
/*package dev.isxander.controlify.compatibility.sodium.mixins;
2+
package dev.isxander.controlify.compatibility.sodium.mixins;
33

44
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
55
import dev.isxander.controlify.Controlify;
@@ -19,4 +19,4 @@ private InputType forceSetFocusedOnController(InputType type) {
1919
return type;
2020
}
2121
}
22-
*//*?}*/
22+
/*?}*/

src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/CycleControlElementMixin.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//? if sodium {
2-
/*package dev.isxander.controlify.compatibility.sodium.mixins;
2+
package dev.isxander.controlify.compatibility.sodium.mixins;
33

44
import dev.isxander.controlify.compatibility.sodium.screenop.CycleControlProcessor;
55
import dev.isxander.controlify.screenop.ComponentProcessor;
@@ -10,7 +10,7 @@
1010

1111
@Mixin(targets = "net.caffeinemc.mods.sodium.client.gui.options.control.CyclingControl$CyclingControlElement")
1212
public abstract class CycleControlElementMixin implements ComponentProcessorProvider {
13-
@Shadow public abstract void cycleControl(boolean reverse);
13+
@Shadow protected abstract void cycleControl(boolean reverse);
1414

1515
@Unique private final ComponentProcessor controlify$componentProcessor
1616
= new CycleControlProcessor(this::cycleControl);
@@ -20,4 +20,4 @@ public ComponentProcessor componentProcessor() {
2020
return controlify$componentProcessor;
2121
}
2222
}
23-
*///?}
23+
//?}

src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/FlatButtonWidgetAccessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//? if sodium {
2-
/*package dev.isxander.controlify.compatibility.sodium.mixins;
2+
package dev.isxander.controlify.compatibility.sodium.mixins;
33

44
import org.spongepowered.asm.mixin.Mixin;
55
import org.spongepowered.asm.mixin.gen.Invoker;
@@ -11,4 +11,4 @@ public interface FlatButtonWidgetAccessor {
1111
@Invoker
1212
void invokeDoAction();
1313
}
14-
*///?}
14+
//?}

src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/FlatButtonWidgetMixin.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//? if sodium {
2-
/*package dev.isxander.controlify.compatibility.sodium.mixins;
2+
package dev.isxander.controlify.compatibility.sodium.mixins;
33

44
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
55
import dev.isxander.controlify.api.bind.InputBinding;
@@ -11,8 +11,6 @@
1111
import org.spongepowered.asm.mixin.Shadow;
1212
import org.spongepowered.asm.mixin.Unique;
1313
import org.spongepowered.asm.mixin.injection.At;
14-
import org.spongepowered.asm.mixin.injection.Inject;
15-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1614

1715
import java.util.Map;
1816
import java.util.Optional;
@@ -32,7 +30,7 @@ public class FlatButtonWidgetMixin implements ButtonGuideRenderer<FlatButtonWidg
3230
private final Map<InputBinding, Component> controllerMessages = new Object2ObjectArrayMap<>(2);
3331

3432
@ModifyExpressionValue(
35-
method = "render",
33+
method = "extractRenderState",
3634
at = @At(
3735
value = "FIELD",
3836
target = "Lnet/caffeinemc/mods/sodium/client/gui/widgets/FlatButtonWidget;label:Lnet/minecraft/network/chat/Component;",
@@ -43,11 +41,6 @@ private Component modifyRenderedLabel(Component actualLabel) {
4341
return getControllerMessage(actualLabel);
4442
}
4543

46-
@Inject(method = "setLabel", at = @At("HEAD"))
47-
private void removeLabelCache(CallbackInfo ci) {
48-
this.controllerMessages.clear();
49-
}
50-
5144
@Unique
5245
private Component getControllerMessage(Component actualLabel) {
5346
if (!shouldRender())
@@ -78,4 +71,4 @@ private Optional<InputBinding> getBind() {
7871
this.controllerMessages.clear();
7972
}
8073
}
81-
*///?}
74+
//?}
Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
//? if sodium {
2-
/*package dev.isxander.controlify.compatibility.sodium.mixins;
2+
package dev.isxander.controlify.compatibility.sodium.mixins;
33

44
import dev.isxander.controlify.compatibility.sodium.screenop.SliderControlProcessor;
55
import dev.isxander.controlify.screenop.ComponentProcessor;
66
import dev.isxander.controlify.screenop.ComponentProcessorProvider;
7-
import net.minecraft.util.Mth;
8-
import org.spongepowered.asm.mixin.*;
9-
10-
import net.caffeinemc.mods.sodium.client.gui.options.Option;
7+
import net.caffeinemc.mods.sodium.client.config.structure.IntegerOption;
8+
import net.caffeinemc.mods.sodium.client.gui.ColorTheme;
9+
import net.caffeinemc.mods.sodium.client.gui.options.control.AbstractOptionList;
1110
import net.caffeinemc.mods.sodium.client.gui.options.control.ControlElement;
1211
import net.caffeinemc.mods.sodium.client.util.Dim2i;
12+
import net.minecraft.util.Mth;
13+
import org.spongepowered.asm.mixin.*;
1314

14-
@Mixin(targets = "net.caffeinemc.mods.sodium.client.gui.options.control.SliderControl$Button")
15-
public abstract class SliderControlElementMixin extends ControlElement<Integer> implements ComponentProcessorProvider {
16-
@Shadow @Final private int interval;
17-
@Shadow @Final private int min;
18-
@Shadow @Final private int max;
15+
@Mixin(targets = "net.caffeinemc.mods.sodium.client.gui.options.control.SliderControl$SliderControlElement")
16+
public abstract class SliderControlElementMixin extends ControlElement implements ComponentProcessorProvider {
17+
@Shadow @Final private IntegerOption option;
1918

2019
@Unique private final ComponentProcessor controlify$componentProcessor
21-
= new SliderControlProcessor(this::incrementSlider);
20+
= new SliderControlProcessor(this::controlify$incrementSlider);
2221

23-
public SliderControlElementMixin(Option<Integer> option, Dim2i dim) {
24-
super(option, dim);
22+
public SliderControlElementMixin(AbstractOptionList list, Dim2i dim, ColorTheme theme) {
23+
super(list, dim, theme);
2524
}
2625

2726
@Override
@@ -30,8 +29,12 @@ public ComponentProcessor componentProcessor() {
3029
}
3130

3231
@Unique
33-
private void incrementSlider(boolean reverse) {
34-
this.option.setValue(Mth.clamp(this.option.getValue() + (reverse ? -this.interval : this.interval), this.min, this.max));
32+
private void controlify$incrementSlider(boolean reverse) {
33+
var range = option.getSteppedValidator();
34+
option.modifyValue(Mth.clamp(
35+
option.getValidatedValue() + (reverse ? -range.step() : range.step()),
36+
range.min(), range.max()
37+
));
3538
}
3639
}
37-
*///?}
40+
//?}

src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/SodiumOptionsGUIMixin.java

Lines changed: 0 additions & 92 deletions
This file was deleted.

src/main/java/dev/isxander/controlify/compatibility/sodium/mixins/TickBoxControlElementMixin.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//? if sodium {
2-
/*package dev.isxander.controlify.compatibility.sodium.mixins;
2+
package dev.isxander.controlify.compatibility.sodium.mixins;
33

44
import dev.isxander.controlify.compatibility.sodium.screenop.TickBoxControlProcessor;
55
import dev.isxander.controlify.screenop.ComponentProcessor;
@@ -10,7 +10,8 @@
1010

1111
@Mixin(targets = "net.caffeinemc.mods.sodium.client.gui.options.control.TickBoxControl$TickBoxControlElement")
1212
public abstract class TickBoxControlElementMixin implements ComponentProcessorProvider {
13-
@Shadow public abstract void toggleControl();
13+
@Shadow
14+
protected abstract void toggleControl();
1415

1516
@Unique private final ComponentProcessor controlify$componentProcessor
1617
= new TickBoxControlProcessor(this::toggleControl);
@@ -20,4 +21,4 @@ public ComponentProcessor componentProcessor() {
2021
return controlify$componentProcessor;
2122
}
2223
}
23-
*///?}
24+
//?}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
//? if sodium {
2+
package dev.isxander.controlify.compatibility.sodium.mixins;
3+
4+
import dev.isxander.controlify.compatibility.sodium.screenop.SodiumGuiScreenProcessor;
5+
import dev.isxander.controlify.compatibility.sodium.screenop.SodiumScreenOperations;
6+
import dev.isxander.controlify.screenop.ScreenProcessor;
7+
import dev.isxander.controlify.screenop.ScreenProcessorProvider;
8+
import net.caffeinemc.mods.sodium.client.config.ConfigManager;
9+
import net.caffeinemc.mods.sodium.client.config.structure.Page;
10+
import net.caffeinemc.mods.sodium.client.gui.VideoSettingsScreen;
11+
import net.caffeinemc.mods.sodium.client.gui.widgets.FlatButtonWidget;
12+
import net.caffeinemc.mods.sodium.client.gui.widgets.OptionListWidget;
13+
import net.minecraft.client.gui.screens.Screen;
14+
import net.minecraft.network.chat.Component;
15+
import org.spongepowered.asm.mixin.*;
16+
import org.spongepowered.asm.mixin.injection.At;
17+
import org.spongepowered.asm.mixin.injection.Inject;
18+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
19+
20+
import java.util.List;
21+
22+
@Mixin(VideoSettingsScreen.class)
23+
public abstract class VideoSettingsScreenMixin extends Screen implements ScreenProcessorProvider, SodiumScreenOperations {
24+
@Shadow private FlatButtonWidget applyButton;
25+
@Shadow private FlatButtonWidget closeButton;
26+
@Shadow private FlatButtonWidget undoButton;
27+
@Shadow private OptionListWidget optionList;
28+
29+
@Unique private Page controlify$currentPage = null;
30+
@Unique private final SodiumGuiScreenProcessor controlify$screenProcessor
31+
= new SodiumGuiScreenProcessor((VideoSettingsScreen) (Object) this, this);
32+
33+
protected VideoSettingsScreenMixin(Component title) {
34+
super(title);
35+
}
36+
37+
@Inject(method = "init", at = @At("RETURN"))
38+
private void controlify$onInit(CallbackInfo ci) {
39+
if (optionList != null && !optionList.getControls().isEmpty()) {
40+
this.setInitialFocus(optionList.getControls().get(0));
41+
}
42+
controlify$screenProcessor.onRebuildGUI();
43+
}
44+
45+
@Inject(method = "onSectionFocused", at = @At("HEAD"))
46+
private void controlify$trackCurrentPage(Page page, CallbackInfo ci) {
47+
controlify$currentPage = page;
48+
}
49+
50+
@Override
51+
public ScreenProcessor<?> screenProcessor() {
52+
return controlify$screenProcessor;
53+
}
54+
55+
@Override
56+
public void controlify$nextPage() {
57+
List<Page> pages = controlify$getAllPages();
58+
if (pages.isEmpty()) return;
59+
int currentIndex = controlify$currentPage != null ? pages.indexOf(controlify$currentPage) : -1;
60+
int nextIndex = (currentIndex + 1) % pages.size();
61+
jumpToPage(pages.get(nextIndex));
62+
}
63+
64+
@Override
65+
public void controlify$prevPage() {
66+
List<Page> pages = controlify$getAllPages();
67+
if (pages.isEmpty()) return;
68+
int currentIndex = controlify$currentPage != null ? pages.indexOf(controlify$currentPage) : 0;
69+
int nextIndex = (currentIndex - 1 + pages.size()) % pages.size();
70+
jumpToPage(pages.get(nextIndex));
71+
}
72+
73+
@Unique
74+
private List<Page> controlify$getAllPages() {
75+
return ConfigManager.CONFIG.getModOptions().stream()
76+
.flatMap(mod -> mod.pages().stream())
77+
.toList();
78+
}
79+
80+
@Shadow public abstract void jumpToPage(Page page);
81+
82+
@Override
83+
public FlatButtonWidget controlify$getApplyButton() {
84+
return applyButton;
85+
}
86+
87+
@Override
88+
public FlatButtonWidget controlify$getCloseButton() {
89+
return closeButton;
90+
}
91+
92+
@Override
93+
public FlatButtonWidget controlify$getUndoButton() {
94+
return undoButton;
95+
}
96+
}
97+
//?}

0 commit comments

Comments
 (0)