diff --git a/forge/src/main/java/ru/zznty/create_factory_logistics/logistics/panel/FactoryFluidPanelBehaviour.java b/forge/src/main/java/ru/zznty/create_factory_logistics/logistics/panel/FactoryFluidPanelBehaviour.java index 4205ebf..38af246 100644 --- a/forge/src/main/java/ru/zznty/create_factory_logistics/logistics/panel/FactoryFluidPanelBehaviour.java +++ b/forge/src/main/java/ru/zznty/create_factory_logistics/logistics/panel/FactoryFluidPanelBehaviour.java @@ -121,24 +121,30 @@ public static LangBuilder formatLevel(int level, boolean round) { if (level >= BigItemStack.INF) return CreateLang.text("\u221e"); - if (!round || level < 1000 || level % 1000 != 0) { - if (level % 1000 == 0) - return CreateLang.number((float) level / 1000).add(CreateLang.translate("generic.unit.buckets")); + if (level >= 1_000_000){ // If more than 1k buckets, show as thousands + return CreateLang.number((float) level / 1_000_000) + .add(CreateLang.text("k")) + .add(CreateLang.translate("generic.unit.buckets")); + } + + if (level % 1000 == 0){ //If perfect bucket, show as buckets + return CreateLang.number((float) level / 1000).add(CreateLang.translate("generic.unit.buckets")); + } + if (level < 2_000){ // Less than 2B, always show mb return CreateLang.number(level).add(CreateLang.translate("generic.unit.millibuckets")); } - // 1000 buckets - if (level < 1_000_000) { + if (round){ // If more than 2B and rounding, show as buckets float d = (float) level / 1000; if (d >= 100) - d = Math.round(d); + d = Math.round(d); //stop showing decimals if more than 100B return CreateLang.number(d).add(CreateLang.translate("generic.unit.buckets")); } - return CreateLang.number((float) level / 1_000_000) - .add(CreateLang.text("k")) - .add(CreateLang.translate("generic.unit.buckets")); + // More than 2B and no rounding, show mb + return CreateLang.number(level).add(CreateLang.translate("generic.unit.millibuckets")); + } @Override diff --git a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelScreenMixin.java b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelScreenMixin.java index 5cfb05c..86ecc49 100644 --- a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelScreenMixin.java +++ b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/panel/FactoryPanelScreenMixin.java @@ -18,6 +18,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.fluids.FluidStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; @@ -27,6 +28,7 @@ import ru.zznty.create_factory_abstractions.generic.impl.GenericContentExtender; import ru.zznty.create_factory_abstractions.generic.support.BigGenericStack; import ru.zznty.create_factory_logistics.FactoryBlocks; +import ru.zznty.create_factory_logistics.logistics.generic.FluidKey; import ru.zznty.create_factory_logistics.logistics.jar.JarPackageItem; import ru.zznty.create_factory_logistics.logistics.panel.FactoryFluidPanelBehaviour; @@ -330,12 +332,21 @@ private void setOutputIngredientCount(BigItemStack instance, int value) { ) ) private int scrollInputClampRemoval(int value, int min, int max, Operation original, - @Local BigItemStack itemStack) { + @Local BigItemStack itemStack, @Local(ordinal = 2, argsOnly = true) double pDelta) { BigGenericStack stack = BigGenericStack.of(itemStack); int maxStackSize = GenericContentExtender.registrationOf(stack.get().key()).clientProvider().guiHandler() .maxStackSize(stack.get().key()); + if (stack.get().key() instanceof FluidKey){ + var multiplier = 1000; //If no keys pressed + if (hasShiftDown() && hasControlDown()) {multiplier = 1;} + else if (hasControlDown()) {multiplier = 10;} + else if (hasShiftDown()) {multiplier = 100;} + + value = (int) (stack.asStack().count + Math.signum(pDelta) * multiplier); + } + if (maxStackSize < 0) return Math.max(1, value); @@ -350,12 +361,21 @@ private int scrollInputClampRemoval(int value, int min, int max, Operation original) { + private int scrollOutputClampRemoval(int value, int min, int max, Operation original, @Local(ordinal = 2, argsOnly = true) double pDelta) { BigGenericStack stack = BigGenericStack.of(outputConfig); int maxStackSize = GenericContentExtender.registrationOf(stack.get().key()).clientProvider().guiHandler() .maxStackSize(stack.get().key()); + if (stack.get().key() instanceof FluidKey){ + var multiplier = 1000; //If no keys pressed + if (hasShiftDown() && hasControlDown()) {multiplier = 1;} + else if (hasControlDown()) {multiplier = 10;} + else if (hasShiftDown()) {multiplier = 100;} + + value = (int) (stack.asStack().count + Math.signum(pDelta) * multiplier); + } + if (maxStackSize < 0) return Math.max(1, value); diff --git a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/redstoneRequester/RedstoneRequesterScreenMixin.java b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/redstoneRequester/RedstoneRequesterScreenMixin.java index 809d361..cab4ceb 100644 --- a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/redstoneRequester/RedstoneRequesterScreenMixin.java +++ b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/redstoneRequester/RedstoneRequesterScreenMixin.java @@ -29,11 +29,13 @@ import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.SlotItemHandler; import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Debug; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.ModifyConstant; import org.spongepowered.asm.mixin.injection.Redirect; import ru.zznty.create_factory_abstractions.api.generic.stack.GenericStack; @@ -44,6 +46,7 @@ import ru.zznty.create_factory_abstractions.generic.support.GenericRedstoneRequester; import ru.zznty.create_factory_abstractions.generic.support.GenericRedstoneRequesterConfigurationPacket; import ru.zznty.create_factory_logistics.logistics.generic.FluidGenericStack; +import ru.zznty.create_factory_logistics.logistics.generic.FluidKey; import java.util.ArrayList; import java.util.List; @@ -163,6 +166,26 @@ private boolean isIngredientEmptyMouseHandler(boolean original, return genericStackLocalRef.get().isEmpty(); } + @ModifyArg( + method = "mouseScrolled", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/util/Mth;clamp(III)I" + ), + index = 0 + ) + private int transferNum(int transfer, @Local(ordinal = 2) int i, @Local(ordinal = 2, argsOnly = true) double pDelta , @Share("genericStackLocalRef") LocalRef genericStackLocalRef){ + if (genericStackLocalRef.get().key() instanceof FluidKey){ + var multiplier = 1000; //If no keys are pressed + if (hasShiftDown() && hasControlDown()) {multiplier = 1;} + else if (hasControlDown()) {multiplier = 10;} + else if (hasShiftDown()) {multiplier = 100;} + + transfer = (int) (amounts.get(i) + Math.signum(pDelta) * multiplier); + } + return transfer; + } + @ModifyConstant( method = "mouseScrolled", constant = @Constant(intValue = 256) diff --git a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/stockKeeper/StockKeeperRequestScreenMixin.java b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/stockKeeper/StockKeeperRequestScreenMixin.java index 405b15f..7f7cf52 100644 --- a/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/stockKeeper/StockKeeperRequestScreenMixin.java +++ b/forge/src/main/java/ru/zznty/create_factory_logistics/mixin/logistics/stockKeeper/StockKeeperRequestScreenMixin.java @@ -17,6 +17,7 @@ import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -25,6 +26,7 @@ import net.minecraft.world.level.block.Blocks; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.Redirect; import ru.zznty.create_factory_abstractions.api.generic.crafting.OrderProvider; import ru.zznty.create_factory_abstractions.api.generic.crafting.RecipeRequestHelper; @@ -36,6 +38,7 @@ import ru.zznty.create_factory_abstractions.generic.support.BigGenericStack; import ru.zznty.create_factory_abstractions.generic.support.CraftableGenericStack; import ru.zznty.create_factory_abstractions.generic.support.GenericInventorySummary; +import ru.zznty.create_factory_logistics.logistics.generic.FluidKey; import ru.zznty.create_factory_logistics.logistics.ingredient.ClickableIngredientProvider; import ru.zznty.create_factory_logistics.mixin.accessor.CategoryEntryAccessor; import ru.zznty.create_factory_logistics.mixin.accessor.StockTickerBlockEntityAccessor; @@ -167,6 +170,20 @@ private BigItemStack createOrderForIngredientInClicked(ItemStack $, int count, return genericStack.asStack(); } + @ModifyArg( + method = "mouseScrolled", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/util/Mth;ceil(D)I" + ) + ) + private double transferNum(double transfer, @Local BigItemStack entry, @Local(ordinal = 2, argsOnly = true) double delta){ + if (BigGenericStack.of(entry).get().key() instanceof FluidKey){ + transfer = Mth.ceil(Math.abs(delta)) * (hasControlDown()? 10 : 1000); + } + return transfer; + } + @Redirect( method = "mouseScrolled", at = @At(