Bows now can use arrows from exosuit inventory

Fixes #172
This commit is contained in:
DBotThePony 2022-10-25 16:35:12 +07:00
parent 5468a18280
commit 4d551a2df9
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 81 additions and 2 deletions

View File

@ -5,6 +5,7 @@ import java.text.SimpleDateFormat
import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream
import kotlin.text.Regex import kotlin.text.Regex
import java.util.UUID import java.util.UUID
import org.spongepowered.asm.gradle.plugins.MixinExtension
val mod_version: String by project val mod_version: String by project
val mc_version: String by project val mc_version: String by project
@ -19,6 +20,7 @@ plugins {
kotlin kotlin
`maven-publish` `maven-publish`
id("net.minecraftforge.gradle") id("net.minecraftforge.gradle")
id("org.spongepowered.mixin")
} }
configurations { configurations {
@ -145,6 +147,7 @@ dependencies {
val kotlin_for_forge_version: String by project val kotlin_for_forge_version: String by project
val kotlin_coroutines_version: String by project val kotlin_coroutines_version: String by project
val kotlin_serialization_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") minecraft("net.minecraftforge:forge:$mc_version-$forge_version")
testImplementation("org.junit.jupiter:junit-jupiter:${jupiter_version}") testImplementation("org.junit.jupiter:junit-jupiter:${jupiter_version}")
@ -173,6 +176,8 @@ dependencies {
// Examples using mod jars from ./libs // Examples using mod jars from ./libs
compileOnly("yalter.mousetweaks:MouseTweaks:2.23:api") 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 // compile against the JEI API but do not include it at runtime
//compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") //compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api")
// at runtime, use the full JEI jar // at runtime, use the full JEI jar
@ -250,6 +255,8 @@ minecraft {
} else { } else {
args("--username", "Dev_${System.getProperty("user.name")}") args("--username", "Dev_${System.getProperty("user.name")}")
} }
args("-mixin.config=$mod_id.mixins.json")
} }
create("server") { create("server") {
@ -259,11 +266,11 @@ minecraft {
} }
} }
args("nogui") args("nogui", "-mixin.config=$mod_id.mixins.json")
} }
create("data") { 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 { mods {
create(mod_id) { 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 { minecraft.runs.all {
workingDirectory = project.file("run").absolutePath workingDirectory = project.file("run").absolutePath

View File

@ -13,6 +13,8 @@ use_commit_hash_in_version=true
mc_version=1.19.2 mc_version=1.19.2
forge_gradle_version=5.1.27 forge_gradle_version=5.1.27
forge_version=43.1.43 forge_version=43.1.43
mixingradle_version=0.7.32
mixin_version=0.8.5
jei_version=11.3.0.262 jei_version=11.3.0.262
jupiter_version=5.8.2 jupiter_version=5.8.2

View File

@ -4,10 +4,12 @@ println("Running with Java ${System.getProperty("java.version")} on JVM: ${Syste
pluginManagement { pluginManagement {
val kotlin_version: String by settings val kotlin_version: String by settings
val forge_gradle_version: String by settings val forge_gradle_version: String by settings
val mixingradle_version: String by settings
plugins { plugins {
kotlin("jvm") version(kotlin_version) kotlin("jvm") version(kotlin_version)
id("net.minecraftforge.gradle") version(forge_gradle_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() mavenCentral()
} }
dependencies { dependencies {
val kotlin_version: String by settings val kotlin_version: String by settings
val forge_gradle_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(group = "net.minecraftforge.gradle", name = "ForgeGradle", version = forge_gradle_version)
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}")
classpath("org.spongepowered:mixingradle:${mixingradle_version}")
} }
} }

View File

@ -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<ItemStack> hook) {
ItemStack result = MatteryPlayerCapability.getProjectileHook((Player) ((Object) this), weaponItem);
if (result != null) {
hook.setReturnValue(result);
}
}
}

View File

@ -19,7 +19,9 @@ import net.minecraft.world.entity.monster.Phantom
import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.ProjectileWeaponItem
import net.minecraft.world.item.enchantment.EnchantmentHelper.hasVanishingCurse import net.minecraft.world.item.enchantment.EnchantmentHelper.hasVanishingCurse
import net.minecraftforge.common.ForgeHooks
import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.Capability
import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.capabilities.ICapabilityProvider
import net.minecraftforge.common.util.INBTSerializable 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.android.AndroidSwitchableFeature
import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.container.MatteryContainer 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.core.*
import ru.dbotthepony.mc.otm.menu.ExoSuitInventoryMenu import ru.dbotthepony.mc.otm.menu.ExoSuitInventoryMenu
import ru.dbotthepony.mc.otm.network.* 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) 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)
}
} }
} }

View File

@ -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"
]
}