Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
ffe369f
fully implemented JeiRecipeViewerSlot
Trinsdar Jul 27, 2026
f532a93
fixed background in JeiRecipeViewerSlot
Trinsdar Jul 27, 2026
df3d878
implemented ReiRecipeViewerSlot
Trinsdar Jul 27, 2026
e2d2526
did some requested changes
Trinsdar Jul 31, 2026
e413996
Make TooltipLines store actual Components instead of FormattedText so…
screret Aug 1, 2026
c1ff914
Make REI/JEI recipe viewer compat act even more like EMI's
screret Aug 1, 2026
37debef
Unify code style in EMI & REI plugins
screret Aug 1, 2026
b326221
fix onMousePressed bug
screret Aug 1, 2026
f2a6e52
Add mixins for per-recipe display sizing in JEI & REI (EMI already su…
screret Aug 1, 2026
ccfc964
Merge branch '1.20.1' into jei-rei-recipe-viewer-slots
screret Aug 1, 2026
1c8cbf7
fixed compile errors
Trinsdar Aug 2, 2026
f927474
Move fields and methods common to all 3 RecipeViewerSlotWidget impls …
screret Aug 2, 2026
4b1f982
Make recipe viewer handlers handle RecipeViewerSlotWidget creation & …
screret Aug 2, 2026
e32f253
don't hardcode EMI dragged item conversion to items and fluids only
screret Aug 2, 2026
15736cd
all the concrete RecipeViewerSlotWidget impls are internal
screret Aug 2, 2026
b905b37
Instead of creating a new slot, make JeiRecipeViewerSlot overwrite mo…
screret Aug 2, 2026
d151f49
rename the non-recipe-specific `getWidth`/`get(Display)Height` method…
screret Aug 2, 2026
cd3af61
Move the recipeviewer compatibility test stuff to its own class and a…
screret Aug 2, 2026
92f2b22
, remap = false
screret Aug 2, 2026
6eae770
aw, crud. `ModLoader.loadingStateValid` is FALSE when the class is in…
screret Aug 2, 2026
3273315
assign default values to gui size if the size is 0
screret Aug 2, 2026
046e09c
Add a generic for the ingredient type to RecipeViewerSlotWidget
screret Aug 2, 2026
53a3913
support holderset entry lists in EMI/REI stack converters
screret Aug 2, 2026
d499535
add non-item slots as blanks to test recipe viewer display
screret Aug 2, 2026
b829ca6
don't try to fill JEI recipe slot if it doesn't exist yet or its `ent…
screret Aug 2, 2026
b4e7d8c
Add button to open recipe category from test machine ui
screret Aug 2, 2026
4c1a6a2
Add mouse enter/leave/start hover/end hover gui actions & use them fo…
screret Aug 2, 2026
14621fa
formattiering
screret Aug 2, 2026
b273710
saner JEI slot indices
screret Aug 2, 2026
079b6ad
I love off-by-one errors
screret Aug 2, 2026
c9f1147
fix slot hover overlay being in the wrong spot (oops.)
screret Aug 2, 2026
dcc5d95
actually respect the boolean argument in `Widget#excludeAreaInRecipeV…
screret Aug 2, 2026
dc40e0e
Allow closing the panel manager if it hasn't opened yet
screret Aug 2, 2026
0931263
always remove previous output slot tooltip callback
screret Aug 2, 2026
39afebd
always null check `RecipeViewerSlotWidget.entries` and only create th…
screret Aug 2, 2026
b97d703
forgot to implement onRuntimeUnavailable
screret Aug 2, 2026
669909b
remove drawRealSlot
screret Aug 2, 2026
53390ed
use the "actual" wrapped screen even tho it should always be the main…
screret Aug 2, 2026
22ef559
Fix Fucked up and Evil REI recipe preview offset
screret Aug 2, 2026
802e5b1
don't store stuff in a (thankfully constant) vector only to unwrap it…
screret Aug 2, 2026
3bac0c6
fix interaction offset issues by requiring the parent menu's mouse po…
screret Aug 2, 2026
d869ac2
Fix Fucked Up and Evil render offset
screret Aug 3, 2026
cfe6916
possible fixed issues with recipe widget caching by caching the build…
Trinsdar Aug 4, 2026
3f7c052
Fix JEI screen cache issue
screret Aug 5, 2026
d2ae667
make the screen caches
screret Aug 5, 2026
a230967
Make JEI compat users have to add their inputs and outputs themselves…
screret Aug 5, 2026
f030425
Fix JEI category size caching
screret Aug 5, 2026
16a0395
obtain an ingredient manager if we don't have one and it's possible
screret Aug 5, 2026
421556d
Make the caches a LOT smaller, they have no reason to be **that** big
screret Aug 5, 2026
8079fc1
don't add the "open recipe viewer" click area in the recipe viewer
screret Aug 5, 2026
65b8d57
Add 95 more testing recipes at random to test the preview cache
screret Aug 5, 2026
b4231ed
ah, screw it. just use soft references for the values. it works fine.
screret Aug 5, 2026
532e7ba
clear the screen caches on reload BUT block anyone else from clearing…
screret Aug 5, 2026
43510c3
Move handler utils to brachy.modularui.utils.handlers
screret Aug 7, 2026
91aa476
Rename IMultiFluidTankHandler to IMultiTankFluidHandler
screret Aug 7, 2026
a60ef1b
Add fluid slots to test recipe(s)
screret Aug 7, 2026
595825a
shorter line
screret Aug 7, 2026
74c2b51
Make the casing of recipeviewer compat classes consistent
screret Aug 8, 2026
543a9ab
Add generic category title support
screret Aug 8, 2026
41bd1f4
Store the embed screen in the previews' widgets and draw it from ther…
screret Aug 8, 2026
e5210d3
Minor tweaks to JEI category & slot code
screret Aug 8, 2026
330d699
add more API annotations
screret Aug 8, 2026
207bc5d
Try to fix recipe viewer debug decorator
screret Aug 8, 2026
d92201a
Fix capitalization of `GuiContext.uiType`
screret Aug 8, 2026
4fe4128
fixed jei tooltips added through widgets not rendering
Trinsdar Aug 11, 2026
dcc746b
Cleaner tooltip mixin
screret Aug 11, 2026
0e0c21e
possibly fixed rei slot overlay and tooltip rendering
Trinsdar Aug 11, 2026
30afae2
made MuiEntryWidget private
Trinsdar Aug 11, 2026
cf3d9bf
changed tooltip rendering back to being handled by UIWidget, hopefull…
Trinsdar Aug 11, 2026
1a05ce4
added code for drawing slot overlay in JeiRecipeViewerSlot, doesn't w…
Trinsdar Aug 11, 2026
a13c1dc
fixed rei slot overlay
Trinsdar Aug 11, 2026
fb272b3
fixed jei slot overlay rendering
Trinsdar Aug 11, 2026
f4c8488
oops :3
screret Aug 11, 2026
88a9bcb
Remove the code for drawing vanilla elements in MUI embeds because it…
screret Aug 11, 2026
8a9624d
aw my cleanup thing didnt work :(
screret Aug 11, 2026
79b44d5
try to fix EMI/JEI/REI tooltip
screret Aug 11, 2026
225807c
Remove unnecessary checks in TooltipLines
screret Aug 11, 2026
140a5b2
safeguard against initing debug decorator too early
screret Aug 11, 2026
06902ce
Revert "try to fix EMI/JEI/REI tooltip"
Trinsdar Aug 12, 2026
1ab2783
better method of rendering rei slot overlay possibly?
Trinsdar Aug 12, 2026
651ba7d
added test fluid tooltips for debugging emi tooltip issue
Trinsdar Aug 13, 2026
7eeb2a2
used remap=false for rei mixin
Trinsdar Aug 13, 2026
82cd7fc
changes for debugging purposes - revert once the issue is solved
Trinsdar Aug 13, 2026
4e29618
fixed Tooltip lines skipping every other line
Trinsdar Aug 18, 2026
2ad80ef
Revert "changes for debugging purposes - revert once the issue is sol…
Trinsdar Aug 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/main/java/brachy/modularui/api/widget/IGuiAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,28 @@ interface MouseDrag extends IGuiAction {

boolean drag(GuiContext context, int button, double dragX, double dragY);
}

@FunctionalInterface
interface MouseEnterArea extends IGuiAction {

void enter(GuiContext context);
}

@FunctionalInterface
interface MouseLeaveArea extends IGuiAction {

void leave(GuiContext context, int timeBelowMouse);
}

@FunctionalInterface
interface MouseStartHover extends IGuiAction {

void startHover(GuiContext context);
}

@FunctionalInterface
interface MouseEndHover extends IGuiAction {

void endHover(GuiContext context, int timeHovered);
}
}
78 changes: 78 additions & 0 deletions src/main/java/brachy/modularui/core/ModularUIMixinPlugin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package brachy.modularui.core;

import net.minecraftforge.fml.ModLoader;
import net.minecraftforge.fml.loading.FMLLoader;

import org.objectweb.asm.tree.ClassNode;
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ModularUIMixinPlugin implements IMixinConfigPlugin {

private static final String MIXIN_PACKAGE = "brachy.modularui.core.mixins.";
private static final Map<String, String> MOD_COMPAT_MIXINS = new HashMap<>();

private static final String DEV_PACKAGE = "dev.";

static {
MOD_COMPAT_MIXINS.put("roughlyenoughitems", "rei.");
MOD_COMPAT_MIXINS.put("emi", "emi.");
MOD_COMPAT_MIXINS.put("jei", "jei.");
}

@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
if (!mixinClassName.startsWith(MIXIN_PACKAGE)) {
// skip checking mixins that aren't in our package
// this should never happen, but better safe than sorry
return true;
}
if (!FMLLoader.getLoadingModList().getErrors().isEmpty()) {
// stop processing mixins if we have load errors to avoid getting bad crash reports in our issues
return false;
}
mixinClassName = mixinClassName.substring(MIXIN_PACKAGE.length());

if (mixinClassName.startsWith(DEV_PACKAGE)) {
// don't load dev-only mixins in prod
return !FMLLoader.isProduction();
}
for (var compatMod : MOD_COMPAT_MIXINS.entrySet()) {
if (mixinClassName.startsWith(compatMod.getValue())) {
return isModLoaded(compatMod.getKey());
}
}
return true;
}

@Override
public void onLoad(String mixinPackage) {}

@Override
public String getRefMapperConfig() {
return null;
}

@Override
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {}

@Override
public List<String> getMixins() {
return null;
}

@Override
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}

