bytecode moment (fix #249)

This commit is contained in:
YuRaNnNzZZ 2023-05-07 17:09:58 +03:00
parent 0098302f39
commit be43c59a2d
Signed by: YuRaNnNzZZ
GPG Key ID: 5F71738C85A6006D
3 changed files with 31 additions and 69 deletions

View File

@ -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;
}
}

View File

@ -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',

View File

@ -15,6 +15,7 @@
"MixinPlayer"
],
"client": [
"MixinGameRenderer"
"MixinGameRenderer",
"MixinMinecraft"
]
}