Add ranking, feast guards and i18n updates
Use Rank info in leaderboard display (adds playerrank, passes numeric score) and adjust message placeholders. Add prefix placeholder injection in LanguageManager. Introduce max-radius-teleport config and use it for player teleport on join. Restore broadcasting of player quit messages on disconnect. Enforce no-iron crafting before feast (deny craft, notify player & play sound) and cancel entity spawns until feast starts. Update config.yml with max-radius-teleport and refresh en_US language strings (add no_iron_before_feast and translate/update several GUI/perk entries).
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package club.mcscrims.speedhg.command
|
package club.mcscrims.speedhg.command
|
||||||
|
|
||||||
import club.mcscrims.speedhg.SpeedHG
|
import club.mcscrims.speedhg.SpeedHG
|
||||||
|
import club.mcscrims.speedhg.ranking.Rank
|
||||||
import club.mcscrims.speedhg.util.sendMsg
|
import club.mcscrims.speedhg.util.sendMsg
|
||||||
import org.bukkit.command.Command
|
import org.bukkit.command.Command
|
||||||
import org.bukkit.command.CommandExecutor
|
import org.bukkit.command.CommandExecutor
|
||||||
@@ -39,9 +40,12 @@ class LeaderboardCommand : CommandExecutor {
|
|||||||
val rank = ( index + 1 ).toString()
|
val rank = ( index + 1 ).toString()
|
||||||
|
|
||||||
val playerName = stats.name
|
val playerName = stats.name
|
||||||
val score = stats.scrimScore.toString()
|
val score = stats.scrimScore
|
||||||
|
|
||||||
player.sendMsg( "commands.leaderboard.line", "rank" to rank, "name" to playerName, "score" to score )
|
val rankFromPlayer = Rank.fromPlayer( score, stats.wins + stats.losses )
|
||||||
|
val playerRank = "${rankFromPlayer.tag} ${rankFromPlayer.subTierRoman( score )}"
|
||||||
|
|
||||||
|
player.sendMsg( "commands.leaderboard.line", "playerrank" to playerRank, "rank" to rank, "name" to playerName, "score" to score.toString() )
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Footer senden
|
// 3. Footer senden
|
||||||
|
|||||||
@@ -131,8 +131,10 @@ class LanguageManager(
|
|||||||
placeholders: Map<String, String>
|
placeholders: Map<String, String>
|
||||||
): Component
|
): Component
|
||||||
{
|
{
|
||||||
|
val prefixRaw = getDefaultRawMessage( "default.prefix" )
|
||||||
|
val prefixTag = Placeholder.parsed( "prefix", prefixRaw )
|
||||||
val raw = languages[ defaultLanguage ]?.strings?.get( key ) ?: "<red>Missing Key: $key</red>"
|
val raw = languages[ defaultLanguage ]?.strings?.get( key ) ?: "<red>Missing Key: $key</red>"
|
||||||
val tags = placeholders.map { (k, v) -> Placeholder.parsed( k, v ) }
|
val tags = placeholders.map { (k, v) -> Placeholder.parsed( k, v ) }.plus( prefixTag )
|
||||||
return miniMessage.deserialize( raw, *tags.toTypedArray() )
|
return miniMessage.deserialize( raw, *tags.toTypedArray() )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class GameManager(
|
|||||||
private val startBorder = plugin.config.getDouble("game.border-start", 300.0)
|
private val startBorder = plugin.config.getDouble("game.border-start", 300.0)
|
||||||
private val endBorder = plugin.config.getDouble("game.border-end", 20.0)
|
private val endBorder = plugin.config.getDouble("game.border-end", 20.0)
|
||||||
private val borderShrinkTime = plugin.config.getLong("game.border-shrink-time", 600)
|
private val borderShrinkTime = plugin.config.getLong("game.border-shrink-time", 600)
|
||||||
|
private val maxRadiusTeleport = plugin.config.getDouble("game.max-radius-teleport", 50.0)
|
||||||
|
|
||||||
val feastManager = FeastManager( plugin )
|
val feastManager = FeastManager( plugin )
|
||||||
val pitManager = PitManager( plugin )
|
val pitManager = PitManager( plugin )
|
||||||
@@ -199,7 +200,7 @@ class GameManager(
|
|||||||
player.activePotionEffects.forEach { player.removePotionEffect( it.type ) }
|
player.activePotionEffects.forEach { player.removePotionEffect( it.type ) }
|
||||||
player.addPotionEffects(listOf( speedEffect, hasteEffect ))
|
player.addPotionEffects(listOf( speedEffect, hasteEffect ))
|
||||||
|
|
||||||
teleportRandomly( player, world, startBorder / 2 )
|
teleportRandomly( player, world, maxRadiusTeleport )
|
||||||
|
|
||||||
plugin.kitManager.applyKit( player ) // verteilt Items + ruft onAssign + passive.onActivate
|
plugin.kitManager.applyKit( player ) // verteilt Items + ruft onAssign + passive.onActivate
|
||||||
plugin.perkManager.applyPerks( player )
|
plugin.perkManager.applyPerks( player )
|
||||||
|
|||||||
@@ -48,10 +48,6 @@ class ConnectListener : Listener {
|
|||||||
val player = event.player
|
val player = event.player
|
||||||
event.quitMessage( null )
|
event.quitMessage( null )
|
||||||
|
|
||||||
if ( plugin.gameManager.currentState == GameState.INGAME ||
|
|
||||||
plugin.gameManager.currentState == GameState.INVINCIBILITY )
|
|
||||||
return
|
|
||||||
|
|
||||||
Bukkit.getOnlinePlayers().forEach { p ->
|
Bukkit.getOnlinePlayers().forEach { p ->
|
||||||
p.sendMsg( "game.quit", "name" to player.name )
|
p.sendMsg( "game.quit", "name" to player.name )
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.bukkit.event.block.BlockPlaceEvent
|
|||||||
import org.bukkit.event.block.LeavesDecayEvent
|
import org.bukkit.event.block.LeavesDecayEvent
|
||||||
import org.bukkit.event.enchantment.EnchantItemEvent
|
import org.bukkit.event.enchantment.EnchantItemEvent
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent
|
import org.bukkit.event.entity.EntityDamageByEntityEvent
|
||||||
|
import org.bukkit.event.entity.EntitySpawnEvent
|
||||||
import org.bukkit.event.entity.FoodLevelChangeEvent
|
import org.bukkit.event.entity.FoodLevelChangeEvent
|
||||||
import org.bukkit.event.entity.ItemDespawnEvent
|
import org.bukkit.event.entity.ItemDespawnEvent
|
||||||
import org.bukkit.event.inventory.*
|
import org.bukkit.event.inventory.*
|
||||||
@@ -326,7 +327,13 @@ class GameStateListener : Listener {
|
|||||||
if (!item.type.name.contains( "iron", true ))
|
if (!item.type.name.contains( "iron", true ))
|
||||||
return
|
return
|
||||||
|
|
||||||
// TODO: add before feast check and deny item crafting
|
if ( !feastStarted )
|
||||||
|
{
|
||||||
|
event.result = Event.Result.DENY
|
||||||
|
player.sendMsg( "no_iron_before_feast" )
|
||||||
|
player.playSound( player.location, Sound.BLOCK_NOTE_BLOCK_BASS, 1f, 1f )
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if ( item.type.maxDurability > 0 )
|
if ( item.type.maxDurability > 0 )
|
||||||
{
|
{
|
||||||
@@ -335,4 +342,12 @@ class GameStateListener : Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
fun onEntitySpawn(
|
||||||
|
event: EntitySpawnEvent
|
||||||
|
) {
|
||||||
|
if ( feastStarted ) return
|
||||||
|
event.isCancelled = true
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,7 @@ game:
|
|||||||
border-start: 600.0
|
border-start: 600.0
|
||||||
border-end: 100.0
|
border-end: 100.0
|
||||||
border-shrink-time: 900 # 10 Minuten
|
border-shrink-time: 900 # 10 Minuten
|
||||||
|
max-radius-teleport: 50.0
|
||||||
ranked: false
|
ranked: false
|
||||||
|
|
||||||
anti-runner:
|
anti-runner:
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ build:
|
|||||||
craft:
|
craft:
|
||||||
no_shift_click: '<prefix><red>Shift-click is not allowed while crafting!</red>'
|
no_shift_click: '<prefix><red>Shift-click is not allowed while crafting!</red>'
|
||||||
no_shield: '<prefix><red>Shields are not allowed in SpeedHG!</red>'
|
no_shield: '<prefix><red>Shields are not allowed in SpeedHG!</red>'
|
||||||
|
no_iron_before_feast: '<prefix><red>Iron is not allowed before the feast!</red>'
|
||||||
iron_nerf: '<prefix><red>Your item has been nerfed as it contains iron!</red>'
|
iron_nerf: '<prefix><red>Your item has been nerfed as it contains iron!</red>'
|
||||||
|
|
||||||
feast:
|
feast:
|
||||||
@@ -205,50 +206,50 @@ gui:
|
|||||||
confirm_name: '<green>✔ Confirm Search</green>'
|
confirm_name: '<green>✔ Confirm Search</green>'
|
||||||
confirm_click: '<gray>Click to confirm</gray>'
|
confirm_click: '<gray>Click to confirm</gray>'
|
||||||
perk_selector:
|
perk_selector:
|
||||||
title: '<gradient:dark_purple:light_purple><bold>Perk-Auswahl</bold></gradient>'
|
title: '<gradient:dark_purple:light_purple><bold>Perk Selection</bold></gradient>'
|
||||||
slot_empty: '<gray>Perk-Slot <slot>: <red>Leer</red></gray>'
|
slot_empty: '<gray>Perk slot <slot>: <red>Empty</red></gray>'
|
||||||
slot_hint: '<dark_gray>Klicke einen Perk zum Ausrüsten'
|
slot_hint: '<dark_gray>Click a perk to select'
|
||||||
slot_title: '<gray>Slot <slot>: </gray>'
|
slot_title: '<gray>Slot <slot>: </gray>'
|
||||||
equipped_label: '<green>✔ Ausgerüstet</green>'
|
equipped_label: '<green>✔ Equipped</green>'
|
||||||
click_equip: '<gray>Klick zum Ausrüsten</gray>'
|
click_equip: '<gray>Click to equip</gray>'
|
||||||
click_deselect: '<gray>Klick zum Abwählen</gray>'
|
click_deselect: '<gray>Click to unequip</gray>'
|
||||||
slots_full: '<red>Slots voll! Klicke einen aktiven Perk zum Abwählen.'
|
slots_full: '<red>Slots are full! Click an active perk to unequip.'
|
||||||
game_running: '<red>Perks können während des Spiels nicht geändert werden!'
|
game_running: '<red>Perks cannot be changed while the game is running!'
|
||||||
selected: '<green>Ausgerüstet: <perk><green>!'
|
selected: '<green>Equipped: <perk><green>!'
|
||||||
deselected: '<red>Abgewählt: <perk><red>!'
|
deselected: '<red>Unequipped: <perk><red>!'
|
||||||
close: '<red>✕ Schließen</red>'
|
close: '<red>✕ Close</red>'
|
||||||
|
|
||||||
perks:
|
perks:
|
||||||
oracle:
|
oracle:
|
||||||
name: '<gradient:gold:yellow><bold>Oracle</bold></gradient>'
|
name: '<gradient:gold:yellow><bold>Oracle</bold></gradient>'
|
||||||
lore:
|
lore:
|
||||||
- ' '
|
- ' '
|
||||||
- '<gray>Zeigt Kit + Distanz des nächsten</gray>'
|
- '<gray>Shows kit + distance to the next</gray>'
|
||||||
- '<gray>Gegners (Schleichen / Kompass).</gray>'
|
- '<gray>enemy (Sneak / Compass).</gray>'
|
||||||
- ' '
|
- ' '
|
||||||
- '<yellow>Synergie: <gray>Spielo-Kit zeigt Gamble-Ausgang.'
|
- '<yellow>Synergy:</yellow> <gray>Gamble-Kit shows gamble output.</gray>'
|
||||||
|
|
||||||
vampire:
|
vampire:
|
||||||
name: '<gradient:dark_red:red><bold>Vampire</bold></gradient>'
|
name: '<gradient:dark_red:red><bold>Vampire</bold></gradient>'
|
||||||
lore:
|
lore:
|
||||||
- ' '
|
- ' '
|
||||||
- '<gray>10% Chance bei Nahkampftreffer:</gray>'
|
- '<gray>10% chance on a melee hit:</gray>'
|
||||||
- '<red>½ Herz</red> <gray>heilen.</gray>'
|
- '<gray>heal</gray> <red>½ hearts</red><gray>.</gray>'
|
||||||
|
|
||||||
featherweight:
|
featherweight:
|
||||||
name: '<gradient:white:aqua><bold>Featherweight</bold></gradient>'
|
name: '<gradient:white:aqua><bold>Featherweight</bold></gradient>'
|
||||||
lore:
|
lore:
|
||||||
- ' '
|
- ' '
|
||||||
- '<gray>Vollständig immun gegen</gray>'
|
- '<gray>Fully immune against</gray>'
|
||||||
- '<gray>Fallschaden.</gray>'
|
- '<gray>fall damage.</gray>'
|
||||||
|
|
||||||
bloodlust:
|
bloodlust:
|
||||||
name: '<gradient:dark_red:gold><bold>Bloodlust</bold></gradient>'
|
name: '<gradient:dark_red:gold><bold>Bloodlust</bold></gradient>'
|
||||||
lore:
|
lore:
|
||||||
- ' '
|
- ' '
|
||||||
- '<gray>Nach einem Kill:</gray>'
|
- '<gray>After a kill:</gray>'
|
||||||
- '<yellow>Speed I</yellow> <gray>+</gray> <green>Regen I</green> <gray>für 5 Sekunden.</gray>'
|
- '<yellow>Speed I</yellow> <gray>+</gray> <green>Regen I</green> <gray>for 5 seconds.</gray>'
|
||||||
message: '<red>⚔ Blutrausch! <yellow>Speed I</yellow> + <green>Regen I</green> für 5 Sekunden!</red>'
|
message: '<red>⚔ Bloodlust! <yellow>Speed I</yellow> + <green>Regen I</green> for 5 seconds!</red>'
|
||||||
|
|
||||||
enderblue:
|
enderblue:
|
||||||
name: '<gradient:dark_purple:aqua><bold>Enderblood</bold></gradient>'
|
name: '<gradient:dark_purple:aqua><bold>Enderblood</bold></gradient>'
|
||||||
|
|||||||
Reference in New Issue
Block a user