чудеса ASM и многократной потери рассудка #193
This commit is contained in:
parent
fced3058d5
commit
2f59edd606
@ -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.client.render.blockentity.MatterBatteryBankRenderer;
|
||||||
import ru.dbotthepony.mc.otm.compat.adastra.AdAstraCompatKt;
|
import ru.dbotthepony.mc.otm.compat.adastra.AdAstraCompatKt;
|
||||||
import ru.dbotthepony.mc.otm.compat.curios.CuriosCompatKt;
|
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.QIOKt;
|
||||||
import ru.dbotthepony.mc.otm.compat.mekanism.TooltipsKt;
|
|
||||||
import ru.dbotthepony.mc.otm.config.AndroidConfig;
|
import ru.dbotthepony.mc.otm.config.AndroidConfig;
|
||||||
import ru.dbotthepony.mc.otm.config.ClientConfig;
|
import ru.dbotthepony.mc.otm.config.ClientConfig;
|
||||||
import ru.dbotthepony.mc.otm.config.ItemsConfig;
|
import ru.dbotthepony.mc.otm.config.ItemsConfig;
|
||||||
@ -244,7 +244,7 @@ public final class OverdriveThatMatters {
|
|||||||
EVENT_BUS.addListener(EventPriority.NORMAL, QuantumBatteryItem.Companion::clientDisconnect);
|
EVENT_BUS.addListener(EventPriority.NORMAL, QuantumBatteryItem.Companion::clientDisconnect);
|
||||||
|
|
||||||
if (ModList.get().isLoaded("mekanism")) {
|
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);
|
EVENT_BUS.addListener(EventPriority.NORMAL, AndroidMenuKeyMapping.INSTANCE::onRenderGuiEvent);
|
||||||
|
@ -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<TileEntityChargepad>, 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
@ -2,6 +2,7 @@
|
|||||||
var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI')
|
var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI')
|
||||||
var AbstractInsnNode = Java.type('org.objectweb.asm.tree.AbstractInsnNode')
|
var AbstractInsnNode = Java.type('org.objectweb.asm.tree.AbstractInsnNode')
|
||||||
var Opcodes = Java.type('org.objectweb.asm.Opcodes')
|
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 VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode')
|
||||||
var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode')
|
var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode')
|
||||||
var JumpInsnNode = Java.type('org.objectweb.asm.tree.JumpInsnNode')
|
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
|
return node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user