Move explosive enhancment into isolation

[no changelog]
This commit is contained in:
Linnea Gräf
2024-10-26 17:26:37 +02:00
parent 52baaf65bf
commit 4308a09f89
4 changed files with 95 additions and 39 deletions

View File

@@ -154,10 +154,6 @@ val SourceSet.modImplementationConfigurationName
loom.remapConfigurations.find {
it.targetConfigurationName.get() == this.implementationConfigurationName
}!!.sourceConfiguration
val configuredSourceSet = createIsolatedSourceSet("configured")
val sodiumSourceSet = createIsolatedSourceSet("sodium")
val citResewnSourceSet = createIsolatedSourceSet("citresewn")
val yaclSourceSet = createIsolatedSourceSet("yacl")
val shadowMe by configurations.creating {
exclude(group = "org.jetbrains.kotlin")
@@ -182,6 +178,12 @@ val nonModImplentation by configurations.creating {
}
val configuredSourceSet = createIsolatedSourceSet("configured")
val sodiumSourceSet = createIsolatedSourceSet("sodium")
val citResewnSourceSet = createIsolatedSourceSet("citresewn")
val yaclSourceSet = createIsolatedSourceSet("yacl")
val explosiveEnhancementSourceSet = createIsolatedSourceSet("explosiveEnhancement")
dependencies {
// Minecraft dependencies
"minecraft"(libs.minecraft)
@@ -196,7 +198,7 @@ dependencies {
modImplementation(libs.modmenu)
modImplementation(libs.moulconfig)
modImplementation(libs.manninghamMills)
modCompileOnly(libs.explosiveenhancement)
(explosiveEnhancementSourceSet.modImplementationConfigurationName)(libs.explosiveenhancement)
modImplementation(libs.hypixelmodapi)
include(libs.hypixelmodapi.fabric)
compileOnly(project(":javaplugin"))

View File

@@ -0,0 +1,17 @@
package moe.nea.firmament.compat.explosiveenhancement
import com.google.auto.service.AutoService
import net.superkat.explosiveenhancement.api.ExplosiveApi
import net.minecraft.util.math.Vec3d
import moe.nea.firmament.features.fixes.CompatibliltyFeatures
import moe.nea.firmament.features.fixes.CompatibliltyFeatures.TConfig
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.compatloader.CompatLoader
@AutoService(CompatibliltyFeatures.ExplosiveApiWrapper::class)
@CompatLoader.RequireMod("explosiveenhancement")
class ExplosiveEnhancementSpawner : CompatibliltyFeatures.ExplosiveApiWrapper {
override fun spawnParticle(vec3d: Vec3d, power: Float) {
ExplosiveApi.spawnParticles(MC.world, vec3d.x, vec3d.y, vec3d.z, TConfig.explosionSize / 10F)
}
}

View File

@@ -1,51 +1,41 @@
package moe.nea.firmament.features.fixes
import net.fabricmc.loader.api.FabricLoader
import net.superkat.explosiveenhancement.api.ExplosiveApi
import net.minecraft.particle.ParticleTypes
import net.minecraft.util.math.Vec3d
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.ParticleSpawnEvent
import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.compatloader.CompatLoader
object CompatibliltyFeatures : FirmamentFeature {
override val identifier: String
get() = "compatibility"
override val identifier: String
get() = "compatibility"
object TConfig : ManagedConfig(identifier, Category.INTEGRATIONS) {
val enhancedExplosions by toggle("explosion-enabled") { false }
val explosionSize by integer("explosion-power", 10, 50) { 1 }
}
object TConfig : ManagedConfig(identifier, Category.INTEGRATIONS) {
val enhancedExplosions by toggle("explosion-enabled") { false }
val explosionSize by integer("explosion-power", 10, 50) { 1 }
}
override val config: ManagedConfig?
get() = TConfig
override val config: ManagedConfig?
get() = TConfig
interface ExplosiveApiWrapper {
fun spawnParticle(vec3d: Vec3d, power: Float)
}
interface ExplosiveApiWrapper {
fun spawnParticle(vec3d: Vec3d, power: Float)
class ExplosiveApiWrapperImpl : ExplosiveApiWrapper {
override fun spawnParticle(vec3d: Vec3d, power: Float) {
ExplosiveApi.spawnParticles(MC.world, vec3d.x, vec3d.y, vec3d.z, TConfig.explosionSize / 10F)
}
}
companion object : CompatLoader<ExplosiveApiWrapper>(ExplosiveApiWrapper::class.java)
}
val explosiveApiWrapper = if (FabricLoader.getInstance().isModLoaded("explosiveenhancement")) {
ExplosiveApiWrapperImpl()
} else null
private val explosiveApiWrapper = ExplosiveApiWrapper.singleInstance
@Subscribe
fun onExplosion(it: ParticleSpawnEvent) {
if (TConfig.enhancedExplosions &&
it.particleEffect.type == ParticleTypes.EXPLOSION_EMITTER &&
explosiveApiWrapper != null
) {
it.cancel()
explosiveApiWrapper.spawnParticle(it.position, 2F)
}
}
@Subscribe
fun onExplosion(it: ParticleSpawnEvent) {
if (TConfig.enhancedExplosions &&
it.particleEffect.type == ParticleTypes.EXPLOSION_EMITTER &&
explosiveApiWrapper != null
) {
it.cancel()
explosiveApiWrapper.spawnParticle(it.position, 2F)
}
}
}

View File

@@ -0,0 +1,47 @@
package moe.nea.firmament.util.compatloader
import java.util.ServiceLoader
import net.fabricmc.loader.api.FabricLoader
import kotlin.streams.asSequence
import moe.nea.firmament.Firmament
abstract class CompatLoader<T : Any>(val kClass: Class<T>) {
val loader: ServiceLoader<T> = ServiceLoader.load(kClass)
val allValidInstances by lazy {
loader.reload()
loader.stream()
.asSequence()
.filter { provider ->
runCatching {
shouldLoad(provider.type())
}.getOrElse {
Firmament.logger.error("Could not determine whether to load a ${kClass.name} subclass", it)
false
}
}
.mapNotNull { provider ->
runCatching {
provider.get()
}.getOrElse {
Firmament.logger.error(
"Could not load desired instance ${provider.type().name} for ${kClass.name}",
it)
null
}
}
.toList()
}
val singleInstance by lazy { allValidInstances.singleOrNull() }
open fun shouldLoad(type: Class<out T>): Boolean {
return checkRequiredModsPresent(type)
}
fun checkRequiredModsPresent(type: Class<*>): Boolean {
val requiredMods = type.getAnnotationsByType(RequireMod::class.java)
return requiredMods.all { FabricLoader.getInstance().isModLoaded(it.modId) }
}
@Repeatable
annotation class RequireMod(val modId: String)
}