diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e459084..fc809a6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,12 +25,19 @@ jobs: - name: Build Java Application env: - SHYNIXN_MCUTILS_REPOSITORY: ${{ secrets.SHYNIXN_MCUTILS_REPOSITORY }} + SHYNIXN_MCUTILS_REPOSITORY_2025: ${{ secrets.SHYNIXN_MCUTILS_REPOSITORY_2025 }} run: | chmod +x gradlew ./gradlew build pluginJars echo "RELEASE_VERSION=$(./gradlew -q printVersion)" >> $GITHUB_ENV + - name: Create Geyser Customizations + if: "contains(github.event.head_commit.message, '--release') && contains(github.ref, 'main')" + env: + GEYSER_PASSWORD: ${{ secrets.GEYSER_PASSWORD }} + run: | + 7z x docs/resources/MCTennis-GeyserMC.7z -p${{ env.GEYSER_PASSWORD }} + - name: Create Github Release if: "contains(github.event.head_commit.message, '--release') && contains(github.ref, 'main')" id: create_release @@ -77,6 +84,17 @@ jobs: asset_name: MCTennis-Legacy.jar asset_content_type: application/jar + - name: Geyser Customizations to Github + if: "contains(github.event.head_commit.message, '--release') && contains(github.ref, 'main')" + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: /home/runner/work/MCTennis/MCTennis/MCTennis-GeyserMC.zip + asset_name: MCTennis-GeyserMC.zip + asset_content_type: application/zip + Wiki: runs-on: ubuntu-latest if: "contains(github.ref, 'main')" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0d53d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.gradle +.idea +build diff --git a/README.md b/README.md index e60a0a6..e53ad7d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # MCTennis -| branch | status | download | -|--------|----------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------| -| main | [![Build Status](https://github.com/Shynixn/MCTennis/workflows/CI/badge.svg?branch=main)](https://github.com/Shynixn/MCTennis
/actions) | [Download latest release](https://github.com/Shynixn/MCtennis/releases) | +| branch | status | download | +|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------| +| main | [![Build Status](https://github.com/Shynixn/MCTennis/actions/workflows/main.yml/badge.svg)](https://github.com/Shynixn/MCTennis/actions) | [Download latest release](https://github.com/Shynixn/MCtennis/releases) | +| development | [![Build Status](https://github.com/Shynixn/MCTennis/actions/workflows/main.yml/badge.svg?branch=development)](https://github.com/Shynixn/MCTennis/actions) | | ## Description diff --git a/build.gradle.kts b/build.gradle.kts index 5518035..1da4cb8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,65 +8,30 @@ plugins { } group = "com.github.shynixn" -version = "1.13.0" +version = "1.14.0" repositories { + mavenLocal() mavenCentral() maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") - maven("https://repo.extendedclip.com/content/repositories/placeholderapi") - maven("https://repo.opencollab.dev/main/") - maven(System.getenv("SHYNIXN_MCUTILS_REPOSITORY")) // All MCUTILS libraries are private and not OpenSource. -} - -tasks.register("printVersion") { - println(version) + maven(System.getenv("SHYNIXN_MCUTILS_REPOSITORY_2025")) // All MCUTILS libraries are private and not OpenSource. } dependencies { // Compile Only compileOnly("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT") - compileOnly("me.clip:placeholderapi:2.11.6") - compileOnly("org.geysermc.geyser:api:2.2.0-SNAPSHOT") // Plugin.yml Shade dependencies implementation("com.github.shynixn.mccoroutine:mccoroutine-bukkit-api:2.20.0") implementation("com.github.shynixn.mccoroutine:mccoroutine-bukkit-core:2.20.0") - implementation("com.google.inject:guice:5.0.1") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.3.0") implementation("com.fasterxml.jackson.core:jackson-databind:2.2.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - implementation("com.google.code.gson:gson:2.8.6") // Custom dependencies - implementation("com.github.shynixn.mcutils:common:2024.39") - implementation("com.github.shynixn.mcutils:packet:2024.51") - implementation("com.github.shynixn.mcutils:sign:2024.3") - implementation("com.github.shynixn.mcutils:guice:2024.2") - - // Test - testImplementation(kotlin("test")) - testImplementation("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT") - testImplementation("org.mockito:mockito-core:2.23.0") -} - -tasks.test { - useJUnitPlatform() - testLogging.showStandardStreams = true - failFast = true - - testLogging { - events( - org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED, - org.gradle.api.tasks.testing.logging.TestLogEvent.PASSED, - org.gradle.api.tasks.testing.logging.TestLogEvent.SKIPPED, - org.gradle.api.tasks.testing.logging.TestLogEvent.STARTED - ) - displayGranularity = 0 - showExceptions = true - showCauses = true - showStackTraces = true - exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL - } + implementation("com.github.shynixn.mcutils:common:2025.3") + implementation("com.github.shynixn.mcutils:packet:2025.3") + implementation("com.github.shynixn.mcutils:sign:2025.1") } tasks.withType { @@ -83,7 +48,7 @@ java { */ tasks.withType { dependsOn("jar") - archiveName = "${baseName}-${version}-shadowjar.${extension}" + archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}-shadowjar.${archiveExtension.get()}") exclude("DebugProbesKt.bin") exclude("module-info.class") } @@ -102,8 +67,8 @@ tasks.register("pluginJars") { */ tasks.register("relocatePluginJar", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class.java) { dependsOn("shadowJar") - from(zipTree(File("./build/libs/" + (tasks.getByName("shadowJar") as Jar).archiveName))) - archiveName = "${baseName}-${version}-relocate.${extension}" + from(zipTree(File("./build/libs/" + (tasks.getByName("shadowJar") as Jar).archiveFileName.get()))) + archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}-relocate.${archiveExtension.get()}") relocate("com.fasterxml", "com.github.shynixn.mctennis.lib.com.fasterxml") relocate("com.github.shynixn.mcutils", "com.github.shynixn.mctennis.lib.com.github.shynixn.mcutils") } @@ -113,9 +78,9 @@ tasks.register("relocatePluginJar", com.github.jengelman.gradle.plugins.shadow.t */ tasks.register("pluginJarLatest", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class.java) { dependsOn("relocatePluginJar") - from(zipTree(File("./build/libs/" + (tasks.getByName("relocatePluginJar") as Jar).archiveName))) - archiveName = "${baseName}-${version}-latest.${extension}" - // destinationDir = File("C:\\temp\\plugins") + from(zipTree(File("./build/libs/" + (tasks.getByName("relocatePluginJar") as Jar).archiveFileName.get()))) + archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}-latest.${archiveExtension.get()}") + // destinationDirectory.set(File("C:\\temp\\plugins")) exclude("com/github/shynixn/mctennis/lib/com/github/shynixn/mcutils/packet/nms/v1_8_R3/**") exclude("com/github/shynixn/mctennis/lib/com/github/shynixn/mcutils/packet/nms/v1_9_R2/**") @@ -147,9 +112,9 @@ tasks.register("pluginJarLatest", com.github.jengelman.gradle.plugins.shadow.tas */ tasks.register("pluginJarPremium", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class.java) { dependsOn("relocatePluginJar") - from(zipTree(File("./build/libs/" + (tasks.getByName("relocatePluginJar") as Jar).archiveName))) - archiveName = "${baseName}-${version}-premium.${extension}" - // destinationDir = File("C:\\temp\\plugins") + from(zipTree(File("./build/libs/" + (tasks.getByName("relocatePluginJar") as Jar).archiveFileName.get()))) + archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}-premium.${archiveExtension.get()}") + // destinationDirectory.set(File("C:\\temp\\plugins")) exclude("com/github/shynixn/mcutils/**") exclude("com/github/shynixn/mccoroutine/**") @@ -167,12 +132,11 @@ tasks.register("pluginJarPremium", com.github.jengelman.gradle.plugins.shadow.ta */ tasks.register("relocateLegacyPluginJar", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class.java) { dependsOn("shadowJar") - from(zipTree(File("./build/libs/" + (tasks.getByName("shadowJar") as Jar).archiveName))) - archiveName = "${baseName}-${version}-legacy-relocate.${extension}" + from(zipTree(File("./build/libs/" + (tasks.getByName("shadowJar") as Jar).archiveFileName.get()))) + archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}-legacy-relocate.${archiveExtension.get()}") relocate("com.github.shynixn.mcutils", "com.github.shynixn.mctennis.lib.com.github.shynixn.mcutils") relocate("kotlin", "com.github.shynixn.mctennis.lib.kotlin") relocate("org.intellij", "com.github.shynixn.mctennis.lib.org.intelli") - relocate("org.aopalliance", "com.github.shynixn.mctennis.lib.org.aopalliance") relocate("org.checkerframework", "com.github.shynixn.mctennis.lib.org.checkerframework") relocate("org.jetbrains", "com.github.shynixn.mctennis.lib.org.jetbrains") relocate("org.slf4j", "com.github.shynixn.mctennis.lib.org.slf4j") @@ -191,9 +155,10 @@ tasks.register("relocateLegacyPluginJar", com.github.jengelman.gradle.plugins.sh */ tasks.register("pluginJarLegacy", com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar::class.java) { dependsOn("relocateLegacyPluginJar") - from(zipTree(File("./build/libs/" + (tasks.getByName("relocateLegacyPluginJar") as Jar).archiveName))) - archiveName = "${baseName}-${version}-legacy.${extension}" + from(zipTree(File("./build/libs/" + (tasks.getByName("relocateLegacyPluginJar") as Jar).archiveFileName.get()))) + archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}-legacy.${archiveExtension.get()}") // destinationDir = File("C:\\temp\\plugins") + exclude("com/github/shynixn/mcutils/**") exclude("org/**") exclude("kotlin/**") @@ -207,29 +172,73 @@ tasks.register("pluginJarLegacy", com.github.jengelman.gradle.plugins.shadow.tas tasks.register("languageFile") { val kotlinSrcFolder = project.sourceSets.toList()[0].allJava.srcDirs.first { e -> e.endsWith("kotlin") } - val contractFile = kotlinSrcFolder.resolve("com/github/shynixn/mctennis/contract/Language.kt") + val contractFile = kotlinSrcFolder.resolve("com/github/shynixn/mctennis/contract/MCTennisLanguage.kt") val resourceFile = kotlinSrcFolder.parentFile.resolve("resources").resolve("lang").resolve("en_us.yml") val lines = resourceFile.readLines() - val contents = ArrayList() - contents.add("package com.github.shynixn.mctennis.contract") - contents.add("") - contents.add("import com.github.shynixn.mcutils.common.language.LanguageItem") - contents.add("import com.github.shynixn.mcutils.common.language.LanguageProvider") - contents.add("") - contents.add("interface Language : LanguageProvider {") + val contractContents = ArrayList() + contractContents.add("package com.github.shynixn.mctennis.contract") + contractContents.add("") + contractContents.add("import com.github.shynixn.mcutils.common.language.LanguageItem") + contractContents.add("import com.github.shynixn.mcutils.common.language.LanguageProvider") + contractContents.add("") + contractContents.add("interface MCTennisLanguage : LanguageProvider {") for (key in lines) { if (key.toCharArray()[0].isLetter()) { - contents.add(" var ${key} LanguageItem") - contents.add("") + contractContents.add(" var ${key} LanguageItem") + contractContents.add("") } } - contents.removeLast() - contents.add("}") + contractContents.removeLast() + contractContents.add("}") contractFile.printWriter().use { out -> - for (line in contents) { + for (line in contractContents) { out.println(line) } } + + val implFile = kotlinSrcFolder.resolve("com/github/shynixn/mctennis/MCTennisLanguageImpl.kt") + val implContents = ArrayList() + implContents.add("package com.github.shynixn.mctennis") + implContents.add("") + implContents.add("import com.github.shynixn.mcutils.common.language.LanguageItem") + implContents.add("import com.github.shynixn.mctennis.contract.MCTennisLanguage") + implContents.add("") + implContents.add("class MCTennisLanguageImpl : MCTennisLanguage {") + implContents.add(" override val names: List\n" + + " get() = listOf(\"en_us\")") + + for (i in 0 until lines.size) { + val key = lines[i] + + if (key.toCharArray()[0].isLetter()) { + var text : String + + var j = i + while (true){ + if(lines[j].contains("text:")){ + text = lines[j] + break + } + j++ + } + + implContents.add(" override var ${key.replace(":","")} = LanguageItem(${text.replace(" text: ","")})") + implContents.add("") + } + } + implContents.removeLast() + implContents.add("}") + + implFile.printWriter().use { out -> + for (line in implContents) { + out.println(line) + } + } +} + + +tasks.register("printVersion") { + println(version) } diff --git a/docs/resources/MCTennis-GeyserMC.7z b/docs/resources/MCTennis-GeyserMC.7z new file mode 100644 index 0000000..e705506 Binary files /dev/null and b/docs/resources/MCTennis-GeyserMC.7z differ diff --git a/docs/wiki/docs/README.md b/docs/wiki/docs/README.md index 7114103..5b55d15 100644 --- a/docs/wiki/docs/README.md +++ b/docs/wiki/docs/README.md @@ -7,7 +7,6 @@ MCTennis is a spigot plugin to play tennis games in Minecraft. * Adds a new playable tennis minigame * A moving TennisBall without any resource pack * A customizable physic engine for the TennisBall -* Additionally, works on Bedrock Clients using Geyser * PlaceHolderApi Support * Multiple games per server (Patreon Only) diff --git a/docs/wiki/docs/bedrock.md b/docs/wiki/docs/bedrock.md new file mode 100644 index 0000000..a153b27 --- /dev/null +++ b/docs/wiki/docs/bedrock.md @@ -0,0 +1,35 @@ +# Bedrock + +MCTennis supports crossplay with Bedrock clients (SmartPhone,Windows,Console, etc.) using [GeyserMC](https://geysermc.org/). + +### Initial Setup + +* Install [GeyserMC](https://geysermc.org/) on your server or on your proxy server. +* Install MCTennis on your Spigot/Paper based server +* Join your server with a BedRock client and join the MCTennis game ``/mctennis join game1``. +* Observe that the ball will be displayed as a simple player_head because bedrock does not support custom player heads. +* Observe, that the ball will not be able to rotate. + +### Fixing skin and rotations via GeyserMC (PatreonOnly) + +Thanks to my **Patreon supporters**, who have funded this feature :heart: . +They can download my [prepared zip file](https://www.patreon.com/Shynixn) to easily setup MCTennis for Bedrock. + +If you are using the free version of MCTennis, you can still configure MCTennis for Bedrock, but it is more work for you. If you want +to save time, become a patreon member at [https://www.patreon.com/Shynixn](https://www.patreon.com/Shynixn). + +=== "Spigot/Paper" + + * Download the ``MCTennis-GeyserMC.zip`` file from [https://www.patreon.com/Shynixn](https://www.patreon.com/Shynixn). + * Extract the ``MCTennis-GeyserMC.zip`` contents into your ``plugins\Geyser-Spigot``. + * Extract the ``custom-skulls_mctennis.yml`` into ``plugins\Geyser-Spigot\custom-skulls_mctennis.yml`` + * Extract the ``packs/MCTennisPack.mcpack`` into ``plugins\Geyser-Spigot\packs\MCTennisPack.mcpack`` + * Copy the ``player-profiles`` values from ``plugins\Geyser-Spigot\custom-skulls_mctennis.yml`` into the ``plugins\Geyser-Spigot\custom-skulls.yml`` file. + +=== "Proxies (BungeeCord, Velocity, etc.)" + + * Download the ``MCTennis-GeyserMC.zip`` file from [https://www.patreon.com/Shynixn](https://www.patreon.com/Shynixn). + * Extract the ``MCTennis-GeyserMC.zip`` contents into your ``plugins\Geyser-``. + * Extract the ``custom-skulls_mctennis.yml`` into ``plugins\Geyser-\custom-skulls_mctennis.yml`` + * Extract the ``packs/MCTennisPack.mcpack`` into ``plugins\Geyser-\packs\MCTennisPack.mcpack`` + * Copy the ``player-profiles`` values from ``plugins\Geyser-\custom-skulls_mctennis.yml`` into the ``plugins\Geyser-\custom-skulls.yml`` file. diff --git a/docs/wiki/docs/sign.md b/docs/wiki/docs/sign.md new file mode 100644 index 0000000..95c1f7d --- /dev/null +++ b/docs/wiki/docs/sign.md @@ -0,0 +1,31 @@ +# Signs + +This page explains how to create signs for joining and leave. + +### Create a join sign + +* Place a new sign in your world +* Execute the following command: + +``` +/mctennis sign game1 join +``` + +* Rightclick on a sign +* This sign simply executes the ``/mctennis join`` command on behalf of the player. You can create team join signs by searching for the created sign in your ``game1.yml`` and editing the command to e.g. ``/mctennis join red`` + +### Create a leave sign + +* Place a new sign in your world +* Execute the following command: + +``` +/mctennis sign game1 leave +``` + +* Rightclick on a sign +* This sign simply executes the ``/mctennis leave`` command on behalf of the player. + +### Removing a sign + +* Simply destroy the sign with your hand diff --git a/docs/wiki/mkdocs.yml b/docs/wiki/mkdocs.yml index 3267f32..abf08a3 100644 --- a/docs/wiki/mkdocs.yml +++ b/docs/wiki/mkdocs.yml @@ -7,6 +7,8 @@ nav: - Permission: permission.md - Creating the game: game.md - Interactions: interaction.md + - Signs: sign.md + - Bedrock: bedrock.md - Commands: commands.md - PlaceHolders: placeholders.md - Developer Api: api.md diff --git a/gradle.properties b/gradle.properties index 7fc6f1f..47e8cf5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1,2 @@ kotlin.code.style=official +org.gradle.jvmargs=-Xms4g diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fe753c9..81aa1c0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists \ No newline at end of file +zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index 4113f50..70aa72f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1 @@ rootProject.name = "mctennis" - -pluginManagement { - plugins { - kotlin("jvm") version "1.6.21" - } -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/MCTennisDependencyInjectionModule.kt b/src/main/kotlin/com/github/shynixn/mctennis/MCTennisDependencyInjectionModule.kt index 2b9093e..c087dbb 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/MCTennisDependencyInjectionModule.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/MCTennisDependencyInjectionModule.kt @@ -2,17 +2,26 @@ package com.github.shynixn.mctennis import com.fasterxml.jackson.core.type.TypeReference import com.github.shynixn.mccoroutine.bukkit.launch -import com.github.shynixn.mctennis.contract.* +import com.github.shynixn.mctennis.contract.GameService +import com.github.shynixn.mctennis.contract.MCTennisLanguage +import com.github.shynixn.mctennis.contract.TennisBallFactory import com.github.shynixn.mctennis.entity.TennisArena -import com.github.shynixn.mctennis.enumeration.PluginDependency -import com.github.shynixn.mctennis.impl.service.* +import com.github.shynixn.mctennis.impl.commandexecutor.MCTennisCommandExecutor +import com.github.shynixn.mctennis.impl.listener.GameListener +import com.github.shynixn.mctennis.impl.listener.PacketListener +import com.github.shynixn.mctennis.impl.listener.TennisListener +import com.github.shynixn.mctennis.impl.service.GameServiceImpl +import com.github.shynixn.mctennis.impl.service.TennisBallFactoryImpl import com.github.shynixn.mcutils.common.ConfigurationService import com.github.shynixn.mcutils.common.ConfigurationServiceImpl import com.github.shynixn.mcutils.common.CoroutineExecutor import com.github.shynixn.mcutils.common.chat.ChatMessageService import com.github.shynixn.mcutils.common.command.CommandService import com.github.shynixn.mcutils.common.command.CommandServiceImpl +import com.github.shynixn.mcutils.common.di.DependencyInjectionModule import com.github.shynixn.mcutils.common.item.ItemService +import com.github.shynixn.mcutils.common.language.globalChatMessageService +import com.github.shynixn.mcutils.common.language.globalPlaceHolderService import com.github.shynixn.mcutils.common.physic.PhysicObjectDispatcher import com.github.shynixn.mcutils.common.physic.PhysicObjectDispatcherImpl import com.github.shynixn.mcutils.common.physic.PhysicObjectService @@ -23,17 +32,17 @@ import com.github.shynixn.mcutils.common.repository.Repository import com.github.shynixn.mcutils.common.repository.YamlFileRepositoryImpl import com.github.shynixn.mcutils.common.sound.SoundService import com.github.shynixn.mcutils.common.sound.SoundServiceImpl -import com.github.shynixn.mcutils.guice.DependencyInjectionModule import com.github.shynixn.mcutils.packet.api.PacketService import com.github.shynixn.mcutils.packet.api.RayTracingService -import com.github.shynixn.mcutils.packet.impl.service.* +import com.github.shynixn.mcutils.packet.impl.service.ChatMessageServiceImpl +import com.github.shynixn.mcutils.packet.impl.service.ItemServiceImpl +import com.github.shynixn.mcutils.packet.impl.service.PacketServiceImpl +import com.github.shynixn.mcutils.packet.impl.service.RayTracingServiceImpl import com.github.shynixn.mcutils.sign.SignService import com.github.shynixn.mcutils.sign.SignServiceImpl -import org.bukkit.Bukkit import org.bukkit.plugin.Plugin -import java.util.logging.Level -class MCTennisDependencyInjectionModule(private val plugin: Plugin) : DependencyInjectionModule() { +class MCTennisDependencyInjectionModule(private val plugin: MCTennisPlugin, private val language: MCTennisLanguage) { companion object { val areLegacyVersionsIncluded: Boolean by lazy { try { @@ -45,20 +54,12 @@ class MCTennisDependencyInjectionModule(private val plugin: Plugin) : Dependency } } - /** - * Configures the business logic tree. - */ - override fun configure() { - // Common - addService(plugin) - addService { - val chatMessageService = getService() - val language = MCTennisLanguageImpl() - language.chatMessageService = chatMessageService - language.placeHolderFun = - { text, player -> getService().replacePlaceHolders(text, player) } - language - } + fun build(): DependencyInjectionModule { + val module = DependencyInjectionModule() + + // Params + module.addService(plugin) + module.addService(language) // Repositories val tennisArenaRepository = YamlFileRepositoryImpl(plugin, @@ -67,39 +68,83 @@ class MCTennisDependencyInjectionModule(private val plugin: Plugin) : Dependency listOf("arena_sample.yml"), object : TypeReference() {}) val cacheTennisArenaRepository = CachedRepositoryImpl(tennisArenaRepository) - addService>(cacheTennisArenaRepository) - addService>(cacheTennisArenaRepository) + module.addService>(cacheTennisArenaRepository) + module.addService>(cacheTennisArenaRepository) - // Services - addService { - SignServiceImpl(plugin, getService(), getService().noPermissionMessage.text) - } - addService { - PhysicObjectServiceImpl(plugin, getService()) + // Library Services + module.addService { + com.github.shynixn.mcutils.common.placeholder.PlaceHolderServiceImpl( + plugin + ) } - addService(CommandServiceImpl(object : CoroutineExecutor { + module.addService(CommandServiceImpl(object : CoroutineExecutor { override fun execute(f: suspend () -> Unit) { plugin.launch { f.invoke() } } })) - addService(ChatMessageServiceImpl(plugin)) - addService(PhysicObjectDispatcherImpl(plugin)) - addService(ConfigurationServiceImpl(plugin)) - addService(SoundServiceImpl(plugin)) - addService(PacketServiceImpl(plugin)) - addService(ItemServiceImpl()) - addService() - addService() - addService() - addService() + module.addService { + SignServiceImpl(plugin, module.getService(), language.noPermissionMessage.text) + } + module.addService { + PhysicObjectServiceImpl(plugin, module.getService()) + } + module.addService(ChatMessageServiceImpl(plugin)) + module.addService(PhysicObjectDispatcherImpl(plugin)) + module.addService(ConfigurationServiceImpl(plugin)) + module.addService(SoundServiceImpl(plugin)) + module.addService(PacketServiceImpl(plugin)) + module.addService(ItemServiceImpl()) + module.addService(RayTracingServiceImpl()) + + // Services + module.addService { + MCTennisCommandExecutor( + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService() + ) + } + module.addService { + GameListener(module.getService(), module.getService()) + } + module.addService { + PacketListener(module.getService(), module.getService(), module.getService()) + } + module.addService { + TennisListener(module.getService(), module.getService(), module.getService()) + } - if (Bukkit.getPluginManager().getPlugin(PluginDependency.PLACEHOLDERAPI.pluginName) != null) { - addService() - plugin.logger.log(Level.INFO, "Loaded dependency ${PluginDependency.PLACEHOLDERAPI.pluginName}.") - } else { - addService() + module.addService { + GameServiceImpl( + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService() + ) + } + module.addService { + TennisBallFactoryImpl( + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService(), + module.getService() + ) } + + plugin.globalChatMessageService = module.getService() + plugin.globalPlaceHolderService = module.getService() + return module } } diff --git a/src/main/kotlin/com/github/shynixn/mctennis/MCTennisLanguageImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/MCTennisLanguageImpl.kt index 988405e..bb8575e 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/MCTennisLanguageImpl.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/MCTennisLanguageImpl.kt @@ -1,120 +1,116 @@ package com.github.shynixn.mctennis -import com.github.shynixn.mctennis.contract.Language import com.github.shynixn.mcutils.common.language.LanguageItem -import com.github.shynixn.mcutils.common.language.LanguageProviderImpl +import com.github.shynixn.mctennis.contract.MCTennisLanguage -class MCTennisLanguageImpl() : Language, LanguageProviderImpl() { - override val names: List - get() = listOf("en_us") +class MCTennisLanguageImpl : MCTennisLanguage { + override val names: List + get() = listOf("en_us") + override var gameStartingMessage = LanguageItem("[&9MCTennis&f] Game is starting in %1$1d seconds.") - override var gameStartingMessage: LanguageItem = LanguageItem() + override var gameStartCancelledMessage = LanguageItem("[&9MCTennis&f] Game start has been cancelled.") - override var gameStartCancelledMessage: LanguageItem = LanguageItem() + override var gameDoesNotExistMessage = LanguageItem("[&9MCTennis&f] Game %1$1s does not exist.") - override var gameDoesNotExistMessage: LanguageItem = LanguageItem() + override var noPermissionForGameMessage = LanguageItem("[&9MCTennis&f] You do not have permission to join game %1$1s.") - override var noPermissionForGameMessage: LanguageItem = LanguageItem() + override var noPermissionMessage = LanguageItem("[&9MCTennis&f] You do not have permission.") - override var noPermissionMessage: LanguageItem = LanguageItem() + override var locationTypeDoesNotExistMessage = LanguageItem("[&9MCTennis&f] This location type is not known. For more locations, open the arena.yml.") - override var locationTypeDoesNotExistMessage: LanguageItem = LanguageItem() + override var spawnPointSetMessage = LanguageItem("[&9MCTennis&f] Location was set on %1$1s.") - override var spawnPointSetMessage: LanguageItem = LanguageItem() + override var gameAlreadyExistsMessage = LanguageItem("[&9MCTennis&f] Game %1$1s already exists.") - override var gameAlreadyExistsMessage: LanguageItem = LanguageItem() + override var enabledArenaMessage = LanguageItem("[&9MCTennis&f] Game enable state was set to %1$1s.") - override var enabledArenaMessage: LanguageItem = LanguageItem() + override var gameIsFullMessage = LanguageItem("[&9MCTennis&f] Game is already full.") - override var gameIsFullMessage: LanguageItem = LanguageItem() + override var gameCreatedMessage = LanguageItem("[&9MCTennis&f] Created game %1$1s.") - override var gameCreatedMessage: LanguageItem = LanguageItem() + override var reloadedAllGamesMessage = LanguageItem("[&9MCTennis&f] Reloaded all games.") - override var reloadedAllGamesMessage: LanguageItem = LanguageItem() + override var reloadedGameMessage = LanguageItem("[&9MCTennis&f] Reloaded game %1$1s.") - override var reloadedGameMessage: LanguageItem = LanguageItem() + override var joinTeamRedMessage = LanguageItem("[&9MCTennis&f] Successfully joined team red.") - override var joinTeamRedMessage: LanguageItem = LanguageItem() + override var joinTeamBlueMessage = LanguageItem("[&9MCTennis&f] Successfully joined team blue.") - override var joinTeamBlueMessage: LanguageItem = LanguageItem() + override var leftGameMessage = LanguageItem("[&9MCTennis&f] Left the game.") - override var leftGameMessage: LanguageItem = LanguageItem() + override var deletedGameMessage = LanguageItem("[&9MCTennis&f] Deleted game %1$1s.") - override var deletedGameMessage: LanguageItem = LanguageItem() + override var notEnoughPlayersMessage = LanguageItem("[&9MCTennis&f] Not enough players! Game start was cancelled.") - override var notEnoughPlayersMessage: LanguageItem = LanguageItem() + override var teamDoesNotExistMessage = LanguageItem("[&9MCTennis&f] Team %1$1s does not exist.") - override var teamDoesNotExistMessage: LanguageItem = LanguageItem() + override var updatedInventoryMessage = LanguageItem("[&9MCTennis&f] Updated inventory of game.") - override var updatedInventoryMessage: LanguageItem = LanguageItem() + override var updatedArmorMessage = LanguageItem("[&9MCTennis&f] Updated armor of game.") - override var updatedArmorMessage: LanguageItem = LanguageItem() + override var secondsRemaining = LanguageItem("[&9MCTennis&f] %1$1s second(s) remaining.") - override var secondsRemaining: LanguageItem = LanguageItem() + override var gameCancelledMessage = LanguageItem("[&9MCTennis&f] Game has been cancelled.") - override var gameCancelledMessage: LanguageItem = LanguageItem() + override var scoreRed = LanguageItem("&c&l%mctennis_game_score%") - override var scoreRed: LanguageItem = LanguageItem() + override var scoreBlue = LanguageItem("&9&l%mctennis_game_score%") - override var scoreBlue: LanguageItem = LanguageItem() + override var winRed = LanguageItem("&c&lTeam Red") - override var winRed: LanguageItem = LanguageItem() + override var winSetRed = LanguageItem("&cTeam Red") - override var winSetRed: LanguageItem = LanguageItem() + override var winBlue = LanguageItem("&9Team Blue") - override var winBlue: LanguageItem = LanguageItem() + override var winSetBlue = LanguageItem("&9Team Blue") - override var winSetBlue: LanguageItem = LanguageItem() + override var winDraw = LanguageItem("&fDraw") - override var winDraw: LanguageItem = LanguageItem() + override var readyMessage = LanguageItem("&6&lReady?") - override var readyMessage: LanguageItem = LanguageItem() + override var bounceOutHologram = LanguageItem("&lOut") - override var bounceOutHologram: LanguageItem = LanguageItem() + override var bounceSecondHologram = LanguageItem("&l2nd Bounce") - override var bounceSecondHologram: LanguageItem = LanguageItem() + override var joinSignLine1 = LanguageItem("&f[&r&lMCTennis&r&f]") - override var joinSignLine1: LanguageItem = LanguageItem() + override var joinSignLine2 = LanguageItem("%mctennis_game_stateDisplayName%") - override var joinSignLine2: LanguageItem = LanguageItem() + override var joinSignLine3 = LanguageItem("%mctennis_game_players%/%mctennis_game_maxPlayers%") - override var joinSignLine3: LanguageItem = LanguageItem() + override var joinSignLine4 = LanguageItem("") - override var joinSignLine4: LanguageItem = LanguageItem() + override var leaveSignLine1 = LanguageItem("&f[&r&lMCTennis&r&f]") - override var leaveSignLine1: LanguageItem = LanguageItem() + override var leaveSignLine2 = LanguageItem("&f&lLeave") - override var leaveSignLine2: LanguageItem = LanguageItem() + override var leaveSignLine3 = LanguageItem("%mctennis_game_players%/%mctennis_game_maxPlayers%") - override var leaveSignLine3: LanguageItem = LanguageItem() + override var leaveSignLine4 = LanguageItem("") - override var leaveSignLine4: LanguageItem = LanguageItem() + override var gameStateJoinAble = LanguageItem("&aJoin") - override var gameStateJoinAble: LanguageItem = LanguageItem() + override var gameStateDisabled = LanguageItem("&4Disabled") - override var gameStateDisabled: LanguageItem = LanguageItem() + override var gameStateRunning = LanguageItem("&1Running") - override var gameStateRunning: LanguageItem = LanguageItem() + override var rightClickOnSignMessage = LanguageItem("RightClick on a sign to convert it into a game sign.") - override var rightClickOnSignMessage: LanguageItem = LanguageItem() + override var signTypeDoesNotExist = LanguageItem("This sign type does not exist.") - override var signTypeDoesNotExist: LanguageItem = LanguageItem() + override var addedSignMessage = LanguageItem("A sign was added to the game.") - override var addedSignMessage: LanguageItem = LanguageItem() + override var commandDescription = LanguageItem("All commands for the MCTennis plugin.") - override var commandDescription: LanguageItem = LanguageItem() + override var commandUsage = LanguageItem("[&9MCTennis&f] Use /mctennis help to see more info about the plugin.") - override var commandUsage: LanguageItem = LanguageItem() + override var maxLength20Characters = LanguageItem("The text length has to be less than 20 characters.") - override var maxLength20Characters: LanguageItem = LanguageItem() + override var commandSenderHasToBePlayer = LanguageItem("The command sender has to be a player!") - override var commandSenderHasToBePlayer: LanguageItem = LanguageItem() + override var freeVersionMessage = LanguageItem("This version of MCTennis does only allow 1 game per server. Go to https://patreon.com/Shynixn for the premium version.") - override var freeVersionMessage: LanguageItem = LanguageItem() + override var commandPlaceHolderMessage = LanguageItem("Evaluated placeholder: %1$1s") - override var commandPlaceHolderMessage: LanguageItem = LanguageItem() - - override var queueTimeOutMessage: LanguageItem = LanguageItem().also { - it.text = "[&9MCTennis&f]&c Not enough players joined in time to start the game." - } + override var queueTimeOutMessage = LanguageItem("[&9MCTennis&f]&c Not enough players joined in time to start the game.") } diff --git a/src/main/kotlin/com/github/shynixn/mctennis/MCTennisPlugin.kt b/src/main/kotlin/com/github/shynixn/mctennis/MCTennisPlugin.kt index 3fe4be8..7c8eb02 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/MCTennisPlugin.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/MCTennisPlugin.kt @@ -1,17 +1,20 @@ package com.github.shynixn.mctennis import com.github.shynixn.mccoroutine.bukkit.launch -import com.github.shynixn.mctennis.contract.* +import com.github.shynixn.mctennis.contract.GameService +import com.github.shynixn.mctennis.contract.TennisBallFactory import com.github.shynixn.mctennis.entity.TennisArena -import com.github.shynixn.mctennis.enumeration.PluginDependency +import com.github.shynixn.mctennis.enumeration.PlaceHolder import com.github.shynixn.mctennis.impl.commandexecutor.MCTennisCommandExecutor import com.github.shynixn.mctennis.impl.exception.TennisGameException import com.github.shynixn.mctennis.impl.listener.GameListener import com.github.shynixn.mctennis.impl.listener.PacketListener import com.github.shynixn.mctennis.impl.listener.TennisListener import com.github.shynixn.mcutils.common.Version +import com.github.shynixn.mcutils.common.di.DependencyInjectionModule import com.github.shynixn.mcutils.common.language.reloadTranslation import com.github.shynixn.mcutils.common.physic.PhysicObjectService +import com.github.shynixn.mcutils.common.placeholder.PlaceHolderService import com.github.shynixn.mcutils.common.repository.Repository import com.github.shynixn.mcutils.packet.api.PacketInType import com.github.shynixn.mcutils.packet.api.PacketService @@ -23,13 +26,14 @@ import org.bukkit.plugin.java.JavaPlugin import java.util.logging.Level class MCTennisPlugin : JavaPlugin() { - companion object{ - var language : Language? = null + companion object { + var gameKey = "[game]" + var languageKey = "language" } private val prefix: String = org.bukkit.ChatColor.BLUE.toString() + "[MCTennis] " + org.bukkit.ChatColor.WHITE private var isLoaded = false - private lateinit var module: MCTennisDependencyInjectionModule + private lateinit var module: DependencyInjectionModule /** * Called when this plugin is enabled. @@ -37,7 +41,6 @@ class MCTennisPlugin : JavaPlugin() { override fun onEnable() { Bukkit.getServer().consoleSender.sendMessage(prefix + ChatColor.GREEN + "Loading MCTennis ...") this.saveDefaultConfig() - val versions = if (MCTennisDependencyInjectionModule.areLegacyVersionsIncluded) { listOf( Version.VERSION_1_8_R3, @@ -83,16 +86,17 @@ class MCTennisPlugin : JavaPlugin() { logger.log(Level.INFO, "Loaded NMS version ${Version.serverVersion}.") - // Guice - this.module = MCTennisDependencyInjectionModule(this).build() - this.reloadConfig() - - // Load Language - val mcTennisLanguage = module.getService() - MCTennisPlugin.language = mcTennisLanguage - reloadTranslation(mcTennisLanguage as MCTennisLanguageImpl, MCTennisLanguageImpl::class.java) + // Load MCTennisLanguage + val language = MCTennisLanguageImpl() + reloadTranslation(language) logger.log(Level.INFO, "Loaded language file.") + // Module + this.module = MCTennisDependencyInjectionModule(this, language).build() + + // Register PlaceHolder + PlaceHolder.registerAll(module.getService(), module.getService(), language) + // Register Packet module.getService().registerPacketListening(PacketInType.USEENTITY) @@ -100,29 +104,22 @@ class MCTennisPlugin : JavaPlugin() { Bukkit.getPluginManager().registerEvents(module.getService(), this) Bukkit.getPluginManager().registerEvents(module.getService(), this) Bukkit.getPluginManager().registerEvents(module.getService(), this) - Bukkit.getPluginManager().registerEvents(module.getService(), this) // Register CommandExecutor module.getService() - // Register Dependencies - if (Bukkit.getPluginManager().getPlugin(PluginDependency.GEYSER_SPIGOT.pluginName) != null) { - logger.log(Level.INFO, "Loaded dependency ${PluginDependency.GEYSER_SPIGOT.pluginName}.") - } - // Service dependencies Bukkit.getServicesManager().register( TennisBallFactory::class.java, - module.getService(), + module.getService(), this, ServicePriority.Normal ) Bukkit.getServicesManager() - .register(GameService::class.java, module.getService(), this, ServicePriority.Normal) + .register(GameService::class.java, module.getService(), this, ServicePriority.Normal) val plugin = this plugin.launch { - // Load Language // Load Games val gameService = module.getService() try { @@ -152,12 +149,13 @@ class MCTennisPlugin : JavaPlugin() { if (signMeta.tag != null) { val game = gameService.getByName(signMeta.tag!!) if (game != null) { - resolvedText = placeHolderService.replacePlaceHolders(text, null, game) + resolvedText = + placeHolderService.resolvePlaceHolder(text, null, mapOf(gameKey to game.arena.name)) } } if (resolvedText == null) { - resolvedText = placeHolderService.replacePlaceHolders(text) + resolvedText = placeHolderService.resolvePlaceHolder(text, null) } resolvedText diff --git a/src/main/kotlin/com/github/shynixn/mctennis/contract/BedrockService.kt b/src/main/kotlin/com/github/shynixn/mctennis/contract/BedrockService.kt deleted file mode 100644 index eb18f06..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/contract/BedrockService.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.github.shynixn.mctennis.contract - -import org.bukkit.entity.Player -import org.bukkit.event.Listener - -interface BedrockService : Listener { - /** - * All bedrock players. - */ - val bedRockPlayers: HashSet - - /** - * All java players. - */ - val javaPlayers: HashSet -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/contract/Language.kt b/src/main/kotlin/com/github/shynixn/mctennis/contract/MCTennisLanguage.kt similarity index 97% rename from src/main/kotlin/com/github/shynixn/mctennis/contract/Language.kt rename to src/main/kotlin/com/github/shynixn/mctennis/contract/MCTennisLanguage.kt index c160004..aeb7042 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/contract/Language.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/contract/MCTennisLanguage.kt @@ -3,7 +3,7 @@ package com.github.shynixn.mctennis.contract import com.github.shynixn.mcutils.common.language.LanguageItem import com.github.shynixn.mcutils.common.language.LanguageProvider -interface Language : LanguageProvider { +interface MCTennisLanguage : LanguageProvider { var gameStartingMessage: LanguageItem var gameStartCancelledMessage: LanguageItem diff --git a/src/main/kotlin/com/github/shynixn/mctennis/contract/PlaceHolderService.kt b/src/main/kotlin/com/github/shynixn/mctennis/contract/PlaceHolderService.kt deleted file mode 100644 index 4b11baa..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/contract/PlaceHolderService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.github.shynixn.mctennis.contract - -import org.bukkit.entity.Player - -interface PlaceHolderService { - /** - * Replaces the placeholders. - */ - fun replacePlaceHolders(text: String, player: Player? = null, game: TennisGame? = null): String -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/entity/TennisBallSettings.kt b/src/main/kotlin/com/github/shynixn/mctennis/entity/TennisBallSettings.kt index bcd0782..359a612 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/entity/TennisBallSettings.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/entity/TennisBallSettings.kt @@ -1,6 +1,5 @@ package com.github.shynixn.mctennis.entity -import com.github.shynixn.mctennis.enumeration.VisibilityType import com.github.shynixn.mcutils.common.EffectTargetType import com.github.shynixn.mcutils.common.command.CommandMeta import com.github.shynixn.mcutils.common.item.Item @@ -83,16 +82,6 @@ class TennisBallSettings { */ var clickCooldown: Int = 2000 - /** - * Slime visibility. - */ - var slimeVisibility: VisibilityType = VisibilityType.BEDROCK - - /** - * Armorstand visiblity. - */ - var armorstandVisibility: VisibilityType = VisibilityType.JAVA - /** * Should the ball collide with water blocks or lava? */ diff --git a/src/main/kotlin/com/github/shynixn/mctennis/enumeration/PlaceHolder.kt b/src/main/kotlin/com/github/shynixn/mctennis/enumeration/PlaceHolder.kt index 68d2c61..88e6779 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/enumeration/PlaceHolder.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/enumeration/PlaceHolder.kt @@ -1,32 +1,164 @@ package com.github.shynixn.mctennis.enumeration -enum class PlaceHolder(val fullPlaceHolder: String) { +import com.github.shynixn.mctennis.MCTennisPlugin +import com.github.shynixn.mctennis.contract.GameService +import com.github.shynixn.mctennis.contract.MCTennisLanguage +import com.github.shynixn.mctennis.contract.TennisGame +import com.github.shynixn.mcutils.common.placeholder.PlaceHolderService +import org.bukkit.entity.Player + +enum class PlaceHolder(val text: String, val f: (Player?, TennisGame?, Map?) -> String?) { // Game - GAME_ENABLED("%mctennis_game_isEnabled%"), - GAME_JOINABLE("%mctennis_game_isJoinAble%"), - GAME_STARTED("%mctennis_game_isRunning%"), - GAME_DISPLAYNAME("%mctennis_game_displayName%"), - GAME_RAWSCORETEAMRED("%mctennis_game_rawScoreTeamRed%"), - GAME_RAWSCORETEAMBLUE("%mctennis_game_rawScoreTeamBlue%"), - GAME_SCORE("%mctennis_game_score%"), - GAME_CURRENT_SET("%mctennis_game_currentSet%"), - GAME_WON_SETS_TEAM_RED("%mctennis_game_wonSetsTeamRed%"), - GAME_WON_SETS_TEAM_BLUE("%mctennis_game_wonSetsTeamBlue%"), - GAME_STATE("%mctennis_game_state%"), - GAME_STATE_DISPLAYNAME("%mctennis_game_stateDisplayName%"), - GAME_PLAYER_AMOUNT("%mctennis_game_players%"), - GAME_MAX_PLAYER_AMOUNT("%mctennis_game_maxPlayers%"), + GAME_NAME("%mctennis_game_name_[game]%", { _, game, _ -> game?.arena?.name }), + GAME_DISPLAYNAME("%mctennis_game_displayName_[game]%", { _, game, _ -> game?.arena?.displayName }), + GAME_SUM_MAXPLAYERS("%mctennis_game_maxPlayers_[game]%", { _, game, _ -> + if (game != null) { + (game.arena.maxPlayersPerTeam * 2).toString() + } else { + null + } + }), + GAME_ENABLED("%mctennis_game_isEnabled_[game]%", { _, game, _ -> game?.arena?.isEnabled?.toString() }), + GAME_JOINABLE("%mctennis_game_isJoinAble_[game]%", { _, game, _ -> + if (game != null) { + ((game.gameState == GameState.LOBBY_IDLE || game.gameState == GameState.LOBBY_COUNTDOWN) && !game.isFull()).toString() + } else { + null + } + }), + GAME_STARTED("%mctennis_game_isRunning_[game]%", { _, game, _ -> + if (game != null) { + (game.gameState == GameState.RUNNING_SERVING || game.gameState == GameState.RUNNING_PLAYING).toString() + } else { + null + } + }), + GAME_RAWSCORETEAMRED("%mctennis_game_rawScoreTeamRed_[game]%", { _, game, _ -> game?.teamRedScore?.toString() }), + GAME_RAWSCORETEAMBLUE("%mctennis_game_rawScoreTeamBlue_[game]%", { _, game, _ -> game?.teamBlueScore?.toString() }), + GAME_SCORE("%mctennis_game_score_[game]%", { _, game, _ -> game?.getScoreText() }), + GAME_CURRENT_SET("%mctennis_game_currentSet_[game]%", { _, game, _ -> game?.currentSet?.toString() }), + GAME_WON_SETS_TEAM_RED( + "%mctennis_game_wonSetsTeamRed_[game]%", + { _, game, _ -> game?.teamRedSetScore?.toString() }), + GAME_WON_SETS_TEAM_BLUE( + "%mctennis_game_wonSetsTeamBlue_[game]%", + { _, game, _ -> game?.teamBlueSetScore?.toString() }), + GAME_STATE("%mctennis_game_state%", { _, game, _ -> + if (game != null) { + if (!game.arena.isEnabled) { + "DISABLED" + } else if (game.gameState == GameState.RUNNING_PLAYING || game.gameState == GameState.RUNNING_SERVING || game.gameState == GameState.ENDING) { + "RUNNING" + } else { + "JOINABLE" + } + } else { + null + } + }), + GAME_STATE_DISPLAYNAME("%mctennis_game_stateDisplayName_[game]%", { _, game, context -> + val language = context?.get(MCTennisPlugin.languageKey) as MCTennisLanguage? + if (language != null && game != null) { + if (!game.arena.isEnabled) { + language.gameStateDisabled.text + } else if (game.gameState == GameState.RUNNING_PLAYING || game.gameState == GameState.RUNNING_SERVING || game.gameState == GameState.ENDING) { + language.gameStateRunning.text + } else { + language.gameStateJoinAble.text + } + } else { + null + } + }), + GAME_PLAYER_AMOUNT("%mctennis_game_players_[game]%", { _, game, _ -> + if (game != null) { + (game.teamBluePlayers.size + game.teamRedPlayers.size).toString() + } else { + null + } + }), + // Game (Ball) - GAME_BALL_LOCATION_WORLD("%mctennis_ball_locationWorld%"), - GAME_BALL_LOCATION_X("%mctennis_ball_locationX%"), - GAME_BALL_LOCATION_Y("%mctennis_ball_locationY%"), - GAME_BALL_LOCATION_Z("%mctennis_ball_locationZ%"), - GAME_BALL_LOCATION_YAW("%mctennis_ball_locationYaw%"), - GAME_BALL_LOCATION_PITCH("%mctennis_ball_locationPitch%"), + GAME_BALL_LOCATION_WORLD("%mctennis_ball_locationWorld_[game]%", { _, game, _ -> + if (game?.ball != null && !game.ball!!.isDead) { + game.ball!!.getLocation().world!!.name + } else { + "" + } + }), + GAME_BALL_LOCATION_X("%mctennis_ball_locationX_[game]%", { _, game, _ -> + if (game?.ball != null && !game.ball!!.isDead) { + game.ball!!.getLocation().x.toString() + } else { + "0" + } + }), + GAME_BALL_LOCATION_Y("%mctennis_ball_locationY_[game]%", { _, game, _ -> + if (game?.ball != null && !game.ball!!.isDead) { + game.ball!!.getLocation().y.toString() + } else { + "0" + } + }), + GAME_BALL_LOCATION_Z("%mctennis_ball_locationZ_[game]%", { _, game, _ -> + if (game?.ball != null && !game.ball!!.isDead) { + game.ball!!.getLocation().z.toString() + } else { + "0" + } + }), + GAME_BALL_LOCATION_YAW("%mctennis_ball_locationYaw_[game]%", { _, game, _ -> + if (game?.ball != null && !game.ball!!.isDead) { + game.ball!!.getLocation().yaw.toString() + } else { + "0" + } + }), + GAME_BALL_LOCATION_PITCH("%mctennis_ball_locationPitch_[game]%", { _, game, _ -> + if (game?.ball != null && !game.ball!!.isDead) { + game.ball!!.getLocation().pitch.toString() + } else { + "0" + } + }), + // Player - PLAYER_ISINGAME("%mctennis_player_isInGame%"), - PLAYER_NAME("%mctennis_player_name%"), + PLAYER_ISINGAME("%mctennis_player_isInGame%", { _, game, _ -> (game != null).toString() }), + PLAYER_NAME("%mctennis_player_name%", { player, _, _ -> player?.name }), + // Player and Game - GAME_ISTEAMREDPLAYER("%mctennis_game_isTeamRedPlayer%"), - GAME_ISTEAMBLUEPLAYER("%mctennis_game_isTeamBluePlayer%"), + GAME_ISTEAMREDPLAYER( + "%mctennis_game_isTeamRedPlayer_[game]%", + { player, game, _ -> game?.teamRedPlayers?.contains(player)?.toString() }), + GAME_ISTEAMBLUEPLAYER( + "%mctennis_game_isTeamBluePlayer_[game]%", + { player, game, _ -> game?.teamBluePlayers?.contains(player)?.toString() }); + + companion object { + /** + * Registers all placeHolder. Overrides previously registered placeholders. + */ + fun registerAll( + placeHolderService: PlaceHolderService, + gameService: GameService, + language: MCTennisLanguage + ) { + for (placeHolder in PlaceHolder.values()) { + placeHolderService.register(placeHolder.text) { player, context -> + val newContext = context.toMutableMap() + newContext[MCTennisPlugin.languageKey] = language + val gameNameReference = newContext[MCTennisPlugin.gameKey] as String? + val game = if (gameNameReference != null) { + gameService.getByName(gameNameReference) + } else if (player != null) { + gameService.getByPlayer(player) + } else { + null + } + + placeHolder.f.invoke(player, game, newContext) + } + } + } + } } diff --git a/src/main/kotlin/com/github/shynixn/mctennis/enumeration/PluginDependency.kt b/src/main/kotlin/com/github/shynixn/mctennis/enumeration/PluginDependency.kt deleted file mode 100644 index bbe4853..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/enumeration/PluginDependency.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.github.shynixn.mctennis.enumeration - -/** - * Plugin dependency. - */ -enum class PluginDependency( - /** - * Plugin name. - */ - val pluginName: String) { - /** - * PlaceHolderApi plugin. - */ - PLACEHOLDERAPI("PlaceholderAPI"), - - /** - * Geyser - */ - GEYSER_SPIGOT("Geyser-Spigot") -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/enumeration/VisibilityType.kt b/src/main/kotlin/com/github/shynixn/mctennis/enumeration/VisibilityType.kt deleted file mode 100644 index 01820e7..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/enumeration/VisibilityType.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.shynixn.mctennis.enumeration - -enum class VisibilityType { - NONE, - ALL, - BEDROCK, - JAVA -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/TennisGameImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/TennisGameImpl.kt index f6a3d75..9162617 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/TennisGameImpl.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/TennisGameImpl.kt @@ -4,7 +4,11 @@ import com.github.shynixn.mccoroutine.bukkit.CoroutineTimings import com.github.shynixn.mccoroutine.bukkit.launch import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher import com.github.shynixn.mccoroutine.bukkit.ticks -import com.github.shynixn.mctennis.contract.* +import com.github.shynixn.mctennis.MCTennisPlugin +import com.github.shynixn.mctennis.contract.MCTennisLanguage +import com.github.shynixn.mctennis.contract.TennisBall +import com.github.shynixn.mctennis.contract.TennisBallFactory +import com.github.shynixn.mctennis.contract.TennisGame import com.github.shynixn.mctennis.entity.PlayerData import com.github.shynixn.mctennis.entity.TeamMetadata import com.github.shynixn.mctennis.entity.TennisArena @@ -18,6 +22,9 @@ import com.github.shynixn.mcutils.common.ChatColor import com.github.shynixn.mcutils.common.chat.ChatMessageService import com.github.shynixn.mcutils.common.command.CommandMeta import com.github.shynixn.mcutils.common.command.CommandService +import com.github.shynixn.mcutils.common.language.LanguageItem +import com.github.shynixn.mcutils.common.language.sendPluginMessage +import com.github.shynixn.mcutils.common.placeholder.PlaceHolderService import com.github.shynixn.mcutils.common.toLocation import kotlinx.coroutines.delay import org.bukkit.Bukkit @@ -34,7 +41,7 @@ class TennisGameImpl( private val plugin: Plugin, private val commandService: CommandService, private val placeHolderService: PlaceHolderService, - private val language: Language + private val language: MCTennisLanguage ) : TennisGame { private var isDisposed = false private var currentQueueTime = arena.queueTimeOutSec @@ -232,11 +239,10 @@ class TennisGameImpl( if (team == Team.RED) { teamRedScore++ - language.sendMessageToPlayers(language.scoreRed, getPlayers(), player.name) - + sendMessageToPlayers(getPlayers(), language.scoreRed, player.name) } else { teamBlueScore++ - language.sendMessageToPlayers(language.scoreBlue, getPlayers(), player.name) + sendMessageToPlayers(getPlayers(), language.scoreBlue, player.name) } plugin.launch { @@ -261,17 +267,17 @@ class TennisGameImpl( // Wait in lobby. for (i in 0 until arena.timeToStart) { val remaining = arena.timeToStart - i - language.sendMessageToPlayers(language.gameStartingMessage, getPlayers(), remaining) + sendMessageToPlayers(getPlayers(), language.gameStartingMessage, remaining) delay(1000L) if (!arena.isEnabled) { dispose() - language.sendMessageToPlayers(language.gameStartCancelledMessage, getPlayers()) + sendMessageToPlayers(getPlayers(), language.gameStartCancelledMessage) return } if (teamBluePlayers.size < arena.minPlayersPerTeam || teamRedPlayers.size < arena.minPlayersPerTeam) { - language.sendMessageToPlayers(language.notEnoughPlayersMessage, getPlayers()) + sendMessageToPlayers(getPlayers(), language.notEnoughPlayersMessage) gameState = GameState.LOBBY_IDLE queueTimeOut() return @@ -335,15 +341,15 @@ class TennisGameImpl( val remaining = arena.gameTime - i if (remaining == 30) { - language.sendMessageToPlayers(language.secondsRemaining, getPlayers(), 30) + sendMessageToPlayers(getPlayers(), language.secondsRemaining, 30) } if (remaining <= 10) { - language.sendMessageToPlayers(language.secondsRemaining, getPlayers(), remaining) + sendMessageToPlayers(getPlayers(), language.secondsRemaining, remaining) } if (!arena.isEnabled) { - language.sendMessageToPlayers(language.gameCancelledMessage, getPlayers()) + sendMessageToPlayers(getPlayers(), language.gameCancelledMessage) dispose() return } @@ -459,7 +465,7 @@ class TennisGameImpl( ball = tennisBallFactory.createTennisBall(ballspawnpoint.toLocation(), arena.ballSettings, this) delay(500) - language.sendMessageToPlayers(language.readyMessage, getPlayers()) + sendMessageToPlayers(getPlayers(), language.readyMessage) delay(1500) ball!!.setVelocity(Vector(0.0, 0.2, 0.0)) ball!!.allowActions = true @@ -492,12 +498,12 @@ class TennisGameImpl( when (team) { Team.RED -> { teamRedSetScore++ - language.sendMessageToPlayers(language.winSetRed, getPlayers()) + sendMessageToPlayers(getPlayers(), language.winSetRed) } else -> { teamBlueSetScore++ - language.sendMessageToPlayers(language.winSetBlue, getPlayers()) + sendMessageToPlayers(getPlayers(), language.winSetBlue) } } @@ -527,19 +533,19 @@ class TennisGameImpl( private suspend fun winGame(team: Team? = null) { when (team) { null -> { - language.sendMessageToPlayers(language.winDraw, getPlayers()) + sendMessageToPlayers(getPlayers(), language.winDraw) executeCommandsWithPlaceHolder(teamRedPlayers, arena.redTeamMeta.drawCommands) executeCommandsWithPlaceHolder(teamBluePlayers, arena.blueTeamMeta.drawCommands) } Team.RED -> { - language.sendMessageToPlayers(language.winRed, getPlayers()) + sendMessageToPlayers(getPlayers(), language.winRed) executeCommandsWithPlaceHolder(teamRedPlayers, arena.redTeamMeta.winCommands) executeCommandsWithPlaceHolder(teamBluePlayers, arena.blueTeamMeta.looseCommands) } else -> { - language.sendMessageToPlayers(language.winBlue, getPlayers()) + sendMessageToPlayers(getPlayers(), language.winBlue) executeCommandsWithPlaceHolder(teamBluePlayers, arena.blueTeamMeta.winCommands) executeCommandsWithPlaceHolder(teamRedPlayers, arena.redTeamMeta.looseCommands) } @@ -713,8 +719,8 @@ class TennisGameImpl( private fun executeCommandsWithPlaceHolder(players: List, commands: List) { commandService.executeCommands(players, commands) { c, p -> - placeHolderService.replacePlaceHolders( - c, p, this + placeHolderService.resolvePlaceHolder( + c, p, mapOf(MCTennisPlugin.gameKey to this.arena.name) ) } } @@ -734,7 +740,7 @@ class TennisGameImpl( if (currentQueueTime <= 0) { isQueueTimeRunning = false for (player in cachedData.keys.toTypedArray()) { - language.sendMessage(language.queueTimeOutMessage, player) + player.sendPluginMessage(language.queueTimeOutMessage) leave(player) } gameState = GameState.LOBBY_IDLE @@ -745,4 +751,14 @@ class TennisGameImpl( } } } + + private fun sendMessageToPlayers(players: List, languageItem: LanguageItem, param: Any? = null) { + for (player in players) { + if (param != null) { + player.sendPluginMessage(languageItem, param) + } else { + player.sendPluginMessage(languageItem) + } + } + } } diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/commandexecutor/MCTennisCommandExecutor.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/commandexecutor/MCTennisCommandExecutor.kt index 0555989..b996b5a 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/commandexecutor/MCTennisCommandExecutor.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/commandexecutor/MCTennisCommandExecutor.kt @@ -2,10 +2,8 @@ package com.github.shynixn.mctennis.impl.commandexecutor import com.github.shynixn.mccoroutine.bukkit.launch import com.github.shynixn.mctennis.MCTennisDependencyInjectionModule -import com.github.shynixn.mctennis.MCTennisLanguageImpl import com.github.shynixn.mctennis.contract.GameService -import com.github.shynixn.mctennis.contract.Language -import com.github.shynixn.mctennis.contract.PlaceHolderService +import com.github.shynixn.mctennis.contract.MCTennisLanguage import com.github.shynixn.mctennis.entity.TeamMetadata import com.github.shynixn.mctennis.entity.TennisArena import com.github.shynixn.mctennis.enumeration.JoinResult @@ -13,16 +11,20 @@ import com.github.shynixn.mctennis.enumeration.LocationType import com.github.shynixn.mctennis.enumeration.Permission import com.github.shynixn.mctennis.enumeration.Team import com.github.shynixn.mctennis.impl.exception.TennisGameException -import com.github.shynixn.mcutils.common.* +import com.github.shynixn.mcutils.common.ChatColor +import com.github.shynixn.mcutils.common.CoroutineExecutor import com.github.shynixn.mcutils.common.chat.ChatMessageService import com.github.shynixn.mcutils.common.command.CommandBuilder import com.github.shynixn.mcutils.common.command.CommandMeta import com.github.shynixn.mcutils.common.command.CommandType import com.github.shynixn.mcutils.common.command.Validator import com.github.shynixn.mcutils.common.language.reloadTranslation +import com.github.shynixn.mcutils.common.language.sendPluginMessage +import com.github.shynixn.mcutils.common.placeholder.PlaceHolderService import com.github.shynixn.mcutils.common.repository.CacheRepository +import com.github.shynixn.mcutils.common.toVector3d +import com.github.shynixn.mcutils.common.translateChatColors import com.github.shynixn.mcutils.sign.SignService -import com.google.inject.Inject import org.bukkit.command.CommandSender import org.bukkit.configuration.file.YamlConfiguration import org.bukkit.entity.Player @@ -30,12 +32,12 @@ import org.bukkit.plugin.Plugin import java.util.* import java.util.logging.Level -class MCTennisCommandExecutor @Inject constructor( +class MCTennisCommandExecutor( private val arenaRepository: CacheRepository, private val gameService: GameService, private val plugin: Plugin, private val signService: SignService, - private val language: Language, + private val language: MCTennisLanguage, private val placeHolderService: PlaceHolderService, chatMessageService: ChatMessageService ) { @@ -243,10 +245,10 @@ class MCTennisCommandExecutor @Inject constructor( subCommand("placeholder") { permission(Permission.EDIT_GAME) builder().argument("placeholder").tabs { listOf("<>") }.execute { sender, placeHolder -> - val evaluatedValue = placeHolderService.replacePlaceHolders(placeHolder) + val evaluatedValue = placeHolderService.resolvePlaceHolder(placeHolder, null) sender.sendMessage(language.commandPlaceHolderMessage.text.format(evaluatedValue)) }.executePlayer({ language.commandSenderHasToBePlayer.text }) { player, placeHolder -> - val evaluatedValue = placeHolderService.replacePlaceHolders(placeHolder, player) + val evaluatedValue = placeHolderService.resolvePlaceHolder(placeHolder, player) player.sendMessage(language.commandPlaceHolderMessage.text.format(evaluatedValue)) } } @@ -268,7 +270,7 @@ class MCTennisCommandExecutor @Inject constructor( private suspend fun createArena(sender: CommandSender, name: String, displayName: String) { if (arenaRepository.getAll().size > 0 && !MCTennisDependencyInjectionModule.areLegacyVersionsIncluded) { - language.sendMessage(language.freeVersionMessage, sender) + sender.sendPluginMessage(language.freeVersionMessage) return } @@ -276,7 +278,7 @@ class MCTennisCommandExecutor @Inject constructor( arena.name = name arena.displayName = displayName arenaRepository.save(arena) - language.sendMessage(language.gameCreatedMessage, sender, name) + sender.sendPluginMessage(language.gameCreatedMessage, name) } private suspend fun deleteArena(sender: CommandSender, arena: TennisArena) { @@ -477,10 +479,10 @@ class MCTennisCommandExecutor @Inject constructor( sender.sendMessage(language.rightClickOnSignMessage.text) signService.addSignByRightClick(sender) { sign -> sign.let { - it.line1 = "%mctennis_lang_joinSignLine1%" - it.line2 = "%mctennis_lang_joinSignLine2%" - it.line3 = "%mctennis_lang_joinSignLine3%" - it.line4 = "%mctennis_lang_joinSignLine4%" + it.line1 = language.joinSignLine1.text + it.line2 = language.joinSignLine2.text + it.line3 = language.joinSignLine3.text + it.line4 = language.joinSignLine4.text it.cooldown = 20 it.update = 40 it.commands = mutableListOf(CommandMeta().also { @@ -503,10 +505,10 @@ class MCTennisCommandExecutor @Inject constructor( sender.sendMessage(language.rightClickOnSignMessage.text) signService.addSignByRightClick(sender) { sign -> sign.let { - it.line1 = "%mctennis_lang_leaveSignLine1%" - it.line2 = "%mctennis_lang_leaveSignLine2%" - it.line3 = "%mctennis_lang_leaveSignLine3%" - it.line4 = "%mctennis_lang_leaveSignLine4%" + it.line1 = language.leaveSignLine1.text + it.line2 = language.leaveSignLine2.text + it.line3 = language.leaveSignLine3.text + it.line4 = language.leaveSignLine4.text it.cooldown = 20 it.update = 40 it.commands = mutableListOf(CommandMeta().also { @@ -541,7 +543,7 @@ class MCTennisCommandExecutor @Inject constructor( if (arena == null) { plugin.reloadConfig() - plugin.reloadTranslation(language as MCTennisLanguageImpl, MCTennisLanguageImpl::class.java) + plugin.reloadTranslation(language) plugin.logger.log(Level.INFO, "Loaded language file.") try { diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/GameListener.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/GameListener.kt index fca281a..67d3988 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/GameListener.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/GameListener.kt @@ -4,14 +4,13 @@ import com.github.shynixn.mccoroutine.bukkit.launch import com.github.shynixn.mctennis.contract.GameService import com.github.shynixn.mctennis.enumeration.GameState import com.github.shynixn.mctennis.event.GameEndEvent -import com.google.inject.Inject import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerMoveEvent import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.plugin.Plugin -class GameListener @Inject constructor(private val gameService: GameService, private val plugin: Plugin) : Listener { +class GameListener (private val gameService: GameService, private val plugin: Plugin) : Listener { /** * Handles leaving state. */ diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/PacketListener.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/PacketListener.kt index c20b349..55dce91 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/PacketListener.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/PacketListener.kt @@ -7,12 +7,11 @@ import com.github.shynixn.mcutils.common.physic.PhysicObjectService import com.github.shynixn.mcutils.packet.api.event.PacketAsyncEvent import com.github.shynixn.mcutils.packet.api.meta.enumeration.InteractionType import com.github.shynixn.mcutils.packet.api.packet.PacketInInteractEntity -import com.google.inject.Inject import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.plugin.Plugin -class PacketListener @Inject constructor( +class PacketListener ( private val physicObjectApi: PhysicObjectService, private val gameService: GameService, private val plugin: Plugin diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/TennisListener.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/TennisListener.kt index 4f55a9c..0f56cf3 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/TennisListener.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/listener/TennisListener.kt @@ -1,7 +1,7 @@ package com.github.shynixn.mctennis.impl.listener import com.github.shynixn.mccoroutine.bukkit.launch -import com.github.shynixn.mctennis.contract.Language +import com.github.shynixn.mctennis.contract.MCTennisLanguage import com.github.shynixn.mctennis.contract.TennisBall import com.github.shynixn.mctennis.contract.TennisGame import com.github.shynixn.mctennis.entity.TennisArena @@ -14,17 +14,16 @@ import com.github.shynixn.mcutils.packet.api.meta.enumeration.EntityType import com.github.shynixn.mcutils.packet.api.packet.PacketOutEntityDestroy import com.github.shynixn.mcutils.packet.api.packet.PacketOutEntityMetadata import com.github.shynixn.mcutils.packet.api.packet.PacketOutEntitySpawn -import com.google.inject.Inject import kotlinx.coroutines.delay import org.bukkit.Location import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.plugin.Plugin -class TennisListener @Inject constructor( +class TennisListener ( private val packetService: PacketService, private val plugin: Plugin, - private val language : Language + private val language : MCTennisLanguage ) : Listener { /** * Handles ground bouncing. diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/ArmorstandEntityComponent.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/ArmorstandEntityComponent.kt index 4e3ed18..4c7074a 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/ArmorstandEntityComponent.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/ArmorstandEntityComponent.kt @@ -19,7 +19,6 @@ class ArmorstandEntityComponent( private val itemService: ItemService, private val ballSettings: TennisBallSettings, val entityId: Int, - private var filteredPlayers: HashSet, private val renderOffsetY : Double ) : PhysicComponent { private var rotation = 0.0 @@ -31,10 +30,6 @@ class ArmorstandEntityComponent( } private fun onPlayerSpawn(player: Player, location: Location) { - if (filteredPlayers.contains(player)) { - return - } - packetService.sendPacketOutEntitySpawn(player, PacketOutEntitySpawn().also { it.entityId = this.entityId it.entityType = EntityType.ARMOR_STAND @@ -56,10 +51,6 @@ class ArmorstandEntityComponent( } private fun onPlayerRemove(player: Player) { - if (filteredPlayers.contains(player)) { - return - } - val outer = this packetService.sendPacketOutEntityDestroy(player, PacketOutEntityDestroy().also { it.entityIds = listOf(outer.entityId) @@ -70,9 +61,6 @@ class ArmorstandEntityComponent( val players = playerComponent.visiblePlayers for (player in players) { - if (filteredPlayers.contains(player)) { - continue - } packetService.sendPacketOutEntityVelocity(player, PacketOutEntityVelocity().also { it.entityId = this.entityId @@ -109,10 +97,6 @@ class ArmorstandEntityComponent( val players = playerComponent.visiblePlayers for (player in players) { - if (filteredPlayers.contains(player)) { - continue - } - packetService.sendPacketOutEntityMetadata(player, PacketOutEntityMetadata().also { it.entityId = this.entityId it.armorStandHeadRotation = EulerAngle(rotation, 0.0, 0.0) diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/SlimeEntityComponent.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/SlimeEntityComponent.kt index 2919fb7..fccc076 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/SlimeEntityComponent.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/physic/SlimeEntityComponent.kt @@ -15,9 +15,7 @@ class SlimeEntityComponent( private val playerComponent: PlayerComponent, private val packetService: PacketService, val entityId: Int, - private val slimeSize: Int, - var filteredPlayers: HashSet - ) : PhysicComponent { + private val slimeSize: Int) : PhysicComponent { init { playerComponent.onSpawnMinecraft.add { player, location -> onPlayerSpawn(player, location) } @@ -32,18 +30,11 @@ class SlimeEntityComponent( it.target = location }) - if (!filteredPlayers.contains(player)) { - packetService.sendPacketOutEntityMetadata(player, PacketOutEntityMetadata().also { - it.entityId = this.entityId - it.slimeSize = this.slimeSize - }) - } else { - packetService.sendPacketOutEntityMetadata(player, PacketOutEntityMetadata().also { - it.entityId = this.entityId - it.slimeSize = this.slimeSize - it.isInvisible = true - }) - } + packetService.sendPacketOutEntityMetadata(player, PacketOutEntityMetadata().also { + it.entityId = this.entityId + it.slimeSize = this.slimeSize + it.isInvisible = true + }) } private fun onPlayerRemove(player: Player) { diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/BedrockServiceImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/BedrockServiceImpl.kt deleted file mode 100644 index 366c2f1..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/BedrockServiceImpl.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.github.shynixn.mctennis.impl.service - -import com.github.shynixn.mccoroutine.bukkit.launch -import com.github.shynixn.mctennis.contract.BedrockService -import com.github.shynixn.mcutils.common.physic.PhysicObjectDispatcher -import com.google.inject.Inject -import org.bukkit.Bukkit -import org.bukkit.entity.Player -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerJoinEvent -import org.bukkit.event.player.PlayerQuitEvent -import org.bukkit.plugin.Plugin -import java.util.logging.Level - -class BedrockServiceImpl @Inject constructor( - private val plugin: Plugin, - private val physicDispatcher: PhysicObjectDispatcher -) : - BedrockService { - /** - * All bedrock players. - */ - override val bedRockPlayers: HashSet = HashSet() - - /** - * All java players. - */ - override val javaPlayers: HashSet = HashSet() - - /** - * Geyser plugin. - */ - private var geyserSpigotPlugin: DependencyGeyserSpigotServiceImpl? = null - - init { - Bukkit.getPluginManager().registerEvents(this, plugin) - - try { - if (Bukkit.getPluginManager().getPlugin("Geyser-Spigot") != null) { - geyserSpigotPlugin = DependencyGeyserSpigotServiceImpl() - } - } catch (e: Exception) { - plugin.logger.log(Level.WARNING, "Cannot load Geyser-Spigot integration.") - } - - Bukkit.getOnlinePlayers().forEach { e -> - plugin.launch(physicDispatcher) { - applyPlayerToGroup(e) - } - } - } - - @EventHandler - fun onPlayerQuitEvent(event: PlayerQuitEvent) { - plugin.launch(physicDispatcher) { - if (javaPlayers.contains(event.player)) { - javaPlayers.remove(event.player) - } - } - } - - @EventHandler - fun onPlayerJoinEvent(event: PlayerJoinEvent) { - plugin.launch(physicDispatcher) { - applyPlayerToGroup(event.player) - } - } - - private fun applyPlayerToGroup(player: Player) { - if (isBedRockPlayer(player)) { - plugin.launch(physicDispatcher) { - bedRockPlayers.add(player) - } - } else { - plugin.launch(physicDispatcher) { - javaPlayers.add(player) - } - } - } - - /** - * Gets if the given player is playing on a bedrock client. - */ - private fun isBedRockPlayer(player: Player): Boolean { - try { - if (geyserSpigotPlugin != null) { - return geyserSpigotPlugin!!.isBedrockPlayer(player) - } - } catch (e: Exception) { - // Sometimes the integration fails. Ignore in this case. - } - - return false - } -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/DependencyGeyserSpigotServiceImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/DependencyGeyserSpigotServiceImpl.kt deleted file mode 100644 index 68b0ba0..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/DependencyGeyserSpigotServiceImpl.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.shynixn.mctennis.impl.service - -import org.bukkit.entity.Player -import org.geysermc.api.Geyser - -class DependencyGeyserSpigotServiceImpl { - - fun isBedrockPlayer(player: Player): Boolean { - val connection = Geyser.api().connectionByUuid(player.uniqueId) - return connection != null - } -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/DependencyPlaceholderApiServiceImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/DependencyPlaceholderApiServiceImpl.kt deleted file mode 100644 index 935b745..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/DependencyPlaceholderApiServiceImpl.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.github.shynixn.mctennis.impl.service - -import com.github.shynixn.mctennis.contract.GameService -import com.github.shynixn.mctennis.contract.PlaceHolderService -import com.github.shynixn.mctennis.contract.TennisGame -import com.google.inject.Inject -import me.clip.placeholderapi.PlaceholderAPI -import me.clip.placeholderapi.expansion.PlaceholderExpansion -import org.bukkit.entity.Player -import org.bukkit.plugin.Plugin - -class DependencyPlaceholderApiServiceImpl @Inject constructor( - private val plugin: Plugin, - private val gameService: GameService -) : PlaceholderExpansion(), PlaceHolderService { - private var registerd: Boolean = false - private val placeHolderService = PlaceHolderServiceImpl(gameService) - - init { - this.registerListener() - } - - /** - * Registers the placeholder hook if it is not already registered. - */ - fun registerListener() { - if (!registerd) { - this.register() - registerd = true - } - } - - /** - * Gets the expansion version which is the same of the plugin version. - */ - override fun getVersion(): String { - return plugin.description.version - } - - /** - * Gets the expansion author for placeholderapi. - */ - override fun getAuthor(): String { - return plugin.description.authors[0] - } - - /** - * Gets the identifier which is required by placeholderapi to match the placeholder against this plugin. - */ - override fun getIdentifier(): String { - return "mctennis" - } - - /** - * OnPlaceHolder Request - * - * @param player player - * @param s customText - * @return result - */ - override fun onPlaceholderRequest(player: Player?, params: String): String? { - if (params == null) { - return null - } - - val parts = params.split("_") - val finalPart = parts[parts.size - 1] - val newParams = parts.dropLast(1).joinToString("_") - - val selectedGame = gameService.getByName(finalPart) - if (selectedGame != null) { - return placeHolderService.replacePlaceHolders("%mctennis_${newParams}%", player, selectedGame) - } - - if (player != null) { - val otherGame = gameService.getByPlayer(player) - - if (otherGame != null) { - return placeHolderService.replacePlaceHolders( - "%mctennis_${params}%", - player, - otherGame - ) - } else { - return placeHolderService.replacePlaceHolders("%mctennis_${params}%", player, null) - } - } - - return null - } - - /** - * Replaces the placeholders. - */ - override fun replacePlaceHolders(text: String, player: Player?, game: TennisGame?): String { - val replacedInput = placeHolderService.replacePlaceHolders(text, player, game) - return PlaceholderAPI.setPlaceholders(player, replacedInput) - } -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/GameServiceImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/GameServiceImpl.kt index ae74667..fecd054 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/GameServiceImpl.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/GameServiceImpl.kt @@ -2,8 +2,7 @@ package com.github.shynixn.mctennis.impl.service import com.github.shynixn.mctennis.MCTennisDependencyInjectionModule import com.github.shynixn.mctennis.contract.GameService -import com.github.shynixn.mctennis.contract.Language -import com.github.shynixn.mctennis.contract.PlaceHolderService +import com.github.shynixn.mctennis.contract.MCTennisLanguage import com.github.shynixn.mctennis.contract.TennisBallFactory import com.github.shynixn.mctennis.entity.TeamMetadata import com.github.shynixn.mctennis.entity.TennisArena @@ -11,16 +10,16 @@ import com.github.shynixn.mctennis.impl.exception.TennisGameException import com.github.shynixn.mctennis.impl.TennisGameImpl import com.github.shynixn.mcutils.common.chat.ChatMessageService import com.github.shynixn.mcutils.common.command.CommandService +import com.github.shynixn.mcutils.common.placeholder.PlaceHolderService import com.github.shynixn.mcutils.common.repository.Repository import com.github.shynixn.mcutils.sign.SignService -import com.google.inject.Inject import org.bukkit.entity.Player import org.bukkit.plugin.Plugin import java.util.logging.Level import kotlin.math.max import kotlin.math.min -class GameServiceImpl @Inject constructor( +class GameServiceImpl( private val arenaRepository: Repository, private val tennisBallFactory: TennisBallFactory, private val plugin: Plugin, @@ -28,7 +27,7 @@ class GameServiceImpl @Inject constructor( private val signService: SignService, private val chatMessageService: ChatMessageService, private val placeHolderService: PlaceHolderService, - private val language: Language + private val language: MCTennisLanguage ) : GameService { private val games = ArrayList() diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/PlaceHolderServiceImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/PlaceHolderServiceImpl.kt deleted file mode 100644 index 2e829df..0000000 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/PlaceHolderServiceImpl.kt +++ /dev/null @@ -1,181 +0,0 @@ -package com.github.shynixn.mctennis.impl.service - -import com.github.shynixn.mctennis.MCTennisLanguageImpl -import com.github.shynixn.mctennis.MCTennisPlugin -import com.github.shynixn.mctennis.contract.GameService -import com.github.shynixn.mctennis.contract.PlaceHolderService -import com.github.shynixn.mctennis.contract.TennisGame -import com.github.shynixn.mctennis.enumeration.GameState -import com.github.shynixn.mctennis.enumeration.PlaceHolder -import com.github.shynixn.mcutils.common.language.LanguageItem -import com.github.shynixn.mcutils.common.translateChatColors -import com.google.inject.Inject -import org.bukkit.entity.Player - -class PlaceHolderServiceImpl @Inject constructor(private val gameService: GameService) : PlaceHolderService { - private val langPlaceHolderFunctions = HashMap String)>() - private val gamePlayerHolderFunctions = HashMap String)>() - private val gameAndPlayerHolderFunctions = HashMap String)>() - private val playerPlaceHolderFunctions = HashMap String)>() - private val placeHolders = HashMap() - - init { - for (placeHolder in PlaceHolder.values()) { - placeHolders[placeHolder.fullPlaceHolder] = placeHolder - } - - for (field in MCTennisLanguageImpl::class.java.declaredFields) { - field.isAccessible = true - langPlaceHolderFunctions["%mctennis_lang_${field.name}%"] = { (field.get(null) as LanguageItem).text } - } - - // Player - playerPlaceHolderFunctions[PlaceHolder.PLAYER_NAME] = - { p -> p.name } - playerPlaceHolderFunctions[PlaceHolder.PLAYER_ISINGAME] = - { p -> (gameService.getByPlayer(p) != null).toString() } - - // Game - gamePlayerHolderFunctions[PlaceHolder.GAME_ENABLED] = { g -> g.arena.isEnabled.toString() } - gamePlayerHolderFunctions[PlaceHolder.GAME_STARTED] = - { g -> (g.gameState == GameState.RUNNING_SERVING || g.gameState == GameState.RUNNING_PLAYING).toString() } - gamePlayerHolderFunctions[PlaceHolder.GAME_JOINABLE] = - { g -> ((g.gameState == GameState.LOBBY_IDLE || g.gameState == GameState.LOBBY_COUNTDOWN) && !g.isFull()).toString() } - gamePlayerHolderFunctions[PlaceHolder.GAME_DISPLAYNAME] = { g -> g.arena.displayName } - gamePlayerHolderFunctions[PlaceHolder.GAME_RAWSCORETEAMRED] = { g -> g.teamRedScore.toString() } - gamePlayerHolderFunctions[PlaceHolder.GAME_RAWSCORETEAMBLUE] = { g -> g.teamBlueScore.toString() } - gamePlayerHolderFunctions[PlaceHolder.GAME_SCORE] = { g -> g.getScoreText() } - gamePlayerHolderFunctions[PlaceHolder.GAME_STATE] = { g -> - if (!g.arena.isEnabled) { - "DISABLED" - } else if (g.gameState == GameState.RUNNING_PLAYING || g.gameState == GameState.RUNNING_SERVING || g.gameState == GameState.ENDING) { - "RUNNING" - } else { - "JOINABLE" - } - - } - gamePlayerHolderFunctions[PlaceHolder.GAME_STATE_DISPLAYNAME] = { g -> - if (!g.arena.isEnabled) { - MCTennisPlugin.language!!.gameStateDisabled.text - } else if (g.gameState == GameState.RUNNING_PLAYING || g.gameState == GameState.RUNNING_SERVING || g.gameState == GameState.ENDING) { - MCTennisPlugin.language!!.gameStateRunning.text - } else { - MCTennisPlugin.language!!.gameStateJoinAble.text - } - } - gamePlayerHolderFunctions[PlaceHolder.GAME_PLAYER_AMOUNT] = { g -> - (g.teamBluePlayers.size + g.teamRedPlayers.size).toString() - } - gamePlayerHolderFunctions[PlaceHolder.GAME_MAX_PLAYER_AMOUNT] = { g -> - (g.arena.maxPlayersPerTeam * 2).toString() - } - gamePlayerHolderFunctions[PlaceHolder.GAME_BALL_LOCATION_WORLD] = { g -> - if (g.ball != null && !g.ball!!.isDead) { - g.ball!!.getLocation().world!!.name - } else { - "" - } - } - gamePlayerHolderFunctions[PlaceHolder.GAME_BALL_LOCATION_X] = { g -> - if (g.ball != null && !g.ball!!.isDead) { - g.ball!!.getLocation().x.toString() - } else { - "0" - } - } - gamePlayerHolderFunctions[PlaceHolder.GAME_BALL_LOCATION_Y] = { g -> - if (g.ball != null && !g.ball!!.isDead) { - g.ball!!.getLocation().y.toString() - } else { - "-1000" - } - } - gamePlayerHolderFunctions[PlaceHolder.GAME_BALL_LOCATION_Z] = { g -> - if (g.ball != null && !g.ball!!.isDead) { - g.ball!!.getLocation().z.toString() - } else { - "0" - } - } - gamePlayerHolderFunctions[PlaceHolder.GAME_BALL_LOCATION_YAW] = { g -> - if (g.ball != null && !g.ball!!.isDead) { - g.ball!!.getLocation().yaw.toString() - } else { - "0" - } - } - gamePlayerHolderFunctions[PlaceHolder.GAME_BALL_LOCATION_PITCH] = { g -> - if (g.ball != null && !g.ball!!.isDead) { - g.ball!!.getLocation().pitch.toString() - } else { - "0" - } - } - gamePlayerHolderFunctions[PlaceHolder.GAME_CURRENT_SET] = { g -> - g.currentSet.toString() - } - gamePlayerHolderFunctions[PlaceHolder.GAME_WON_SETS_TEAM_BLUE] = { g -> - g.teamBlueSetScore.toString() - } - gamePlayerHolderFunctions[PlaceHolder.GAME_WON_SETS_TEAM_RED] = { g -> - g.teamRedSetScore.toString() - } - - // Game and Player - gameAndPlayerHolderFunctions[PlaceHolder.GAME_ISTEAMBLUEPLAYER] = - { g, p -> g.teamBluePlayers.contains(p).toString() } - gameAndPlayerHolderFunctions[PlaceHolder.GAME_ISTEAMREDPLAYER] = - { g, p -> g.teamRedPlayers.contains(p).toString() } - } - - /** - * Replaces the placeholders. - */ - override fun replacePlaceHolders(text: String, player: Player?, game: TennisGame?): String { - var output = text - for (i in 0 until 4) { - if (!output.contains("%")) { - break - } - - val locatedPlaceHolders = HashMap() - val characterCache = StringBuilder() - - for (character in output) { - characterCache.append(character) - - if (character == '%') { - val evaluatedPlaceHolder = characterCache.toString() - if (placeHolders.containsKey(evaluatedPlaceHolder)) { - val placeHolder = placeHolders[evaluatedPlaceHolder]!! - if (!locatedPlaceHolders.containsKey(placeHolder.fullPlaceHolder)) { - if (game != null && player != null && gameAndPlayerHolderFunctions.containsKey(placeHolder)) { - locatedPlaceHolders[placeHolder.fullPlaceHolder] = - gameAndPlayerHolderFunctions[placeHolder]!!.invoke(game, player) - } else if (game != null && gamePlayerHolderFunctions.containsKey(placeHolder)) { - locatedPlaceHolders[placeHolder.fullPlaceHolder] = - gamePlayerHolderFunctions[placeHolder]!!.invoke(game) - } else if (player != null && playerPlaceHolderFunctions.containsKey(placeHolder)) { - locatedPlaceHolders[placeHolder.fullPlaceHolder] = - playerPlaceHolderFunctions[placeHolder]!!.invoke(player) - } - } - } else if (langPlaceHolderFunctions.containsKey(evaluatedPlaceHolder)) { - locatedPlaceHolders[evaluatedPlaceHolder] = - langPlaceHolderFunctions[evaluatedPlaceHolder]!!.invoke() - } - - characterCache.clear() - characterCache.append(character) - } - } - - for (locatedPlaceHolder in locatedPlaceHolders.keys) { - output = output.replace(locatedPlaceHolder, locatedPlaceHolders[locatedPlaceHolder]!!) - } - } - - return output.translateChatColors() - } -} diff --git a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/TennisBallFactoryImpl.kt b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/TennisBallFactoryImpl.kt index e71884e..6ac18a5 100644 --- a/src/main/kotlin/com/github/shynixn/mctennis/impl/service/TennisBallFactoryImpl.kt +++ b/src/main/kotlin/com/github/shynixn/mctennis/impl/service/TennisBallFactoryImpl.kt @@ -2,7 +2,6 @@ package com.github.shynixn.mctennis.impl.service import com.github.shynixn.mctennis.contract.* import com.github.shynixn.mctennis.entity.TennisBallSettings -import com.github.shynixn.mctennis.enumeration.VisibilityType import com.github.shynixn.mctennis.impl.TennisBallImpl import com.github.shynixn.mctennis.entity.MathSettings import com.github.shynixn.mctennis.impl.physic.* @@ -12,15 +11,13 @@ import com.github.shynixn.mcutils.common.sound.SoundService import com.github.shynixn.mcutils.common.toVector3d import com.github.shynixn.mcutils.packet.api.PacketService import com.github.shynixn.mcutils.packet.api.RayTracingService -import com.google.inject.Inject import org.bukkit.Location import org.bukkit.plugin.Plugin -class TennisBallFactoryImpl @Inject constructor( +class TennisBallFactoryImpl( private val physicObjectService: PhysicObjectService, private val plugin: Plugin, private val soundService: SoundService, - private val bedrockService: BedrockService, private val packetService: PacketService, private val rayTracingService: RayTracingService, private val itemService: ItemService @@ -51,90 +48,23 @@ class TennisBallFactoryImpl @Inject constructor( val armorStandEntityId = packetService.getNextEntityId() val slimeEntityId = packetService.getNextEntityId() - val armorstandEntityComponent = when (settings.armorstandVisibility) { - VisibilityType.BEDROCK -> { - ArmorstandEntityComponent( - mathPhysicComponent, - packetService, - playerComponent, - itemService, - settings, - armorStandEntityId, - bedrockService.javaPlayers, - settings.renderYOffset - ) - } - VisibilityType.JAVA -> { - ArmorstandEntityComponent( - mathPhysicComponent, - packetService, - playerComponent, - itemService, - settings, - armorStandEntityId, - bedrockService.bedRockPlayers, - settings.renderYOffset - ) - } - VisibilityType.ALL -> { - ArmorstandEntityComponent( - mathPhysicComponent, - packetService, - playerComponent, - itemService, - settings, - armorStandEntityId, - hashSetOf(), - settings.renderYOffset - ) - } - else -> { - null - } - } + val armorstandEntityComponent = ArmorstandEntityComponent( + mathPhysicComponent, + packetService, + playerComponent, + itemService, + settings, + armorStandEntityId, + settings.renderYOffset + ) - val slimeEntityComponent = when (settings.slimeVisibility) { - VisibilityType.BEDROCK -> { - SlimeEntityComponent( - mathPhysicComponent, - playerComponent, - packetService, - slimeEntityId, - settings.clickHitBoxSize, - bedrockService.javaPlayers - ) - } - VisibilityType.JAVA -> { - SlimeEntityComponent( - mathPhysicComponent, - playerComponent, - packetService, - slimeEntityId, - settings.clickHitBoxSize, - bedrockService.bedRockPlayers - ) - } - VisibilityType.ALL -> { - SlimeEntityComponent( - mathPhysicComponent, - playerComponent, - packetService, - slimeEntityId, - settings.clickHitBoxSize, - hashSetOf() - ) - } - else -> { - SlimeEntityComponent( - mathPhysicComponent, - playerComponent, - packetService, - slimeEntityId, - settings.clickHitBoxSize, - hashSetOf() - ) - } - } + val slimeEntityComponent = SlimeEntityComponent( + mathPhysicComponent, + playerComponent, + packetService, + slimeEntityId, + settings.clickHitBoxSize + ) val ball = TennisBallImpl( mathPhysicComponent, diff --git a/src/main/resources/arena_sample.yml b/src/main/resources/arena_sample.yml index fa9f8d4..d7c3b1c 100644 --- a/src/main/resources/arena_sample.yml +++ b/src/main/resources/arena_sample.yml @@ -244,11 +244,6 @@ ball: clickHitBoxSize: 3 # Cooldown in Milliseconds how often the ball can be touched. clickCooldown: 2000 - # Flag if the slime hitbox should be shown on "BEDROCK", "JAVA" or "ALL". - slimeVisibility: "BEDROCK" - # Flag if the armorstand ball should be shown on "BEDROCK", "JAVA" or "ALL". - # Note, Armorstand blocks are invisible on Bedrock, which is a limitation of bedrock itself. - armorstandVisibility: "JAVA" # Commands which are executed every MCTennis game tick (1 tick per second, not the minecraft tick which is 20 ticks per second) # Types are: # SERVER (executes a single command with server level permission) diff --git a/src/main/resources/lang/en_us.yml b/src/main/resources/lang/en_us.yml index c970f53..d2b21b8 100644 --- a/src/main/resources/lang/en_us.yml +++ b/src/main/resources/lang/en_us.yml @@ -4,6 +4,8 @@ gameStartingMessage: type: "CHAT" # The primary text to be sent. text: "[&9MCTennis&f] Game is starting in %1$1d seconds." + # Only available for type "ACTIONBAR". The time until the action bar message disappears. + durationInTicks: 60 # Only available for type "TITLE". Adds a subTitle. subTitle: "" # Only available for type: "TITLE". Adds a fade in effect. diff --git a/src/main/resources/plugin-legacy.yml b/src/main/resources/plugin-legacy.yml index 6b240f3..cc7d8ec 100644 --- a/src/main/resources/plugin-legacy.yml +++ b/src/main/resources/plugin-legacy.yml @@ -1,5 +1,5 @@ name: MCTennis -version: 1.13.0 +version: 1.14.0 author: Shynixn website: https://www.spigotmc.org/members/shynixn.63455/ main: com.github.shynixn.mctennis.MCTennisPlugin diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 830e172..8be0ed7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: MCTennis -version: 1.13.0 +version: 1.14.0 author: Shynixn website: https://www.spigotmc.org/members/shynixn.63455/ main: com.github.shynixn.mctennis.MCTennisPlugin @@ -8,8 +8,5 @@ api-version: 1.13 libraries: - com.github.shynixn.mccoroutine:mccoroutine-bukkit-api:2.20.0 - com.github.shynixn.mccoroutine:mccoroutine-bukkit-core:2.20.0 - - com.google.inject:guice:7.0.0 - - com.google.code.gson:gson:2.10.1 - org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.25 - org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 - - aopalliance:aopalliance:1.0 diff --git a/storage/court.yml b/storage/court.yml index 67e1e71..d1ab946 100644 --- a/storage/court.yml +++ b/storage/court.yml @@ -106,8 +106,6 @@ ball: spinDefault: 20.0 spinVertical: 0.6 clickCooldown: 250 - slimeVisibility: "BEDROCK" - armorstandVisibility: "JAVA" hitSound: name: "ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR,ENTITY_ZOMBIE_ATTACK_DOOR_WOOD,ZOMBIE_WOOD" volume: 5.0