@Override
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}

private static boolean isModLoaded(String modId) {
return FMLLoader.getLoadingModList().getModFileById(modId) != null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package brachy.modularui.core.mixins.emi;

import brachy.modularui.integration.emi.recipe.ModularUIEmiRecipe;

import dev.emi.emi.EmiRenderHelper;
import dev.emi.emi.api.recipe.EmiRecipe;
import dev.emi.emi.runtime.EmiDrawContext;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(value = EmiRenderHelper.class, remap = false)
public class EmiRenderHelperMixin {

@Inject(method = "renderRecipe",
at = @At(value = "INVOKE", target = "Ldev/emi/emi/api/recipe/EmiRecipe;addWidgets(Ldev/emi/emi/api/widget/WidgetHolder;)V"))
private static void modularui$tellTheRecipeItsInATooltip(EmiRecipe recipe, EmiDrawContext context, int x, int y,
boolean showMissing, int overlayColor,
CallbackInfo ci) {
if (recipe instanceof ModularUIEmiRecipe muiRecipe) {
muiRecipe.useScreenCacheForNextWidgetQuery();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package brachy.modularui.core.mixins.jei;

import brachy.modularui.integration.jei.recipe.ModularUIJeiCategory;

import com.llamalad7.mixinextras.sugar.Local;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.gui.recipes.RecipeGuiLogic;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;

@Mixin(value = RecipeGuiLogic.class, remap = false)
public class RecipeGuiLogicMixin {

@ModifyVariable(method = "getVisibleRecipeLayoutsWithButtons", at = @At(value = "STORE"), name = "recipeHeight")
private int modularui$useCategoryMaxHeightForLayout(int recipeHeight,
@Local(name = "recipeCategory") IRecipeCategory<?> recipeCategory) {
// if this is a MUI category, force the gui to use the category's max height as the recipe height
// (instead of the height of the first recipe it finds, which may be shorter than others)
if (recipeCategory instanceof ModularUIJeiCategory<?> muiCategory) {
return muiCategory.getMaxHeight();
}
return recipeHeight;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package brachy.modularui.core.mixins.jei;

import mezz.jei.library.gui.ingredients.CycleTicker;
import mezz.jei.library.gui.recipes.RecipeLayout;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(value = RecipeLayout.class, remap = false)
public interface RecipeLayoutAccessor {

@Accessor("cycleTicker")
CycleTicker modularui$getCycleTicker();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package brachy.modularui.core.mixins.jei;

import mezz.jei.api.runtime.IIngredientManager;
import mezz.jei.library.gui.recipes.layout.builder.RecipeLayoutBuilder;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(value = RecipeLayoutBuilder.class, remap = false)
public interface RecipeLayoutBuilderAccessor {

@Accessor("ingredientManager")
IIngredientManager modularui$getIngredientManager();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package brachy.modularui.core.mixins.jei;

import brachy.modularui.integration.jei.recipe.ModularUIJeiCategory;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.library.gui.recipes.layout.builder.RecipeLayoutBuilder;
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;

@Mixin(value = RecipeLayoutBuilder.class, remap = false)
public abstract class RecipeLayoutBuilderMixin<T> implements IRecipeLayoutBuilder {

@Shadow
private @Final T recipe;

@Shadow
private @Final IRecipeCategory<T> recipeCategory;

@ModifyExpressionValue(method = { "createShapelessIcon", "getRecipeTransferButtonPosition" },
at = @At(value = "INVOKE", target = "Lmezz/jei/api/recipe/category/IRecipeCategory;getWidth()I"), require = 0)
private int modularui$makeWidthRecipeDependent(int original) {
if (recipeCategory instanceof ModularUIJeiCategory<T> muiCategory) {
return muiCategory.getWidth(this.recipe);
}
return original;
}

@ModifyExpressionValue(method = { "createShapelessIcon", "getRecipeTransferButtonPosition" },
at = @At(value = "INVOKE", target = "Lmezz/jei/api/recipe/category/IRecipeCategory;getHeight()I"), require = 0)
private int modularui$makeHeightRecipeDependent(int original) {
if (recipeCategory instanceof ModularUIJeiCategory<T> muiCategory) {
return muiCategory.getHeight(recipe);
}
return original;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package brachy.modularui.core.mixins.jei;

import brachy.modularui.integration.jei.recipe.ModularUIJeiCategory;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local;
import mezz.jei.api.gui.IRecipeLayoutDrawable;
import mezz.jei.api.gui.inputs.RecipeSlotUnderMouse;
import mezz.jei.api.recipe.category.IRecipeCategory;
import mezz.jei.library.gui.recipes.RecipeLayout;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

import java.util.Optional;

@Mixin(value = RecipeLayout.class, remap = false)
public abstract class RecipeLayoutMixin<R> implements IRecipeLayoutDrawable<R> {

@WrapOperation(method = "drawOverlays",
at = @At(value = "INVOKE", target = "Lmezz/jei/library/gui/recipes/RecipeLayout;getSlotUnderMouse(DD)Ljava/util/Optional;"))
private Optional<RecipeSlotUnderMouse> modularui$disableIngredientTooltipRender(RecipeLayout<R> self, double mouseX, double mouseY,
Operation<Optional<RecipeSlotUnderMouse>> original) {
if (self.getRecipeCategory() instanceof ModularUIJeiCategory<R>){
return Optional.empty();
}
return original.call(self, mouseX, mouseY);
}

@ModifyExpressionValue(method = "<init>",
at = @At(value = "INVOKE", target = "Lmezz/jei/api/recipe/category/IRecipeCategory;getWidth()I"),
require = 0)
private int modularui$makeWidthRecipeDependent(int original,
@Local(argsOnly = true) IRecipeCategory<R> recipeCategory,
@Local(argsOnly = true) R recipe) {
if (recipeCategory instanceof ModularUIJeiCategory<R> muiCategory) {
return muiCategory.getWidth(recipe);
}
return original;
}

@ModifyExpressionValue(method = "<init>",
at = @At(value = "INVOKE", target = "Lmezz/jei/api/recipe/category/IRecipeCategory;getHeight()I"),
require = 0)
private int modularui$makeHeightRecipeDependent(int original,
@Local(argsOnly = true) IRecipeCategory<R> recipeCategory,
@Local(argsOnly = true) R recipe) {
if (recipeCategory instanceof ModularUIJeiCategory<R> muiCategory) {
return muiCategory.getHeight(recipe);
}
return original;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package brachy.modularui.core.mixins.jei;

import mezz.jei.api.gui.ingredient.IRecipeSlotRichTooltipCallback;
import mezz.jei.api.ingredients.ITypedIngredient;
import mezz.jei.api.recipe.RecipeIngredientRole;
import mezz.jei.library.gui.ingredients.ICycler;
import mezz.jei.library.gui.ingredients.RecipeSlot;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;

import java.util.List;
import java.util.Optional;

@Mixin(value = RecipeSlot.class, remap = false)
public interface RecipeSlotAccessor {

@Accessor("role")
@Mutable
void modularui$setRole(RecipeIngredientRole role);

@Accessor("cycler")
@Mutable
void modularui$setCycler(ICycler cycler);

@Accessor("tooltipCallbacks")
List<IRecipeSlotRichTooltipCallback> modularui$getTooltipCallbacks();

@Accessor("allIngredients")
@Mutable
void modularui$setAllIngredients(List<Optional<ITypedIngredient<?>>> allIngredients);

@Accessor("displayIngredients")
@Mutable
void modularui$setDisplayIngredients(List<Optional<ITypedIngredient<?>>> displayIngredients);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package brachy.modularui.core.mixins.rei;

import brachy.modularui.integration.rei.recipe.ModularUIReiDisplay;
import brachy.modularui.integration.rei.recipe.ModularUIReiCategory;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.ref.LocalIntRef;
import me.shedaniel.rei.api.client.registry.display.DisplayCategory;
import me.shedaniel.rei.api.common.category.CategoryIdentifier;
import me.shedaniel.rei.api.common.display.Display;
import me.shedaniel.rei.impl.client.gui.screen.AbstractDisplayViewingScreen;
import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen;
import me.shedaniel.rei.impl.display.DisplaySpec;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import java.util.function.ToIntFunction;

@SuppressWarnings("UnstableApiUsage")
@Mixin(value = DefaultDisplayViewingScreen.class, remap = false)
public abstract class DefaultDisplayViewingScreenMixin extends AbstractDisplayViewingScreen {

protected DefaultDisplayViewingScreenMixin(Map<DisplayCategory<?>, List<DisplaySpec>> categoryMap,
@Nullable CategoryIdentifier<?> category) {
super(categoryMap, category);
}

@WrapOperation(method = "lambda$checkExportDisplays$18", at = @At(value = "INVOKE", target = "Lme/shedaniel/rei/api/client/registry/display/DisplayCategory;getDisplayHeight()I"))
private int modularui$forcePerDisplayHeightInExport(DisplayCategory<?> category,
Operation<Integer> original,
@Local(name = "display") Display display) {
return modularui$calculateCustomDisplayHeight(getCurrentCategory(), display, original::call);
}

@Inject(method = "initDisplays",
at = @At(value = "INVOKE_ASSIGN", target = "Lme/shedaniel/rei/api/client/registry/display/DisplayCategory;getDisplayWidth(Lme/shedaniel/rei/api/common/display/Display;)I"))
private void modularui$perDisplayHeight(CallbackInfo ci,
@Local(name = "displayHeight") LocalIntRef displayHeight,
@Local(name = "displaySupplier") Supplier<Display> displaySupplier) {
displayHeight.set(modularui$calculateCustomDisplayHeight(getCurrentCategory(), displaySupplier.get(), null));
}

@SuppressWarnings("unchecked")
@Unique
private static int modularui$calculateCustomDisplayHeight(DisplayCategory<?> category, Display display,
@Nullable ToIntFunction<DisplayCategory<?>> originalValue) {
if (category instanceof ModularUIReiCategory<?> muiCategory && display instanceof ModularUIReiDisplay muiDisplay) {
return ((ModularUIReiCategory<ModularUIReiDisplay>) muiCategory).getDisplayHeight(muiDisplay);
} else {
// if this isn't a MUI display, set it back to the original value
// (I think it's possible that an MUI category has a non-MUI display in it? not sure tho.)
if (originalValue == null) {
// originalValue == null means we can't trust it and should get the actual original value
return category.getDisplayHeight();
} else {
return originalValue.applyAsInt(category);
}
}
}
}
Loading