Skip to content

Commit 70c33c3

Browse files
author
YufiriaMazenta
committed
[1.3.2]修复死亡消息物品无法悬停展示的bug
1 parent 199074f commit 70c33c3

File tree

2 files changed

+45
-69
lines changed

2 files changed

+45
-69
lines changed

build.gradle.kts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88
}
99

1010
group = "com.github.yufiriamazenta"
11-
version = "1.3.1"
11+
version = "1.3.2"
1212

1313
repositories {
1414
mavenLocal()
@@ -23,16 +23,15 @@ repositories {
2323
maven("http://repo.crypticlib.com:8081/repository/maven-public/") {
2424
isAllowInsecureProtocol = true
2525
}
26-
maven("https://repo.papermc.io/repository/maven-public/")
2726
mavenCentral()
2827
}
2928

3029
dependencies {
3130
compileOnly("org.spigotmc:spigot:1.19-R0.1-SNAPSHOT")
32-
compileOnly("org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT")
3331
compileOnly("net.luckperms:api:5.4")
3432
compileOnly("me.clip:placeholderapi:2.11.1")
3533
compileOnly("io.lumine:Mythic-Dist:5.3.5")
34+
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
3635
implementation("com.crypticlib:common:0.18.10")
3736
implementation(kotlin("stdlib-jdk8"))
3837
}
@@ -67,5 +66,5 @@ tasks {
6766
}
6867
}
6968
kotlin {
70-
jvmToolchain(8)
69+
jvmToolchain(17)
7170
}

src/main/kotlin/com/github/yufiriamazenta/deathmsg/listener/DeathHandler.kt

