From 7534270b97437515d21f1514899b795a807189aa Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Tue, 19 May 2026 08:44:21 +0300 Subject: [PATCH 01/12] [FEAT] Forge support --- build.gradle.kts | 4 - gradle/libs.versions.toml | 17 +- gradle/wrapper/gradle-wrapper.properties | 11 +- instances/forge/build.gradle.kts | 206 +++++++++++++++ .../soulkeeper/ForgeEntryPoint.kt | 32 +++ .../soulkeeper/di/RootModule.kt | 95 +++++++ .../src/main/resources/META-INF/mods.toml | 24 ++ modules/core-forge/build.gradle.kts | 38 +++ .../souls/platform/ItemStackSerializer.kt | 42 +++ modules/event-forge/build.gradle.kts | 43 ++++ .../module/event/di/ForgeEventModule.kt | 32 +++ .../module/event/event/ForgeSoulEvents.kt | 243 ++++++++++++++++++ modules/service-forge/build.gradle.kts | 53 ++++ .../souls/di/ForgePlatformServiceModule.kt | 38 +++ .../ForgeAddSoulItemsIntoInventoryUseCase.kt | 37 +++ .../souls/domain/ForgePickUpItemsUseCase.kt | 67 +++++ .../souls/platform/ForgeEffectEmitter.kt | 62 +++++ .../souls/platform/ForgeEventProvider.kt | 52 ++++ .../module/souls/platform/ForgeExperienced.kt | 19 ++ .../platform/ForgeIsDeadPlayerProvider.kt | 16 ++ .../souls/platform/ItemStackSerializer.kt | 42 +++ .../module/souls/util/OnlineKPlayerExt.kt | 26 ++ settings.gradle.kts | 8 + 23 files changed, 1196 insertions(+), 11 deletions(-) create mode 100644 instances/forge/build.gradle.kts create mode 100644 instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/ForgeEntryPoint.kt create mode 100644 instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt create mode 100644 instances/forge/src/main/resources/META-INF/mods.toml create mode 100644 modules/core-forge/build.gradle.kts create mode 100644 modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt create mode 100644 modules/event-forge/build.gradle.kts create mode 100644 modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt create mode 100644 modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt create mode 100644 modules/service-forge/build.gradle.kts create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt create mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt diff --git a/build.gradle.kts b/build.gradle.kts index 3a3a0e17..59bd03ae 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,8 +14,6 @@ plugins { // klibs - core alias(libs.plugins.klibs.gradle.detekt) apply false - alias(libs.plugins.klibs.gradle.dokka.root) apply false - alias(libs.plugins.klibs.gradle.dokka.module) apply false alias(libs.plugins.klibs.gradle.java.version) apply false alias(libs.plugins.klibs.gradle.publication) apply false alias(libs.plugins.klibs.gradle.rootinfo) apply false @@ -23,12 +21,10 @@ plugins { alias(libs.plugins.gradle.neoforgegradle) apply false } -apply(plugin = "ru.astrainteractive.gradleplugin.dokka.root") apply(plugin = "ru.astrainteractive.gradleplugin.detekt") apply(plugin = "ru.astrainteractive.gradleplugin.rootinfo") subprojects.forEach { - it.apply(plugin = "ru.astrainteractive.gradleplugin.dokka.module") it.plugins.withId("org.jetbrains.kotlin.jvm") { it.apply(plugin = "ru.astrainteractive.gradleplugin.java.version") } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2b684d68..45bbe0c5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,6 @@ driver-jdbc = "3.53.0.0" driver-mariadb = "3.5.8" driver-mysql = "8.0.33" exposed = "1.2.0" -forgegradle = "[6.0,6.2)" gradle-buildconfig = "6.0.9" gradle-ftp = "0.1.3" gradle-shadow = "9.4.1" @@ -16,7 +15,7 @@ jda = "6.4.1" jda-webhook = "0.8.4" jmh-core = "1.37" joml = "1.10.8" -klibs-gradleplugin = "2.0.0" +klibs-gradleplugin = "2.0.3" klibs-kdi = "1.4.8" klibs-kstorage = "5.0.4" klibs-mikro = "1.23.0" @@ -28,17 +27,21 @@ kotlin-serialization = "1.11.0" kotlin-serialization-kaml = "0.104.0" kotlin-version = "2.2.0" ktor = "3.4.3" -minecraft-astralibs = "3.35.0" +minecraft-astralibs = "3.39.1" minecraft-brigadier = "1.3.10" minecraft-bstats = "3.2.1" minecraft-bungee = "26.1-R0.1-SNAPSHOT" minecraft-datafixerupper = "8.0.16" minecraft-essentialsx = "2.21.2" minecraft-fabric-api = "0.139.5+" -minecraft-fabric-yarn = "1.20.1+build.10" minecraft-fabric-kotlin = "1.13.7+" minecraft-fabric-loader = "0.19.2" minecraft-fabric-loom = "1.16.1" +minecraft-fabric-yarn = "1.20.1+build.10" +minecraft-forge-bus="6.0.5" +minecraft-forgegradle = "7.0.25" +minecraft-forgerenamer = "1.0.14" +minecraft-forgeversion = "1.20.1-47.4.12" minecraft-kyori = "5.0.1" minecraft-luckperms = "5.5" minecraft-mcprotocollib = "1.21.7-SNAPSHOT" @@ -117,6 +120,8 @@ minecraft-fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version. minecraft-fabric-kotlin = { module = "net.fabricmc:fabric-language-kotlin", version.ref = "minecraft-fabric-kotlin" } minecraft-fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "minecraft-fabric-loader" } minecraft-fabric-mojang = { module = "com.mojang:minecraft", version.ref = "minecraft-mojang-version" } +minecraft-forge-bus = { module = "net.minecraftforge:eventbus", version.ref = "minecraft-forge-bus" } +minecraft-forgeversion = { module = "net.minecraftforge:forge", version.ref = "minecraft-forgeversion" } minecraft-kyori-api = { module = "net.kyori:adventure-api", version.ref = "minecraft-kyori" } minecraft-kyori-gson = { module = "net.kyori:adventure-text-serializer-gson", version.ref = "minecraft-kyori" } minecraft-kyori-legacy = { module = "net.kyori:adventure-text-serializer-legacy", version.ref = "minecraft-kyori" } @@ -151,13 +156,13 @@ tests-turbine = { module = "app.cash.turbine:turbine", version.ref = "tests-turb [plugins] gradle-buildconfig = { id = "com.github.gmazzo.buildconfig", version.ref = "gradle-buildconfig" } gradle-fabric-loom = { id = "fabric-loom", version.ref = "minecraft-fabric-loom" } -gradle-forgegradle = { id = "net.minecraftforge.gradle", version.ref = "forgegradle" } +gradle-forgegradle = { id = "net.minecraftforge.gradle", version.ref = "minecraft-forgegradle" } +gradle-forgerenamer = { id = "net.minecraftforge.renamer", version.ref = "minecraft-forgerenamer" } gradle-ftp = { id = "ru.astrainteractive.ftpplugin.gradleftp", version.ref = "gradle-ftp" } gradle-neoforgegradle = { id = "net.neoforged.gradle.userdev", version.ref = "minecraft-neoforgegradle" } gradle-shadow = { id = "com.gradleup.shadow", version.ref = "gradle-shadow" } klibs-gradle-detekt = { id = "ru.astrainteractive.gradleplugin.detekt", version.ref = "klibs-gradleplugin" } klibs-gradle-detekt-compose = { id = "ru.astrainteractive.gradleplugin.detekt.compose", version.ref = "klibs-gradleplugin" } -klibs-gradle-dokka-module = { id = "ru.astrainteractive.gradleplugin.dokka.module", version.ref = "klibs-gradleplugin" } klibs-gradle-dokka-root = { id = "ru.astrainteractive.gradleplugin.dokka.root", version.ref = "klibs-gradleplugin" } klibs-gradle-java-core = { id = "ru.astrainteractive.gradleplugin.java.core", version.ref = "klibs-gradleplugin" } klibs-gradle-java-version = { id = "ru.astrainteractive.gradleplugin.java.version", version.ref = "klibs-gradleplugin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6a..78059c9c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,16 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists + + + + + + + diff --git a/instances/forge/build.gradle.kts b/instances/forge/build.gradle.kts new file mode 100644 index 00000000..10769aed --- /dev/null +++ b/instances/forge/build.gradle.kts @@ -0,0 +1,206 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import ru.astrainteractive.gradleplugin.property.model.Developer +import ru.astrainteractive.gradleplugin.property.util.requireJinfo +import ru.astrainteractive.gradleplugin.property.util.requireProjectInfo + +plugins { + kotlin("jvm") + kotlin("plugin.serialization") + alias(libs.plugins.gradle.forgegradle) + alias(libs.plugins.gradle.forgerenamer) + alias(libs.plugins.gradle.shadow) +} + +repositories { + minecraft.mavenizer(this) + mavenCentral() + mavenLocal() + maven(fg.forgeMaven) + maven(fg.minecraftLibsMaven) +} + +dependencies { + // Kotlin + shadow(libs.kotlin.coroutines.core) + // AstraLibs + shadow(libs.minecraft.astralibs.core) + shadow(libs.minecraft.astralibs.core.forge) + shadow(libs.minecraft.astralibs.command) + shadow(libs.kotlin.serialization.kaml) + shadow(libs.klibs.mikro.core) + shadow(libs.klibs.kstorage) + shadow(libs.driver.h2) + shadow(libs.driver.jdbc) + shadow(libs.minecraft.kyori.plain) + shadow(libs.minecraft.kyori.legacy) + shadow(libs.minecraft.kyori.gson) + // Local + shadow(projects.modules.core) + shadow(projects.modules.command) + shadow(projects.modules.dao) + shadow(projects.modules.service) + shadow(projects.modules.coreForge) + shadow(projects.modules.serviceForge) + shadow(projects.modules.eventForge) +} + +tasks.named("processResources") { + filteringCharset = "UTF-8" + duplicatesStrategy = DuplicatesStrategy.WARN + val sourceSets = project.extensions.getByName("sourceSets") as SourceSetContainer + val resDirs = sourceSets + .map(SourceSet::getResources) + .map(SourceDirectorySet::getSrcDirs) + from(resDirs) { + include("META-INF/mods.toml") + expand( + mapOf( + "minecraft_version" to libs.versions.minecraft.forgeversion.get().split("-")[0], + "forge_version" to libs.versions.minecraft.forgeversion.get().split("-")[1], + "mod_id" to requireProjectInfo.name.lowercase(), + "mod_name" to requireProjectInfo.name, + "mod_license" to "mod_license", + "mod_version" to requireProjectInfo.versionString, + "mod_authors" to requireProjectInfo.developersList + .map(Developer::id) + .joinToString(","), + "mod_description" to requireProjectInfo.description + ) + ) + } +} + +val shadowJar by tasks.getting(ShadowJar::class) { + mergeServiceFiles() + dependsOn(tasks.named("processResources")) + configurations = listOf(project.configurations.shadow.get()) + isReproducibleFileOrder = true + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier = null as String? + archiveVersion = requireProjectInfo.versionString + archiveBaseName = "${requireProjectInfo.name}-${project.name}" + destinationDirectory = rootDir + .resolve("build") + .resolve("forge") + .resolve("mods") + .takeIf(File::exists) + ?: File(rootDir, "jars") + dependencies { + // Dependencies + exclude(dependency("org.jetbrains:annotations")) + // Root +// exclude("kotlin/**") // use kotlin-neoforge + exclude("_COROUTINE/**") + exclude("DebugProbesKt.bin") + exclude("jetty-dir.css") + exclude("license/**") + exclude("**LICENCE**") + exclude("**LICENSE**") + // Other dependencies + exclude("club/minnced/opus/**") + exclude("co/touchlab/stately/**") + exclude("com/google/**") + exclude("com/ibm/icu/**") + exclude("com/sun/**") + exclude("google/protobuf/**") + exclude("io/github/**") + exclude("io/javalin/**") + exclude("jakarta/servlet/**") + exclude("javax/annotation/**") + exclude("javax/servlet/**") + exclude("natives/**") + exclude("net/luckperms/**") + exclude("nl/altindag/**") + exclude("org/bouncycastle/**") + exclude("org/checkerframework/**") + exclude("org/conscrypt/**") + exclude("org/eclipse/**") + exclude("jdk/xml/**") + exclude("org/w3c/**") + exclude("tomp2p/opuswrapper/**") + exclude("org/slf4j/**") + exclude("javax/xml/**") + exclude("org/xml/**") + // META + exclude("META-INF/**.md") + exclude("META-INF/**.MD") + exclude("META-INF/**.txt**") + exclude("META-INF/**LICENCE**") + exclude("META-INF/com.android.tools/**") + exclude("META-INF/gradle-plugins/**") + exclude("META-INF/imports/**") + exclude("META-INF/kotlin-reflection.kotlin_module") + exclude("META-INF/license/**") + exclude("META-INF/maven/**") + exclude("META-INF/native-image/**") + exclude("META-INF/native/**") + exclude("META-INF/proguard/**") + exclude("META-INF/rewrite/**") + exclude("META-INF/services/kotlin.reflect.**") +// exclude("META-INF/versions/**") + } + + // Be sure to relocate EXACT PACKAGES!! + // For example, relocate org.some.package instead of org + // Becuase relocation org will break other non-relocated dependencies such as org.minecraft + // Don't relocate `org.jetbrains.exposed` and `kotlin` + listOf( + "ch.qos.logback", + "club.minnced.discord", + "club.minnced.opus", + "com.arkivanov", + "com.charleskorn.kaml", + "com.fasterxml", + "com.neovisionaries", + "dev.icerock", + "gnu.trove", + "it.krzeminski", +// "javax.xml", + "kotlinx", + "net.dv8tion", + "net.kyori", + "net.thauvin", + "okhttp3", + "okio", + "org.apache", + "org.h2", + "org.jetbrains.exposed", + "org.jetbrains.kotlin", + "org.jetbrains.kotlinx", + "org.json", +// "org.slf4j", + "org.sqlite", + "org.telegram", + "org.w3c.css", + "org.w3c.dom", +// "org.xml.sax", + "ru.astrainteractive.astralibs", + "ru.astrainteractive.klibs", + ).forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } +} + +java.toolchain.languageVersion = JavaLanguageVersion.of(requireJinfo.jtarget.majorVersion) + +minecraft { + mappings("official", "1.20.1") + useDefaultAccessTransformer() +} + +dependencies { + compileOnly(minecraft.dependency(libs.minecraft.forgeversion.get())) +} + +configurations.runtimeElements { + setExtendsFrom(emptySet()) +} + +renamer { + mappings.from(minecraft.dependency.toSrgFile) +} + +val reobfShadowJar by renamer.classes(tasks.named("shadowJar")) { + output = input +} + +shadowJar.finalizedBy(reobfShadowJar) +reobfShadowJar.mustRunAfter(shadowJar) diff --git a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/ForgeEntryPoint.kt b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/ForgeEntryPoint.kt new file mode 100644 index 00000000..56116c33 --- /dev/null +++ b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/ForgeEntryPoint.kt @@ -0,0 +1,32 @@ +package ru.astrainteractive.soulkeeper + +import kotlinx.coroutines.cancel +import net.minecraftforge.fml.common.Mod +import ru.astrainteractive.astralibs.lifecycle.ForgeLifecycleServer +import ru.astrainteractive.astralibs.lifecycle.Lifecycle +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.di.RootModule +import javax.annotation.ParametersAreNonnullByDefault + +@Mod("soulkeeper") +@ParametersAreNonnullByDefault +class ForgeEntryPoint : + ForgeLifecycleServer(), + Logger by JUtiltLogger("SoulKeeper-ForgeEntryPoint"), + Lifecycle { + private val rootModule = RootModule(this) + + override fun onEnable() { + rootModule.lifecycle.onEnable() + } + + override fun onDisable() { + rootModule.lifecycle.onDisable() + rootModule.coreModule.unconfinedScope.cancel() + } + + override fun onReload() { + rootModule.lifecycle.onReload() + } +} diff --git a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt new file mode 100644 index 00000000..a00680d0 --- /dev/null +++ b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -0,0 +1,95 @@ +package ru.astrainteractive.soulkeeper.di + +import net.minecraftforge.fml.loading.FMLPaths +import ru.astrainteractive.astralibs.command.api.brigadier.command.MultiplatformCommand +import ru.astrainteractive.astralibs.command.brigadier.command.ForgeMultiplatformCommands +import ru.astrainteractive.astralibs.command.registrar.ForgeCommandRegistrarContext +import ru.astrainteractive.astralibs.coroutines.ForgeDispatchers +import ru.astrainteractive.astralibs.lifecycle.Lifecycle +import ru.astrainteractive.soulkeeper.command.di.CommandModule +import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.module.event.di.ForgeEventModule +import ru.astrainteractive.soulkeeper.module.souls.di.ForgePlatformServiceModule +import ru.astrainteractive.soulkeeper.module.souls.di.ServiceModule +import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule +import java.io.File + +class RootModule(private val plugin: Lifecycle) { + + private val dataFolder by lazy { + FMLPaths.CONFIGDIR.get() + .resolve("SoulKeeper") + .toAbsolutePath() + .toFile() + .also(File::mkdirs) + } + + val coreModule: CoreModule by lazy { + CoreModule( + dataFolder = dataFolder, + dispatchers = ForgeDispatchers() + ) + } + + private val soulsDaoModule by lazy { + SoulsDaoModule.Default( + dataFolder = coreModule.dataFolder, + ioScope = coreModule.ioScope, + dispatchers = coreModule.dispatchers + ) + } + private val forgePlatformServiceModule by lazy { + ForgePlatformServiceModule( + coreModule = coreModule, + soulsDaoModule = soulsDaoModule + ) + } + + private val serviceModule by lazy { + ServiceModule( + coreModule = coreModule, + soulsDaoModule = soulsDaoModule, + platformServiceModule = forgePlatformServiceModule + ) + } + private val forgeEventModule by lazy { + ForgeEventModule( + coreModule = coreModule, + soulsDaoModule = soulsDaoModule, + effectEmitter = forgePlatformServiceModule.effectEmitter + ) + } + private val commandModule by lazy { + CommandModule( + coreModule = coreModule, + soulsDaoModule = soulsDaoModule, + commandRegistrarContext = ForgeCommandRegistrarContext( + mainScope = coreModule.mainScope + ), + serviceModule = serviceModule, + multiplatformCommand = MultiplatformCommand(ForgeMultiplatformCommands()), + lifecyclePlugin = plugin, + ) + } + + private val lifecycles: List + get() = listOfNotNull( + coreModule.lifecycle, + soulsDaoModule.lifecycle, + forgeEventModule.lifecycle, + serviceModule.lifecycle, + commandModule.lifecycle + ) + + val lifecycle = Lifecycle.Lambda( + onEnable = { + lifecycles.forEach(Lifecycle::onEnable) + }, + onDisable = { + lifecycles.forEach(Lifecycle::onDisable) + }, + onReload = { + lifecycles.forEach(Lifecycle::onReload) + } + ) +} diff --git a/instances/forge/src/main/resources/META-INF/mods.toml b/instances/forge/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..f9cfe522 --- /dev/null +++ b/instances/forge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,24 @@ +modLoader="javafml" +loaderVersion="[47,)" +license="${mod_license}" + +[[mods]] + modId="${mod_id}" + version="${mod_version}" + displayName="${mod_name}" + authors="${mod_authors}" + description='''${mod_description}''' + +[[dependencies.${mod_id}]] + modId="forge" + mandatory=true + versionRange="[${forge_version},)" + ordering="NONE" + side="BOTH" + +[[dependencies.${mod_id}]] + modId="minecraft" + mandatory=true + versionRange="[${minecraft_version},)" + ordering="NONE" + side="BOTH" diff --git a/modules/core-forge/build.gradle.kts b/modules/core-forge/build.gradle.kts new file mode 100644 index 00000000..b36b3beb --- /dev/null +++ b/modules/core-forge/build.gradle.kts @@ -0,0 +1,38 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") +} + +dependencies { + implementation(libs.kotlin.serialization.json) + implementation(libs.minecraft.astralibs.core) + implementation(libs.minecraft.astralibs.core.forge) + implementation(projects.modules.core) + implementation(projects.modules.dao) + implementation(projects.modules.service) +} + +dependencies { + dependencies { + compileOnly( + files( + rootProject + .file(".gradle") + .resolve("mavenizer") + .resolve("repo") + .resolve("net") + .resolve("minecraftforge") + .resolve("forge") + .resolve(libs.versions.minecraft.forgeversion.get()) + .resolve("forge-${libs.versions.minecraft.forgeversion.get()}.jar") + ) + ) + } + compileOnly(libs.minecraft.brigadier) + compileOnly(libs.minecraft.forgeversion) + compileOnly(libs.minecraft.forge.bus) +} + +configurations.runtimeElements { + setExtendsFrom(emptySet()) +} diff --git a/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt new file mode 100644 index 00000000..4d6bb2b7 --- /dev/null +++ b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt @@ -0,0 +1,42 @@ +package ru.astrainteractive.soulkeeper.module.souls.platform + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.TagParser +import net.minecraft.world.item.ItemStack + +object ItemStackSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( + serialName = "AstraLibs.Forge.ItemStack.Json", + kind = PrimitiveKind.STRING + ) + + override fun serialize(encoder: Encoder, value: ItemStack) { + encoder.encodeString(encodeToString(value)) + } + + override fun deserialize(decoder: Decoder): ItemStack { + return decodeFromString(decoder.decodeString()).getOrThrow() + } + + fun encodeToString(itemStack: ItemStack): String { + return itemStack.save(CompoundTag()).toString() + } + + fun decodeFromString(string: String): Result = runCatching { + ItemStack.of(parseNbt(string)) + } + + private fun parseNbt(string: String): CompoundTag { + return try { + TagParser.parseTag(string) + } catch (e: Exception) { + throw IllegalArgumentException("Could not parse ItemStack string: $string", e) + } + } +} diff --git a/modules/event-forge/build.gradle.kts b/modules/event-forge/build.gradle.kts new file mode 100644 index 00000000..83bbc74a --- /dev/null +++ b/modules/event-forge/build.gradle.kts @@ -0,0 +1,43 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") +} + +dependencies { + implementation(libs.kotlin.coroutines.core) + implementation(libs.kotlin.serialization.json) + // AstraLibs + implementation(libs.minecraft.astralibs.core) + implementation(libs.minecraft.astralibs.core.forge) + implementation(libs.klibs.mikro.core) + // Local + implementation(projects.modules.core) + implementation(projects.modules.dao) + implementation(projects.modules.service) + implementation(projects.modules.serviceForge) +} + +dependencies { + dependencies { + compileOnly( + files( + rootProject + .file(".gradle") + .resolve("mavenizer") + .resolve("repo") + .resolve("net") + .resolve("minecraftforge") + .resolve("forge") + .resolve(libs.versions.minecraft.forgeversion.get()) + .resolve("forge-${libs.versions.minecraft.forgeversion.get()}.jar") + ) + ) + } + compileOnly(libs.minecraft.brigadier) + compileOnly(libs.minecraft.forgeversion) + compileOnly(libs.minecraft.forge.bus) +} + +configurations.runtimeElements { + setExtendsFrom(emptySet()) +} diff --git a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt new file mode 100644 index 00000000..0b270e1b --- /dev/null +++ b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt @@ -0,0 +1,32 @@ +package ru.astrainteractive.soulkeeper.module.event.di + +import ru.astrainteractive.astralibs.lifecycle.Lifecycle +import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.module.event.event.ForgeSoulEvents +import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule +import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter + +class ForgeEventModule( + coreModule: CoreModule, + soulsDaoModule: SoulsDaoModule, + effectEmitter: EffectEmitter +) { + @Suppress("UnusedPrivateProperty") + private val event = ForgeSoulEvents( + soulsDao = soulsDaoModule.soulsDao, + soulsConfigKrate = coreModule.soulsConfigKrate, + effectEmitter = effectEmitter, + mainScope = coreModule.mainScope, + dispatchers = coreModule.dispatchers, + dataFolder = coreModule.dataFolder, + stringFormat = coreModule.yamlFormat, + ioScope = coreModule.ioScope + ) + + val lifecycle = Lifecycle.Lambda( + onEnable = { + }, + onDisable = { + } + ) +} diff --git a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt new file mode 100644 index 00000000..6774e8d2 --- /dev/null +++ b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt @@ -0,0 +1,243 @@ +package ru.astrainteractive.soulkeeper.module.event.event + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext +import kotlinx.serialization.StringFormat +import net.minecraft.resources.ResourceKey +import net.minecraft.server.level.ServerPlayer +import net.minecraft.world.entity.item.ItemEntity +import net.minecraft.world.level.GameRules +import net.minecraft.world.level.Level +import net.minecraftforge.event.entity.living.LivingDropsEvent +import net.minecraftforge.event.entity.living.LivingExperienceDropEvent +import net.minecraftforge.eventbus.api.EventPriority +import ru.astrainteractive.astralibs.event.flowEvent +import ru.astrainteractive.astralibs.server.location.KLocation +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.astralibs.server.util.asLocatable +import ru.astrainteractive.astralibs.server.util.asOnlineMinecraftPlayer +import ru.astrainteractive.klibs.kstorage.api.CachedKrate +import ru.astrainteractive.klibs.kstorage.api.getValue +import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.klibs.mikro.core.util.tryCast +import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig +import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao +import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul +import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul +import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject +import ru.astrainteractive.soulkeeper.module.souls.krate.PlayerSoulKrate +import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter +import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer +import java.io.File +import java.time.Instant +import kotlin.collections.isNotEmpty +import kotlin.collections.map +import kotlin.collections.orEmpty +import kotlin.time.Duration.Companion.seconds + +@Suppress("LongParameterList") +internal class ForgeSoulEvents( + private val soulsDao: SoulsDao, + private val effectEmitter: EffectEmitter, + private val dispatchers: KotlinDispatchers, + private val dataFolder: File, + private val stringFormat: StringFormat, + private val ioScope: CoroutineScope, + mainScope: CoroutineScope, + soulsConfigKrate: CachedKrate +) : Logger by JUtiltLogger("SoulKeeper-ForgeSoulEvents") { + private val soulsConfig by soulsConfigKrate + private val mutex = Mutex() + private suspend fun spawnSoulEffects( + location: KLocation, + onlineMinecraftPlayer: OnlineKPlayer + ) { + withContext(dispatchers.Main) { + effectEmitter.spawnParticleForPlayer( + location = location, + player = onlineMinecraftPlayer, + config = soulsConfig.particles.soulCreated, + ) + effectEmitter.playSoundForPlayer( + location = location, + player = onlineMinecraftPlayer, + sound = soulsConfig.sounds.soulDropped, + ) + } + } + + private suspend fun updateSoulUnsafe( + soul: ItemDatabaseSoul, + droppedXp: Int?, + soulItems: List? + ) { + val updatedItems = soulItems + .orEmpty() + .plus(soul.items) + val updatedSoul = soul.copy( + exp = droppedXp ?: soul.exp, + items = updatedItems, + hasItems = updatedItems.isNotEmpty() + ) + soulsDao.updateSoul(soul = updatedSoul) + ioScope.launch { + val defaultSoul = DefaultSoul( + ownerUUID = updatedSoul.ownerUUID, + ownerLastName = updatedSoul.ownerLastName, + createdAt = updatedSoul.createdAt, + isFree = updatedSoul.isFree, + location = updatedSoul.location, + exp = updatedSoul.exp, + items = updatedSoul.items + ) + PlayerSoulKrate( + stringFormat = stringFormat, + dataFolder = dataFolder, + createdAt = soul.createdAt, + ownerUUID = soul.ownerUUID + ).save(defaultSoul) + } + } + + private suspend fun createSoulUnsafe( + serverPlayer: OnlineKPlayer, + droppedXp: Int?, + soulItems: List?, + location: KLocation, + dimension: ResourceKey + ) { + val soul = DefaultSoul( + exp = droppedXp ?: 0, + ownerUUID = serverPlayer.uuid, + ownerLastName = serverPlayer.name, + createdAt = Instant.now(), + isFree = soulsConfig.soulFreeAfter == 0.seconds, + location = when (dimension) { + Level.END -> { + location.copy(y = location.y.coerceAtLeast(soulsConfig.endLocationLimitY)) + } + + else -> location + }, + items = soulItems.orEmpty(), + ) + soulsDao.insertSoul(soul) + ioScope.launch { + PlayerSoulKrate( + stringFormat = stringFormat, + dataFolder = dataFolder, + createdAt = soul.createdAt, + ownerUUID = soul.ownerUUID + ).save(soul) + } + } + + @Suppress("LongMethod") + private suspend fun createOrUpdateSoul( + serverPlayer: ServerPlayer, + droppedXp: Int?, + soulItems: List? + ) { + mutex.withLock { + val location = serverPlayer + .asLocatable() + .getLocation() + + val existingSoul = soulsDao.getSoulsNear(location, 1) + .getOrNull() + .orEmpty() + .firstOrNull { soul -> soul.ownerUUID == serverPlayer.uuid } + ?.let { dbSoul -> soulsDao.toItemDatabaseSoul(dbSoul) } + ?.getOrNull() + + if (existingSoul != null) { + updateSoulUnsafe( + soul = existingSoul, + droppedXp = droppedXp, + soulItems = soulItems + ) + } else { + createSoulUnsafe( + location = location, + serverPlayer = serverPlayer.asOnlineMinecraftPlayer(), + droppedXp = droppedXp, + soulItems = soulItems, + dimension = serverPlayer.level().dimension() + ) + } + spawnSoulEffects( + location = location, + onlineMinecraftPlayer = serverPlayer.asOnlineMinecraftPlayer() + ) + } + } + + private fun getAndClearDroppedXp(event: LivingExperienceDropEvent): Int { + val keepLevel = event.entity.level().gameRules.getBoolean(GameRules.RULE_KEEPINVENTORY) + return when { + keepLevel -> 0 + + else -> { + event.originalExperience + .times(soulsConfig.retainedXp) + .toInt() + .also { event.droppedExperience = 0 } + } + } + } + + private fun getAndClearItems(event: LivingDropsEvent): List { + val keepInventory = event.entity.level() + .gameRules + .getBoolean(GameRules.RULE_KEEPINVENTORY) + return when { + keepInventory -> emptyList() + else -> { + event.drops + .map(ItemEntity::getItem) + .map(ItemStackSerializer::encodeToString) + .map(::StringFormatObject) + .also { event.drops.clear() } + } + } + } + + val expDropEvent = flowEvent(EventPriority.HIGHEST) + .filter { !it.isCanceled } + .onEach { event -> + val serverPlayer = event.entity.tryCast() ?: return@onEach + + val droppedXp = getAndClearDroppedXp(event) + if (droppedXp <= 0) return@onEach + + createOrUpdateSoul( + serverPlayer = serverPlayer, + droppedXp = droppedXp, + soulItems = null + ) + } + .launchIn(mainScope) + + val livingDropsEvent = flowEvent(EventPriority.HIGHEST) + .filter { event -> !event.isCanceled } + .onEach { event -> + val serverPlayer = event.entity.tryCast() ?: return@onEach + + val soulItems = getAndClearItems(event) + if (soulItems.isEmpty()) return@onEach + createOrUpdateSoul( + serverPlayer = serverPlayer, + droppedXp = null, + soulItems = soulItems + ) + } + .launchIn(mainScope) +} diff --git a/modules/service-forge/build.gradle.kts b/modules/service-forge/build.gradle.kts new file mode 100644 index 00000000..5cccdde5 --- /dev/null +++ b/modules/service-forge/build.gradle.kts @@ -0,0 +1,53 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") +} + +dependencies { + implementation(libs.kotlin.serialization.json) + implementation(libs.exposed.core) + implementation(libs.exposed.dao) + implementation(libs.exposed.jdbc) + // AstraLibs + implementation(libs.minecraft.astralibs.core) + implementation(libs.minecraft.astralibs.core.forge) + implementation(libs.minecraft.astralibs.command) + // klibs + implementation(libs.klibs.kstorage) + implementation(libs.klibs.mikro.core) + implementation(libs.klibs.mikro.extensions) + // Test + testImplementation(libs.tests.kotlin.test) + // Local + implementation(projects.modules.core) + implementation(projects.modules.dao) + implementation(projects.modules.service) + implementation(projects.modules.coreForge) +} + +dependencies { + dependencies { + compileOnly( + files( + rootProject + .file(".gradle") + .resolve("mavenizer") + .resolve("repo") + .resolve("net") + .resolve("minecraftforge") + .resolve("forge") + .resolve(libs.versions.minecraft.forgeversion.get()) + .resolve("forge-${libs.versions.minecraft.forgeversion.get()}.jar") + ) + ) + } + compileOnly(libs.minecraft.brigadier) + compileOnly(libs.minecraft.datafixerupper) + compileOnly(libs.joml) + compileOnly(libs.minecraft.forgeversion) + compileOnly(libs.minecraft.forge.bus) +} + +configurations.runtimeElements { + setExtendsFrom(emptySet()) +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt new file mode 100644 index 00000000..c16ac69a --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt @@ -0,0 +1,38 @@ +package ru.astrainteractive.soulkeeper.module.souls.di + +import ru.astrainteractive.astralibs.server.bridge.ForgePlatformServer +import ru.astrainteractive.astralibs.server.bridge.PlatformServer +import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.module.souls.domain.ForgeAddSoulItemsIntoInventoryUseCase +import ru.astrainteractive.soulkeeper.module.souls.domain.ForgePickUpItemsUseCase +import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase +import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.ShowArmorStandUseCase +import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.StubShowArmorStandUseCase +import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter +import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeEffectEmitter +import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeEventProvider +import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeExperienced +import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeIsDeadPlayerProvider +import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider +import ru.astrainteractive.soulkeeper.module.souls.platform.event.EventProvider + +class ForgePlatformServiceModule( + coreModule: CoreModule, + soulsDaoModule: SoulsDaoModule, +) : PlatformServiceModule { + override val platformServer: PlatformServer = ForgePlatformServer + override val effectEmitter: EffectEmitter = ForgeEffectEmitter() + override val eventProvider: EventProvider = ForgeEventProvider + override val isDeadPlayerProvider: IsDeadPlayerProvider = ForgeIsDeadPlayerProvider + + override val showArmorStandUseCase: ShowArmorStandUseCase = StubShowArmorStandUseCase + override val onlineMinecraftPlayerExperiencedFactory = ForgeExperienced.OnlineMinecraftPlayerFactory + override val pickUpItemsUseCase: PickUpItemsUseCase = ForgePickUpItemsUseCase( + collectItemSoundProvider = { coreModule.soulsConfigKrate.cachedValue.sounds.collectItem }, + soulsDao = soulsDaoModule.soulsDao, + effectEmitter = effectEmitter, + isDeadPlayerProvider = isDeadPlayerProvider, + dispatchers = coreModule.dispatchers + ) + override val addSoulItemsIntoInventoryUseCase = ForgeAddSoulItemsIntoInventoryUseCase(isDeadPlayerProvider) +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt new file mode 100644 index 00000000..226e373d --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt @@ -0,0 +1,37 @@ +package ru.astrainteractive.soulkeeper.module.souls.domain + +import ru.astrainteractive.astralibs.server.player.ForgeOnlineKPlayer +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul +import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject +import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider +import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer +import ru.astrainteractive.soulkeeper.module.souls.util.addItems + +class ForgeAddSoulItemsIntoInventoryUseCase( + private val isDeadPlayerProvider: IsDeadPlayerProvider +) : + AddSoulItemsIntoInventoryUseCase, + Logger by JUtiltLogger("SoulKeeper-AddSoulItemsIntoInventoryUseCase") { + + override suspend fun invoke( + player: OnlineKPlayer, + soul: DefaultSoul + ) { + require(player is ForgeOnlineKPlayer) { + "Player must be ForgeOnlineKPlayer" + } + val items = soul?.items + .orEmpty() + .map(StringFormatObject::raw) + .map(ItemStackSerializer::decodeFromString) + .mapNotNull { itemStackResult -> + itemStackResult + .onFailure { error(it) { "Failed to deserialize item stack" } } + .getOrNull() + } + player.addItems(items, isDeadPlayerProvider::isDead) + } +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt new file mode 100644 index 00000000..fe25fd57 --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt @@ -0,0 +1,67 @@ +package ru.astrainteractive.soulkeeper.module.souls.domain + +import kotlinx.coroutines.withContext +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig +import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao +import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul +import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject +import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase.Output +import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter +import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider +import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer +import ru.astrainteractive.soulkeeper.module.souls.util.addItems + +internal class ForgePickUpItemsUseCase( + private val collectItemSoundProvider: () -> SoulsConfig.Sounds.SoundConfig, + private val soulsDao: SoulsDao, + private val effectEmitter: EffectEmitter, + private val isDeadPlayerProvider: IsDeadPlayerProvider, + private val dispatchers: KotlinDispatchers +) : PickUpItemsUseCase, + Logger by JUtiltLogger("SoulKeeper-PickUpItemsUseCase") { + + override suspend fun invoke(player: OnlineKPlayer, soul: ItemDatabaseSoul): Output { + if (soul.items.isEmpty()) return Output.NoItemsPresent + val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return Output.SomeItemsRemain + + if (serverPlayer.abilities.instabuild) return Output.SomeItemsRemain + if (serverPlayer.gameMode.isCreative) return Output.SomeItemsRemain + if (isDeadPlayerProvider.isDead(player)) return Output.SomeItemsRemain + + val notAddedItems = withContext(dispatchers.Main) { + player.addItems( + items = soul.items + .map(StringFormatObject::raw) + .map(ItemStackSerializer::decodeFromString) + .mapNotNull { result -> result.getOrNull() }, + isDead = isDeadPlayerProvider::isDead + ) + } + if (notAddedItems.isEmpty()) { + withContext(dispatchers.Main) { + effectEmitter.playSoundForPlayer( + location = soul.location, + player = player, + sound = collectItemSoundProvider.invoke() + ) + } + } + soulsDao.updateSoul( + soul.copy( + items = notAddedItems + .map(ItemStackSerializer::encodeToString) + .map(::StringFormatObject) + ) + ) + return when { + notAddedItems.isEmpty() -> Output.ItemsCollected + else -> Output.SomeItemsRemain + } + } +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt new file mode 100644 index 00000000..fcb9a98e --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt @@ -0,0 +1,62 @@ +package ru.astrainteractive.soulkeeper.module.souls.platform + +import net.minecraft.core.particles.ParticleOptions +import net.minecraft.core.particles.ParticleTypes +import net.minecraft.core.registries.BuiltInRegistries +import net.minecraft.resources.ResourceLocation +import net.minecraft.sounds.SoundSource +import ru.astrainteractive.astralibs.server.location.KLocation +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig + +class ForgeEffectEmitter : EffectEmitter { + override fun playSoundForPlayer( + location: KLocation, + player: OnlineKPlayer, + sound: SoulsConfig.Sounds.SoundConfig + ) { + val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return + val soundEvent = BuiltInRegistries.SOUND_EVENT.get(ResourceLocation.parse(sound.id)) ?: return + serverPlayer.playNotifySound(soundEvent, SoundSource.PLAYERS, sound.volume, sound.pitch) + } + + @Suppress("MagicNumber") + override fun spawnParticleForPlayer( + location: KLocation, + player: OnlineKPlayer, + config: SoulsConfig.Particles.Particle + ) { + val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return + val serverLevel = serverPlayer.serverLevel() + val particleType = BuiltInRegistries.PARTICLE_TYPE.get(ResourceLocation.parse(config.key)) ?: ParticleTypes.DUST + val dustOptions = config.dustOptions + val particleOptions = when (particleType) { + ParticleTypes.DUST if dustOptions != null -> { + val color = dustOptions.color + val r = ((color shr 16) and 0xFF) / 255f + val g = ((color shr 8) and 0xFF) / 255f + val b = (color and 0xFF) / 255f + net.minecraft.core.particles.DustParticleOptions( + org.joml.Vector3f(r, g, b), + dustOptions.size + ) + } + else -> particleType as ParticleOptions + } + serverLevel.sendParticles( + serverPlayer, + particleOptions, + false, + location.x, + location.y, + location.z, + config.count, + 0.0, + 0.0, + 0.0, + 0.0 + ) + } +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt new file mode 100644 index 00000000..4aadaacd --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt @@ -0,0 +1,52 @@ +package ru.astrainteractive.soulkeeper.module.souls.platform + +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.mapNotNull +import net.minecraft.server.level.ServerPlayer +import net.minecraftforge.event.TickEvent +import net.minecraftforge.event.entity.player.PlayerEvent +import ru.astrainteractive.astralibs.event.flowEvent +import ru.astrainteractive.astralibs.server.util.asLocatable +import ru.astrainteractive.astralibs.server.util.asOnlineMinecraftPlayer +import ru.astrainteractive.klibs.mikro.core.util.tryCast +import ru.astrainteractive.soulkeeper.module.souls.platform.event.EventProvider +import ru.astrainteractive.soulkeeper.module.souls.platform.event.model.SharedPlayerJoinEvent +import ru.astrainteractive.soulkeeper.module.souls.platform.event.model.SharedPlayerLeaveEvent +import ru.astrainteractive.soulkeeper.module.souls.platform.event.model.SharedPlayerMoveEvent + +object ForgeEventProvider : EventProvider { + override fun getPlayerMoveEvent(): Flow { + return flowEvent() + .filter { it.phase == TickEvent.Phase.END } + .mapNotNull { event -> + val serverPlayer = event.player + .tryCast() + ?: return@mapNotNull null + SharedPlayerMoveEvent( + player = serverPlayer.asOnlineMinecraftPlayer(), + to = serverPlayer.asLocatable().getLocation() + ) + } + } + + override fun getPlayerJoinEvent(): Flow { + return flowEvent() + .mapNotNull { evt -> + val serverPlayer = evt.entity + .tryCast() + ?: return@mapNotNull null + SharedPlayerJoinEvent(serverPlayer.asOnlineMinecraftPlayer()) + } + } + + override fun getPlayerLeaveEvent(): Flow { + return flowEvent() + .mapNotNull { evt -> + val serverPlayer = evt.entity + .tryCast() + ?: return@mapNotNull null + SharedPlayerLeaveEvent(serverPlayer.asOnlineMinecraftPlayer()) + } + } +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt new file mode 100644 index 00000000..90fe7f18 --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt @@ -0,0 +1,19 @@ +package ru.astrainteractive.soulkeeper.module.souls.platform + +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.getOnlinePlayer + +class ForgeExperienced( + private val player: OnlineKPlayer +) : Experienced { + override fun giveExperience(experience: Int) { + ForgeUtil.getOnlinePlayer(player.uuid)?.giveExperiencePoints(experience) + } + + object OnlineMinecraftPlayerFactory : Experienced.Factory { + override fun create(owner: OnlineKPlayer): Experienced { + return ForgeExperienced(owner) + } + } +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt new file mode 100644 index 00000000..c401525f --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt @@ -0,0 +1,16 @@ +package ru.astrainteractive.soulkeeper.module.souls.platform + +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.getOnlinePlayer + +object ForgeIsDeadPlayerProvider : IsDeadPlayerProvider { + override fun isDead(player: OnlineKPlayer): Boolean { + val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return true + if (serverPlayer.health <= 1) return true + if (!serverPlayer.isAlive) return true + if (serverPlayer.isRemoved) return true + if (serverPlayer.isDeadOrDying) return true + return false + } +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt new file mode 100644 index 00000000..4d6bb2b7 --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt @@ -0,0 +1,42 @@ +package ru.astrainteractive.soulkeeper.module.souls.platform + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.TagParser +import net.minecraft.world.item.ItemStack + +object ItemStackSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( + serialName = "AstraLibs.Forge.ItemStack.Json", + kind = PrimitiveKind.STRING + ) + + override fun serialize(encoder: Encoder, value: ItemStack) { + encoder.encodeString(encodeToString(value)) + } + + override fun deserialize(decoder: Decoder): ItemStack { + return decodeFromString(decoder.decodeString()).getOrThrow() + } + + fun encodeToString(itemStack: ItemStack): String { + return itemStack.save(CompoundTag()).toString() + } + + fun decodeFromString(string: String): Result = runCatching { + ItemStack.of(parseNbt(string)) + } + + private fun parseNbt(string: String): CompoundTag { + return try { + TagParser.parseTag(string) + } catch (e: Exception) { + throw IllegalArgumentException("Could not parse ItemStack string: $string", e) + } + } +} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt new file mode 100644 index 00000000..0f8852b2 --- /dev/null +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt @@ -0,0 +1,26 @@ +package ru.astrainteractive.soulkeeper.module.souls.util + +import net.minecraft.world.item.ItemStack +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.getOnlinePlayer + +/** + * @param items List of items to add to inventory + * @return not fitted items into inventory + */ +internal fun OnlineKPlayer.addItems( + items: List, + isDead: (OnlineKPlayer) -> Boolean +): List { + return items + .mapNotNull { stack -> + if (!isDead.invoke(this)) { + val inventory = ForgeUtil.getOnlinePlayer(uuid)?.inventory + inventory?.add(stack) + inventory?.setChanged() + } + stack.copy() + } + .filterNot(ItemStack::isEmpty) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 2a454ff0..94d77b3b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,8 @@ pluginManagement { repositories { maven("https://maven.neoforged.net/releases") + maven("https://maven.minecraftforge.net") + maven("https://files.minecraftforge.net/maven") maven("https://plugins.gradle.org/m2/") maven("https://jitpack.io") gradlePluginPortal() @@ -20,6 +22,8 @@ dependencyResolutionManagement { gradlePluginPortal() mavenCentral() mavenLocal() + maven("https://maven.minecraftforge.net/") + maven("https://files.minecraftforge.net/maven") maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") maven("https://papermc.io/repo/repository/maven-public/") @@ -45,6 +49,7 @@ rootProject.name = "SoulKeeper" // Spigot include(":instances:bukkit") include(":instances:neoforge") +include(":instances:forge") // Modules include(":modules:core") include(":modules:core-bukkit") @@ -52,6 +57,9 @@ include(":modules:dao") include(":modules:service") include(":modules:service-bukkit") include(":modules:service-neoforge") +include(":modules:service-forge") include(":modules:event-bukkit") include(":modules:event-neoforge") +include(":modules:event-forge") +include(":modules:core-forge") include(":modules:command") From f57d3afb08dbae2dacaa032d71adba9c17610565 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Tue, 19 May 2026 08:47:34 +0300 Subject: [PATCH 02/12] [FEAT] Add soul krate into forge/neoforge --- .../module/event/event/ForgeSoulEvents.kt | 50 ++++++++++--------- .../module/event/event/ForgeSoulEvents.kt | 50 ++++++++++--------- 2 files changed, 54 insertions(+), 46 deletions(-) diff --git a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt index 6774e8d2..48bf4397 100644 --- a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt +++ b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt @@ -88,22 +88,24 @@ internal class ForgeSoulEvents( hasItems = updatedItems.isNotEmpty() ) soulsDao.updateSoul(soul = updatedSoul) - ioScope.launch { - val defaultSoul = DefaultSoul( - ownerUUID = updatedSoul.ownerUUID, - ownerLastName = updatedSoul.ownerLastName, - createdAt = updatedSoul.createdAt, - isFree = updatedSoul.isFree, - location = updatedSoul.location, - exp = updatedSoul.exp, - items = updatedSoul.items - ) - PlayerSoulKrate( - stringFormat = stringFormat, - dataFolder = dataFolder, - createdAt = soul.createdAt, - ownerUUID = soul.ownerUUID - ).save(defaultSoul) + if (soulItems != null) { + ioScope.launch { + val defaultSoul = DefaultSoul( + ownerUUID = updatedSoul.ownerUUID, + ownerLastName = updatedSoul.ownerLastName, + createdAt = updatedSoul.createdAt, + isFree = updatedSoul.isFree, + location = updatedSoul.location, + exp = updatedSoul.exp, + items = updatedSoul.items + ) + PlayerSoulKrate( + stringFormat = stringFormat, + dataFolder = dataFolder, + createdAt = soul.createdAt, + ownerUUID = soul.ownerUUID + ).save(defaultSoul) + } } } @@ -130,13 +132,15 @@ internal class ForgeSoulEvents( items = soulItems.orEmpty(), ) soulsDao.insertSoul(soul) - ioScope.launch { - PlayerSoulKrate( - stringFormat = stringFormat, - dataFolder = dataFolder, - createdAt = soul.createdAt, - ownerUUID = soul.ownerUUID - ).save(soul) + if (!soulItems.isNullOrEmpty()) { + ioScope.launch { + PlayerSoulKrate( + stringFormat = stringFormat, + dataFolder = dataFolder, + createdAt = soul.createdAt, + ownerUUID = soul.ownerUUID + ).save(soul) + } } } diff --git a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt b/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt index 2ba0a7ff..3e732cc7 100644 --- a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt +++ b/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt @@ -88,22 +88,24 @@ internal class ForgeSoulEvents( hasItems = updatedItems.isNotEmpty() ) soulsDao.updateSoul(soul = updatedSoul) - ioScope.launch { - val defaultSoul = DefaultSoul( - ownerUUID = updatedSoul.ownerUUID, - ownerLastName = updatedSoul.ownerLastName, - createdAt = updatedSoul.createdAt, - isFree = updatedSoul.isFree, - location = updatedSoul.location, - exp = updatedSoul.exp, - items = updatedSoul.items - ) - PlayerSoulKrate( - stringFormat = stringFormat, - dataFolder = dataFolder, - createdAt = soul.createdAt, - ownerUUID = soul.ownerUUID - ).save(defaultSoul) + if (soulItems != null) { + ioScope.launch { + val defaultSoul = DefaultSoul( + ownerUUID = updatedSoul.ownerUUID, + ownerLastName = updatedSoul.ownerLastName, + createdAt = updatedSoul.createdAt, + isFree = updatedSoul.isFree, + location = updatedSoul.location, + exp = updatedSoul.exp, + items = updatedSoul.items + ) + PlayerSoulKrate( + stringFormat = stringFormat, + dataFolder = dataFolder, + createdAt = soul.createdAt, + ownerUUID = soul.ownerUUID + ).save(defaultSoul) + } } } @@ -130,13 +132,15 @@ internal class ForgeSoulEvents( items = soulItems.orEmpty(), ) soulsDao.insertSoul(soul) - ioScope.launch { - PlayerSoulKrate( - stringFormat = stringFormat, - dataFolder = dataFolder, - createdAt = soul.createdAt, - ownerUUID = soul.ownerUUID - ).save(soul) + if (!soulItems.isNullOrEmpty()) { + ioScope.launch { + PlayerSoulKrate( + stringFormat = stringFormat, + dataFolder = dataFolder, + createdAt = soul.createdAt, + ownerUUID = soul.ownerUUID + ).save(soul) + } } } From 129cd6d04bb0e65d21860396b277a86f0db08bb1 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 12:56:18 +0300 Subject: [PATCH 03/12] [FIX] Update gradle --- gradle/libs.versions.toml | 4 +- instances/bukkit/build.gradle.kts | 188 ++++++++++++++++++++-------- instances/forge/build.gradle.kts | 142 +++++++++++++++------ instances/neoforge/build.gradle.kts | 40 ++++-- 4 files changed, 265 insertions(+), 109 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 45bbe0c5..b4f9c5ab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,7 +27,7 @@ kotlin-serialization = "1.11.0" kotlin-serialization-kaml = "0.104.0" kotlin-version = "2.2.0" ktor = "3.4.3" -minecraft-astralibs = "3.39.1" +minecraft-astralibs = "3.40.0" minecraft-brigadier = "1.3.10" minecraft-bstats = "3.2.1" minecraft-bungee = "26.1-R0.1-SNAPSHOT" @@ -46,7 +46,7 @@ minecraft-kyori = "5.0.1" minecraft-luckperms = "5.5" minecraft-mcprotocollib = "1.21.7-SNAPSHOT" minecraft-mockbukkit = "4.108.0" -minecraft-mojang-version = "1.21.11" +minecraft-mojang-version = "1.20.1" minecraft-neoforged-bus = "8.0.2" minecraft-neoforgegradle = "7.1.20" minecraft-neoforgeversion = "21.1.129" diff --git a/instances/bukkit/build.gradle.kts b/instances/bukkit/build.gradle.kts index 47cec200..ca99c0fb 100644 --- a/instances/bukkit/build.gradle.kts +++ b/instances/bukkit/build.gradle.kts @@ -50,48 +50,75 @@ minecraftProcessResource { ) } -val shadowJar = tasks.named("shadowJar") -shadowJar.configure { - val projectInfo = requireProjectInfo - isReproducibleFileOrder = true +val shadowJar by tasks.getting(ShadowJar::class) { mergeServiceFiles() - dependsOn(configurations) - archiveClassifier.set(null as String?) - minimize { - exclude(dependency(libs.exposed.jdbc.get())) - exclude(dependency(libs.exposed.dao.get())) - } - archiveVersion.set(projectInfo.versionString) + dependsOn(tasks.named("processResources")) + configurations = listOf(project.configurations.shadow.get()) + isReproducibleFileOrder = true + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + archiveClassifier = null as String? + archiveVersion = requireProjectInfo.versionString archiveBaseName = "${requireProjectInfo.name}-${project.name}" - destinationDirectory = rootProject.layout - .buildDirectory + destinationDirectory = rootProject.layout.buildDirectory.get() .asFile - .get() - .resolve("bukkit") + .resolve(project.name) .resolve("plugins") .takeIf(File::exists) - ?: rootDir.resolve("jars").also(File::mkdirs) + ?: rootDir.resolve("jars") dependencies { - // Path Dependencies - exclude("mozilla/**") - exclude("javax/**") - exclude("it/unimi/dsi/**") + // Dependencies + exclude(dependency("org.jetbrains:annotations")) exclude("ch/qos/logback/**") + exclude("com/ibm/icu/**") + exclude("it/unimi/dsi/**") + exclude("javax/**") + exclude("mozilla/**") + exclude("org/apache/batik/**") + exclude("org/apache/commons/logging/**") + exclude("org/apache/xmlgraphics/**") exclude("org/intellij/lang/annotations/**") exclude("org/jetbrains/annotations/**") exclude("org/slf4j/**") - exclude("org/apache/xmlgraphics/**") - exclude("org/apache/batik/**") - exclude("org/apache/commons/logging/**") - exclude("com/ibm/icu/**") + exclude("org/w3c/dom/**") // Root + if (project.name == "forge" || project.name == "neoforge") { + // Use kotlin-neoforge or kotlin-forge + exclude("kotlin/**") + } exclude("_COROUTINE/**") exclude("DebugProbesKt.bin") exclude("jetty-dir.css") exclude("license/**") - exclude("licenses/**") exclude("**LICENCE**") exclude("**LICENSE**") + // Other dependencies + exclude("club/minnced/opus/**") + exclude("co/touchlab/stately/**") + exclude("com/google/**") + exclude("com/ibm/icu/**") + exclude("com/sun/**") + exclude("google/protobuf/**") + exclude("io/github/**") + exclude("io/javalin/**") + exclude("jakarta/servlet/**") + exclude("javax/annotation/**") + exclude("javax/servlet/**") + exclude("natives/**") + exclude("net/luckperms/**") + exclude("nl/altindag/**") + exclude("org/bouncycastle/**") + exclude("org/checkerframework/**") + exclude("org/conscrypt/**") + exclude("org/apache/batik/**") + exclude("org/apache/xmlgraphics/**") + exclude("org/apache/xmlcommons/**") + exclude("org/eclipse/**") + exclude("jdk/xml/**") + exclude("org/w3c/**") + exclude("tomp2p/opuswrapper/**") + exclude("org/slf4j/**") + exclude("javax/xml/**") + exclude("org/xml/**") // META exclude("META-INF/**.md") exclude("META-INF/**.MD") @@ -108,36 +135,87 @@ shadowJar.configure { exclude("META-INF/proguard/**") exclude("META-INF/rewrite/**") exclude("META-INF/services/kotlin.reflect.**") - exclude("META-INF/versions/**") - // Notation Dependencies - exclude(dependency("mysql:mysql-connector-java:.*")) - exclude(dependency("com.mysql:mysql-connector-j:.*")) - exclude(dependency("org.xerial:sqlite-jdbc:.*")) - exclude(dependency("com.mojang:brigadier:.*")) - exclude(dependency("net.kyori:.*")) - } - relocate("org.bstats", projectInfo.group) - listOf( - "ch.qos.logback", - "com.charleskorn.kaml", - "com.ibm.icu", - "it.krzeminski.snakeyaml", - "net.thauvin.erik", - "okio", - "org.apache", - "org.intellij", - "org.jetbrains.annotations", - "ru.astrainteractive.klibs", - "ru.astrainteractive.astralibs", - "io.github.reactivecircus", - "co.touchlab.stately", - "google.protobuf", - ).forEach { pattern -> relocate(pattern, "${projectInfo.group}.$pattern") } - listOf( - "kotlinx", - ).forEach { pattern -> - relocate(pattern, "${projectInfo.group}.$pattern") { - exclude("kotlin/kotlin.kotlin_builtins") + if (project.name != "forge") { + // Don't remove in: [forge] + exclude("META-INF/versions/**") + } + // DEPENDENCIES + if (project.name == "bukkit") { + exclude(dependency("com.fasterxml.jackson.core:.*")) + exclude(dependency("com.google.code.gson:.*")) + exclude(dependency("com.google.crypto.tink:.*")) + exclude(dependency("com.google.errorprone:.*")) + exclude(dependency("com.mojang:brigadier")) + exclude(dependency("com.mysql:mysql-connector-j")) + exclude(dependency("mysql:mysql-connector-java")) + exclude(dependency("net.java.dev.jna:.*")) + exclude(dependency("net.kyori:.*")) + exclude(dependency("org.apache.xmlgraphics:.*")) + exclude(dependency("org.bouncycastle:.*")) + exclude(dependency("org.checkerframework:.*")) + exclude(dependency("org.conscrypt:.*")) + exclude(dependency("org.eclipse.jetty.toolchain:.*")) + exclude(dependency("org.eclipse.jetty:.*")) + exclude(dependency("org.xerial:sqlite-jdbc")) } } + + relocate("org.bstats", requireProjectInfo.group) + // Be sure to relocate EXACT PACKAGES!! + // For example, relocate org.some.package instead of org + // Becuase relocation org will break other non-relocated dependencies such as org.minecraft + // Don't relocate `org.jetbrains.exposed` and `kotlin` + buildList { + add("ch.qos.logback") + add("club.minnced.discord") + add("club.minnced.opus") + add("co.touchlab.stately") + add("com.arkivanov") + add("com.charleskorn.kaml") + if (project.name != "bukkit") { + // Don't relocate on: [bukkit] + add("com.fasterxml") + } + add("com.ibm.icu") + add("com.neovisionaries") + add("dev.icerock") + add("gnu.trove") + add("google.protobuf") + add("io.github.reactivecircus") + add("it.krzeminski") + add("it.krzeminski.snakeyaml") + if (project.name != "bukkit") { + // Is present on: [bukkit] + add("javax.xml") + } + add("kotlinx") + add("net.dv8tion") + if (project.name != "bukkit") { + // Don't relocate on: [bukkit] + add("net.kyori") + } + add("net.thauvin") + add("okhttp3") + add("okio") + add("org.apache") + if (project.name != "bukkit") { + // Don't relocate on: [bukkit] + add("org.h2") + } + + add("org.intellij") + add("org.jetbrains.annotations") + add("org.jetbrains.exposed") // Don't relocate on: [*] + add("org.jetbrains.kotlinx") + add("org.json") + add("org.json") + add("org.sqlite") + add("org.telegram") + add("org.telegram.telegrambots") + add("org.w3c.css") + add("org.w3c.dom") + add("ru.astrainteractive.astralibs") + add("ru.astrainteractive.klibs") + add("tomp2p.opuswrapper") + }.forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } } diff --git a/instances/forge/build.gradle.kts b/instances/forge/build.gradle.kts index 10769aed..7935ca12 100644 --- a/instances/forge/build.gradle.kts +++ b/instances/forge/build.gradle.kts @@ -43,7 +43,6 @@ dependencies { shadow(projects.modules.serviceForge) shadow(projects.modules.eventForge) } - tasks.named("processResources") { filteringCharset = "UTF-8" duplicatesStrategy = DuplicatesStrategy.WARN @@ -79,17 +78,32 @@ val shadowJar by tasks.getting(ShadowJar::class) { archiveClassifier = null as String? archiveVersion = requireProjectInfo.versionString archiveBaseName = "${requireProjectInfo.name}-${project.name}" - destinationDirectory = rootDir - .resolve("build") - .resolve("forge") + destinationDirectory = rootProject.layout.buildDirectory.get() + .asFile + .resolve(project.name) .resolve("mods") .takeIf(File::exists) - ?: File(rootDir, "jars") + ?: rootDir.resolve("jars") dependencies { // Dependencies exclude(dependency("org.jetbrains:annotations")) + exclude("ch/qos/logback/**") + exclude("com/ibm/icu/**") + exclude("it/unimi/dsi/**") + exclude("javax/**") + exclude("mozilla/**") + exclude("org/apache/batik/**") + exclude("org/apache/commons/logging/**") + exclude("org/apache/xmlgraphics/**") + exclude("org/intellij/lang/annotations/**") + exclude("org/jetbrains/annotations/**") + exclude("org/slf4j/**") + exclude("org/w3c/dom/**") // Root -// exclude("kotlin/**") // use kotlin-neoforge + if (project.name == "forge" || project.name == "neoforge") { + // Use kotlin-neoforge or kotlin-forge + exclude("kotlin/**") + } exclude("_COROUTINE/**") exclude("DebugProbesKt.bin") exclude("jetty-dir.css") @@ -114,6 +128,9 @@ val shadowJar by tasks.getting(ShadowJar::class) { exclude("org/bouncycastle/**") exclude("org/checkerframework/**") exclude("org/conscrypt/**") + exclude("org/apache/batik/**") + exclude("org/apache/xmlgraphics/**") + exclude("org/apache/xmlcommons/**") exclude("org/eclipse/**") exclude("jdk/xml/**") exclude("org/w3c/**") @@ -137,46 +154,89 @@ val shadowJar by tasks.getting(ShadowJar::class) { exclude("META-INF/proguard/**") exclude("META-INF/rewrite/**") exclude("META-INF/services/kotlin.reflect.**") -// exclude("META-INF/versions/**") + if (project.name != "forge") { + // Don't remove in: [forge] + exclude("META-INF/versions/**") + } + // DEPENDENCIES + if (project.name == "bukkit") { + exclude(dependency("com.fasterxml.jackson.core:.*")) + exclude(dependency("com.google.code.gson:.*")) + exclude(dependency("com.google.crypto.tink:.*")) + exclude(dependency("com.google.errorprone:.*")) + exclude(dependency("com.mojang:brigadier")) + exclude(dependency("com.mysql:mysql-connector-j")) + exclude(dependency("mysql:mysql-connector-java")) + exclude(dependency("net.java.dev.jna:.*")) + exclude(dependency("net.kyori:.*")) + exclude(dependency("org.apache.xmlgraphics:.*")) + exclude(dependency("org.bouncycastle:.*")) + exclude(dependency("org.checkerframework:.*")) + exclude(dependency("org.conscrypt:.*")) + exclude(dependency("org.eclipse.jetty.toolchain:.*")) + exclude(dependency("org.eclipse.jetty:.*")) + exclude(dependency("org.xerial:sqlite-jdbc")) + } } + relocate("org.bstats", requireProjectInfo.group) // Be sure to relocate EXACT PACKAGES!! // For example, relocate org.some.package instead of org // Becuase relocation org will break other non-relocated dependencies such as org.minecraft // Don't relocate `org.jetbrains.exposed` and `kotlin` - listOf( - "ch.qos.logback", - "club.minnced.discord", - "club.minnced.opus", - "com.arkivanov", - "com.charleskorn.kaml", - "com.fasterxml", - "com.neovisionaries", - "dev.icerock", - "gnu.trove", - "it.krzeminski", -// "javax.xml", - "kotlinx", - "net.dv8tion", - "net.kyori", - "net.thauvin", - "okhttp3", - "okio", - "org.apache", - "org.h2", - "org.jetbrains.exposed", - "org.jetbrains.kotlin", - "org.jetbrains.kotlinx", - "org.json", -// "org.slf4j", - "org.sqlite", - "org.telegram", - "org.w3c.css", - "org.w3c.dom", -// "org.xml.sax", - "ru.astrainteractive.astralibs", - "ru.astrainteractive.klibs", - ).forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } + buildList { + add("ch.qos.logback") + add("club.minnced.discord") + add("club.minnced.opus") + add("co.touchlab.stately") + add("com.arkivanov") + add("com.charleskorn.kaml") + if (project.name != "bukkit") { + // Don't relocate on: [bukkit] + add("com.fasterxml") + } + add("com.ibm.icu") + add("com.neovisionaries") + add("dev.icerock") + add("gnu.trove") + add("google.protobuf") + add("io.github.reactivecircus") + add("it.krzeminski") + add("it.krzeminski.snakeyaml") + if (project.name != "bukkit") { + // Is present on: [bukkit] + add("javax.xml") + } + add("kotlinx") + add("net.dv8tion") + if (project.name != "bukkit") { + // Don't relocate on: [bukkit] + add("net.kyori") + } + add("net.thauvin") + add("okhttp3") + add("okio") + add("org.apache") + if (project.name != "bukkit") { + // Don't relocate on: [bukkit] + add("org.h2") + } + + add("org.intellij") + add("org.jetbrains.annotations") + add("org.jetbrains.exposed") // Don't relocate on: [*] + add("org.jetbrains.kotlinx") + add("org.json") + add("org.json") + add("org.sqlite") + add("org.telegram") + add("org.telegram.telegrambots") + add("org.w3c.css") + add("org.w3c.dom") + add("ru.astrainteractive.astralibs") + add("ru.astrainteractive.klibs") + add("tomp2p.opuswrapper") + }.forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } } java.toolchain.languageVersion = JavaLanguageVersion.of(requireJinfo.jtarget.majorVersion) @@ -203,4 +263,4 @@ val reobfShadowJar by renamer.classes(tasks.named("shadowJar")) { } shadowJar.finalizedBy(reobfShadowJar) -reobfShadowJar.mustRunAfter(shadowJar) +reobfShadowJar.mustRunAfter(shadowJar) \ No newline at end of file diff --git a/instances/neoforge/build.gradle.kts b/instances/neoforge/build.gradle.kts index d58e90ef..9b519170 100644 --- a/instances/neoforge/build.gradle.kts +++ b/instances/neoforge/build.gradle.kts @@ -78,17 +78,17 @@ val shadowJar by tasks.getting(ShadowJar::class) { archiveClassifier = null as String? archiveVersion = requireProjectInfo.versionString archiveBaseName = "${requireProjectInfo.name}-${project.name}" - destinationDirectory = rootDir - .resolve("build") - .resolve("neoforge") + destinationDirectory = rootProject.layout.buildDirectory.get() + .asFile + .resolve(project.name) .resolve("mods") .takeIf(File::exists) - ?: File(rootDir, "jars") + ?: rootDir.resolve("jars") dependencies { // Dependencies exclude(dependency("org.jetbrains:annotations")) // Root - exclude("kotlin/**") // use kotlin-neoforge +// exclude("kotlin/**") // Use kotlin-neoforge or kotlin-forge exclude("_COROUTINE/**") exclude("DebugProbesKt.bin") exclude("jetty-dir.css") @@ -113,8 +113,16 @@ val shadowJar by tasks.getting(ShadowJar::class) { exclude("org/bouncycastle/**") exclude("org/checkerframework/**") exclude("org/conscrypt/**") + exclude("org/apache/batik/**") + exclude("org/apache/xmlgraphics/**") + exclude("org/apache/xmlcommons/**") exclude("org/eclipse/**") + exclude("jdk/xml/**") + exclude("org/w3c/**") exclude("tomp2p/opuswrapper/**") + exclude("org/slf4j/**") + exclude("javax/xml/**") + exclude("org/xml/**") // META exclude("META-INF/**.md") exclude("META-INF/**.MD") @@ -131,7 +139,7 @@ val shadowJar by tasks.getting(ShadowJar::class) { exclude("META-INF/proguard/**") exclude("META-INF/rewrite/**") exclude("META-INF/services/kotlin.reflect.**") - exclude("META-INF/versions/**") +// exclude("META-INF/versions/**") // Don't remove in Forge } // Be sure to relocate EXACT PACKAGES!! @@ -142,14 +150,19 @@ val shadowJar by tasks.getting(ShadowJar::class) { "ch.qos.logback", "club.minnced.discord", "club.minnced.opus", + "co.touchlab.stately", "com.arkivanov", "com.charleskorn.kaml", "com.fasterxml", + "com.ibm.icu", "com.neovisionaries", "dev.icerock", "gnu.trove", + "google.protobuf", + "io.github.reactivecircus", "it.krzeminski", - "javax.xml", + "it.krzeminski.snakeyaml", +// "javax.xml", // Is present "kotlinx", "net.dv8tion", "net.kyori", @@ -158,18 +171,23 @@ val shadowJar by tasks.getting(ShadowJar::class) { "okio", "org.apache", "org.h2", - "org.jetbrains.exposed", - "org.jetbrains.kotlin", + "org.intellij", + "org.jetbrains.annotations", + "org.jetbrains.exposed", // Don't relocate +// "org.jetbrains.kotlin", // Don't relocate "org.jetbrains.kotlinx", "org.json", - "org.slf4j", + "org.json", +// "org.slf4j", // Is present "org.sqlite", "org.telegram", + "org.telegram.telegrambots", "org.w3c.css", "org.w3c.dom", - "org.xml.sax", +// "org.xml.sax", // Is present "ru.astrainteractive.astralibs", "ru.astrainteractive.klibs", + "tomp2p.opuswrapper", ).forEach { pattern -> relocate(pattern, "${requireProjectInfo.group}.shade.$pattern") } } From 116ed220a2c71702cda4ab072e73bed28593d543 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 13:31:54 +0300 Subject: [PATCH 04/12] [REFACTOR] Fix modules --- docker-compose.yml | 29 +++++--- gradle/libs.versions.toml | 2 +- .../soulkeeper/di/RootModule.kt | 4 +- instances/forge/build.gradle.kts | 2 +- .../soulkeeper/di/RootModule.kt | 10 +-- instances/neoforge/build.gradle.kts | 1 + .../soulkeeper/di/RootModule.kt | 20 ++---- .../core/platform/BukkitEffectEmitter.kt | 71 +++++++++++++++++++ .../core}/platform/BukkitExperienced.kt | 2 +- .../platform/BukkitIsDeadPlayerProvider.kt | 4 +- .../soulkeeper/core/util/SoulsConfigExt.kt | 60 ---------------- modules/core-forge/build.gradle.kts | 2 + .../souls/platform/ForgeEffectEmitter.kt | 12 ++-- .../module/souls/platform/ForgeExperienced.kt | 5 +- .../platform/ForgeIsDeadPlayerProvider.kt | 5 +- .../souls/platform/ItemStackSerializer.kt | 4 +- .../souls/platform/NeoForgeEffectEmitter.kt | 18 ++--- .../souls/platform/NeoForgeExperienced.kt | 5 +- .../platform/NeoForgeIsDeadPlayerProvider.kt | 5 +- .../soulkeeper/core/di/CoreModule.kt | 4 +- .../core}/platform/EffectEmitter.kt | 2 +- .../soulkeeper/core}/platform/Experienced.kt | 2 +- .../core}/platform/IsDeadPlayerProvider.kt | 2 +- modules/event-bukkit/build.gradle.kts | 1 + .../module/event/di/BukkitEventModule.kt | 3 +- .../module/event/event/BukkitSoulEvents.kt | 28 ++++---- modules/event-forge/build.gradle.kts | 1 + .../module/event/di/ForgeEventModule.kt | 2 +- .../module/event/event/ForgeSoulEvents.kt | 2 +- .../module/event/di/ForgeEventModule.kt | 2 +- .../module/event/event/ForgeSoulEvents.kt | 3 +- .../souls/di/BukkitPlatformServiceModule.kt | 12 ++-- .../souls/domain/BukkitPickUpItemsUseCase.kt | 17 +++-- .../souls/platform/BukkitEffectEmitter.kt | 31 -------- .../souls/di/ForgePlatformServiceModule.kt | 11 ++- .../ForgeAddSoulItemsIntoInventoryUseCase.kt | 6 +- .../souls/domain/ForgePickUpItemsUseCase.kt | 8 +-- .../souls/platform/ItemStackSerializer.kt | 42 ----------- .../module/souls/util/OnlineKPlayerExt.kt | 4 +- modules/service-neoforge/build.gradle.kts | 1 + .../souls/di/NeoForgePlatformServiceModule.kt | 8 +-- ...eoForgeAddSoulItemsIntoInventoryUseCase.kt | 7 +- .../domain/NeoForgePickUpItemsUseCase.kt | 9 ++- .../module/souls/util/OnlineKPlayerExt.kt | 4 +- .../module/souls/di/PlatformServiceModule.kt | 6 +- .../module/souls/di/ServiceModule.kt | 8 +-- .../module/souls/domain/PickUpExpUseCase.kt | 4 +- .../module/souls/domain/PickUpSoulUseCase.kt | 2 +- .../souls/renderer/SoulParticleRenderer.kt | 2 +- .../souls/renderer/SoulSoundRenderer.kt | 2 +- .../module/souls/service/PickUpWorker.kt | 2 +- settings.gradle.kts | 17 +++-- 52 files changed, 232 insertions(+), 284 deletions(-) create mode 100644 modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt rename modules/{service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls => core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core}/platform/BukkitExperienced.kt (89%) rename modules/{service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls => core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core}/platform/BukkitIsDeadPlayerProvider.kt (62%) delete mode 100644 modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/SoulsConfigExt.kt rename modules/{service-forge => core-forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt (83%) rename modules/{service-forge => core-forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt (71%) rename modules/{service-forge => core-forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt (70%) rename modules/{service-neoforge => core-neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt (94%) rename modules/{service-neoforge => core-neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt (81%) rename modules/{service-neoforge => core-neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt (71%) rename modules/{service-neoforge => core-neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt (70%) rename modules/{service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls => core/src/main/kotlin/ru/astrainteractive/soulkeeper/core}/platform/EffectEmitter.kt (89%) rename modules/{service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls => core/src/main/kotlin/ru/astrainteractive/soulkeeper/core}/platform/Experienced.kt (70%) rename modules/{service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls => core/src/main/kotlin/ru/astrainteractive/soulkeeper/core}/platform/IsDeadPlayerProvider.kt (70%) delete mode 100644 modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEffectEmitter.kt delete mode 100644 modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt diff --git a/docker-compose.yml b/docker-compose.yml index 2f6df3c0..ce300510 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,27 +1,36 @@ services: - # For command call use `docker exec mc_docker_soulkeeper rcon-cli ` - mc_docker_soulkeeper: + # For command call use `docker exec mc_docker_mbridge rcon-cli ` + mc_docker_mbridge: restart: no - container_name: mc_docker_soulkeeper + container_name: mc_docker_mbridge image: itzg/minecraft-server # https://github.com/itzg/docker-minecraft-server tty: true stdin_open: true ports: - "25565:25565" environment: + LEVEL_TYPE: FLAT + EXISTING_OPS_FILE: MERGE + OPS: | + RomaRoman EULA: true ONLINE_MODE: false + # NeoForge -------------------- + # TYPE: NEOFORGE + # VERSION: "1.20.1" + # NEOFORGE_VERSION: "21.1.129" # Forge -------------------- -# TYPE: NEOFORGE -# VERSION: "1.21.1" -# NEOFORGE_VERSION: "21.1.209" + TYPE: FORGE + VERSION: "1.20.1" + FORGE_VERSION: "47.4.12" # Paper -------------------- - TYPE: PAPER - VERSION: 1.21.8 + # TYPE: PAPER + # VERSION: 1.21.8 # Custom ------------------- # CUSTOM_SERVER: https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/121/downloads/paper-1.21.1-121.jar volumes: -# - ./build/neoforge:/data # Forge - - ./build/bukkit:/data # Bukkit/Paper/Spigot + - ./build/forge:/data # Forge +# - ./build/neoforge:/data # NeoForge +# - ./build/bukkit:/data # Bukkit/Paper/Spigot # - ./build/velocity:/data # Velocity # - ./build/fabric:/data # Fabric \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b4f9c5ab..f4709d3c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,7 +27,7 @@ kotlin-serialization = "1.11.0" kotlin-serialization-kaml = "0.104.0" kotlin-version = "2.2.0" ktor = "3.4.3" -minecraft-astralibs = "3.40.0" +minecraft-astralibs = "3.40.2" minecraft-brigadier = "1.3.10" minecraft-bstats = "3.2.1" minecraft-bungee = "26.1-R0.1-SNAPSHOT" diff --git a/instances/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt index 6e7b8039..b73bad77 100644 --- a/instances/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt +++ b/instances/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -10,6 +10,7 @@ import ru.astrainteractive.astralibs.lifecycle.LifecyclePlugin import ru.astrainteractive.soulkeeper.command.di.CommandModule import ru.astrainteractive.soulkeeper.core.di.BukkitCoreModule import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.core.platform.BukkitEffectEmitter import ru.astrainteractive.soulkeeper.module.event.di.BukkitEventModule import ru.astrainteractive.soulkeeper.module.souls.di.BukkitPlatformServiceModule import ru.astrainteractive.soulkeeper.module.souls.di.ServiceModule @@ -18,7 +19,8 @@ import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule class RootModule(plugin: LifecyclePlugin) { private val coreModule: CoreModule = CoreModule( dispatchers = DefaultBukkitDispatchers(plugin), - dataFolder = plugin.dataFolder + dataFolder = plugin.dataFolder, + effectEmitter = BukkitEffectEmitter ) private val bukkitCoreModule = BukkitCoreModule(plugin) diff --git a/instances/forge/build.gradle.kts b/instances/forge/build.gradle.kts index 7935ca12..a99c38a9 100644 --- a/instances/forge/build.gradle.kts +++ b/instances/forge/build.gradle.kts @@ -263,4 +263,4 @@ val reobfShadowJar by renamer.classes(tasks.named("shadowJar")) { } shadowJar.finalizedBy(reobfShadowJar) -reobfShadowJar.mustRunAfter(shadowJar) \ No newline at end of file +reobfShadowJar.mustRunAfter(shadowJar) diff --git a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt index a00680d0..0be505c1 100644 --- a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt +++ b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -2,9 +2,9 @@ package ru.astrainteractive.soulkeeper.di import net.minecraftforge.fml.loading.FMLPaths import ru.astrainteractive.astralibs.command.api.brigadier.command.MultiplatformCommand -import ru.astrainteractive.astralibs.command.brigadier.command.ForgeMultiplatformCommands +import ru.astrainteractive.astralibs.command.brigadier.command.MinecraftMultiplatformCommands import ru.astrainteractive.astralibs.command.registrar.ForgeCommandRegistrarContext -import ru.astrainteractive.astralibs.coroutines.ForgeDispatchers +import ru.astrainteractive.astralibs.coroutines.MinecraftDispatchers import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.soulkeeper.command.di.CommandModule import ru.astrainteractive.soulkeeper.core.di.CoreModule @@ -12,6 +12,7 @@ import ru.astrainteractive.soulkeeper.module.event.di.ForgeEventModule import ru.astrainteractive.soulkeeper.module.souls.di.ForgePlatformServiceModule import ru.astrainteractive.soulkeeper.module.souls.di.ServiceModule import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule +import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeEffectEmitter import java.io.File class RootModule(private val plugin: Lifecycle) { @@ -27,7 +28,8 @@ class RootModule(private val plugin: Lifecycle) { val coreModule: CoreModule by lazy { CoreModule( dataFolder = dataFolder, - dispatchers = ForgeDispatchers() + dispatchers = MinecraftDispatchers(), + effectEmitter = ForgeEffectEmitter ) } @@ -67,7 +69,7 @@ class RootModule(private val plugin: Lifecycle) { mainScope = coreModule.mainScope ), serviceModule = serviceModule, - multiplatformCommand = MultiplatformCommand(ForgeMultiplatformCommands()), + multiplatformCommand = MultiplatformCommand(MinecraftMultiplatformCommands()), lifecyclePlugin = plugin, ) } diff --git a/instances/neoforge/build.gradle.kts b/instances/neoforge/build.gradle.kts index 9b519170..99c37463 100644 --- a/instances/neoforge/build.gradle.kts +++ b/instances/neoforge/build.gradle.kts @@ -33,6 +33,7 @@ dependencies { shadow(libs.minecraft.kyori.gson) // Local shadow(projects.modules.core) + shadow(projects.modules.coreNeoforge) shadow(projects.modules.command) shadow(projects.modules.dao) shadow(projects.modules.service) diff --git a/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt index 87198960..302a3ba7 100644 --- a/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt +++ b/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -1,15 +1,11 @@ package ru.astrainteractive.soulkeeper.di -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.MainCoroutineDispatcher import net.neoforged.fml.loading.FMLPaths import ru.astrainteractive.astralibs.command.api.brigadier.command.MultiplatformCommand -import ru.astrainteractive.astralibs.command.brigadier.command.NeoForgeMultiplatformCommands +import ru.astrainteractive.astralibs.command.brigadier.command.MinecraftMultiplatformCommands import ru.astrainteractive.astralibs.command.registrar.NeoForgeCommandRegistrarContext -import ru.astrainteractive.astralibs.coroutines.NeoForgeMainDispatcher +import ru.astrainteractive.astralibs.coroutines.MinecraftDispatchers import ru.astrainteractive.astralibs.lifecycle.Lifecycle -import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.soulkeeper.command.di.CommandModule import ru.astrainteractive.soulkeeper.core.di.CoreModule import ru.astrainteractive.soulkeeper.module.event.di.ForgeEventModule @@ -31,14 +27,8 @@ class RootModule(private val plugin: Lifecycle) { val coreModule: CoreModule by lazy { CoreModule( dataFolder = dataFolder, - dispatchers = object : KotlinDispatchers { - override val Main: MainCoroutineDispatcher by lazy { - NeoForgeMainDispatcher() - } - override val IO: CoroutineDispatcher = Dispatchers.IO - override val Default: CoroutineDispatcher = Dispatchers.Default - override val Unconfined: CoroutineDispatcher = Dispatchers.Unconfined - } + dispatchers = MinecraftDispatchers(), + effectEmitter = NeoForgeEffectEmitter() ) } @@ -78,7 +68,7 @@ class RootModule(private val plugin: Lifecycle) { mainScope = coreModule.mainScope ), serviceModule = serviceModule, - multiplatformCommand = MultiplatformCommand(NeoForgeMultiplatformCommands()), + multiplatformCommand = MultiplatformCommand(MinecraftMultiplatformCommands()), lifecyclePlugin = plugin, ) } diff --git a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt b/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt new file mode 100644 index 00000000..fa41e69f --- /dev/null +++ b/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt @@ -0,0 +1,71 @@ +package ru.astrainteractive.soulkeeper.core.platform + +import com.destroystokyo.paper.ParticleBuilder +import net.kyori.adventure.key.Key +import net.kyori.adventure.sound.Sound +import org.bukkit.Bukkit +import org.bukkit.Color +import org.bukkit.Location +import org.bukkit.Particle +import ru.astrainteractive.astralibs.server.location.KLocation +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.astralibs.server.util.asBukkitLocation +import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig + +object BukkitEffectEmitter : EffectEmitter { + private fun SoulsConfig.Sounds.SoundConfig.toKyoriSound(): Sound { + return Sound.sound( + Key.key(this.id), + Sound.Source.AMBIENT, + volume, + pitch, + ) + } + + override fun playSoundForPlayer( + location: KLocation, + player: OnlineKPlayer, + sound: SoulsConfig.Sounds.SoundConfig + ) { + val bukkitPlayer = Bukkit.getPlayer(player.uuid) ?: return + val location = location.asBukkitLocation() + bukkitPlayer.playSound(sound.toKyoriSound(), location.x, location.y, location.z) + } + + @Suppress("MagicNumber") + private fun SoulsConfig.Particles.Particle.toBuilder(location: Location): ParticleBuilder { + val particle = runCatching { Particle.valueOf(key) } + .getOrNull() + ?: Particle.DUST + val localDustOptions = dustOptions + ?.takeIf { particle == Particle.DUST } + + return ParticleBuilder(particle) + .count(count) + .location(location) + .offset(0.1, 0.1, 0.1) + .apply { + if (localDustOptions != null) { + data( + Particle.DustOptions( + Color.fromRGB(localDustOptions.color), + localDustOptions.size + ) + ) + } + } + } + + override fun spawnParticleForPlayer( + location: KLocation, + player: OnlineKPlayer, + config: SoulsConfig.Particles.Particle + ) { + val bukkitPlayer = Bukkit.getPlayer(player.uuid) ?: return + + config + .toBuilder(location.asBukkitLocation()) + .receivers(bukkitPlayer) + .spawn() + } +} diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitExperienced.kt b/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt similarity index 89% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitExperienced.kt rename to modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt index 93bfaf94..6eaf0312 100644 --- a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitExperienced.kt +++ b/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt @@ -1,4 +1,4 @@ -package ru.astrainteractive.soulkeeper.module.souls.platform +package ru.astrainteractive.soulkeeper.core.platform import org.bukkit.Bukkit import ru.astrainteractive.astralibs.server.player.OnlineKPlayer diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitIsDeadPlayerProvider.kt b/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt similarity index 62% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitIsDeadPlayerProvider.kt rename to modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt index 97128360..923ab30e 100644 --- a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitIsDeadPlayerProvider.kt +++ b/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt @@ -1,9 +1,9 @@ -package ru.astrainteractive.soulkeeper.module.souls.platform +package ru.astrainteractive.soulkeeper.core.platform import org.bukkit.Bukkit import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -internal object BukkitIsDeadPlayerProvider : IsDeadPlayerProvider { +object BukkitIsDeadPlayerProvider : IsDeadPlayerProvider { override fun isDead(player: OnlineKPlayer): Boolean { return Bukkit.getPlayer(player.uuid)?.isDead == true } diff --git a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/SoulsConfigExt.kt b/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/SoulsConfigExt.kt deleted file mode 100644 index c3cf6b37..00000000 --- a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/SoulsConfigExt.kt +++ /dev/null @@ -1,60 +0,0 @@ -package ru.astrainteractive.soulkeeper.core.util - -import com.destroystokyo.paper.ParticleBuilder -import net.kyori.adventure.key.Key -import net.kyori.adventure.sound.Sound -import org.bukkit.Color -import org.bukkit.Location -import org.bukkit.Particle -import org.bukkit.entity.Player -import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig - -private fun SoulsConfig.Sounds.SoundConfig.toKyoriSound(): Sound { - return Sound.sound( - Key.key(this.id), - Sound.Source.AMBIENT, - volume, - pitch, - ) -} - -/** - * Play sound only to this [Player] - */ -fun Location.playSoundForPlayer(player: Player, sound: SoulsConfig.Sounds.SoundConfig) { - player.playSound(sound.toKyoriSound(), x, y, z) -} - -@Suppress("MagicNumber") -private fun SoulsConfig.Particles.Particle.toBuilder(location: Location): ParticleBuilder { - val particle = runCatching { Particle.valueOf(key) } - .getOrNull() - ?: Particle.DUST - val localDustOptions = dustOptions - ?.takeIf { particle == Particle.DUST } - - return ParticleBuilder(particle) - .count(count) - .location(location) - .offset(0.1, 0.1, 0.1) - .apply { - if (localDustOptions != null) { - data( - Particle.DustOptions( - Color.fromRGB(localDustOptions.color), - localDustOptions.size - ) - ) - } - } -} - -/** - * Spawn particle to only this [player] - */ -fun Location.spawnParticleForPlayer(player: Player, config: SoulsConfig.Particles.Particle) { - config - .toBuilder(this) - .receivers(player) - .spawn() -} diff --git a/modules/core-forge/build.gradle.kts b/modules/core-forge/build.gradle.kts index b36b3beb..29f47b45 100644 --- a/modules/core-forge/build.gradle.kts +++ b/modules/core-forge/build.gradle.kts @@ -30,7 +30,9 @@ dependencies { } compileOnly(libs.minecraft.brigadier) compileOnly(libs.minecraft.forgeversion) + compileOnly(libs.minecraft.datafixerupper) compileOnly(libs.minecraft.forge.bus) + compileOnly(libs.joml) } configurations.runtimeElements { diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt similarity index 83% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt rename to modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt index fcb9a98e..925e55a8 100644 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt +++ b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt @@ -1,5 +1,6 @@ package ru.astrainteractive.soulkeeper.module.souls.platform +import net.minecraft.core.particles.DustParticleOptions import net.minecraft.core.particles.ParticleOptions import net.minecraft.core.particles.ParticleTypes import net.minecraft.core.registries.BuiltInRegistries @@ -7,17 +8,18 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.sounds.SoundSource import ru.astrainteractive.astralibs.server.location.KLocation import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig -class ForgeEffectEmitter : EffectEmitter { +object ForgeEffectEmitter : EffectEmitter { override fun playSoundForPlayer( location: KLocation, player: OnlineKPlayer, sound: SoulsConfig.Sounds.SoundConfig ) { - val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return val soundEvent = BuiltInRegistries.SOUND_EVENT.get(ResourceLocation.parse(sound.id)) ?: return serverPlayer.playNotifySound(soundEvent, SoundSource.PLAYERS, sound.volume, sound.pitch) } @@ -28,7 +30,7 @@ class ForgeEffectEmitter : EffectEmitter { player: OnlineKPlayer, config: SoulsConfig.Particles.Particle ) { - val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return val serverLevel = serverPlayer.serverLevel() val particleType = BuiltInRegistries.PARTICLE_TYPE.get(ResourceLocation.parse(config.key)) ?: ParticleTypes.DUST val dustOptions = config.dustOptions @@ -38,7 +40,7 @@ class ForgeEffectEmitter : EffectEmitter { val r = ((color shr 16) and 0xFF) / 255f val g = ((color shr 8) and 0xFF) / 255f val b = (color and 0xFF) / 255f - net.minecraft.core.particles.DustParticleOptions( + DustParticleOptions( org.joml.Vector3f(r, g, b), dustOptions.size ) diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt similarity index 71% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt rename to modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt index 90fe7f18..7bfcaf80 100644 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt +++ b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt @@ -1,14 +1,15 @@ package ru.astrainteractive.soulkeeper.module.souls.platform import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.soulkeeper.core.platform.Experienced class ForgeExperienced( private val player: OnlineKPlayer ) : Experienced { override fun giveExperience(experience: Int) { - ForgeUtil.getOnlinePlayer(player.uuid)?.giveExperiencePoints(experience) + MinecraftUtil.getOnlinePlayer(player.uuid)?.giveExperiencePoints(experience) } object OnlineMinecraftPlayerFactory : Experienced.Factory { diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt similarity index 70% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt rename to modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt index c401525f..365da07e 100644 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt +++ b/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt @@ -1,12 +1,13 @@ package ru.astrainteractive.soulkeeper.module.souls.platform import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider object ForgeIsDeadPlayerProvider : IsDeadPlayerProvider { override fun isDead(player: OnlineKPlayer): Boolean { - val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return true + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return true if (serverPlayer.health <= 1) return true if (!serverPlayer.isAlive) return true if (serverPlayer.isRemoved) return true diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt similarity index 94% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt rename to modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt index 497366d3..6d2de835 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt +++ b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt @@ -10,7 +10,7 @@ import net.minecraft.core.RegistryAccess import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.TagParser import net.minecraft.world.item.ItemStack -import ru.astrainteractive.astralibs.server.util.NeoForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil object ItemStackSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( @@ -27,7 +27,7 @@ object ItemStackSerializer : KSerializer { } private fun requireHolderLookup(): RegistryAccess.Frozen { - return NeoForgeUtil.serverOrNull + return MinecraftUtil.serverOrNull ?.registryAccess() ?: error("Server is not running") } diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt similarity index 81% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt rename to modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt index a62a8fb9..36f03c71 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt +++ b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt @@ -1,24 +1,26 @@ package ru.astrainteractive.soulkeeper.module.souls.platform +import net.minecraft.core.particles.DustParticleOptions import net.minecraft.core.particles.ParticleOptions import net.minecraft.core.particles.ParticleTypes import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.resources.ResourceLocation import net.minecraft.sounds.SoundSource -import net.neoforged.neoforge.registries.NeoForgeRegistries +import org.joml.Vector3f import ru.astrainteractive.astralibs.server.location.KLocation import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.NeoForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig -class NeoForgeEffectEmitter : EffectEmitter { +object NeoForgeEffectEmitter : EffectEmitter { override fun playSoundForPlayer( location: KLocation, player: OnlineKPlayer, sound: SoulsConfig.Sounds.SoundConfig ) { - val serverPlayer = NeoForgeUtil.getOnlinePlayer(player.uuid) ?: return + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return val soundEvent = BuiltInRegistries.SOUND_EVENT.get(ResourceLocation.parse(sound.id)) ?: return @@ -36,11 +38,9 @@ class NeoForgeEffectEmitter : EffectEmitter { player: OnlineKPlayer, config: SoulsConfig.Particles.Particle ) { - val serverPlayer = NeoForgeUtil.getOnlinePlayer(player.uuid) ?: return + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return val serverLevel = serverPlayer.serverLevel() - NeoForgeRegistries.INGREDIENT_TYPES - val particleType = BuiltInRegistries.PARTICLE_TYPE.get(ResourceLocation.parse(config.key)) ?: ParticleTypes.DUST val dustOptions = config.dustOptions @@ -51,8 +51,8 @@ class NeoForgeEffectEmitter : EffectEmitter { val g = ((color shr 8) and 0xFF) / 255f val b = (color and 0xFF) / 255f - net.minecraft.core.particles.DustParticleOptions( - org.joml.Vector3f(r, g, b), + DustParticleOptions( + Vector3f(r, g, b), dustOptions.size ) } diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt similarity index 71% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt rename to modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt index 54490968..45862562 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt +++ b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt @@ -1,14 +1,15 @@ package ru.astrainteractive.soulkeeper.module.souls.platform import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.NeoForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.soulkeeper.core.platform.Experienced class NeoForgeExperienced( private val player: OnlineKPlayer ) : Experienced { override fun giveExperience(experience: Int) { - NeoForgeUtil.getOnlinePlayer(player.uuid)?.giveExperiencePoints(experience) + MinecraftUtil.getOnlinePlayer(player.uuid)?.giveExperiencePoints(experience) } object OnlineMinecraftPlayerFactory : Experienced.Factory { diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt similarity index 70% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt rename to modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt index 7a65e8c0..f7e2e051 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt +++ b/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt @@ -1,12 +1,13 @@ package ru.astrainteractive.soulkeeper.module.souls.platform import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.NeoForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider object NeoForgeIsDeadPlayerProvider : IsDeadPlayerProvider { override fun isDead(player: OnlineKPlayer): Boolean { - val serverPlayer = NeoForgeUtil.getOnlinePlayer(player.uuid) ?: return true + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return true if (serverPlayer.health <= 1) return true if (!serverPlayer.isAlive) return true if (serverPlayer.isRemoved) return true diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt index ad5a82c0..afedcc57 100644 --- a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt +++ b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt @@ -16,13 +16,15 @@ import ru.astrainteractive.klibs.mikro.core.coroutines.CoroutineFeature import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.PluginTranslation import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import java.io.File class CoreModule( val dispatchers: KotlinDispatchers, - val dataFolder: File + val dataFolder: File, + val effectEmitter: EffectEmitter ) : Logger by JUtiltLogger("CoreModule").withoutParentHandlers() { val ioScope = CoroutineFeature.IO.withTimings() diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/EffectEmitter.kt b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt similarity index 89% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/EffectEmitter.kt rename to modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt index eba6ab87..548f7b37 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/EffectEmitter.kt +++ b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt @@ -1,4 +1,4 @@ -package ru.astrainteractive.soulkeeper.module.souls.platform +package ru.astrainteractive.soulkeeper.core.platform import ru.astrainteractive.astralibs.server.location.KLocation import ru.astrainteractive.astralibs.server.player.OnlineKPlayer diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/Experienced.kt b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt similarity index 70% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/Experienced.kt rename to modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt index 00cd4f2c..4c28fc5a 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/Experienced.kt +++ b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt @@ -1,4 +1,4 @@ -package ru.astrainteractive.soulkeeper.module.souls.platform +package ru.astrainteractive.soulkeeper.core.platform interface Experienced { fun giveExperience(experience: Int) diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/IsDeadPlayerProvider.kt b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt similarity index 70% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/IsDeadPlayerProvider.kt rename to modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt index 5b275a8b..d363ff78 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/IsDeadPlayerProvider.kt +++ b/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt @@ -1,4 +1,4 @@ -package ru.astrainteractive.soulkeeper.module.souls.platform +package ru.astrainteractive.soulkeeper.core.platform import ru.astrainteractive.astralibs.server.player.OnlineKPlayer diff --git a/modules/event-bukkit/build.gradle.kts b/modules/event-bukkit/build.gradle.kts index d5ba3618..b160da44 100644 --- a/modules/event-bukkit/build.gradle.kts +++ b/modules/event-bukkit/build.gradle.kts @@ -15,4 +15,5 @@ dependencies { implementation(projects.modules.core) implementation(projects.modules.coreBukkit) implementation(projects.modules.dao) + implementation(projects.modules.service) } diff --git a/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt b/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt index 2f7021d7..0909aa0a 100644 --- a/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt +++ b/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt @@ -17,7 +17,8 @@ class BukkitEventModule( soulsConfigKrate = coreModule.soulsConfigKrate, ioScope = coreModule.ioScope, dataFolder = coreModule.dataFolder, - stringFormat = coreModule.yamlFormat + stringFormat = coreModule.yamlFormat, + effectEmitter = coreModule.effectEmitter ) val lifecycle = Lifecycle.Lambda( onEnable = { diff --git a/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt b/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt index 1ca0e388..7f0339a7 100644 --- a/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt +++ b/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt @@ -4,22 +4,21 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import kotlinx.serialization.StringFormat import org.bukkit.World -import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.entity.PlayerDeathEvent import ru.astrainteractive.astralibs.event.EventListener import ru.astrainteractive.astralibs.server.location.KLocation -import ru.astrainteractive.astralibs.server.util.asBukkitLocation +import ru.astrainteractive.astralibs.server.player.OnlineKPlayer import ru.astrainteractive.astralibs.server.util.asKLocation +import ru.astrainteractive.astralibs.server.util.asOnlineMinecraftPlayer import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.api.getValue import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.core.serialization.ItemStackSerializer -import ru.astrainteractive.soulkeeper.core.util.playSoundForPlayer -import ru.astrainteractive.soulkeeper.core.util.spawnParticleForPlayer import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject @@ -34,6 +33,7 @@ internal class BukkitSoulEvents( private val dataFolder: File, private val stringFormat: StringFormat, soulsConfigKrate: CachedKrate, + private val effectEmitter: EffectEmitter, ) : EventListener, Logger by JUtiltLogger("SoulKeeper-BukkitSoulEvents") { private val soulsConfig by soulsConfigKrate @@ -75,13 +75,17 @@ internal class BukkitSoulEvents( } } - private fun playEffects(soul: DefaultSoul, player: Player) { - soul.location - .asBukkitLocation() - .spawnParticleForPlayer(player, soulsConfig.particles.soulCreated) - soul.location - .asBukkitLocation() - .playSoundForPlayer(player, soulsConfig.sounds.soulDropped) + private fun playEffects(soul: DefaultSoul, player: OnlineKPlayer) { + effectEmitter.spawnParticleForPlayer( + location = soul.location, + player = player, + config = soulsConfig.particles.soulCreated + ) + effectEmitter.playSoundForPlayer( + location = soul.location, + player = player, + sound = soulsConfig.sounds.soulDropped + ) } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) @@ -110,6 +114,6 @@ internal class BukkitSoulEvents( } ioScope.launch { soulsDao.insertSoul(soul) } info { "#playerDeathEvent soul: $soul" } - playEffects(soul, event.player) + playEffects(soul, event.player.asOnlineMinecraftPlayer()) } } diff --git a/modules/event-forge/build.gradle.kts b/modules/event-forge/build.gradle.kts index 83bbc74a..249c407a 100644 --- a/modules/event-forge/build.gradle.kts +++ b/modules/event-forge/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { implementation(libs.klibs.mikro.core) // Local implementation(projects.modules.core) + implementation(projects.modules.coreForge) implementation(projects.modules.dao) implementation(projects.modules.service) implementation(projects.modules.serviceForge) diff --git a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt index 0b270e1b..969a22c5 100644 --- a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt +++ b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt @@ -2,9 +2,9 @@ package ru.astrainteractive.soulkeeper.module.event.di import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.module.event.event.ForgeSoulEvents import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter class ForgeEventModule( coreModule: CoreModule, diff --git a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt index 48bf4397..f9eeff80 100644 --- a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt +++ b/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt @@ -28,13 +28,13 @@ import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger import ru.astrainteractive.klibs.mikro.core.util.tryCast +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject import ru.astrainteractive.soulkeeper.module.souls.krate.PlayerSoulKrate -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import java.io.File import java.time.Instant diff --git a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt b/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt index 0b270e1b..969a22c5 100644 --- a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt +++ b/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt @@ -2,9 +2,9 @@ package ru.astrainteractive.soulkeeper.module.event.di import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.module.event.event.ForgeSoulEvents import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter class ForgeEventModule( coreModule: CoreModule, diff --git a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt b/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt index 3e732cc7..20fe1023 100644 --- a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt +++ b/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt @@ -28,14 +28,13 @@ import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger import ru.astrainteractive.klibs.mikro.core.util.tryCast +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject import ru.astrainteractive.soulkeeper.module.souls.krate.PlayerSoulKrate -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import java.io.File import java.time.Instant import kotlin.collections.isNotEmpty diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt b/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt index cf978719..9b5adcc5 100644 --- a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt +++ b/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt @@ -4,17 +4,15 @@ import ru.astrainteractive.astralibs.server.bridge.BukkitPlatformServer import ru.astrainteractive.astralibs.server.bridge.PlatformServer import ru.astrainteractive.soulkeeper.core.di.BukkitCoreModule import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.core.platform.BukkitExperienced +import ru.astrainteractive.soulkeeper.core.platform.BukkitIsDeadPlayerProvider +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.domain.BukkitAddSoulItemsIntoInventoryUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.BukkitPickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.ShowArmorStandUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.di.factory.ShowArmorStandUseCaseFactory -import ru.astrainteractive.soulkeeper.module.souls.platform.BukkitEffectEmitter import ru.astrainteractive.soulkeeper.module.souls.platform.BukkitEventProvider -import ru.astrainteractive.soulkeeper.module.souls.platform.BukkitExperienced -import ru.astrainteractive.soulkeeper.module.souls.platform.BukkitIsDeadPlayerProvider -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.platform.event.EventProvider class BukkitPlatformServiceModule( @@ -23,7 +21,6 @@ class BukkitPlatformServiceModule( soulsDaoModule: SoulsDaoModule, ) : PlatformServiceModule { override val platformServer: PlatformServer = BukkitPlatformServer() - override val effectEmitter: EffectEmitter = BukkitEffectEmitter override val eventProvider: EventProvider = BukkitEventProvider( plugin = bukkitCoreModule.plugin ) @@ -34,7 +31,8 @@ class BukkitPlatformServiceModule( override val pickUpItemsUseCase: PickUpItemsUseCase = BukkitPickUpItemsUseCase( collectItemSoundProvider = { coreModule.soulsConfigKrate.cachedValue.sounds.collectItem }, soulsDao = soulsDaoModule.soulsDao, - dispatchers = coreModule.dispatchers + dispatchers = coreModule.dispatchers, + effectEmitter = coreModule.effectEmitter ) override val addSoulItemsIntoInventoryUseCase = BukkitAddSoulItemsIntoInventoryUseCase() } diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt b/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt index 6de1fd38..f4030af5 100644 --- a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt +++ b/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt @@ -3,13 +3,12 @@ package ru.astrainteractive.soulkeeper.module.souls.domain import kotlinx.coroutines.withContext import org.bukkit.Bukkit import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.asBukkitLocation import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.core.serialization.ItemStackSerializer -import ru.astrainteractive.soulkeeper.core.util.playSoundForPlayer import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject @@ -18,7 +17,8 @@ import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase.Out internal class BukkitPickUpItemsUseCase( private val collectItemSoundProvider: () -> SoulsConfig.Sounds.SoundConfig, private val soulsDao: SoulsDao, - private val dispatchers: KotlinDispatchers + private val dispatchers: KotlinDispatchers, + private val effectEmitter: EffectEmitter ) : PickUpItemsUseCase, Logger by JUtiltLogger("SoulKeeper-PickUpItemsUseCase") { @@ -49,12 +49,11 @@ internal class BukkitPickUpItemsUseCase( } if (notAddedItems != soul.items) { withContext(dispatchers.Main) { - soul.location - .asBukkitLocation() - .playSoundForPlayer( - player = bukkitPlayer, - sound = collectItemSoundProvider.invoke() - ) + effectEmitter.playSoundForPlayer( + location = soul.location, + player = player, + sound = collectItemSoundProvider.invoke() + ) } } diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEffectEmitter.kt b/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEffectEmitter.kt deleted file mode 100644 index 14ff6dc6..00000000 --- a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEffectEmitter.kt +++ /dev/null @@ -1,31 +0,0 @@ -package ru.astrainteractive.soulkeeper.module.souls.platform - -import org.bukkit.Bukkit -import ru.astrainteractive.astralibs.server.location.KLocation -import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.asBukkitLocation -import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig -import ru.astrainteractive.soulkeeper.core.util.playSoundForPlayer -import ru.astrainteractive.soulkeeper.core.util.spawnParticleForPlayer - -internal object BukkitEffectEmitter : EffectEmitter { - override fun playSoundForPlayer( - location: KLocation, - player: OnlineKPlayer, - sound: SoulsConfig.Sounds.SoundConfig - ) { - val bukkitPlayer = Bukkit.getPlayer(player.uuid) ?: return - location.asBukkitLocation() - .playSoundForPlayer(bukkitPlayer, sound) - } - - override fun spawnParticleForPlayer( - location: KLocation, - player: OnlineKPlayer, - config: SoulsConfig.Particles.Particle - ) { - val bukkitPlayer = Bukkit.getPlayer(player.uuid) ?: return - location.asBukkitLocation() - .spawnParticleForPlayer(bukkitPlayer, config) - } -} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt index c16ac69a..5a0cce09 100644 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt @@ -1,27 +1,24 @@ package ru.astrainteractive.soulkeeper.module.souls.di -import ru.astrainteractive.astralibs.server.bridge.ForgePlatformServer +import ru.astrainteractive.astralibs.server.bridge.MinecraftPlatformServer import ru.astrainteractive.astralibs.server.bridge.PlatformServer import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.domain.ForgeAddSoulItemsIntoInventoryUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.ForgePickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.ShowArmorStandUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.StubShowArmorStandUseCase -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeEffectEmitter import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeEventProvider import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeExperienced import ru.astrainteractive.soulkeeper.module.souls.platform.ForgeIsDeadPlayerProvider -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.platform.event.EventProvider class ForgePlatformServiceModule( coreModule: CoreModule, soulsDaoModule: SoulsDaoModule, ) : PlatformServiceModule { - override val platformServer: PlatformServer = ForgePlatformServer - override val effectEmitter: EffectEmitter = ForgeEffectEmitter() + override val platformServer: PlatformServer = MinecraftPlatformServer override val eventProvider: EventProvider = ForgeEventProvider override val isDeadPlayerProvider: IsDeadPlayerProvider = ForgeIsDeadPlayerProvider @@ -30,7 +27,7 @@ class ForgePlatformServiceModule( override val pickUpItemsUseCase: PickUpItemsUseCase = ForgePickUpItemsUseCase( collectItemSoundProvider = { coreModule.soulsConfigKrate.cachedValue.sounds.collectItem }, soulsDao = soulsDaoModule.soulsDao, - effectEmitter = effectEmitter, + effectEmitter = coreModule.effectEmitter, isDeadPlayerProvider = isDeadPlayerProvider, dispatchers = coreModule.dispatchers ) diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt index 226e373d..af189697 100644 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt @@ -1,12 +1,12 @@ package ru.astrainteractive.soulkeeper.module.souls.domain -import ru.astrainteractive.astralibs.server.player.ForgeOnlineKPlayer +import ru.astrainteractive.astralibs.server.player.MinecraftOnlineKPlayer import ru.astrainteractive.astralibs.server.player.OnlineKPlayer import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import ru.astrainteractive.soulkeeper.module.souls.util.addItems @@ -20,7 +20,7 @@ class ForgeAddSoulItemsIntoInventoryUseCase( player: OnlineKPlayer, soul: DefaultSoul ) { - require(player is ForgeOnlineKPlayer) { + require(player is MinecraftOnlineKPlayer) { "Player must be ForgeOnlineKPlayer" } val items = soul?.items diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt index fe25fd57..f03fc1d8 100644 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt @@ -2,18 +2,18 @@ package ru.astrainteractive.soulkeeper.module.souls.domain import kotlinx.coroutines.withContext import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase.Output -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import ru.astrainteractive.soulkeeper.module.souls.util.addItems @@ -28,7 +28,7 @@ internal class ForgePickUpItemsUseCase( override suspend fun invoke(player: OnlineKPlayer, soul: ItemDatabaseSoul): Output { if (soul.items.isEmpty()) return Output.NoItemsPresent - val serverPlayer = ForgeUtil.getOnlinePlayer(player.uuid) ?: return Output.SomeItemsRemain + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return Output.SomeItemsRemain if (serverPlayer.abilities.instabuild) return Output.SomeItemsRemain if (serverPlayer.gameMode.isCreative) return Output.SomeItemsRemain diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt deleted file mode 100644 index 4d6bb2b7..00000000 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt +++ /dev/null @@ -1,42 +0,0 @@ -package ru.astrainteractive.soulkeeper.module.souls.platform - -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import net.minecraft.nbt.CompoundTag -import net.minecraft.nbt.TagParser -import net.minecraft.world.item.ItemStack - -object ItemStackSerializer : KSerializer { - override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( - serialName = "AstraLibs.Forge.ItemStack.Json", - kind = PrimitiveKind.STRING - ) - - override fun serialize(encoder: Encoder, value: ItemStack) { - encoder.encodeString(encodeToString(value)) - } - - override fun deserialize(decoder: Decoder): ItemStack { - return decodeFromString(decoder.decodeString()).getOrThrow() - } - - fun encodeToString(itemStack: ItemStack): String { - return itemStack.save(CompoundTag()).toString() - } - - fun decodeFromString(string: String): Result = runCatching { - ItemStack.of(parseNbt(string)) - } - - private fun parseNbt(string: String): CompoundTag { - return try { - TagParser.parseTag(string) - } catch (e: Exception) { - throw IllegalArgumentException("Could not parse ItemStack string: $string", e) - } - } -} diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt index 0f8852b2..48e2f296 100644 --- a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt +++ b/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt @@ -2,7 +2,7 @@ package ru.astrainteractive.soulkeeper.module.souls.util import net.minecraft.world.item.ItemStack import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.ForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer /** @@ -16,7 +16,7 @@ internal fun OnlineKPlayer.addItems( return items .mapNotNull { stack -> if (!isDead.invoke(this)) { - val inventory = ForgeUtil.getOnlinePlayer(uuid)?.inventory + val inventory = MinecraftUtil.getOnlinePlayer(uuid)?.inventory inventory?.add(stack) inventory?.setChanged() } diff --git a/modules/service-neoforge/build.gradle.kts b/modules/service-neoforge/build.gradle.kts index 5b01073a..322dcbc3 100644 --- a/modules/service-neoforge/build.gradle.kts +++ b/modules/service-neoforge/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { testImplementation(libs.tests.kotlin.test) // Local implementation(projects.modules.core) + implementation(projects.modules.coreNeoforge) implementation(projects.modules.dao) implementation(projects.modules.service) } diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt index 12492d3d..711d91e0 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt +++ b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt @@ -1,15 +1,15 @@ package ru.astrainteractive.soulkeeper.module.souls.di -import ru.astrainteractive.astralibs.server.bridge.NeoForgePlatformServer +import ru.astrainteractive.astralibs.server.bridge.MinecraftPlatformServer import ru.astrainteractive.astralibs.server.bridge.PlatformServer import ru.astrainteractive.soulkeeper.core.di.CoreModule +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.domain.NeoForgeAddSoulItemsIntoInventoryUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.NeoForgePickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.ShowArmorStandUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.StubShowArmorStandUseCase -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeEffectEmitter import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeEventProvider import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeExperienced @@ -20,7 +20,7 @@ class NeoForgePlatformServiceModule( coreModule: CoreModule, soulsDaoModule: SoulsDaoModule, ) : PlatformServiceModule { - override val platformServer: PlatformServer = NeoForgePlatformServer + override val platformServer: PlatformServer = MinecraftPlatformServer override val effectEmitter: EffectEmitter = NeoForgeEffectEmitter() override val eventProvider: EventProvider = NeoForgeEventProvider override val isDeadPlayerProvider: IsDeadPlayerProvider = NeoForgeIsDeadPlayerProvider diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt index 1a772521..b8a1f94f 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt +++ b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt @@ -1,13 +1,12 @@ package ru.astrainteractive.soulkeeper.module.souls.domain -import ru.astrainteractive.astralibs.server.player.NeoForgeOnlineKPlayer +import ru.astrainteractive.astralibs.server.player.MinecraftOnlineKPlayer import ru.astrainteractive.astralibs.server.player.OnlineKPlayer import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider -import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import ru.astrainteractive.soulkeeper.module.souls.util.addItems class NeoForgeAddSoulItemsIntoInventoryUseCase( @@ -20,7 +19,7 @@ class NeoForgeAddSoulItemsIntoInventoryUseCase( player: OnlineKPlayer, soul: DefaultSoul ) { - require(player is NeoForgeOnlineKPlayer) { + require(player is MinecraftOnlineKPlayer) { "Player must be BukkitOnlineKPlayer" } val items = soul?.items diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt index 0afacda8..55404188 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt +++ b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt @@ -2,19 +2,18 @@ package ru.astrainteractive.soulkeeper.module.souls.domain import kotlinx.coroutines.withContext import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.NeoForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase.Output -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider -import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import ru.astrainteractive.soulkeeper.module.souls.util.addItems internal class NeoForgePickUpItemsUseCase( @@ -28,7 +27,7 @@ internal class NeoForgePickUpItemsUseCase( override suspend fun invoke(player: OnlineKPlayer, soul: ItemDatabaseSoul): Output { if (soul.items.isEmpty()) return Output.NoItemsPresent - val serverPlayer = NeoForgeUtil.getOnlinePlayer(player.uuid) ?: return Output.SomeItemsRemain + val serverPlayer = MinecraftUtil.getOnlinePlayer(player.uuid) ?: return Output.SomeItemsRemain if (serverPlayer.abilities.instabuild) return Output.SomeItemsRemain if (serverPlayer.gameMode.isCreative) return Output.SomeItemsRemain diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt index 5274b3b5..48e2f296 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt +++ b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt @@ -2,7 +2,7 @@ package ru.astrainteractive.soulkeeper.module.souls.util import net.minecraft.world.item.ItemStack import ru.astrainteractive.astralibs.server.player.OnlineKPlayer -import ru.astrainteractive.astralibs.server.util.NeoForgeUtil +import ru.astrainteractive.astralibs.server.util.MinecraftUtil import ru.astrainteractive.astralibs.server.util.getOnlinePlayer /** @@ -16,7 +16,7 @@ internal fun OnlineKPlayer.addItems( return items .mapNotNull { stack -> if (!isDead.invoke(this)) { - val inventory = NeoForgeUtil.getOnlinePlayer(uuid)?.inventory + val inventory = MinecraftUtil.getOnlinePlayer(uuid)?.inventory inventory?.add(stack) inventory?.setChanged() } diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt index c7b2d8d2..c9e696a6 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt +++ b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt @@ -2,18 +2,16 @@ package ru.astrainteractive.soulkeeper.module.souls.di import ru.astrainteractive.astralibs.server.bridge.PlatformServer import ru.astrainteractive.astralibs.server.player.OnlineKPlayer +import ru.astrainteractive.soulkeeper.core.platform.Experienced +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.domain.AddSoulItemsIntoInventoryUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.ShowArmorStandUseCase -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.Experienced -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.platform.event.EventProvider interface PlatformServiceModule { val platformServer: PlatformServer - val effectEmitter: EffectEmitter val eventProvider: EventProvider val isDeadPlayerProvider: IsDeadPlayerProvider val onlineMinecraftPlayerExperiencedFactory: Experienced.Factory diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt index c5734a5c..80b9cd31 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt +++ b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt @@ -33,12 +33,12 @@ class ServiceModule( private val soulParticleRenderer = SoulParticleRenderer( soulsConfigKrate = coreModule.soulsConfigKrate, dispatchers = coreModule.dispatchers, - effectEmitter = platformServiceModule.effectEmitter + effectEmitter = coreModule.effectEmitter ) private val soulSoundRenderer = SoulSoundRenderer( dispatchers = coreModule.dispatchers, soulsConfigKrate = coreModule.soulsConfigKrate, - effectEmitter = platformServiceModule.effectEmitter + effectEmitter = coreModule.effectEmitter ) private val deleteSoulService = ThrottleTickFlowService( @@ -71,7 +71,7 @@ class ServiceModule( private val pickUpExpUseCase: PickUpExpUseCase = PickUpExpUseCase( collectXpSoundProvider = { coreModule.soulsConfigKrate.cachedValue.sounds.collectXp }, soulsDao = soulsDaoModule.soulsDao, - effectEmitter = platformServiceModule.effectEmitter, + effectEmitter = coreModule.effectEmitter, experiencedFactory = platformServiceModule.onlineMinecraftPlayerExperiencedFactory, dispatchers = coreModule.dispatchers ) @@ -92,7 +92,7 @@ class ServiceModule( soulContentLeftSoundProvider = { coreModule.soulsConfigKrate.cachedValue.sounds.soulContentLeft }, - effectEmitter = platformServiceModule.effectEmitter + effectEmitter = coreModule.effectEmitter ), getNearestSoulUseCase = GetNearestSoulUseCase( soulsDao = soulsDaoModule.soulsDao, diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt index a91f1c5f..f2ca9983 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt +++ b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt @@ -5,11 +5,11 @@ import ru.astrainteractive.astralibs.server.player.OnlineKPlayer import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter +import ru.astrainteractive.soulkeeper.core.platform.Experienced import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter -import ru.astrainteractive.soulkeeper.module.souls.platform.Experienced class PickUpExpUseCase( private val collectXpSoundProvider: () -> SoulsConfig.Sounds.SoundConfig, diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt index 5f8e69ac..e3527d23 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt +++ b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt @@ -5,10 +5,10 @@ import ru.astrainteractive.astralibs.server.player.OnlineKPlayer import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter @Suppress("LongParameterList") internal class PickUpSoulUseCase( diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt index 75900586..66adc7f1 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt +++ b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt @@ -5,9 +5,9 @@ import ru.astrainteractive.astralibs.server.player.OnlineKPlayer import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.api.getValue import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.database.model.DatabaseSoul -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter import ru.astrainteractive.soulkeeper.module.souls.renderer.api.SoulEffectRenderer class SoulParticleRenderer( diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt index 00ae86bb..a74d7b40 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt +++ b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt @@ -5,9 +5,9 @@ import ru.astrainteractive.astralibs.server.player.OnlineKPlayer import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.api.getValue import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers +import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.plugin.SoulsConfig import ru.astrainteractive.soulkeeper.module.souls.database.model.DatabaseSoul -import ru.astrainteractive.soulkeeper.module.souls.platform.EffectEmitter import ru.astrainteractive.soulkeeper.module.souls.renderer.api.SoulEffectRenderer class SoulSoundRenderer( diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt index 0da705c2..ab65ae3d 100644 --- a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt +++ b/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt @@ -8,10 +8,10 @@ import ru.astrainteractive.astralibs.server.bridge.PlatformServer import ru.astrainteractive.astralibs.service.ServiceExecutor import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.domain.GetNearestSoulUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpSoulUseCase -import ru.astrainteractive.soulkeeper.module.souls.platform.IsDeadPlayerProvider /** * This worker is required to pick up items diff --git a/settings.gradle.kts b/settings.gradle.kts index 94d77b3b..73d035d2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -46,20 +46,19 @@ dependencyResolutionManagement { enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") rootProject.name = "SoulKeeper" -// Spigot include(":instances:bukkit") -include(":instances:neoforge") include(":instances:forge") -// Modules +include(":instances:neoforge") +include(":modules:command") include(":modules:core") include(":modules:core-bukkit") +include(":modules:core-forge") +include(":modules:core-neoforge") include(":modules:dao") +include(":modules:event-bukkit") +include(":modules:event-forge") +include(":modules:event-neoforge") include(":modules:service") include(":modules:service-bukkit") -include(":modules:service-neoforge") include(":modules:service-forge") -include(":modules:event-bukkit") -include(":modules:event-neoforge") -include(":modules:event-forge") -include(":modules:core-forge") -include(":modules:command") +include(":modules:service-neoforge") From 1a8a62545d4ebdab14eca56c2506d1cc17e0cc45 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 13:31:57 +0300 Subject: [PATCH 05/12] [REFACTOR] Fix modules --- modules/core-neoforge/build.gradle.kts | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 modules/core-neoforge/build.gradle.kts diff --git a/modules/core-neoforge/build.gradle.kts b/modules/core-neoforge/build.gradle.kts new file mode 100644 index 00000000..7f28ee9b --- /dev/null +++ b/modules/core-neoforge/build.gradle.kts @@ -0,0 +1,36 @@ +plugins { + kotlin("jvm") + kotlin("plugin.serialization") +} + +dependencies { + implementation(libs.kotlin.coroutines.core) + implementation(libs.kotlin.serialization.json) + // AstraLibs + implementation(libs.minecraft.astralibs.core) + implementation(libs.minecraft.astralibs.core.neoforge) + implementation(libs.klibs.mikro.core) + // klibs + implementation(projects.modules.core) +} + +dependencies { + compileOnly( + files( + rootProject.project(projects.instances.neoforge.path) + .file(".gradle") + .resolve("repositories") + .resolve("ng_dummy_ng") + .resolve("net") + .resolve("neoforged") + .resolve("neoforge") + .resolve(libs.versions.minecraft.neoforgeversion.get()) + .resolve("neoforge-${libs.versions.minecraft.neoforgeversion.get()}.jar") + ) + ) + compileOnly(libs.minecraft.neoforgeversion) + compileOnly(libs.joml) + compileOnly(libs.minecraft.datafixerupper) + compileOnly(libs.minecraft.brigadier) + compileOnly(libs.minecraft.neoforged.bus) +} From bbdf98260083c6afe03d471ddce8af1845289efc Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 13:32:50 +0300 Subject: [PATCH 06/12] [REFACTOR] Fix modules --- .../kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt | 2 +- .../module/souls/di/NeoForgePlatformServiceModule.kt | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt index 0be505c1..87858ec5 100644 --- a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt +++ b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -58,7 +58,7 @@ class RootModule(private val plugin: Lifecycle) { ForgeEventModule( coreModule = coreModule, soulsDaoModule = soulsDaoModule, - effectEmitter = forgePlatformServiceModule.effectEmitter + effectEmitter = coreModule.effectEmitter ) } private val commandModule by lazy { diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt index 711d91e0..ace0d548 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt +++ b/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt @@ -3,14 +3,12 @@ package ru.astrainteractive.soulkeeper.module.souls.di import ru.astrainteractive.astralibs.server.bridge.MinecraftPlatformServer import ru.astrainteractive.astralibs.server.bridge.PlatformServer import ru.astrainteractive.soulkeeper.core.di.CoreModule -import ru.astrainteractive.soulkeeper.core.platform.EffectEmitter import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.domain.NeoForgeAddSoulItemsIntoInventoryUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.NeoForgePickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.ShowArmorStandUseCase import ru.astrainteractive.soulkeeper.module.souls.domain.armorstand.StubShowArmorStandUseCase -import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeEffectEmitter import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeEventProvider import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeExperienced import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeIsDeadPlayerProvider @@ -21,7 +19,6 @@ class NeoForgePlatformServiceModule( soulsDaoModule: SoulsDaoModule, ) : PlatformServiceModule { override val platformServer: PlatformServer = MinecraftPlatformServer - override val effectEmitter: EffectEmitter = NeoForgeEffectEmitter() override val eventProvider: EventProvider = NeoForgeEventProvider override val isDeadPlayerProvider: IsDeadPlayerProvider = NeoForgeIsDeadPlayerProvider @@ -30,7 +27,7 @@ class NeoForgePlatformServiceModule( override val pickUpItemsUseCase: PickUpItemsUseCase = NeoForgePickUpItemsUseCase( collectItemSoundProvider = { coreModule.soulsConfigKrate.cachedValue.sounds.collectItem }, soulsDao = soulsDaoModule.soulsDao, - effectEmitter = effectEmitter, + effectEmitter = coreModule.effectEmitter, isDeadPlayerProvider = isDeadPlayerProvider, dispatchers = coreModule.dispatchers ) From ce95c8a5d4d7b5dfa3f7da9f9697e9b0a84f7386 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 13:42:39 +0300 Subject: [PATCH 07/12] [REFACTOR] Refactor modules --- instances/bukkit/build.gradle.kts | 10 ++++---- instances/forge/build.gradle.kts | 10 ++++---- instances/neoforge/build.gradle.kts | 10 ++++---- .../soulkeeper/di/RootModule.kt | 5 ++-- modules/command/build.gradle.kts | 4 ++-- modules/core/{ => api}/build.gradle.kts | 0 .../core/datetime/TimeAgoFormatter.kt | 0 .../datetime/TimeAgoTranslationFormatter.kt | 0 .../soulkeeper/core/di/CoreModule.kt | 0 .../soulkeeper/core/platform/EffectEmitter.kt | 0 .../soulkeeper/core/platform/Experienced.kt | 0 .../core/platform/IsDeadPlayerProvider.kt | 0 .../core/plugin/PluginPermission.kt | 0 .../core/plugin/PluginTranslation.kt | 0 .../soulkeeper/core/plugin/SoulsConfig.kt | 0 .../soulkeeper/core/util/FlowCombineExt.kt | 0 .../soulkeeper/core/util/ThrottleExecutor.kt | 0 .../souls/command/TimeAgoFormatterTest.kt | 0 .../bukkit}/build.gradle.kts | 2 +- .../soulkeeper/core/di/BukkitCoreModule.kt | 0 .../core/platform/BukkitEffectEmitter.kt | 0 .../core/platform/BukkitExperienced.kt | 0 .../platform/BukkitIsDeadPlayerProvider.kt | 0 .../core/serialization/ItemStackSerializer.kt | 0 .../forge}/build.gradle.kts | 4 ++-- .../souls/platform/ForgeEffectEmitter.kt | 0 .../module/souls/platform/ForgeExperienced.kt | 0 .../platform/ForgeIsDeadPlayerProvider.kt | 0 .../souls/platform/ItemStackSerializer.kt | 0 .../neoforge}/build.gradle.kts | 2 +- .../souls/platform/ItemStackSerializer.kt | 0 .../souls/platform/NeoForgeEffectEmitter.kt | 0 .../souls/platform/NeoForgeExperienced.kt | 0 .../platform/NeoForgeIsDeadPlayerProvider.kt | 0 .../bukkit}/build.gradle.kts | 6 ++--- .../module/event/di/BukkitEventModule.kt | 0 .../module/event/event/BukkitSoulEvents.kt | 0 .../forge}/build.gradle.kts | 8 +++---- .../module/event/di/ForgeEventModule.kt | 0 .../module/event/event/ForgeSoulEvents.kt | 0 .../neoforge}/build.gradle.kts | 7 +++--- .../module/event/di/ForgeEventModule.kt | 0 .../module/event/event/ForgeSoulEvents.kt | 1 + modules/service/{ => api}/build.gradle.kts | 2 +- .../core/service/ThrottleTickFlowService.kt | 0 .../module/souls/di/PlatformServiceModule.kt | 0 .../module/souls/di/ServiceModule.kt | 0 .../AddSoulItemsIntoInventoryUseCase.kt | 0 .../souls/domain/GetNearestSoulUseCase.kt | 0 .../module/souls/domain/PickUpExpUseCase.kt | 0 .../module/souls/domain/PickUpItemsUseCase.kt | 0 .../module/souls/domain/PickUpSoulUseCase.kt | 0 .../armorstand/ShowArmorStandUseCase.kt | 0 .../armorstand/StubShowArmorStandUseCase.kt | 0 .../souls/platform/event/EventProvider.kt | 0 .../event/model/SharedPlayerJoinEvent.kt | 0 .../event/model/SharedPlayerLeaveEvent.kt | 0 .../event/model/SharedPlayerMoveEvent.kt | 0 .../souls/renderer/ArmorStandRenderer.kt | 0 .../souls/renderer/SoulParticleRenderer.kt | 0 .../souls/renderer/SoulSoundRenderer.kt | 0 .../souls/renderer/api/SoulEffectRenderer.kt | 0 .../module/souls/service/DeleteSoulWorker.kt | 0 .../module/souls/service/FreeSoulWorker.kt | 0 .../module/souls/service/PickUpWorker.kt | 0 .../module/souls/service/SoulCallWorker.kt | 0 .../bukkit}/build.gradle.kts | 6 ++--- .../souls/di/BukkitPlatformServiceModule.kt | 0 .../BukkitAddSoulItemsIntoInventoryUseCase.kt | 0 .../souls/domain/BukkitPickUpItemsUseCase.kt | 0 .../PacketEventsShowArmorStandUseCase.kt | 0 .../factory/ShowArmorStandUseCaseFactory.kt | 0 .../souls/platform/BukkitEventProvider.kt | 0 .../forge}/build.gradle.kts | 6 ++--- .../souls/di/ForgePlatformServiceModule.kt | 0 .../ForgeAddSoulItemsIntoInventoryUseCase.kt | 0 .../souls/domain/ForgePickUpItemsUseCase.kt | 0 .../souls/platform/ForgeEventProvider.kt | 0 .../module/souls/util/OnlineKPlayerExt.kt | 0 .../neoforge}/build.gradle.kts | 6 ++--- .../souls/di/NeoForgePlatformServiceModule.kt | 0 ...eoForgeAddSoulItemsIntoInventoryUseCase.kt | 1 + .../domain/NeoForgePickUpItemsUseCase.kt | 1 + .../souls/platform/NeoForgeEventProvider.kt | 0 .../module/souls/util/OnlineKPlayerExt.kt | 0 settings.gradle.kts | 23 ++++++++++--------- 86 files changed, 60 insertions(+), 54 deletions(-) rename modules/core/{ => api}/build.gradle.kts (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoFormatter.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoTranslationFormatter.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginPermission.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginTranslation.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/SoulsConfig.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/FlowCombineExt.kt (100%) rename modules/core/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/ThrottleExecutor.kt (100%) rename modules/core/{ => api}/src/test/kotlin/ru/astrainteractive/soulkeeper/module/souls/command/TimeAgoFormatterTest.kt (100%) rename modules/{core-bukkit => core/bukkit}/build.gradle.kts (92%) rename modules/{core-bukkit => core/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/BukkitCoreModule.kt (100%) rename modules/{core-bukkit => core/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt (100%) rename modules/{core-bukkit => core/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt (100%) rename modules/{core-bukkit => core/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt (100%) rename modules/{core-bukkit => core/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/serialization/ItemStackSerializer.kt (100%) rename modules/{core-forge => core/forge}/build.gradle.kts (91%) rename modules/{core-forge => core/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt (100%) rename modules/{core-forge => core/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt (100%) rename modules/{core-forge => core/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt (100%) rename modules/{core-forge => core/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt (100%) rename modules/{core-neoforge => core/neoforge}/build.gradle.kts (95%) rename modules/{core-neoforge => core/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt (100%) rename modules/{core-neoforge => core/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt (100%) rename modules/{core-neoforge => core/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt (100%) rename modules/{core-neoforge => core/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt (100%) rename modules/{event-bukkit => event/bukkit}/build.gradle.kts (74%) rename modules/{event-bukkit => event/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt (100%) rename modules/{event-bukkit => event/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt (100%) rename modules/{event-forge => event/forge}/build.gradle.kts (85%) rename modules/{event-forge => event/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt (100%) rename modules/{event-forge => event/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt (100%) rename modules/{event-neoforge => event/neoforge}/build.gradle.kts (84%) rename modules/{event-neoforge => event/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt (100%) rename modules/{event-neoforge => event/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt (99%) rename modules/service/{ => api}/build.gradle.kts (93%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/core/service/ThrottleTickFlowService.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/AddSoulItemsIntoInventoryUseCase.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/GetNearestSoulUseCase.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpItemsUseCase.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/ShowArmorStandUseCase.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/StubShowArmorStandUseCase.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/EventProvider.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerJoinEvent.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerLeaveEvent.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerMoveEvent.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/ArmorStandRenderer.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/api/SoulEffectRenderer.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/DeleteSoulWorker.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/FreeSoulWorker.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt (100%) rename modules/service/{ => api}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/SoulCallWorker.kt (100%) rename modules/{service-bukkit => service/bukkit}/build.gradle.kts (86%) rename modules/{service-bukkit => service/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt (100%) rename modules/{service-bukkit => service/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitAddSoulItemsIntoInventoryUseCase.kt (100%) rename modules/{service-bukkit => service/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt (100%) rename modules/{service-bukkit => service/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/PacketEventsShowArmorStandUseCase.kt (100%) rename modules/{service-bukkit => service/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/di/factory/ShowArmorStandUseCaseFactory.kt (100%) rename modules/{service-bukkit => service/bukkit}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEventProvider.kt (100%) rename modules/{service-forge => service/forge}/build.gradle.kts (91%) rename modules/{service-forge => service/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt (100%) rename modules/{service-forge => service/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt (100%) rename modules/{service-forge => service/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt (100%) rename modules/{service-forge => service/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt (100%) rename modules/{service-forge => service/forge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt (100%) rename modules/{service-neoforge => service/neoforge}/build.gradle.kts (90%) rename modules/{service-neoforge => service/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt (100%) rename modules/{service-neoforge => service/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt (94%) rename modules/{service-neoforge => service/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt (97%) rename modules/{service-neoforge => service/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEventProvider.kt (100%) rename modules/{service-neoforge => service/neoforge}/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt (100%) diff --git a/instances/bukkit/build.gradle.kts b/instances/bukkit/build.gradle.kts index ca99c0fb..22d3d8e8 100644 --- a/instances/bukkit/build.gradle.kts +++ b/instances/bukkit/build.gradle.kts @@ -28,12 +28,12 @@ dependencies { compileOnly(libs.minecraft.luckperms) compileOnly(libs.minecraft.discordsrv) compileOnly(libs.minecraft.essentialsx) - implementation(projects.modules.core) - implementation(projects.modules.coreBukkit) - implementation(projects.modules.eventBukkit) + implementation(projects.modules.core.api) + implementation(projects.modules.core.bukkit) + implementation(projects.modules.event.bukkit) implementation(projects.modules.dao) - implementation(projects.modules.service) - implementation(projects.modules.serviceBukkit) + implementation(projects.modules.service.api) + implementation(projects.modules.service.bukkit) implementation(projects.modules.command) } diff --git a/instances/forge/build.gradle.kts b/instances/forge/build.gradle.kts index a99c38a9..21da880c 100644 --- a/instances/forge/build.gradle.kts +++ b/instances/forge/build.gradle.kts @@ -35,13 +35,13 @@ dependencies { shadow(libs.minecraft.kyori.legacy) shadow(libs.minecraft.kyori.gson) // Local - shadow(projects.modules.core) + shadow(projects.modules.core.api) shadow(projects.modules.command) shadow(projects.modules.dao) - shadow(projects.modules.service) - shadow(projects.modules.coreForge) - shadow(projects.modules.serviceForge) - shadow(projects.modules.eventForge) + shadow(projects.modules.service.api) + shadow(projects.modules.core.forge) + shadow(projects.modules.service.forge) + shadow(projects.modules.event.forge) } tasks.named("processResources") { filteringCharset = "UTF-8" diff --git a/instances/neoforge/build.gradle.kts b/instances/neoforge/build.gradle.kts index 99c37463..c682b130 100644 --- a/instances/neoforge/build.gradle.kts +++ b/instances/neoforge/build.gradle.kts @@ -32,13 +32,13 @@ dependencies { shadow(libs.minecraft.kyori.legacy) shadow(libs.minecraft.kyori.gson) // Local - shadow(projects.modules.core) - shadow(projects.modules.coreNeoforge) + shadow(projects.modules.core.api) + shadow(projects.modules.core.neoforge) shadow(projects.modules.command) shadow(projects.modules.dao) - shadow(projects.modules.service) - shadow(projects.modules.serviceNeoforge) - shadow(projects.modules.eventNeoforge) + shadow(projects.modules.service.api) + shadow(projects.modules.service.neoforge) + shadow(projects.modules.event.neoforge) } tasks.named("processResources") { diff --git a/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt index 302a3ba7..5ef6b823 100644 --- a/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt +++ b/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -13,6 +13,7 @@ import ru.astrainteractive.soulkeeper.module.souls.di.NeoForgePlatformServiceMod import ru.astrainteractive.soulkeeper.module.souls.di.ServiceModule import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule import java.io.File +import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeEffectEmitter class RootModule(private val plugin: Lifecycle) { @@ -28,7 +29,7 @@ class RootModule(private val plugin: Lifecycle) { CoreModule( dataFolder = dataFolder, dispatchers = MinecraftDispatchers(), - effectEmitter = NeoForgeEffectEmitter() + effectEmitter = NeoForgeEffectEmitter ) } @@ -57,7 +58,7 @@ class RootModule(private val plugin: Lifecycle) { ForgeEventModule( coreModule = coreModule, soulsDaoModule = soulsDaoModule, - effectEmitter = forgePlatformServiceModule.effectEmitter + effectEmitter = coreModule.effectEmitter ) } private val commandModule by lazy { diff --git a/modules/command/build.gradle.kts b/modules/command/build.gradle.kts index fe5380fa..c7359f17 100644 --- a/modules/command/build.gradle.kts +++ b/modules/command/build.gradle.kts @@ -13,9 +13,9 @@ dependencies { implementation(libs.minecraft.kyori.api) implementation(libs.klibs.mikro.core) - implementation(projects.modules.core) + implementation(projects.modules.core.api) implementation(projects.modules.dao) - implementation(projects.modules.service) + implementation(projects.modules.service.api) } dependencies { diff --git a/modules/core/build.gradle.kts b/modules/core/api/build.gradle.kts similarity index 100% rename from modules/core/build.gradle.kts rename to modules/core/api/build.gradle.kts diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoFormatter.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoFormatter.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoFormatter.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoFormatter.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoTranslationFormatter.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoTranslationFormatter.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoTranslationFormatter.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/datetime/TimeAgoTranslationFormatter.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/CoreModule.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/EffectEmitter.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/Experienced.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/IsDeadPlayerProvider.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginPermission.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginPermission.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginPermission.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginPermission.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginTranslation.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginTranslation.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginTranslation.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/PluginTranslation.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/SoulsConfig.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/SoulsConfig.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/SoulsConfig.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/plugin/SoulsConfig.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/FlowCombineExt.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/FlowCombineExt.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/FlowCombineExt.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/FlowCombineExt.kt diff --git a/modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/ThrottleExecutor.kt b/modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/ThrottleExecutor.kt similarity index 100% rename from modules/core/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/ThrottleExecutor.kt rename to modules/core/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/util/ThrottleExecutor.kt diff --git a/modules/core/src/test/kotlin/ru/astrainteractive/soulkeeper/module/souls/command/TimeAgoFormatterTest.kt b/modules/core/api/src/test/kotlin/ru/astrainteractive/soulkeeper/module/souls/command/TimeAgoFormatterTest.kt similarity index 100% rename from modules/core/src/test/kotlin/ru/astrainteractive/soulkeeper/module/souls/command/TimeAgoFormatterTest.kt rename to modules/core/api/src/test/kotlin/ru/astrainteractive/soulkeeper/module/souls/command/TimeAgoFormatterTest.kt diff --git a/modules/core-bukkit/build.gradle.kts b/modules/core/bukkit/build.gradle.kts similarity index 92% rename from modules/core-bukkit/build.gradle.kts rename to modules/core/bukkit/build.gradle.kts index 639e62a3..ebdfc0dd 100644 --- a/modules/core-bukkit/build.gradle.kts +++ b/modules/core/bukkit/build.gradle.kts @@ -16,6 +16,6 @@ dependencies { // klibs implementation(libs.klibs.mikro.core) implementation(libs.klibs.mikro.core) - implementation(projects.modules.core) + implementation(projects.modules.core.api) api(libs.klibs.kstorage) } diff --git a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/BukkitCoreModule.kt b/modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/BukkitCoreModule.kt similarity index 100% rename from modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/BukkitCoreModule.kt rename to modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/di/BukkitCoreModule.kt diff --git a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt b/modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt similarity index 100% rename from modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt rename to modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitEffectEmitter.kt diff --git a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt b/modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt similarity index 100% rename from modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt rename to modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitExperienced.kt diff --git a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt b/modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt similarity index 100% rename from modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt rename to modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/platform/BukkitIsDeadPlayerProvider.kt diff --git a/modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/serialization/ItemStackSerializer.kt b/modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/serialization/ItemStackSerializer.kt similarity index 100% rename from modules/core-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/serialization/ItemStackSerializer.kt rename to modules/core/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/core/serialization/ItemStackSerializer.kt diff --git a/modules/core-forge/build.gradle.kts b/modules/core/forge/build.gradle.kts similarity index 91% rename from modules/core-forge/build.gradle.kts rename to modules/core/forge/build.gradle.kts index 29f47b45..2acf1f1b 100644 --- a/modules/core-forge/build.gradle.kts +++ b/modules/core/forge/build.gradle.kts @@ -7,9 +7,9 @@ dependencies { implementation(libs.kotlin.serialization.json) implementation(libs.minecraft.astralibs.core) implementation(libs.minecraft.astralibs.core.forge) - implementation(projects.modules.core) + implementation(projects.modules.core.api) implementation(projects.modules.dao) - implementation(projects.modules.service) + implementation(projects.modules.service.api) } dependencies { diff --git a/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt b/modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt similarity index 100% rename from modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt rename to modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEffectEmitter.kt diff --git a/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt b/modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt similarity index 100% rename from modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt rename to modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeExperienced.kt diff --git a/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt b/modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt similarity index 100% rename from modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt rename to modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeIsDeadPlayerProvider.kt diff --git a/modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt b/modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt similarity index 100% rename from modules/core-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt rename to modules/core/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt diff --git a/modules/core-neoforge/build.gradle.kts b/modules/core/neoforge/build.gradle.kts similarity index 95% rename from modules/core-neoforge/build.gradle.kts rename to modules/core/neoforge/build.gradle.kts index 7f28ee9b..8a935271 100644 --- a/modules/core-neoforge/build.gradle.kts +++ b/modules/core/neoforge/build.gradle.kts @@ -11,7 +11,7 @@ dependencies { implementation(libs.minecraft.astralibs.core.neoforge) implementation(libs.klibs.mikro.core) // klibs - implementation(projects.modules.core) + implementation(projects.modules.core.api) } dependencies { diff --git a/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt similarity index 100% rename from modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt rename to modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ItemStackSerializer.kt diff --git a/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt similarity index 100% rename from modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt rename to modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEffectEmitter.kt diff --git a/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt similarity index 100% rename from modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt rename to modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeExperienced.kt diff --git a/modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt b/modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt similarity index 100% rename from modules/core-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt rename to modules/core/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeIsDeadPlayerProvider.kt diff --git a/modules/event-bukkit/build.gradle.kts b/modules/event/bukkit/build.gradle.kts similarity index 74% rename from modules/event-bukkit/build.gradle.kts rename to modules/event/bukkit/build.gradle.kts index b160da44..c32d6ee9 100644 --- a/modules/event-bukkit/build.gradle.kts +++ b/modules/event/bukkit/build.gradle.kts @@ -12,8 +12,8 @@ dependencies { implementation(libs.minecraft.astralibs.core.bukkit) implementation(libs.klibs.mikro.core) // klibs - implementation(projects.modules.core) - implementation(projects.modules.coreBukkit) + implementation(projects.modules.core.api) + implementation(projects.modules.core.bukkit) implementation(projects.modules.dao) - implementation(projects.modules.service) + implementation(projects.modules.service.api) } diff --git a/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt b/modules/event/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt similarity index 100% rename from modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt rename to modules/event/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/BukkitEventModule.kt diff --git a/modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt b/modules/event/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt similarity index 100% rename from modules/event-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt rename to modules/event/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/BukkitSoulEvents.kt diff --git a/modules/event-forge/build.gradle.kts b/modules/event/forge/build.gradle.kts similarity index 85% rename from modules/event-forge/build.gradle.kts rename to modules/event/forge/build.gradle.kts index 249c407a..bd0e7a8a 100644 --- a/modules/event-forge/build.gradle.kts +++ b/modules/event/forge/build.gradle.kts @@ -11,11 +11,11 @@ dependencies { implementation(libs.minecraft.astralibs.core.forge) implementation(libs.klibs.mikro.core) // Local - implementation(projects.modules.core) - implementation(projects.modules.coreForge) + implementation(projects.modules.core.api) + implementation(projects.modules.core.forge) implementation(projects.modules.dao) - implementation(projects.modules.service) - implementation(projects.modules.serviceForge) + implementation(projects.modules.service.api) + implementation(projects.modules.service.forge) } dependencies { diff --git a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt b/modules/event/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt similarity index 100% rename from modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt rename to modules/event/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt diff --git a/modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt b/modules/event/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt similarity index 100% rename from modules/event-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt rename to modules/event/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt diff --git a/modules/event-neoforge/build.gradle.kts b/modules/event/neoforge/build.gradle.kts similarity index 84% rename from modules/event-neoforge/build.gradle.kts rename to modules/event/neoforge/build.gradle.kts index 24b622e4..41fc61ac 100644 --- a/modules/event-neoforge/build.gradle.kts +++ b/modules/event/neoforge/build.gradle.kts @@ -11,10 +11,11 @@ dependencies { implementation(libs.minecraft.astralibs.core.neoforge) implementation(libs.klibs.mikro.core) // klibs - implementation(projects.modules.core) + implementation(projects.modules.core.api) + implementation(projects.modules.core.neoforge) implementation(projects.modules.dao) - implementation(projects.modules.service) - implementation(projects.modules.serviceNeoforge) + implementation(projects.modules.service.api) + implementation(projects.modules.service.neoforge) } dependencies { diff --git a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt b/modules/event/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt similarity index 100% rename from modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt rename to modules/event/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/di/ForgeEventModule.kt diff --git a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt b/modules/event/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt similarity index 99% rename from modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt rename to modules/event/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt index 20fe1023..d4d72064 100644 --- a/modules/event-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt +++ b/modules/event/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/event/event/ForgeSoulEvents.kt @@ -35,6 +35,7 @@ import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject import ru.astrainteractive.soulkeeper.module.souls.krate.PlayerSoulKrate +import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import java.io.File import java.time.Instant import kotlin.collections.isNotEmpty diff --git a/modules/service/build.gradle.kts b/modules/service/api/build.gradle.kts similarity index 93% rename from modules/service/build.gradle.kts rename to modules/service/api/build.gradle.kts index 267e45ae..48a03ef2 100644 --- a/modules/service/build.gradle.kts +++ b/modules/service/api/build.gradle.kts @@ -19,6 +19,6 @@ dependencies { // Test testImplementation(libs.tests.kotlin.test) // Local - implementation(projects.modules.core) + implementation(projects.modules.core.api) implementation(projects.modules.dao) } diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/core/service/ThrottleTickFlowService.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/service/ThrottleTickFlowService.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/core/service/ThrottleTickFlowService.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/core/service/ThrottleTickFlowService.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/PlatformServiceModule.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ServiceModule.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/AddSoulItemsIntoInventoryUseCase.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/AddSoulItemsIntoInventoryUseCase.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/AddSoulItemsIntoInventoryUseCase.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/AddSoulItemsIntoInventoryUseCase.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/GetNearestSoulUseCase.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/GetNearestSoulUseCase.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/GetNearestSoulUseCase.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/GetNearestSoulUseCase.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpExpUseCase.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpItemsUseCase.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpItemsUseCase.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpItemsUseCase.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpItemsUseCase.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/PickUpSoulUseCase.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/ShowArmorStandUseCase.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/ShowArmorStandUseCase.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/ShowArmorStandUseCase.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/ShowArmorStandUseCase.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/StubShowArmorStandUseCase.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/StubShowArmorStandUseCase.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/StubShowArmorStandUseCase.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/StubShowArmorStandUseCase.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/EventProvider.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/EventProvider.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/EventProvider.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/EventProvider.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerJoinEvent.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerJoinEvent.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerJoinEvent.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerJoinEvent.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerLeaveEvent.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerLeaveEvent.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerLeaveEvent.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerLeaveEvent.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerMoveEvent.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerMoveEvent.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerMoveEvent.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/event/model/SharedPlayerMoveEvent.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/ArmorStandRenderer.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/ArmorStandRenderer.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/ArmorStandRenderer.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/ArmorStandRenderer.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulParticleRenderer.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/SoulSoundRenderer.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/api/SoulEffectRenderer.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/api/SoulEffectRenderer.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/api/SoulEffectRenderer.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/renderer/api/SoulEffectRenderer.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/DeleteSoulWorker.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/DeleteSoulWorker.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/DeleteSoulWorker.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/DeleteSoulWorker.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/FreeSoulWorker.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/FreeSoulWorker.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/FreeSoulWorker.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/FreeSoulWorker.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/PickUpWorker.kt diff --git a/modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/SoulCallWorker.kt b/modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/SoulCallWorker.kt similarity index 100% rename from modules/service/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/SoulCallWorker.kt rename to modules/service/api/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/service/SoulCallWorker.kt diff --git a/modules/service-bukkit/build.gradle.kts b/modules/service/bukkit/build.gradle.kts similarity index 86% rename from modules/service-bukkit/build.gradle.kts rename to modules/service/bukkit/build.gradle.kts index 44c0b93f..7eff8ddc 100644 --- a/modules/service-bukkit/build.gradle.kts +++ b/modules/service/bukkit/build.gradle.kts @@ -25,8 +25,8 @@ dependencies { // Test testImplementation(libs.tests.kotlin.test) // Local - implementation(projects.modules.core) - implementation(projects.modules.coreBukkit) + implementation(projects.modules.core.api) + implementation(projects.modules.core.bukkit) implementation(projects.modules.dao) - implementation(projects.modules.service) + implementation(projects.modules.service.api) } diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt b/modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt similarity index 100% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt rename to modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/BukkitPlatformServiceModule.kt diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitAddSoulItemsIntoInventoryUseCase.kt b/modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitAddSoulItemsIntoInventoryUseCase.kt similarity index 100% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitAddSoulItemsIntoInventoryUseCase.kt rename to modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitAddSoulItemsIntoInventoryUseCase.kt diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt b/modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt similarity index 100% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt rename to modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/BukkitPickUpItemsUseCase.kt diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/PacketEventsShowArmorStandUseCase.kt b/modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/PacketEventsShowArmorStandUseCase.kt similarity index 100% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/PacketEventsShowArmorStandUseCase.kt rename to modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/armorstand/PacketEventsShowArmorStandUseCase.kt diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/di/factory/ShowArmorStandUseCaseFactory.kt b/modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/di/factory/ShowArmorStandUseCaseFactory.kt similarity index 100% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/di/factory/ShowArmorStandUseCaseFactory.kt rename to modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/di/factory/ShowArmorStandUseCaseFactory.kt diff --git a/modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEventProvider.kt b/modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEventProvider.kt similarity index 100% rename from modules/service-bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEventProvider.kt rename to modules/service/bukkit/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/BukkitEventProvider.kt diff --git a/modules/service-forge/build.gradle.kts b/modules/service/forge/build.gradle.kts similarity index 91% rename from modules/service-forge/build.gradle.kts rename to modules/service/forge/build.gradle.kts index 5cccdde5..914a96c8 100644 --- a/modules/service-forge/build.gradle.kts +++ b/modules/service/forge/build.gradle.kts @@ -19,10 +19,10 @@ dependencies { // Test testImplementation(libs.tests.kotlin.test) // Local - implementation(projects.modules.core) + implementation(projects.modules.core.api) implementation(projects.modules.dao) - implementation(projects.modules.service) - implementation(projects.modules.coreForge) + implementation(projects.modules.service.api) + implementation(projects.modules.core.forge) } dependencies { diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt b/modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt similarity index 100% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt rename to modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/ForgePlatformServiceModule.kt diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt b/modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt similarity index 100% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt rename to modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgeAddSoulItemsIntoInventoryUseCase.kt diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt b/modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt similarity index 100% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt rename to modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/ForgePickUpItemsUseCase.kt diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt b/modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt similarity index 100% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt rename to modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/ForgeEventProvider.kt diff --git a/modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt b/modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt similarity index 100% rename from modules/service-forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt rename to modules/service/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt diff --git a/modules/service-neoforge/build.gradle.kts b/modules/service/neoforge/build.gradle.kts similarity index 90% rename from modules/service-neoforge/build.gradle.kts rename to modules/service/neoforge/build.gradle.kts index 322dcbc3..f5d5fb94 100644 --- a/modules/service-neoforge/build.gradle.kts +++ b/modules/service/neoforge/build.gradle.kts @@ -20,10 +20,10 @@ dependencies { // Test testImplementation(libs.tests.kotlin.test) // Local - implementation(projects.modules.core) - implementation(projects.modules.coreNeoforge) + implementation(projects.modules.core.api) + implementation(projects.modules.core.neoforge) implementation(projects.modules.dao) - implementation(projects.modules.service) + implementation(projects.modules.service.api) } dependencies { diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt b/modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt similarity index 100% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt rename to modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/di/NeoForgePlatformServiceModule.kt diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt b/modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt similarity index 94% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt rename to modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt index b8a1f94f..57c1e799 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt +++ b/modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgeAddSoulItemsIntoInventoryUseCase.kt @@ -7,6 +7,7 @@ import ru.astrainteractive.klibs.mikro.core.logging.Logger import ru.astrainteractive.soulkeeper.core.platform.IsDeadPlayerProvider import ru.astrainteractive.soulkeeper.module.souls.database.model.DefaultSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject +import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import ru.astrainteractive.soulkeeper.module.souls.util.addItems class NeoForgeAddSoulItemsIntoInventoryUseCase( diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt b/modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt similarity index 97% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt rename to modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt index 55404188..745aa5fe 100644 --- a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt +++ b/modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/domain/NeoForgePickUpItemsUseCase.kt @@ -14,6 +14,7 @@ import ru.astrainteractive.soulkeeper.module.souls.dao.SoulsDao import ru.astrainteractive.soulkeeper.module.souls.database.model.ItemDatabaseSoul import ru.astrainteractive.soulkeeper.module.souls.database.model.StringFormatObject import ru.astrainteractive.soulkeeper.module.souls.domain.PickUpItemsUseCase.Output +import ru.astrainteractive.soulkeeper.module.souls.platform.ItemStackSerializer import ru.astrainteractive.soulkeeper.module.souls.util.addItems internal class NeoForgePickUpItemsUseCase( diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEventProvider.kt b/modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEventProvider.kt similarity index 100% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEventProvider.kt rename to modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/platform/NeoForgeEventProvider.kt diff --git a/modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt b/modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt similarity index 100% rename from modules/service-neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt rename to modules/service/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/module/souls/util/OnlineKPlayerExt.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index 73d035d2..acd54d18 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -49,16 +49,17 @@ rootProject.name = "SoulKeeper" include(":instances:bukkit") include(":instances:forge") include(":instances:neoforge") + include(":modules:command") -include(":modules:core") -include(":modules:core-bukkit") -include(":modules:core-forge") -include(":modules:core-neoforge") +include(":modules:core:api") +include(":modules:core:bukkit") +include(":modules:core:forge") +include(":modules:core:neoforge") include(":modules:dao") -include(":modules:event-bukkit") -include(":modules:event-forge") -include(":modules:event-neoforge") -include(":modules:service") -include(":modules:service-bukkit") -include(":modules:service-forge") -include(":modules:service-neoforge") +include(":modules:event:bukkit") +include(":modules:event:forge") +include(":modules:event:neoforge") +include(":modules:service:api") +include(":modules:service:bukkit") +include(":modules:service:forge") +include(":modules:service:neoforge") From 498ee525cae16caab1107cd1a5e436d40d8b2991 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 14:29:58 +0300 Subject: [PATCH 08/12] [REFACTOR] Fix commands --- instances/forge/build.gradle.kts | 4 +-- .../soulkeeper/di/RootModule.kt | 5 ++-- .../soulkeeper/di/RootModule.kt | 2 +- .../soulkeeper/command/di/CommandModule.kt | 16 ++++++++-- .../exception/CommandExceptionHandler.kt | 29 +++++++++++++++++++ .../reload/SoulsReloadCommandRegistrar.kt | 8 +++-- .../soulkrate/SoulKrateCommandRegistrar.kt | 6 ++-- .../souls/SoulsListCommandRegistrar.kt | 12 ++++---- 8 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/exception/CommandExceptionHandler.kt diff --git a/instances/forge/build.gradle.kts b/instances/forge/build.gradle.kts index 21da880c..1a95476f 100644 --- a/instances/forge/build.gradle.kts +++ b/instances/forge/build.gradle.kts @@ -224,11 +224,11 @@ val shadowJar by tasks.getting(ShadowJar::class) { add("org.intellij") add("org.jetbrains.annotations") - add("org.jetbrains.exposed") // Don't relocate on: [*] +// add("org.jetbrains.exposed") // Don't relocate on: [*] add("org.jetbrains.kotlinx") add("org.json") add("org.json") - add("org.sqlite") +// add("org.sqlite") add("org.telegram") add("org.telegram.telegrambots") add("org.w3c.css") diff --git a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt index 87858ec5..d469cce1 100644 --- a/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt +++ b/instances/forge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -61,13 +61,12 @@ class RootModule(private val plugin: Lifecycle) { effectEmitter = coreModule.effectEmitter ) } + private val commandRegistrarContext = ForgeCommandRegistrarContext(mainScope = coreModule.unconfinedScope) private val commandModule by lazy { CommandModule( coreModule = coreModule, soulsDaoModule = soulsDaoModule, - commandRegistrarContext = ForgeCommandRegistrarContext( - mainScope = coreModule.mainScope - ), + commandRegistrarContext = commandRegistrarContext, serviceModule = serviceModule, multiplatformCommand = MultiplatformCommand(MinecraftMultiplatformCommands()), lifecyclePlugin = plugin, diff --git a/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt b/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt index 5ef6b823..3b58dc42 100644 --- a/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt +++ b/instances/neoforge/src/main/kotlin/ru/astrainteractive/soulkeeper/di/RootModule.kt @@ -12,8 +12,8 @@ import ru.astrainteractive.soulkeeper.module.event.di.ForgeEventModule import ru.astrainteractive.soulkeeper.module.souls.di.NeoForgePlatformServiceModule import ru.astrainteractive.soulkeeper.module.souls.di.ServiceModule import ru.astrainteractive.soulkeeper.module.souls.di.SoulsDaoModule -import java.io.File import ru.astrainteractive.soulkeeper.module.souls.platform.NeoForgeEffectEmitter +import java.io.File class RootModule(private val plugin: Lifecycle) { diff --git a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt index 756f5483..6cb9523e 100644 --- a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt +++ b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt @@ -3,6 +3,9 @@ package ru.astrainteractive.soulkeeper.command.di import ru.astrainteractive.astralibs.command.api.brigadier.command.MultiplatformCommand import ru.astrainteractive.astralibs.command.api.registrar.CommandRegistrarContext import ru.astrainteractive.astralibs.lifecycle.Lifecycle +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.command.exception.CommandExceptionHandler import ru.astrainteractive.soulkeeper.command.reload.SoulsReloadCommandRegistrar import ru.astrainteractive.soulkeeper.command.soulkrate.SoulKrateCommandRegistrar import ru.astrainteractive.soulkeeper.command.souls.SoulsCommandExecutor @@ -19,18 +22,25 @@ class CommandModule( private val multiplatformCommand: MultiplatformCommand, private val lifecyclePlugin: Lifecycle ) { + + private val commandExceptionHandler = CommandExceptionHandler( + multiplatformCommand = multiplatformCommand, + translationKrate = coreModule.translation, + kyoriKrate = coreModule.kyoriComponentSerializer + ) val lifecycle = Lifecycle.Lambda( onEnable = { SoulsListCommandRegistrar( kyoriKrate = coreModule.kyoriComponentSerializer, registrarContext = commandRegistrarContext, multiplatformCommand = multiplatformCommand, + commandExceptionHandler = commandExceptionHandler, soulsCommandExecutor = SoulsCommandExecutor( ioScope = coreModule.ioScope, soulsDao = soulsDaoModule.soulsDao, translationKrate = coreModule.translation, kyoriKrate = coreModule.kyoriComponentSerializer, - dispatchers = coreModule.dispatchers + dispatchers = coreModule.dispatchers, ), ).register() SoulKrateCommandRegistrar( @@ -41,7 +51,8 @@ class CommandModule( ioScope = coreModule.ioScope, addSoulItemsIntoInventoryUseCase = serviceModule.addSoulItemsIntoInventoryUseCase, translationKrate = coreModule.translation, - kyoriKrate = coreModule.kyoriComponentSerializer + kyoriKrate = coreModule.kyoriComponentSerializer, + commandExceptionHandler = commandExceptionHandler, ).register() SoulsReloadCommandRegistrar( lifecyclePlugin = lifecyclePlugin, @@ -49,6 +60,7 @@ class CommandModule( kyoriKrate = coreModule.kyoriComponentSerializer, registrarContext = commandRegistrarContext, multiplatformCommand = multiplatformCommand, + commandExceptionHandler = commandExceptionHandler, ).register() }, onDisable = { diff --git a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/exception/CommandExceptionHandler.kt b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/exception/CommandExceptionHandler.kt new file mode 100644 index 00000000..df9bdfb7 --- /dev/null +++ b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/exception/CommandExceptionHandler.kt @@ -0,0 +1,29 @@ +package ru.astrainteractive.soulkeeper.command.exception + +import com.mojang.brigadier.context.CommandContext +import ru.astrainteractive.astralibs.command.api.brigadier.command.MultiplatformCommand +import ru.astrainteractive.astralibs.command.api.exception.NoPermissionException +import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer +import ru.astrainteractive.astralibs.kyori.unwrap +import ru.astrainteractive.klibs.kstorage.api.CachedKrate +import ru.astrainteractive.klibs.kstorage.api.getValue +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.core.plugin.PluginTranslation + +class CommandExceptionHandler( + private val multiplatformCommand: MultiplatformCommand, + translationKrate: CachedKrate, + kyoriKrate: CachedKrate +) : KyoriComponentSerializer by kyoriKrate.unwrap(), Logger by JUtiltLogger("CommandExceptionHandler") { + private val translation by translationKrate + + fun handle(ctx: CommandContext, t: Throwable) { + with(multiplatformCommand) { + when (t) { + is NoPermissionException -> ctx.getSender()?.sendMessage(translation.general.noPermission.component) + else -> ctx.getSender()?.sendMessage(translation.general.wrongUsage.component) + } + } + } +} diff --git a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt index 97b3e0b3..3962ee89 100644 --- a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt +++ b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt @@ -8,6 +8,9 @@ import ru.astrainteractive.astralibs.kyori.unwrap import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.api.getValue +import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger +import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.command.exception.CommandExceptionHandler import ru.astrainteractive.soulkeeper.core.plugin.PluginPermission import ru.astrainteractive.soulkeeper.core.plugin.PluginTranslation @@ -15,15 +18,16 @@ internal class SoulsReloadCommandRegistrar( private val lifecyclePlugin: Lifecycle, private val registrarContext: CommandRegistrarContext, private val multiplatformCommand: MultiplatformCommand, + private val commandExceptionHandler: CommandExceptionHandler, translationKrate: CachedKrate, - kyoriKrate: CachedKrate + kyoriKrate: CachedKrate, ) : KyoriComponentSerializer by kyoriKrate.unwrap() { private val translation by translationKrate private fun createNode(): LiteralArgumentBuilder<*> { return with(multiplatformCommand) { command("skreload") { - runs { ctx -> + runs(onFailure = commandExceptionHandler::handle) { ctx -> ctx.requirePermission(PluginPermission.Reload) val audience = ctx.getSender() audience.sendMessage(translation.general.reload.component) diff --git a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/soulkrate/SoulKrateCommandRegistrar.kt b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/soulkrate/SoulKrateCommandRegistrar.kt index 256c65ef..b79dca64 100644 --- a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/soulkrate/SoulKrateCommandRegistrar.kt +++ b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/soulkrate/SoulKrateCommandRegistrar.kt @@ -15,13 +15,14 @@ import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.api.getValue import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger import ru.astrainteractive.klibs.mikro.core.logging.Logger +import ru.astrainteractive.soulkeeper.command.exception.CommandExceptionHandler import ru.astrainteractive.soulkeeper.core.plugin.PluginPermission import ru.astrainteractive.soulkeeper.core.plugin.PluginTranslation import ru.astrainteractive.soulkeeper.module.souls.domain.AddSoulItemsIntoInventoryUseCase import ru.astrainteractive.soulkeeper.module.souls.krate.PlayerSoulKrate import java.io.File import java.time.Instant -import java.util.* +import java.util.UUID @Suppress("LongParameterList") internal class SoulKrateCommandRegistrar( @@ -31,6 +32,7 @@ internal class SoulKrateCommandRegistrar( private val dataFolder: File, private val ioScope: CoroutineScope, private val addSoulItemsIntoInventoryUseCase: AddSoulItemsIntoInventoryUseCase, + private val commandExceptionHandler: CommandExceptionHandler, translationKrate: CachedKrate, kyoriKrate: CachedKrate ) : Logger by JUtiltLogger("SoulKrateCommandRegistrar"), @@ -42,7 +44,7 @@ internal class SoulKrateCommandRegistrar( argument("uuid", StringArgumentType.string()) { uuidArg -> argument("instant", LongArgumentType.longArg()) { instantArg -> argument("index", IntegerArgumentType.integer()) { indexArg -> - runs { ctx -> + runs(commandExceptionHandler::handle) { ctx -> ctx.requirePermission(PluginPermission.LoadSouls) val player = ctx.requirePlayer() val instant = ctx.requireArgument(instantArg).let(Instant::ofEpochSecond) diff --git a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/souls/SoulsListCommandRegistrar.kt b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/souls/SoulsListCommandRegistrar.kt index 505d405c..a51889fe 100644 --- a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/souls/SoulsListCommandRegistrar.kt +++ b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/souls/SoulsListCommandRegistrar.kt @@ -8,19 +8,21 @@ import ru.astrainteractive.astralibs.command.api.registrar.CommandRegistrarConte import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer import ru.astrainteractive.astralibs.kyori.unwrap import ru.astrainteractive.klibs.kstorage.api.CachedKrate +import ru.astrainteractive.soulkeeper.command.exception.CommandExceptionHandler internal class SoulsListCommandRegistrar( kyoriKrate: CachedKrate, private val registrarContext: CommandRegistrarContext, private val multiplatformCommand: MultiplatformCommand, - private val soulsCommandExecutor: SoulsCommandExecutor + private val soulsCommandExecutor: SoulsCommandExecutor, + private val commandExceptionHandler: CommandExceptionHandler, ) : KyoriComponentSerializer by kyoriKrate.unwrap() { private fun createNode(): LiteralArgumentBuilder<*> { return with(multiplatformCommand) { command("souls") { literal("page") { argument("page", IntegerArgumentType.integer(0)) { pageArg -> - runs { ctx -> + runs(commandExceptionHandler::handle) { ctx -> val page = ctx.requireArgument(pageArg) SoulsCommand.Intent.List( sender = ctx.getSender(), @@ -31,7 +33,7 @@ internal class SoulsListCommandRegistrar( } literal("free") { argument("soul_id", LongArgumentType.longArg(0)) { idArg -> - runs { ctx -> + runs(commandExceptionHandler::handle) { ctx -> SoulsCommand.Intent.Free( sender = ctx.getSender(), soulId = ctx.requireArgument(idArg) @@ -41,7 +43,7 @@ internal class SoulsListCommandRegistrar( } literal("teleport") { argument("soul_id", LongArgumentType.longArg(0)) { idArg -> - runs { ctx -> + runs(commandExceptionHandler::handle) { ctx -> SoulsCommand.Intent.TeleportToSoul( sender = ctx.getSender(), soulId = ctx.requireArgument(idArg) @@ -49,7 +51,7 @@ internal class SoulsListCommandRegistrar( } } } - runs { ctx -> + runs(commandExceptionHandler::handle) { ctx -> SoulsCommand.Intent.List( sender = ctx.getSender(), page = 0 From 1738df1d8128753d140926c1b116c9cc84132ff1 Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 14:38:32 +0300 Subject: [PATCH 09/12] [FIX] Fix bukkit launch --- docker-compose.yml | 14 +++++----- instances/bukkit/build.gradle.kts | 44 +++++++++++++++---------------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ce300510..e31f3700 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,17 +20,17 @@ services: # VERSION: "1.20.1" # NEOFORGE_VERSION: "21.1.129" # Forge -------------------- - TYPE: FORGE - VERSION: "1.20.1" - FORGE_VERSION: "47.4.12" +# TYPE: FORGE +# VERSION: "1.20.1" +# FORGE_VERSION: "47.4.12" # Paper -------------------- - # TYPE: PAPER - # VERSION: 1.21.8 + TYPE: PAPER + VERSION: 1.21.8 # Custom ------------------- # CUSTOM_SERVER: https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/121/downloads/paper-1.21.1-121.jar volumes: - - ./build/forge:/data # Forge +# - ./build/forge:/data # Forge # - ./build/neoforge:/data # NeoForge -# - ./build/bukkit:/data # Bukkit/Paper/Spigot + - ./build/bukkit:/data # Bukkit/Paper/Spigot # - ./build/velocity:/data # Velocity # - ./build/fabric:/data # Fabric \ No newline at end of file diff --git a/instances/bukkit/build.gradle.kts b/instances/bukkit/build.gradle.kts index 22d3d8e8..d8f6c213 100644 --- a/instances/bukkit/build.gradle.kts +++ b/instances/bukkit/build.gradle.kts @@ -9,32 +9,30 @@ plugins { } dependencies { - implementation(libs.kotlin.coroutines.core) - // Spigot dependencies - compileOnly(libs.minecraft.paper.api) - implementation(libs.minecraft.bstats) - // AstraLibs - implementation(libs.minecraft.astralibs.core) - implementation(libs.klibs.mikro.core) - implementation(libs.minecraft.astralibs.menu.bukkit) - implementation(libs.minecraft.astralibs.core.bukkit) - implementation(libs.minecraft.astralibs.command) - implementation(libs.minecraft.astralibs.command.bukkit) - compileOnly(libs.minecraft.vaultapi) compileOnly(libs.driver.h2) compileOnly(libs.driver.jdbc) compileOnly(libs.driver.mysql) - // Spigot - compileOnly(libs.minecraft.luckperms) compileOnly(libs.minecraft.discordsrv) compileOnly(libs.minecraft.essentialsx) - implementation(projects.modules.core.api) - implementation(projects.modules.core.bukkit) - implementation(projects.modules.event.bukkit) - implementation(projects.modules.dao) - implementation(projects.modules.service.api) - implementation(projects.modules.service.bukkit) - implementation(projects.modules.command) + compileOnly(libs.minecraft.luckperms) + compileOnly(libs.minecraft.paper.api) + compileOnly(libs.minecraft.vaultapi) + + shadow(libs.klibs.mikro.core) + shadow(libs.kotlin.coroutines.core) + shadow(libs.minecraft.astralibs.command) + shadow(libs.minecraft.astralibs.command.bukkit) + shadow(libs.minecraft.astralibs.core) + shadow(libs.minecraft.astralibs.core.bukkit) + shadow(libs.minecraft.astralibs.menu.bukkit) + shadow(libs.minecraft.bstats) + shadow(projects.modules.command) + shadow(projects.modules.core.api) + shadow(projects.modules.core.bukkit) + shadow(projects.modules.dao) + shadow(projects.modules.event.bukkit) + shadow(projects.modules.service.api) + shadow(projects.modules.service.bukkit) } minecraftProcessResource { @@ -205,11 +203,11 @@ val shadowJar by tasks.getting(ShadowJar::class) { add("org.intellij") add("org.jetbrains.annotations") - add("org.jetbrains.exposed") // Don't relocate on: [*] +// add("org.jetbrains.exposed") // Don't relocate on: [*] add("org.jetbrains.kotlinx") add("org.json") add("org.json") - add("org.sqlite") +// add("org.sqlite") // Don't relocate on: [*] add("org.telegram") add("org.telegram.telegrambots") add("org.w3c.css") From 841e1f2327eeefc708ba6004e12c6792ecf6083b Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 14:39:38 +0300 Subject: [PATCH 10/12] [FIX] Up version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 2055c133..16ff0b3b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ klibs.java.ktarget=21 # Project klibs.project.name=SoulKeeper klibs.project.group=ru.astrainteractive.soulkeeper -klibs.project.version.string=1.7.0 +klibs.project.version.string=1.8.0 klibs.project.description=Keep your items after death klibs.project.developers=makeevrserg|Makeev Roman|makeevrserg@gmail.com klibs.project.url=https://github.com/Astra-Interactive/SoulKeeper From e9c8a626c07687601fa9f61a7de45a42bb3eb1dc Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 14:59:35 +0300 Subject: [PATCH 11/12] [FIX] Fix detekt --- .../ru/astrainteractive/soulkeeper/command/di/CommandModule.kt | 2 -- .../soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt | 2 -- 2 files changed, 4 deletions(-) diff --git a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt index 6cb9523e..59ebbbd1 100644 --- a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt +++ b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/di/CommandModule.kt @@ -3,8 +3,6 @@ package ru.astrainteractive.soulkeeper.command.di import ru.astrainteractive.astralibs.command.api.brigadier.command.MultiplatformCommand import ru.astrainteractive.astralibs.command.api.registrar.CommandRegistrarContext import ru.astrainteractive.astralibs.lifecycle.Lifecycle -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger import ru.astrainteractive.soulkeeper.command.exception.CommandExceptionHandler import ru.astrainteractive.soulkeeper.command.reload.SoulsReloadCommandRegistrar import ru.astrainteractive.soulkeeper.command.soulkrate.SoulKrateCommandRegistrar diff --git a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt index 3962ee89..c9f6659e 100644 --- a/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt +++ b/modules/command/src/main/kotlin/ru/astrainteractive/soulkeeper/command/reload/SoulsReloadCommandRegistrar.kt @@ -8,8 +8,6 @@ import ru.astrainteractive.astralibs.kyori.unwrap import ru.astrainteractive.astralibs.lifecycle.Lifecycle import ru.astrainteractive.klibs.kstorage.api.CachedKrate import ru.astrainteractive.klibs.kstorage.api.getValue -import ru.astrainteractive.klibs.mikro.core.logging.JUtiltLogger -import ru.astrainteractive.klibs.mikro.core.logging.Logger import ru.astrainteractive.soulkeeper.command.exception.CommandExceptionHandler import ru.astrainteractive.soulkeeper.core.plugin.PluginPermission import ru.astrainteractive.soulkeeper.core.plugin.PluginTranslation From eeac156cc91dab2269c1bb6dde1d237edfa7a75d Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Sat, 23 May 2026 15:10:07 +0300 Subject: [PATCH 12/12] [FIX] Fix CI --- .github/workflows/call-build-project.yml | 2 ++ .github/workflows/call-gradle-wrapper-validation.yml | 2 +- .github/workflows/call-upload-artifacts.yml | 2 ++ .github/workflows/call-upload-github-release.yml | 6 ++++++ .github/workflows/call-upload-modrinth-release.yml | 2 ++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/call-build-project.yml b/.github/workflows/call-build-project.yml index a65fe64b..a51674a9 100644 --- a/.github/workflows/call-build-project.yml +++ b/.github/workflows/call-build-project.yml @@ -12,6 +12,8 @@ jobs: task: ":instances:bukkit:build" - id: "neoforge" task: ":instances:neoforge:build --info --stacktrace" + - id: "forge" + task: ":instances:forge:build --info --stacktrace" steps: - name: Checkout Git repo uses: actions/checkout@v6 diff --git a/.github/workflows/call-gradle-wrapper-validation.yml b/.github/workflows/call-gradle-wrapper-validation.yml index 29cb46ae..b0e496d1 100644 --- a/.github/workflows/call-gradle-wrapper-validation.yml +++ b/.github/workflows/call-gradle-wrapper-validation.yml @@ -9,4 +9,4 @@ jobs: steps: - uses: actions/checkout@v6 - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v3 \ No newline at end of file + uses: gradle/actions/wrapper-validation@v6 \ No newline at end of file diff --git a/.github/workflows/call-upload-artifacts.yml b/.github/workflows/call-upload-artifacts.yml index bfb82abc..e38f050b 100644 --- a/.github/workflows/call-upload-artifacts.yml +++ b/.github/workflows/call-upload-artifacts.yml @@ -12,6 +12,8 @@ jobs: task: ":instances:bukkit:shadowJar" - id: "neoforge" task: ":instances:neoforge:shadowJar" + - id: "forge" + task: ":instances:forge:shadowJar" steps: - name: Checkout Git repo uses: actions/checkout@v6 diff --git a/.github/workflows/call-upload-github-release.yml b/.github/workflows/call-upload-github-release.yml index 5ce3762d..763e5f17 100644 --- a/.github/workflows/call-upload-github-release.yml +++ b/.github/workflows/call-upload-github-release.yml @@ -30,6 +30,12 @@ jobs: name: neoforge path: ./jars + - uses: actions/download-artifact@d0ce8fd1167ed839810201de977912a090ab10a7 + name: "Download forge" + with: + name: forge + path: ./jars + - name: Create release id: create_internal_release uses: softprops/action-gh-release@v2 diff --git a/.github/workflows/call-upload-modrinth-release.yml b/.github/workflows/call-upload-modrinth-release.yml index 870a44a1..ba138d81 100644 --- a/.github/workflows/call-upload-modrinth-release.yml +++ b/.github/workflows/call-upload-modrinth-release.yml @@ -15,6 +15,8 @@ jobs: task: ":instances:bukkit:shadowJar" - id: "neoforge" task: ":instances:neoforge:shadowJar" + - id: "forge" + task: ":instances:forge:shadowJar" steps: - name: Checkout Git repo uses: actions/checkout@v6