From 4d551a2df99dfeb66fa0e6c8b101b215b1c32020 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 25 Oct 2022 16:35:12 +0700 Subject: [PATCH] Bows now can use arrows from exosuit inventory Fixes #172 --- build.gradle.kts | 16 ++++++++-- gradle.properties | 2 ++ settings.gradle.kts | 10 +++++++ .../otm/mixin/MixinPatchProjectileFinder.java | 29 +++++++++++++++++++ .../otm/capability/MatteryPlayerCapability.kt | 16 ++++++++++ .../overdrive_that_matters.mixins.json | 10 +++++++ 6 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/mixin/MixinPatchProjectileFinder.java create mode 100644 src/main/resources/overdrive_that_matters.mixins.json diff --git a/build.gradle.kts b/build.gradle.kts index 059d89680..72bdbcb0a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,6 +5,7 @@ import java.text.SimpleDateFormat import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream import kotlin.text.Regex import java.util.UUID +import org.spongepowered.asm.gradle.plugins.MixinExtension val mod_version: String by project val mc_version: String by project @@ -19,6 +20,7 @@ plugins { kotlin `maven-publish` id("net.minecraftforge.gradle") + id("org.spongepowered.mixin") } configurations { @@ -145,6 +147,7 @@ dependencies { val kotlin_for_forge_version: String by project val kotlin_coroutines_version: String by project val kotlin_serialization_version: String by project + val mixin_version: String by project minecraft("net.minecraftforge:forge:$mc_version-$forge_version") testImplementation("org.junit.jupiter:junit-jupiter:${jupiter_version}") @@ -173,6 +176,8 @@ dependencies { // Examples using mod jars from ./libs compileOnly("yalter.mousetweaks:MouseTweaks:2.23:api") + annotationProcessor("org.spongepowered:mixin:${mixin_version}:processor") + // compile against the JEI API but do not include it at runtime //compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // at runtime, use the full JEI jar @@ -250,6 +255,8 @@ minecraft { } else { args("--username", "Dev_${System.getProperty("user.name")}") } + + args("-mixin.config=$mod_id.mixins.json") } create("server") { @@ -259,11 +266,11 @@ minecraft { } } - args("nogui") + args("nogui", "-mixin.config=$mod_id.mixins.json") } create("data") { - args("--mod", "overdrive_that_matters", "--all", "--output", file("src/data/resources/"), "--existing", file("src/main/resources/")) + args("--mod", mod_id, "--all", "--output", file("src/data/resources/"), "--existing", file("src/main/resources/")) mods { create(mod_id) { @@ -276,6 +283,11 @@ minecraft { } } +mixin { + add(sourceSets.main.get(), "$mod_id.refmap.json") + config("$mod_id.mixins.json") +} + minecraft.runs.all { workingDirectory = project.file("run").absolutePath diff --git a/gradle.properties b/gradle.properties index 5fdf14b1a..ca1fe7b5e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,6 +13,8 @@ use_commit_hash_in_version=true mc_version=1.19.2 forge_gradle_version=5.1.27 forge_version=43.1.43 +mixingradle_version=0.7.32 +mixin_version=0.8.5 jei_version=11.3.0.262 jupiter_version=5.8.2 diff --git a/settings.gradle.kts b/settings.gradle.kts index 7bb83627d..11d08643f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,10 +4,12 @@ println("Running with Java ${System.getProperty("java.version")} on JVM: ${Syste pluginManagement { val kotlin_version: String by settings val forge_gradle_version: String by settings + val mixingradle_version: String by settings plugins { kotlin("jvm") version(kotlin_version) id("net.minecraftforge.gradle") version(forge_gradle_version) + id("org.spongepowered.mixin") version(mixingradle_version) } } @@ -21,14 +23,22 @@ buildscript { } } + maven(url = "https://repo.spongepowered.org/repository/maven-public/") { + content { + includeGroup("org.spongepowered") + } + } + mavenCentral() } dependencies { val kotlin_version: String by settings val forge_gradle_version: String by settings + val mixingradle_version: String by settings classpath(group = "net.minecraftforge.gradle", name = "ForgeGradle", version = forge_gradle_version) classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}") + classpath("org.spongepowered:mixingradle:${mixingradle_version}") } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinPatchProjectileFinder.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinPatchProjectileFinder.java new file mode 100644 index 000000000..c49676bdc --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/MixinPatchProjectileFinder.java @@ -0,0 +1,29 @@ +package ru.dbotthepony.mc.otm.mixin; + +import net.minecraft.world.entity.player.Player; +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.callback.CallbackInfoReturnable; +import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability; + +@Mixin(Player.class) +public class MixinPatchProjectileFinder { + @Inject( + method = "getProjectile(Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/item/ItemStack;", + at = @At( + value = "INVOKE", + target = "net.minecraftforge.common.ForgeHooks.getProjectile(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/item/ItemStack;", + ordinal = 2, + shift = At.Shift.BEFORE + ), + cancellable = true) + private void exosuitGetProjectileHook(ItemStack weaponItem, CallbackInfoReturnable hook) { + ItemStack result = MatteryPlayerCapability.getProjectileHook((Player) ((Object) this), weaponItem); + + if (result != null) { + hook.setReturnValue(result); + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index d996928a1..a8b8dd310 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -19,7 +19,9 @@ import net.minecraft.world.entity.monster.Phantom import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.ProjectileWeaponItem import net.minecraft.world.item.enchantment.EnchantmentHelper.hasVanishingCurse +import net.minecraftforge.common.ForgeHooks import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.INBTSerializable @@ -44,6 +46,7 @@ import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.container.MatteryContainer +import ru.dbotthepony.mc.otm.container.stream import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.menu.ExoSuitInventoryMenu import ru.dbotthepony.mc.otm.network.* @@ -1007,5 +1010,18 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial event.target.matteryPlayer?.trackingPlayers?.remove(event.entity as ServerPlayer) } } + + @JvmStatic + fun getProjectileHook(player: Player, weaponItem: ItemStack): ItemStack? { + val weapon = weaponItem.item as? ProjectileWeaponItem ?: return null + val matteryPlayer = player.matteryPlayer ?: return null + + if (!matteryPlayer.hasExoSuit) { + return null + } + + val item = matteryPlayer.exoSuitContainer.stream().filter(weapon.allSupportedProjectiles).findFirst().orElse(null) ?: return null + return ForgeHooks.getProjectile(player, weaponItem, item) + } } } diff --git a/src/main/resources/overdrive_that_matters.mixins.json b/src/main/resources/overdrive_that_matters.mixins.json new file mode 100644 index 000000000..dcbc2ffc0 --- /dev/null +++ b/src/main/resources/overdrive_that_matters.mixins.json @@ -0,0 +1,10 @@ +{ + "required": true, + "package": "ru.dbotthepony.mc.otm.mixin", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "refmap": "overdrive_that_matters.refmap.json", + "mixins": [ + "MixinPatchProjectileFinder" + ] +} \ No newline at end of file