Add TNTLeague Module

This commit is contained in:
2024-08-16 11:38:54 +02:00
parent f8f184514b
commit 66f5b6491c
24 changed files with 1446 additions and 0 deletions
@@ -0,0 +1,25 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.tntleague.events
import org.bukkit.event.Listener
object DummyListener: Listener {
}
@@ -0,0 +1,88 @@
package de.steamwar.tntleague.events
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.tntleague.plugin
import de.steamwar.tntleague.util.*
import io.papermc.paper.event.player.AsyncChatEvent
import org.bukkit.GameMode
import org.bukkit.Material
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.entity.PlayerDeathEvent
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerMoveEvent
import org.bukkit.event.player.PlayerQuitEvent
import org.bukkit.event.player.PlayerRespawnEvent
object GlobalListener: Listener {
@EventHandler(priority = EventPriority.LOW)
fun onPlayerJoin(e: PlayerJoinEvent) {
e.joinMessage(null)
with(e.player) {
teleport(TNTLeagueWorldConfig.lobby)
inventory.clear()
plugin.server.broadcast(translate("join", name.bold()).basic())
isOp = false
gameMode = GameMode.SPECTATOR
respawnLocation = TNTLeagueWorldConfig.lobby
}
}
@EventHandler(priority = EventPriority.HIGHEST)
fun onPlayerQuit(e: PlayerQuitEvent) {
e.quitMessage(null)
plugin.server.broadcast(translate("quit", e.player.name.bold().colorByTeam(TNTLeagueGame.getTeam(e.player))).basic())
TNTLeagueGame.playerLeave(e.player)
}
@EventHandler(priority = EventPriority.LOWEST)
fun onPlayerClick(e: InventoryClickEvent) {
val holder = e.inventory.getHolder(false)
if (holder is SWInventoryHolder && e.clickedInventory == holder._inventory) {
e.isCancelled = true
holder.handleInventoryClick(e)
}
}
@EventHandler(priority = EventPriority.LOWEST)
fun onPlayerMove(e: PlayerMoveEvent) {
if (e.to.blockY < TNTLeagueWorldConfig.minHeight) {
when (val team = TNTLeagueGame.getTeam(e.player)) {
is TNTLeagueTeam -> e.player.teleport(team.config.spawnLocation)
null -> e.player.teleport(TNTLeagueWorldConfig.blueTeam.spawnLocation)
}
}
e.player.foodLevel = 20
e.player.saturation = 20f
}
@EventHandler
fun onPlayerDeath(e: PlayerDeathEvent) {
e.deathMessage(null)
e.drops.clear()
e.itemsToKeep.removeIf { it.type != Material.DIAMOND_PICKAXE }
}
@EventHandler
fun onPlayerRespawn(e: PlayerRespawnEvent) {
when (val team = TNTLeagueGame.getTeam(e.player)) {
is TNTLeagueTeam -> e.respawnLocation = team.config.spawnLocation
null -> e.respawnLocation = TNTLeagueWorldConfig.lobby
}
}
@EventHandler
fun onChat(e: AsyncChatEvent) {
e.renderer { source, sourceDisplayName, message, _ ->
translate("chat", sourceDisplayName.colorByTeam(TNTLeagueGame.getTeam(source)), message).basic()
}
}
}
@@ -0,0 +1,77 @@
package de.steamwar.tntleague.events
import de.steamwar.scoreboard.SWScoreboard
import de.steamwar.tntleague.config.TNTLeagueWorldConfig
import de.steamwar.tntleague.game.TNTLeagueGame
import de.steamwar.tntleague.game.TNTLeagueTeam
import de.steamwar.tntleague.inventory.DealerInventory
import de.steamwar.tntleague.util.TNTLeagueScoreboard
import org.bukkit.GameMode
import org.bukkit.Location
import org.bukkit.Material
import org.bukkit.entity.EntityType
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityExplodeEvent
import org.bukkit.event.entity.PlayerDeathEvent
import org.bukkit.event.player.PlayerDropItemEvent
import org.bukkit.event.player.PlayerInteractEntityEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerMoveEvent
import org.bukkit.event.player.PlayerQuitEvent
object IngameListener: Listener {
@EventHandler
fun onEntityInteract(e: PlayerInteractEntityEvent) {
if (e.player.gameMode == GameMode.SPECTATOR) return
if(e.rightClicked.type == EntityType.VILLAGER) {
e.isCancelled = true
e.player.openInventory(DealerInventory(e.player).getInventory())
}
}
@EventHandler
fun onExplode(e: EntityExplodeEvent) {
e.blockList().filter { it.type == TNTLeagueWorldConfig.targetMaterial }
.groupBy { getTeamByTargetLocation(it.location) }
.filterKeysNotNull()
.mapValues { it.value.size }
.forEach { it.key.damagedBlocks += it.value }
}
@EventHandler
fun onJoin(e: PlayerJoinEvent) {
SWScoreboard.createScoreboard(e.player, TNTLeagueScoreboard(e.player))
}
@EventHandler
fun onMove(e: PlayerMoveEvent) {
if (TNTLeagueGame.getTeam(e.player) != null) {
if (e.to.blockX >= TNTLeagueWorldConfig.lobby.blockX && e.to.blockX <= TNTLeagueWorldConfig.lobby.blockX + 1 ||
e.to.blockZ >= TNTLeagueWorldConfig.lobby.blockZ && e.to.blockZ <= TNTLeagueWorldConfig.lobby.blockZ + 1) {
e.isCancelled = true
}
}
}
@EventHandler
fun onDropPickaxe(e: PlayerDropItemEvent) {
if (e.itemDrop.itemStack.type == Material.DIAMOND_PICKAXE) {
e.isCancelled = true
}
}
private fun getTeamByTargetLocation(location: Location): TNTLeagueTeam? =
when (location) {
in TNTLeagueWorldConfig.redTeam.target -> TNTLeagueGame.redTeam
in TNTLeagueWorldConfig.blueTeam.target -> TNTLeagueGame.blueTeam
else -> null
}
private fun <K, T> Map<K?, T>.filterKeysNotNull(destination: MutableMap<K, T> = mutableMapOf()): Map<K, T> {
this.forEach { (t, u) -> if(t != null) destination[t] = u }
return destination
}
}
@@ -0,0 +1,61 @@
package de.steamwar.tntleague.events
import de.steamwar.tntleague.game.TNTLeagueGame
import de.steamwar.tntleague.plugin
import de.steamwar.tntleague.util.basic
import de.steamwar.tntleague.util.colorByTeam
import de.steamwar.tntleague.util.translate
import de.steamwar.tntleague.util.yellow
import io.papermc.paper.util.Tick
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.block.Action
import org.bukkit.event.entity.EntityDamageEvent
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.player.PlayerDropItemEvent
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerQuitEvent
object LobbyListener: Listener {
@EventHandler
fun onPlayerJoin(e: PlayerJoinEvent) {
TNTLeagueGame.getFreeTeam()?.run {
join(e.player)
TNTLeagueGame.checkStart()
}
}
@EventHandler(priority = EventPriority.LOWEST)
fun onPlayerQuit(e: PlayerQuitEvent) {
val team = TNTLeagueGame.getTeam(e.player) ?: return
team.leave(e.player)
}
@EventHandler
fun onPlayerDamage(e: EntityDamageEvent) {
e.isCancelled = true
}
@EventHandler
fun onDropEvent(e: PlayerDropItemEvent) {
e.isCancelled = true
}
@EventHandler
fun interactEvent(e: PlayerInteractEvent) {
val team = TNTLeagueGame.getTeam(e.player)
if (e.action.isRightClick && team != null && e.item?.isSimilar(team.readyItem()) == true && team.opposite.leader != null) {
team.isReady = !team.isReady
}
}
@EventHandler
fun inventoryClick(e: InventoryClickEvent) {
if (e.clickedInventory == e.whoClicked.inventory) {
e.isCancelled = true
}
}
}