diff --git a/src/main/kotlin/xyz/xasmc/hashbook/HashBook.kt b/src/main/kotlin/xyz/xasmc/hashbook/HashBook.kt index da7d103..ecca930 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/HashBook.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/HashBook.kt @@ -5,7 +5,7 @@ import org.bukkit.plugin.java.JavaPlugin import xyz.xasmc.hashbook.command.HashBookCommand import xyz.xasmc.hashbook.config.ConfigLoader import xyz.xasmc.hashbook.config.PluginConfig -import xyz.xasmc.hashbook.listener.BookshelfListener +import xyz.xasmc.hashbook.listener.MarkListener import xyz.xasmc.hashbook.listener.OpenBookListener import xyz.xasmc.hashbook.service.ItemDataServices import xyz.xasmc.hashbook.service.StorageServices @@ -18,7 +18,7 @@ class HashBook : JavaPlugin() { instance = this this.load() - Bukkit.getPluginManager().registerEvents(BookshelfListener(), this) + Bukkit.getPluginManager().registerEvents(MarkListener(), this) Bukkit.getPluginManager().registerEvents(OpenBookListener(), this) HashBookCommand.create().register(this) } diff --git a/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt b/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt index 8f1748d..7e0f187 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt @@ -5,7 +5,6 @@ import dev.jorel.commandapi.arguments.IntegerArgument import dev.jorel.commandapi.arguments.StringArgument import dev.jorel.commandapi.executors.CommandExecutor import net.kyori.adventure.text.Component -import org.bukkit.Bukkit import org.bukkit.Material import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -17,7 +16,7 @@ import xyz.xasmc.hashbook.service.ItemDataServices import xyz.xasmc.hashbook.service.StorageServices import xyz.xasmc.hashbook.util.BookUtil import xyz.xasmc.hashbook.util.MessageUtil -import xyz.xasmc.hashbook.util.MessageUtil.msgTitle +import xyz.xasmc.hashbook.util.MessageUtil.MSG_TITLE import xyz.xasmc.hashbook.util.MessageUtil.sendMiniMessage import xyz.xasmc.hashbook.util.MessageUtil.shortHashMessage @@ -26,9 +25,9 @@ object HashBookCommand { val reloadCommand = CommandAPICommand("reload") .withPermission("xasmc.hashbook.command.reload") .executes(CommandExecutor { sender, _ -> - sender.sendMiniMessage("$msgTitle 重新加载中") + sender.sendMiniMessage("$MSG_TITLE 重新加载中") HashBook.load() - sender.sendMiniMessage("$msgTitle 重新加载完成") + sender.sendMiniMessage("$MSG_TITLE 重新加载完成") }) val calcHashCommand = CommandAPICommand("calcHash") @@ -39,7 +38,7 @@ object HashBookCommand { val bookMeta = item.itemMeta as BookMeta val hash = BookUtil.generateHash(bookMeta) val shortHashMsg = shortHashMessage(hash) - player.sendMiniMessage("$msgTitle hash: $shortHashMsg") + player.sendMiniMessage("$MSG_TITLE hash: $shortHashMsg") }) val setHashCommand = CommandAPICommand("setHash") @@ -54,9 +53,9 @@ object HashBookCommand { ItemDataServices.setItemData(item, "HashBook.hash", ItemDataServices.DataType.String, newHash) val oldShortHashMsg = shortHashMessage(oldHash) val newShortHashMsg = shortHashMessage(newHash) - player.sendMiniMessage("$msgTitle 已修改成书哈希") - player.sendMiniMessage("$msgTitle old_hash: $oldShortHashMsg") - player.sendMiniMessage("$msgTitle new_hash: $newShortHashMsg") + player.sendMiniMessage("$MSG_TITLE 已修改成书哈希") + player.sendMiniMessage("$MSG_TITLE old_hash: $oldShortHashMsg") + player.sendMiniMessage("$MSG_TITLE new_hash: $newShortHashMsg") }) val getPage = CommandAPICommand("getPage") @@ -68,23 +67,23 @@ object HashBookCommand { val realPage = page - 1 val data = StorageServices.read(hash) ?: run { val shortHashMsg = shortHashMessage(hash) - sender.sendMiniMessage("$msgTitle 未找到成书数据") - sender.sendMiniMessage("$msgTitle hash: $shortHashMsg") + sender.sendMiniMessage("$MSG_TITLE 未找到成书数据") + sender.sendMiniMessage("$MSG_TITLE hash: $shortHashMsg") return@CommandExecutor } val pageList = BookUtil.deserializePages(data) if (pageList.isEmpty()) { - sender.sendMiniMessage("$msgTitle 该成书没有书页") + sender.sendMiniMessage("$MSG_TITLE 该成书没有书页") return@CommandExecutor } if (pageList.size < page || page <= 0) { - sender.sendMiniMessage("$msgTitle 错误的页码") + sender.sendMiniMessage("$MSG_TITLE 错误的页码") return@CommandExecutor } val shortHashMsg = shortHashMessage(hash) val message = Component.text() - .append(MessageUtil.mm.deserialize("$msgTitle Book: $shortHashMsg Page $page\n")) + .append(MessageUtil.mm.deserialize("$MSG_TITLE Book: $shortHashMsg Page $page\n")) .append(pageList[realPage]) sender.sendMessage(message) @@ -99,18 +98,18 @@ object HashBookCommand { val incompleteHash = args["incompleteHash"] as String val searchResult = StorageServices.search(incompleteHash) sender.sendMiniMessage( - if (searchResult.isEmpty()) "$msgTitle 未搜索到结果" - else "$msgTitle 搜索到 ${searchResult.size} 条结果" + if (searchResult.isEmpty()) "$MSG_TITLE 未搜索到结果" + else "$MSG_TITLE 搜索到 ${searchResult.size} 条结果" ) searchResult.forEach { result -> val pageList = BookUtil.deserializePages(result.second) val totalPage = pageList.size val shortHashMsg = shortHashMessage(result.first) sender.sendMiniMessage("========================================") - sender.sendMiniMessage("$msgTitle hash: $shortHashMsg") + sender.sendMiniMessage("$MSG_TITLE hash: $shortHashMsg") sender.sendMessage( Component.text() - .append(MessageUtil.mm.deserialize("$msgTitle content:\n")) + .append(MessageUtil.mm.deserialize("$MSG_TITLE content:\n")) .also { if (totalPage > 0) it.append(pageList.first()) } ) sender.sendMessage(createPageBarMessage(result.first, 0, totalPage)) @@ -123,7 +122,7 @@ object HashBookCommand { val player = checkPlayer(sender) ?: return@CommandExecutor val (item, hand) = checkWrittenBook(player) ?: return@CommandExecutor BookUtil.storeBook(item, player, hand) - player.sendMiniMessage("$msgTitle 完成") + player.sendMiniMessage("$MSG_TITLE 完成") }) val bookInfoCommand = CommandAPICommand("bookInfo") @@ -139,13 +138,13 @@ object HashBookCommand { item, "HashBook.Hash", ItemDataServices.DataType.String ) ?: "" - Bukkit.getLogger().info(hash.javaClass.name) + HashBook.instance.logger.info(hash.javaClass.name) val shortHashMsg = shortHashMessage(hash) - player.sendMiniMessage("$msgTitle HashBook Book Info") - player.sendMiniMessage("$msgTitle title: $title") - player.sendMiniMessage("$msgTitle author: $author") - player.sendMiniMessage("$msgTitle hash: $shortHashMsg") + player.sendMiniMessage("$MSG_TITLE HashBook Book Info") + player.sendMiniMessage("$MSG_TITLE title: $title") + player.sendMiniMessage("$MSG_TITLE author: $author") + player.sendMiniMessage("$MSG_TITLE hash: $shortHashMsg") }) val command = CommandAPICommand("hashbook") @@ -160,12 +159,12 @@ object HashBookCommand { bookInfoCommand ) .executes(CommandExecutor { sender, _ -> - sender.sendMiniMessage("$msgTitle HashBook is Running!") - sender.sendMiniMessage("$msgTitle debug: ${HashBook.config.debug}") - sender.sendMiniMessage("$msgTitle storage_mode: ${HashBook.config.storageMode}") - sender.sendMiniMessage("$msgTitle item_data_mode: ${HashBook.config.itemDataMode}") - sender.sendMiniMessage("$msgTitle set_lore: ${HashBook.config.setLore}") - sender.sendMiniMessage("$msgTitle lore_content: ${HashBook.config.loreContent}") + sender.sendMiniMessage("$MSG_TITLE HashBook is Running!") + sender.sendMiniMessage("$MSG_TITLE debug: ${HashBook.config.debug}") + sender.sendMiniMessage("$MSG_TITLE storage_mode: ${HashBook.config.storageMode}") + sender.sendMiniMessage("$MSG_TITLE item_data_mode: ${HashBook.config.itemDataMode}") + sender.sendMiniMessage("$MSG_TITLE set_lore: ${HashBook.config.setLore}") + sender.sendMiniMessage("$MSG_TITLE lore_content: ${HashBook.config.loreContent}") }) return command diff --git a/src/main/kotlin/xyz/xasmc/hashbook/listener/BookshelfListener.kt b/src/main/kotlin/xyz/xasmc/hashbook/listener/MarkListener.kt similarity index 59% rename from src/main/kotlin/xyz/xasmc/hashbook/listener/BookshelfListener.kt rename to src/main/kotlin/xyz/xasmc/hashbook/listener/MarkListener.kt index f22d28c..d985b10 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/listener/BookshelfListener.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/listener/MarkListener.kt @@ -1,24 +1,25 @@ package xyz.xasmc.hashbook.listener import org.bukkit.Material +import org.bukkit.block.Block import org.bukkit.block.ChiseledBookshelf +import org.bukkit.block.Lectern +import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerMoveEvent import org.bukkit.event.player.PlayerQuitEvent -import org.bukkit.inventory.meta.BookMeta -import org.bukkit.inventory.meta.EnchantmentStorageMeta -import xyz.xasmc.hashbook.util.I18nUtil +import org.bukkit.util.Vector +import xyz.xasmc.hashbook.util.BookUtil import xyz.xasmc.hashbook.util.MarkUtil -class BookshelfListener : Listener { +class MarkListener : Listener { @EventHandler - fun onPlayerMode(event: PlayerMoveEvent) { + fun onPlayerMove(event: PlayerMoveEvent) { val player = event.player - val world = player.world val direction = player.eyeLocation.direction val maxDistance = 4.0 val result = player.world.rayTraceBlocks(player.eyeLocation, direction, maxDistance) @@ -32,10 +33,16 @@ class BookshelfListener : Listener { return } val hitPosition = result.hitPosition - if (hitBlock.type != Material.CHISELED_BOOKSHELF) { - MarkUtil.removeMark(player) - return + when (hitBlock.type) { + Material.CHISELED_BOOKSHELF -> updateChiseledBookshelfMark(hitBlock, hitPosition, player) + Material.LECTERN -> updateLecternMark(hitBlock, player) + + else -> MarkUtil.removeMark(player) } + } + + private fun updateChiseledBookshelfMark(hitBlock: Block, hitPosition: Vector, player: Player) { + val world = player.world val bookshelf = hitBlock.state as ChiseledBookshelf val blockHitPosition = hitPosition.clone().subtract(hitBlock.location.toVector()) val item = bookshelf.inventory.getItem(bookshelf.getSlot(blockHitPosition)) @@ -45,25 +52,23 @@ class BookshelfListener : Listener { } val normalizedEyeDirection = player.eyeLocation.direction.clone().normalize() val markLocation = hitPosition.clone().subtract(normalizedEyeDirection.multiply(0.1)) - val nameSb = StringBuilder(I18nUtil.translate(item.type)) - when (item.type) { - Material.WRITTEN_BOOK -> { - val meta = item.itemMeta as BookMeta - nameSb.append("\n").append(meta.title) - nameSb.append("\n").append(I18nUtil.getTranslate("book.byAuthor").format(meta.author)) - nameSb.append("\n").append(I18nUtil.translate(meta.generation)) - } - - Material.ENCHANTED_BOOK -> { - val meta = item.itemMeta as EnchantmentStorageMeta - meta.storedEnchants.forEach { - nameSb.append("\n").append(I18nUtil.translate(it.key, it.value)) - } - } + val abstract = BookUtil.getAbstract(item) + MarkUtil.updateMark(player, markLocation.toLocation(world), abstract) + } - else -> {} + private fun updateLecternMark(hitBlock: Block, player: Player) { + val lectern = hitBlock.state as Lectern + val item = lectern.inventory.getItem(0) + if (item == null) { + MarkUtil.removeMark(player) + return } - MarkUtil.updateMark(player, markLocation.toLocation(world), nameSb.toString()) + val markLocation = hitBlock.location.clone() + markLocation.x += 0.5 + markLocation.y += 1.5 + markLocation.z += 0.5 + val abstract = BookUtil.getAbstract(item) + MarkUtil.updateMark(player, markLocation, abstract) } @EventHandler diff --git a/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt b/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt index 3989206..2a70a76 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt @@ -1,17 +1,19 @@ package xyz.xasmc.hashbook.util import net.kyori.adventure.text.Component +import org.bukkit.Material import org.bukkit.entity.Player import org.bukkit.inventory.EquipmentSlot import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.BookMeta +import org.bukkit.inventory.meta.EnchantmentStorageMeta import org.json.simple.JSONArray import org.json.simple.parser.JSONParser import xyz.xasmc.hashbook.HashBook import xyz.xasmc.hashbook.service.ItemDataServices import xyz.xasmc.hashbook.service.StorageServices import xyz.xasmc.hashbook.util.MessageUtil.debugMiniMessage -import xyz.xasmc.hashbook.util.MessageUtil.msgTitle +import xyz.xasmc.hashbook.util.MessageUtil.MSG_TITLE import xyz.xasmc.hashbook.util.MessageUtil.sendMiniMessage import xyz.xasmc.hashbook.util.MessageUtil.shortHashMessage import java.util.* @@ -68,17 +70,17 @@ object BookUtil { } val serialized = serializePages(bookMeta.pages()) - val hash = HashUtil.HashString(serialized) + val hash = HashUtil.hashString(serialized) StorageServices.save(hash, serialized) val shortHashMsg = shortHashMessage(hash) - player.debugMiniMessage("$msgTitle [debug]已存储成书书页") - player.debugMiniMessage("$msgTitle [debug]hash: $shortHashMsg") - player.debugMiniMessage("$msgTitle [debug]meta: $bookMeta") + player.debugMiniMessage("$MSG_TITLE [debug]已存储成书书页") + player.debugMiniMessage("$MSG_TITLE [debug]hash: $shortHashMsg") + player.debugMiniMessage("$MSG_TITLE [debug]meta: $bookMeta") newItem = ItemDataServices.setItemData( newItem, "HashBook.Hash", ItemDataServices.DataType.String, hash ) ?: run { - player.sendMiniMessage("$msgTitle [warn] 写入哈希失败") + player.sendMiniMessage("$MSG_TITLE [warn] 写入哈希失败") return false } setHash = true @@ -88,16 +90,38 @@ object BookUtil { EquipmentSlot.HAND -> player.inventory.setItemInMainHand(newItem) EquipmentSlot.OFF_HAND -> player.inventory.setItemInOffHand(newItem) else -> return run { - player.sendMiniMessage("$msgTitle [warn] 错误的装备槽") + player.sendMiniMessage("$MSG_TITLE [warn] 错误的装备槽") false } } when (Pair(cleanedPages, setHash)) { - Pair(true, true) -> player.sendMiniMessage("$msgTitle 已清除书页并记录哈希值") - Pair(false, true) -> player.sendMiniMessage("$msgTitle 已记录哈希值") - Pair(true, false) -> player.sendMiniMessage("$msgTitle 已清除书页") + Pair(true, true) -> player.sendMiniMessage("$MSG_TITLE 已清除书页并记录哈希值") + Pair(false, true) -> player.sendMiniMessage("$MSG_TITLE 已记录哈希值") + Pair(true, false) -> player.sendMiniMessage("$MSG_TITLE 已清除书页") } return true } + + fun getAbstract(item: ItemStack): String { + val nameSb = StringBuilder(I18nUtil.translate(item.type)) + when (item.type) { + Material.WRITTEN_BOOK -> { + val meta = item.itemMeta as BookMeta + nameSb.append("\n").append(meta.title) + nameSb.append("\n").append(I18nUtil.getTranslate("book.byAuthor").format(meta.author)) + nameSb.append("\n").append(I18nUtil.translate(meta.generation)) + } + + Material.ENCHANTED_BOOK -> { + val meta = item.itemMeta as EnchantmentStorageMeta + meta.storedEnchants.forEach { + nameSb.append("\n").append(I18nUtil.translate(it.key, it.value)) + } + } + + else -> {} + } + return nameSb.toString() + } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/xasmc/hashbook/util/HashUtil.kt b/src/main/kotlin/xyz/xasmc/hashbook/util/HashUtil.kt index a111643..4c9c0a7 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/util/HashUtil.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/util/HashUtil.kt @@ -6,7 +6,7 @@ object HashUtil { val md = MessageDigest.getInstance("SHA-256") @OptIn(ExperimentalStdlibApi::class) - fun HashString(str: String): String { + fun hashString(str: String): String { return md.digest(str.toByteArray()).toHexString() } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt b/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt index a5eed7b..679d08b 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt @@ -8,7 +8,7 @@ import org.bukkit.entity.Player import xyz.xasmc.hashbook.HashBook object MessageUtil { - val msgTitle = "[HashBook]" + const val MSG_TITLE = "[HashBook]" val mm = MiniMessage.miniMessage() fun copyMsg(message: String, copy: String, hover: String? = null): String {