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 | [](https://github.com/Shynixn/MCTennis
/actions) | [Download latest release](https://github.com/Shynixn/MCtennis/releases) |
+| branch | status | download |
+|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|
+| main | [](https://github.com/Shynixn/MCTennis/actions) | [Download latest release](https://github.com/Shynixn/MCtennis/releases) |
+| 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