From be43c59a2d8c6378b2344702e4aef1bacdc3ddfe Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Sun, 7 May 2023 17:09:58 +0300 Subject: [PATCH] bytecode moment (fix #249) --- .../mc/otm/mixin/MixinMinecraft.java | 29 ++++++++ src/main/resources/coremods/code_injector.js | 68 ------------------- .../overdrive_that_matters.mixins.json | 3 +- 3 files changed, 31 insertions(+), 69 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/mixin/MixinMinecraft.java diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinMinecraft.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinMinecraft.java new file mode 100644 index 000000000..bbf7892bd --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinMinecraft.java @@ -0,0 +1,29 @@ +package ru.dbotthepony.mc.otm.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability; + +@Mixin(Minecraft.class) +public class MixinMinecraft { + @Redirect( + method = "pickBlock()V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/entity/player/Inventory;findSlotMatchingItem(Lnet/minecraft/world/item/ItemStack;)I" + ) + ) + private int pickBlock(Inventory inventory, ItemStack itemStack) { + int i = inventory.findSlotMatchingItem(itemStack); + + MatteryPlayerCapability.pickBlockHook(i, itemStack); + + return i; + } +} diff --git a/src/main/resources/coremods/code_injector.js b/src/main/resources/coremods/code_injector.js index 77b59d722..e1c5310d5 100644 --- a/src/main/resources/coremods/code_injector.js +++ b/src/main/resources/coremods/code_injector.js @@ -681,74 +681,6 @@ function initializeCoreMod() { 'transformer': patchBlendFunc }, - 'Minecraft#pickBlock patch for exosuit': - method('net.minecraft.client.Minecraft.m_91280_()V', function(node) { - // 275: invokevirtual #7672 // Method net/minecraft/world/entity/Entity.getType:()Lnet/minecraft/world/entity/EntityType; - // 278: invokevirtual #7667 // Method net/minecraft/core/DefaultedRegistry.getKey:(Ljava/lang/Object;)Lnet/minecraft/resources/ResourceLocation; - // 281: invokevirtual #4475 // Method net/minecraft/resources/ResourceLocation.toString:()Ljava/lang/String; - // 284: astore 5 - // 286: getstatic #5986 // Field LOGGER:Lorg/slf4j/Logger; - // 289: ldc_w #4484 // String Picking on: [{}] {} gave null item - // 292: aload_3 - // 293: aload 5 - // 295: invokeinterface #3145, 4 // InterfaceMethod org/slf4j/Logger.warn:(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V - // 300: goto 405 - // 303: aload_0 - // 304: getfield #6654 // Field player:Lnet/minecraft/client/player/LocalPlayer; - // 307: invokevirtual #7409 // Method net/minecraft/client/player/LocalPlayer.getInventory:()Lnet/minecraft/world/entity/player/Inventory; - // 310: astore 5 - // 312: aload_2 - // 313: ifnull 324 - // 316: aload_0 - // 317: aload 4 - // 319: aload_2 - // 320: invokevirtual #7675 // Method addCustomNbtData:(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/block/entity/BlockEntity;)Lnet/minecraft/world/item/ItemStack; - // 323: pop - // 324: aload 5 - // 326: aload 4 - // 328: invokevirtual #7678 // Method net/minecraft/world/entity/player/Inventory.findSlotMatchingItem:(Lnet/minecraft/world/item/ItemStack;)I - // 331: istore 6 - // <-- Our target - // 333: iload_1 - // 334: ifeq 372 - // 337: aload 5 - // 339: aload 4 - // 341: invokevirtual #7681 // Method net/minecraft/world/entity/player/Inventory.setPickedItem:(Lnet/minecraft/world/item/ItemStack;)V - // 344: aload_0 - - for (var i = 0; i < node.instructions.size(); i++) { - var determinedOffset = test([ - opcodesRemapped.aload, - opcodesRemapped.getfield, - opcodesRemapped.invokevirtual, - opcodesRemapped.astore, - opcodesRemapped.aload, - opcodesRemapped.ifnull, - opcodesRemapped.aload, - opcodesRemapped.aload, - opcodesRemapped.aload, - opcodesRemapped.invokevirtual, - opcodesRemapped.pop, - opcodesRemapped.aload, - opcodesRemapped.aload, - opcodesRemapped.invokevirtual, - opcodesRemapped.istore, - ], node.instructions, i) - - if (determinedOffset != -1) { - putInstructions(node, node.instructions.get(determinedOffset), [ - new VarInsnNode(opcodesRemapped.iload, backtrack(node.instructions, determinedOffset, opcodesRemapped.istore, 0)['var']), - new VarInsnNode(opcodesRemapped.aload, backtrack(node.instructions, determinedOffset, opcodesRemapped.aload, 0)['var']), - new MethodInsnNode(opcodesRemapped.invokestatic, 'ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability', 'pickBlockHook', '(ILnet/minecraft/world/item/ItemStack;)V', false) - ]) - - break - } - } - - return node - }), - 'LevelRenderer DynamicBufferSource callback': { 'target': { 'type': 'METHOD', diff --git a/src/main/resources/overdrive_that_matters.mixins.json b/src/main/resources/overdrive_that_matters.mixins.json index 42c121a52..626eb012c 100644 --- a/src/main/resources/overdrive_that_matters.mixins.json +++ b/src/main/resources/overdrive_that_matters.mixins.json @@ -15,6 +15,7 @@ "MixinPlayer" ], "client": [ - "MixinGameRenderer" + "MixinGameRenderer", + "MixinMinecraft" ] }