From 2f59edd606e87470392ec8b533d056d00fd8a191 Mon Sep 17 00:00:00 2001 From: YuRaNnNzZZ Date: Wed, 28 Jun 2023 15:40:33 +0300 Subject: [PATCH] =?UTF-8?q?=D1=87=D1=83=D0=B4=D0=B5=D1=81=D0=B0=20ASM=20?= =?UTF-8?q?=D0=B8=20=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=D0=BA=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=BF=D0=BE=D1=82=D0=B5=D1=80=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=81=D1=83=D0=B4=D0=BA=D0=B0=20#193?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/otm/OverdriveThatMatters.java | 4 +- .../mc/otm/compat/mekanism/MekanismHooks.kt | 49 ++++++++++++ .../mc/otm/compat/mekanism/Tooltips.kt | 20 ----- src/main/resources/coremods/code_injector.js | 75 +++++++++++++++++++ 4 files changed, 126 insertions(+), 22 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/MekanismHooks.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 1eaa1daa5..236a26062 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -36,8 +36,8 @@ import ru.dbotthepony.mc.otm.client.render.blockentity.BatteryBankRenderer; import ru.dbotthepony.mc.otm.client.render.blockentity.MatterBatteryBankRenderer; import ru.dbotthepony.mc.otm.compat.adastra.AdAstraCompatKt; import ru.dbotthepony.mc.otm.compat.curios.CuriosCompatKt; +import ru.dbotthepony.mc.otm.compat.mekanism.MekanismHooks; import ru.dbotthepony.mc.otm.compat.mekanism.QIOKt; -import ru.dbotthepony.mc.otm.compat.mekanism.TooltipsKt; import ru.dbotthepony.mc.otm.config.AndroidConfig; import ru.dbotthepony.mc.otm.config.ClientConfig; import ru.dbotthepony.mc.otm.config.ItemsConfig; @@ -244,7 +244,7 @@ public final class OverdriveThatMatters { EVENT_BUS.addListener(EventPriority.NORMAL, QuantumBatteryItem.Companion::clientDisconnect); if (ModList.get().isLoaded("mekanism")) { - EVENT_BUS.addListener(EventPriority.NORMAL, TooltipsKt::tooltipEvent); + EVENT_BUS.addListener(EventPriority.NORMAL, MekanismHooks::tooltipEvent); } EVENT_BUS.addListener(EventPriority.NORMAL, AndroidMenuKeyMapping.INSTANCE::onRenderGuiEvent); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/MekanismHooks.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/MekanismHooks.kt new file mode 100644 index 000000000..05741dcc6 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/MekanismHooks.kt @@ -0,0 +1,49 @@ +package ru.dbotthepony.mc.otm.compat.mekanism + +import mekanism.api.Action +import mekanism.api.AutomationType +import mekanism.common.capabilities.energy.MachineEnergyContainer +import mekanism.common.registries.MekanismItems +import mekanism.common.tile.TileEntityChargepad +import net.minecraft.ChatFormatting +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.player.Player +import net.minecraftforge.event.entity.player.ItemTooltipEvent +import ru.dbotthepony.mc.otm.capability.isMekanismLoaded +import ru.dbotthepony.mc.otm.capability.matteryPlayer +import ru.dbotthepony.mc.otm.core.TranslatableComponent + +object MekanismHooks { + @JvmStatic + fun chargeAndroidFromPadHook(container: MachineEnergyContainer, entity: LivingEntity) { + if (entity !is Player) return + + if (entity.matteryPlayer?.isAndroid == true) { + val androidEnergy = entity.matteryPlayer!!.androidEnergy + + val expectedAmount = container.energyPerTick + val remaining = androidEnergy.receiveEnergy(expectedAmount.toDecimal(), true).toFloatingLong() + + if (remaining.smallerThan(expectedAmount)) { + val extracted = container.extract(expectedAmount.subtract(remaining), Action.EXECUTE, AutomationType.INTERNAL) + + if (!extracted.isZero) { + androidEnergy.receiveEnergy(extracted.toDecimal(), false) + } + } + } + } + + private val BLACKHOLE_IMMUNITY = TranslatableComponent("otm.item.blackhole_immunity").withStyle(ChatFormatting.DARK_GRAY) + + @JvmStatic + fun tooltipEvent(event: ItemTooltipEvent) { + if (!isMekanismLoaded) { + throw IllegalStateException("Mekanism is not loaded!") + } + + if (event.itemStack.`is`(MekanismItems.MODULE_GRAVITATIONAL_MODULATING.get())) { + event.toolTip.add(BLACKHOLE_IMMUNITY) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt deleted file mode 100644 index 41bb89455..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt +++ /dev/null @@ -1,20 +0,0 @@ -package ru.dbotthepony.mc.otm.compat.mekanism - -import mekanism.common.registries.MekanismItems -import net.minecraft.ChatFormatting -import net.minecraftforge.event.entity.player.ItemTooltipEvent -import net.minecraftforge.eventbus.api.SubscribeEvent -import ru.dbotthepony.mc.otm.core.TranslatableComponent -import ru.dbotthepony.mc.otm.capability.isMekanismLoaded - -private val BLACKHOLE_IMMUNITY = TranslatableComponent("otm.item.blackhole_immunity").withStyle(ChatFormatting.DARK_GRAY) - -fun tooltipEvent(event: ItemTooltipEvent) { - if (!isMekanismLoaded) { - throw IllegalStateException("Mekanism is not loaded!") - } - - if (event.itemStack.`is`(MekanismItems.MODULE_GRAVITATIONAL_MODULATING.get())) { - event.toolTip.add(BLACKHOLE_IMMUNITY) - } -} diff --git a/src/main/resources/coremods/code_injector.js b/src/main/resources/coremods/code_injector.js index e1c5310d5..d556eb438 100644 --- a/src/main/resources/coremods/code_injector.js +++ b/src/main/resources/coremods/code_injector.js @@ -2,6 +2,7 @@ var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI') var AbstractInsnNode = Java.type('org.objectweb.asm.tree.AbstractInsnNode') var Opcodes = Java.type('org.objectweb.asm.Opcodes') +var FieldInsnNode = Java.type('org.objectweb.asm.tree.FieldInsnNode') var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode') var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode') var JumpInsnNode = Java.type('org.objectweb.asm.tree.JumpInsnNode') @@ -727,6 +728,80 @@ function initializeCoreMod() { } } + return node + } + }, + + 'Mekanism Chargepad Android Charge': { + 'target': { + 'type': 'METHOD', + 'class': 'mekanism.common.tile.TileEntityChargepad', + 'methodName': 'onUpdateServer', + 'methodDesc': '()V' + }, + + 'transformer': function(node) { + var skipLabel = new Label() + var skipLabelNode = new LabelNode(skipLabel) + + var labelIteratorEndNode + + for (i = 0; i < node.instructions.size(); i++) { + var insn = node.instructions.get(i) + + if (insn && insn.getOpcode() == opcodesRemapped.getfield && insn.name == 'CuriosLoaded') { + var nextInsn = node.instructions.get(i + 1) // IFEQ + + labelIteratorEndNode = nextInsn.label + + break + } + } + + if (!labelIteratorEndNode) return node + + for (i = 0; i < node.instructions.size(); i++) { + var insn = node.instructions.get(i) + + if (insn && insn.getType() == AbstractInsnNode.LABEL) { + if (insn == labelIteratorEndNode) { + putInstructions(node, insn, [ + new VarInsnNode(opcodesRemapped.aload, 0), + new FieldInsnNode( + opcodesRemapped.getfield, + 'mekanism/common/tile/TileEntityChargepad', + 'energyContainer', + 'Lmekanism/common/capabilities/energy/MachineEnergyContainer;' + ), + new VarInsnNode(opcodesRemapped.aload, 4), + new MethodInsnNode( + opcodesRemapped.invokestatic, + 'ru/dbotthepony/mc/otm/compat/mekanism/MekanismHooks', + 'chargeAndroidFromPadHook', + '(Lmekanism/common/capabilities/energy/MachineEnergyContainer;Lnet/minecraft/world/entity/LivingEntity;)V' + ), + skipLabelNode + ]) + + break + } + } + } + + for (i = 0; i < node.instructions.size(); i++) { + var insn = node.instructions.get(i) + + if (insn && insn.getOpcode() == opcodesRemapped.invokevirtual && insn.name == 'chargeHandler' && insn.desc == '(Ljava/util/Optional;)Z') { + var nextInsn = node.instructions.get(i + 1) // curios call is POP, pre-curios check call is IFNE; both need to redirect to loop skip label + + if (nextInsn && (nextInsn.getOpcode() == opcodesRemapped.pop || nextInsn.getOpcode() == opcodesRemapped.ifne && nextInsn.label == labelIteratorEndNode)) { + node.instructions.set(nextInsn, new JumpInsnNode(opcodesRemapped.ifne, skipLabelNode)) + + continue + } + } + } + return node } }