From edf669835dafac0570445eae8077757f5675b9c8 Mon Sep 17 00:00:00 2001 From: Gutin <57606752+Gutin1@users.noreply.github.com> Date: Wed, 29 Jan 2025 18:05:52 -0600 Subject: [PATCH] Fix nations chat --- .../database/cache/nations/PlayerCache.kt | 1 + .../common/database/schema/misc/SLPlayer.kt | 1 + .../ion/common/utils/text/Formatting.kt | 7 + .../ion/server/command/misc/ChatCommand.kt | 2 +- .../ion/server/features/chat/ChatChannel.kt | 532 +++++++++--------- .../features/chat/messages/ChatMessage.kt | 50 +- .../chat/messages/NationsChatMessage.kt | 64 ++- .../chat/messages/NormalChatMessage.kt | 8 +- .../features/client/display/HudIcons.kt | 13 +- .../custom/settings/SettingsMainMenuGui.kt | 2 +- 10 files changed, 381 insertions(+), 299 deletions(-) diff --git a/common/src/main/kotlin/net/horizonsend/ion/common/database/cache/nations/PlayerCache.kt b/common/src/main/kotlin/net/horizonsend/ion/common/database/cache/nations/PlayerCache.kt index 23a2aa638c..a8e6695c37 100644 --- a/common/src/main/kotlin/net/horizonsend/ion/common/database/cache/nations/PlayerCache.kt +++ b/common/src/main/kotlin/net/horizonsend/ion/common/database/cache/nations/PlayerCache.kt @@ -94,6 +94,7 @@ abstract class AbstractPlayerCache : ManualCache() { var hitmarkerOnHull: Boolean = true, var shortenChatChannels: Boolean = false, + var hideUserPrefixes: Boolean = false, var hideGlobalPrefixes: Boolean = false, diff --git a/common/src/main/kotlin/net/horizonsend/ion/common/database/schema/misc/SLPlayer.kt b/common/src/main/kotlin/net/horizonsend/ion/common/database/schema/misc/SLPlayer.kt index 95a5ed7448..e8e33dc3b4 100644 --- a/common/src/main/kotlin/net/horizonsend/ion/common/database/schema/misc/SLPlayer.kt +++ b/common/src/main/kotlin/net/horizonsend/ion/common/database/schema/misc/SLPlayer.kt @@ -116,6 +116,7 @@ data class SLPlayer( var hitmarkerOnHull: Boolean = true, var shortenChatChannels: Boolean = false, + var hideUserPrefixes: Boolean = false, var hideGlobalPrefixes: Boolean = false, diff --git a/common/src/main/kotlin/net/horizonsend/ion/common/utils/text/Formatting.kt b/common/src/main/kotlin/net/horizonsend/ion/common/utils/text/Formatting.kt index 163fd52940..a440a5717c 100644 --- a/common/src/main/kotlin/net/horizonsend/ion/common/utils/text/Formatting.kt +++ b/common/src/main/kotlin/net/horizonsend/ion/common/utils/text/Formatting.kt @@ -2,7 +2,9 @@ package net.horizonsend.ion.common.utils.text import net.horizonsend.ion.common.database.Oid import net.horizonsend.ion.common.database.cache.nations.NationCache +import net.horizonsend.ion.common.database.cache.nations.SettlementCache import net.horizonsend.ion.common.database.schema.nations.Nation +import net.horizonsend.ion.common.database.schema.nations.Settlement import net.horizonsend.ion.common.utils.text.colors.HEColorScheme import net.horizonsend.ion.common.utils.text.colors.HEColorScheme.Companion.HE_DARK_GRAY import net.horizonsend.ion.common.utils.text.colors.HEColorScheme.Companion.HE_LIGHT_GRAY @@ -290,6 +292,11 @@ fun formatNationName(id: Oid): Component { return text(cached.name, TextColor.color(cached.color)) } +fun formatSettlementName(id: Oid): Component { + val cached = SettlementCache[id] + return text(cached.name, NamedTextColor.AQUA) +} + fun formatException(throwable: Throwable): Component { val stackTrace = "$throwable\n" + throwable.stackTrace.joinToString(separator = "\n") diff --git a/server/src/main/kotlin/net/horizonsend/ion/server/command/misc/ChatCommand.kt b/server/src/main/kotlin/net/horizonsend/ion/server/command/misc/ChatCommand.kt index 32879c3061..4dd4a6da66 100644 --- a/server/src/main/kotlin/net/horizonsend/ion/server/command/misc/ChatCommand.kt +++ b/server/src/main/kotlin/net/horizonsend/ion/server/command/misc/ChatCommand.kt @@ -21,4 +21,4 @@ object ChatCommand : SLCommand() { ChannelSelections.switchChannel(ChannelSelections[sender], chatChannel, sender) } -} \ No newline at end of file +} diff --git a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/ChatChannel.kt b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/ChatChannel.kt index b489d6e0bb..d0476f7ea6 100644 --- a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/ChatChannel.kt +++ b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/ChatChannel.kt @@ -13,7 +13,8 @@ import net.horizonsend.ion.common.extensions.userErrorAction import net.horizonsend.ion.common.redis.RedisAction import net.horizonsend.ion.common.utils.text.bracketed import net.horizonsend.ion.common.utils.text.colors.HEColorScheme -import net.horizonsend.ion.common.utils.text.formatSpacePrefix +import net.horizonsend.ion.common.utils.text.formatNationName +import net.horizonsend.ion.common.utils.text.formatSettlementName import net.horizonsend.ion.common.utils.text.ofChildren import net.horizonsend.ion.common.utils.text.orEmpty import net.horizonsend.ion.common.utils.text.plainText @@ -21,7 +22,6 @@ import net.horizonsend.ion.server.IonServerComponent import net.horizonsend.ion.server.command.misc.GToggleCommand import net.horizonsend.ion.server.configuration.ConfigurationFiles import net.horizonsend.ion.server.features.cache.PlayerCache -import net.horizonsend.ion.server.features.chat.messages.ChatMessage import net.horizonsend.ion.server.features.chat.messages.NationsChatMessage import net.horizonsend.ion.server.features.chat.messages.NormalChatMessage import net.horizonsend.ion.server.features.progression.Levels @@ -51,7 +51,7 @@ import net.kyori.adventure.text.format.NamedTextColor.RED import net.kyori.adventure.text.format.NamedTextColor.WHITE import net.kyori.adventure.text.format.NamedTextColor.YELLOW import net.kyori.adventure.text.format.TextColor -import net.kyori.adventure.text.format.TextDecoration +import net.kyori.adventure.text.format.TextDecoration.BOLD import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer import net.luckperms.api.node.NodeEqualityPredicate import org.bukkit.Bukkit @@ -59,8 +59,20 @@ import org.bukkit.World import org.bukkit.entity.Player @Suppress("UNUSED") // They're used -enum class ChatChannel(val displayName: Component, val commandAliases: List, val messageColor: TextColor) { - GLOBAL(text("Global", DARK_GREEN), listOf("global", "g"), WHITE) { +enum class ChatChannel( + val displayName: Component, + val channelPrefix: Component, + val shortenedChannelPrefix: Component, + val commandAliases: List, + val messageColor: TextColor +) { + GLOBAL( + displayName = text("Global", DARK_GREEN), + channelPrefix = empty(), + shortenedChannelPrefix = empty(), + commandAliases = listOf("global", "g"), + messageColor = WHITE + ) { override fun onChat(player: Player, event: AsyncChatEvent) { if (ConfigurationFiles.legacySettings().chat.noGlobalWorlds.contains(player.world.name)) { player.userErrorAction("You can't use global chat in this world! (If you need assistance, please use /msg)") @@ -75,14 +87,11 @@ enum class ChatChannel(val displayName: Component, val commandAliases: List distanceSquared) continue if (PlayerCache[other].blockedPlayerIDs.contains(player.slPlayerId)) continue - val newMessage = NormalChatMessage( - if (PlayerCache[other].shortenChatChannels) ofChildren( - bracketed(text(Levels[event.player], AQUA)), - space(), - bracketed(text("L", YELLOW, TextDecoration.BOLD)), - space() - ) else message.ionPrefix, - message.luckPermsPrefix, - message.playerDisplayName, - message.luckPermsSuffix, - message.message, - message.playerInfo, - message.color, - message.sender - ) - other.sendMessage(checkGlobalPrefix(other, newMessage)) + other.sendMessage(message.buildChatComponent( + useChannelPrefix = false, + useLevelsPrefix = true, + useShortenedPrefix = PlayerCache[other].shortenChatChannels, + showLuckPermsPrefix = !PlayerCache[player].hideGlobalPrefixes + )) } } }, - PLANET(text("Planet", BLUE), listOf("planetchat", "pchat", "pc"), DARK_GREEN) { + PLANET( + displayName = text("Planet", BLUE), + channelPrefix = text("Planet", BLUE, BOLD), + shortenedChannelPrefix = bracketed(text("P", BLUE, BOLD)), + commandAliases = listOf("planetchat", "pchat", "pc"), + messageColor = DARK_GREEN + ) { override fun onChat(player: Player, event: AsyncChatEvent) { val world = player.world @@ -142,31 +157,28 @@ enum class ChatChannel(val displayName: Component, val commandAliases: List(Hint: To get back to global, use /global)") @@ -295,47 +339,67 @@ enum class ChatChannel(val displayName: Component, val commandAliases: List bracketed(text("Captain", BLUE)) else -> bracketed(text("Ship", HEColorScheme.HE_LIGHT_BLUE)) } - for(passenger in starship.onlinePassengers) { - passenger.sendMessage(checkPrefix(passenger, formatChatMessage(ofChildren(prefix, space()), player, event, messageColor))) + val message = formatChatMessage(this, event, messageColor).buildChatComponent( + useLevelsPrefix = false, + useChannelPrefix = false, + useShortenedPrefix = false, + showLuckPermsPrefix = !PlayerCache[player].hideGlobalPrefixes + ) + + for (passenger in starship.onlinePassengers) { + passenger.sendMessage(ofChildren(prefix, message)) } } }, - FLEET(text("Fleet", HEColorScheme.HE_DARK_ORANGE, TextDecoration.BOLD), listOf("fleetchat", "fc", "fchat"), HEColorScheme.HE_LIGHT_ORANGE) { + FLEET( + displayName = text("Fleet", HEColorScheme.HE_DARK_ORANGE), + channelPrefix = text("Fleet", HEColorScheme.HE_DARK_ORANGE, BOLD, BOLD), + shortenedChannelPrefix = bracketed(text("F", HEColorScheme.HE_DARK_ORANGE, BOLD)), + commandAliases = listOf("fleetchat", "fc", "fchat"), + messageColor = HEColorScheme.HE_LIGHT_ORANGE + ) { + val leaderPrefix = ofChildren(text(SidebarIcon.FLEET_COMMANDER_ICON.text, GOLD, BOLD).font(Sidebar.fontKey), space()) + override fun onChat(player: Player, event: AsyncChatEvent) { - val fleet = Fleets.findByMember(player) - ?: return player.userError("You're not in a fleet! (Hint: To get back to global, use /global)") - - for(fleetMember in fleet.memberIds) { - val prefix = ofChildren( - if (PlayerCache[fleetMember].shortenChatChannels) bracketed(text("F", HEColorScheme.HE_DARK_ORANGE, TextDecoration.BOLD)) else displayName, - space(), - if (fleet.leaderId == player.uniqueId) ofChildren( - text(SidebarIcon.FLEET_COMMANDER_ICON.text, GOLD, TextDecoration.BOLD).font(Sidebar.fontKey), - space() - ) else empty() - ) + val fleet = Fleets.findByMember(player) ?: return player.userError("You're not in a fleet! (Hint: To get back to global, use /global)") + + val message = formatChatMessage(this, event, messageColor) + + for (fleetMember in fleet.memberIds) { val other = Bukkit.getPlayer(fleetMember)!! - other.sendMessage(checkPrefix(other, formatChatMessage(prefix, player, event, messageColor))) + + other.sendMessage(message.buildChatComponent( + useLevelsPrefix = false, + useChannelPrefix = true, + useShortenedPrefix = PlayerCache[other].shortenChatChannels, + additionalPrefix = leaderPrefix.takeIf { component -> fleet.leaderId == player.uniqueId }, + showLuckPermsPrefix = !PlayerCache[player].hideGlobalPrefixes + )) } } }, - SETTLEMENT(text("Settlement", DARK_AQUA, TextDecoration.BOLD), listOf("schat", "sc", "settlementchat"), AQUA) { + SETTLEMENT( + displayName = text("Settlement", DARK_AQUA), + channelPrefix = text("Settlement", DARK_AQUA, BOLD), + shortenedChannelPrefix = bracketed(text("S", DARK_AQUA, BOLD)), + commandAliases = listOf("schat", "sc", "settlementchat"), + messageColor = AQUA + ) { override fun onChat(player: Player, event: AsyncChatEvent) { val playerData = PlayerCache[player] val settlement = playerData.settlementOid ?: return player.userError("You're not in a settlement! (Hint: To get back to global, use /global)") - - val prefix = ofChildren( - displayName, - formatSpacePrefix(LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.settlementTag ?: "")), - space() - ) + val cached = SettlementCache[settlement] settlementAction(NationsChatMessage( - id = settlement, - sender = player, - ionPrefix = prefix, + senderLevel = Levels[player], + channel = this, + nationsid = settlement, + settlementName = formatSettlementName(settlement), + nationName = cached.nation?.let { formatNationName(it) }.orEmpty(), + nationsRole = LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.nationTag ?: ""), + settlementRole = LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.settlementTag ?: ""), luckPermsPrefix = player.common().getPrefix(), playerDisplayName = event.player.displayName(), luckPermsSuffix = player.common().getSuffix(), @@ -346,26 +410,26 @@ enum class ChatChannel(val displayName: Component, val commandAliases: List(Hint: To get back to global, use /global)") val nation = playerData.nationOid ?: return player.userError("You're not in a nation! (Hint: To get back to global, use /global") - val settlementName = SettlementCache[settlement].name - - val prefix = ofChildren( - displayName, - space(), - text(settlementName, AQUA), - formatSpacePrefix(LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.nationTag ?: "")), - space() - ) - nationAction(NationsChatMessage( - id = nation, - sender = player, - ionPrefix = prefix, + senderLevel = Levels[player], + channel = this, + nationsid = nation, + settlementName = formatSettlementName(settlement), + nationName = formatNationName(nation), + nationsRole = LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.nationTag ?: ""), + settlementRole = LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.settlementTag ?: ""), luckPermsPrefix = player.common().getPrefix(), playerDisplayName = event.player.displayName(), luckPermsSuffix = player.common().getSuffix(), @@ -376,25 +440,26 @@ enum class ChatChannel(val displayName: Component, val commandAliases: List(Hint: To get back to global, use /global)") val nation = playerData.nationOid ?: return player.userError("You're not in a nation! (Hint: To get back to global, use /global)") - val nationName = NationCache[nation].name - - val prefix = ofChildren( - displayName, - space(), - text(nationName, YELLOW), - formatSpacePrefix(LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.nationTag ?: "")), - space() - ) - allyAction(NationsChatMessage( - id = nation, - sender = player, - ionPrefix = prefix, + senderLevel = Levels[player], + channel = this, + nationsid = nation, + settlementName = formatSettlementName(settlement), + nationName = formatNationName(nation), + nationsRole = LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.nationTag ?: ""), + settlementRole = LegacyComponentSerializer.legacyAmpersand().deserialize(playerData.settlementTag ?: ""), luckPermsPrefix = player.common().getPrefix(), playerDisplayName = event.player.displayName(), luckPermsSuffix = player.common().getSuffix(), @@ -422,62 +487,29 @@ enum class ChatChannel(val displayName: Component, val commandAliases: List = { message: NormalChatMessage -> + for (player in Bukkit.getOnlinePlayers()) { + if (!player.hasPermission("chat.channel.$name")) continue + + player.sendMessage(message.buildChatComponent( + useLevelsPrefix = false, + useChannelPrefix = true, + useShortenedPrefix = PlayerCache[player].shortenChatChannels, + showLuckPermsPrefix = !PlayerCache[player].hideUserPrefixes + )) + } + }.registerRedisAction("chat-$name", runSync = false) - private fun simpleCrossServerChannelAction(name: String): RedisAction { - return { message: NormalChatMessage -> - for (player in Bukkit.getOnlinePlayers()) { - if (!player.hasPermission("chat.channel.$name")) continue // redundant but keeping it cause it wont hurt - var newMessage = message - if (PlayerCache[player].shortenChatChannels) newMessage = NormalChatMessage( - ofChildren( bracketed( - when(name) { - "admin" -> text("A", RED, TextDecoration.BOLD) - "staff" -> text("Staff", AQUA, TextDecoration.BOLD) - "mod" -> text("Mod", DARK_AQUA, TextDecoration.BOLD) - "dev" -> text("Dev", DARK_AQUA, TextDecoration.BOLD) - "contentdesign" -> ofChildren(text("C", GREEN, TextDecoration.BOLD), text("D", RED, TextDecoration.BOLD)) - "vip" -> text("VIP", GREEN, TextDecoration.BOLD) - else -> text("?") - }), - space() - ), - message.luckPermsPrefix, - message.playerDisplayName, - message.luckPermsSuffix, - message.message, - message.playerInfo, - message.color, - message.sender - ) - player.sendMessage(checkPrefix(player, newMessage)) - } - }.registerRedisAction("chat-$name", runSync = false) - } private val adminAction = simpleCrossServerChannelAction("admin") @@ -492,106 +524,72 @@ enum class ChatChannel(val displayName: Component, val commandAliases: List -> for (player in Bukkit.getOnlinePlayers()) { - if (PlayerCache.getIfOnline(player)?.settlementOid != message.id) continue - var newMessage = message; - if (PlayerCache[player].shortenChatChannels) newMessage = NationsChatMessage( - message.id, - ofChildren( - bracketed(text("S", AQUA, TextDecoration.BOLD)), - formatSpacePrefix(LegacyComponentSerializer.legacyAmpersand().deserialize(PlayerCache[message.sender].settlementTag ?: "")), - space() - ), - message.sender, - message.luckPermsPrefix, - message.playerDisplayName, - message.luckPermsSuffix, - message.message, - message.playerInfo, - message.color - ) - player.sendMessage(checkPrefix(player, newMessage)) + val cached = PlayerCache.getIfOnline(player) + if (cached == null || cached.settlementOid != message.nationsid) continue + + player.sendMessage(message.buildChatComponent( + useLevelsPrefix = false, + useChannelPrefix = true, + useShortenedPrefix = cached.shortenChatChannels, + showSettlementNamePrefix = false, + showSettlementRolePrefix = !PlayerCache[player].hideUserPrefixes, + showNationNamePrefix = false, + showNationRolePrefix = false, + showLuckPermsPrefix = !PlayerCache[player].hideUserPrefixes + )) } }.registerRedisAction("nations-chat-msg-settlement", runSync = false) private val nationAction = { message: NationsChatMessage -> for (player in Bukkit.getOnlinePlayers()) { - if (PlayerCache.getIfOnline(player)?.nationOid != message.id) continue - var newMessage = message; - if (PlayerCache[player].shortenChatChannels) newMessage = NationsChatMessage( - message.id, - ofChildren( - bracketed(text("N", GREEN, TextDecoration.BOLD)), - formatSpacePrefix(LegacyComponentSerializer.legacyAmpersand().deserialize(PlayerCache[message.sender].nationTag ?: "")), - space() - ), - message.sender, - message.luckPermsPrefix, - message.playerDisplayName, - message.luckPermsSuffix, - message.message, - message.playerInfo, - message.color - ) - player.sendMessage(checkPrefix(player, newMessage)) + if (PlayerCache.getIfOnline(player)?.nationOid != message.nationsid) continue + + player.sendMessage(message.buildChatComponent( + useLevelsPrefix = false, + useChannelPrefix = true, + useShortenedPrefix = PlayerCache[player].shortenChatChannels, + showSettlementNamePrefix = true, + showSettlementRolePrefix = false, + showNationNamePrefix = false, + showNationRolePrefix = !PlayerCache[player].hideUserPrefixes, + showLuckPermsPrefix = !PlayerCache[player].hideUserPrefixes + )) } }.registerRedisAction("nations-chat-msg-nation", runSync = false) private val allyAction = { message: NationsChatMessage -> for (player in Bukkit.getOnlinePlayers()) { val playerNation = PlayerCache.getIfOnline(player)?.nationOid ?: continue - if (RelationCache[playerNation, message.id] < NationRelation.Level.ALLY) continue - - val newMessage = NationsChatMessage( - message.id, - if (PlayerCache[player].shortenChatChannels) ofChildren( - bracketed(text("A", DARK_PURPLE, TextDecoration.BOLD)), - space(), - text(NationCache[PlayerCache[message.sender].nationOid!!].name, YELLOW), - space() - ) else message.ionPrefix, - message.sender, - message.luckPermsPrefix, - message.playerDisplayName, - message.luckPermsSuffix, - message.message, - message.playerInfo, - message.color - ) - player.sendMessage(checkPrefix(player, newMessage)) + if (RelationCache[playerNation, message.nationsid] < NationRelation.Level.ALLY) continue + + player.sendMessage(message.buildChatComponent( + useLevelsPrefix = false, + useChannelPrefix = true, + useShortenedPrefix = PlayerCache[player].shortenChatChannels, + showSettlementNamePrefix = false, + showSettlementRolePrefix = false, + showNationNamePrefix = true, + showNationRolePrefix = !PlayerCache[player].hideUserPrefixes, + showLuckPermsPrefix = !PlayerCache[player].hideUserPrefixes + )) } }.registerRedisAction("nations-chat-msg-ally", runSync = false) } - fun formatGlobalChatMessage( // includes player level - prefix: Component?, - player: Player, - event: AsyncChatEvent, - color: TextColor - ): NormalChatMessage = NormalChatMessage( - ionPrefix = ofChildren(bracketed(text(Levels[event.player], AQUA)), space(), prefix.orEmpty()), - luckPermsPrefix = player.common().getPrefix(), - playerDisplayName = event.player.displayName(), - luckPermsSuffix = player.common().getSuffix(), - message = event.message(), - playerInfo = text(playerInfo(player)), - color = color, - sender = player.slPlayerId - ) - - fun formatChatMessage( // does not include player level - prefix: Component?, - player: Player, + fun formatChatMessage( + channel: ChatChannel, event: AsyncChatEvent, - color: TextColor + channelColor: TextColor ): NormalChatMessage = NormalChatMessage( - ionPrefix = prefix.orEmpty(), - luckPermsPrefix = player.common().getPrefix(), + senderLevel = Levels[event.player], + channel = channel, + luckPermsPrefix = event.player.common().getPrefix(), playerDisplayName = event.player.displayName(), - luckPermsSuffix = player.common().getSuffix(), + luckPermsSuffix = event.player.common().getSuffix(), message = event.message(), - playerInfo = text(playerInfo(player)), - color = color, - sender = player.slPlayerId + playerInfo = text(playerInfo(event.player)), + color = channelColor, + sender = event.player.slPlayerId ) } diff --git a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/ChatMessage.kt b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/ChatMessage.kt index a617e472ae..4e6a833eb4 100644 --- a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/ChatMessage.kt +++ b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/ChatMessage.kt @@ -1,14 +1,19 @@ package net.horizonsend.ion.server.features.chat.messages +import net.horizonsend.ion.common.utils.text.bracketed import net.horizonsend.ion.common.utils.text.colors.HEColorScheme -import net.horizonsend.ion.common.utils.text.ofChildren import net.horizonsend.ion.common.utils.text.orEmpty +import net.horizonsend.ion.server.features.chat.ChatChannel import net.kyori.adventure.text.Component +import net.kyori.adventure.text.Component.space import net.kyori.adventure.text.Component.text +import net.kyori.adventure.text.format.NamedTextColor.AQUA import net.kyori.adventure.text.format.TextColor -abstract class ChatMessage { - abstract val ionPrefix: Component? +abstract class ChatMessage( + val senderLevel: Int, + val channelId: String +) { abstract val luckPermsPrefix: Component? abstract val playerDisplayName: Component abstract val luckPermsSuffix: Component? @@ -16,12 +21,35 @@ abstract class ChatMessage { abstract val playerInfo: Component abstract val color: TextColor - fun buildChatComponent(): Component = ofChildren( - ionPrefix.orEmpty(), - luckPermsPrefix.orEmpty(), - playerDisplayName, - luckPermsSuffix.orEmpty(), - text(" » ", HEColorScheme.HE_DARK_GRAY), - message.color(color), - ).hoverEvent(playerInfo) + val channel get() = ChatChannel.valueOf(channelId) + + fun buildChatComponent( + useLevelsPrefix: Boolean, + useChannelPrefix: Boolean, + useShortenedPrefix: Boolean, + showLuckPermsPrefix: Boolean, + additionalPrefix: Component? = null + ): Component { + val builder = text() + builder.hoverEvent(playerInfo) + + if (useLevelsPrefix) builder.append(bracketed(text(senderLevel, AQUA)), space()) + if (useChannelPrefix) { + if (useShortenedPrefix) { + builder.append(channel.shortenedChannelPrefix, space()) + } else { + builder.append(channel.channelPrefix, space()) + } + } + + builder.append(additionalPrefix.orEmpty()) + + if (showLuckPermsPrefix) luckPermsPrefix?.let { builder.append(it, space()) } + builder.append(playerDisplayName) + builder.append(luckPermsSuffix.orEmpty()) + builder.append(text(" » ", HEColorScheme.HE_DARK_GRAY)) + builder.append(message.color(color)) + + return builder.build() + } } diff --git a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NationsChatMessage.kt b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NationsChatMessage.kt index f4ab6f26a5..3ec3f6311f 100644 --- a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NationsChatMessage.kt +++ b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NationsChatMessage.kt @@ -2,14 +2,29 @@ package net.horizonsend.ion.server.features.chat.messages import net.horizonsend.ion.common.database.DbObject import net.horizonsend.ion.common.database.Oid +import net.horizonsend.ion.common.utils.text.bracketed +import net.horizonsend.ion.common.utils.text.colors.HEColorScheme +import net.horizonsend.ion.common.utils.text.orEmpty +import net.horizonsend.ion.server.features.chat.ChatChannel import net.kyori.adventure.text.Component +import net.kyori.adventure.text.Component.space +import net.kyori.adventure.text.Component.text +import net.kyori.adventure.text.format.NamedTextColor.AQUA import net.kyori.adventure.text.format.TextColor -import org.bukkit.entity.Player -data class NationsChatMessage( - val id: Oid, - override val ionPrefix: Component, - val sender: Player, +class NationsChatMessage( + senderLevel: Int, + channel: ChatChannel, + + /** Settlement, or nation ID */ + val nationsid: Oid, + + val nationName: Component, + val nationsRole: Component, + + val settlementName: Component, + val settlementRole: Component, + override val luckPermsPrefix: Component?, override val playerDisplayName: Component, override val luckPermsSuffix: Component?, @@ -17,4 +32,41 @@ data class NationsChatMessage( override val playerInfo: Component, override val color: TextColor -) : ChatMessage() +) : ChatMessage(senderLevel, channel.name) { + + fun buildChatComponent( + useLevelsPrefix: Boolean, + useChannelPrefix: Boolean, + useShortenedPrefix: Boolean, + showLuckPermsPrefix: Boolean, + showSettlementNamePrefix: Boolean, + showSettlementRolePrefix: Boolean, + showNationNamePrefix: Boolean, + showNationRolePrefix: Boolean, + ): Component { + val builder = text() + builder.hoverEvent(playerInfo) + + if (useLevelsPrefix) builder.append(bracketed(text(senderLevel, AQUA)), space()) + if (useChannelPrefix) { + if (useShortenedPrefix) { + builder.append(channel.shortenedChannelPrefix, space()) + } else { + builder.append(channel.channelPrefix, space()) + } + } + + if (showSettlementNamePrefix) builder.append(settlementName, space()) + if (showSettlementRolePrefix) builder.append(settlementRole, space()) + if (showNationNamePrefix) builder.append(nationName, space()) + if (showNationRolePrefix) builder.append(nationsRole, space()) + + if (showLuckPermsPrefix) luckPermsPrefix?.let { builder.append(it, space()) } + builder.append(playerDisplayName) + builder.append(luckPermsSuffix.orEmpty()) + builder.append(text(" » ", HEColorScheme.HE_DARK_GRAY)) + builder.append(message.color(color)) + + return builder.build() + } +} diff --git a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NormalChatMessage.kt b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NormalChatMessage.kt index 32b1a86a56..a99a138028 100644 --- a/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NormalChatMessage.kt +++ b/server/src/main/kotlin/net/horizonsend/ion/server/features/chat/messages/NormalChatMessage.kt @@ -1,11 +1,13 @@ package net.horizonsend.ion.server.features.chat.messages import net.horizonsend.ion.common.database.schema.misc.SLPlayerId +import net.horizonsend.ion.server.features.chat.ChatChannel import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.TextColor -data class NormalChatMessage( - override val ionPrefix: Component?, +class NormalChatMessage( + senderLevel: Int, + channel: ChatChannel, override val luckPermsPrefix: Component?, override val playerDisplayName: Component, override val luckPermsSuffix: Component?, @@ -15,4 +17,4 @@ data class NormalChatMessage( override val color: TextColor, val sender: SLPlayerId -) : ChatMessage() +) : ChatMessage(senderLevel, channel.name) diff --git a/server/src/main/kotlin/net/horizonsend/ion/server/features/client/display/HudIcons.kt b/server/src/main/kotlin/net/horizonsend/ion/server/features/client/display/HudIcons.kt index 15ab8c9d91..fd0d256f67 100644 --- a/server/src/main/kotlin/net/horizonsend/ion/server/features/client/display/HudIcons.kt +++ b/server/src/main/kotlin/net/horizonsend/ion/server/features/client/display/HudIcons.kt @@ -146,10 +146,7 @@ object HudIcons : IonServerComponent() { // remove entity if it is in an unloaded chunk or different world (this causes the entity client-side to despawn?) // also do not render if the planet is closer than the entity render distance - if (!nmsEntity.isChunkLoaded || - nmsEntity.level().world.name != player.world.name || - visualDistance < entityRenderDistance * 2 - ) { + if (nmsEntity.level().world.name != player.world.name || visualDistance < entityRenderDistance * 2) { ClientDisplayEntities.deleteDisplayEntityPacket(player, nmsEntity) ClientDisplayEntities[player.uniqueId]?.remove(identifier) return @@ -251,9 +248,7 @@ object HudIcons : IonServerComponent() { // remove entity if it is in an unloaded chunk or different world (this causes the entity client-side to despawn?) // also do not render if the planet is closer than the entity render distance - if (!nmsEntity.isChunkLoaded || - nmsEntity.level().world.name != player.world.name - ) { + if (nmsEntity.level().world.name != player.world.name) { ClientDisplayEntities.deleteDisplayEntityPacket(player, nmsEntity) ClientDisplayEntities[player.uniqueId]?.remove(SELECTOR_ID) return @@ -353,9 +348,7 @@ object HudIcons : IonServerComponent() { // remove entity if it is in an unloaded chunk or different world (this causes the entity client-side to despawn?) // also do not render if the planet is closer than the entity render distance - if (!nmsEntity.isChunkLoaded || - nmsEntity.level().world.name != player.world.name - ) { + if (nmsEntity.level().world.name != player.world.name) { ClientDisplayEntities.deleteDisplayEntityPacket(player, nmsEntity) ClientDisplayEntities[player.uniqueId]?.remove(SELECTOR_TEXT_ID) return diff --git a/server/src/main/kotlin/net/horizonsend/ion/server/features/gui/custom/settings/SettingsMainMenuGui.kt b/server/src/main/kotlin/net/horizonsend/ion/server/features/gui/custom/settings/SettingsMainMenuGui.kt index 08f9057721..35bb4105e3 100644 --- a/server/src/main/kotlin/net/horizonsend/ion/server/features/gui/custom/settings/SettingsMainMenuGui.kt +++ b/server/src/main/kotlin/net/horizonsend/ion/server/features/gui/custom/settings/SettingsMainMenuGui.kt @@ -102,7 +102,7 @@ class SettingsMainMenuGui(player: Player) : SettingsPageGui(player, "Settings") createSettingsPage(player, "Other Settings", DBCachedBooleanToggle(text("Enable Combat Timer Alerts"), "", GuiItem.LIST, true, SLPlayer::enableCombatTimerAlerts, AbstractPlayerCache.PlayerData::enableCombatTimerAlerts), DBCachedBooleanToggle(text("Enable Protection Messages"), "", GuiItem.LIST, true, SLPlayer::protectionMessagesEnabled, AbstractPlayerCache.PlayerData::protectionMessagesEnabled), - DBCachedBooleanToggle(text("Shorten Chat Channels"), "", GuiItem.LIST, false, SLPlayer::shortenChatChannels, AbstractPlayerCache.PlayerData::shortenChatChannels), + DBCachedBooleanToggle(text("Shorten Chat Messages"), "", GuiItem.LIST, false, SLPlayer::shortenChatChannels, AbstractPlayerCache.PlayerData::shortenChatChannels), DBCachedBooleanToggle(text("Remove User Prefixes"), "Removes prefixes, like Helper and Mod, from non-global chats", GuiItem.LIST, false, SLPlayer::hideUserPrefixes, AbstractPlayerCache.PlayerData::hideUserPrefixes), DBCachedBooleanToggle(text("Remove Global Prefixes"), "Removes prefixes, like Helper and Mod, from global chats", GuiItem.LIST, false, SLPlayer::hideGlobalPrefixes, AbstractPlayerCache.PlayerData::hideGlobalPrefixes), DBCachedBooleanToggle(text("Show /itemsearch Items"), "", GuiItem.COMPASS_NEEDLE, true, SLPlayer::showItemSearchItem, AbstractPlayerCache.PlayerData::showItemSearchItem),