From 5e314224782bdcfb38d37549c360288f8fb09050 Mon Sep 17 00:00:00 2001 From: ankokun Date: Sun, 29 Mar 2026 20:54:43 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A4=A7=E5=B9=85=E3=81=AA=E3=82=AF?= =?UTF-8?q?=E3=83=A9=E3=82=B9=E3=81=AE=E5=89=8A=E9=99=A4=E3=81=A8=E3=82=B3?= =?UTF-8?q?=E3=83=9E=E3=83=B3=E3=83=89=E3=81=AE=E3=81=BE=E3=81=A8=E3=82=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/ankokunsan/entityPose/ChooseGUi.kt | 197 ++++++++- .../me/ankokunsan/entityPose/EntityClick.kt | 64 +-- .../ankokunsan/entityPose/EntityCommands.kt | 375 ++++++++++++++++++ .../me/ankokunsan/entityPose/EntityPose.kt | 23 +- .../me/ankokunsan/entityPose/FollowEntity.kt | 19 +- .../me/ankokunsan/entityPose/GUIClick.kt | 5 +- .../entityPose/commands/Boucommand.kt | 31 -- .../entityPose/commands/EntityCopy.kt | 10 +- .../entityPose/commands/EntityCut.kt | 42 -- .../entityPose/commands/EntityHojo.kt | 60 --- .../entityPose/commands/EntityPaste.kt | 10 +- .../entityPose/commands/EntityScale.kt | 77 ---- .../entityPose/commands/EntityWand.kt | 61 --- .../entityPose/commands/Entityinfo.kt | 367 ----------------- .../entityPose/commands/KakudoCommand.kt | 42 -- .../entityPose/commands/SetumeiCommand.kt | 45 --- .../entityPose/commands/ZahyoCommand.kt | 43 -- .../EntityPose/src/main/resources/plugin.yml | 56 +-- 18 files changed, 622 insertions(+), 905 deletions(-) create mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Boucommand.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCut.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityHojo.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityScale.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityWand.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Entityinfo.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/KakudoCommand.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/SetumeiCommand.kt delete mode 100644 plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/ZahyoCommand.kt diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt index 1399b553..e91a901f 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt @@ -6,10 +6,17 @@ import me.ankokunsan.entityPose.EntityPose.Companion.SIZE_KEY import me.ankokunsan.entityPose.EntityPose.Companion.ZAHYO_KEY import org.bukkit.Bukkit import org.bukkit.ChatColor +import org.bukkit.Color import org.bukkit.Material import org.bukkit.Sound +import org.bukkit.attribute.Attribute +import org.bukkit.entity.ArmorStand +import org.bukkit.entity.Entity +import org.bukkit.entity.LivingEntity import org.bukkit.entity.Player +import org.bukkit.entity.Tameable import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.PotionMeta import org.bukkit.persistence.PersistentDataType object ChooseGUi { @@ -153,13 +160,187 @@ object ChooseGUi { player.playSound(player, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) } - private fun getFiller1(): ItemStack { - return ItemStack(Material.LIGHT_GRAY_STAINED_GLASS_PANE).apply { - itemMeta = - itemMeta?.apply { - setDisplayName(" ") - persistentDataContainer.set(GUI_KEY, PersistentDataType.STRING, "FILLER") - } + fun openSettingGUI(player: Player, target: Entity) { + val invs = Bukkit.createInventory(null, 9, "§3エンティティの設定変更") + val living = target as? LivingEntity + + val damageItem = ItemStack(Material.DIAMOND_SWORD).apply { + val meta = itemMeta ?: return@apply + val hasKey= target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE) + val status = if (hasKey) "§aON" else "§cOFF" + meta.setDisplayName("§fダメージ無効: $status") + itemMeta = meta + } + val scaleItem1 = ItemStack(Material.POTION).apply { // LEGACYを消す + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + val scale = living?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + meta.setDisplayName("§fサイズ設定(大きくするほう): $scale") + itemMeta = meta + } + val scaleItem2 = ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + val scale = living?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + meta.setDisplayName("§fサイズ設定(小さくするほう): $scale") + itemMeta = meta + } + val invisibleItem = ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.fromRGB(127, 131, 146) + val status = living?.let { if (it.isInvisible) "§aON" else "§cOFF" } + meta.setDisplayName("§f透明: $status") + itemMeta = meta + } + val lockitem = ItemStack(Material.TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val hasKey= target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE) + val lockarrange = if (hasKey) "§aON" else "§cOFF" + meta.setDisplayName("§fアレンジのロック: $lockarrange") + itemMeta = meta + } + if (target is Tameable) { + val tameItem = ItemStack(Material.BONE).apply { + val meta = itemMeta ?: return@apply + val status = if (target.isTamed) "§aON" else "§cOFF" + meta.setDisplayName("§f懐き状態: $status") + itemMeta = meta + } + invs.setItem(1, tameItem) + + } else if (target is ArmorStand) { + val baseItem = ItemStack(Material.SMOOTH_STONE_SLAB).apply { + val meta = itemMeta ?: return@apply + val status = if (target.hasBasePlate()) "§aON" else "§cOFF" + meta.setDisplayName("§f底のプレート表示: $status") + itemMeta = meta + } + val gravityItem = ItemStack(Material.ANVIL).apply { + val meta = itemMeta ?: return@apply + val status = if (target.hasGravity()) "§aON" else "§cOFF" + meta.setDisplayName("§f重力: $status") + itemMeta = meta + } + val itemlockItem = ItemStack(Material.OMINOUS_TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val hasKey= target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) + val status = if (hasKey) "§aON" else "§cOFF" + meta.setDisplayName("§fアイテムのロック: $status") + itemMeta = meta + } + invs.setItem(1, gravityItem) + invs.setItem(2, baseItem) + invs.setItem(3,itemlockItem) + } + invs.setItem(0, damageItem) + invs.setItem(5, invisibleItem) + invs.setItem(6,scaleItem1) + invs.setItem(7,scaleItem2) + invs.setItem(8,lockitem) + + val filler = getFiller1() + for (i in 0 until invs.size) { + if (invs.getItem(i) == null) invs.setItem(i, filler) + } + player.openInventory(invs) + } + fun openAllSettingGUI(player: Player,targets: List) { + val invs = Bukkit.createInventory(null, 9, "§3範囲選択済みエンティティの設定変更") + + val damageItem = ItemStack(Material.DIAMOND_SWORD).apply { + val meta = itemMeta ?: return@apply + val count = targets.count { it.persistentDataContainer.has(EntityPose.INVINCIBLE , PersistentDataType.BYTE) } + meta.setDisplayName("§fダメージ無効 ${count}/${targets.size}体ON") + itemMeta = meta + } + val scaleItem1 = ItemStack(Material.POTION).apply { // LEGACYを消す + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + meta.setDisplayName("§fスケール設定(大きくするほう)") + val lorelist = mutableListOf() + lorelist.add("§7----- 現在のスケール一覧 -----") + targets.take(10).forEach { target -> + val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + val typeName = target.type.name + lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") + } + if (targets.size > 10) { + lorelist.add("§8...ほか ${targets.size - 10}体") + } + meta.lore = lorelist + itemMeta = meta + } + val scaleItem2 = ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + meta.setDisplayName("§fスケール設定(小さくするほう)") + val lorelist = mutableListOf() + lorelist.add("§7----- 現在のスケール一覧 -----") + targets.take(10).forEach { target -> + val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + val typeName = target.type.name + lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") + } + if (targets.size > 10) { + lorelist.add("§8...ほか ${targets.size - 10}体") + } + meta.lore = lorelist + itemMeta = meta + } + val invisibleItem = ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.fromRGB(127, 131, 146) + val count = targets.filterIsInstance().count { it.isInvisible } + meta.setDisplayName("§f透明: ${count}/${targets.size}体ON") + itemMeta = meta + } + val lockitem = ItemStack(Material.TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val count = targets.count { it.persistentDataContainer.has(EntityPose.ARRANGELOCK , PersistentDataType.BYTE)} + meta.setDisplayName("§fアレンジのロック ${count}/${targets.size}体ON") + itemMeta = meta + } + + if (targets.all{it is ArmorStand}) { + val baseItem = ItemStack(Material.SMOOTH_STONE_SLAB).apply { + val meta = itemMeta ?: return@apply + val count = targets.filterIsInstance().count { it.hasBasePlate()} + meta.setDisplayName("§f底のプレート表示: ${count}/${targets.size}体ON") + itemMeta = meta + } + val gravityItem = ItemStack(Material.ANVIL).apply { + val meta = itemMeta ?: return@apply + val count = targets.count { it.hasGravity()} + meta.setDisplayName("§f重力: ${count}/${targets.size}体ON") + itemMeta = meta + } + val itemlockItem = ItemStack(Material.OMINOUS_TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val count = targets.count{ it.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) } + meta.setDisplayName("§fアイテムのロック: ${count}/${targets.size}体ON") + itemMeta = meta + } + invs.setItem(1, gravityItem) + invs.setItem(2, baseItem) + invs.setItem(3,itemlockItem) + } + invs.setItem(0,damageItem) + invs.setItem(5,invisibleItem) + invs.setItem(6,scaleItem1) + invs.setItem(7,scaleItem2) + invs.setItem(8,lockitem) + val filler = getFiller1() + for (i in 0 until invs.size) { + if (invs.getItem(i) == null) invs.setItem(i, filler) + } + player.openInventory(invs) + } + private fun getFiller1(): ItemStack { + return ItemStack(Material.LIGHT_GRAY_STAINED_GLASS_PANE).apply { + itemMeta = itemMeta?.apply { + setDisplayName(" ") + persistentDataContainer.set(GUI_KEY, PersistentDataType.STRING, "FILLER") + } + } } - } } diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt index 16814140..48600127 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt @@ -2,7 +2,6 @@ package me.ankokunsan.entityPose import java.util.UUID import kotlin.collections.filter -import kotlin.math.roundToInt import me.ankokunsan.entityPose.EntityCopyClick.Companion.activeselection import me.ankokunsan.entityPose.EntityCopyClick.Companion.selection import me.ankokunsan.entityPose.EntityPose.Companion.CAT_KEY @@ -15,7 +14,6 @@ import net.md_5.bungee.api.ChatMessageType import net.md_5.bungee.api.chat.TextComponent import org.bukkit.Bukkit import org.bukkit.ChatColor -import org.bukkit.Location import org.bukkit.Material import org.bukkit.Sound import org.bukkit.entity.ArmorStand @@ -29,6 +27,7 @@ import org.bukkit.event.block.Action import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.player.PlayerArmorStandManipulateEvent +import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerInteractAtEntityEvent import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.event.player.PlayerItemHeldEvent @@ -124,14 +123,43 @@ class EntityClick : Listener { } } - @EventHandler - fun onLeftClickBlock(event: PlayerInteractEvent) { - val player = event.player - val hand = player.inventory.itemInMainHand - if (!isEntiStick(hand)) return - if (!player.hasPermission("entitypose_arrange")) return // - if (event.action != Action.LEFT_CLICK_BLOCK) return - if (event.clickedBlock == null) return + @EventHandler + fun onDropEvent(event : PlayerDropItemEvent) { + val player = event.player + val item = event.itemDrop.itemStack + if(!isEntiStick(item)) return + if(!player.hasPermission("entitypose_arrange")) return + if(!player.isSneaking) return + event.isCancelled = true + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { it != player } + val target = result?.hitEntity ?: return + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") + return + } + if (target is LivingEntity && target.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのモブはAIが有効です") + return + } + val selected = activeselection[player.uniqueId] + if (selected != null && selected.contains(target)) { + val targets = selected.filter { it.isValid } + ChooseGUi.openAllSettingGUI(player, targets) + } else { + ChooseGUi.openSettingGUI(player, target) + return + } + } + + @EventHandler + fun onLeftClickBlock(event: PlayerInteractEvent) { + val player = event.player + val hand = player.inventory.itemInMainHand + if (!isEntiStick(hand)) return + if (!player.hasPermission("entitypose_arrange")) return // + if (event.action != Action.LEFT_CLICK_BLOCK) return + if (event.clickedBlock == null) return event.isCancelled = true player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) @@ -597,22 +625,6 @@ class EntityClick : Listener { // 叩いた対象が、今追従させているものと一致する場合のみ実行 if (currentPreview != entity) return event.isCancelled = true - - val loc = entity.location - val directionToPlayer = player.eyeLocation.toVector().subtract(loc.toVector()) - val lookAtYaw = loc.clone().setDirection(directionToPlayer).yaw - val snappedYaw = ((lookAtYaw / 45.0).roundToInt() * 45.0).toFloat() - - val gridLoc = - Location( - loc.world, - loc.blockX + 0.5, // X軸の真ん中 - loc.blockY.toDouble(), // 高さはそのまま(空中可) - loc.blockZ + 0.5, // Z軸の真ん中 - snappedYaw, - 0f // 垂直に向かせる - ) - entity.teleport(gridLoc) entity.setGravity(false) player.sendMessage("§6[EntityPose] §aエンティティを固定しました!") diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt new file mode 100644 index 00000000..888d552e --- /dev/null +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt @@ -0,0 +1,375 @@ +package me.ankokunsan.entityPose + +import me.ankokunsan.entityPose.EntityCopyClick.Companion.activeselection +import me.ankokunsan.entityPose.EntityCopyClick.Companion.selection +import me.ankokunsan.entityPose.commands.EntityCopy +import me.ankokunsan.entityPose.commands.EntityPaste +import org.bukkit.Sound +import org.bukkit.attribute.Attribute +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter +import org.bukkit.entity.ArmorStand +import org.bukkit.entity.ExperienceOrb +import org.bukkit.entity.LivingEntity +import org.bukkit.entity.Player +import org.bukkit.persistence.PersistentDataType +import org.bukkit.util.EulerAngle +import kotlin.math.round + +class EntityCommands : CommandExecutor , TabCompleter { + override fun onCommand( + sender: CommandSender, + command: Command, + label: String, + args: Array + ): Boolean { + val player = + sender as? Player + ?: run { + return true + } + if (!player.hasPermission("entitypose_arrange")) { + player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") + return true + } + if (args.isEmpty()) { + player.sendMessage("§6---[EntityPose]§bコマンド、操作一覧§6---") + player.sendMessage("§l/ep stick/st §rエンティティ棒を手に入れる") + player.sendMessage("エンティティ棒 §rデバック棒に類似") + player.sendMessage("§l/ep kakudo/ka (0.5~90.0) §rエンティティの角度の刻みを変更(数字なしでGUI)") + player.sendMessage("§l/ep zahyo/za (0.01~2.0) §rエンティティの一回あたりに動く座標の大きさを変更(数字なしでGUI)") + player.sendMessage("/ep kakudoはオフハント持ち替え゙、+しゃがみで/ep zahyoのGUIを開ける") + player.sendMessage("§b-------------------------------------") + player.sendMessage("§l/ep wand/wa §rEntity Copy Wandを手に入れる") + player.sendMessage("§lEntity Copy Wand §rWEのエンティティを選択するver(当たり判定難)") + player.sendMessage("§l/ep clear/cl §r範囲選択解除 pos1,2も解除(オフハンド持ち替えでも可)") + player.sendMessage("§l/ep copy/co §r範囲選択したエンティティをコピー") + player.sendMessage("§l/ep paste/pa §rコピーしたエンティティをペースト") + player.sendMessage("§l/ep cut/cu §r範囲選択したエンティティを削除") + player.sendMessage("§l/ep info/in §rエンティティの情報をチャット欄に表示") + player.sendMessage("§l/ep infoset/ins §rエンティティの情報を変更するGUIを開く(範囲選択で同時設定可)") + player.sendMessage("§l/ep scale/sc (0.3~3.0) §rエンティティの大きさ変更(範囲選択で同時設定可)") + player.sendMessage("範囲選択で[全体],[X,Y,Z座標]を同時に動かせる") + player.sendMessage("§b-----------------おまけ-----------------") + player.sendMessage("§l/ep hojo/ho on/off §r空中作業のときに足場を出すか否か §c※本当に周りにブロックがない時だけにしてね") + return true + } + when (args[0].lowercase()) { + "stick", "st" -> boucommand(player) + "wand", "wa" -> entityWand(player) + "info", "in" -> entityinfo(player) + "infoset","ins" -> entityinfoset(player) + "scale", "sc" -> entityScale(player, args) + "kakudo", "ka" -> kakudoCommand(player, args) + "zahyo", "za" -> zahyoCommand(player, args) + "copy", "co" -> return EntityCopy().onCommand(sender, command, label, args) + "paste", "pa" -> return EntityPaste().onCommand(sender, command, label, args) + "cut", "cu" -> entityCut(player) + "clear", "cl" -> entityclear(player) + "hojo", "ho" -> entityHojo(player, args) + else -> player.sendMessage("§6[EntityPose] §c不明なコマンドです") + } + return true + } + + private fun boucommand(player: Player) { + player.inventory.addItem(Bou.create()) + player.sendMessage("§6[EntityPose] §aエンティティ棒を手に入れました!") + } + + private fun entityWand(player: Player) { + player.inventory.addItem(CopyWand.create1()) + player.sendMessage("§6[EntityPose] §aEntity Copy Wandを手に入れました!") + } + + private fun entityinfo(player: Player) { + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { + it != player + } + val target = result?.hitEntity + if (target == null) { + player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") + return + } + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") + return + } + if (target is LivingEntity && target.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") + return + } + val loc = target.location + val yaw = (loc.yaw % 360 + 360) % 360 + val invincible = + if (target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE)) + "§aON" + else "§cOFF" + val arrangelock = + if (target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE)) + "§aON" + else "§cOFF" + val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + + if (target is ArmorStand) { + val head = target.headPose + val body = target.bodyPose + val leftArm = target.leftArmPose + val rightArm = target.rightArmPose + val leftLeg = target.leftLegPose + val rightLeg = target.rightLegPose + val gravity = if (target.hasGravity()) "§aON" else "§cOFF" + val basePlate = if (target.hasBasePlate()) "§aON" else "§cOFF" + val invisible = if (target.isInvisible) "§aON" else "§cOFF" + val itemlock = + if (target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE)) + "§aON" + else "§cOFF" + + player.sendMessage("§6---[EntityPose]§bArmorStandの情報§6---") + player.sendMessage("頭: §e${formatDeg1(head)}") + player.sendMessage("上半身: §e${formatDeg1(body)}") + player.sendMessage("左腕: §e${formatDeg1(leftArm)}") + player.sendMessage("右腕: §e${formatDeg1(rightArm)}") + player.sendMessage("左足: §e${formatDeg1(leftLeg)}") + player.sendMessage("右足: §e${formatDeg1(rightLeg)}") + player.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") + player.sendMessage( + "座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}" + ) + player.sendMessage("ダメージ無効: $invincible") + player.sendMessage("重力: $gravity") + player.sendMessage("底のプレート: $basePlate") + player.sendMessage("透明: $invisible") + player.sendMessage("スケール: $scale") + player.sendMessage("アイテムのロック: $itemlock") + player.sendMessage("アレンジのロック: $arrangelock") + } else { + val pitch = loc.pitch + player.sendMessage("§6---[EntityPose]§b${target.type.name} の情報§6---") + player.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") + player.sendMessage("頭の向き: §e${String.format("%.1f", pitch)}°") + player.sendMessage( + "座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}" + ) + player.sendMessage("ダメージ無効: $invincible") + player.sendMessage("スケール: $scale") + player.sendMessage("アレンジのロック: $arrangelock") + } + return + } + + private fun entityinfoset(player: Player) { + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { + it != player + } + val target = result?.hitEntity + if (target == null) { + player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") + return + } + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") + return + } + if (target is LivingEntity && target.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") + return + } + val selected = activeselection[player.uniqueId] + if (selected != null && selected.contains(target)) { + val targets = selected.filter { it.isValid } + ChooseGUi.openAllSettingGUI(player, targets) + } else { + ChooseGUi.openSettingGUI(player, target) + return + } + } + + private fun entityScale(player: Player, args: Array) { + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { + it != player && it !is ExperienceOrb + } + val target = result?.hitEntity + if (target == null) { + player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") + return + } + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーをいじろうとしないでね") + return + } + val livingEntity = target as? LivingEntity ?: return + if (livingEntity.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") + return + } + if (args.size < 2) { + player.sendMessage("§6[EntityPose] §c数字を入力してください") + return + } + val scale = args[1].toDoubleOrNull() + if (scale == null) { + player.sendMessage("§6[EntityPose] §c数字を入力してください") + return + } + val limitedScale = scale.coerceIn(0.3, 3.0) + val roundedScale = round(limitedScale * 10) / 10.0 + val selected = activeselection[player.uniqueId] + if (selected != null && selected.contains(target)) { + val targets = selected.filter { it.isValid } + targets.forEach { entity -> + (entity as? LivingEntity)?.getAttribute(Attribute.SCALE)?.let { attribute -> + attribute.baseValue = roundedScale + } + } + player.sendMessage("§6[EntityPose] §a範囲選択されているエンティティのスケールを $roundedScale に設定しました") + } else { + val attribute = livingEntity.getAttribute(Attribute.SCALE) + if (attribute != null) { + attribute.baseValue = roundedScale + player.sendMessage("§6[EntityPose] §a視線の先にあるエンティティのスケールを $roundedScale に設定しました") + } + } + } + + private fun kakudoCommand(player: Player, args: Array) { + if (args.size == 1) { + ChooseGUi.openKakudoGUI(player) + player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) + return + } + val value = args[1].toDoubleOrNull() + if (value != null) { + val limitedValue = value.coerceIn(0.5, 90.0) + EntityClick.currentStep[player.uniqueId] = limitedValue + player.sendMessage("§6[EntityPose] §aエンティティの角度の刻みを${limitedValue}度に設定しました") + } else { + player.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epkakudoとだけ打ってGUIを開いてください") + } + } + + private fun zahyoCommand(player: Player, args: Array) { + if (args.size == 1) { + ChooseGUi.openZahyoGUI(player) + player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) + return + } + val value1 = args[1].toDoubleOrNull() + if (value1 != null) { + val limitedValue1 = value1.coerceIn(0.01, 2.0) + EntityClick.currentZah[player.uniqueId] = limitedValue1 + player.sendMessage("§6[EntityPose] §aエンティティの一回あたりに動く座標の大きさを${limitedValue1}マスに設定しました") + } else { + player.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epzahyoとだけ打ってGUIを開いてください") + } + } + + private fun entityCut(player: Player) { + val uuid = player.uniqueId + val targets = activeselection[uuid]?.filter { it.isValid } + + if (targets == null) { + player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") + return + } + targets.forEach { entity -> if (entity.isValid) entity.remove() } + activeselection.remove(uuid) + selection.remove(uuid) + stopHighlight(uuid) + player.sendMessage("§6[EntityPose] §f範囲内の${targets.size}体を削除しました") + } + + private fun entityclear(player: Player) { + val uuid = player.uniqueId + if (selection.contains(uuid)) { + stopHighlight(uuid) + activeselection.remove(uuid) + selection.remove(uuid) + player.sendMessage("§6[EntityPose] §e範囲選択をリセットしました") + } else { + player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") + return + } + } + + private fun entityHojo(player: Player, args: Array) { + if (args.size == 1) { + player.sendMessage("§6[EntityPose] §c/ehojo onまたはoff と入力してください") + return + } + when (args[1].lowercase()) { + "on" -> { + AirBlock.setStatus(player, true) + player.sendMessage("§6[EntityPose] §b足場自動生成を§a【ON】§bにしました") + } + + "off" -> { + AirBlock.setStatus(player, false) + player.sendMessage("§6[EntityPose] §b足場自動生成を§c【OFF】§bにしました") + } + + else -> { + player.sendMessage("§6[EntityPose] §conまたはoff を入力してください") + } + } + } + + private fun formatLoc(value: Double): String { + return String.format("%.3f", value) + } + + private fun formatDeg1(angle: EulerAngle): String { + val rawx = Math.toDegrees(angle.x) + val rawy = Math.toDegrees(angle.y) + val rawz = Math.toDegrees(angle.z) + val x = (rawx % 360 + 360) % 360 + val y = (rawy % 360 + 360) % 360 + val z = (rawz % 360 + 360) % 360 + // 「X:」などを消して 「0, 0, 0」 形式にする + return String.format("%.1f,%.1f,%.1f", x, y, z) + } + + override fun onTabComplete( + sender: CommandSender, + command: Command, + alias: String, + args: Array + ): MutableList { + val completions = mutableListOf() + + if(args.size == 1) { + val list =listOf( + "stick","st", + "wand","wa", + "info","in", + "infoset","ins", + "scale","sc", + "kakudo","ka", + "zahyo", "za", + "copy", "co", + "paste", "pa", + "cut", "cu" , + "clear", "cl", + "hojo", "ho" + ) + completions.addAll(list.filter { it.startsWith(args[0], ignoreCase = true) }) + return completions + } + if(args.size == 2) { + val sub = args[0].lowercase() + val list2 = when(sub) { + "hojo","h" -> listOf("on","off") + else -> emptyList() + } + completions.addAll(list2.filter { it.startsWith(args[1], ignoreCase = true) }) + return completions + } + return mutableListOf() + } +} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt index 81e5bdc0..6fafc87f 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt @@ -4,17 +4,6 @@ package me.ankokunsan.entityPose import java.util.UUID import me.ankokunsan.entityPose.EntityCopyClick.Companion.highlightTasks -import me.ankokunsan.entityPose.commands.Boucommand -import me.ankokunsan.entityPose.commands.EntityCopy -import me.ankokunsan.entityPose.commands.EntityCut -import me.ankokunsan.entityPose.commands.EntityHojo -import me.ankokunsan.entityPose.commands.EntityPaste -import me.ankokunsan.entityPose.commands.EntityScale -import me.ankokunsan.entityPose.commands.EntityWand -import me.ankokunsan.entityPose.commands.Entityinfo -import me.ankokunsan.entityPose.commands.KakudoCommand -import me.ankokunsan.entityPose.commands.SetumeiCommand -import me.ankokunsan.entityPose.commands.ZahyoCommand import org.bukkit.Bukkit import org.bukkit.NamespacedKey import org.bukkit.inventory.ItemStack @@ -80,17 +69,7 @@ class EntityPose : JavaPlugin() { Bou.create() CopyWand.create1() - getCommand("epstick")?.setExecutor(Boucommand()) - getCommand("epinfo")?.setExecutor(Entityinfo()) - getCommand("epkakudo")?.setExecutor(KakudoCommand()) - getCommand("epzahyo")?.setExecutor(ZahyoCommand()) - getCommand("epscale")?.setExecutor(EntityScale()) - getCommand("ephojo")?.setExecutor(EntityHojo()) - getCommand("epwand")?.setExecutor(EntityWand()) - getCommand("epcopy")?.setExecutor(EntityCopy()) - getCommand("eppaste")?.setExecutor(EntityPaste()) - getCommand("epcut")?.setExecutor(EntityCut()) - getCommand("entitypose")?.setExecutor(SetumeiCommand()) + getCommand("ep")?.setExecutor(EntityCommands()) val board = Bukkit.getScoreboardManager()!!.mainScoreboard diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt index dc1ab38e..d10a4390 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt @@ -11,6 +11,7 @@ import org.bukkit.persistence.PersistentDataType import org.bukkit.scheduler.BukkitRunnable import org.bukkit.scheduler.BukkitTask import org.bukkit.util.EulerAngle +import kotlin.math.roundToInt object FollowEntity { @@ -61,6 +62,17 @@ object FollowEntity { val dir = eyeLoc.direction.normalize() val target = eyeLoc.clone().add(dir.multiply(distance)) + target.x = target.blockX + 0.5 + target.y = target.blockY.toDouble() + target.z = target.blockZ + 0.5 + + val directionToPlayer = eyeLoc.toVector().subtract(target.toVector()) // プレイヤーへの方向ベクトル + val lookAtPlayerLoc = target.clone().setDirection(directionToPlayer) + val snappedYaw = ((lookAtPlayerLoc.yaw / 45.0).roundToInt() * 45.0).toFloat() + // ベクトルをLocationの向きに変換 + target.yaw = snappedYaw + target.pitch = 0f + val bx = target.blockX.toDouble() val by = target.blockY.toDouble() val bz = target.blockZ.toDouble() @@ -71,13 +83,6 @@ object FollowEntity { w.spawnParticle(Particle.FLAME, bx, by, bz + 1, 1, 0.0, 0.0, 0.0, 0.0) w.spawnParticle(Particle.FLAME, bx + 1, by, bz + 1, 1, 0.0, 0.0, 0.0, 0.0) - val directionToPlayer = - eyeLoc.toVector().subtract(target.toVector()) // プレイヤーへの方向ベクトル - val lookAtPlayerLoc = - target.clone().setDirection(directionToPlayer) // ベクトルをLocationの向きに変換 - target.yaw = lookAtPlayerLoc.yaw - target.pitch = 0f - entity.teleport(target) } } diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt index 4acb77d5..cbc8880b 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt @@ -13,7 +13,6 @@ import me.ankokunsan.entityPose.EntityPose.Companion.RABBIT_KEY import me.ankokunsan.entityPose.EntityPose.Companion.SIZE_KEY import me.ankokunsan.entityPose.EntityPose.Companion.WOLF_KEY import me.ankokunsan.entityPose.EntityPose.Companion.ZAHYO_KEY -import me.ankokunsan.entityPose.commands.Entityinfo import org.bukkit.NamespacedKey import org.bukkit.Registry import org.bukkit.Sound @@ -105,7 +104,7 @@ class GUIClick : Listener { } player.playSound(player.location, Sound.UI_BUTTON_CLICK, 1.0f, 1.5f) // 再描画の際も、今見つけたtargetを渡す - Entityinfo().openSettingGUI(player, target) + ChooseGUi.openSettingGUI(player, target) } @EventHandler @@ -201,7 +200,7 @@ class GUIClick : Listener { } } player.playSound(player.location, Sound.UI_BUTTON_CLICK, 1.0f, 1.5f) - Entityinfo().openAllSettingGUI(player, targets) + ChooseGUi.openAllSettingGUI(player, targets) } } diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Boucommand.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Boucommand.kt deleted file mode 100644 index bb68ed07..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Boucommand.kt +++ /dev/null @@ -1,31 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import me.ankokunsan.entityPose.Bou -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class Boucommand : CommandExecutor { - - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!sender.hasPermission("entitypose_arrange")) { - sender.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - player.inventory.addItem(Bou.create()) - player.sendMessage("§6[EntityPose] §aエンティティ棒を手に入れました!") - - return true - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCopy.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCopy.kt index 7717398b..3c5924aa 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCopy.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCopy.kt @@ -32,15 +32,7 @@ class EntityCopy : CommandExecutor { label: String, args: Array ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!player.hasPermission("entitypose_arrange")) { - player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } + val player = sender as Player val uuid = player.uniqueId val targets = activeselection[uuid]?.filter { it.isValid } diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCut.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCut.kt deleted file mode 100644 index fc973fe8..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityCut.kt +++ /dev/null @@ -1,42 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import kotlin.collections.filter -import me.ankokunsan.entityPose.EntityCopyClick.Companion.activeselection -import me.ankokunsan.entityPose.EntityCopyClick.Companion.selection -import me.ankokunsan.entityPose.stopHighlight -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class EntityCut : CommandExecutor { - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!player.hasPermission("entitypose_arrange")) { - player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - val uuid = player.uniqueId - val targets = activeselection[uuid]?.filter { it.isValid } - - if (targets == null) { - player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") - return true - } - targets.forEach { entity -> if (entity.isValid) entity.remove() } - activeselection.remove(uuid) - selection.remove(uuid) - stopHighlight(uuid) - player.sendMessage("§6[EntityPose] §f範囲内の${targets.size}体を削除しました") - return true - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityHojo.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityHojo.kt deleted file mode 100644 index 68378561..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityHojo.kt +++ /dev/null @@ -1,60 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import me.ankokunsan.entityPose.AirBlock -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.command.TabCompleter -import org.bukkit.entity.Player - -class EntityHojo : CommandExecutor, TabCompleter { - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!player.hasPermission("entitypose_arrange")) { - player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - if (args.isEmpty()) { - player.sendMessage("§6[EntityPose] §c/ehojo onまたはoff と入力してください") - return true - } - when (args[0].lowercase()) { - "on" -> { - AirBlock.setStatus(player, true) - player.sendMessage("§6[EntityPose] §b足場自動生成を§a【ON】§bにしました") - } - - "off" -> { - AirBlock.setStatus(player, false) - player.sendMessage("§6[EntityPose] §b足場自動生成を§c【OFF】§bにしました") - } - - else -> { - player.sendMessage("§6[EntityPose] §conまたはoff を入力してください") - } - } - return true - } - - override fun onTabComplete( - sender: CommandSender, - command: Command, - alias: String, - args: Array - ): List { - if (args.size == 1) { - val rst = listOf("on", "off") - return rst.filter { it.startsWith(args[0], ignoreCase = true) } - } - return emptyList() - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityPaste.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityPaste.kt index 41a53857..be39dc80 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityPaste.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityPaste.kt @@ -57,15 +57,7 @@ class EntityPaste : CommandExecutor { label: String, args: Array ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!sender.hasPermission("entitypose_arrange")) { - sender.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } + val player = sender as Player val uuid = player.uniqueId val snapshot1 = clipboard[uuid] if (snapshot1 == null) { diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityScale.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityScale.kt deleted file mode 100644 index 57b8bba0..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityScale.kt +++ /dev/null @@ -1,77 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import kotlin.collections.filter -import kotlin.math.round -import me.ankokunsan.entityPose.EntityCopyClick.Companion.activeselection -import org.bukkit.attribute.Attribute -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.ExperienceOrb -import org.bukkit.entity.LivingEntity -import org.bukkit.entity.Player - -class EntityScale : CommandExecutor { - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!sender.hasPermission("entitypose_arrange")) { - sender.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - val result = - player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { - it != player && it !is ExperienceOrb - } - val target = result?.hitEntity - if (target == null) { - sender.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") - return true - } - if (target is Player) { - sender.sendMessage("§6[EntityPose] §cプレイヤーをいじろうとしないでね") - return true - } - val livingEntity = target as? LivingEntity ?: return true - if (livingEntity.hasAI()) { - player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") - return true - } - if (args.isEmpty()) { - player.sendMessage("§6[EntityPose] §c数字を入力してください") - return true - } - val scale = args[0].toDoubleOrNull() - if (scale == null) { - player.sendMessage("§6[EntityPose] §c数字を入力してください") - return true - } - val limitedScale = scale.coerceIn(0.3, 3.0) - val roundedScale = round(limitedScale * 10) / 10.0 - val selected = activeselection[player.uniqueId] - if (selected != null && selected.contains(target)) { - val targets = selected.filter { it.isValid } - targets.forEach { entity -> - (entity as? LivingEntity)?.getAttribute(Attribute.SCALE)?.let { attribute -> - attribute.baseValue = roundedScale - } - } - player.sendMessage("§6[EntityPose] §a範囲選択されているエンティティのスケールを $roundedScale に設定しました") - } else { - val attribute = livingEntity.getAttribute(Attribute.SCALE) - if (attribute != null) { - attribute.baseValue = roundedScale - player.sendMessage("§6[EntityPose] §a視線の先にあるエンティティのスケールを $roundedScale に設定しました") - } - } - return true - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityWand.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityWand.kt deleted file mode 100644 index 1f5d189c..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/EntityWand.kt +++ /dev/null @@ -1,61 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import me.ankokunsan.entityPose.CopyWand -import me.ankokunsan.entityPose.EntityCopyClick.Companion.activeselection -import me.ankokunsan.entityPose.EntityCopyClick.Companion.selection -import me.ankokunsan.entityPose.stopHighlight -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.command.TabCompleter -import org.bukkit.entity.Player - -class EntityWand : CommandExecutor, TabCompleter { - - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - // プレイヤーでない場合はメッセージを送って終了 - val player = - sender as? Player - ?: run { - return true - } - if (!sender.hasPermission("entitypose_arrange")) { - sender.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - if (args.isNotEmpty() && args[0].equals("-c", ignoreCase = true)) { - val uuid = player.uniqueId - if (selection.contains(uuid)) { - stopHighlight(uuid) - activeselection.remove(uuid) - selection.remove(uuid) - player.sendMessage("§6[EntityPose] §e範囲選択をリセットしました") - } else { - player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") - return true - } - } else if (args.isEmpty()) { - player.inventory.addItem(CopyWand.create1()) - player.sendMessage("§6[EntityPose] §aEntity Copy Wandを手に入れました!") - return true - } - return true - } - - override fun onTabComplete( - sender: CommandSender, - command: Command, - alias: String, - args: Array - ): List { - if (args.size == 1) { - return listOf("-c").filter { it.startsWith(args[0], ignoreCase = true) } - } - return emptyList() - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Entityinfo.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Entityinfo.kt deleted file mode 100644 index 9f63b1a3..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/Entityinfo.kt +++ /dev/null @@ -1,367 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import kotlin.collections.filter -import me.ankokunsan.entityPose.EntityCopyClick.Companion.activeselection -import me.ankokunsan.entityPose.EntityPose -import org.bukkit.Bukkit -import org.bukkit.Color -import org.bukkit.Material -import org.bukkit.attribute.Attribute -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.command.TabCompleter -import org.bukkit.entity.ArmorStand -import org.bukkit.entity.Entity -import org.bukkit.entity.LivingEntity -import org.bukkit.entity.Player -import org.bukkit.entity.Tameable -import org.bukkit.inventory.ItemStack -import org.bukkit.inventory.meta.PotionMeta -import org.bukkit.persistence.PersistentDataType -import org.bukkit.util.EulerAngle - -class Entityinfo : CommandExecutor, TabCompleter { - - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!player.hasPermission("entitypose_arrange")) { - player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - val result = - sender.world.rayTraceEntities(sender.eyeLocation, sender.location.direction, 3.0, 0.1) { - it != sender - } - val target = - result?.hitEntity - ?: return true.also { sender.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") } - if (target is Player) { - sender.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") - return true - } - if (target is LivingEntity && target.hasAI()) { - sender.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") - return true - } - if (args.isNotEmpty() && args[0].equals("set", ignoreCase = true)) { - val selected = activeselection[player.uniqueId] - if (selected != null && selected.contains(target)) { - val targets = selected.filter { it.isValid } - openAllSettingGUI(player, targets) - } else { - openSettingGUI(player, target) - return true - } - } else if (args.isEmpty()) { - val loc = target.location - val yaw = (loc.yaw % 360 + 360) % 360 - val invincible = - if (target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE)) - "§aON" - else "§cOFF" - val arrangelock = - if (target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE)) - "§aON" - else "§cOFF" - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - - if (target is ArmorStand) { - val head = target.headPose - val body = target.bodyPose - val leftArm = target.leftArmPose - val rightArm = target.rightArmPose - val leftLeg = target.leftLegPose - val rightLeg = target.rightLegPose - val gravity = if (target.hasGravity()) "§aON" else "§cOFF" - val basePlate = if (target.hasBasePlate()) "§aON" else "§cOFF" - val invisible = if (target.isInvisible) "§aON" else "§cOFF" - val itemlock = - if (target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE)) - "§aON" - else "§cOFF" - - sender.sendMessage("§6---[EntityPose]§bArmorStandの情報§6---") - sender.sendMessage("頭: §e${formatDeg1(head)}") - sender.sendMessage("上半身: §e${formatDeg1(body)}") - sender.sendMessage("左腕: §e${formatDeg1(leftArm)}") - sender.sendMessage("右腕: §e${formatDeg1(rightArm)}") - sender.sendMessage("左足: §e${formatDeg1(leftLeg)}") - sender.sendMessage("右足: §e${formatDeg1(rightLeg)}") - sender.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") - sender.sendMessage( - "座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}") - sender.sendMessage("ダメージ無効: $invincible") - sender.sendMessage("重力: $gravity") - sender.sendMessage("底のプレート: $basePlate") - sender.sendMessage("透明: $invisible") - sender.sendMessage("スケール: $scale") - sender.sendMessage("アイテムのロック: $itemlock") - sender.sendMessage("アレンジのロック: $arrangelock") - } else { - val pitch = loc.pitch - sender.sendMessage("§6---[EntityPose]§b${target.type.name} の情報§6---") - sender.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") - sender.sendMessage("頭の向き: §e${String.format("%.1f", pitch)}°") - sender.sendMessage( - "座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}") - sender.sendMessage("ダメージ無効: $invincible") - sender.sendMessage("スケール: $scale") - sender.sendMessage("アレンジのロック: $arrangelock") - } - return true - } - return true - } - - fun openSettingGUI(player: Player, target: Entity) { - val invs = Bukkit.createInventory(null, 9, "§3エンティティの設定変更") - - val damageItem = - ItemStack(Material.DIAMOND_SWORD).apply { - val meta = itemMeta ?: return@apply - val hasKey = - target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE) - val status = if (hasKey) "§aON" else "§cOFF" - meta.setDisplayName("§fダメージ無効: $status") - itemMeta = meta - } - val scaleItem1 = - ItemStack(Material.POTION).apply { // LEGACYを消す - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - meta.setDisplayName("§fスケール設定(大きくするほう): $scale") - itemMeta = meta - } - val scaleItem2 = - ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - meta.setDisplayName("§fスケール設定(小さくするほう): $scale") - itemMeta = meta - } - val lockitem = - ItemStack(Material.TRIAL_KEY).apply { - val meta = itemMeta ?: return@apply - val hasKey = - target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE) - val lockarrange = if (hasKey) "§aON" else "§cOFF" - meta.setDisplayName("§fアレンジのロック: $lockarrange") - itemMeta = meta - } - if (target is Tameable) { - val tameItem = - ItemStack(Material.BONE).apply { - val meta = itemMeta ?: return@apply - val status = if (target.isTamed) "§aON" else "§cOFF" - meta.setDisplayName("§f懐き状態: $status") - itemMeta = meta - } - invs.setItem(1, tameItem) - } else if (target is ArmorStand) { - val baseItem = - ItemStack(Material.SMOOTH_STONE_SLAB).apply { - val meta = itemMeta ?: return@apply - val status = if (target.hasBasePlate()) "§aON" else "§cOFF" - meta.setDisplayName("§f底のプレート表示: $status") - itemMeta = meta - } - val gravityItem = - ItemStack(Material.ANVIL).apply { - val meta = itemMeta ?: return@apply - val status = if (target.hasGravity()) "§aON" else "§cOFF" - meta.setDisplayName("§f重力: $status") - itemMeta = meta - } - val invisibleItem = - ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.fromRGB(127, 131, 146) - val status = if (target.isInvisible) "§aON" else "§cOFF" - meta.setDisplayName("§f透明: $status") - itemMeta = meta - } - val itemlockItem = - ItemStack(Material.OMINOUS_TRIAL_KEY).apply { - val meta = itemMeta ?: return@apply - val hasKey = - target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) - val status = if (hasKey) "§aON" else "§cOFF" - meta.setDisplayName("§fアイテムのロック: $status") - itemMeta = meta - } - invs.setItem(1, gravityItem) - invs.setItem(2, baseItem) - invs.setItem(3, invisibleItem) - invs.setItem(4, itemlockItem) - } - invs.setItem(0, damageItem) - invs.setItem(6, scaleItem1) - invs.setItem(7, scaleItem2) - invs.setItem(8, lockitem) - - val filler = getFiller() - for (i in 0 until invs.size) { - if (invs.getItem(i) == null) invs.setItem(i, filler) - } - player.openInventory(invs) - } - - fun openAllSettingGUI(player: Player, targets: List) { - val invs = Bukkit.createInventory(null, 9, "§3範囲選択済みエンティティの設定変更") - - val damageItem = - ItemStack(Material.DIAMOND_SWORD).apply { - val meta = itemMeta ?: return@apply - val count = - targets.count { - it.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE) - } - meta.setDisplayName("§fダメージ無効 ${count}/${targets.size}体ON") - itemMeta = meta - } - val scaleItem1 = - ItemStack(Material.POTION).apply { // LEGACYを消す - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - meta.setDisplayName("§fスケール設定(大きくするほう)") - val lorelist = mutableListOf() - lorelist.add("§7----- 現在のスケール一覧 -----") - targets.take(6).forEach { target -> - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - val typeName = target.type.name - lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") - } - if (targets.size > 6) { - lorelist.add("§8...ほか ${targets.size - 6}体") - } - meta.lore = lorelist - itemMeta = meta - } - val scaleItem2 = - ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - meta.setDisplayName("§fサイズ設定(小さくするほう)") - val lorelist = mutableListOf() - lorelist.add("§7----- 現在のサイズ一覧 -----") - targets.take(6).forEach { target -> - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - val typeName = target.type.name - lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") - } - if (targets.size > 6) { - lorelist.add("§8...ほか ${targets.size - 6}体") - } - meta.lore = lorelist - itemMeta = meta - } - val lockitem = - ItemStack(Material.TRIAL_KEY).apply { - val meta = itemMeta ?: return@apply - val count = - targets.count { - it.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE) - } - meta.setDisplayName("§fアレンジのロック ${count}/${targets.size}体ON") - itemMeta = meta - } - - if (targets.all { it is ArmorStand }) { - val baseItem = - ItemStack(Material.SMOOTH_STONE_SLAB).apply { - val meta = itemMeta ?: return@apply - val count = targets.filterIsInstance().count { it.hasBasePlate() } - meta.setDisplayName("§f底のプレート表示: ${count}/${targets.size}体ON") - itemMeta = meta - } - val gravityItem = - ItemStack(Material.ANVIL).apply { - val meta = itemMeta ?: return@apply - val count = targets.count { it.hasGravity() } - meta.setDisplayName("§f重力: ${count}/${targets.size}体ON") - itemMeta = meta - } - val invisibleItem = - ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.fromRGB(127, 131, 146) - val count = targets.filterIsInstance().count { it.isInvisible } - meta.setDisplayName("§f透明: ${count}/${targets.size}体ON") - itemMeta = meta - } - val itemlockItem = - ItemStack(Material.OMINOUS_TRIAL_KEY).apply { - val meta = itemMeta ?: return@apply - val count = - targets.count { - it.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) - } - meta.setDisplayName("§fアイテムのロック: ${count}/${targets.size}体ON") - itemMeta = meta - } - invs.setItem(1, gravityItem) - invs.setItem(2, baseItem) - invs.setItem(3, invisibleItem) - invs.setItem(4, itemlockItem) - } - - invs.setItem(0, damageItem) - invs.setItem(6, scaleItem1) - invs.setItem(7, scaleItem2) - invs.setItem(8, lockitem) - val filler = getFiller() - for (i in 0 until invs.size) { - if (invs.getItem(i) == null) invs.setItem(i, filler) - } - player.openInventory(invs) - } - - private fun getFiller(): ItemStack { - return ItemStack(Material.LIGHT_GRAY_STAINED_GLASS_PANE).apply { - itemMeta = - itemMeta?.apply { - setDisplayName(" ") - persistentDataContainer.set(EntityPose.GUI_KEY, PersistentDataType.STRING, "FILLER") - } - } - } - - private fun formatLoc(value: Double): String { - return String.format("%.3f", value) - } - - private fun formatDeg1(angle: EulerAngle): String { - val rawx = Math.toDegrees(angle.x) - val rawy = Math.toDegrees(angle.y) - val rawz = Math.toDegrees(angle.z) - val x = (rawx % 360 + 360) % 360 - val y = (rawy % 360 + 360) % 360 - val z = (rawz % 360 + 360) % 360 - // 「X:」などを消して 「0, 0, 0」 形式にする - return String.format("%.1f,%.1f,%.1f", x, y, z) - } - - override fun onTabComplete( - sender: CommandSender, - command: Command, - alias: String, - args: Array - ): List { - if (args.size == 1) { - return listOf("set").filter { it.startsWith(args[0], ignoreCase = true) } - } - return emptyList() - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/KakudoCommand.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/KakudoCommand.kt deleted file mode 100644 index 912444b2..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/KakudoCommand.kt +++ /dev/null @@ -1,42 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import me.ankokunsan.entityPose.ChooseGUi -import me.ankokunsan.entityPose.EntityClick -import org.bukkit.Sound -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class KakudoCommand : CommandExecutor { - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!sender.hasPermission("entitypose_arrange")) { - sender.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - if (args.isEmpty()) { - ChooseGUi.openKakudoGUI(player) - player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) - return true - } - val value = args[0].toDoubleOrNull() - if (value != null) { - val limitedValue = value.coerceIn(0.5, 90.0) - EntityClick.currentStep[player.uniqueId] = limitedValue - sender.sendMessage("§6[EntityPose] §aエンティティの角度の刻みを${limitedValue}度に設定しました") - } else { - sender.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epkakudoとだけ打ってGUIを開いてください") - } - return true - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/SetumeiCommand.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/SetumeiCommand.kt deleted file mode 100644 index 594617a2..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/SetumeiCommand.kt +++ /dev/null @@ -1,45 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class SetumeiCommand : CommandExecutor { - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!player.hasPermission("entitypose_arrange")) { - player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - player.sendMessage("§6---[EntityPose]§bコマンド、操作一覧§6---") - player.sendMessage("§l/epstick §rエンティティ棒を手に入れる") - player.sendMessage("エンティティ棒 §rデバック棒に類似、アマスタは選択多いので注意") - player.sendMessage("§l/epkakudo (0.5~90.0) §rエンティティの角度の刻みを変更(数字なしでGUI)") - player.sendMessage("§l/epzahyo (0.01~2.0) §rエンティティの一回あたりに動く座標の大きさを変更(数字なしでGUI)") - player.sendMessage("/epkakudoはオフハント持ち替え゙、+しゃがみで/epzahyoのGUIを開ける") - player.sendMessage("§b-------------------------------------") - player.sendMessage("§l/epwand §rEntity Copy Wandを手に入れる") - player.sendMessage("§lEntity Copy Wand §rWEのエンティティを選択するver(当たり判定難)") - player.sendMessage("§l/epwand -c §r範囲選択解除 pos1,2も解除(オフハンド持ち替えでも可)") - player.sendMessage("§l/epcopy §r範囲選択したエンティティをコピー") - player.sendMessage("§l/eppaste §rコピーしたエンティティをペースト") - player.sendMessage("§l/epcut §r範囲選択したエンティティを削除") - player.sendMessage("§l/epinfo §rエンティティの情報をチャット欄に表示") - player.sendMessage("§l/epinfo set §rエンティティの情報を変更するGUIを開く(範囲選択で同時設定可)") - player.sendMessage("§l/epscale (0.3~3.0) §rエンティティの大きさ変更(範囲選択で同時設定可)") - player.sendMessage("範囲選択で[全体],[X,Y,Z座標]を同時に動かせる") - player.sendMessage("§b-----------------おまけ-----------------") - player.sendMessage("§l/ephojo on/off §r空中作業のときに足場を出すか否か §c※本当に周りにブロックがない時だけにしてね") - return true - } -} diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/ZahyoCommand.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/ZahyoCommand.kt deleted file mode 100644 index c117b317..00000000 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/commands/ZahyoCommand.kt +++ /dev/null @@ -1,43 +0,0 @@ -package me.ankokunsan.entityPose.commands - -import kotlin.collections.set -import me.ankokunsan.entityPose.ChooseGUi -import me.ankokunsan.entityPose.EntityClick -import org.bukkit.Sound -import org.bukkit.command.Command -import org.bukkit.command.CommandExecutor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class ZahyoCommand : CommandExecutor { - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!sender.hasPermission("entitypose_arrange")) { - sender.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - if (args.isEmpty()) { - ChooseGUi.openZahyoGUI(player) - player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) - return true - } - val value1 = args[0].toDoubleOrNull() - if (value1 != null) { - val limitedValue1 = value1.coerceIn(0.01, 2.0) - EntityClick.currentZah[player.uniqueId] = limitedValue1 - sender.sendMessage("§6[EntityPose] §aエンティティの一回あたりに動く座標の大きさを${limitedValue1}マスに設定しました") - } else { - sender.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epzahyoとだけ打ってGUIを開いてください") - } - return true - } -} diff --git a/plugins/EntityPose/src/main/resources/plugin.yml b/plugins/EntityPose/src/main/resources/plugin.yml index 872c89d9..b41a3f47 100644 --- a/plugins/EntityPose/src/main/resources/plugin.yml +++ b/plugins/EntityPose/src/main/resources/plugin.yml @@ -4,59 +4,9 @@ main: me.ankokunsan.entityPose.EntityPose api-version: "1.21" commands: - epstick: - description: エンティティ棒を手に入れる - usage: /epstick - permission: entitypose_arrange - - epinfo: - description: エンティティの情報を表示、変更 - usage: /epinfo - permission: entitypose_arrange - - epkakudo: - description: エンティティの角度の刻みを変更 - usage: /epkakudo - permission: entitypose_arrange - - epzahyo: - description: エンティティの一回あたりに動く座標の大きさを変更 - usage: /epzahyo - permission: entitypose_arrange - - epscale: - description: エンティティの大きさ変更 - usage: /epscale - permission: entitypose_arrange - - ephojo: - description: エンティティを空中で操作するときに自動で出るガラスのオンオフ - usage: /ephojo - permission: entitypose_arrange - - epwand: - description: Entity Copy Wandを手に入れる - usage: /epwand - permission: entitypose_arrange - - epcopy: - description: エンティティをコピー - usage: /epcopy - permission: entitypose_arrange - - eppaste: - description: エンティティをペースト - usage: /eppaste - permission: entitypose_arrange - - epcut: - description: エンティティを削除 - usage: /epcut - permission: entitypose_arrange - - entitypose: - description: EntityPoseのコマンドとか操作一覧 - usage: /entitypose + ep: + description: EntityPoseの全コマンド集合 + usage: /ep permission: entitypose_arrange permissions: From 5dda14ebc9237f558e346bfedd511d8d5ee09a8e Mon Sep 17 00:00:00 2001 From: ankokun Date: Sun, 29 Mar 2026 20:55:02 +0900 Subject: [PATCH 2/2] format --- .../me/ankokunsan/entityPose/ChooseGUi.kt | 361 +++++----- .../me/ankokunsan/entityPose/EntityClick.kt | 70 +- .../ankokunsan/entityPose/EntityCommands.kt | 668 +++++++++--------- .../me/ankokunsan/entityPose/EntityPose.kt | 2 +- .../me/ankokunsan/entityPose/FollowEntity.kt | 5 +- .../me/ankokunsan/entityPose/GUIClick.kt | 2 +- 6 files changed, 582 insertions(+), 526 deletions(-) diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt index e91a901f..ab29d449 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/ChooseGUi.kt @@ -160,187 +160,218 @@ object ChooseGUi { player.playSound(player, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) } - fun openSettingGUI(player: Player, target: Entity) { - val invs = Bukkit.createInventory(null, 9, "§3エンティティの設定変更") - val living = target as? LivingEntity + fun openSettingGUI(player: Player, target: Entity) { + val invs = Bukkit.createInventory(null, 9, "§3エンティティの設定変更") + val living = target as? LivingEntity - val damageItem = ItemStack(Material.DIAMOND_SWORD).apply { - val meta = itemMeta ?: return@apply - val hasKey= target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE) - val status = if (hasKey) "§aON" else "§cOFF" - meta.setDisplayName("§fダメージ無効: $status") - itemMeta = meta + val damageItem = + ItemStack(Material.DIAMOND_SWORD).apply { + val meta = itemMeta ?: return@apply + val hasKey = + target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE) + val status = if (hasKey) "§aON" else "§cOFF" + meta.setDisplayName("§fダメージ無効: $status") + itemMeta = meta } - val scaleItem1 = ItemStack(Material.POTION).apply { // LEGACYを消す - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - val scale = living?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - meta.setDisplayName("§fサイズ設定(大きくするほう): $scale") - itemMeta = meta + val scaleItem1 = + ItemStack(Material.POTION).apply { // LEGACYを消す + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + val scale = living?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + meta.setDisplayName("§fサイズ設定(大きくするほう): $scale") + itemMeta = meta } - val scaleItem2 = ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - val scale = living?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - meta.setDisplayName("§fサイズ設定(小さくするほう): $scale") - itemMeta = meta + val scaleItem2 = + ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + val scale = living?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + meta.setDisplayName("§fサイズ設定(小さくするほう): $scale") + itemMeta = meta } - val invisibleItem = ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.fromRGB(127, 131, 146) - val status = living?.let { if (it.isInvisible) "§aON" else "§cOFF" } - meta.setDisplayName("§f透明: $status") - itemMeta = meta + val invisibleItem = + ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.fromRGB(127, 131, 146) + val status = living?.let { if (it.isInvisible) "§aON" else "§cOFF" } + meta.setDisplayName("§f透明: $status") + itemMeta = meta + } + val lockitem = + ItemStack(Material.TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val hasKey = + target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE) + val lockarrange = if (hasKey) "§aON" else "§cOFF" + meta.setDisplayName("§fアレンジのロック: $lockarrange") + itemMeta = meta } - val lockitem = ItemStack(Material.TRIAL_KEY).apply { + if (target is Tameable) { + val tameItem = + ItemStack(Material.BONE).apply { val meta = itemMeta ?: return@apply - val hasKey= target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE) - val lockarrange = if (hasKey) "§aON" else "§cOFF" - meta.setDisplayName("§fアレンジのロック: $lockarrange") + val status = if (target.isTamed) "§aON" else "§cOFF" + meta.setDisplayName("§f懐き状態: $status") itemMeta = meta - } - if (target is Tameable) { - val tameItem = ItemStack(Material.BONE).apply { - val meta = itemMeta ?: return@apply - val status = if (target.isTamed) "§aON" else "§cOFF" - meta.setDisplayName("§f懐き状態: $status") - itemMeta = meta - } - invs.setItem(1, tameItem) - - } else if (target is ArmorStand) { - val baseItem = ItemStack(Material.SMOOTH_STONE_SLAB).apply { - val meta = itemMeta ?: return@apply - val status = if (target.hasBasePlate()) "§aON" else "§cOFF" - meta.setDisplayName("§f底のプレート表示: $status") - itemMeta = meta - } - val gravityItem = ItemStack(Material.ANVIL).apply { - val meta = itemMeta ?: return@apply - val status = if (target.hasGravity()) "§aON" else "§cOFF" - meta.setDisplayName("§f重力: $status") - itemMeta = meta - } - val itemlockItem = ItemStack(Material.OMINOUS_TRIAL_KEY).apply { - val meta = itemMeta ?: return@apply - val hasKey= target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) - val status = if (hasKey) "§aON" else "§cOFF" - meta.setDisplayName("§fアイテムのロック: $status") - itemMeta = meta - } - invs.setItem(1, gravityItem) - invs.setItem(2, baseItem) - invs.setItem(3,itemlockItem) - } - invs.setItem(0, damageItem) - invs.setItem(5, invisibleItem) - invs.setItem(6,scaleItem1) - invs.setItem(7,scaleItem2) - invs.setItem(8,lockitem) - - val filler = getFiller1() - for (i in 0 until invs.size) { - if (invs.getItem(i) == null) invs.setItem(i, filler) - } - player.openInventory(invs) - } - fun openAllSettingGUI(player: Player,targets: List) { - val invs = Bukkit.createInventory(null, 9, "§3範囲選択済みエンティティの設定変更") - - val damageItem = ItemStack(Material.DIAMOND_SWORD).apply { + } + invs.setItem(1, tameItem) + } else if (target is ArmorStand) { + val baseItem = + ItemStack(Material.SMOOTH_STONE_SLAB).apply { val meta = itemMeta ?: return@apply - val count = targets.count { it.persistentDataContainer.has(EntityPose.INVINCIBLE , PersistentDataType.BYTE) } - meta.setDisplayName("§fダメージ無効 ${count}/${targets.size}体ON") + val status = if (target.hasBasePlate()) "§aON" else "§cOFF" + meta.setDisplayName("§f底のプレート表示: $status") itemMeta = meta - } - val scaleItem1 = ItemStack(Material.POTION).apply { // LEGACYを消す - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - meta.setDisplayName("§fスケール設定(大きくするほう)") - val lorelist = mutableListOf() - lorelist.add("§7----- 現在のスケール一覧 -----") - targets.take(10).forEach { target -> - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - val typeName = target.type.name - lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") - } - if (targets.size > 10) { - lorelist.add("§8...ほか ${targets.size - 10}体") - } - meta.lore = lorelist + } + val gravityItem = + ItemStack(Material.ANVIL).apply { + val meta = itemMeta ?: return@apply + val status = if (target.hasGravity()) "§aON" else "§cOFF" + meta.setDisplayName("§f重力: $status") itemMeta = meta - } - val scaleItem2 = ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.YELLOW - meta.setDisplayName("§fスケール設定(小さくするほう)") - val lorelist = mutableListOf() - lorelist.add("§7----- 現在のスケール一覧 -----") - targets.take(10).forEach { target -> - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - val typeName = target.type.name - lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") - } - if (targets.size > 10) { - lorelist.add("§8...ほか ${targets.size - 10}体") - } - meta.lore = lorelist + } + val itemlockItem = + ItemStack(Material.OMINOUS_TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val hasKey = + target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) + val status = if (hasKey) "§aON" else "§cOFF" + meta.setDisplayName("§fアイテムのロック: $status") itemMeta = meta + } + invs.setItem(1, gravityItem) + invs.setItem(2, baseItem) + invs.setItem(3, itemlockItem) + } + invs.setItem(0, damageItem) + invs.setItem(5, invisibleItem) + invs.setItem(6, scaleItem1) + invs.setItem(7, scaleItem2) + invs.setItem(8, lockitem) + + val filler = getFiller1() + for (i in 0 until invs.size) { + if (invs.getItem(i) == null) invs.setItem(i, filler) + } + player.openInventory(invs) + } + + fun openAllSettingGUI(player: Player, targets: List) { + val invs = Bukkit.createInventory(null, 9, "§3範囲選択済みエンティティの設定変更") + + val damageItem = + ItemStack(Material.DIAMOND_SWORD).apply { + val meta = itemMeta ?: return@apply + val count = + targets.count { + it.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE) + } + meta.setDisplayName("§fダメージ無効 ${count}/${targets.size}体ON") + itemMeta = meta } - val invisibleItem = ItemStack(Material.POTION).apply { - val meta = itemMeta as? PotionMeta ?: return@apply - meta.color = Color.fromRGB(127, 131, 146) - val count = targets.filterIsInstance().count { it.isInvisible } - meta.setDisplayName("§f透明: ${count}/${targets.size}体ON") - itemMeta = meta + val scaleItem1 = + ItemStack(Material.POTION).apply { // LEGACYを消す + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + meta.setDisplayName("§fスケール設定(大きくするほう)") + val lorelist = mutableListOf() + lorelist.add("§7----- 現在のスケール一覧 -----") + targets.take(10).forEach { target -> + val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + val typeName = target.type.name + lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") + } + if (targets.size > 10) { + lorelist.add("§8...ほか ${targets.size - 10}体") + } + meta.lore = lorelist + itemMeta = meta } - val lockitem = ItemStack(Material.TRIAL_KEY).apply { - val meta = itemMeta ?: return@apply - val count = targets.count { it.persistentDataContainer.has(EntityPose.ARRANGELOCK , PersistentDataType.BYTE)} - meta.setDisplayName("§fアレンジのロック ${count}/${targets.size}体ON") - itemMeta = meta + val scaleItem2 = + ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.YELLOW + meta.setDisplayName("§fスケール設定(小さくするほう)") + val lorelist = mutableListOf() + lorelist.add("§7----- 現在のスケール一覧 -----") + targets.take(10).forEach { target -> + val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + val typeName = target.type.name + lorelist.add("§8-$typeName: §b${String.format("%.1f", scale)}") + } + if (targets.size > 10) { + lorelist.add("§8...ほか ${targets.size - 10}体") + } + meta.lore = lorelist + itemMeta = meta } - - if (targets.all{it is ArmorStand}) { - val baseItem = ItemStack(Material.SMOOTH_STONE_SLAB).apply { - val meta = itemMeta ?: return@apply - val count = targets.filterIsInstance().count { it.hasBasePlate()} - meta.setDisplayName("§f底のプレート表示: ${count}/${targets.size}体ON") - itemMeta = meta - } - val gravityItem = ItemStack(Material.ANVIL).apply { - val meta = itemMeta ?: return@apply - val count = targets.count { it.hasGravity()} - meta.setDisplayName("§f重力: ${count}/${targets.size}体ON") - itemMeta = meta - } - val itemlockItem = ItemStack(Material.OMINOUS_TRIAL_KEY).apply { - val meta = itemMeta ?: return@apply - val count = targets.count{ it.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) } - meta.setDisplayName("§fアイテムのロック: ${count}/${targets.size}体ON") - itemMeta = meta - } - invs.setItem(1, gravityItem) - invs.setItem(2, baseItem) - invs.setItem(3,itemlockItem) + val invisibleItem = + ItemStack(Material.POTION).apply { + val meta = itemMeta as? PotionMeta ?: return@apply + meta.color = Color.fromRGB(127, 131, 146) + val count = targets.filterIsInstance().count { it.isInvisible } + meta.setDisplayName("§f透明: ${count}/${targets.size}体ON") + itemMeta = meta } - invs.setItem(0,damageItem) - invs.setItem(5,invisibleItem) - invs.setItem(6,scaleItem1) - invs.setItem(7,scaleItem2) - invs.setItem(8,lockitem) - val filler = getFiller1() - for (i in 0 until invs.size) { - if (invs.getItem(i) == null) invs.setItem(i, filler) + val lockitem = + ItemStack(Material.TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val count = + targets.count { + it.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE) + } + meta.setDisplayName("§fアレンジのロック ${count}/${targets.size}体ON") + itemMeta = meta } - player.openInventory(invs) + + if (targets.all { it is ArmorStand }) { + val baseItem = + ItemStack(Material.SMOOTH_STONE_SLAB).apply { + val meta = itemMeta ?: return@apply + val count = targets.filterIsInstance().count { it.hasBasePlate() } + meta.setDisplayName("§f底のプレート表示: ${count}/${targets.size}体ON") + itemMeta = meta + } + val gravityItem = + ItemStack(Material.ANVIL).apply { + val meta = itemMeta ?: return@apply + val count = targets.count { it.hasGravity() } + meta.setDisplayName("§f重力: ${count}/${targets.size}体ON") + itemMeta = meta + } + val itemlockItem = + ItemStack(Material.OMINOUS_TRIAL_KEY).apply { + val meta = itemMeta ?: return@apply + val count = + targets.count { + it.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE) + } + meta.setDisplayName("§fアイテムのロック: ${count}/${targets.size}体ON") + itemMeta = meta + } + invs.setItem(1, gravityItem) + invs.setItem(2, baseItem) + invs.setItem(3, itemlockItem) } - private fun getFiller1(): ItemStack { - return ItemStack(Material.LIGHT_GRAY_STAINED_GLASS_PANE).apply { - itemMeta = itemMeta?.apply { - setDisplayName(" ") - persistentDataContainer.set(GUI_KEY, PersistentDataType.STRING, "FILLER") - } - } + invs.setItem(0, damageItem) + invs.setItem(5, invisibleItem) + invs.setItem(6, scaleItem1) + invs.setItem(7, scaleItem2) + invs.setItem(8, lockitem) + val filler = getFiller1() + for (i in 0 until invs.size) { + if (invs.getItem(i) == null) invs.setItem(i, filler) + } + player.openInventory(invs) + } + + private fun getFiller1(): ItemStack { + return ItemStack(Material.LIGHT_GRAY_STAINED_GLASS_PANE).apply { + itemMeta = + itemMeta?.apply { + setDisplayName(" ") + persistentDataContainer.set(GUI_KEY, PersistentDataType.STRING, "FILLER") + } } + } } diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt index 48600127..fcc5a91b 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityClick.kt @@ -123,43 +123,45 @@ class EntityClick : Listener { } } - @EventHandler - fun onDropEvent(event : PlayerDropItemEvent) { - val player = event.player - val item = event.itemDrop.itemStack - if(!isEntiStick(item)) return - if(!player.hasPermission("entitypose_arrange")) return - if(!player.isSneaking) return - event.isCancelled = true - val result = - player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { it != player } - val target = result?.hitEntity ?: return - if (target is Player) { - player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") - return - } - if (target is LivingEntity && target.hasAI()) { - player.sendMessage("§6[EntityPose] §cこのモブはAIが有効です") - return - } - val selected = activeselection[player.uniqueId] - if (selected != null && selected.contains(target)) { - val targets = selected.filter { it.isValid } - ChooseGUi.openAllSettingGUI(player, targets) - } else { - ChooseGUi.openSettingGUI(player, target) - return + @EventHandler + fun onDropEvent(event: PlayerDropItemEvent) { + val player = event.player + val item = event.itemDrop.itemStack + if (!isEntiStick(item)) return + if (!player.hasPermission("entitypose_arrange")) return + if (!player.isSneaking) return + event.isCancelled = true + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { + it != player } + val target = result?.hitEntity ?: return + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") + return + } + if (target is LivingEntity && target.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのモブはAIが有効です") + return } + val selected = activeselection[player.uniqueId] + if (selected != null && selected.contains(target)) { + val targets = selected.filter { it.isValid } + ChooseGUi.openAllSettingGUI(player, targets) + } else { + ChooseGUi.openSettingGUI(player, target) + return + } + } - @EventHandler - fun onLeftClickBlock(event: PlayerInteractEvent) { - val player = event.player - val hand = player.inventory.itemInMainHand - if (!isEntiStick(hand)) return - if (!player.hasPermission("entitypose_arrange")) return // - if (event.action != Action.LEFT_CLICK_BLOCK) return - if (event.clickedBlock == null) return + @EventHandler + fun onLeftClickBlock(event: PlayerInteractEvent) { + val player = event.player + val hand = player.inventory.itemInMainHand + if (!isEntiStick(hand)) return + if (!player.hasPermission("entitypose_arrange")) return // + if (event.action != Action.LEFT_CLICK_BLOCK) return + if (event.clickedBlock == null) return event.isCancelled = true player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt index 888d552e..8995c034 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityCommands.kt @@ -1,5 +1,6 @@ package me.ankokunsan.entityPose +import kotlin.math.round import me.ankokunsan.entityPose.EntityCopyClick.Companion.activeselection import me.ankokunsan.entityPose.EntityCopyClick.Companion.selection import me.ankokunsan.entityPose.commands.EntityCopy @@ -16,360 +17,381 @@ import org.bukkit.entity.LivingEntity import org.bukkit.entity.Player import org.bukkit.persistence.PersistentDataType import org.bukkit.util.EulerAngle -import kotlin.math.round -class EntityCommands : CommandExecutor , TabCompleter { - override fun onCommand( - sender: CommandSender, - command: Command, - label: String, - args: Array - ): Boolean { - val player = - sender as? Player - ?: run { - return true - } - if (!player.hasPermission("entitypose_arrange")) { - player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") - return true - } - if (args.isEmpty()) { - player.sendMessage("§6---[EntityPose]§bコマンド、操作一覧§6---") - player.sendMessage("§l/ep stick/st §rエンティティ棒を手に入れる") - player.sendMessage("エンティティ棒 §rデバック棒に類似") - player.sendMessage("§l/ep kakudo/ka (0.5~90.0) §rエンティティの角度の刻みを変更(数字なしでGUI)") - player.sendMessage("§l/ep zahyo/za (0.01~2.0) §rエンティティの一回あたりに動く座標の大きさを変更(数字なしでGUI)") - player.sendMessage("/ep kakudoはオフハント持ち替え゙、+しゃがみで/ep zahyoのGUIを開ける") - player.sendMessage("§b-------------------------------------") - player.sendMessage("§l/ep wand/wa §rEntity Copy Wandを手に入れる") - player.sendMessage("§lEntity Copy Wand §rWEのエンティティを選択するver(当たり判定難)") - player.sendMessage("§l/ep clear/cl §r範囲選択解除 pos1,2も解除(オフハンド持ち替えでも可)") - player.sendMessage("§l/ep copy/co §r範囲選択したエンティティをコピー") - player.sendMessage("§l/ep paste/pa §rコピーしたエンティティをペースト") - player.sendMessage("§l/ep cut/cu §r範囲選択したエンティティを削除") - player.sendMessage("§l/ep info/in §rエンティティの情報をチャット欄に表示") - player.sendMessage("§l/ep infoset/ins §rエンティティの情報を変更するGUIを開く(範囲選択で同時設定可)") - player.sendMessage("§l/ep scale/sc (0.3~3.0) §rエンティティの大きさ変更(範囲選択で同時設定可)") - player.sendMessage("範囲選択で[全体],[X,Y,Z座標]を同時に動かせる") - player.sendMessage("§b-----------------おまけ-----------------") - player.sendMessage("§l/ep hojo/ho on/off §r空中作業のときに足場を出すか否か §c※本当に周りにブロックがない時だけにしてね") - return true - } - when (args[0].lowercase()) { - "stick", "st" -> boucommand(player) - "wand", "wa" -> entityWand(player) - "info", "in" -> entityinfo(player) - "infoset","ins" -> entityinfoset(player) - "scale", "sc" -> entityScale(player, args) - "kakudo", "ka" -> kakudoCommand(player, args) - "zahyo", "za" -> zahyoCommand(player, args) - "copy", "co" -> return EntityCopy().onCommand(sender, command, label, args) - "paste", "pa" -> return EntityPaste().onCommand(sender, command, label, args) - "cut", "cu" -> entityCut(player) - "clear", "cl" -> entityclear(player) - "hojo", "ho" -> entityHojo(player, args) - else -> player.sendMessage("§6[EntityPose] §c不明なコマンドです") - } - return true +class EntityCommands : CommandExecutor, TabCompleter { + override fun onCommand( + sender: CommandSender, + command: Command, + label: String, + args: Array + ): Boolean { + val player = + sender as? Player + ?: run { + return true + } + if (!player.hasPermission("entitypose_arrange")) { + player.sendMessage("§cあなたにはこのコマンドを使う権限がありません!") + return true } - - private fun boucommand(player: Player) { - player.inventory.addItem(Bou.create()) - player.sendMessage("§6[EntityPose] §aエンティティ棒を手に入れました!") + if (args.isEmpty()) { + player.sendMessage("§6---[EntityPose]§bコマンド、操作一覧§6---") + player.sendMessage("§l/ep stick/st §rエンティティ棒を手に入れる") + player.sendMessage("エンティティ棒 §rデバック棒に類似") + player.sendMessage("§l/ep kakudo/ka (0.5~90.0) §rエンティティの角度の刻みを変更(数字なしでGUI)") + player.sendMessage("§l/ep zahyo/za (0.01~2.0) §rエンティティの一回あたりに動く座標の大きさを変更(数字なしでGUI)") + player.sendMessage("/ep kakudoはオフハント持ち替え゙、+しゃがみで/ep zahyoのGUIを開ける") + player.sendMessage("§b-------------------------------------") + player.sendMessage("§l/ep wand/wa §rEntity Copy Wandを手に入れる") + player.sendMessage("§lEntity Copy Wand §rWEのエンティティを選択するver(当たり判定難)") + player.sendMessage("§l/ep clear/cl §r範囲選択解除 pos1,2も解除(オフハンド持ち替えでも可)") + player.sendMessage("§l/ep copy/co §r範囲選択したエンティティをコピー") + player.sendMessage("§l/ep paste/pa §rコピーしたエンティティをペースト") + player.sendMessage("§l/ep cut/cu §r範囲選択したエンティティを削除") + player.sendMessage("§l/ep info/in §rエンティティの情報をチャット欄に表示") + player.sendMessage("§l/ep infoset/ins §rエンティティの情報を変更するGUIを開く(範囲選択で同時設定可)") + player.sendMessage("§l/ep scale/sc (0.3~3.0) §rエンティティの大きさ変更(範囲選択で同時設定可)") + player.sendMessage("範囲選択で[全体],[X,Y,Z座標]を同時に動かせる") + player.sendMessage("§b-----------------おまけ-----------------") + player.sendMessage("§l/ep hojo/ho on/off §r空中作業のときに足場を出すか否か §c※本当に周りにブロックがない時だけにしてね") + return true } - - private fun entityWand(player: Player) { - player.inventory.addItem(CopyWand.create1()) - player.sendMessage("§6[EntityPose] §aEntity Copy Wandを手に入れました!") + when (args[0].lowercase()) { + "stick", + "st" -> boucommand(player) + "wand", + "wa" -> entityWand(player) + "info", + "in" -> entityinfo(player) + "infoset", + "ins" -> entityinfoset(player) + "scale", + "sc" -> entityScale(player, args) + "kakudo", + "ka" -> kakudoCommand(player, args) + "zahyo", + "za" -> zahyoCommand(player, args) + "copy", + "co" -> return EntityCopy().onCommand(sender, command, label, args) + "paste", + "pa" -> return EntityPaste().onCommand(sender, command, label, args) + "cut", + "cu" -> entityCut(player) + "clear", + "cl" -> entityclear(player) + "hojo", + "ho" -> entityHojo(player, args) + else -> player.sendMessage("§6[EntityPose] §c不明なコマンドです") } + return true + } - private fun entityinfo(player: Player) { - val result = - player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { - it != player - } - val target = result?.hitEntity - if (target == null) { - player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") - return - } - if (target is Player) { - player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") - return - } - if (target is LivingEntity && target.hasAI()) { - player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") - return - } - val loc = target.location - val yaw = (loc.yaw % 360 + 360) % 360 - val invincible = - if (target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE)) - "§aON" - else "§cOFF" - val arrangelock = - if (target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE)) - "§aON" - else "§cOFF" - val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 + private fun boucommand(player: Player) { + player.inventory.addItem(Bou.create()) + player.sendMessage("§6[EntityPose] §aエンティティ棒を手に入れました!") + } - if (target is ArmorStand) { - val head = target.headPose - val body = target.bodyPose - val leftArm = target.leftArmPose - val rightArm = target.rightArmPose - val leftLeg = target.leftLegPose - val rightLeg = target.rightLegPose - val gravity = if (target.hasGravity()) "§aON" else "§cOFF" - val basePlate = if (target.hasBasePlate()) "§aON" else "§cOFF" - val invisible = if (target.isInvisible) "§aON" else "§cOFF" - val itemlock = - if (target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE)) - "§aON" - else "§cOFF" + private fun entityWand(player: Player) { + player.inventory.addItem(CopyWand.create1()) + player.sendMessage("§6[EntityPose] §aEntity Copy Wandを手に入れました!") + } - player.sendMessage("§6---[EntityPose]§bArmorStandの情報§6---") - player.sendMessage("頭: §e${formatDeg1(head)}") - player.sendMessage("上半身: §e${formatDeg1(body)}") - player.sendMessage("左腕: §e${formatDeg1(leftArm)}") - player.sendMessage("右腕: §e${formatDeg1(rightArm)}") - player.sendMessage("左足: §e${formatDeg1(leftLeg)}") - player.sendMessage("右足: §e${formatDeg1(rightLeg)}") - player.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") - player.sendMessage( - "座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}" - ) - player.sendMessage("ダメージ無効: $invincible") - player.sendMessage("重力: $gravity") - player.sendMessage("底のプレート: $basePlate") - player.sendMessage("透明: $invisible") - player.sendMessage("スケール: $scale") - player.sendMessage("アイテムのロック: $itemlock") - player.sendMessage("アレンジのロック: $arrangelock") - } else { - val pitch = loc.pitch - player.sendMessage("§6---[EntityPose]§b${target.type.name} の情報§6---") - player.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") - player.sendMessage("頭の向き: §e${String.format("%.1f", pitch)}°") - player.sendMessage( - "座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}" - ) - player.sendMessage("ダメージ無効: $invincible") - player.sendMessage("スケール: $scale") - player.sendMessage("アレンジのロック: $arrangelock") - } - return + private fun entityinfo(player: Player) { + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { + it != player } - - private fun entityinfoset(player: Player) { - val result = - player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { - it != player - } - val target = result?.hitEntity - if (target == null) { - player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") - return - } - if (target is Player) { - player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") - return - } - if (target is LivingEntity && target.hasAI()) { - player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") - return - } - val selected = activeselection[player.uniqueId] - if (selected != null && selected.contains(target)) { - val targets = selected.filter { it.isValid } - ChooseGUi.openAllSettingGUI(player, targets) - } else { - ChooseGUi.openSettingGUI(player, target) - return - } + val target = result?.hitEntity + if (target == null) { + player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") + return } + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") + return + } + if (target is LivingEntity && target.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") + return + } + val loc = target.location + val yaw = (loc.yaw % 360 + 360) % 360 + val invincible = + if (target.persistentDataContainer.has(EntityPose.INVINCIBLE, PersistentDataType.BYTE)) + "§aON" + else "§cOFF" + val arrangelock = + if (target.persistentDataContainer.has(EntityPose.ARRANGELOCK, PersistentDataType.BYTE)) + "§aON" + else "§cOFF" + val scale = (target as? LivingEntity)?.getAttribute(Attribute.SCALE)?.baseValue ?: 1.0 - private fun entityScale(player: Player, args: Array) { - val result = - player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { - it != player && it !is ExperienceOrb - } - val target = result?.hitEntity - if (target == null) { - player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") - return - } - if (target is Player) { - player.sendMessage("§6[EntityPose] §cプレイヤーをいじろうとしないでね") - return - } - val livingEntity = target as? LivingEntity ?: return - if (livingEntity.hasAI()) { - player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") - return - } - if (args.size < 2) { - player.sendMessage("§6[EntityPose] §c数字を入力してください") - return - } - val scale = args[1].toDoubleOrNull() - if (scale == null) { - player.sendMessage("§6[EntityPose] §c数字を入力してください") - return - } - val limitedScale = scale.coerceIn(0.3, 3.0) - val roundedScale = round(limitedScale * 10) / 10.0 - val selected = activeselection[player.uniqueId] - if (selected != null && selected.contains(target)) { - val targets = selected.filter { it.isValid } - targets.forEach { entity -> - (entity as? LivingEntity)?.getAttribute(Attribute.SCALE)?.let { attribute -> - attribute.baseValue = roundedScale - } - } - player.sendMessage("§6[EntityPose] §a範囲選択されているエンティティのスケールを $roundedScale に設定しました") - } else { - val attribute = livingEntity.getAttribute(Attribute.SCALE) - if (attribute != null) { - attribute.baseValue = roundedScale - player.sendMessage("§6[EntityPose] §a視線の先にあるエンティティのスケールを $roundedScale に設定しました") - } - } + if (target is ArmorStand) { + val head = target.headPose + val body = target.bodyPose + val leftArm = target.leftArmPose + val rightArm = target.rightArmPose + val leftLeg = target.leftLegPose + val rightLeg = target.rightLegPose + val gravity = if (target.hasGravity()) "§aON" else "§cOFF" + val basePlate = if (target.hasBasePlate()) "§aON" else "§cOFF" + val invisible = if (target.isInvisible) "§aON" else "§cOFF" + val itemlock = + if (target.persistentDataContainer.has(EntityPose.ITEMLOCK, PersistentDataType.BYTE)) + "§aON" + else "§cOFF" + + player.sendMessage("§6---[EntityPose]§bArmorStandの情報§6---") + player.sendMessage("頭: §e${formatDeg1(head)}") + player.sendMessage("上半身: §e${formatDeg1(body)}") + player.sendMessage("左腕: §e${formatDeg1(leftArm)}") + player.sendMessage("右腕: §e${formatDeg1(rightArm)}") + player.sendMessage("左足: §e${formatDeg1(leftLeg)}") + player.sendMessage("右足: §e${formatDeg1(rightLeg)}") + player.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") + player.sendMessage("座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}") + player.sendMessage("ダメージ無効: $invincible") + player.sendMessage("重力: $gravity") + player.sendMessage("底のプレート: $basePlate") + player.sendMessage("透明: $invisible") + player.sendMessage("スケール: $scale") + player.sendMessage("アイテムのロック: $itemlock") + player.sendMessage("アレンジのロック: $arrangelock") + } else { + val pitch = loc.pitch + player.sendMessage("§6---[EntityPose]§b${target.type.name} の情報§6---") + player.sendMessage("全体の向き: §e${String.format("%.1f", yaw)}°") + player.sendMessage("頭の向き: §e${String.format("%.1f", pitch)}°") + player.sendMessage("座標: §eX:${formatLoc(loc.x)} Y:${formatLoc(loc.y)} Z:${formatLoc(loc.z)}") + player.sendMessage("ダメージ無効: $invincible") + player.sendMessage("スケール: $scale") + player.sendMessage("アレンジのロック: $arrangelock") } + return + } - private fun kakudoCommand(player: Player, args: Array) { - if (args.size == 1) { - ChooseGUi.openKakudoGUI(player) - player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) - return - } - val value = args[1].toDoubleOrNull() - if (value != null) { - val limitedValue = value.coerceIn(0.5, 90.0) - EntityClick.currentStep[player.uniqueId] = limitedValue - player.sendMessage("§6[EntityPose] §aエンティティの角度の刻みを${limitedValue}度に設定しました") - } else { - player.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epkakudoとだけ打ってGUIを開いてください") + private fun entityinfoset(player: Player) { + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { + it != player } + val target = result?.hitEntity + if (target == null) { + player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") + return + } + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーの情報を見たり、いじろうとしないでね") + return } + if (target is LivingEntity && target.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") + return + } + val selected = activeselection[player.uniqueId] + if (selected != null && selected.contains(target)) { + val targets = selected.filter { it.isValid } + ChooseGUi.openAllSettingGUI(player, targets) + } else { + ChooseGUi.openSettingGUI(player, target) + return + } + } - private fun zahyoCommand(player: Player, args: Array) { - if (args.size == 1) { - ChooseGUi.openZahyoGUI(player) - player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) - return + private fun entityScale(player: Player, args: Array) { + val result = + player.world.rayTraceEntities(player.eyeLocation, player.location.direction, 3.0, 0.1) { + it != player && it !is ExperienceOrb } - val value1 = args[1].toDoubleOrNull() - if (value1 != null) { - val limitedValue1 = value1.coerceIn(0.01, 2.0) - EntityClick.currentZah[player.uniqueId] = limitedValue1 - player.sendMessage("§6[EntityPose] §aエンティティの一回あたりに動く座標の大きさを${limitedValue1}マスに設定しました") - } else { - player.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epzahyoとだけ打ってGUIを開いてください") + val target = result?.hitEntity + if (target == null) { + player.sendMessage("§6[EntityPose] §c視線の先にエンティティがいません") + return + } + if (target is Player) { + player.sendMessage("§6[EntityPose] §cプレイヤーをいじろうとしないでね") + return + } + val livingEntity = target as? LivingEntity ?: return + if (livingEntity.hasAI()) { + player.sendMessage("§6[EntityPose] §cこのエンティティはAIが有効です") + return + } + if (args.size < 2) { + player.sendMessage("§6[EntityPose] §c数字を入力してください") + return + } + val scale = args[1].toDoubleOrNull() + if (scale == null) { + player.sendMessage("§6[EntityPose] §c数字を入力してください") + return + } + val limitedScale = scale.coerceIn(0.3, 3.0) + val roundedScale = round(limitedScale * 10) / 10.0 + val selected = activeselection[player.uniqueId] + if (selected != null && selected.contains(target)) { + val targets = selected.filter { it.isValid } + targets.forEach { entity -> + (entity as? LivingEntity)?.getAttribute(Attribute.SCALE)?.let { attribute -> + attribute.baseValue = roundedScale } + } + player.sendMessage("§6[EntityPose] §a範囲選択されているエンティティのスケールを $roundedScale に設定しました") + } else { + val attribute = livingEntity.getAttribute(Attribute.SCALE) + if (attribute != null) { + attribute.baseValue = roundedScale + player.sendMessage("§6[EntityPose] §a視線の先にあるエンティティのスケールを $roundedScale に設定しました") + } } + } - private fun entityCut(player: Player) { - val uuid = player.uniqueId - val targets = activeselection[uuid]?.filter { it.isValid } - - if (targets == null) { - player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") - return - } - targets.forEach { entity -> if (entity.isValid) entity.remove() } - activeselection.remove(uuid) - selection.remove(uuid) - stopHighlight(uuid) - player.sendMessage("§6[EntityPose] §f範囲内の${targets.size}体を削除しました") + private fun kakudoCommand(player: Player, args: Array) { + if (args.size == 1) { + ChooseGUi.openKakudoGUI(player) + player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) + return + } + val value = args[1].toDoubleOrNull() + if (value != null) { + val limitedValue = value.coerceIn(0.5, 90.0) + EntityClick.currentStep[player.uniqueId] = limitedValue + player.sendMessage("§6[EntityPose] §aエンティティの角度の刻みを${limitedValue}度に設定しました") + } else { + player.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epkakudoとだけ打ってGUIを開いてください") } + } - private fun entityclear(player: Player) { - val uuid = player.uniqueId - if (selection.contains(uuid)) { - stopHighlight(uuid) - activeselection.remove(uuid) - selection.remove(uuid) - player.sendMessage("§6[EntityPose] §e範囲選択をリセットしました") - } else { - player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") - return - } + private fun zahyoCommand(player: Player, args: Array) { + if (args.size == 1) { + ChooseGUi.openZahyoGUI(player) + player.playSound(player.location, Sound.BLOCK_CHEST_OPEN, 1.0f, 2.0f) + return } + val value1 = args[1].toDoubleOrNull() + if (value1 != null) { + val limitedValue1 = value1.coerceIn(0.01, 2.0) + EntityClick.currentZah[player.uniqueId] = limitedValue1 + player.sendMessage("§6[EntityPose] §aエンティティの一回あたりに動く座標の大きさを${limitedValue1}マスに設定しました") + } else { + player.sendMessage("§6[EntityPose] §c有効な数字を入力するか、/epzahyoとだけ打ってGUIを開いてください") + } + } - private fun entityHojo(player: Player, args: Array) { - if (args.size == 1) { - player.sendMessage("§6[EntityPose] §c/ehojo onまたはoff と入力してください") - return - } - when (args[1].lowercase()) { - "on" -> { - AirBlock.setStatus(player, true) - player.sendMessage("§6[EntityPose] §b足場自動生成を§a【ON】§bにしました") - } + private fun entityCut(player: Player) { + val uuid = player.uniqueId + val targets = activeselection[uuid]?.filter { it.isValid } - "off" -> { - AirBlock.setStatus(player, false) - player.sendMessage("§6[EntityPose] §b足場自動生成を§c【OFF】§bにしました") - } + if (targets == null) { + player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") + return + } + targets.forEach { entity -> if (entity.isValid) entity.remove() } + activeselection.remove(uuid) + selection.remove(uuid) + stopHighlight(uuid) + player.sendMessage("§6[EntityPose] §f範囲内の${targets.size}体を削除しました") + } - else -> { - player.sendMessage("§6[EntityPose] §conまたはoff を入力してください") - } - } + private fun entityclear(player: Player) { + val uuid = player.uniqueId + if (selection.contains(uuid)) { + stopHighlight(uuid) + activeselection.remove(uuid) + selection.remove(uuid) + player.sendMessage("§6[EntityPose] §e範囲選択をリセットしました") + } else { + player.sendMessage("§6[EntityPose] §c範囲選択されているエンティティがいません") + return } + } - private fun formatLoc(value: Double): String { - return String.format("%.3f", value) + private fun entityHojo(player: Player, args: Array) { + if (args.size == 1) { + player.sendMessage("§6[EntityPose] §c/ehojo onまたはoff と入力してください") + return } + when (args[1].lowercase()) { + "on" -> { + AirBlock.setStatus(player, true) + player.sendMessage("§6[EntityPose] §b足場自動生成を§a【ON】§bにしました") + } - private fun formatDeg1(angle: EulerAngle): String { - val rawx = Math.toDegrees(angle.x) - val rawy = Math.toDegrees(angle.y) - val rawz = Math.toDegrees(angle.z) - val x = (rawx % 360 + 360) % 360 - val y = (rawy % 360 + 360) % 360 - val z = (rawz % 360 + 360) % 360 - // 「X:」などを消して 「0, 0, 0」 形式にする - return String.format("%.1f,%.1f,%.1f", x, y, z) + "off" -> { + AirBlock.setStatus(player, false) + player.sendMessage("§6[EntityPose] §b足場自動生成を§c【OFF】§bにしました") + } + + else -> { + player.sendMessage("§6[EntityPose] §conまたはoff を入力してください") + } } + } - override fun onTabComplete( - sender: CommandSender, - command: Command, - alias: String, - args: Array - ): MutableList { - val completions = mutableListOf() + private fun formatLoc(value: Double): String { + return String.format("%.3f", value) + } - if(args.size == 1) { - val list =listOf( - "stick","st", - "wand","wa", - "info","in", - "infoset","ins", - "scale","sc", - "kakudo","ka", - "zahyo", "za", - "copy", "co", - "paste", "pa", - "cut", "cu" , - "clear", "cl", - "hojo", "ho" - ) - completions.addAll(list.filter { it.startsWith(args[0], ignoreCase = true) }) - return completions - } - if(args.size == 2) { - val sub = args[0].lowercase() - val list2 = when(sub) { - "hojo","h" -> listOf("on","off") - else -> emptyList() - } - completions.addAll(list2.filter { it.startsWith(args[1], ignoreCase = true) }) - return completions - } - return mutableListOf() + private fun formatDeg1(angle: EulerAngle): String { + val rawx = Math.toDegrees(angle.x) + val rawy = Math.toDegrees(angle.y) + val rawz = Math.toDegrees(angle.z) + val x = (rawx % 360 + 360) % 360 + val y = (rawy % 360 + 360) % 360 + val z = (rawz % 360 + 360) % 360 + // 「X:」などを消して 「0, 0, 0」 形式にする + return String.format("%.1f,%.1f,%.1f", x, y, z) + } + + override fun onTabComplete( + sender: CommandSender, + command: Command, + alias: String, + args: Array + ): MutableList { + val completions = mutableListOf() + + if (args.size == 1) { + val list = + listOf( + "stick", + "st", + "wand", + "wa", + "info", + "in", + "infoset", + "ins", + "scale", + "sc", + "kakudo", + "ka", + "zahyo", + "za", + "copy", + "co", + "paste", + "pa", + "cut", + "cu", + "clear", + "cl", + "hojo", + "ho") + completions.addAll(list.filter { it.startsWith(args[0], ignoreCase = true) }) + return completions + } + if (args.size == 2) { + val sub = args[0].lowercase() + val list2 = + when (sub) { + "hojo", + "h" -> listOf("on", "off") + else -> emptyList() + } + completions.addAll(list2.filter { it.startsWith(args[1], ignoreCase = true) }) + return completions } + return mutableListOf() + } } diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt index 6fafc87f..08d9c3f8 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/EntityPose.kt @@ -69,7 +69,7 @@ class EntityPose : JavaPlugin() { Bou.create() CopyWand.create1() - getCommand("ep")?.setExecutor(EntityCommands()) + getCommand("ep")?.setExecutor(EntityCommands()) val board = Bukkit.getScoreboardManager()!!.mainScoreboard diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt index d10a4390..e93376e3 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/FollowEntity.kt @@ -1,6 +1,7 @@ package me.ankokunsan.entityPose import java.util.UUID +import kotlin.math.roundToInt import org.bukkit.Particle import org.bukkit.entity.ArmorStand import org.bukkit.entity.Entity @@ -11,7 +12,6 @@ import org.bukkit.persistence.PersistentDataType import org.bukkit.scheduler.BukkitRunnable import org.bukkit.scheduler.BukkitTask import org.bukkit.util.EulerAngle -import kotlin.math.roundToInt object FollowEntity { @@ -66,7 +66,8 @@ object FollowEntity { target.y = target.blockY.toDouble() target.z = target.blockZ + 0.5 - val directionToPlayer = eyeLoc.toVector().subtract(target.toVector()) // プレイヤーへの方向ベクトル + val directionToPlayer = + eyeLoc.toVector().subtract(target.toVector()) // プレイヤーへの方向ベクトル val lookAtPlayerLoc = target.clone().setDirection(directionToPlayer) val snappedYaw = ((lookAtPlayerLoc.yaw / 45.0).roundToInt() * 45.0).toFloat() // ベクトルをLocationの向きに変換 diff --git a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt index cbc8880b..49e864ee 100644 --- a/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt +++ b/plugins/EntityPose/src/main/kotlin/me/ankokunsan/entityPose/GUIClick.kt @@ -104,7 +104,7 @@ class GUIClick : Listener { } player.playSound(player.location, Sound.UI_BUTTON_CLICK, 1.0f, 1.5f) // 再描画の際も、今見つけたtargetを渡す - ChooseGUi.openSettingGUI(player, target) + ChooseGUi.openSettingGUI(player, target) } @EventHandler