diff --git a/TNTLeague/src/de/steamwar/tntleague/inventory/SWInventoryHolder.kt b/KotlinCore/src/de/steamwar/kotlin/inventory/SWInventoryHolder.kt
similarity index 98%
rename from TNTLeague/src/de/steamwar/tntleague/inventory/SWInventoryHolder.kt
rename to KotlinCore/src/de/steamwar/kotlin/inventory/SWInventoryHolder.kt
index 4a0619d2..3afb3183 100644
--- a/TNTLeague/src/de/steamwar/tntleague/inventory/SWInventoryHolder.kt
+++ b/KotlinCore/src/de/steamwar/kotlin/inventory/SWInventoryHolder.kt
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-package de.steamwar.tntleague.inventory
+package de.steamwar.kotlin.inventory
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.InventoryCloseEvent
diff --git a/KotlinCore/src/de/steamwar/kotlin/message/LanguageListener.kt b/KotlinCore/src/de/steamwar/kotlin/message/LanguageListener.kt
index 0824b416..918248f0 100644
--- a/KotlinCore/src/de/steamwar/kotlin/message/LanguageListener.kt
+++ b/KotlinCore/src/de/steamwar/kotlin/message/LanguageListener.kt
@@ -19,31 +19,41 @@
package de.steamwar.kotlin.message
+import com.comphenix.tinyprotocol.Reflection
import de.steamwar.kotlin.KotlinCore
import de.steamwar.sql.SteamwarUser
import org.bukkit.Bukkit
-import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer
+import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerLocaleChangeEvent
+import java.util.Locale
object LanguageListener: Listener {
+ private val getHandleMethod = Reflection.getMethod("{obc}.entity.CraftPlayer", "getHandle")
+ private val localeField = Reflection.getField("{nms.server.level}.EntityPlayer", "adventure\$locale", Locale::class.java)
+
+ private val Player.handle
+ get() = getHandleMethod.invoke(this)
+
+ private var Player.adventureLocale
+ get() = localeField.get(handle) as Locale
+ set(value) {
+ localeField.set(handle, value)
+ }
+
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
fun onPlayerJoin(event: PlayerJoinEvent) {
- val user = SteamwarUser.get(event.player.uniqueId)
- val player = event.player as CraftPlayer
- player.handle.`adventure$locale` = user.locale
+ event.player.adventureLocale = SteamwarUser.get(event.player.uniqueId).locale
}
@EventHandler
fun onPlayerConfig(event: PlayerLocaleChangeEvent) {
Bukkit.getScheduler().runTask(KotlinCore.plugin, Runnable {
- val user = SteamwarUser.get(event.player.uniqueId)
- val player = event.player as CraftPlayer
- player.handle.`adventure$locale` = user.locale
+ event.player.adventureLocale = SteamwarUser.get(event.player.uniqueId).locale
})
}
}
\ No newline at end of file
diff --git a/TNTLeague/src/de/steamwar/tntleague/util/Style.kt b/KotlinCore/src/de/steamwar/kotlin/message/Style.kt
similarity index 76%
rename from TNTLeague/src/de/steamwar/tntleague/util/Style.kt
rename to KotlinCore/src/de/steamwar/kotlin/message/Style.kt
index fab87935..79603241 100644
--- a/TNTLeague/src/de/steamwar/tntleague/util/Style.kt
+++ b/KotlinCore/src/de/steamwar/kotlin/message/Style.kt
@@ -17,9 +17,8 @@
* along with this program. If not, see .
*/
-package de.steamwar.tntleague.util
+package de.steamwar.kotlin.message
-import de.steamwar.tntleague.game.TNTLeagueTeam
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.ComponentLike
import net.kyori.adventure.text.TranslatableComponent
@@ -31,22 +30,26 @@ import net.kyori.adventure.translation.GlobalTranslator
import org.bukkit.entity.Player
import java.util.Locale
-val prefix = Component.text("Steam").yellow()
- .append(Component.text("War").darkGray())
- .appendSpace()
+object StyleConfig {
+ var prefix = Component.text("Steam").yellow()
+ .append(Component.text("War").darkGray())
+ .appendSpace()
+ set(value) {
+ field = value
+ chatPrefix = value
+ .append(Component.text("»").darkGray())
+ .appendSpace()
+ }
+ var chatPrefix = prefix
+ .append(Component.text("»").darkGray())
+ .appendSpace()
+}
-val tntLeaguePrefix = Component.text("TNT").color(NamedTextColor.DARK_RED)
- .append(Component.text("League").color(NamedTextColor.GOLD))
+fun TranslatableComponent.basic(): Component = StyleConfig.chatPrefix.append(this.gray())
-val tntLeagueChatPrefix: Component = tntLeaguePrefix
- .append(Component.text("»").darkGray())
- .appendSpace()
+fun TranslatableComponent.error(): Component = StyleConfig.chatPrefix.append(this.red())
-fun TranslatableComponent.basic(): Component = tntLeagueChatPrefix.append(this.gray())
-
-fun TranslatableComponent.error(): Component = tntLeagueChatPrefix.append(this.red())
-
-fun TranslatableComponent.success(): Component = tntLeagueChatPrefix.append(this.green())
+fun TranslatableComponent.success(): Component = StyleConfig.chatPrefix.append(this.green())
fun String.component(): Component = Component.text(this)
@@ -80,13 +83,10 @@ fun translate(key: String, vararg args: ComponentLike): TranslatableComponent =
fun Component.reset(): Component = this.style(Style.empty())
-fun Component.colorByTeam(team: TNTLeagueTeam?) = when (team) {
- null -> this.gray()
- else -> this.color(team.color)
-}
-
fun Component.translate(locale: Locale): Component = GlobalTranslator.render(this, locale)
fun Component.translate(p: Player): Component = this.translate(p.locale())
fun Component.toLegacy(): String = LegacyComponentSerializer.legacySection().serialize(this)
+
+fun Component.space(): Component = append(Component.space())
diff --git a/TNTLeague/src/de/steamwar/tntleague/util/Area.kt b/KotlinCore/src/de/steamwar/kotlin/util/Area.kt
similarity index 98%
rename from TNTLeague/src/de/steamwar/tntleague/util/Area.kt
rename to KotlinCore/src/de/steamwar/kotlin/util/Area.kt
index 8808b628..5b96519f 100644
--- a/TNTLeague/src/de/steamwar/tntleague/util/Area.kt
+++ b/KotlinCore/src/de/steamwar/kotlin/util/Area.kt
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-package de.steamwar.tntleague.util
+package de.steamwar.kotlin.util
import org.bukkit.Location
import org.bukkit.block.Block
diff --git a/TNTLeague/src/de/steamwar/tntleague/TNTLeague.kt b/TNTLeague/src/de/steamwar/tntleague/TNTLeague.kt
index 9532fb7e..50572805 100644
--- a/TNTLeague/src/de/steamwar/tntleague/TNTLeague.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/TNTLeague.kt
@@ -20,13 +20,19 @@
package de.steamwar.tntleague
import de.steamwar.kotlin.message.ComponentMessage
+import de.steamwar.kotlin.message.StyleConfig
+import de.steamwar.kotlin.message.darkGray
+import de.steamwar.kotlin.message.gray
import de.steamwar.tntleague.command.AcceptCommand
import de.steamwar.tntleague.command.InviteCommand
import de.steamwar.tntleague.command.LeaveCommand
import de.steamwar.tntleague.command.RemoveCommand
import de.steamwar.tntleague.events.GlobalListener
import de.steamwar.tntleague.events.LobbyListener
+import de.steamwar.tntleague.game.TNTLeagueTeam
import net.kyori.adventure.key.Key
+import net.kyori.adventure.text.Component
+import net.kyori.adventure.text.format.NamedTextColor
import net.kyori.adventure.translation.GlobalTranslator
import net.kyori.adventure.translation.TranslationRegistry
import net.kyori.adventure.util.UTF8ResourceBundleControl
@@ -36,9 +42,14 @@ import java.util.*
lateinit var plugin: TNTLeague
lateinit var message: ComponentMessage
+val tntLeaguePrefix = Component.text("TNT").color(NamedTextColor.DARK_RED)
+ .append(Component.text("League").color(NamedTextColor.GOLD))
+
class TNTLeague : JavaPlugin() {
init {
plugin = this
+
+ StyleConfig.prefix = tntLeaguePrefix
}
override fun onEnable() {
@@ -58,3 +69,8 @@ class TNTLeague : JavaPlugin() {
LeaveCommand.register()
}
}
+
+fun Component.colorByTeam(team: TNTLeagueTeam?) = when (team) {
+ null -> this.gray()
+ else -> this.color(team.color)
+}
diff --git a/TNTLeague/src/de/steamwar/tntleague/command/InviteCommand.kt b/TNTLeague/src/de/steamwar/tntleague/command/InviteCommand.kt
index fdfaf359..eea883c6 100644
--- a/TNTLeague/src/de/steamwar/tntleague/command/InviteCommand.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/command/InviteCommand.kt
@@ -21,8 +21,9 @@ package de.steamwar.tntleague.command
import de.steamwar.command.SWCommand
import de.steamwar.command.TypeValidator
+import de.steamwar.kotlin.message.*
+import de.steamwar.tntleague.colorByTeam
import de.steamwar.tntleague.game.TNTLeagueGame
-import de.steamwar.tntleague.util.*
import net.kyori.adventure.text.event.ClickEvent
import net.kyori.adventure.text.event.HoverEvent
import org.bukkit.entity.Player
@@ -37,7 +38,8 @@ object InviteCommand: SWCommand("invite") {
val team = TNTLeagueGame.getTeam(sender)!!
team.invites.add(target)
- target.sendMessage(translate("invited", sender.name.yellow(), translate(team.name).colorByTeam(team)).basic().clickEvent(
+ target.sendMessage(
+ translate("invited", sender.name.yellow(), translate(team.name).colorByTeam(team)).basic().clickEvent(
ClickEvent.callback {
if (target !in team.invites) return@callback
diff --git a/TNTLeague/src/de/steamwar/tntleague/config/TNTLeagueWorldConfig.kt b/TNTLeague/src/de/steamwar/tntleague/config/TNTLeagueWorldConfig.kt
index acfb3ac4..ae863071 100644
--- a/TNTLeague/src/de/steamwar/tntleague/config/TNTLeagueWorldConfig.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/config/TNTLeagueWorldConfig.kt
@@ -20,13 +20,12 @@
package de.steamwar.tntleague.config
import de.steamwar.tntleague.plugin
-import de.steamwar.tntleague.util.Area
-import de.steamwar.tntleague.util.translate
+import de.steamwar.kotlin.util.Area
+import de.steamwar.kotlin.message.translate
import org.bukkit.Location
import org.bukkit.Material
import org.bukkit.configuration.ConfigurationSection
import org.bukkit.configuration.file.YamlConfiguration
-import org.bukkit.entity.Villager
import org.bukkit.entity.WanderingTrader
import java.io.File
diff --git a/TNTLeague/src/de/steamwar/tntleague/events/GlobalListener.kt b/TNTLeague/src/de/steamwar/tntleague/events/GlobalListener.kt
index 31f2e7e2..23cf69f4 100644
--- a/TNTLeague/src/de/steamwar/tntleague/events/GlobalListener.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/events/GlobalListener.kt
@@ -19,12 +19,15 @@
package de.steamwar.tntleague.events
+import de.steamwar.kotlin.message.basic
+import de.steamwar.kotlin.message.bold
+import de.steamwar.kotlin.message.translate
+import de.steamwar.tntleague.colorByTeam
import de.steamwar.tntleague.config.TNTLeagueWorldConfig
import de.steamwar.tntleague.game.TNTLeagueGame
import de.steamwar.tntleague.game.TNTLeagueTeam
-import de.steamwar.tntleague.inventory.SWInventoryHolder
+import de.steamwar.kotlin.inventory.SWInventoryHolder
import de.steamwar.tntleague.plugin
-import de.steamwar.tntleague.util.*
import org.bukkit.GameMode
import org.bukkit.Material
import org.bukkit.event.EventHandler
@@ -85,6 +88,7 @@ object GlobalListener: Listener {
fun onPlayerDeath(e: PlayerDeathEvent) {
e.deathMessage(null)
e.drops.clear()
+ e.keepInventory = true
e.itemsToKeep.removeIf { it.type != Material.DIAMOND_PICKAXE }
}
diff --git a/TNTLeague/src/de/steamwar/tntleague/events/LobbyListener.kt b/TNTLeague/src/de/steamwar/tntleague/events/LobbyListener.kt
index 7074e73c..b4073f1c 100644
--- a/TNTLeague/src/de/steamwar/tntleague/events/LobbyListener.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/events/LobbyListener.kt
@@ -41,8 +41,7 @@ object LobbyListener: Listener {
@EventHandler(priority = EventPriority.LOWEST)
fun onPlayerQuit(e: PlayerQuitEvent) {
- val team = TNTLeagueGame.getTeam(e.player) ?: return
- team.leave(e.player)
+ TNTLeagueGame.getTeam(e.player)?.leave(e.player)
}
@EventHandler
diff --git a/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueGame.kt b/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueGame.kt
index 28d6e26a..2a83b9ec 100644
--- a/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueGame.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueGame.kt
@@ -19,6 +19,8 @@
package de.steamwar.tntleague.game
+import de.steamwar.kotlin.message.*
+import de.steamwar.kotlin.util.Area
import de.steamwar.scoreboard.SWScoreboard
import de.steamwar.sql.Fight
import de.steamwar.sql.FightPlayer
@@ -37,12 +39,9 @@ import net.kyori.adventure.sound.Sound
import org.bukkit.GameMode
import org.bukkit.Location
import org.bukkit.Material
-import org.bukkit.block.data.type.TNT
-import org.bukkit.entity.Entity
import org.bukkit.entity.Item
import org.bukkit.entity.Player
import org.bukkit.entity.TNTPrimed
-import org.bukkit.entity.Villager
import org.bukkit.event.HandlerList
import org.bukkit.event.Listener
import org.bukkit.inventory.ItemStack
@@ -181,7 +180,7 @@ object TNTLeagueGame {
redTeam.invites.remove(player)
getTeam(player)?.apply {
members.remove(player)
- if (leader == player) {
+ if (leader == player && members.isNotEmpty() && state == GameState.RUNNING) {
win(this.opposite, WinReason.LEAVE)
}
}
diff --git a/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueTeam.kt b/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueTeam.kt
index 93e1f208..f13ec602 100644
--- a/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueTeam.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/game/TNTLeagueTeam.kt
@@ -19,10 +19,11 @@
package de.steamwar.tntleague.game
+import de.steamwar.kotlin.message.*
+import de.steamwar.tntleague.colorByTeam
import de.steamwar.tntleague.config.TNTLeagueWorldConfig
import de.steamwar.tntleague.config.targetedBlocks
import de.steamwar.tntleague.plugin
-import de.steamwar.tntleague.util.*
import net.kyori.adventure.sound.Sound
import net.kyori.adventure.text.format.NamedTextColor
import net.kyori.adventure.text.format.TextColor
@@ -31,7 +32,6 @@ import org.bukkit.Material
import org.bukkit.enchantments.Enchantment
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
-import java.awt.Color.green
data class TNTLeagueTeam(val config: TNTLeagueWorldConfig.TeamConfig, private val team: Team) {
@@ -134,9 +134,7 @@ data class TNTLeagueTeam(val config: TNTLeagueWorldConfig.TeamConfig, private va
}
fun leave(player: Player) {
- if (TNTLeagueGame.state == TNTLeagueGame.GameState.RUNNING) {
- TNTLeagueGame.playerLeave(player)
- } else {
+ if (TNTLeagueGame.state != TNTLeagueGame.GameState.RUNNING) {
members.remove(player)
if (members.isEmpty()) {
@@ -146,6 +144,10 @@ data class TNTLeagueTeam(val config: TNTLeagueWorldConfig.TeamConfig, private va
}
if (leader == player) {
leader = members.firstOrNull()
+
+ if (leader == null && TNTLeagueGame.state == TNTLeagueGame.GameState.LOBBY) {
+ isReady = false
+ }
}
}
}
diff --git a/TNTLeague/src/de/steamwar/tntleague/inventory/DealerInventory.kt b/TNTLeague/src/de/steamwar/tntleague/inventory/DealerInventory.kt
index cdffa7a8..4d098510 100644
--- a/TNTLeague/src/de/steamwar/tntleague/inventory/DealerInventory.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/inventory/DealerInventory.kt
@@ -19,14 +19,13 @@
package de.steamwar.tntleague.inventory
+import de.steamwar.kotlin.inventory.SWInventoryHolder
+import de.steamwar.kotlin.message.*
import de.steamwar.tntleague.config.TNTLeagueConfig
import de.steamwar.tntleague.game.TNTLeagueGame
import de.steamwar.tntleague.plugin
-import de.steamwar.tntleague.util.*
import net.kyori.adventure.sound.Sound
import net.kyori.adventure.text.Component
-import net.kyori.adventure.text.format.Style
-import net.kyori.adventure.text.format.TextDecoration
import org.bukkit.Material
import org.bukkit.NamespacedKey
import org.bukkit.entity.Player
diff --git a/TNTLeague/src/de/steamwar/tntleague/util/TNTLeagueScoreboard.kt b/TNTLeague/src/de/steamwar/tntleague/util/TNTLeagueScoreboard.kt
index c7a68885..31245584 100644
--- a/TNTLeague/src/de/steamwar/tntleague/util/TNTLeagueScoreboard.kt
+++ b/TNTLeague/src/de/steamwar/tntleague/util/TNTLeagueScoreboard.kt
@@ -19,10 +19,13 @@
package de.steamwar.tntleague.util
+import de.steamwar.kotlin.message.*
import de.steamwar.scoreboard.ScoreboardCallback
+import de.steamwar.tntleague.colorByTeam
import de.steamwar.tntleague.config.targetedBlocks
import de.steamwar.tntleague.game.TNTLeagueGame
import de.steamwar.tntleague.game.TNTLeagueTeam
+import de.steamwar.tntleague.tntLeaguePrefix
import net.kyori.adventure.text.Component
import org.bukkit.entity.Player
import kotlin.collections.HashMap
@@ -43,7 +46,8 @@ data class TNTLeagueScoreboard(val p: Player): ScoreboardCallback {
when (val team = TNTLeagueGame.getTeam(p)) {
is TNTLeagueTeam -> lines.add(translate("scoreboardCoins", team.coins.toString().yellow()).gray())
- else -> lines.add(translate("scoreboardCoins",
+ else -> lines.add(
+ translate("scoreboardCoins",
Component.text(TNTLeagueGame.blueTeam.coins.toString()).colorByTeam(TNTLeagueGame.blueTeam)
.append(Component.text("/").darkGray())
.append(Component.text(TNTLeagueGame.redTeam.coins.toString()).colorByTeam(TNTLeagueGame.redTeam))