マインクラフト非公式フォーラム

本フォーラムでは多彩なサービスを提供しています。

利用方法は「Wiki」より確認できます。

ぜひご登録をお願いいたします!

Spigot 浮き文字をアーマースタンドで実装する

浮き文字の追加についての覚え書き
NMS及びCraftBukkitのAPIを使わない場合です。



:mc_166-0: 免責事項 :mc_166-0:

基本的に解説は Kotlin をもちいておこなっています。
IDEによっては Kotlin とJavaのコンバートを行えることがあると思うので、利用の際は変換してからご利用ください。
私はプログラミング歴が浅すぎます。ですので間違えや至らない個所が多くなるかもしれません。:(




:mc_2-0: はじめに :mc_2-0:

浮き文字を設置したいなーって思ったので。




:mc_137-0: コード概要 :mc_137-0:

:mc_144-0: FloatText.kt :mc_144-0:

Kotlin:
import org.bukkit.Location
import org.bukkit.entity.ArmorStand
import org.bukkit.entity.Entity
import org.bukkit.entity.EntityType
import org.bukkit.entity.Player
import java.util.*

class FloatText(val player: Player) {

    var entity: Entity? = null
    var name: String = "float text"
    var location: Location = player.location

    init { add() }

    fun remove() {
        val entity = this.entity ?: return
        val oldUUID = entity.uniqueId ?: return
        entity.remove()
        texts.remove(oldUUID)
        this.entity = null
    }

    fun update() {
        remove()
        add()
    }

    fun isValid(): Boolean {
        return entity != null
    }

    private fun add() {
        spawnToAll()
        texts[this.entity?.uniqueId!!] = this
    }

    private fun spawnToAll() {
        val entity = location.world.spawnEntity(location, EntityType.ARMOR_STAND) ?: return
        if (entity is ArmorStand) {
            entity.isVisible = false
            entity.customName = name
            entity.isCustomNameVisible = true
            this.entity = entity
        }
    }

    companion object {
        private val texts = mutableMapOf<UUID, FloatText>()

        fun get(entity: Entity): FloatText? {
            if (entity !is ArmorStand) return null
            return texts[entity.uniqueId]
        }
    }
}


:mc_257-0: 使用方法とか :mc_257-0:

Kotlin:
// 浮き文字の追加と変更
@EventHandler
fun onInteractEntity(event: PlayerInteractEntityEvent) {
    val entity = event.rightClicked
    if (entity !is ArmorStand) return
    val interactItem = event.player.inventory.itemInMainHand
    val ft = FloatText.get(entity) ?: return

    // 文字追加
    if (event.player.isSneaking) {
        val ft = FloatText(sender)
        if (!ft.isValid()) return
        sender.sendMessage("初期状態の浮き文字を追加したよ")
        return
    }

    // 文字変更
    if (interactItem.type == Material.NAME_TAG) {
        if (!interactItem.hasItemMeta()) return
        val name = interactItem.itemMeta.displayName
        ft.name = name
        ft.update()
        sender.sendMessage("浮き文字の名前を変更したよ")
        return
    }
}

// 浮き文字削除
@EventHandler
fun onDamage(event: EntityDamageByEntityEvent) {
    val entity = event.entity
    if (entity !is ArmorStand) return
    val damager = event.damager
    if (damager is Player && damager.isSneaking) {
        val ft = FloatText.get(entity) ?: return
        ft.remove()
        sender.sendMessage("浮き文字を削除したよ")
    }
}




:mc_397-5: おわり :mc_397-5:

参考になればうれしいです
間違えとかあれば指摘してください!:p
 
Top