Skip to content

Commit

Permalink
Merge pull request #75 from Shynixn/development
Browse files Browse the repository at this point in the history
Merge changes to master --release
Shynixn authored Jan 24, 2025

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
2 parents 8d08e11 + 9c3342c commit 251cd71
Showing 40 changed files with 598 additions and 875 deletions.
20 changes: 19 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -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')"
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.gradle
.idea
build
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# MCTennis

| branch | status | download |
|--------|----------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|
| main | [![Build Status](https://github.com/Shynixn/MCTennis/workflows/CI/badge.svg?branch=main)](https://github.com/Shynixn/MCTennis<br/>/actions) | [Download latest release](https://github.com/Shynixn/MCtennis/releases) |
| branch | status | download |
|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|
| main | [![Build Status](https://github.com/Shynixn/MCTennis/actions/workflows/main.yml/badge.svg)](https://github.com/Shynixn/MCTennis/actions) | [Download latest release](https://github.com/Shynixn/MCtennis/releases) |
| development | [![Build Status](https://github.com/Shynixn/MCTennis/actions/workflows/main.yml/badge.svg?branch=development)](https://github.com/Shynixn/MCTennis/actions) | |

## Description

145 changes: 77 additions & 68 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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<KotlinCompile> {
@@ -83,7 +48,7 @@ java {
*/
tasks.withType<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar> {
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<String>()
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<String>()
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<String>()
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<String>\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)
}
Binary file added docs/resources/MCTennis-GeyserMC.7z
Binary file not shown.
1 change: 0 additions & 1 deletion docs/wiki/docs/README.md
Original file line number Diff line number Diff line change
@@ -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)

35 changes: 35 additions & 0 deletions docs/wiki/docs/bedrock.md
Original file line number Diff line number Diff line change
@@ -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-<Proxy>``.
* Extract the ``custom-skulls_mctennis.yml`` into ``plugins\Geyser-<Proxy>\custom-skulls_mctennis.yml``
* Extract the ``packs/MCTennisPack.mcpack`` into ``plugins\Geyser-<Proxy>\packs\MCTennisPack.mcpack``
* Copy the ``player-profiles`` values from ``plugins\Geyser-<Proxy>\custom-skulls_mctennis.yml`` into the ``plugins\Geyser-<Proxy>\custom-skulls.yml`` file.
31 changes: 31 additions & 0 deletions docs/wiki/docs/sign.md
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions docs/wiki/mkdocs.yml
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
kotlin.code.style=official
org.gradle.jvmargs=-Xms4g
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
zipStorePath=wrapper/dists
6 changes: 0 additions & 6 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1 @@
rootProject.name = "mctennis"

pluginManagement {
plugins {
kotlin("jvm") version "1.6.21"
}
}
Original file line number Diff line number Diff line change
@@ -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>(plugin)
addService<Language> {
val chatMessageService = getService<ChatMessageService>()
val language = MCTennisLanguageImpl()
language.chatMessageService = chatMessageService
language.placeHolderFun =
{ text, player -> getService<PlaceHolderService>().replacePlaceHolders(text, player) }
language
}
fun build(): DependencyInjectionModule {
val module = DependencyInjectionModule()

// Params
module.addService<Plugin>(plugin)
module.addService<MCTennisLanguage>(language)

// Repositories
val tennisArenaRepository = YamlFileRepositoryImpl<TennisArena>(plugin,
@@ -67,39 +68,83 @@ class MCTennisDependencyInjectionModule(private val plugin: Plugin) : Dependency
listOf("arena_sample.yml"),
object : TypeReference<TennisArena>() {})
val cacheTennisArenaRepository = CachedRepositoryImpl(tennisArenaRepository)
addService<Repository<TennisArena>>(cacheTennisArenaRepository)
addService<CacheRepository<TennisArena>>(cacheTennisArenaRepository)
module.addService<Repository<TennisArena>>(cacheTennisArenaRepository)
module.addService<CacheRepository<TennisArena>>(cacheTennisArenaRepository)

// Services
addService<SignService> {
SignServiceImpl(plugin, getService(), getService<Language>().noPermissionMessage.text)
}
addService<PhysicObjectService> {
PhysicObjectServiceImpl(plugin, getService())
// Library Services
module.addService<com.github.shynixn.mcutils.common.placeholder.PlaceHolderService> {
com.github.shynixn.mcutils.common.placeholder.PlaceHolderServiceImpl(
plugin
)
}
addService<CommandService>(CommandServiceImpl(object : CoroutineExecutor {
module.addService<CommandService>(CommandServiceImpl(object : CoroutineExecutor {
override fun execute(f: suspend () -> Unit) {
plugin.launch {
f.invoke()
}
}
}))
addService<ChatMessageService>(ChatMessageServiceImpl(plugin))
addService<PhysicObjectDispatcher>(PhysicObjectDispatcherImpl(plugin))
addService<ConfigurationService>(ConfigurationServiceImpl(plugin))
addService<SoundService>(SoundServiceImpl(plugin))
addService<PacketService>(PacketServiceImpl(plugin))
addService<ItemService>(ItemServiceImpl())
addService<RayTracingService, RayTracingServiceImpl>()
addService<BedrockService, BedrockServiceImpl>()
addService<GameService, GameServiceImpl>()
addService<TennisBallFactory, TennisBallFactoryImpl>()
module.addService<SignService> {
SignServiceImpl(plugin, module.getService(), language.noPermissionMessage.text)
}
module.addService<PhysicObjectService> {
PhysicObjectServiceImpl(plugin, module.getService())
}
module.addService<ChatMessageService>(ChatMessageServiceImpl(plugin))
module.addService<PhysicObjectDispatcher>(PhysicObjectDispatcherImpl(plugin))
module.addService<ConfigurationService>(ConfigurationServiceImpl(plugin))
module.addService<SoundService>(SoundServiceImpl(plugin))
module.addService<PacketService>(PacketServiceImpl(plugin))
module.addService<ItemService>(ItemServiceImpl())
module.addService<RayTracingService>(RayTracingServiceImpl())

// Services
module.addService<MCTennisCommandExecutor> {
MCTennisCommandExecutor(
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService()
)
}
module.addService<GameListener> {
GameListener(module.getService(), module.getService())
}
module.addService<PacketListener> {
PacketListener(module.getService(), module.getService(), module.getService())
}
module.addService<TennisListener> {
TennisListener(module.getService(), module.getService(), module.getService())
}

if (Bukkit.getPluginManager().getPlugin(PluginDependency.PLACEHOLDERAPI.pluginName) != null) {
addService<PlaceHolderService, DependencyPlaceholderApiServiceImpl>()
plugin.logger.log(Level.INFO, "Loaded dependency ${PluginDependency.PLACEHOLDERAPI.pluginName}.")
} else {
addService<PlaceHolderService, PlaceHolderServiceImpl>()
module.addService<GameService> {
GameServiceImpl(
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService()
)
}
module.addService<TennisBallFactory> {
TennisBallFactoryImpl(
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService(),
module.getService()
)
}

plugin.globalChatMessageService = module.getService()
plugin.globalPlaceHolderService = module.getService()
return module
}
}
120 changes: 58 additions & 62 deletions src/main/kotlin/com/github/shynixn/mctennis/MCTennisLanguageImpl.kt
Original file line number Diff line number Diff line change
@@ -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<String>
get() = listOf("en_us")
class MCTennisLanguageImpl : MCTennisLanguage {
override val names: List<String>
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.")
}
48 changes: 23 additions & 25 deletions src/main/kotlin/com/github/shynixn/mctennis/MCTennisPlugin.kt
Original file line number Diff line number Diff line change
@@ -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,21 +26,21 @@ 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.
*/
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,46 +86,40 @@ 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<Language>()
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<PacketService>().registerPacketListening(PacketInType.USEENTITY)

// Register Listeners
Bukkit.getPluginManager().registerEvents(module.getService<GameListener>(), this)
Bukkit.getPluginManager().registerEvents(module.getService<PacketListener>(), this)
Bukkit.getPluginManager().registerEvents(module.getService<TennisListener>(), this)
Bukkit.getPluginManager().registerEvents(module.getService<BedrockService>(), this)

// Register CommandExecutor
module.getService<MCTennisCommandExecutor>()

// 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<TennisBallFactory>(),
this,
ServicePriority.Normal
)
Bukkit.getServicesManager()
.register(GameService::class.java, module.getService(), this, ServicePriority.Normal)
.register(GameService::class.java, module.getService<GameService>(), this, ServicePriority.Normal)

val plugin = this
plugin.launch {
// Load Language
// Load Games
val gameService = module.getService<GameService>()
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

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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?
*/
182 changes: 157 additions & 25 deletions src/main/kotlin/com/github/shynixn/mctennis/enumeration/PlaceHolder.kt
Original file line number Diff line number Diff line change
@@ -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, Any>?) -> 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)
}
}
}
}
}

This file was deleted.

This file was deleted.

56 changes: 36 additions & 20 deletions src/main/kotlin/com/github/shynixn/mctennis/impl/TennisGameImpl.kt
Original file line number Diff line number Diff line change
@@ -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<Player>, commands: List<CommandMeta>) {
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<Player>, languageItem: LanguageItem, param: Any? = null) {
for (player in players) {
if (param != null) {
player.sendPluginMessage(languageItem, param)
} else {
player.sendPluginMessage(languageItem)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -2,40 +2,42 @@ 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
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
import org.bukkit.plugin.Plugin
import java.util.*
import java.util.logging.Level

class MCTennisCommandExecutor @Inject constructor(
class MCTennisCommandExecutor(
private val arenaRepository: CacheRepository<TennisArena>,
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,15 +270,15 @@ 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
}

val arena = TennisArena()
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 {
Original file line number Diff line number Diff line change
@@ -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.
*/
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -19,7 +19,6 @@ class ArmorstandEntityComponent(
private val itemService: ItemService,
private val ballSettings: TennisBallSettings,
val entityId: Int,
private var filteredPlayers: HashSet<Player>,
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)
Original file line number Diff line number Diff line change
@@ -15,9 +15,7 @@ class SlimeEntityComponent(
private val playerComponent: PlayerComponent,
private val packetService: PacketService,
val entityId: Int,
private val slimeSize: Int,
var filteredPlayers: HashSet<Player>
) : 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) {

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -2,33 +2,32 @@ 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
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<TennisArena>,
private val tennisBallFactory: TennisBallFactory,
private val plugin: Plugin,
private val commandService: CommandService,
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<TennisGameImpl>()

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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,
5 changes: 0 additions & 5 deletions src/main/resources/arena_sample.yml
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 2 additions & 0 deletions src/main/resources/lang/en_us.yml
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 1 addition & 1 deletion src/main/resources/plugin-legacy.yml
Original file line number Diff line number Diff line change
@@ -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
5 changes: 1 addition & 4 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
@@ -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
2 changes: 0 additions & 2 deletions storage/court.yml
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 251cd71

Please sign in to comment.