From 34b4fd9aaa05ed95a2798e988c0fad72438abc69 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Fri, 19 Dec 2025 02:57:00 -0800 Subject: [PATCH 01/13] render left-handed players correctly --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 5 ++++ .../universaltweaks/core/UTMixinLoader.java | 1 + .../mixin/UTRenderAtlasFaceMixin.java | 27 +++++++++++++++++ .../mixin/UTRenderClipboardTextMixin.java | 29 +++++++++++++++++++ .../mixins.mods.bibliocraft.lefthand.json | 10 +++++++ 6 files changed, 73 insertions(+) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderAtlasFaceMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderClipboardTextMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.lefthand.json diff --git a/README.md b/README.md index f2fe279b..72d96152 100644 --- a/README.md +++ b/README.md @@ -338,6 +338,7 @@ All changes are toggleable via config files. * **Bibliocraft** * **Disable Version Check:** Fixes client-side memory leak by disabling version check * **Fix ItemStack Copying:** Fixes removing an ItemStack not copying all data correctly, particularly for backpacks + * **Fix Left Handed Rendering:** Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left * **Binnie's Mods** * **Gather Windfall:** Allows Forestry farms to pick up ExtraTrees fruit * **Biomes O' Plenty** diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 1c6f32e2..6e5c03b8 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -458,6 +458,11 @@ public static class BiblioCraftCategory @Config.Comment("Fixes client-side memory leak by disabling version check") public boolean utDisableVersionCheckToggle = true; + @Config.RequiresMcRestart + @Config.Name("Fix Left Handed Rendering") + @Config.Comment("Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left") + public boolean utSwapDisplayHandWhenLeftHanded = true; + @Config.RequiresMcRestart @Config.Name("Fix ItemStack Copying") @Config.Comment("Fixes removing an ItemStack not copying all data correctly, particularly for backpacks") diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index ad44aa04..f9695b9c 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -33,6 +33,7 @@ public class UTMixinLoader implements ILateMixinLoader { put("mixins.mods.actuallyadditions.itemparticle.json", () -> loaded("actuallyadditions") && UTConfigMods.ACTUALLY_ADDITIONS.utItemLaserParticlesGraphics > -1); put("mixins.mods.bibliocraft.version.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utDisableVersionCheckToggle); + put("mixins.mods.bibliocraft.lefthand.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utSwapDisplayHandWhenLeftHanded); put("mixins.mods.cbmultipart.client.json", () -> loaded("forgemultipartcbe") && UTConfigMods.CB_MULTIPART.utMemoryLeakFixToggle); put("mixins.mods.compactmachines.memory.json", () -> loaded("compactmachines3") && UTConfigMods.COMPACT_MACHINES.utMemoryLeakFixToggle); put("mixins.mods.compactmachines.render.json", () -> loaded("compactmachines3") && UTConfigMods.COMPACT_MACHINES.utCMRenderFixToggle); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderAtlasFaceMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderAtlasFaceMixin.java new file mode 100644 index 00000000..5a5c7921 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderAtlasFaceMixin.java @@ -0,0 +1,27 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.lefthand.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.EnumHandSide; +import net.minecraftforge.client.event.RenderSpecificHandEvent; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; +import jds.bibliocraft.events.RenderAtlasFace; +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; + +// Courtesy of WaitingIdly +@Mixin(value = RenderAtlasFace.class, remap = false) +public class UTRenderAtlasFaceMixin +{ + @Inject(method = "renderItem", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/client/event/RenderSpecificHandEvent;getSwingProgress()F")) + private void utAdjustForLeftHand(RenderSpecificHandEvent event, CallbackInfo ci, @Local(ordinal = 1) LocalBooleanRef isSmallLeft, @Local(ordinal = 2) LocalBooleanRef isSmallRight) + { + if (Minecraft.getMinecraft().player.getPrimaryHand() == EnumHandSide.RIGHT) return; + boolean swap = isSmallLeft.get(); + isSmallLeft.set(isSmallRight.get()); + isSmallRight.set(swap); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderClipboardTextMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderClipboardTextMixin.java new file mode 100644 index 00000000..09ad7669 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/lefthand/mixin/UTRenderClipboardTextMixin.java @@ -0,0 +1,29 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.lefthand.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.EnumHandSide; +import net.minecraftforge.client.event.RenderSpecificHandEvent; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import jds.bibliocraft.events.RenderClipboardText; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +// Courtesy of WaitingIdly +@Mixin(value = RenderClipboardText.class, remap = false) +public class UTRenderClipboardTextMixin +{ + @Definition(id = "event", local = @Local(type = RenderSpecificHandEvent.class, argsOnly = true)) + @Definition(id = "getHand", method = "Lnet/minecraftforge/client/event/RenderSpecificHandEvent;getHand()Lnet/minecraft/util/EnumHand;") + @Definition(id = "MAIN_HAND", field = "Lnet/minecraft/util/EnumHand;MAIN_HAND:Lnet/minecraft/util/EnumHand;") + @Expression("event.getHand() == MAIN_HAND") + @ModifyExpressionValue(method = "render", at = @At("MIXINEXTRAS:EXPRESSION")) + private boolean utEnsureProperHand(boolean original) + { + boolean isRightHanded = Minecraft.getMinecraft().player.getPrimaryHand() == EnumHandSide.RIGHT; + return original == isRightHanded; + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.lefthand.json b/src/main/resources/mixins.mods.bibliocraft.lefthand.json new file mode 100644 index 00000000..fc625a0a --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.lefthand.json @@ -0,0 +1,10 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.lefthand.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixinextras": { + "minVersion": "0.5.0" + }, + "client": ["UTRenderAtlasFaceMixin", "UTRenderClipboardTextMixin"] +} \ No newline at end of file From 368aa3038af85fa7f613cd34aa9da51720fc8a4c Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Fri, 19 Dec 2025 22:23:48 -0800 Subject: [PATCH 02/13] change at use to accessor mixins --- .../consumption/UTDoubleConsumption.java | 4 ++- .../world/portal/UTPortalLocationLink.java | 3 +- .../universaltweaks/core/UTLoadingPlugin.java | 2 ++ .../mixin/UTItemBoundToolMixin.java | 9 ++--- .../mods/vanilla/mixin/UTBlockAccessor.java | 17 +++++++++ .../mods/vanilla/mixin/UTEntityAccessor.java | 13 +++++++ .../vanilla/mixin/UTEntityItemAccessor.java | 13 +++++++ .../mixin/UTEntityLivingBaseAccessor.java | 19 ++++++++++ .../mixin/UTEntityThrowableAccessor.java | 14 ++++++++ .../vanilla/mixin/UTMinecraftAccessor.java | 20 +++++++++++ .../mixin/UTRangedAttributeAccessor.java | 16 +++++++++ .../betterplacement/UTBetterPlacement.java | 9 ++--- .../entities/attributes/UTAttributes.java | 5 +-- .../itementities/mixin/UTEntityItemMixin.java | 3 +- .../tweaks/items/parry/UTParry.java | 10 +++--- .../particle/UTParticleSituationEnum.java | 3 +- .../mixins.vanilla.mod.accessors.json | 7 ++++ src/main/resources/universaltweaks_at.cfg | 36 ------------------- 18 files changed, 149 insertions(+), 54 deletions(-) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTBlockAccessor.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityAccessor.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityItemAccessor.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityLivingBaseAccessor.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityThrowableAccessor.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTMinecraftAccessor.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTRangedAttributeAccessor.java create mode 100644 src/main/resources/mixins.vanilla.mod.accessors.json diff --git a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/consumption/UTDoubleConsumption.java b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/consumption/UTDoubleConsumption.java index 7618cc93..5532b776 100644 --- a/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/consumption/UTDoubleConsumption.java +++ b/src/main/java/mod/acgaming/universaltweaks/bugfixes/entities/consumption/UTDoubleConsumption.java @@ -4,6 +4,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTEntityLivingBaseAccessor; + // MC-849 // https://bugs.mojang.com/browse/MC-849 // Courtesy of Marcono1234, makamys @@ -17,7 +19,7 @@ public static void utDoubleConsumption(TickEvent.PlayerTickEvent event) ItemStack currentItem = event.player.inventory.getCurrentItem(); if (event.player.getActiveItemStack() != currentItem && ItemStack.areItemStacksEqual(currentItem, event.player.getActiveItemStack())) { - event.player.activeItemStack = currentItem; + ((UTEntityLivingBaseAccessor) event.player).setActiveItemStack(currentItem); } } } diff --git a/src/main/java/mod/acgaming/universaltweaks/bugfixes/world/portal/UTPortalLocationLink.java b/src/main/java/mod/acgaming/universaltweaks/bugfixes/world/portal/UTPortalLocationLink.java index 8f4d3d3f..1febdba1 100644 --- a/src/main/java/mod/acgaming/universaltweaks/bugfixes/world/portal/UTPortalLocationLink.java +++ b/src/main/java/mod/acgaming/universaltweaks/bugfixes/world/portal/UTPortalLocationLink.java @@ -7,6 +7,7 @@ import mod.acgaming.universaltweaks.UniversalTweaks; import mod.acgaming.universaltweaks.config.UTConfigGeneral; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTEntityAccessor; public class UTPortalLocationLink { @@ -17,7 +18,7 @@ public class UTPortalLocationLink public static void utDimensionChangeEventPortalLocation(EntityTravelToDimensionEvent event) { if (UTConfigGeneral.DEBUG.utDebugToggle) UniversalTweaks.LOGGER.debug("UTPortalLocationLink ::: Entity travel to dimension event"); - if (event.getEntity().inPortal && event.getEntity().getEntityWorld().provider.getDimension() == 0) + if (((UTEntityAccessor) event.getEntity()).isInPortal() && event.getEntity().getEntityWorld().provider.getDimension() == 0) { writePortalNBT(event.getEntity()); } diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java b/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java index 63e89847..10b980c5 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java @@ -44,6 +44,8 @@ public class UTLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader private static final Map commonMixinConfigs = ImmutableMap.copyOf(new HashMap() { { + put("mixins.vanilla.mod.accessors.json", () -> true); + if (UTConfigGeneral.MASTER_SWITCHES.utMasterSwitchBugfixes) { put("mixins.bugfixes.blocks.comparatortiming.json", () -> UTConfigBugfixes.BLOCKS.utComparatorTimingToggle); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bloodmagic/mixin/UTItemBoundToolMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bloodmagic/mixin/UTItemBoundToolMixin.java index 779e2f5d..21aab17a 100644 --- a/src/main/java/mod/acgaming/universaltweaks/mods/bloodmagic/mixin/UTItemBoundToolMixin.java +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bloodmagic/mixin/UTItemBoundToolMixin.java @@ -15,6 +15,7 @@ import WayofTime.bloodmagic.item.ItemBoundTool; import com.llamalad7.mixinextras.sugar.Local; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTBlockAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; @@ -26,12 +27,12 @@ @Mixin(value = ItemBoundTool.class, remap = false) public abstract class UTItemBoundToolMixin { - @Shadow(remap = true) - public abstract float getDestroySpeed(ItemStack stack, IBlockState state); - @Unique private final NonNullList harvestedStacks = NonNullList.create(); + @Shadow(remap = true) + public abstract float getDestroySpeed(ItemStack stack, IBlockState state); + /** * @author Invadermonky * @reason The default implementation of this method causes significant lag when harvesting large numbers of blocks. @@ -69,7 +70,7 @@ protected void sharedHarvest(ItemStack stack, World world, EntityPlayer player, NonNullList drops = NonNullList.create(); if (silkTouch && state.getBlock().canSilkHarvest(world, pos, world.getBlockState(pos), player)) { - ItemStack silkDrop = state.getBlock().getSilkTouchDrop(state); + ItemStack silkDrop = ((UTBlockAccessor) state.getBlock()).callGetSilkTouchDrop(state); if (!silkDrop.isEmpty()) { drops.add(silkDrop); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTBlockAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTBlockAccessor.java new file mode 100644 index 00000000..daae1297 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTBlockAccessor.java @@ -0,0 +1,17 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.ai.attributes.RangedAttribute; +import net.minecraft.item.ItemStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Block.class) +public interface UTBlockAccessor +{ + @Invoker("getSilkTouchDrop") + ItemStack callGetSilkTouchDrop(IBlockState state); +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityAccessor.java new file mode 100644 index 00000000..f363c8bc --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityAccessor.java @@ -0,0 +1,13 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.entity.Entity; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Entity.class) +public interface UTEntityAccessor +{ + @Accessor("inPortal") + boolean isInPortal(); +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityItemAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityItemAccessor.java new file mode 100644 index 00000000..1fad0f01 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityItemAccessor.java @@ -0,0 +1,13 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.entity.item.EntityItem; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(EntityItem.class) +public interface UTEntityItemAccessor +{ + @Invoker("combineItems") + boolean callCombineItems(EntityItem other); +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityLivingBaseAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityLivingBaseAccessor.java new file mode 100644 index 00000000..5652bde2 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityLivingBaseAccessor.java @@ -0,0 +1,19 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(EntityLivingBase.class) +public interface UTEntityLivingBaseAccessor +{ + @Accessor("activeItemStack") + void setActiveItemStack(ItemStack stack); + + @Invoker("canBlockDamageSource") + boolean callCanBlockDamageSource(DamageSource damageSource); +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityThrowableAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityThrowableAccessor.java new file mode 100644 index 00000000..4199bb5c --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTEntityThrowableAccessor.java @@ -0,0 +1,14 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.projectile.EntityThrowable; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(EntityThrowable.class) +public interface UTEntityThrowableAccessor +{ + @Accessor("thrower") + void setThrower(EntityLivingBase thower); +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTMinecraftAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTMinecraftAccessor.java new file mode 100644 index 00000000..56d5cc3a --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTMinecraftAccessor.java @@ -0,0 +1,20 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.ModelManager; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(Minecraft.class) +public interface UTMinecraftAccessor +{ + @Accessor("modelManager") + ModelManager getModelManager(); + + @Accessor("rightClickDelayTimer") + int getRightClickDelayTimer(); + + @Accessor("rightClickDelayTimer") + void setRightClickDelayTimer(int value); +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTRangedAttributeAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTRangedAttributeAccessor.java new file mode 100644 index 00000000..4b4c578f --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTRangedAttributeAccessor.java @@ -0,0 +1,16 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.entity.ai.attributes.RangedAttribute; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RangedAttribute.class) +public interface UTRangedAttributeAccessor +{ + @Accessor("minimumValue") + void setMinimumValue(double minimumValue); + + @Accessor("maximumValue") + void setMaximumValue(double maximumValue); +} diff --git a/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/betterplacement/UTBetterPlacement.java b/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/betterplacement/UTBetterPlacement.java index 08ad85be..26253da6 100644 --- a/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/betterplacement/UTBetterPlacement.java +++ b/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/betterplacement/UTBetterPlacement.java @@ -12,6 +12,7 @@ import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; import mod.acgaming.universaltweaks.config.UTConfigTweaks; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTMinecraftAccessor; // Courtesy of tterrag1098, BucketOfCompasses public class UTBetterPlacement @@ -33,7 +34,7 @@ public static void utBetterPlacement(TickEvent.ClientTickEvent event) Type hitType = hover.typeOfHit; if (hitType == Type.BLOCK) { - int timer = Minecraft.getMinecraft().rightClickDelayTimer; + int timer = ((UTMinecraftAccessor) Minecraft.getMinecraft()).getRightClickDelayTimer(); BlockPos pos = hover.getBlockPos(); EnumFacing side = hover.sideHit; Vec3d playerVector = Minecraft.getMinecraft().player.getPositionVector(); @@ -48,7 +49,7 @@ public static void utBetterPlacement(TickEvent.ClientTickEvent event) // [*]: Special case for blocks that you right-click to remove, e.g. by holding a Chest Transporter. && !lastTargetPos.equals(pos.offset(side)))) { - Minecraft.getMinecraft().rightClickDelayTimer = 0; + ((UTMinecraftAccessor) Minecraft.getMinecraft()).setRightClickDelayTimer(0); } } else @@ -59,11 +60,11 @@ public static void utBetterPlacement(TickEvent.ClientTickEvent event) // Player is building straight-up if (side == EnumFacing.UP && !playerVector.equals(lastPlayerPos) && playerPos.getX() == pos.getX() && playerPos.getZ() == pos.getZ()) { - Minecraft.getMinecraft().rightClickDelayTimer = 0; + ((UTMinecraftAccessor) Minecraft.getMinecraft()).setRightClickDelayTimer(0); } else if (UTConfigTweaks.BLOCKS.BETTER_PLACEMENT.utBetterPlacementNewLoc && pos.equals(lastTargetPos) && side == lastTargetSide && !isInteractableAt(pos)) { - Minecraft.getMinecraft().rightClickDelayTimer = 4; + ((UTMinecraftAccessor) Minecraft.getMinecraft()).setRightClickDelayTimer(4); } } lastTargetPos = pos.toImmutable(); diff --git a/src/main/java/mod/acgaming/universaltweaks/tweaks/entities/attributes/UTAttributes.java b/src/main/java/mod/acgaming/universaltweaks/tweaks/entities/attributes/UTAttributes.java index a8d7ad91..c01c2670 100644 --- a/src/main/java/mod/acgaming/universaltweaks/tweaks/entities/attributes/UTAttributes.java +++ b/src/main/java/mod/acgaming/universaltweaks/tweaks/entities/attributes/UTAttributes.java @@ -5,6 +5,7 @@ import mod.acgaming.universaltweaks.UniversalTweaks; import mod.acgaming.universaltweaks.config.UTConfigTweaks; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTRangedAttributeAccessor; import static net.minecraft.entity.SharedMonsterAttributes.*; @@ -33,8 +34,8 @@ public static void setValues(IAttribute attribute, double minValue, double maxVa { if (attribute instanceof RangedAttribute) { - ((RangedAttribute) attribute).minimumValue = minValue; - ((RangedAttribute) attribute).maximumValue = maxValue; + ((UTRangedAttributeAccessor) attribute).setMinimumValue(minValue); + ((UTRangedAttributeAccessor) attribute).setMaximumValue(maxValue); UniversalTweaks.LOGGER.info("UTAttributes ::: Successfully altered attribute {} with {} as minimum and {} as maximum", attribute.getName(), minValue, maxValue); } } diff --git a/src/main/java/mod/acgaming/universaltweaks/tweaks/items/itementities/mixin/UTEntityItemMixin.java b/src/main/java/mod/acgaming/universaltweaks/tweaks/items/itementities/mixin/UTEntityItemMixin.java index f0de1d89..45f639ba 100644 --- a/src/main/java/mod/acgaming/universaltweaks/tweaks/items/itementities/mixin/UTEntityItemMixin.java +++ b/src/main/java/mod/acgaming/universaltweaks/tweaks/items/itementities/mixin/UTEntityItemMixin.java @@ -12,6 +12,7 @@ import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import mod.acgaming.universaltweaks.config.UTConfigTweaks; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTEntityItemAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -142,7 +143,7 @@ public void utIECombinationSearch(CallbackInfo ci) if (entityItem.ticksExisted < 20) return; double radius = UTConfigTweaks.ITEMS.ITEM_ENTITIES.utIESmartCombinationRadius; boolean checkY = UTConfigTweaks.ITEMS.ITEM_ENTITIES.utIESmartCombinationYAxis; - for (EntityItem i : entityItem.world.getEntitiesWithinAABB(EntityItem.class, entityItem.getEntityBoundingBox().grow(radius, checkY ? radius : 0, radius))) entityItem.combineItems(i); + for (EntityItem i : entityItem.world.getEntitiesWithinAABB(EntityItem.class, entityItem.getEntityBoundingBox().grow(radius, checkY ? radius : 0, radius))) ((UTEntityItemAccessor) entityItem).callCombineItems(i); ci.cancel(); } } diff --git a/src/main/java/mod/acgaming/universaltweaks/tweaks/items/parry/UTParry.java b/src/main/java/mod/acgaming/universaltweaks/tweaks/items/parry/UTParry.java index d11f1c3f..4bea3338 100644 --- a/src/main/java/mod/acgaming/universaltweaks/tweaks/items/parry/UTParry.java +++ b/src/main/java/mod/acgaming/universaltweaks/tweaks/items/parry/UTParry.java @@ -31,6 +31,8 @@ import mod.acgaming.universaltweaks.UniversalTweaks; import mod.acgaming.universaltweaks.config.UTConfigGeneral; import mod.acgaming.universaltweaks.config.UTConfigTweaks; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTEntityLivingBaseAccessor; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTEntityThrowableAccessor; // Courtesy of Drullkus public class UTParry @@ -84,7 +86,7 @@ public static void utArrowParry(ProjectileImpactEvent.Arrow event) { EntityLivingBase entityBlocking = (EntityLivingBase) entity; if (UTConfigTweaks.ITEMS.PARRY.utParryReboundRequire && getEnchantedLevel(entityBlocking.getActiveItemStack()) == 0) return; - if (entityBlocking.canBlockDamageSource(new DamageSource("parry_this") + if (((UTEntityLivingBaseAccessor) entityBlocking).callCanBlockDamageSource(new DamageSource("parry_this") { public Vec3d getDamageLocation() { @@ -121,7 +123,7 @@ public static void utFireballParry(ProjectileImpactEvent.Fireball event) { EntityLivingBase entityBlocking = (EntityLivingBase) entity; if (UTConfigTweaks.ITEMS.PARRY.utParryReboundRequire && getEnchantedLevel(entityBlocking.getActiveItemStack()) == 0) return; - if (entityBlocking.canBlockDamageSource(new DamageSource("parry_this") + if (((UTEntityLivingBaseAccessor) entityBlocking).callCanBlockDamageSource(new DamageSource("parry_this") { public Vec3d getDamageLocation() { @@ -161,7 +163,7 @@ public static void utThrowableParry(ProjectileImpactEvent.Throwable event) { EntityLivingBase entityBlocking = (EntityLivingBase) entity; if (UTConfigTweaks.ITEMS.PARRY.utParryReboundRequire && getEnchantedLevel(entityBlocking.getActiveItemStack()) == 0) return; - if (entityBlocking.canBlockDamageSource(new DamageSource("parry_this") + if (((UTEntityLivingBaseAccessor) entityBlocking).callCanBlockDamageSource(new DamageSource("parry_this") { public Vec3d getDamageLocation() { @@ -171,7 +173,7 @@ public Vec3d getDamageLocation() { Vec3d playerVec3 = entityBlocking.getLookVec(); projectile.shoot(playerVec3.x, playerVec3.y, playerVec3.z, 1.1F, 0.1F); - projectile.thrower = entityBlocking; + ((UTEntityThrowableAccessor) projectile).setThrower(entityBlocking); entityBlocking.world.playSound(null, entityBlocking.getPosition(), SoundEvents.ITEM_SHIELD_BLOCK, SoundCategory.PLAYERS, 1.0F, 0.8F + entityBlocking.world.rand.nextFloat() * 0.4F); if (UTConfigTweaks.ITEMS.PARRY.utParrySound) entityBlocking.world.playSound(null, entityBlocking.getPosition(), SoundEvents.ENTITY_ARROW_HIT_PLAYER, SoundCategory.PLAYERS, 0.5F, 2.0F); event.setCanceled(true); diff --git a/src/main/java/mod/acgaming/universaltweaks/util/particle/UTParticleSituationEnum.java b/src/main/java/mod/acgaming/universaltweaks/util/particle/UTParticleSituationEnum.java index b448d222..47a10384 100644 --- a/src/main/java/mod/acgaming/universaltweaks/util/particle/UTParticleSituationEnum.java +++ b/src/main/java/mod/acgaming/universaltweaks/util/particle/UTParticleSituationEnum.java @@ -15,6 +15,7 @@ import forestry.core.blocks.BlockBase; import forestry.core.blocks.IBlockType; import forestry.core.blocks.IMachinePropertiesTesr; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTMinecraftAccessor; /** * {@link UTParticleSpawnerMessage} uses this enum to understand which particle situation we are handling @@ -75,7 +76,7 @@ private TextureAtlasSprite getTextureFromState(IBlockState state) @SideOnly(Side.CLIENT) private TextureAtlasSprite getTexture(String textureLocation) { - return Minecraft.getMinecraft().modelManager.getTextureMap().getAtlasSprite(textureLocation); + return ((UTMinecraftAccessor) Minecraft.getMinecraft()).getModelManager().getTextureMap().getAtlasSprite(textureLocation); } } \ No newline at end of file diff --git a/src/main/resources/mixins.vanilla.mod.accessors.json b/src/main/resources/mixins.vanilla.mod.accessors.json new file mode 100644 index 00000000..4834a8f0 --- /dev/null +++ b/src/main/resources/mixins.vanilla.mod.accessors.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.vanilla.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTBlockAccessor", "UTEntityAccessor", "UTEntityItemAccessor", "UTEntityLivingBaseAccessor", "UTEntityThrowableAccessor", "UTMinecraftAccessor", "UTRangedAttributeAccessor"] +} \ No newline at end of file diff --git a/src/main/resources/universaltweaks_at.cfg b/src/main/resources/universaltweaks_at.cfg index 0360d5ed..f8d0a7d9 100644 --- a/src/main/resources/universaltweaks_at.cfg +++ b/src/main/resources/universaltweaks_at.cfg @@ -1,45 +1,9 @@ -# Attributes -public-f net.minecraft.entity.ai.attributes.RangedAttribute field_111118_b # maximumValue -public-f net.minecraft.entity.ai.attributes.RangedAttribute field_111120_a # minimumValue - -# Parry -public net.minecraft.entity.projectile.EntityThrowable field_70192_c # EntityThrowable thrower -public net.minecraft.entity.EntityLivingBase func_184583_d(Lnet/minecraft/util/DamageSource;)Z # EntityLivingBase canBlockDamageSource - -# Item Entities -public net.minecraft.entity.item.EntityItem func_70289_a(Lnet/minecraft/entity/item/EntityItem;)Z # combineItems - # Breakable Bedrock public net.minecraft.block.Block func_176219_a(ILjava/lang/String;Lnet/minecraft/block/Block;)V # registerBlock -# Better Placement -public net.minecraft.client.Minecraft field_71467_ac # rightClickDelayTimer - -# Double Consumption -public net.minecraft.entity.EntityLivingBase field_184627_bm # activeItemStack - # Advancement Tab Type Enum public net.minecraft.client.gui.advancements.AdvancementTabType public net.minecraft.client.gui.advancements.AdvancementTabType ABOVE # ABOVE public net.minecraft.client.gui.advancements.AdvancementTabType BELOW # BELOW public net.minecraft.client.gui.advancements.AdvancementTabType LEFT # LEFT public net.minecraft.client.gui.advancements.AdvancementTabType RIGHT # RIGHT - -# Particle Util -public net.minecraft.client.Minecraft field_175617_aL # modelManager - -# Portal Location Link -public net.minecraft.entity.Entity field_71087_bX # inPortal - -# Blood Magic Bound Tool Tweak -public net.minecraft.block.Block func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockChorusFlower func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockNewLeaf func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockNewLog func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockOldLeaf func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockOldLog func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockQuartz func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockRedstoneLight func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockRedstoneOre func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockRotatedPillar func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop -public net.minecraft.block.BlockSilverfish func_180643_i(Lnet/minecraft/block/state/IBlockState;)Lnet/minecraft/item/ItemStack; # getSilkTouchDrop From 5706f2d425ebb1a7df18ce3fa233b8617e9ee6ad Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Fri, 19 Dec 2025 22:24:13 -0800 Subject: [PATCH 03/13] change breakable bedrock to not need at --- .../breakablebedrock/mixin/UTBreakableBedrockMixin.java | 9 +++++---- src/main/resources/universaltweaks_at.cfg | 2 -- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/breakablebedrock/mixin/UTBreakableBedrockMixin.java b/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/breakablebedrock/mixin/UTBreakableBedrockMixin.java index 56052a51..d6c1a27b 100644 --- a/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/breakablebedrock/mixin/UTBreakableBedrockMixin.java +++ b/src/main/java/mod/acgaming/universaltweaks/tweaks/blocks/breakablebedrock/mixin/UTBreakableBedrockMixin.java @@ -4,16 +4,17 @@ import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(Block.class) public class UTBreakableBedrockMixin { - @Redirect(method = "registerBlocks", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Block;registerBlock(ILjava/lang/String;Lnet/minecraft/block/Block;)V", ordinal = 6)) - private static void utBreakableBedrock(int id, String textualID, Block block_) + @WrapOperation(method = "registerBlocks", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/Block;registerBlock(ILjava/lang/String;Lnet/minecraft/block/Block;)V", ordinal = 6)) + private static void utBreakableBedrock(int id, String textualID, Block block_, Operation original) { - Block.registerBlock(id, textualID, (new Block(Material.ROCK)).setHardness(200.0F).setResistance(6000000.0F).setTranslationKey(textualID).setCreativeTab(CreativeTabs.BUILDING_BLOCKS)); + original.call(id, textualID, new Block(Material.ROCK).setHardness(200.0F).setResistance(6000000.0F).setTranslationKey(textualID).setCreativeTab(CreativeTabs.BUILDING_BLOCKS)); } } \ No newline at end of file diff --git a/src/main/resources/universaltweaks_at.cfg b/src/main/resources/universaltweaks_at.cfg index f8d0a7d9..66e198a4 100644 --- a/src/main/resources/universaltweaks_at.cfg +++ b/src/main/resources/universaltweaks_at.cfg @@ -1,5 +1,3 @@ -# Breakable Bedrock -public net.minecraft.block.Block func_176219_a(ILjava/lang/String;Lnet/minecraft/block/Block;)V # registerBlock # Advancement Tab Type Enum public net.minecraft.client.gui.advancements.AdvancementTabType From a4982ddb7a6368ae5c8393bdb1c4b6eb1e35feda Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Fri, 19 Dec 2025 22:29:25 -0800 Subject: [PATCH 04/13] Multiplayer Sound Fix --- README.md | 1 + .../universaltweaks/UniversalTweaks.java | 2 + .../universaltweaks/config/UTConfigMods.java | 5 ++ .../sound/UTBiblioCraftSoundRegister.java | 46 +++++++++++++++++++ .../vanilla/mixin/UTSoundEventAccessor.java | 14 ++++++ .../mixins.vanilla.mod.accessors.json | 2 +- 6 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sound/UTBiblioCraftSoundRegister.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTSoundEventAccessor.java diff --git a/README.md b/README.md index 72d96152..668d377e 100644 --- a/README.md +++ b/README.md @@ -339,6 +339,7 @@ All changes are toggleable via config files. * **Disable Version Check:** Fixes client-side memory leak by disabling version check * **Fix ItemStack Copying:** Fixes removing an ItemStack not copying all data correctly, particularly for backpacks * **Fix Left Handed Rendering:** Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left + * **Multiplayer Sound Fix:** Register all sounds, fixing bugs when attempting to play them on servers * **Binnie's Mods** * **Gather Windfall:** Allows Forestry farms to pick up ExtraTrees fruit * **Biomes O' Plenty** diff --git a/src/main/java/mod/acgaming/universaltweaks/UniversalTweaks.java b/src/main/java/mod/acgaming/universaltweaks/UniversalTweaks.java index 3dd54647..e588c4a4 100644 --- a/src/main/java/mod/acgaming/universaltweaks/UniversalTweaks.java +++ b/src/main/java/mod/acgaming/universaltweaks/UniversalTweaks.java @@ -28,6 +28,7 @@ import mod.acgaming.universaltweaks.core.UTMixinLoader; import mod.acgaming.universaltweaks.mods.arcanearchives.UTArcaneArchivesEvents; import mod.acgaming.universaltweaks.mods.astralsorcery.UTClearOnChange; +import mod.acgaming.universaltweaks.mods.bibliocraft.sound.UTBiblioCraftSoundRegister; import mod.acgaming.universaltweaks.mods.bloodmagic.UTBloodMagicEvents; import mod.acgaming.universaltweaks.mods.botania.UTBotaniaFancySkybox; import mod.acgaming.universaltweaks.mods.collective.UTCollectiveEvents; @@ -136,6 +137,7 @@ public void preInit(FMLPreInitializationEvent event) if (UTConfigGeneral.MASTER_SWITCHES.utMasterSwitchModIntegration) { if (UTMixinLoader.regularTConLoaded() && UTConfigMods.TINKERS_CONSTRUCT.utTConOreDictCacheToggle) UTOreDictCache.preInit(); + if (Loader.isModLoaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utRegisterSoundToggle) MinecraftForge.EVENT_BUS.register(new UTBiblioCraftSoundRegister()); } if (UTConfigGeneral.MASTER_SWITCHES.utMasterSwitchTweaks) diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 6e5c03b8..00ca854b 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -467,6 +467,11 @@ public static class BiblioCraftCategory @Config.Name("Fix ItemStack Copying") @Config.Comment("Fixes removing an ItemStack not copying all data correctly, particularly for backpacks") public boolean utCopyItemStackCorrectlyToggle = true; + + @Config.RequiresMcRestart + @Config.Name("Multiplayer Sound Fix") + @Config.Comment("Register all sounds, fixing bugs when attempting to play them on servers") + public boolean utRegisterSoundToggle = true; } public static class BiomesOPlentyCategory diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sound/UTBiblioCraftSoundRegister.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sound/UTBiblioCraftSoundRegister.java new file mode 100644 index 00000000..f3940c22 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sound/UTBiblioCraftSoundRegister.java @@ -0,0 +1,46 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.sound; + +import net.minecraft.util.SoundEvent; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.registries.IForgeRegistry; + +import jds.bibliocraft.CommonProxy; +import mod.acgaming.universaltweaks.mods.vanilla.mixin.UTSoundEventAccessor; + +// Courtesy of WaitingIdly +public class UTBiblioCraftSoundRegister +{ + private static void add(IForgeRegistry reg, SoundEvent sound) + { + reg.register(sound.setRegistryName(((UTSoundEventAccessor) sound).getSoundName())); + } + + /** + * BiblioCraft just... forgets to register its sounds. + * This works fine in singleplayer, but in multiplayer causes any noise generation to error. + * Sounds are created in {@link CommonProxy} and *should* be registered in either + * {@link jds.bibliocraft.BiblioCraft.RegisterTheThings} or perhaps {@link jds.bibliocraft.SoundLoader}. + */ + @SubscribeEvent + public void registerBiblioCraftSounds(RegistryEvent.Register event) + { + IForgeRegistry reg = event.getRegistry(); + add(reg, CommonProxy.SOUND_DING); + add(reg, CommonProxy.SOUND_TYPEWRITER_ADDPAPER); + add(reg, CommonProxy.SOUND_TYPEWRITER_TYPEING); + add(reg, CommonProxy.SOUND_TYPEWRITER_ENDBELL); + add(reg, CommonProxy.SOUND_TYPEWRITER_REMOVEBOOK); + add(reg, CommonProxy.SOUND_TYPEWRITER_TYPESINGLE); + add(reg, CommonProxy.SOUND_CLOCK_TICK); + add(reg, CommonProxy.SOUND_CLOCK_TOCK); + add(reg, CommonProxy.SOUND_CLOCK_CHIME); + add(reg, CommonProxy.SOUND_CLOCK_WIND); + add(reg, CommonProxy.SOUND_ITEM_HANDDRILL); + add(reg, CommonProxy.SOUND_ITEM_SCREWGUN); + add(reg, CommonProxy.SOUND_CASE_OPEN); + add(reg, CommonProxy.SOUND_CASE_CLOSE); + add(reg, CommonProxy.SOUND_TAPE_OPEN); + add(reg, CommonProxy.SOUND_TAPE_CLOSE); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTSoundEventAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTSoundEventAccessor.java new file mode 100644 index 00000000..057fe2a4 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/vanilla/mixin/UTSoundEventAccessor.java @@ -0,0 +1,14 @@ +package mod.acgaming.universaltweaks.mods.vanilla.mixin; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundEvent; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(SoundEvent.class) +public interface UTSoundEventAccessor +{ + @Accessor("soundName") + ResourceLocation getSoundName(); +} diff --git a/src/main/resources/mixins.vanilla.mod.accessors.json b/src/main/resources/mixins.vanilla.mod.accessors.json index 4834a8f0..818b59c8 100644 --- a/src/main/resources/mixins.vanilla.mod.accessors.json +++ b/src/main/resources/mixins.vanilla.mod.accessors.json @@ -3,5 +3,5 @@ "refmap": "universaltweaks.refmap.json", "minVersion": "0.8", "compatibilityLevel": "JAVA_8", - "mixins": ["UTBlockAccessor", "UTEntityAccessor", "UTEntityItemAccessor", "UTEntityLivingBaseAccessor", "UTEntityThrowableAccessor", "UTMinecraftAccessor", "UTRangedAttributeAccessor"] + "mixins": ["UTBlockAccessor", "UTEntityAccessor", "UTEntityItemAccessor", "UTEntityLivingBaseAccessor", "UTEntityThrowableAccessor", "UTMinecraftAccessor", "UTRangedAttributeAccessor", "UTSoundEventAccessor"] } \ No newline at end of file From 30aa04395a30117ccc20b40d9fd80569872edbb0 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Sat, 20 Dec 2025 01:36:15 -0800 Subject: [PATCH 05/13] Fix Fancy Sign Rotation --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 5 ++ .../universaltweaks/core/UTMixinLoader.java | 1 + .../sign/mixin/UTGuiFancySignMixin.java | 51 +++++++++++++++++++ .../UTTileEntityFancySignRendererMixin.java | 30 +++++++++++ .../mixins.mods.bibliocraft.sign.json | 10 ++++ 6 files changed, 98 insertions(+) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTGuiFancySignMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTTileEntityFancySignRendererMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.sign.json diff --git a/README.md b/README.md index 668d377e..eefb8ce2 100644 --- a/README.md +++ b/README.md @@ -337,6 +337,7 @@ All changes are toggleable via config files. * **Witches' Oven Fix:** Fixes Witches' Oven consuming container fuel items * **Bibliocraft** * **Disable Version Check:** Fixes client-side memory leak by disabling version check + * **Fix Fancy Sign Rotation:** Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world * **Fix ItemStack Copying:** Fixes removing an ItemStack not copying all data correctly, particularly for backpacks * **Fix Left Handed Rendering:** Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left * **Multiplayer Sound Fix:** Register all sounds, fixing bugs when attempting to play them on servers diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 00ca854b..5aa3c355 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -458,6 +458,11 @@ public static class BiblioCraftCategory @Config.Comment("Fixes client-side memory leak by disabling version check") public boolean utDisableVersionCheckToggle = true; + @Config.RequiresMcRestart + @Config.Name("Fix Fancy Sign Rotation") + @Config.Comment("Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world") + public boolean utFancySignRotationToggle = true; + @Config.RequiresMcRestart @Config.Name("Fix Left Handed Rendering") @Config.Comment("Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left") diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index f9695b9c..5b64fe0d 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -34,6 +34,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins.mods.actuallyadditions.itemparticle.json", () -> loaded("actuallyadditions") && UTConfigMods.ACTUALLY_ADDITIONS.utItemLaserParticlesGraphics > -1); put("mixins.mods.bibliocraft.version.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utDisableVersionCheckToggle); put("mixins.mods.bibliocraft.lefthand.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utSwapDisplayHandWhenLeftHanded); + put("mixins.mods.bibliocraft.sign.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utFancySignRotationToggle); put("mixins.mods.cbmultipart.client.json", () -> loaded("forgemultipartcbe") && UTConfigMods.CB_MULTIPART.utMemoryLeakFixToggle); put("mixins.mods.compactmachines.memory.json", () -> loaded("compactmachines3") && UTConfigMods.COMPACT_MACHINES.utMemoryLeakFixToggle); put("mixins.mods.compactmachines.render.json", () -> loaded("compactmachines3") && UTConfigMods.COMPACT_MACHINES.utCMRenderFixToggle); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTGuiFancySignMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTGuiFancySignMixin.java new file mode 100644 index 00000000..6d330a88 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTGuiFancySignMixin.java @@ -0,0 +1,51 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.sign.mixin; + +import jds.bibliocraft.gui.GuiFancySign; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +// Courtesy of WaitingIdly +@Mixin(value = GuiFancySign.class, remap = false) +public abstract class UTGuiFancySignMixin +{ + + /** + * @author WaitingIdly + * @reason Fixes blocks in the GUI being rotated too far, turns + *
GL11.glRotatef(-225.0F, 0.0F, 1.0F, 0.0F) + * into + *
GL11.glRotatef(135.0f, 0.0F, 1.0F, 0.0F) + */ + @ModifyConstant(method = "drawGuiContainerBackgroundLayer", constant = @Constant(floatValue = -225.0f)) + private float utFixLeft(float original) + { + return 135.0f; + } + + /** + * @author WaitingIdly + * @reason Fixes blocks in the GUI being rotated too far, turns + *
GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F) + * into + *
GL11.glRotatef(0.0f, 0.0F, 1.0F, 0.0F) + */ + @ModifyConstant(method = "drawGuiContainerBackgroundLayer", constant = @Constant(floatValue = 90.0f)) + private float utFixCenter(float original) + { + return 0.0f; + } + + /** + * @author WaitingIdly + * @reason Fixes blocks in the GUI being rotated too far, turns + *
GL11.glRotatef(225.0F, 0.0F, 1.0F, 0.0F) + * into + *
GL11.glRotatef(45.0f, 0.0F, 1.0F, 0.0F) + */ + @ModifyConstant(method = "drawGuiContainerBackgroundLayer", constant = @Constant(floatValue = 225.0f)) + private float utFixRight(float original) + { + return 45.0f; + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTTileEntityFancySignRendererMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTTileEntityFancySignRendererMixin.java new file mode 100644 index 00000000..7c7f8887 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/sign/mixin/UTTileEntityFancySignRendererMixin.java @@ -0,0 +1,30 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.sign.mixin; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import jds.bibliocraft.rendering.TileEntityFancySignRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +// Courtesy of WaitingIdly +@Mixin(value = TileEntityFancySignRenderer.class, remap = false) +public abstract class UTTileEntityFancySignRendererMixin +{ + @Shadow + private int slotRot; + + /** + * @author WaitingIdly + * @reason Flip when the "slot rotation" value is 2 instead of 0, + * to match how it is displayed in the GUI. + */ + @Definition(id = "slotRot", field = "Ljds/bibliocraft/rendering/TileEntityFancySignRenderer;slotRot:I") + @Expression("this.slotRot == 0") + @ModifyExpressionValue(method = "additionalGLStuffForItemStack", at = @At(value = "MIXINEXTRAS:EXPRESSION", ordinal = 1)) + private boolean utOnlyFlip2(boolean original) + { + return this.slotRot == 2; + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.sign.json b/src/main/resources/mixins.mods.bibliocraft.sign.json new file mode 100644 index 00000000..9333911a --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.sign.json @@ -0,0 +1,10 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.sign.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixinextras": { + "minVersion": "0.5.0" + }, + "client": ["UTTileEntityFancySignRendererMixin", "UTGuiFancySignMixin"] +} \ No newline at end of file From 42601ec9a08312fbc8640e7dc470fcb6e7180378 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Sun, 21 Dec 2025 04:47:15 -0800 Subject: [PATCH 06/13] Fix ItemHandler Method Not Existing --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 9 ++++ .../universaltweaks/core/UTMixinLoader.java | 1 + .../mixin/UTBiblioTileEntityMixin.java | 42 +++++++++++++++++++ .../mixins.mods.bibliocraft.handler.json | 7 ++++ 5 files changed, 60 insertions(+) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/handler/mixin/UTBiblioTileEntityMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.handler.json diff --git a/README.md b/README.md index eefb8ce2..5d3242c7 100644 --- a/README.md +++ b/README.md @@ -338,6 +338,7 @@ All changes are toggleable via config files. * **Bibliocraft** * **Disable Version Check:** Fixes client-side memory leak by disabling version check * **Fix Fancy Sign Rotation:** Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world + * **Fix IItemHandler Method Not Existing:** Fix IItemHandler#getStackInSlot method not existing due to being obfuscated by IInventory, preventing countless errors * **Fix ItemStack Copying:** Fixes removing an ItemStack not copying all data correctly, particularly for backpacks * **Fix Left Handed Rendering:** Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left * **Multiplayer Sound Fix:** Register all sounds, fixing bugs when attempting to play them on servers diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 5aa3c355..811c2e64 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -468,6 +468,15 @@ public static class BiblioCraftCategory @Config.Comment("Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left") public boolean utSwapDisplayHandWhenLeftHanded = true; + @Config.RequiresMcRestart + @Config.Name("Fix IItemHandler Method Not Existing") + @Config.Comment + ({ + "Fix IItemHandler#getStackInSlot method not existing due to being obfuscated by IInventory, preventing countless errors", + "This occurs because BiblioCraft's Tile Entities implement both IInventory and IItemHandler, and getStackInSlot is an obfuscated method in IInventory but not IItemHandler", + }) + public boolean utEnsureIItemHandlerMethodToggle = true; + @Config.RequiresMcRestart @Config.Name("Fix ItemStack Copying") @Config.Comment("Fixes removing an ItemStack not copying all data correctly, particularly for backpacks") diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index 5b64fe0d..80daa517 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -72,6 +72,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins.mods.astralsorcery.tool.json", () -> loaded("astralsorcery") && UTConfigMods.ASTRAL_SORCERY.utEmptyPropertiesZero); put("mixins.mods.backpack.json", () -> loaded("backpack") && UTConfigMods.BACKPACKS.utBPNoOffhandInteractionToggle); put("mixins.mods.bewitchment.json", () -> loaded("bewitchment") && UTConfigMods.BEWITCHMENT.utWitchesOvenFixToggle); + put("mixins.mods.bibliocraft.handler.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utEnsureIItemHandlerMethodToggle); put("mixins.mods.bibliocraft.itemstack.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utCopyItemStackCorrectlyToggle); put("mixins.mods.biomesoplenty.json", () -> loaded("biomesoplenty")); put("mixins.mods.biomesoplenty.sealevel.json", () -> loaded("biomesoplenty") && UTConfigTweaks.WORLD.utSeaLevel != 63); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/handler/mixin/UTBiblioTileEntityMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/handler/mixin/UTBiblioTileEntityMixin.java new file mode 100644 index 00000000..a8a40c01 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/handler/mixin/UTBiblioTileEntityMixin.java @@ -0,0 +1,42 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.handler.mixin; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import net.minecraftforge.items.IItemHandler; + +import jds.bibliocraft.tileentities.BiblioTileEntity; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +// Courtesy of WaitingIdly +@Mixin(value = BiblioTileEntity.class, remap = false) +public abstract class UTBiblioTileEntityMixin implements IItemHandler +{ + @Shadow + public NonNullList inventory; + + /** + * @author WaitingIdly + * BiblioCraft has their {@link BiblioTileEntity} implement both + * {@link net.minecraft.inventory.IInventory IInventory} and {@link IItemHandler}. + * Both of these classes have a method getStackInSlot method - + * {@link IItemHandler#getStackInSlot(int)} and {@link net.minecraft.inventory.IInventory#getStackInSlot(int) IInventory#getStackInSlot(int)}. + * However, the vanilla class gets obsfucated, which changes the method name to func_70301_a. + * This means that anything that tries to access the method {@link IItemHandler#getStackInSlot(int)} will fail and crash, + * as the method is not implemented. + *

+ * This creates a copy of that method but in such a way that it will not be obsfucated. + */ + @SuppressWarnings("AddedMixinMembersNamePattern") + @Override + public @NotNull ItemStack getStackInSlot(int slot) + { + ItemStack output = ItemStack.EMPTY; + if (slot >= 0 && slot < this.inventory.size()) + { + output = this.inventory.get(slot); + } + return output; + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.handler.json b/src/main/resources/mixins.mods.bibliocraft.handler.json new file mode 100644 index 00000000..9e6b5bdc --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.handler.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.handler.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTBiblioTileEntityMixin"] +} \ No newline at end of file From 3880ebd936b9f5a9dd821856ff61b0416ce898cd Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Sun, 21 Dec 2025 05:18:57 -0800 Subject: [PATCH 07/13] Fix Item Transfer --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 5 + .../universaltweaks/core/UTMixinLoader.java | 1 + .../mixin/UTBiblioTileEntityMixin.java | 109 ++++++++++++++++++ .../mixins.mods.bibliocraft.transfer.json | 7 ++ 5 files changed, 123 insertions(+) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/transfer/mixin/UTBiblioTileEntityMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.transfer.json diff --git a/README.md b/README.md index 5d3242c7..e7a4feb3 100644 --- a/README.md +++ b/README.md @@ -339,6 +339,7 @@ All changes are toggleable via config files. * **Disable Version Check:** Fixes client-side memory leak by disabling version check * **Fix Fancy Sign Rotation:** Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world * **Fix IItemHandler Method Not Existing:** Fix IItemHandler#getStackInSlot method not existing due to being obfuscated by IInventory, preventing countless errors + * **Fix Item Transfer:** Make BiblioCraft actually use simulate properly when inserting and extracting items, fixing many item transfer methods * **Fix ItemStack Copying:** Fixes removing an ItemStack not copying all data correctly, particularly for backpacks * **Fix Left Handed Rendering:** Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left * **Multiplayer Sound Fix:** Register all sounds, fixing bugs when attempting to play them on servers diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 811c2e64..9dbd691e 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -477,6 +477,11 @@ public static class BiblioCraftCategory }) public boolean utEnsureIItemHandlerMethodToggle = true; + @Config.RequiresMcRestart + @Config.Name("Fix Item Transfer") + @Config.Comment("Make BiblioCraft actually use simulate properly when inserting and extracting items, fixing many item transfer methods") + public boolean utFixItemTransferToggle = true; + @Config.RequiresMcRestart @Config.Name("Fix ItemStack Copying") @Config.Comment("Fixes removing an ItemStack not copying all data correctly, particularly for backpacks") diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index 80daa517..c4c9e4b8 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -74,6 +74,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins.mods.bewitchment.json", () -> loaded("bewitchment") && UTConfigMods.BEWITCHMENT.utWitchesOvenFixToggle); put("mixins.mods.bibliocraft.handler.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utEnsureIItemHandlerMethodToggle); put("mixins.mods.bibliocraft.itemstack.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utCopyItemStackCorrectlyToggle); + put("mixins.mods.bibliocraft.transfer.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utFixItemTransferToggle); put("mixins.mods.biomesoplenty.json", () -> loaded("biomesoplenty")); put("mixins.mods.biomesoplenty.sealevel.json", () -> loaded("biomesoplenty") && UTConfigTweaks.WORLD.utSeaLevel != 63); put("mixins.mods.bloodmagic.boundtool.json", () -> loaded("bloodmagic") && UTConfigMods.BLOOD_MAGIC.utBoundToolTweakToggle); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/transfer/mixin/UTBiblioTileEntityMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/transfer/mixin/UTBiblioTileEntityMixin.java new file mode 100644 index 00000000..1a377edf --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/transfer/mixin/UTBiblioTileEntityMixin.java @@ -0,0 +1,109 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.transfer.mixin; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.ItemHandlerHelper; + +import jds.bibliocraft.tileentities.BiblioTileEntity; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +// Courtesy of WaitingIdly +@Mixin(value = BiblioTileEntity.class, remap = false) +public abstract class UTBiblioTileEntityMixin implements IInventory +{ + @Shadow + public abstract int getSlotLimit(int slot); + + /** + * @author WaitingIdly + * @reason Properly implement insertion logic, based off of {@link net.minecraftforge.items.wrapper.InvWrapper InvWrapper}. + * Overwritten version does not simulate correctly, meaning that anything that checks if simulation passes + * will never insert, does not check if the itemstacks can stack, only that they are the same item, + * and ignores the actual slot limit. + */ + @Overwrite + public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) + { + if (stack.isEmpty()) return ItemStack.EMPTY; + ItemStack stackInSlot = this.getStackInSlot(slot); + if (!stackInSlot.isEmpty()) + { + if (stackInSlot.getCount() >= Math.min(stackInSlot.getMaxStackSize(), getInventoryStackLimit())) return stack; + if (!ItemHandlerHelper.canItemStacksStack(stack, stackInSlot)) return stack; + if (!this.isItemValidForSlot(slot, stack)) return stack; + int m = Math.min(stack.getMaxStackSize(), getInventoryStackLimit()) - stackInSlot.getCount(); + if (stack.getCount() <= m) + { + if (!simulate) + { + ItemStack copy = stack.copy(); + copy.grow(stackInSlot.getCount()); + this.setInventorySlotContents(slot, copy); + } + return ItemStack.EMPTY; + } + // copy the stack to not modify the original one + stack = stack.copy(); + if (simulate) + { + stack.shrink(m); + } + else + { + ItemStack copy = stack.splitStack(m); + copy.grow(stackInSlot.getCount()); + this.setInventorySlotContents(slot, copy); + } + return stack; + } + if (!this.isItemValidForSlot(slot, stack)) return stack; + int m = Math.min(stack.getMaxStackSize(), getInventoryStackLimit()); + if (m < stack.getCount()) + { + // copy the stack to not modify the original one + stack = stack.copy(); + if (simulate) + { + stack.shrink(m); + } + else + { + this.setInventorySlotContents(slot, stack.splitStack(m)); + } + return stack; + } + if (!simulate) + { + this.setInventorySlotContents(slot, stack); + } + return ItemStack.EMPTY; + } + + /** + * @author WaitingIdly + * @reason Properly implement extraction logic, based off of {@link net.minecraftforge.items.wrapper.InvWrapper InvWrapper}. + * Overwritten version does not properly simulate extraction, always returning {@link ItemStack#EMPTY} + */ + @Overwrite + public ItemStack extractItem(int slot, int amount, boolean simulate) + { + if (amount == 0) return ItemStack.EMPTY; + ItemStack stackInSlot = this.getStackInSlot(slot); + if (stackInSlot.isEmpty()) return ItemStack.EMPTY; + if (simulate) + { + if (stackInSlot.getCount() < amount) + { + return stackInSlot.copy(); + } + ItemStack copy = stackInSlot.copy(); + copy.setCount(amount); + return copy; + } + int m = Math.min(stackInSlot.getCount(), amount); + return this.decrStackSize(slot, m); + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.transfer.json b/src/main/resources/mixins.mods.bibliocraft.transfer.json new file mode 100644 index 00000000..34b1854a --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.transfer.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.transfer.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTBiblioTileEntityMixin"] +} \ No newline at end of file From 8f182060bf156c9332449d802a51aad7a3b58511 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Mon, 22 Dec 2025 01:27:13 -0800 Subject: [PATCH 08/13] Fix Armor Stand Slots --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 5 ++ .../universaltweaks/core/UTMixinLoader.java | 1 + .../armor/mixin/UTContainerArmorMixin.java | 82 +++++++++++++++++++ .../armor/mixin/UTSlotArmorBootsMixin.java | 27 ++++++ .../armor/mixin/UTSlotArmorCuirassMixin.java | 27 ++++++ .../armor/mixin/UTSlotArmorGreavesMixin.java | 27 ++++++ .../armor/mixin/UTSlotArmorHelmMixin.java | 27 ++++++ .../mixin/UTTileEntityArmorStandMixin.java | 47 +++++++++++ .../mixins.mods.bibliocraft.armor.json | 10 +++ 10 files changed, 254 insertions(+) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTContainerArmorMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorBootsMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorCuirassMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorGreavesMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorHelmMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTTileEntityArmorStandMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.armor.json diff --git a/README.md b/README.md index e7a4feb3..a251aa2c 100644 --- a/README.md +++ b/README.md @@ -337,6 +337,7 @@ All changes are toggleable via config files. * **Witches' Oven Fix:** Fixes Witches' Oven consuming container fuel items * **Bibliocraft** * **Disable Version Check:** Fixes client-side memory leak by disabling version check + * **Fix Armor Stand Slots:** Fix BiblioCraft's custom Armor Stand using the incorrect slots for items or not recognizing the items as valid * **Fix Fancy Sign Rotation:** Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world * **Fix IItemHandler Method Not Existing:** Fix IItemHandler#getStackInSlot method not existing due to being obfuscated by IInventory, preventing countless errors * **Fix Item Transfer:** Make BiblioCraft actually use simulate properly when inserting and extracting items, fixing many item transfer methods diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 9dbd691e..702f6d30 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -458,6 +458,11 @@ public static class BiblioCraftCategory @Config.Comment("Fixes client-side memory leak by disabling version check") public boolean utDisableVersionCheckToggle = true; + @Config.RequiresMcRestart + @Config.Name("Fix Armor Stand Slots") + @Config.Comment("Fix BiblioCraft's custom Armor Stand using the incorrect slots for items or not recognizing the items as valid") + public boolean utArmorStandSlotFixToggle = true; + @Config.RequiresMcRestart @Config.Name("Fix Fancy Sign Rotation") @Config.Comment("Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world") diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index c4c9e4b8..06874bab 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -72,6 +72,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins.mods.astralsorcery.tool.json", () -> loaded("astralsorcery") && UTConfigMods.ASTRAL_SORCERY.utEmptyPropertiesZero); put("mixins.mods.backpack.json", () -> loaded("backpack") && UTConfigMods.BACKPACKS.utBPNoOffhandInteractionToggle); put("mixins.mods.bewitchment.json", () -> loaded("bewitchment") && UTConfigMods.BEWITCHMENT.utWitchesOvenFixToggle); + put("mixins.mods.bibliocraft.armor.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utArmorStandSlotFixToggle); put("mixins.mods.bibliocraft.handler.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utEnsureIItemHandlerMethodToggle); put("mixins.mods.bibliocraft.itemstack.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utCopyItemStackCorrectlyToggle); put("mixins.mods.bibliocraft.transfer.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utFixItemTransferToggle); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTContainerArmorMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTContainerArmorMixin.java new file mode 100644 index 00000000..dfa30a8a --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTContainerArmorMixin.java @@ -0,0 +1,82 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armor.mixin; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +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 jds.bibliocraft.containers.ContainerArmor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Slice; + +// Courtesy of WaitingIdly +@Mixin(value = ContainerArmor.class, remap = false) +public abstract class UTContainerArmorMixin +{ + /** + * @author WaitingIdly + * @reason Slots are ordered 0/1/2/3 as HEAD/CHEST/LEGS/FEET, BiblioCraft inverts that order in this location. + * This fixes inserting into the armor stand slots. + */ + @WrapOperation(method = "transferStackInSlot", at = @At(value = "INVOKE", target = "Ljds/bibliocraft/containers/ContainerArmor;mergeItemStack(Lnet/minecraft/item/ItemStack;IIZ)Z"), slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/inventory/EntityEquipmentSlot;FEET:Lnet/minecraft/inventory/EntityEquipmentSlot;"), to = @At(value = "CONSTANT", args = "classValue=net/minecraft/item/ItemSkull"))) + private boolean utEnsureArmorStandOrder(ContainerArmor instance, ItemStack stack, int startIndex, int endIndex, boolean reverseDirection, Operation original) + { + int start = startIndex <= 3 ? 3 - startIndex : startIndex; + return original.call(instance, stack, start, start + 1, reverseDirection); + } + + /** + * @author WaitingIdly + * @reason Slots are ordered 0/1/2/3 as HEAD/CHEST/LEGS/FEET for Vanilla, BiblioCraft has the incorrect order. + * This fixes shift-clicking from the player armor slots. + */ + @WrapOperation(method = "transferStackInSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/NonNullList;get(I)Ljava/lang/Object;"), slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/inventory/EntityEquipmentSlot;FEET:Lnet/minecraft/inventory/EntityEquipmentSlot;"), to = @At(value = "CONSTANT", args = "classValue=net/minecraft/item/ItemSkull"))) + private Object utEnsureArmorSlotOrder(NonNullList instance, int index, Operation original) + { + return original.call(instance, 3 - index); + } + + /** + * @author WaitingIdly + * @reason Skip the ItemArmor check. Requires {@link #utSkipItemArmorCast} and {@link #utAccessRealEquipmentSlot} + */ + @Definition(id = "ItemArmor", type = ItemArmor.class) + @Expression("? instanceof ItemArmor") + @ModifyExpressionValue(method = "transferStackInSlot", at = @At("MIXINEXTRAS:EXPRESSION")) + private boolean utSkipItemArmorCheck(boolean original) + { + return true; + } + + /** + * @author WaitingIdly + * @reason Skip the ItemArmor cast. Requires {@link #utSkipItemArmorCheck} and {@link #utAccessRealEquipmentSlot} + */ + @Definition(id = "ItemArmor", type = ItemArmor.class) + @Expression("(ItemArmor) ?") + @WrapOperation(method = "transferStackInSlot", at = @At("MIXINEXTRAS:EXPRESSION")) + private ItemArmor utSkipItemArmorCast(Object object, Operation original) + { + return null; + } + + /** + * @author WaitingIdly + * @reason Returns the real EntityEquipmentSlot for the item, using the forge method. + * Requires {@link #utSkipItemArmorCast} and {@link #utSkipItemArmorCheck}. + * Fixes slots not respecting the armor type of the stack and only allowing {@link ItemArmor}. + */ + @WrapOperation(method = "transferStackInSlot", at = @At(value = "FIELD", target = "Lnet/minecraft/item/ItemArmor;armorType:Lnet/minecraft/inventory/EntityEquipmentSlot;")) + private EntityEquipmentSlot utAccessRealEquipmentSlot(ItemArmor instance, Operation original, @Local(ordinal = 0) ItemStack stack) + { + return EntityLiving.getSlotForItemStack(stack); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorBootsMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorBootsMixin.java new file mode 100644 index 00000000..fa60505e --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorBootsMixin.java @@ -0,0 +1,27 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armor.mixin; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; + +import jds.bibliocraft.slots.SlotArmorBoots; +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.CallbackInfoReturnable; + +// Courtesy of WaitingIdly +@Mixin(value = SlotArmorBoots.class, remap = false) +public abstract class UTSlotArmorBootsMixin +{ + /** + * @author WaitingIdly + * @reason Make BiblioCraft use the forge method to determine + * if the itemstack is valid for the desired armor slot. + */ + @Inject(method = "isItemValid", at = @At("HEAD"), cancellable = true) + private void utEnsureValidity(ItemStack stack, CallbackInfoReturnable cir) + { + cir.setReturnValue(EntityEquipmentSlot.FEET == EntityLiving.getSlotForItemStack(stack)); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorCuirassMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorCuirassMixin.java new file mode 100644 index 00000000..c3595a6f --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorCuirassMixin.java @@ -0,0 +1,27 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armor.mixin; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; + +import jds.bibliocraft.slots.SlotArmorCuirass; +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.CallbackInfoReturnable; + +// Courtesy of WaitingIdly +@Mixin(value = SlotArmorCuirass.class, remap = false) +public abstract class UTSlotArmorCuirassMixin +{ + /** + * @author WaitingIdly + * @reason Make BiblioCraft use the forge method to determine + * if the itemstack is valid for the desired armor slot. + */ + @Inject(method = "isItemValid", at = @At("HEAD"), cancellable = true) + private void utEnsureValidity(ItemStack stack, CallbackInfoReturnable cir) + { + cir.setReturnValue(EntityEquipmentSlot.CHEST == EntityLiving.getSlotForItemStack(stack)); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorGreavesMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorGreavesMixin.java new file mode 100644 index 00000000..613f7aae --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorGreavesMixin.java @@ -0,0 +1,27 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armor.mixin; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; + +import jds.bibliocraft.slots.SlotArmorGreaves; +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.CallbackInfoReturnable; + +// Courtesy of WaitingIdly +@Mixin(value = SlotArmorGreaves.class, remap = false) +public abstract class UTSlotArmorGreavesMixin +{ + /** + * @author WaitingIdly + * @reason Make BiblioCraft use the forge method to determine + * if the itemstack is valid for the desired armor slot. + */ + @Inject(method = "isItemValid", at = @At("HEAD"), cancellable = true) + private void utEnsureValidity(ItemStack stack, CallbackInfoReturnable cir) + { + cir.setReturnValue(EntityEquipmentSlot.LEGS == EntityLiving.getSlotForItemStack(stack)); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorHelmMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorHelmMixin.java new file mode 100644 index 00000000..5b5cd59d --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTSlotArmorHelmMixin.java @@ -0,0 +1,27 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armor.mixin; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; + +import jds.bibliocraft.slots.SlotArmorHelm; +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.CallbackInfoReturnable; + +// Courtesy of WaitingIdly +@Mixin(value = SlotArmorHelm.class, remap = false) +public abstract class UTSlotArmorHelmMixin +{ + /** + * @author WaitingIdly + * @reason Make BiblioCraft use the forge method to determine + * if the itemstack is valid for the desired armor slot. + */ + @Inject(method = "isItemValid", at = @At("HEAD"), cancellable = true) + private void utEnsureValidity(ItemStack stack, CallbackInfoReturnable cir) + { + cir.setReturnValue(EntityEquipmentSlot.HEAD == EntityLiving.getSlotForItemStack(stack)); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTTileEntityArmorStandMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTTileEntityArmorStandMixin.java new file mode 100644 index 00000000..45ba9682 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armor/mixin/UTTileEntityArmorStandMixin.java @@ -0,0 +1,47 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armor.mixin; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; + +import jds.bibliocraft.tileentities.TileEntityArmorStand; +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.CallbackInfoReturnable; + +// Courtesy of WaitingIdly +@Mixin(value = TileEntityArmorStand.class, remap = false) +public abstract class UTTileEntityArmorStandMixin +{ + /** + * @author WaitingIdly + * @reason BiblioCraft incorrectly checks slot numbers, inverting the order of head to feet. + * It also fails to properly check the slot used for items, only allowing armor instead of + * using the forge method for anything that fits in the armor slot. + */ + @Inject(method = "isItemValidForSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getItem()Lnet/minecraft/item/Item;", ordinal = 0), cancellable = true) + private void utEnsureValidity(int slot, ItemStack itemstack, CallbackInfoReturnable cir) + { + if (slot == 0) + { + cir.setReturnValue(EntityEquipmentSlot.HEAD == EntityLiving.getSlotForItemStack(itemstack)); + } + else if (slot == 1) + { + cir.setReturnValue(EntityEquipmentSlot.CHEST == EntityLiving.getSlotForItemStack(itemstack)); + } + else if (slot == 2) + { + cir.setReturnValue(EntityEquipmentSlot.LEGS == EntityLiving.getSlotForItemStack(itemstack)); + } + else if (slot == 3) + { + cir.setReturnValue(EntityEquipmentSlot.FEET == EntityLiving.getSlotForItemStack(itemstack)); + } + else + { + cir.setReturnValue(false); + } + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.armor.json b/src/main/resources/mixins.mods.bibliocraft.armor.json new file mode 100644 index 00000000..74df54d6 --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.armor.json @@ -0,0 +1,10 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.armor.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixinextras": { + "minVersion": "0.5.0" + }, + "mixins": ["UTContainerArmorMixin", "UTSlotArmorBootsMixin", "UTSlotArmorCuirassMixin", "UTSlotArmorGreavesMixin", "UTSlotArmorHelmMixin", "UTTileEntityArmorStandMixin"] +} \ No newline at end of file From dd82fe93aa34eff0b400e742fe4055aa5bc9ed28 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Mon, 22 Dec 2025 01:27:31 -0800 Subject: [PATCH 09/13] Fix Armor Stand Binding --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 5 +++ .../universaltweaks/core/UTMixinLoader.java | 1 + .../mixin/UTBlockArmorStandMixin.java | 28 +++++++++++++++ .../mixin/UTSlotBindingFixMixin.java | 36 +++++++++++++++++++ .../mixins.mods.bibliocraft.armorbinding.json | 7 ++++ 6 files changed, 78 insertions(+) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTBlockArmorStandMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTSlotBindingFixMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.armorbinding.json diff --git a/README.md b/README.md index a251aa2c..e14d5e66 100644 --- a/README.md +++ b/README.md @@ -337,6 +337,7 @@ All changes are toggleable via config files. * **Witches' Oven Fix:** Fixes Witches' Oven consuming container fuel items * **Bibliocraft** * **Disable Version Check:** Fixes client-side memory leak by disabling version check + * **Fix Armor Stand Binding:** Fix BiblioCraft's custom Armor Stand not respecting the Curse of Binding * **Fix Armor Stand Slots:** Fix BiblioCraft's custom Armor Stand using the incorrect slots for items or not recognizing the items as valid * **Fix Fancy Sign Rotation:** Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world * **Fix IItemHandler Method Not Existing:** Fix IItemHandler#getStackInSlot method not existing due to being obfuscated by IInventory, preventing countless errors diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 702f6d30..02fa8aeb 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -463,6 +463,11 @@ public static class BiblioCraftCategory @Config.Comment("Fix BiblioCraft's custom Armor Stand using the incorrect slots for items or not recognizing the items as valid") public boolean utArmorStandSlotFixToggle = true; + @Config.RequiresMcRestart + @Config.Name("Fix Armor Stand Binding") + @Config.Comment("Fix BiblioCraft's custom Armor Stand not respecting the Curse of Binding") + public boolean utArmorStandBindingCurseToggle = true; + @Config.RequiresMcRestart @Config.Name("Fix Fancy Sign Rotation") @Config.Comment("Fix Fancy Signs rendering items and blocks in different ways between the GUI and in-world") diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index 06874bab..18f75710 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -73,6 +73,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins.mods.backpack.json", () -> loaded("backpack") && UTConfigMods.BACKPACKS.utBPNoOffhandInteractionToggle); put("mixins.mods.bewitchment.json", () -> loaded("bewitchment") && UTConfigMods.BEWITCHMENT.utWitchesOvenFixToggle); put("mixins.mods.bibliocraft.armor.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utArmorStandSlotFixToggle); + put("mixins.mods.bibliocraft.armorbinding.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utArmorStandBindingCurseToggle); put("mixins.mods.bibliocraft.handler.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utEnsureIItemHandlerMethodToggle); put("mixins.mods.bibliocraft.itemstack.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utCopyItemStackCorrectlyToggle); put("mixins.mods.bibliocraft.transfer.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utFixItemTransferToggle); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTBlockArmorStandMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTBlockArmorStandMixin.java new file mode 100644 index 00000000..746cdb8b --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTBlockArmorStandMixin.java @@ -0,0 +1,28 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armorbinding.mixin; + +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import com.llamalad7.mixinextras.sugar.Local; +import jds.bibliocraft.blocks.BlockArmorStand; +import jds.bibliocraft.tileentities.TileEntityArmorStand; +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; + +// Courtesy of WaitingIdly +@Mixin(value = BlockArmorStand.class, remap = false) +public abstract class UTBlockArmorStandMixin +{ + /** + * @author WaitingIdly + * @reason Prevent removal of Curse of Binding items from the player unless the player is in creative mode. + */ + @Inject(method = "handleArmorTransation", at = @At(value = "INVOKE", target = "Ljds/bibliocraft/tileentities/TileEntityArmorStand;getStackInSlot(I)Lnet/minecraft/item/ItemStack;"), cancellable = true) + private void utEnsureValidity(EntityPlayer player, TileEntityArmorStand armorTile, int armortype, CallbackInfo ci, @Local ItemStack playerArmor) + { + if (EnchantmentHelper.hasBindingCurse(playerArmor) && !player.isCreative()) ci.cancel(); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTSlotBindingFixMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTSlotBindingFixMixin.java new file mode 100644 index 00000000..3da5c633 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/armorbinding/mixin/UTSlotBindingFixMixin.java @@ -0,0 +1,36 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.armorbinding.mixin; + +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +import jds.bibliocraft.slots.SlotArmorBoots; +import jds.bibliocraft.slots.SlotArmorCuirass; +import jds.bibliocraft.slots.SlotArmorGreaves; +import jds.bibliocraft.slots.SlotArmorHelm; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Mixin; + +// Courtesy of WaitingIdly +@Mixin(value = {SlotArmorBoots.class, SlotArmorCuirass.class, SlotArmorGreaves.class, SlotArmorHelm.class}, remap = false) +public abstract class UTSlotBindingFixMixin extends Slot +{ + public UTSlotBindingFixMixin(IInventory inventoryIn, int index, int xPosition, int yPosition) + { + super(inventoryIn, index, xPosition, yPosition); + } + + /** + * @author WaitingIdly + * Ensure that the curse of binding logic is applied, applies same logic as the + * custom slots for armor in {@link net.minecraft.inventory.ContainerPlayer}. + */ + @Override + public boolean canTakeStack(@NotNull EntityPlayer playerIn) + { + ItemStack itemstack = this.getStack(); + return (itemstack.isEmpty() || playerIn.isCreative() || !EnchantmentHelper.hasBindingCurse(itemstack)) && super.canTakeStack(playerIn); + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.armorbinding.json b/src/main/resources/mixins.mods.bibliocraft.armorbinding.json new file mode 100644 index 00000000..dc4c9862 --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.armorbinding.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.armorbinding.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTBlockArmorStandMixin", "UTSlotBindingFixMixin"] +} \ No newline at end of file From 630714ffa0ebc2ef20457a25d461a0ded8a98669 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Mon, 22 Dec 2025 01:28:41 -0800 Subject: [PATCH 10/13] allow swapping in creative regardless of binding --- .../tweaks/misc/armorswap/mixin/UTItemArmorMixin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/mod/acgaming/universaltweaks/tweaks/misc/armorswap/mixin/UTItemArmorMixin.java b/src/main/java/mod/acgaming/universaltweaks/tweaks/misc/armorswap/mixin/UTItemArmorMixin.java index 90952b39..1a159915 100644 --- a/src/main/java/mod/acgaming/universaltweaks/tweaks/misc/armorswap/mixin/UTItemArmorMixin.java +++ b/src/main/java/mod/acgaming/universaltweaks/tweaks/misc/armorswap/mixin/UTItemArmorMixin.java @@ -1,6 +1,7 @@ package mod.acgaming.universaltweaks.tweaks.misc.armorswap.mixin; import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemElytra; import net.minecraft.item.ItemStack; @@ -22,9 +23,9 @@ public class UTItemArmorMixin * @author WaitingIdly */ @WrapOperation(method = "onItemRightClick", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isEmpty()Z")) - private boolean utCheckNotBindingCurse(ItemStack stack, Operation original) + private boolean utCheckNotBindingCurse(ItemStack stack, Operation original, @Local(argsOnly = true) EntityPlayer playerIn) { - return !EnchantmentHelper.hasBindingCurse(stack); + return playerIn.isCreative() || !EnchantmentHelper.hasBindingCurse(stack); } /** From 96c0404306a7b1c44bd49d8b54e6cb7d623fb44c Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Mon, 22 Dec 2025 03:54:43 -0800 Subject: [PATCH 11/13] Allow Any Black Dye for Printing Press --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 5 ++ .../universaltweaks/core/UTMixinLoader.java | 1 + .../mixin/UTTileEntityPrintPressMixin.java | 58 +++++++++++++++++++ .../mixins.mods.bibliocraft.printpress.json | 10 ++++ 5 files changed, 75 insertions(+) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/printpress/mixin/UTTileEntityPrintPressMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.printpress.json diff --git a/README.md b/README.md index e14d5e66..5040308e 100644 --- a/README.md +++ b/README.md @@ -336,6 +336,7 @@ All changes are toggleable via config files. * **Bewitchment** * **Witches' Oven Fix:** Fixes Witches' Oven consuming container fuel items * **Bibliocraft** + * **Allow Any Black Dye for Printing Press:** Allow the Printing Press to properly work with any itemstack with the dyeBlack oredict, instead of only processing with Ink Sacs * **Disable Version Check:** Fixes client-side memory leak by disabling version check * **Fix Armor Stand Binding:** Fix BiblioCraft's custom Armor Stand not respecting the Curse of Binding * **Fix Armor Stand Slots:** Fix BiblioCraft's custom Armor Stand using the incorrect slots for items or not recognizing the items as valid diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 02fa8aeb..8f2d71b5 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -453,6 +453,11 @@ public static class BewitchmentCategory public static class BiblioCraftCategory { + @Config.RequiresMcRestart + @Config.Name("Allow Any Black Dye for Printing Press") + @Config.Comment("Allow the Printing Press to properly work with any itemstack with the dyeBlack oredict, instead of only processing with Ink Sacs") + public boolean utPrintingPressAnyBlackDyeToggle = true; + @Config.RequiresMcRestart @Config.Name("Disable Version Check") @Config.Comment("Fixes client-side memory leak by disabling version check") diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index 18f75710..511b516a 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -76,6 +76,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins.mods.bibliocraft.armorbinding.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utArmorStandBindingCurseToggle); put("mixins.mods.bibliocraft.handler.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utEnsureIItemHandlerMethodToggle); put("mixins.mods.bibliocraft.itemstack.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utCopyItemStackCorrectlyToggle); + put("mixins.mods.bibliocraft.printpress.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utPrintingPressAnyBlackDyeToggle); put("mixins.mods.bibliocraft.transfer.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utFixItemTransferToggle); put("mixins.mods.biomesoplenty.json", () -> loaded("biomesoplenty")); put("mixins.mods.biomesoplenty.sealevel.json", () -> loaded("biomesoplenty") && UTConfigTweaks.WORLD.utSeaLevel != 63); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/printpress/mixin/UTTileEntityPrintPressMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/printpress/mixin/UTTileEntityPrintPressMixin.java new file mode 100644 index 00000000..f89a25af --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/printpress/mixin/UTTileEntityPrintPressMixin.java @@ -0,0 +1,58 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.printpress.mixin; + +import net.minecraft.item.ItemDye; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.oredict.OreIngredient; + +import com.llamalad7.mixinextras.expression.Definition; +import com.llamalad7.mixinextras.expression.Expression; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import jds.bibliocraft.tileentities.TileEntityPrintPress; +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.CallbackInfoReturnable; + +// Courtesy of WaitingIdly +@Mixin(value = TileEntityPrintPress.class, remap = false) +public abstract class UTTileEntityPrintPressMixin +{ + @Unique + private static final Ingredient ut$INK_INGREDIENT = new OreIngredient("dyeBlack"); + + /** + * @author WaitingIdly + * @reason Get the proper "burn time" for the ink item. + */ + @Definition(id = "ItemDye", type = ItemDye.class) + @Expression("? instanceof ItemDye") + @ModifyExpressionValue(method = "getItemBurnTime", at = @At("MIXINEXTRAS:EXPRESSION")) + private static boolean utAnyInk(boolean original, @Local(argsOnly = true) ItemStack stack) + { + return ut$INK_INGREDIENT.apply(stack); + } + + /** + * @author WaitingIdly + * @reason Allow inserting any valid ink Ingredient to slot 0, not just ink sacs. + */ + @Inject(method = "canInsertItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getItem()Lnet/minecraft/item/Item;"), cancellable = true, remap = true) + private void utInsertAnyInk(int slot, ItemStack itemstack, EnumFacing side, CallbackInfoReturnable cir) + { + if (slot == 0 && ut$INK_INGREDIENT.apply(itemstack)) cir.setReturnValue(true); + } + + /** + * @author WaitingIdly + * @reason Replace the check in isInk with a check to the Ingredient. + */ + @Inject(method = "isInk", at = @At("HEAD"), cancellable = true) + private void utIngredientIsInk(ItemStack stack, CallbackInfoReturnable cir) + { + cir.setReturnValue(ut$INK_INGREDIENT.apply(stack)); + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.printpress.json b/src/main/resources/mixins.mods.bibliocraft.printpress.json new file mode 100644 index 00000000..ef5558a8 --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.printpress.json @@ -0,0 +1,10 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.printpress.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixinextras": { + "minVersion": "0.5.0" + }, + "mixins": ["UTTileEntityPrintPressMixin"] +} \ No newline at end of file From 11ea2d3be9aaf8c1f0bc7e127eabfc9eaa484ae8 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Mon, 22 Dec 2025 04:49:58 -0800 Subject: [PATCH 12/13] Fix Using Incorrect Hand --- README.md | 1 + .../universaltweaks/config/UTConfigMods.java | 5 +++ .../universaltweaks/core/UTMixinLoader.java | 3 +- .../hand/mixin/UTItemClipboardMixin.java | 42 +++++++++++++++++++ .../mixin/UTItemStockroomCatalogMixin.java | 37 ++++++++++++++++ .../mixins.mods.bibliocraft.hand.json | 7 ++++ 6 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemClipboardMixin.java create mode 100644 src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemStockroomCatalogMixin.java create mode 100644 src/main/resources/mixins.mods.bibliocraft.hand.json diff --git a/README.md b/README.md index 5040308e..6e6f75f5 100644 --- a/README.md +++ b/README.md @@ -345,6 +345,7 @@ All changes are toggleable via config files. * **Fix Item Transfer:** Make BiblioCraft actually use simulate properly when inserting and extracting items, fixing many item transfer methods * **Fix ItemStack Copying:** Fixes removing an ItemStack not copying all data correctly, particularly for backpacks * **Fix Left Handed Rendering:** Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left + * **Fix Using Incorrect Hand:** Fix the Clipboard and the Stockroom Catalogue behaving incorrectly when used in the offhand * **Multiplayer Sound Fix:** Register all sounds, fixing bugs when attempting to play them on servers * **Binnie's Mods** * **Gather Windfall:** Allows Forestry farms to pick up ExtraTrees fruit diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index 8f2d71b5..09c75700 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -483,6 +483,11 @@ public static class BiblioCraftCategory @Config.Comment("Fixes the Antique Atlas and Clipboard rendering incorrect when the Main Hand is set to Left") public boolean utSwapDisplayHandWhenLeftHanded = true; + @Config.RequiresMcRestart + @Config.Name("Fix Using Incorrect Hand") + @Config.Comment("Fix the Clipboard and the Stockroom Catalogue behaving incorrectly when used in the offhand") + public boolean utFixHandConsumption = true; + @Config.RequiresMcRestart @Config.Name("Fix IItemHandler Method Not Existing") @Config.Comment diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index 511b516a..703b257a 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -32,9 +32,9 @@ public class UTMixinLoader implements ILateMixinLoader if (UTConfigGeneral.MASTER_SWITCHES.utMasterSwitchModIntegration) { put("mixins.mods.actuallyadditions.itemparticle.json", () -> loaded("actuallyadditions") && UTConfigMods.ACTUALLY_ADDITIONS.utItemLaserParticlesGraphics > -1); - put("mixins.mods.bibliocraft.version.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utDisableVersionCheckToggle); put("mixins.mods.bibliocraft.lefthand.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utSwapDisplayHandWhenLeftHanded); put("mixins.mods.bibliocraft.sign.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utFancySignRotationToggle); + put("mixins.mods.bibliocraft.version.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utDisableVersionCheckToggle); put("mixins.mods.cbmultipart.client.json", () -> loaded("forgemultipartcbe") && UTConfigMods.CB_MULTIPART.utMemoryLeakFixToggle); put("mixins.mods.compactmachines.memory.json", () -> loaded("compactmachines3") && UTConfigMods.COMPACT_MACHINES.utMemoryLeakFixToggle); put("mixins.mods.compactmachines.render.json", () -> loaded("compactmachines3") && UTConfigMods.COMPACT_MACHINES.utCMRenderFixToggle); @@ -74,6 +74,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins.mods.bewitchment.json", () -> loaded("bewitchment") && UTConfigMods.BEWITCHMENT.utWitchesOvenFixToggle); put("mixins.mods.bibliocraft.armor.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utArmorStandSlotFixToggle); put("mixins.mods.bibliocraft.armorbinding.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utArmorStandBindingCurseToggle); + put("mixins.mods.bibliocraft.hand.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utFixHandConsumption); put("mixins.mods.bibliocraft.handler.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utEnsureIItemHandlerMethodToggle); put("mixins.mods.bibliocraft.itemstack.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utCopyItemStackCorrectlyToggle); put("mixins.mods.bibliocraft.printpress.json", () -> loaded("bibliocraft") && UTConfigMods.BIBLIOCRAFT.utPrintingPressAnyBlackDyeToggle); diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemClipboardMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemClipboardMixin.java new file mode 100644 index 00000000..54d67262 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemClipboardMixin.java @@ -0,0 +1,42 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.hand.mixin; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; + +import com.llamalad7.mixinextras.sugar.Local; +import jds.bibliocraft.items.ItemClipboard; +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.Redirect; + +// Courtesy of WaitingIdly +@Mixin(value = ItemClipboard.class, remap = false) +public abstract class UTItemClipboardMixin +{ + @Unique + private EnumHand universalTweaks$handHolder = EnumHand.MAIN_HAND; + + /** + * @author WaitingIdly + * @reason Get the held item in the hand being used to support offhand use + */ + @Redirect(method = "onItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/EntityPlayer;getHeldItemMainhand()Lnet/minecraft/item/ItemStack;"), remap = true) + private ItemStack utGetActiveHand(EntityPlayer instance, @Local(argsOnly = true) EnumHand hand) + { + universalTweaks$handHolder = hand; + return instance.getHeldItem(hand); + } + + /** + * @author WaitingIdly + * @reason Replace the held item in the hand being used to support offhand use + */ + @Redirect(method = "setClipboardBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/InventoryPlayer;setInventorySlotContents(ILnet/minecraft/item/ItemStack;)V"), remap = true) + private void utReplaceActiveHand(InventoryPlayer instance, int index, ItemStack stack, @Local(argsOnly = true) EntityPlayer player) + { + player.setHeldItem(universalTweaks$handHolder, stack); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemStockroomCatalogMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemStockroomCatalogMixin.java new file mode 100644 index 00000000..fe100e91 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/bibliocraft/hand/mixin/UTItemStockroomCatalogMixin.java @@ -0,0 +1,37 @@ +package mod.acgaming.universaltweaks.mods.bibliocraft.hand.mixin; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; + +import com.llamalad7.mixinextras.sugar.Local; +import jds.bibliocraft.items.ItemStockroomCatalog; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +// Courtesy of WaitingIdly +@Mixin(value = ItemStockroomCatalog.class, remap = false) +public abstract class UTItemStockroomCatalogMixin +{ + /** + * @author WaitingIdly + * @reason Get the held item in the hand being used to support offhand use + */ + @Redirect(method = "onItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/EntityPlayer;getHeldItemMainhand()Lnet/minecraft/item/ItemStack;"), remap = true) + private ItemStack utGetActiveHand(EntityPlayer instance, @Local(argsOnly = true) EnumHand hand) + { + return instance.getHeldItem(hand); + } + + /** + * @author WaitingIdly + * @reason Replace the held item in the hand being used to support offhand use + */ + @Redirect(method = "onItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/InventoryPlayer;setInventorySlotContents(ILnet/minecraft/item/ItemStack;)V"), remap = true) + private void utReplaceActiveHand(InventoryPlayer instance, int index, ItemStack stack, @Local(argsOnly = true) EntityPlayer player, @Local(argsOnly = true) EnumHand hand) + { + player.setHeldItem(hand, stack); + } +} diff --git a/src/main/resources/mixins.mods.bibliocraft.hand.json b/src/main/resources/mixins.mods.bibliocraft.hand.json new file mode 100644 index 00000000..e8c8250a --- /dev/null +++ b/src/main/resources/mixins.mods.bibliocraft.hand.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.bibliocraft.hand.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTItemClipboardMixin", "UTItemStockroomCatalogMixin"] +} \ No newline at end of file From 1e710488bbc82cc94afaa4cc948021c4b9e72ff2 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Mon, 22 Dec 2025 05:33:29 -0800 Subject: [PATCH 13/13] make accessors only apply if mod integration is enabled --- .../mod/acgaming/universaltweaks/core/UTLoadingPlugin.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java b/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java index 10b980c5..2cb44abe 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTLoadingPlugin.java @@ -44,7 +44,10 @@ public class UTLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader private static final Map commonMixinConfigs = ImmutableMap.copyOf(new HashMap() { { - put("mixins.vanilla.mod.accessors.json", () -> true); + if (UTConfigGeneral.MASTER_SWITCHES.utMasterSwitchModIntegration) + { + put("mixins.vanilla.mod.accessors.json", () -> true); + } if (UTConfigGeneral.MASTER_SWITCHES.utMasterSwitchBugfixes) {