Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

改进 #520

Merged
merged 4 commits into from
Dec 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,11 @@ class NMSEntityImpl : NMSEntity() {
/**
* 是否支持 Translatable
*/
val isTranslatableSupported = runCatching { Translatable::class.java }.isSuccess
val isTranslatableSupported by lazy {
if (MinecraftVersion.versionId >= 11903) {
runCatching { Class.forName("org.bukkit.Translatable") }.isSuccess
} else false
}

/**
* 1.19.3, 1.20 -> BuiltInRegistries.VILLAGER_PROFESSION
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.bukkit.enchantments.Enchantment
import org.bukkit.entity.Entity
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.material.MaterialData
import org.bukkit.potion.PotionEffectType
import org.tabooproject.reflex.Reflex.Companion.getProperty
import org.tabooproject.reflex.Reflex.Companion.invokeMethod
Expand All @@ -16,6 +17,11 @@ import taboolib.module.nms.legacy.NMSPotionEffect
import taboolib.platform.util.buildItem
import java.lang.reflect.Method

/**
* 缓存材质,实体,附魔,药水效果原版名
*/
private val translate: HashMap<String, String> = HashMap()

/**
* 获取物品的名称(若存在 displayName 则返回 displayName,反之获取译名)
*/
Expand All @@ -25,48 +31,64 @@ fun ItemStack.getName(player: Player? = null): String {

/**
* 获取 Material 的译名
* 1.12-版本不建议使用
*/
fun Material.getI18nName(player: Player? = null): String {
return buildItem(this).getI18nName(player)
val name = if (MinecraftVersion.isLowerOrEqual(MinecraftVersion.V1_12)) name + "_${MaterialData(this).data}" else name
return translate[name] ?: buildItem(this).getI18nName(player)
}

/**
* 获取 XMaterial 的译名
*/
fun XMaterial.getI18nName(player: Player? = null): String {
return buildItem(this).getI18nName(player)
return translate[name] ?: parseItem()?.getI18nName(player) ?: "NO_ITEM"
}

/**
* 获取物品的译名
*/
fun ItemStack.getI18nName(player: Player? = null): String {
val file = player?.getMinecraftLanguageFile() ?: MinecraftLanguage.getDefaultLanguageFile() ?: return "NO_LOCALE"
return file[getLanguageKey()] ?: getLanguageKey().path
val name = if (MinecraftVersion.isLowerOrEqual(MinecraftVersion.V1_12)) type.name + "_${data?.data ?: 0}" else type.name
return translate[name] ?: let {
val value = file[getLanguageKey()] ?: getLanguageKey().path
translate[name] = value
value
}
}

/**
* 获取实体的译名
*/
fun Entity.getI18nName(player: Player? = null): String {
val file = player?.getMinecraftLanguageFile() ?: MinecraftLanguage.getDefaultLanguageFile() ?: return "NO_LOCALE"
return file[getLanguageKey()] ?: getLanguageKey().path
return translate[name] ?: (player?.getMinecraftLanguageFile() ?: MinecraftLanguage.getDefaultLanguageFile())?.let {
val value = it[getLanguageKey()] ?: getLanguageKey().path
translate[name] = value
value
} ?: "NO_LOCALE"
}

/**
* 获取附魔的译名
*/
fun Enchantment.getI18nName(player: Player? = null): String {
val file = player?.getMinecraftLanguageFile() ?: MinecraftLanguage.getDefaultLanguageFile() ?: return "NO_LOCALE"
return file[getLanguageKey()] ?: getLanguageKey().path
return translate[name] ?: (player?.getMinecraftLanguageFile() ?: MinecraftLanguage.getDefaultLanguageFile())?.let {
val value = it[getLanguageKey()] ?: getLanguageKey().path
translate[name] = value
value
} ?: "NO_LOCALE"
}

/**
* 获取药水效果的译名
*/
fun PotionEffectType.getI18nName(player: Player? = null): String {
val file = player?.getMinecraftLanguageFile() ?: MinecraftLanguage.getDefaultLanguageFile() ?: return "NO_LOCALE"
return file[getLanguageKey()] ?: getLanguageKey().path
return translate[name] ?: (player?.getMinecraftLanguageFile() ?: MinecraftLanguage.getDefaultLanguageFile())?.let {
val value = it[getLanguageKey()] ?: getLanguageKey().path
translate[name] = value
value
} ?: "NO_LOCALE"
}

/**
Expand Down