From 5ce54696612c91182837d45248db629e8b2a0f70 Mon Sep 17 00:00:00 2001 From: ItsFlicker <1812496278@qq.com> Date: Mon, 31 Jul 2023 15:16:59 +0800 Subject: [PATCH] [2.0.4] Update & Fix --- gradle.properties | 2 +- .../arasple/mc/trchat/api/ComponentManager.kt | 2 + .../me/arasple/mc/trchat/api/nms/NMS.kt | 8 +-- .../me/arasple/mc/trchat/api/nms/NMSImpl.kt | 15 ++--- .../trchat/api/impl/BukkitComponentManager.kt | 16 +++--- .../mc/trchat/module/conf/file/Filters.kt | 8 +-- .../mc/trchat/module/conf/file/Functions.kt | 3 +- .../mc/trchat/module/conf/file/Settings.kt | 4 ++ .../mc/trchat/module/display/ChatSession.kt | 3 +- .../trchat/module/display/channel/Channel.kt | 4 ++ .../module/display/channel/PrivateChannel.kt | 4 ++ .../display/function/standard/ItemShow.kt | 48 ++++++++++++++-- .../mc/trchat/module/internal/TrChatBukkit.kt | 4 -- .../module/internal/command/CommandHandler.kt | 56 ++++++++++++++----- .../internal/command/main/CommandChannel.kt | 2 +- .../internal/command/main/CommandIgnore.kt | 20 ++++++- .../internal/command/main/CommandMute.kt | 22 ++++---- .../internal/command/main/CommandViews.kt | 18 ++++++ .../trchat/module/internal/hook/HookPlugin.kt | 15 +++++ .../internal/listener/ListenerPackets.kt | 1 + .../internal/proxy/BukkitProxyProcessor.kt | 17 +++++- .../internal/script/kether/KetherActions.kt | 14 +++-- .../me/arasple/mc/trchat/util/BukkitUtil.kt | 25 ++++++--- .../src/main/resources/function.yml | 10 ++-- .../src/main/resources/lang/en_US.yml | 8 ++- .../src/main/resources/lang/es_ES.yml | 8 ++- .../src/main/resources/lang/zh_CN.yml | 8 ++- .../trchat/api/impl/BungeeComponentManager.kt | 14 ++--- .../mc/trchat/api/impl/BungeeProxyManager.kt | 15 ++++- .../listener/ListenerBungeeTransfer.kt | 9 ++- .../trchat/api/impl/VelocityProxyManager.kt | 16 +++++- .../listener/ListenerVelocityTransfer.kt | 3 + 32 files changed, 291 insertions(+), 111 deletions(-) diff --git a/gradle.properties b/gradle.properties index 7b3436c1..801cad97 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=me.arasple.mc.trchat -version=2.0.3 +version=2.0.4 taboolib_version=6.0.11-31 kotlin.incremental=true kotlin.incremental.java=true diff --git a/project/common/src/main/kotlin/me/arasple/mc/trchat/api/ComponentManager.kt b/project/common/src/main/kotlin/me/arasple/mc/trchat/api/ComponentManager.kt index 964ee877..b5438800 100644 --- a/project/common/src/main/kotlin/me/arasple/mc/trchat/api/ComponentManager.kt +++ b/project/common/src/main/kotlin/me/arasple/mc/trchat/api/ComponentManager.kt @@ -26,4 +26,6 @@ interface ComponentManager { */ fun filterComponent(component: ComponentText, maxLength: Int = -1): ComponentText + fun validateComponent(component: ComponentText, maxLength: Int = -1): ComponentText + } \ No newline at end of file diff --git a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt index c460f2df..430e831c 100644 --- a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt +++ b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMS.kt @@ -18,7 +18,7 @@ abstract class NMS { abstract fun craftChatMessageFromComponent(component: ComponentText): Any /** - * IChatBaseComponent -> RawMessage + * IChatBaseComponent -> raw string */ abstract fun rawMessageFromCraftChatMessage(component: Any): String @@ -55,11 +55,7 @@ abstract class NMS { // 特殊药水 "CustomPotionEffects", // 隐藏标签 - "HideFlags", - // 方块标签 - "BlockEntityTag", - // Bukkit 自定义标签 - "PublicBukkitValues" + "HideFlags" ) } } diff --git a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt index 9d9fd657..48d4e8de 100644 --- a/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt +++ b/project/module-nms/src/main/kotlin/me/arasple/mc/trchat/api/nms/NMSImpl.kt @@ -2,7 +2,6 @@ package me.arasple.mc.trchat.api.nms import me.arasple.mc.trchat.util.reportOnce import net.minecraft.network.protocol.game.ClientboundCustomChatCompletionsPacket -import net.minecraft.network.protocol.game.ClientboundSystemChatPacket import net.minecraft.server.v1_12_R1.ChatMessageType import net.minecraft.server.v1_12_R1.IChatBaseComponent import net.minecraft.server.v1_12_R1.PacketPlayOutChat @@ -16,6 +15,7 @@ import taboolib.module.nms.sendPacket import taboolib.platform.util.isNotAir import java.util.* +private typealias CraftPlayer19 = org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer private typealias CraftItemStack19 = org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack private typealias CraftChatMessage19 = org.bukkit.craftbukkit.v1_19_R2.util.CraftChatMessage private typealias NMSNBTTagCompound = net.minecraft.nbt.NBTTagCompound @@ -54,16 +54,9 @@ class NMSImpl : NMS() { } override fun sendMessage(receiver: Player, component: ComponentText, sender: UUID?) { - if (majorLegacy >= 11901) { - receiver.sendPacket(ClientboundSystemChatPacket::class.java.invokeConstructor( - craftChatMessageFromComponent(component), - false - )) - } else if (majorLegacy == 11900) { - receiver.sendPacket(ClientboundSystemChatPacket::class.java.invokeConstructor( - craftChatMessageFromComponent(component), - 0 - )) + if (majorLegacy >= 11900) { + val player = (receiver as CraftPlayer19).handle + player.sendSystemMessage(craftChatMessageFromComponent(component) as NMSIChatBaseComponent) } else if (majorLegacy >= 11600) { receiver.sendPacket(PacketPlayOutChat::class.java.invokeConstructor( craftChatMessageFromComponent(component), diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt index ce6c4934..1f49e13d 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/api/impl/BukkitComponentManager.kt @@ -34,10 +34,6 @@ object BukkitComponentManager : ComponentManager { PlatformFactory.registerAPI(this) } - override fun filterComponent(component: ComponentText, maxLength: Int): ComponentText { - return validateComponent(DefaultComponent(listOf(filterComponent(component.toSpigotObject()))), maxLength) - } - override fun sendComponent(receiver: Any, component: ComponentText, sender: Any?) { val commandSender = when (receiver) { is ProxyCommandSender -> receiver.cast() @@ -58,8 +54,10 @@ object BukkitComponentManager : ComponentManager { } val newComponent = if (isFilterEnabled && commandSender is Player && commandSender.data.isFilterEnabled) { filterComponent(component, Settings.componentMaxLength) - } else { + } else if (commandSender is Player) { validateComponent(component, Settings.componentMaxLength) + } else { + component } if (commandSender is Player) { @@ -69,10 +67,14 @@ object BukkitComponentManager : ComponentManager { } } - private fun validateComponent(component: ComponentText, maxLength: Int): ComponentText { + override fun filterComponent(component: ComponentText, maxLength: Int): ComponentText { + return validateComponent(DefaultComponent(listOf(filterComponent(component.toSpigotObject()))), maxLength) + } + + override fun validateComponent(component: ComponentText, maxLength: Int): ComponentText { if (maxLength <= 0) return component return if (component.toRawMessage().length > maxLength) { - Components.text("This chat component is too big to show (> $maxLength).") + Components.text("This chat component is too big to show ( > $maxLength ).") } else { component } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Filters.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Filters.kt index 8279c981..7f02b185 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Filters.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Filters.kt @@ -1,12 +1,11 @@ package me.arasple.mc.trchat.module.conf.file import me.arasple.mc.trchat.TrChat -import org.bukkit.command.CommandSender import taboolib.common.LifeCycle import taboolib.common.platform.Awake import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide -import taboolib.common.platform.function.adaptCommandSender +import taboolib.common.platform.ProxyCommandSender import taboolib.common.platform.function.console import taboolib.module.configuration.Config import taboolib.module.configuration.Configuration @@ -27,7 +26,7 @@ object Filters { conf.onReload { reload() } } - fun reload(notify: CommandSender? = null) { + fun reload(notify: ProxyCommandSender = console()) { TrChat.api().getFilterManager().loadFilter( conf.getStringList("Local"), conf.getStringList("Ignored-Punctuations"), @@ -35,7 +34,8 @@ object Filters { conf.getBoolean("Cloud-Thesaurus.Enabled"), conf.getStringList("Cloud-Thesaurus.Urls"), conf.getStringList("Cloud-Thesaurus.Ignored"), - notify = notify?.let { adaptCommandSender(it) } ?: console() + updateCloud = true, + notify = notify ) } } \ No newline at end of file diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Functions.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Functions.kt index 093244b1..da15858c 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Functions.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Functions.kt @@ -7,6 +7,7 @@ import taboolib.common.LifeCycle import taboolib.common.platform.Awake import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide +import taboolib.common.platform.function.console import taboolib.common.util.ResettableLazy import taboolib.common5.Baffle import taboolib.module.configuration.Config @@ -29,7 +30,7 @@ object Functions { @Awake(LifeCycle.LOAD) fun init() { conf.onReload { - Loader.loadFunctions() + Loader.loadFunctions(console()) ResettableLazy.reset("functions") } } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt index b8d4d18b..34d498d4 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/conf/file/Settings.kt @@ -11,6 +11,7 @@ import taboolib.module.configuration.Config import taboolib.module.configuration.ConfigNode import taboolib.module.configuration.ConfigNodeTransfer import taboolib.module.configuration.Configuration +import taboolib.module.kether.Kether /** * @author ItsFlicker @@ -40,6 +41,9 @@ object Settings { @Awake(LifeCycle.ENABLE) fun init() { + conf.onReload { + Kether.isAllowToleranceParser = conf.getBoolean("Options.Kether-Allow-Tolerance-Parser", true) + } if (conf.getBoolean("Options.Check-Update", true)) { submitAsync(delay = 20, period = 15 * 60 * 20) { Updater.grabInfo() diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/ChatSession.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/ChatSession.kt index bff8e3d8..764e7925 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/ChatSession.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/ChatSession.kt @@ -22,10 +22,11 @@ class ChatSession( var channel: String? ) { + val receivedMessages = mutableListOf() var lastPublicMessage = "" var lastPrivateMessage = "" var lastPrivateTo = "" - val receivedMessages = mutableListOf() + var cancelChat = false fun getColor(default: CustomColor?): CustomColor { val forces = MessageColors.getForceColors(player) diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/Channel.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/Channel.kt index 651a5be7..d4615313 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/Channel.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/Channel.kt @@ -149,6 +149,10 @@ open class Channel( .mapNotNull { suffix -> suffix.value.firstOrNull { it.condition.pass(player) }?.content?.toTextComponent(player) } .forEach { suffix -> component.append(suffix) } } ?: return null + if (session.cancelChat) { + session.cancelChat = false + return null + } // TODO: 跨服事件传递 // Proxy if (settings.proxy) { diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt index 41d502da..125fbc20 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/channel/PrivateChannel.kt @@ -127,6 +127,10 @@ class PrivateChannel( .forEach { suffix -> receive.append(suffix) } } ?: return null + if (session.cancelChat) { + session.cancelChat = false + return null + } // Channel event if (!events.send(player, session.lastPrivateTo, msg)) { return null diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/function/standard/ItemShow.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/function/standard/ItemShow.kt index a55eed56..3dbc1068 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/function/standard/ItemShow.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/display/function/standard/ItemShow.kt @@ -2,6 +2,7 @@ package me.arasple.mc.trchat.module.display.function.standard import com.google.common.cache.Cache import com.google.common.cache.CacheBuilder +import me.arasple.mc.trchat.api.impl.BukkitProxyManager import me.arasple.mc.trchat.module.adventure.toNative import me.arasple.mc.trchat.module.conf.file.Functions import me.arasple.mc.trchat.module.display.function.Function @@ -12,13 +13,17 @@ import me.arasple.mc.trchat.module.internal.script.Reaction import me.arasple.mc.trchat.util.* import org.bukkit.Material import org.bukkit.entity.Player +import org.bukkit.inventory.Inventory import org.bukkit.inventory.ItemStack +import taboolib.common.io.digest import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide import taboolib.common.util.asList import taboolib.common.util.replaceWithOrder import taboolib.common.util.resettableLazy +import taboolib.common5.util.encodeBase64 import taboolib.common5.util.parseMillis +import taboolib.library.xseries.XMaterial import taboolib.module.chat.ComponentText import taboolib.module.chat.Components import taboolib.module.chat.impl.DefaultComponent @@ -27,8 +32,12 @@ import taboolib.module.configuration.ConfigNodeTransfer import taboolib.module.nms.MinecraftVersion import taboolib.module.nms.getI18nName import taboolib.module.nms.getInternalName +import taboolib.module.ui.buildMenu +import taboolib.module.ui.type.Hopper +import taboolib.platform.util.asLangText import taboolib.platform.util.buildItem import taboolib.platform.util.sendLang +import taboolib.platform.util.serializeToByteArray /** * @author ItsFlicker @@ -62,7 +71,10 @@ object ItemShow : Function("ITEM") { @ConfigNode("General.Item-Show.Keys", "function.yml") var keys = emptyList() - private val cache: Cache = CacheBuilder.newBuilder() + private val cacheComponent: Cache = CacheBuilder.newBuilder() + .maximumSize(50) + .build() + val cacheHopper: Cache = CacheBuilder.newBuilder() .maximumSize(50) .build() @@ -94,15 +106,25 @@ object ItemShow : Function("ITEM") { newItem } } - return cache.get(item) { + val sha1 = computeAndCache(sender, item).let { + BukkitProxyManager.sendMessage(sender, arrayOf( + "ItemShow", + MinecraftVersion.minecraftVersion, + sender.name, + it.first, + it.second) + ) + it.first + } + return cacheComponent.get(item) { sender - .getComponentFromLang("Function-Item-Show-Format-New", item.amount) { type, i, part, proxySender -> + .getComponentFromLang("Function-Item-Show-Format-With-Hopper", item.amount, sha1) { type, i, part, proxySender -> val component = if (part.isVariable && part.text == "item") { item.getNameComponent(sender) } else { - Components.text(part.text.translate(proxySender).replaceWithOrder(item.amount)) + Components.text(part.text.translate(proxySender).replaceWithOrder(item.amount, sha1)) } - component.applyStyle(type, part, i, proxySender, item.amount).hoverItemFixed(item) + component.applyStyle(type, part, i, proxySender, item.amount, sha1).hoverItemFixed(item) } } } @@ -124,6 +146,22 @@ object ItemShow : Function("ITEM") { return true } + fun computeAndCache(sender: Player, item: ItemStack): Pair { + val sha1 = item.serializeToByteArray().encodeBase64().digest("sha-1") + if (cacheHopper.getIfPresent(sha1) != null) { + return sha1 to cacheHopper.getIfPresent(sha1)!!.serializeToByteArray().encodeBase64() + } + val menu = buildMenu(sender.asLangText("Function-Item-Show-Title", sender.name)) { + rows(1) + map("xxixx") + set('x', XMaterial.BLACK_STAINED_GLASS_PANE) { name = "§r" } + set('i', item) + onClick(lock = true) + } + cacheHopper.put(sha1, menu) + return sha1 to menu.serializeToByteArray().encodeBase64() + } + @Suppress("Deprecation") private fun ItemStack.getNameComponent(player: Player): ComponentText { return if (originName || itemMeta?.hasDisplayName() != true) { diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt index 8e0a2d79..7002f481 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/TrChatBukkit.kt @@ -2,7 +2,6 @@ package me.arasple.mc.trchat.module.internal import me.arasple.mc.trchat.TrChat import me.arasple.mc.trchat.api.impl.BukkitProxyManager -import me.arasple.mc.trchat.module.conf.Loader import me.arasple.mc.trchat.module.conf.file.Filters import me.arasple.mc.trchat.module.conf.file.Functions import me.arasple.mc.trchat.module.conf.file.Settings @@ -15,7 +14,6 @@ import org.bukkit.Bukkit import taboolib.common.platform.* import taboolib.common.platform.function.console import taboolib.common.platform.function.pluginVersion -import taboolib.module.kether.Kether import taboolib.module.lang.sendLang import taboolib.module.nms.MinecraftVersion.majorLegacy @@ -63,9 +61,7 @@ object TrChatBukkit : Plugin() { Settings.conf.reload() Functions.conf.reload() Filters.conf.reload() - Kether.isAllowToleranceParser = Settings.conf.getBoolean("Options.Kether-Allow-Tolerance-Parser", true) TrChat.api().getChannelManager().loadChannels(notify) - Loader.loadFunctions(notify) } } \ No newline at end of file diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/CommandHandler.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/CommandHandler.kt index f21d64c7..bf09a7be 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/CommandHandler.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/CommandHandler.kt @@ -5,14 +5,13 @@ import me.arasple.mc.trchat.module.internal.TrChatBukkit import me.arasple.mc.trchat.module.internal.command.sub.CommandColor import me.arasple.mc.trchat.module.internal.command.sub.CommandRecallMessage import me.arasple.mc.trchat.util.data +import me.arasple.mc.trchat.util.parseSimple +import org.bukkit.command.CommandSender import org.bukkit.entity.Player import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide import taboolib.common.platform.ProxyCommandSender -import taboolib.common.platform.command.CommandBody -import taboolib.common.platform.command.CommandHeader -import taboolib.common.platform.command.mainCommand -import taboolib.common.platform.command.subCommand +import taboolib.common.platform.command.* import taboolib.expansion.createHelper import taboolib.module.lang.sendLang import taboolib.platform.util.sendLang @@ -28,12 +27,11 @@ import taboolib.platform.util.sendLang @CommandHeader("trchat", ["trc"], "TrChat main command", permission = "trchat.access") object CommandHandler { - @CommandBody(permission = "trchat.command.reload", optional = true) - val reload = subCommand { - execute { sender, _, _ -> - TrChatBukkit.reload(sender) - } - } + @CommandBody(permission = "trchat.command.color", optional = true) + val color = CommandColor.command + + @CommandBody(permission = "trchat.command.recallmessage", optional = true) + val recallMessage = CommandRecallMessage.command @CommandBody(permission = "trchat.command.chatfilter", optional = true) val chatFilter = subCommand { @@ -42,6 +40,33 @@ object CommandHandler { } } + @CommandBody(permission = "trchat.command.clear", optional = true) + val clear = subCommand { + player(suggest = listOf("*")) { + execute { _, ctx, _ -> + ctx.players("player").forEach { + repeat(80) { _ -> + it.sendMessage("") + } + } + } + } + } + + @CommandBody(permission = "trchat.command.tellsimple", optional = true) + val tellsimple = subCommand { + player(suggest = listOf("*")) { + dynamic("message") { + execute { _, ctx, argument -> + val component = argument.parseSimple() + ctx.players("player").forEach { + component.sendTo(it) + } + } + } + } + } + @CommandBody(permission = "trchat.command.spy", optional = true) val spy = subCommand { execute { sender, _, _ -> @@ -57,11 +82,12 @@ object CommandHandler { } } - @CommandBody(permission = "trchat.command.recallmessage", optional = true) - val recallMessage = CommandRecallMessage.command - - @CommandBody(permission = "trchat.command.color", optional = true) - val color = CommandColor.command + @CommandBody(permission = "trchat.command.reload", optional = true) + val reload = subCommand { + execute { sender, _, _ -> + TrChatBukkit.reload(sender) + } + } @CommandBody val help = subCommand { diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandChannel.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandChannel.kt index e6c840b4..edb2e66b 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandChannel.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandChannel.kt @@ -19,7 +19,7 @@ object CommandChannel { @Awake(LifeCycle.ENABLE) fun c() { - command("channel", listOf("chatchannel", "trchannel"), "聊天频道", permission = "trchat.command.channel") { + command("channel", listOf("chatchannel", "trchannel"), "TrChat Channel", permission = "trchat.command.channel") { literal("join") { dynamic("channel") { suggestion { _, _ -> diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandIgnore.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandIgnore.kt index de10810f..8f0cb043 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandIgnore.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandIgnore.kt @@ -9,6 +9,7 @@ import taboolib.common.LifeCycle import taboolib.common.platform.Awake import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide +import taboolib.common.platform.command.bool import taboolib.common.platform.command.command import taboolib.common.platform.command.suggest import taboolib.expansion.createHelper @@ -29,8 +30,8 @@ object CommandIgnore { suggest { BukkitProxyManager.getPlayerNames().keys.filter { it !in PlayerData.vanishing } } - execute { sender, _, argument -> - val player = Bukkit.getOfflinePlayer(argument) + execute { sender, ctx, _ -> + val player = Bukkit.getOfflinePlayer(ctx["player"]) if (!player.hasPlayedBefore()) { return@execute sender.sendLang("Command-Player-Not-Exist") } @@ -40,6 +41,21 @@ object CommandIgnore { sender.sendLang("Ignore-Cancel-Player", player.name!!) } } + bool(optional = true) { + execute { sender, ctx, _ -> + val player = Bukkit.getOfflinePlayer(ctx["player"]) + if (!player.hasPlayedBefore()) { + return@execute sender.sendLang("Command-Player-Not-Exist") + } + if (ctx.bool("boolean")) { + sender.data.addIgnored(player.uniqueId) + sender.sendLang("Ignore-Ignored-Player", player.name!!) + } else { + sender.data.removeIgnored(player.uniqueId) + sender.sendLang("Ignore-Cancel-Player", player.name!!) + } + } + } } incorrectSender { sender, _ -> sender.sendLang("Command-Not-Player") diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandMute.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandMute.kt index b823d415..513d4a0f 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandMute.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandMute.kt @@ -12,7 +12,6 @@ import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide import taboolib.common.platform.command.command import taboolib.common.platform.command.suggest -import taboolib.common5.Demand import taboolib.common5.util.parseMillis import taboolib.expansion.createHelper import taboolib.platform.util.sendLang @@ -32,13 +31,13 @@ object CommandMute { @Awake(LifeCycle.ENABLE) fun c() { - command("mute", description = "Mute", permission = "trchat.command.mute") { + command("mute", description = "Mute player", permission = "trchat.command.mute", newParser = true) { dynamic("player") { suggest { BukkitProxyManager.getPlayerNames().keys.toList() } - execute { sender, _, argument -> - val player = Bukkit.getOfflinePlayer(argument) + execute { sender, ctx, _ -> + val player = Bukkit.getOfflinePlayer(ctx["player"]) if (!player.hasPlayedBefore()) { return@execute sender.sendLang("Command-Player-Not-Exist") } @@ -49,26 +48,25 @@ object CommandMute { } dynamic("options", optional = true) { suggestion(uncheck = true) { _, _ -> - listOf("-t 1h", "-t 2d", "-t 15m", "-r 原因", "--cancel") + listOf("-t=15m", "-t=1h", "-t=3d", "-r=Reason", "-cancel") } - execute { sender, ctx, argument -> + execute { sender, ctx, _ -> val player = Bukkit.getOfflinePlayer(ctx["player"]) if (!player.hasPlayedBefore()) { return@execute sender.sendLang("Command-Player-Not-Exist") } val data = player.data - val de = Demand("mute $argument") - if (de.tags.contains("cancel")) { + if (ctx.hasOption("cancel")) { data.updateMuteTime(0) sender.sendLang("Mute-Cancel-Muted-Player", player.name!!) - (player as? Player)?.sendLang("General-Cancel-Muted") + player.player?.sendLang("General-Cancel-Muted") } else { - val time = de.get("t") ?: "999d" - val reason = de.get("r") ?: "null" + val time = ctx.option("time", "t") ?: "999d" + val reason = ctx.option("reason", "r") ?: "null" data.updateMuteTime(time.parseMillis()) data.setMuteReason(reason) sender.sendLang("Mute-Muted-Player", player.name!!, time, reason) - (player as? Player)?.sendLang("General-Muted", muteDateFormat.format(data.muteTime), data.muteReason) + player.player?.sendLang("General-Muted", muteDateFormat.format(data.muteTime), data.muteReason) } } } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandViews.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandViews.kt index 2433c5e6..7de7cfda 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandViews.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/command/main/CommandViews.kt @@ -3,6 +3,7 @@ package me.arasple.mc.trchat.module.internal.command.main import me.arasple.mc.trchat.module.display.function.standard.EnderChestShow import me.arasple.mc.trchat.module.display.function.standard.ImageShow import me.arasple.mc.trchat.module.display.function.standard.InventoryShow +import me.arasple.mc.trchat.module.display.function.standard.ItemShow import org.bukkit.entity.Player import taboolib.common.LifeCycle import taboolib.common.platform.Awake @@ -24,6 +25,23 @@ object CommandViews { @Awake(LifeCycle.ENABLE) fun c() { + command("view-item", permissionDefault = PermissionDefault.TRUE) { + dynamic("item") { + execute { sender, _, argument -> + ItemShow.cacheHopper.getIfPresent(argument)?.let { + sender.openInventory(it) + } ?: kotlin.run { + sender.sendLang("Function-Inventory-Show-Unavailable") + } + } + } + incorrectSender { sender, _ -> + sender.sendLang("Command-Not-Player") + } + incorrectCommand { _, _, _, _ -> + createHelper() + } + } command("view-inventory", permissionDefault = PermissionDefault.TRUE) { dynamic("inventory") { execute { sender, _, argument -> diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/hook/HookPlugin.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/hook/HookPlugin.kt index 1359ebb7..0835db18 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/hook/HookPlugin.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/hook/HookPlugin.kt @@ -3,10 +3,14 @@ package me.arasple.mc.trchat.module.internal.hook import me.arasple.mc.trchat.module.internal.hook.impl.HookEcoEnchants import me.arasple.mc.trchat.module.internal.hook.impl.HookItemsAdder import me.arasple.mc.trchat.module.internal.hook.impl.HookNova +import me.arasple.mc.trchat.module.internal.hook.type.HookDisplayItem +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide import taboolib.common.platform.function.console import taboolib.module.lang.sendLang +import java.util.function.BiFunction /** * @author Arasple @@ -32,6 +36,17 @@ object HookPlugin { console().sendLang("Plugin-Dependency-Hooked", element.name) } + fun registerDisplayItemHook(name: String, func: BiFunction) { + addHook(object : HookDisplayItem() { + override fun getPluginName(): String { + return name + } + override fun displayItem(item: ItemStack, player: Player): ItemStack { + return func.apply(item, player) + } + }) + } + fun getEcoEnchants(): HookEcoEnchants { return registry[0] as HookEcoEnchants } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerPackets.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerPackets.kt index 255b7588..33f25161 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerPackets.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerPackets.kt @@ -22,6 +22,7 @@ object ListenerPackets { if (majorLegacy >= 11902) { when (e.packet.name) { "ClientboundServerDataPacket" -> e.packet.write("enforcesSecureChat", true) + "ClientboundPlayerChatHeaderPacket" -> e.isCancelled = true } } } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/proxy/BukkitProxyProcessor.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/proxy/BukkitProxyProcessor.kt index b2d3ef58..d9dfca79 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/proxy/BukkitProxyProcessor.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/proxy/BukkitProxyProcessor.kt @@ -6,6 +6,7 @@ import me.arasple.mc.trchat.module.conf.Loader import me.arasple.mc.trchat.module.display.channel.Channel import me.arasple.mc.trchat.module.display.function.standard.EnderChestShow import me.arasple.mc.trchat.module.display.function.standard.InventoryShow +import me.arasple.mc.trchat.module.display.function.standard.ItemShow import me.arasple.mc.trchat.module.internal.TrChatBukkit import me.arasple.mc.trchat.module.internal.proxy.redis.RedisManager import me.arasple.mc.trchat.module.internal.proxy.redis.TrRedisMessage @@ -16,11 +17,13 @@ import org.bukkit.configuration.file.YamlConfiguration import org.bukkit.entity.Player import org.bukkit.plugin.messaging.PluginMessageListener import org.bukkit.plugin.messaging.PluginMessageRecipient +import taboolib.common.platform.function.console import taboolib.common.platform.function.getProxyPlayer import taboolib.common.platform.function.submitAsync import taboolib.common.util.subList import taboolib.common5.util.decodeBase64 import taboolib.module.chat.Components +import taboolib.module.lang.asLangText import taboolib.module.lang.sendLang import taboolib.module.nms.MinecraftVersion import taboolib.platform.util.bukkitPlugin @@ -110,12 +113,22 @@ sealed interface BukkitProxyProcessor : PluginMessageListener { } BukkitProxyManager.sendMessage(onlinePlayers.firstOrNull(), arrayOf("LoadedProxyChannel", id)) } + "ItemShow" -> { + if (data[1] == MinecraftVersion.minecraftVersion) { + val name = data[2] + val sha1 = data[3] + if (ItemShow.cacheHopper.getIfPresent(sha1) == null) { + val inventory = data[4].decodeBase64().deserializeToInventory(createNoClickHopper(console().asLangText("Function-Item-Show-Title", name))) + ItemShow.cacheHopper.put(sha1, inventory) + } + } + } "InventoryShow" -> { if (data[1] == MinecraftVersion.minecraftVersion) { val name = data[2] val sha1 = data[3] if (InventoryShow.cache.getIfPresent(sha1) == null) { - val inventory = data[4].decodeBase64().deserializeToInventory(createNoClickInventory(54, "$name's Inventory")) + val inventory = data[4].decodeBase64().deserializeToInventory(createNoClickChest(6, console().asLangText("Function-Inventory-Show-Title", name))) InventoryShow.cache.put(sha1, inventory) } } @@ -125,7 +138,7 @@ sealed interface BukkitProxyProcessor : PluginMessageListener { val name = data[2] val sha1 = data[3] if (EnderChestShow.cache.getIfPresent(sha1) == null) { - val inventory = data[4].decodeBase64().deserializeToInventory(createNoClickInventory(27, "$name's Ender Chest")) + val inventory = data[4].decodeBase64().deserializeToInventory(createNoClickChest(3, console().asLangText("Function-EnderChest-Show-Title", name))) EnderChestShow.cache.put(sha1, inventory) } } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/script/kether/KetherActions.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/script/kether/KetherActions.kt index 5f949e87..2aee1c10 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/script/kether/KetherActions.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/module/internal/script/kether/KetherActions.kt @@ -3,13 +3,11 @@ package me.arasple.mc.trchat.module.internal.script.kether import me.arasple.mc.trchat.TrChat import me.arasple.mc.trchat.module.conf.file.Settings import me.arasple.mc.trchat.module.display.channel.Channel +import me.arasple.mc.trchat.util.session import org.bukkit.entity.Player import taboolib.common.platform.Platform import taboolib.common.platform.PlatformSide -import taboolib.module.kether.KetherParser -import taboolib.module.kether.ScriptFrame -import taboolib.module.kether.combinationParser -import taboolib.module.kether.script +import taboolib.module.kether.* @PlatformSide([Platform.BUKKIT]) internal object KetherActions { @@ -51,6 +49,14 @@ internal object KetherActions { } } + @KetherParser(["cancel"], namespace = "trchat") + internal fun actionCancel() = scriptParser { + actionNow { + player().session.cancelChat = true + null + } + } + fun ScriptFrame.player(): Player { return script().sender?.castSafely() ?: error("No player selected.") } diff --git a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/util/BukkitUtil.kt b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/util/BukkitUtil.kt index c33efd31..042fd87e 100644 --- a/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/util/BukkitUtil.kt +++ b/project/runtime-bukkit/src/main/kotlin/me/arasple/mc/trchat/util/BukkitUtil.kt @@ -12,6 +12,7 @@ import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.command.CommandSender import org.bukkit.entity.Player +import org.bukkit.event.inventory.InventoryType import taboolib.common.util.unsafeLazy import taboolib.expansion.DataContainer import taboolib.expansion.playerDataContainer @@ -20,19 +21,27 @@ import taboolib.module.chat.ComponentText import taboolib.module.nms.MinecraftVersion import taboolib.module.ui.MenuHolder import taboolib.module.ui.type.Basic +import taboolib.module.ui.type.Hopper import taboolib.platform.util.sendLang val isDragonCoreHooked by unsafeLazy { Bukkit.getPluginManager().isPluginEnabled("DragonCore") && MinecraftVersion.major < 8 } -private val noClickBasic = object : Basic() { - init { - rows(6) - onClick(lock = true) - } -} + +fun createNoClickChest(rows: Int, title: String) = + MenuHolder(object : Basic(title) { + init { + rows(rows) + onClick(lock = true) + } + }).inventory @Suppress("Deprecation") -fun createNoClickInventory(size: Int, title: String) = - Bukkit.createInventory(MenuHolder(noClickBasic), size, title) +fun createNoClickHopper(title: String) = + Bukkit.createInventory(MenuHolder(object : Hopper(title) { + init { + rows(1) + onClick(lock = true) + } + }), InventoryType.HOPPER, title) fun String?.toCondition() = if (this == null) Condition.EMPTY else Condition(this) diff --git a/project/runtime-bukkit/src/main/resources/function.yml b/project/runtime-bukkit/src/main/resources/function.yml index 78eb83a2..d9bd947b 100644 --- a/project/runtime-bukkit/src/main/resources/function.yml +++ b/project/runtime-bukkit/src/main/resources/function.yml @@ -12,7 +12,7 @@ General: Permission: 'none' Cooldown: '30s' Notify: true - Actions: [ ] + Action: [ ] Mention-All: Enabled: true Permission: 'trchat.function.mentionall' @@ -24,7 +24,7 @@ General: - "@everybody" - "@所有人" - "@全体成员" - Actions: [ ] + Action: [ ] Item-Show: Enabled: true Permission: 'none' @@ -38,7 +38,7 @@ General: - "%item" - "[i]" - "[item]" - Actions: [ ] + Action: [ ] Inventory-Show: Enabled: true Permission: 'trchat.function.inventoryshow' @@ -46,7 +46,7 @@ General: Keys: - '[inv]' - '[inventory]' - Actions: [ ] + Action: [ ] EnderChest-Show: Enabled: true Permission: 'trchat.function.enderchestshow' @@ -60,7 +60,7 @@ General: Permission: 'trchat.function.imageshow' Cooldown: '1m' Key: '!\[([^;]*)\]\(([a-zA-Z]+://[^\s]*)\)' - Actions: [ ] + Action: [ ] Custom: # 示例 —— 网站分享 shareUrl: diff --git a/project/runtime-bukkit/src/main/resources/lang/en_US.yml b/project/runtime-bukkit/src/main/resources/lang/en_US.yml index 6e8eb016..0ba43d84 100644 --- a/project/runtime-bukkit/src/main/resources/lang/en_US.yml +++ b/project/runtime-bukkit/src/main/resources/lang/en_US.yml @@ -121,10 +121,14 @@ Function-Mention-Notify: sound: 'BLOCK_ANVIL_LAND' volume: 1 pitch: 2 -Function-Item-Show-Format-New: +Function-Item-Show-Format-With-Hopper: - type: json text: '&8\[[item] &bx{0}&8\]' - args: [ ] + args: + - hover: '&7Click to view this item' + command: '/view-item {1}' +Function-Item-Show-Unavailable: '&c&This item has been expired or does not exist...' +Function-Item-Show-Title: '{0}''s Item' Function-Inventory-Show-Format: - type: json text: '[&8\[&3Inventory of {0}&8\]]' diff --git a/project/runtime-bukkit/src/main/resources/lang/es_ES.yml b/project/runtime-bukkit/src/main/resources/lang/es_ES.yml index a3b9edef..0af43ff4 100644 --- a/project/runtime-bukkit/src/main/resources/lang/es_ES.yml +++ b/project/runtime-bukkit/src/main/resources/lang/es_ES.yml @@ -114,10 +114,14 @@ Function-Mention-Notify: sound: 'BLOCK_ANVIL_LAND' volume: 1 pitch: 2 -Function-Item-Show-Format-New: +Function-Item-Show-Format-With-Hopper: - type: json text: '&8\[[item] &bx{0}&8\]' - args: [ ] + args: + - hover: '&7Click to view this item' + command: '/view-item {1}' +Function-Item-Show-Unavailable: '&c&This item has been expired or does not exist...' +Function-Item-Show-Title: '{0}''s Item' Function-Inventory-Show-Format: - type: json text: '[&8\[&3Inventory of {0}&8\]]' diff --git a/project/runtime-bukkit/src/main/resources/lang/zh_CN.yml b/project/runtime-bukkit/src/main/resources/lang/zh_CN.yml index 6f6e4b55..5bd4564e 100644 --- a/project/runtime-bukkit/src/main/resources/lang/zh_CN.yml +++ b/project/runtime-bukkit/src/main/resources/lang/zh_CN.yml @@ -128,10 +128,14 @@ Function-Mention-All-Format: - type: json text: ' [&a@&2所有人] ' args: [ ] -Function-Item-Show-Format-New: +Function-Item-Show-Format-With-Hopper: - type: json text: '&8\[[item] &bx{0}&8\]' - args: [ ] + args: + - hover: '&7点击查看此物品' + command: '/view-item {1}' +Function-Item-Show-Unavailable: '&c&l该物品已过期或不存在...' +Function-Item-Show-Title: '{0}的物品' Function-Inventory-Show-Format: - type: json text: '[&8\[&3{0}的背包&8\]]' diff --git a/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeComponentManager.kt b/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeComponentManager.kt index d027fd4e..8a09f84c 100644 --- a/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeComponentManager.kt +++ b/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeComponentManager.kt @@ -19,10 +19,6 @@ object BungeeComponentManager : ComponentManager { PlatformFactory.registerAPI(this) } - override fun filterComponent(component: ComponentText, maxLength: Int): ComponentText { - return validateComponent(DefaultComponent(listOf(filterComponent(component.toSpigotObject()))), maxLength) - } - override fun sendComponent(receiver: Any, component: ComponentText, sender: Any?) { val commandSender = when (receiver) { is ProxyCommandSender -> receiver.cast() @@ -35,13 +31,17 @@ object BungeeComponentManager : ComponentManager { is UUID -> sender else -> null } - commandSender.sendMessage(uuid, component.toSpigotObject()) + commandSender.sendMessage(uuid, validateComponent(component, 32766).toSpigotObject()) + } + + override fun filterComponent(component: ComponentText, maxLength: Int): ComponentText { + return validateComponent(DefaultComponent(listOf(filterComponent(component.toSpigotObject()))), maxLength) } - private fun validateComponent(component: ComponentText, maxLength: Int): ComponentText { + override fun validateComponent(component: ComponentText, maxLength: Int): ComponentText { if (maxLength <= 0) return component return if (component.toRawMessage().length > maxLength) { - Components.text("This chat component is too big to show (> $maxLength).") + Components.text("This chat component is too big to show ( > $maxLength ).") } else { component } diff --git a/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeProxyManager.kt b/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeProxyManager.kt index 035276fc..e7974219 100644 --- a/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeProxyManager.kt +++ b/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/api/impl/BungeeProxyManager.kt @@ -53,9 +53,18 @@ object BungeeProxyManager : ProxyMessageManager { } } - fun sendMessageToAll(vararg args: String, predicate: (ServerInfo) -> Boolean = { true }) { - server().servers.filter { (_, v) -> predicate(v) }.forEach { (_, v) -> - sendMessage(v, *args) + fun sendMessageToAll(vararg args: String, predicate: (ServerInfo) -> Boolean = { true }): Future<*> { + val recipients = server().servers.filter { (_, v) -> v.players.isNotEmpty() && predicate(v) } + return executor.submit { + try { + for (bytes in buildMessage(*args)) { + recipients.forEach { (_, v) -> + v.sendData(TrChatBungee.TRCHAT_CHANNEL, bytes) + } + } + } catch (e: IOException) { + e.print("Failed to send proxy trchat message!") + } } } diff --git a/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerBungeeTransfer.kt b/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerBungeeTransfer.kt index 7e2e4a5c..10ba81bd 100644 --- a/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerBungeeTransfer.kt +++ b/project/runtime-bungee/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerBungeeTransfer.kt @@ -1,11 +1,11 @@ package me.arasple.mc.trchat.module.internal.listener import me.arasple.mc.trchat.api.impl.BungeeChannelManager +import me.arasple.mc.trchat.api.impl.BungeeComponentManager import me.arasple.mc.trchat.api.impl.BungeeProxyManager import me.arasple.mc.trchat.module.internal.TrChatBungee import me.arasple.mc.trchat.util.print import me.arasple.mc.trchat.util.proxy.common.MessageReader -import me.arasple.mc.trchat.util.toUUID import net.md_5.bungee.api.ProxyServer import net.md_5.bungee.api.connection.Connection import net.md_5.bungee.api.event.PluginMessageEvent @@ -66,7 +66,7 @@ object ListenerBungeeTransfer { val raw = data[2] val player = getProxyPlayer(to) ?: return - Components.parseRaw(raw).sendTo(player) + BungeeComponentManager.sendComponent(player, Components.parseRaw(raw)) } "BroadcastRaw" -> { val uuid = data[1] @@ -84,7 +84,7 @@ object ListenerBungeeTransfer { server().servers.forEach { (_, v) -> if (ports == null || v.address.port in ports) { v.players.filter { perm == "" || it.hasPermission(perm) }.forEach { - it.sendMessage(uuid.toUUID(), message.toSpigotObject()) + BungeeComponentManager.sendComponent(it, message, uuid) } } } @@ -95,6 +95,9 @@ object ListenerBungeeTransfer { val names = data[1].split(",").map { it.split("-", limit = 2) } BungeeProxyManager.allNames[connection.address.port] = names.associate { it[0] to it[1].takeIf { dn -> dn != "null" } } } + "ItemShow" -> { + BungeeProxyManager.sendMessageToAll("ItemShow", data[1], data[2], data[3], data[4]) + } "InventoryShow" -> { BungeeProxyManager.sendMessageToAll("InventoryShow", data[1], data[2], data[3], data[4]) } diff --git a/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/api/impl/VelocityProxyManager.kt b/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/api/impl/VelocityProxyManager.kt index 4ec080db..1711b645 100644 --- a/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/api/impl/VelocityProxyManager.kt +++ b/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/api/impl/VelocityProxyManager.kt @@ -57,10 +57,20 @@ object VelocityProxyManager : ProxyMessageManager { } } - fun sendMessageToAll(vararg args: String, predicate: (RegisteredServer) -> Boolean = { true }) { - plugin.server.allServers.filter { v -> predicate(v) }.forEach { v -> - sendMessage(v, *args) + fun sendMessageToAll(vararg args: String, predicate: (RegisteredServer) -> Boolean = { true }): Future<*> { + val recipients = plugin.server.allServers.filter { v -> v.playersConnected.isNotEmpty() && predicate(v) } + return executor.submit { + try { + for (bytes in buildMessage(*args)) { + recipients.forEach { v -> + v.sendPluginMessage(outgoing, bytes) + } + } + } catch (e: IOException) { + e.print("Failed to send proxy trchat message!") + } } + } @Schedule(async = true, period = 200L) diff --git a/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerVelocityTransfer.kt b/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerVelocityTransfer.kt index 82eabff4..e9e2c110 100644 --- a/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerVelocityTransfer.kt +++ b/project/runtime-velocity/src/main/kotlin/me/arasple/mc/trchat/module/internal/listener/ListenerVelocityTransfer.kt @@ -91,6 +91,9 @@ object ListenerVelocityTransfer { val names = data[1].split(",").map { it.split("-", limit = 2) } VelocityProxyManager.allNames[connection.serverInfo.address.port] = names.associate { it[0] to it[1].takeIf { dn -> dn != "null" } } } + "ItemShow" -> { + VelocityProxyManager.sendMessageToAll("ItemShow", data[1], data[2], data[3], data[4]) + } "InventoryShow" -> { VelocityProxyManager.sendMessageToAll("InventoryShow", data[1], data[2], data[3], data[4]) }