Lines changed: 42 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import crypticlib.chat.MsgSender
66
import crypticlib.chat.TextProcessor
77
import crypticlib.listener.BukkitListener
88
import me.clip.placeholderapi.PlaceholderAPI
9+
import net.kyori.adventure.text.Component
10+
import net.kyori.adventure.text.ComponentLike
11+
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer
912
import net.md_5.bungee.api.ChatMessageType
10-
import net.md_5.bungee.api.chat.*
1113
import net.minecraft.network.chat.ComponentContents
1214
import net.minecraft.network.chat.IChatBaseComponent
1315
import net.minecraft.network.chat.contents.TranslatableContents
@@ -36,6 +38,7 @@ class DeathHandler: Listener {
3638
private var toChatMethod: Method? = null
3739
private var getComponentContentsMethod: Method? = null
3840
private var getObjsMethod: Method? = null
41+
private var legacySerializer = LegacyComponentSerializer.legacy('&')
3942

4043
@EventHandler
4144
fun onPlayerDeathReplaceMessage(event: PlayerDeathEvent) {
@@ -68,15 +71,15 @@ class DeathHandler: Listener {
6871

6972
//以下对死亡消息进行处理
7073
//此为消息中要替换的聊天组件
71-
val objList: MutableList<BaseComponent> = ArrayList()
74+
val objList: MutableList<ComponentLike> = ArrayList()
7275

7376
//以下处理第一个对象的名字,一般是被杀的玩家
7477
val displayNameFormat: String = DEATH_MESSAGE.config.getString("player_name_format", "%player_displayname%")!!
7578
objList.add(getDeadPlayerComponent(deadPlayer, displayNameFormat))
7679

7780
//当对象数量大于2等于2时,意味着有击杀者
7881
if (objArrLength >= 2) {
79-
objList.add(getKillerComponent(deadPlayer, displayNameFormat))
82+
objList.add(getKillerComponent(deadPlayer))
8083
}
8184

8285
//当有三个以上对象时,说明有使用的武器
@@ -85,7 +88,7 @@ class DeathHandler: Listener {
8588
}
8689

8790
//组装成完整的死亡消息组件
88-
val deathMsgComponent = TranslatableComponent(TextProcessor.color(message), *objList.toTypedArray())
91+
val deathMsgComponent = Component.translatable(TextProcessor.color(message), *objList.toTypedArray())
8992

9093
//当为all时直接让其为null,下面判断两种方式都发送
9194
val chatMessageTypeStr = DEATH_MESSAGE.config.getString("death_message_type", "chat")!!.uppercase()
@@ -104,14 +107,20 @@ class DeathHandler: Listener {
104107
if (deadPlayer != onlinePlayer) {
105108
if (DEATH_MESSAGE.isPlayerDeathMsgFilterOn(onlinePlayer)) continue
106109
}
107-
if (chatMessageType != null)
108-
onlinePlayer.spigot().sendMessage(chatMessageType, deathMsgComponent)
109-
else {
110-
onlinePlayer.spigot().sendMessage(ChatMessageType.CHAT, deathMsgComponent)
111-
onlinePlayer.spigot().sendMessage(ChatMessageType.ACTION_BAR, deathMsgComponent)
110+
when (chatMessageType) {
111+
ChatMessageType.CHAT, ChatMessageType.SYSTEM -> {
112+
onlinePlayer.sendMessage(deathMsgComponent)
113+
}
114+
ChatMessageType.ACTION_BAR -> {
115+
onlinePlayer.sendActionBar(deathMsgComponent)
116+
}
117+
null -> {
118+
onlinePlayer.sendMessage(deathMsgComponent)
119+
onlinePlayer.sendActionBar(deathMsgComponent)
120+
}
112121
}
113122
}
114-
Bukkit.getConsoleSender().spigot().sendMessage(deathMsgComponent)
123+
Bukkit.getConsoleSender().sendMessage(deathMsgComponent)
115124
entityHurtPlayerMap.remove(deadPlayer.uniqueId)
116125
event.deathMessage = null
117126
}
@@ -202,91 +211,59 @@ class DeathHandler: Listener {
202211
}
203212
}
204213

205-
private fun getDeadPlayerComponent(deadPlayer: Player, displayNameFormat: String): BaseComponent {
214+
private fun getDeadPlayerComponent(deadPlayer: Player, displayNameFormat: String): Component {
206215
var deadPlayerDisplayName =
207216
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null)
208217
TextProcessor.color(PlaceholderAPI.setPlaceholders(deadPlayer, displayNameFormat))
209218
else
210219
deadPlayer.displayName
211220
deadPlayerDisplayName = TextProcessor.color(deadPlayerDisplayName)
212-
val deadPlayerDisplayCompound: BaseComponent = TextComponent()
213-
for (baseComponent in TextComponent.fromLegacyText(deadPlayerDisplayName)) {
214-
deadPlayerDisplayCompound.addExtra(baseComponent)
215-
}
216-
217-
return deadPlayerDisplayCompound
221+
val deserialize = legacySerializer.deserialize(deadPlayerDisplayName)
222+
deserialize.hoverEvent(deadPlayer.asHoverEvent())
223+
return deserialize
218224
}
219225

220-
private fun getKillerComponent(deadPlayer: Player, displayNameFormat: String): BaseComponent {
221-
return if (deadPlayer.killer != null) {
226+
private fun getKillerComponent(deadPlayer: Player): Component {
227+
val killer = deadPlayer.killer
228+
return if (killer != null) {
222229
//当玩家存在击杀者时,返回击杀者的名字
223-
var killerDisplayNameStr: String = if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) TextProcessor.color(
224-
PlaceholderAPI.setPlaceholders(deadPlayer.killer, displayNameFormat)
225-
) else
226-
deadPlayer.killer!!.displayName
227-
killerDisplayNameStr = TextProcessor.color(killerDisplayNameStr)
228-
val killerDisplayCompound: BaseComponent = TextComponent()
229-
for (baseComponent in TextComponent.fromLegacyText(killerDisplayNameStr)) {
230-
killerDisplayCompound.addExtra(baseComponent)
231-
}
232-
killerDisplayCompound
230+
val displayName = killer.displayName()
231+
displayName.hoverEvent(killer.asHoverEvent())
232+
displayName
233233
} else {
234234
//当不存在击杀者时,尝试获取击杀实体的名字
235235
val lastEntityUuid = entityHurtPlayerMap[deadPlayer.uniqueId]
236236
if (lastEntityUuid == null || Bukkit.getEntity(lastEntityUuid) == null) {
237237
//当不存在击杀实体时,说明玩家可能死于方块爆炸
238238
val bedRespawnPoint = DataManager.getMessage(deadPlayer, "bad.respawn.point")?: "[刻意的游戏设计]"
239-
val bedRespawnDisplayCompound: BaseComponent = TextComponent()
240-
for (baseComponent in TextComponent.fromLegacyText(bedRespawnPoint)) {
241-
bedRespawnDisplayCompound.addExtra(baseComponent)
242-
}
243-
bedRespawnDisplayCompound
239+
legacySerializer.deserialize(bedRespawnPoint)
244240
} else {
245241
//当存在击杀实体时,尝试获取击杀实体
246242
val lastEntity = Bukkit.getEntity(entityHurtPlayerMap[deadPlayer.uniqueId]!!)
247-
if (lastEntity!!.customName != null) {
248-
val customNameDisplayCompound: BaseComponent = TextComponent()
249-
for (baseComponent in TextComponent.fromLegacyText(
250-
lastEntity.customName
251-
)) {
252-
customNameDisplayCompound.addExtra(baseComponent)
253-
}
254-
customNameDisplayCompound
243+
if (lastEntity!!.customName() != null) {
244+
val customName = lastEntity.customName()!!
245+
customName.hoverEvent(lastEntity.asHoverEvent())
246+
customName
255247
} else {
256-
val key = lastEntity.type.translationKey
257-
TranslatableComponent(key)
248+
val key = lastEntity.type.translationKey()
249+
val translatable = Component.translatable(key)
250+
translatable.hoverEvent(lastEntity.asHoverEvent())
251+
translatable
258252
}
259253
}
260254
}
261255
}
262256

263-
private fun getKillItemComponent(deadPlayer: Player): BaseComponent {
264-
var itemName: String
257+
private fun getKillItemComponent(deadPlayer: Player): Component {
265258
val handItem: ItemStack = if (deadPlayer.killer != null) {
266259
deadPlayer.killer!!.inventory.itemInMainHand
267260
} else {
268261
val lastEntity = Bukkit.getEntity(entityHurtPlayerMap[deadPlayer.uniqueId]!!)
269262
(lastEntity as LivingEntity?)!!.equipment!!.itemInMainHand
270263
}
271-
val meta = handItem.itemMeta
272-
itemName = if (meta == null) handItem.type.name else {
273-
if (meta.hasDisplayName()) {
274-
meta.displayName
275-
} else {
276-
meta.localizedName
277-
}
278-
}
279-
val itemNameFormat: String = if (handItem.enchantments.isEmpty()) {
280-
DEATH_MESSAGE.config.getString("item_default_format", "&r[%item_name%&r]")!!
281-
} else {
282-
DEATH_MESSAGE.config.getString("item_enchanted_format", "&b[%item_name%&b]")!!
283-
}
284-
itemName = itemNameFormat.replace("%item_name%", itemName)
285-
itemName = TextProcessor.color(itemName)
286-
val itemDisplayCompound: BaseComponent = TextComponent()
287-
itemDisplayCompound.extra = TextComponent.fromLegacyText(itemName).toMutableList()
288-
// itemDisplayCompound.hoverEvent = ItemFactory.item(handItem).toHover(); //TODO 寻找新的物品转HoverEvent方法
289-
return itemDisplayCompound
264+
val displayName = handItem.displayName()
265+
displayName.hoverEvent(handItem.asHoverEvent())
266+
return displayName
290267
}
291268

292269
@EventHandler

0 commit comments

Comments
 (0)