diff --git a/build.gradle.kts b/build.gradle.kts index 29ea154..02a5b78 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "com.kruthers" -version = "2.8.0" +version = "2.8.2" description = "The core plugin used to manage the gamemode 4 public server" repositories { diff --git a/src/main/kotlin/com/kruthers/gamemode4core/Gamemode4Core.kt b/src/main/kotlin/com/kruthers/gamemode4core/Gamemode4Core.kt index 91465c5..1f82a35 100644 --- a/src/main/kotlin/com/kruthers/gamemode4core/Gamemode4Core.kt +++ b/src/main/kotlin/com/kruthers/gamemode4core/Gamemode4Core.kt @@ -26,12 +26,14 @@ import org.bukkit.plugin.PluginManager import org.bukkit.plugin.java.JavaPlugin import java.util.* import java.util.function.Function +import kotlin.collections.HashMap class Gamemode4Core : JavaPlugin() { companion object { - var playersFrozen: Boolean = false + var allPlayersFrozen: Boolean = false + val frozenPlayers: HashMap = HashMap() val watchingPlayers: HashMap = HashMap() val backLocations: HashMap> = HashMap() diff --git a/src/main/kotlin/com/kruthers/gamemode4core/commands/FreezeCommand.kt b/src/main/kotlin/com/kruthers/gamemode4core/commands/FreezeCommand.kt index f653c41..5af4330 100644 --- a/src/main/kotlin/com/kruthers/gamemode4core/commands/FreezeCommand.kt +++ b/src/main/kotlin/com/kruthers/gamemode4core/commands/FreezeCommand.kt @@ -1,5 +1,6 @@ package com.kruthers.gamemode4core.commands +import cloud.commandframework.annotations.Argument import cloud.commandframework.annotations.CommandDescription import cloud.commandframework.annotations.CommandMethod import cloud.commandframework.annotations.CommandPermission @@ -11,6 +12,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver import org.bukkit.Bukkit import org.bukkit.command.CommandSender +import org.bukkit.entity.Player class FreezeCommand(val plugin: Gamemode4Core) { @@ -18,14 +20,54 @@ class FreezeCommand(val plugin: Gamemode4Core) { @CommandPermission("gm4core.freeze") @CommandDescription("Freeze everyone on the server") fun onFreezeCommand(sender: CommandSender) { - if (Gamemode4Core.playersFrozen) { + if (Gamemode4Core.allPlayersFrozen) { sender.sendMessage(Component.text("Everyone is already frozen, do /unfreeze to allow people to move again",NamedTextColor.RED)) + return + } + Gamemode4Core.allPlayersFrozen = true + Bukkit.broadcast(getMessage("freeze.start_brodcast")) + Bukkit.broadcast(getMessage("freeze.staff_start", + TagResolver.resolver(Placeholder.unparsed("name",sender.name))), + "gm4core.freeze.notify") + } - } else { - Gamemode4Core.playersFrozen = true - Bukkit.broadcast(getMessage(plugin,"freeze.start_brodcast")) - Bukkit.broadcast(getMessage(plugin,"freeze.staff_start", TagResolver.resolver( - Placeholder.unparsed("name",sender.name))),"gm4core.freeze.notify") + @CommandMethod("freeze ") + @CommandPermission("gm4core.freeze.player") + @CommandDescription("Freeze a specific player on the server") + fun onFreezeCommand(sender: CommandSender, @Argument("player") target: Player) { + if (target.hasPermission("gm4core.freeze.byspass")) { + sender.sendMessage(Component.text(target.name, NamedTextColor.GRAY) + .append(Component.text(" cannot be frozen.", NamedTextColor.RED))) + return + } + + if (target in Gamemode4Core.frozenPlayers) { + sender.sendMessage(Component.text(target.name, NamedTextColor.GRAY) + .append(Component.text(" is already frozen. To unfreeze, use /unfreeze ", NamedTextColor.RED))) + return + } + + Gamemode4Core.frozenPlayers[target] = target.uniqueId + target.sendMessage(getMessage("freeze.start_player")) + Bukkit.broadcast(getMessage("freeze.staff_start_individual", + TagResolver.resolver(Placeholder.unparsed("target", target.name), + Placeholder.unparsed("name",sender.name))), + "gm4core.freeze.notify") + } + + @CommandMethod("freezelist") + @CommandPermission("gm4core.freeze.player") + @CommandDescription("List frozen players") + fun onFreezeQueryCommand(sender: CommandSender) { + if (Gamemode4Core.allPlayersFrozen) { + sender.sendMessage(Component.text("Everyone is currently frozen", NamedTextColor.GOLD)) + } + if (Gamemode4Core.frozenPlayers.isNotEmpty()) { + sender.sendMessage(Component.text("Individually frozen players: ", NamedTextColor.GOLD) + .append(Component.text(Gamemode4Core.frozenPlayers.keys.toList().joinToString { it -> it.name }, NamedTextColor.WHITE))) + } + if (!Gamemode4Core.allPlayersFrozen && Gamemode4Core.frozenPlayers.isEmpty()) { + sender.sendMessage(Component.text("No one is frozen", NamedTextColor.RED)) } } @@ -33,13 +75,45 @@ class FreezeCommand(val plugin: Gamemode4Core) { @CommandPermission("gm4core.freeze") @CommandDescription("Unfreeze everyone") fun onUnfreezeCommand(sender: CommandSender) { - if (!Gamemode4Core.playersFrozen) { - sender.sendMessage(Component.text("Freeze is not active, do /freeze to change this",NamedTextColor.RED)) - } else { - Gamemode4Core.playersFrozen = false - Bukkit.broadcast(getMessage(plugin,"freeze.end_brodcast")) - Bukkit.broadcast(getMessage(plugin,"freeze.staff_end", TagResolver.resolver( - Placeholder.unparsed("name",sender.name))),"gm4core.freeze.notify") + // No one is frozen + if (!Gamemode4Core.allPlayersFrozen && Gamemode4Core.frozenPlayers.isEmpty()) { + sender.sendMessage(Component.text("Freeze is not active, do /freeze to change this", NamedTextColor.RED)) + return + } + // All frozen + if (Gamemode4Core.allPlayersFrozen) { + Gamemode4Core.allPlayersFrozen = false + Bukkit.broadcast(getMessage("freeze.end_brodcast")) + Bukkit.broadcast(getMessage("freeze.staff_end", + TagResolver.resolver(Placeholder.unparsed("name",sender.name))), + "gm4core.freeze.notify") + // Almost all unfrozen + if (Gamemode4Core.frozenPlayers.isNotEmpty()) + Bukkit.broadcast(Component.text("Reminder, there are still individually players frozen:", NamedTextColor.RED), "gm4core.freeze.notify") + Bukkit.broadcast(Component.text(Gamemode4Core.frozenPlayers.keys.toList().joinToString { it -> it.name }, + NamedTextColor.WHITE), "gm4ore.freeze.notify") + Bukkit.broadcast(Component.text("You can re-run /unfreeze to unfreeze all individually frozen players", NamedTextColor.RED), "gm4core.freeze.notify") + return + + } + // Individually frozen + Gamemode4Core.frozenPlayers.clear() + sender.sendMessage(Component.text("All remaining frozen players have been unfrozen",NamedTextColor.RED)) + } + + @CommandMethod("unfreeze ") + @CommandPermission("gm4core.unfreeze.player") + @CommandDescription("Unfreeze a specific player on the server") + fun onUnfreezeCommand(sender: CommandSender, @Argument("player") target: Player) { + if (target !in Gamemode4Core.frozenPlayers) { + sender.sendMessage(Component.text("That player is already frozen. To allow them to move, use /unfreeze ",NamedTextColor.RED)) + return + } + + Gamemode4Core.frozenPlayers.remove(target) + target.sendMessage(getMessage( "freeze.end_player")) + if (Gamemode4Core.frozenPlayers.isEmpty()) { + sender.sendMessage(Component.text("All remaining frozen players have been unfrozen",NamedTextColor.RED)) } } diff --git a/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerConnectionEvents.kt b/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerConnectionEvents.kt index 3527cdc..93bb66f 100644 --- a/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerConnectionEvents.kt +++ b/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerConnectionEvents.kt @@ -196,7 +196,7 @@ class PlayerConnectionEvents(val plugin: Gamemode4Core): Listener { } // If the server is in freeze mode it will send a message informing them - if (Gamemode4Core.playersFrozen) { + if (Gamemode4Core.allPlayersFrozen) { event.player.sendMessage(Component.text("Everyone is currently frozen while the mods resolve an issue, please stand still",NamedTextColor.AQUA)) event.player.sendTitlePart( TitlePart.TIMES, diff --git a/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerFrozenEvents.kt b/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerFrozenEvents.kt index a8f7d4a..217a04a 100644 --- a/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerFrozenEvents.kt +++ b/src/main/kotlin/com/kruthers/gamemode4core/events/PlayerFrozenEvents.kt @@ -15,22 +15,21 @@ class PlayerFrozenEvents(val plugin: Gamemode4Core): Listener { @EventHandler fun onPlayerMove(event: PlayerMoveEvent) { - if (Gamemode4Core.playersFrozen && !event.player.hasPermission("gm4core.freeze.byspass")) { + if ((Gamemode4Core.allPlayersFrozen || event.player in Gamemode4Core.frozenPlayers) && !event.player.hasPermission("gm4core.freeze.byspass")) { val from: Location = event.from val to: Location = event.to if (from.x != to.x || from.z != to.z) { to.x = from.x to.z = from.z - event.player.sendMessage(getMessage(plugin, "freeze.fozen")) + event.player.sendMessage(getMessage( "freeze.fozen")) } } - } @EventHandler fun onPlayerDamage(event: EntityDamageEvent) { - if (event.entity is Player && Gamemode4Core.playersFrozen) { + if (event.entity is Player && (Gamemode4Core.allPlayersFrozen || event.entity in Gamemode4Core.frozenPlayers)) { event.isCancelled = true } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 368e143..4d256c9 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -2,7 +2,7 @@ # Gamemode 4 Core # by kruthers # ######### # -# query kruthers#7770 on discord for any config help +# query kruthers on discord for any config help config_version: -1 mod_mode: group: builder @@ -21,8 +21,8 @@ scoreboard: tracked: [] server_config: motd: | - Gamemode 4 - Public Server [1.16.5] - Now Open to the public! Come Play! + Gamemode 4 - Public Server [1.20.4] + Now open to the public! Come play! max_players: 20 dim_sleep_bug: fix: true @@ -41,7 +41,7 @@ messages: staff_prefix: '[STAFF]' info: | Welcome to Gamemode 4! - Gamemode 4 is a collection of datapacks that change and modify the gameplay experience + Gamemode 4 is a collection of data packs that change and modify the gameplay experience You can find out more on our website https://gm4.co'>here & on our wiki: https://wiki.gm4.co/wiki/Public_Server'>here freeze: start_brodcast: | @@ -54,9 +54,12 @@ messages: veryone has been release, you are free to move arround again Please be carefull and report any issues ------- ------ ------- - staff_start: ' Has frozen everyone in place, run /unfreeze to release them' - staff_end: ' Has unfrozen everyone' - fozen: ' Sorry you cant move while all players are frozen. Please stand still while the mods work to resolve the issue' + start_player: ' You have been frozen' + end_player: ' You have been unfrozen' + staff_start: ' has frozen everyone in place, run /unfreeze to release them' + staff_start_individual: ' has been individually frozen by ' + staff_end: ' has unfrozen everyone' + fozen: ' Sorry you cannot move while all players are frozen. Please stand still while the mods work to resolve the issue' mod_mode: enter: ' Successfully entered into moderation mode' exit: ' Exiting moderation mode...' @@ -64,10 +67,10 @@ messages: watch: start: ' You are now watching ' stop: ' You are no longer watching anyone' - dimension_change: ' Has changed dimension do /watchconfirm to follow them' + dimension_change: ' has changed dimension. Do /watchconfirm to follow them' join: ' You are currently set to be watching ' - logout: ' Your target has left the game, you will be able to tp when they log back in' - not_online: ' Your target is currently not online so can not be teleported too' + logout: ' Your target has left the game, you will be able to tp to them when they log back in' + not_online: ' Your target is currently not online so the teleport was canceled' not_watching: ' You must be watching someone to execute this command' streammode: enter: ' You are now in streamer mode and will not receive staff notifications, run /streammode to exit'