Skip to content

Commit

Permalink
[1.3.2]修复死亡消息物品无法悬停展示的bug
Browse files Browse the repository at this point in the history
  • Loading branch information
YufiriaMazenta committed Jul 27, 2024
1 parent 199074f commit 70c33c3
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 69 deletions.
7 changes: 3 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ plugins {
}

group = "com.github.yufiriamazenta"
version = "1.3.1"
version = "1.3.2"

repositories {
mavenLocal()
Expand All @@ -23,16 +23,15 @@ repositories {
maven("http://repo.crypticlib.com:8081/repository/maven-public/") {
isAllowInsecureProtocol = true
}
maven("https://repo.papermc.io/repository/maven-public/")
mavenCentral()
}

dependencies {
compileOnly("org.spigotmc:spigot:1.19-R0.1-SNAPSHOT")
compileOnly("org.spigotmc:spigot-api:1.20-R0.1-SNAPSHOT")
compileOnly("net.luckperms:api:5.4")
compileOnly("me.clip:placeholderapi:2.11.1")
compileOnly("io.lumine:Mythic-Dist:5.3.5")
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
implementation("com.crypticlib:common:0.18.10")
implementation(kotlin("stdlib-jdk8"))
}
Expand Down Expand Up @@ -67,5 +66,5 @@ tasks {
}
}
kotlin {
jvmToolchain(8)
jvmToolchain(17)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import crypticlib.chat.MsgSender
import crypticlib.chat.TextProcessor
import crypticlib.listener.BukkitListener
import me.clip.placeholderapi.PlaceholderAPI
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.ComponentLike
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer
import net.md_5.bungee.api.ChatMessageType
import net.md_5.bungee.api.chat.*
import net.minecraft.network.chat.ComponentContents
import net.minecraft.network.chat.IChatBaseComponent
import net.minecraft.network.chat.contents.TranslatableContents
Expand Down Expand Up @@ -36,6 +38,7 @@ class DeathHandler: Listener {
private var toChatMethod: Method? = null
private var getComponentContentsMethod: Method? = null
private var getObjsMethod: Method? = null
private var legacySerializer = LegacyComponentSerializer.legacy('&')

@EventHandler
fun onPlayerDeathReplaceMessage(event: PlayerDeathEvent) {
Expand Down Expand Up @@ -68,15 +71,15 @@ class DeathHandler: Listener {

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

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

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

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

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

//当为all时直接让其为null,下面判断两种方式都发送
val chatMessageTypeStr = DEATH_MESSAGE.config.getString("death_message_type", "chat")!!.uppercase()
Expand All @@ -104,14 +107,20 @@ class DeathHandler: Listener {
if (deadPlayer != onlinePlayer) {
if (DEATH_MESSAGE.isPlayerDeathMsgFilterOn(onlinePlayer)) continue
}
if (chatMessageType != null)
onlinePlayer.spigot().sendMessage(chatMessageType, deathMsgComponent)
else {
onlinePlayer.spigot().sendMessage(ChatMessageType.CHAT, deathMsgComponent)
onlinePlayer.spigot().sendMessage(ChatMessageType.ACTION_BAR, deathMsgComponent)
when (chatMessageType) {
ChatMessageType.CHAT, ChatMessageType.SYSTEM -> {
onlinePlayer.sendMessage(deathMsgComponent)
}
ChatMessageType.ACTION_BAR -> {
onlinePlayer.sendActionBar(deathMsgComponent)
}
null -> {
onlinePlayer.sendMessage(deathMsgComponent)
onlinePlayer.sendActionBar(deathMsgComponent)
}
}
}
Bukkit.getConsoleSender().spigot().sendMessage(deathMsgComponent)
Bukkit.getConsoleSender().sendMessage(deathMsgComponent)
entityHurtPlayerMap.remove(deadPlayer.uniqueId)
event.deathMessage = null
}
Expand Down Expand Up @@ -202,91 +211,59 @@ class DeathHandler: Listener {
}
}

private fun getDeadPlayerComponent(deadPlayer: Player, displayNameFormat: String): BaseComponent {
private fun getDeadPlayerComponent(deadPlayer: Player, displayNameFormat: String): Component {
var deadPlayerDisplayName =
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null)
TextProcessor.color(PlaceholderAPI.setPlaceholders(deadPlayer, displayNameFormat))
else
deadPlayer.displayName
deadPlayerDisplayName = TextProcessor.color(deadPlayerDisplayName)
val deadPlayerDisplayCompound: BaseComponent = TextComponent()
for (baseComponent in TextComponent.fromLegacyText(deadPlayerDisplayName)) {
deadPlayerDisplayCompound.addExtra(baseComponent)
}

return deadPlayerDisplayCompound
val deserialize = legacySerializer.deserialize(deadPlayerDisplayName)
deserialize.hoverEvent(deadPlayer.asHoverEvent())
return deserialize
}

private fun getKillerComponent(deadPlayer: Player, displayNameFormat: String): BaseComponent {
return if (deadPlayer.killer != null) {
private fun getKillerComponent(deadPlayer: Player): Component {
val killer = deadPlayer.killer
return if (killer != null) {
//当玩家存在击杀者时,返回击杀者的名字
var killerDisplayNameStr: String = if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) TextProcessor.color(
PlaceholderAPI.setPlaceholders(deadPlayer.killer, displayNameFormat)
) else
deadPlayer.killer!!.displayName
killerDisplayNameStr = TextProcessor.color(killerDisplayNameStr)
val killerDisplayCompound: BaseComponent = TextComponent()
for (baseComponent in TextComponent.fromLegacyText(killerDisplayNameStr)) {
killerDisplayCompound.addExtra(baseComponent)
}
killerDisplayCompound
val displayName = killer.displayName()
displayName.hoverEvent(killer.asHoverEvent())
displayName
} else {
//当不存在击杀者时,尝试获取击杀实体的名字
val lastEntityUuid = entityHurtPlayerMap[deadPlayer.uniqueId]
if (lastEntityUuid == null || Bukkit.getEntity(lastEntityUuid) == null) {
//当不存在击杀实体时,说明玩家可能死于方块爆炸
val bedRespawnPoint = DataManager.getMessage(deadPlayer, "bad.respawn.point")?: "[刻意的游戏设计]"
val bedRespawnDisplayCompound: BaseComponent = TextComponent()
for (baseComponent in TextComponent.fromLegacyText(bedRespawnPoint)) {
bedRespawnDisplayCompound.addExtra(baseComponent)
}
bedRespawnDisplayCompound
legacySerializer.deserialize(bedRespawnPoint)
} else {
//当存在击杀实体时,尝试获取击杀实体
val lastEntity = Bukkit.getEntity(entityHurtPlayerMap[deadPlayer.uniqueId]!!)
if (lastEntity!!.customName != null) {
val customNameDisplayCompound: BaseComponent = TextComponent()
for (baseComponent in TextComponent.fromLegacyText(
lastEntity.customName
)) {
customNameDisplayCompound.addExtra(baseComponent)
}
customNameDisplayCompound
if (lastEntity!!.customName() != null) {
val customName = lastEntity.customName()!!
customName.hoverEvent(lastEntity.asHoverEvent())
customName
} else {
val key = lastEntity.type.translationKey
TranslatableComponent(key)
val key = lastEntity.type.translationKey()
val translatable = Component.translatable(key)
translatable.hoverEvent(lastEntity.asHoverEvent())
translatable
}
}
}
}

private fun getKillItemComponent(deadPlayer: Player): BaseComponent {
var itemName: String
private fun getKillItemComponent(deadPlayer: Player): Component {
val handItem: ItemStack = if (deadPlayer.killer != null) {
deadPlayer.killer!!.inventory.itemInMainHand
} else {
val lastEntity = Bukkit.getEntity(entityHurtPlayerMap[deadPlayer.uniqueId]!!)
(lastEntity as LivingEntity?)!!.equipment!!.itemInMainHand
}
val meta = handItem.itemMeta
itemName = if (meta == null) handItem.type.name else {
if (meta.hasDisplayName()) {
meta.displayName
} else {
meta.localizedName
}
}
val itemNameFormat: String = if (handItem.enchantments.isEmpty()) {
DEATH_MESSAGE.config.getString("item_default_format", "&r[%item_name%&r]")!!
} else {
DEATH_MESSAGE.config.getString("item_enchanted_format", "&b[%item_name%&b]")!!
}
itemName = itemNameFormat.replace("%item_name%", itemName)
itemName = TextProcessor.color(itemName)
val itemDisplayCompound: BaseComponent = TextComponent()
itemDisplayCompound.extra = TextComponent.fromLegacyText(itemName).toMutableList()
// itemDisplayCompound.hoverEvent = ItemFactory.item(handItem).toHover(); //TODO 寻找新的物品转HoverEvent方法
return itemDisplayCompound
val displayName = handItem.displayName()
displayName.hoverEvent(handItem.asHoverEvent())
return displayName
}

@EventHandler
Expand Down

0 comments on commit 70c33c3

Please sign in to comment.