diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt index 6dfc9f6ef..c2e1a2448 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt @@ -163,7 +163,8 @@ fun addResearchData(serializer: Consumer, lang: MatteryLang TranslatableComponent( "android_research.overdrive_that_matters.limb_overclocking.description", (i + 1) * 8, - (i + 1) * 6 + (i + 1) * 6, + (i + 1) * 20 ) ) .addItem(MItemTags.COPPER_WIRES, 4 + i * 2) @@ -426,8 +427,8 @@ fun addResearchData(serializer: Consumer, lang: MatteryLang russian("Разгон конечностей %s") } - add(limbList[0], "description", "Boosts mobility by %s%% and attack speed by %s%%") { - russian("Увеличивает мобильность на %s%% и скорость атак на %s%%") + add(limbList[0], "description", "Boosts mobility by %s%%, attack speed by %s%% and brushing speed by %s%%") { + russian("Увеличивает мобильность на %s%%, скорость атак на %s%% и скорость чистки блоков на %s%%") } add(AIR_BAGS, "Air Bags") { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/LimbOverclockingFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/LimbOverclockingFeature.kt index a8653abf3..8cc4a134a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/LimbOverclockingFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/LimbOverclockingFeature.kt @@ -1,9 +1,12 @@ package ru.dbotthepony.mc.otm.android.feature +import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.ai.attributes.AttributeModifier import net.minecraft.world.entity.ai.attributes.Attributes +import net.minecraft.world.entity.player.Player import ru.dbotthepony.mc.otm.android.AndroidFeature import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability +import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.registry.AndroidFeatures import java.util.* @@ -31,5 +34,34 @@ class LimbOverclockingFeature(android: MatteryPlayerCapability) : AndroidFeature companion object { private val MODIFIER_ID = UUID.fromString("4a3fae46-e57b-4e20-857d-f5c2b2c8f2f2") + + @JvmStatic + fun getBrushCooldown(entity: LivingEntity): Int { + if (entity !is Player) return 10 + val matteryPlayer = entity.matteryPlayer ?: return 10 + if (!matteryPlayer.isAndroid || !matteryPlayer.hasFeature(AndroidFeatures.LIMB_OVERCLOCKING)) return 10 + + val level = matteryPlayer.getFeature(AndroidFeatures.LIMB_OVERCLOCKING)!!.level + 1 + return (10 - level * 2).coerceAtLeast(2) + } + + @JvmStatic + fun getBrushTick(entity: LivingEntity): Int { + if (entity !is Player) return 5 + val matteryPlayer = entity.matteryPlayer ?: return 5 + if (!matteryPlayer.isAndroid || !matteryPlayer.hasFeature(AndroidFeatures.LIMB_OVERCLOCKING)) return 5 + + val level = matteryPlayer.getFeature(AndroidFeatures.LIMB_OVERCLOCKING)!!.level + 1 + return (5 - level).coerceAtLeast(1) + } + + @JvmStatic + fun getBrushableBlockCooldown(player: Player): Long { + val matteryPlayer = player.matteryPlayer ?: return 10L + if (!matteryPlayer.isAndroid || !matteryPlayer.hasFeature(AndroidFeatures.LIMB_OVERCLOCKING)) return 10L + + val level = matteryPlayer.getFeature(AndroidFeatures.LIMB_OVERCLOCKING)!!.level + 1 + return (10L - level * 2L).coerceAtLeast(2L) + } } } diff --git a/src/main/resources/META-INF/coremods.json b/src/main/resources/META-INF/coremods.json index 5ce1ea71b..677dde2cf 100644 --- a/src/main/resources/META-INF/coremods.json +++ b/src/main/resources/META-INF/coremods.json @@ -1,4 +1,5 @@ { "code_injector": "coremods/code_injector.js", - "chest_menus": "coremods/chest_menus.js" + "chest_menus": "coremods/chest_menus.js", + "limb_brush_overclock": "coremods/limb_brush_overclock.js" } \ No newline at end of file diff --git a/src/main/resources/coremods/limb_brush_overclock.js b/src/main/resources/coremods/limb_brush_overclock.js new file mode 100644 index 000000000..344fa1a7d --- /dev/null +++ b/src/main/resources/coremods/limb_brush_overclock.js @@ -0,0 +1,76 @@ +var Opcodes = Java.type('org.objectweb.asm.Opcodes') +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode') +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode') + +function initializeCoreMod() { + return { + 'Patch brush item': { + 'target': { + "type":"METHOD", + "class":"net.minecraft.world.item.BrushItem", + "methodName":"m_5929_", + "methodDesc":"(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;I)V" + }, + 'transformer': function(node) { + for (i = 0; i < node.instructions.size(); i++) { + var insn = node.instructions.get(i) + + if (insn.getOpcode() == Opcodes.BIPUSH) { + node.instructions.insert(insn, new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'ru/dbotthepony/mc/otm/android/feature/LimbOverclockingFeature', + 'getBrushCooldown', + '(Lnet/minecraft/world/entity/LivingEntity;)I' + )) + node.instructions.set(insn, new VarInsnNode(Opcodes.ALOAD, 2)) + + i += 1 + continue + } + + if (insn.getOpcode() == Opcodes.ICONST_5) { + node.instructions.insert(insn, new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'ru/dbotthepony/mc/otm/android/feature/LimbOverclockingFeature', + 'getBrushTick', + '(Lnet/minecraft/world/entity/LivingEntity;)I' + )) + node.instructions.set(insn, new VarInsnNode(Opcodes.ALOAD, 2)) + + i += 1 + continue + } + } + + return node + } + }, + 'Patch brushable block': { + 'target': { + "type":"METHOD", + "class":"net.minecraft.world.level.block.entity.BrushableBlockEntity", + "methodName":"m_276923_", + "methodDesc":"(JLnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/Direction;)Z" + }, + 'transformer': function(node) { + for (i = 0; i < node.instructions.size(); i++) { + var insn = node.instructions.get(i) + + if (insn.getOpcode() == Opcodes.LDC && insn.cst == 10) { + node.instructions.insert(insn, new MethodInsnNode( + Opcodes.INVOKESTATIC, + 'ru/dbotthepony/mc/otm/android/feature/LimbOverclockingFeature', + 'getBrushableBlockCooldown', + '(Lnet/minecraft/world/entity/player/Player;)J' + )) + node.instructions.set(insn, new VarInsnNode(Opcodes.ALOAD, 3)) + + break + } + } + + return node + } + }, + } +} \ No newline at end of file