前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >昨日烂活 —— 在 BukkitAPI 上实现眨眼的效果

昨日烂活 —— 在 BukkitAPI 上实现眨眼的效果

作者头像
HikariLan贺兰星辰
发布2022-10-27 09:56:10
2960
发布2022-10-27 09:56:10
举报
文章被收录于专栏:HikariLan's BlogHikariLan's Blog

本文最后更新于 520 天前,其中的信息可能已经有所发展或是发生改变。

(这个代码很久以前写的,实现真的太脏了,完全就是写出来娱乐的,所以大家也图个乐就好,仅供参考) ↓之所以要发是因为~刚才~前几天整理仓库突然看到这个觉得挺有意思就分享出来了 代码源: https://github.com/shaokeyibb/CityCore/blob/master/src/main/java/kim/minecraft/citycore/features/BlinkMe.kt

代码语言:javascript
复制
package kim.minecraft.citycore.features

import io.izzel.taboolib.internal.xseries.messages.ActionBar
import kim.minecraft.citycore.CityCore
import kim.minecraft.citycore.player.Player
import kim.minecraft.citycore.player.PlayerManager.toCCPlayer
import kim.minecraft.citycore.utils.HologramTags
import kim.minecraft.citycore.utils.storage.SettingsStorage
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerQuitEvent
import org.bukkit.potion.PotionEffect
import org.bukkit.potion.PotionEffectType
import org.bukkit.scheduler.BukkitRunnable
import kotlin.random.Random

object BlinkMe : Listener {

    private val list = mutableMapOf<Player, Action>()

    @EventHandler
    fun onRegister(e: PlayerJoinEvent) {
        if (e.player.toCCPlayer() == null) return
        list[e.player.toCCPlayer()!!] = Action(e.player.toCCPlayer()!!)
    }

    @EventHandler
    fun onUnregister(e: PlayerQuitEvent) {
        if (e.player.toCCPlayer() == null) return
        list.remove(e.player.toCCPlayer()!!)!!.also { it.unregister() }
    }

    class Action(val player: Player) {

        val blindTime = Random.nextLong(SettingsStorage.settings.getLong("HumanRaceEyesBlindMinDelay", 40), SettingsStorage.settings.getLong("HumanRaceEyesBlindMaxDelay", 120))
        val refreshTime = SettingsStorage.settings.getLong("HumanRaceEyesBlindRefreshTimeTicks", 5)

        fun unregister() {
            action.cancel()
        }

        private val action = object : BukkitRunnable() {
            override fun run() {
                val time = Random.nextInt(SettingsStorage.settings.getInt("HumanRaceEyesBlindMinDuration", 24), SettingsStorage.settings.getInt("HumanRaceEyesBlindMaxDuration", 28))
                player.getBukkitPlayer().addPotionEffect(PotionEffect(PotionEffectType.BLINDNESS, time, 255, false, false, false))
                player.getBukkitPlayer().addPotionEffect(PotionEffect(PotionEffectType.NIGHT_VISION, time, 255, false, false, false))
                HologramTags.addTags(player, "!眨眼!")
                object : BukkitRunnable() {
                    override fun run() {
                        HologramTags.removeTag(player, "!眨眼!")
                    }
                }.runTaskLater(CityCore.plugin, time.toLong())
                object : BukkitRunnable() {
                    var now = blindTime.toInt()
                    override fun run() {
                        try {
                            var i = 0
                            val string = StringBuilder()
                            while (i <= now) {
                                if ((i % refreshTime.toInt()) == 0) string.append("█")
                                i++
                            }
                            ActionBar.sendActionBar(player.getBukkitPlayer(), string.toString())
                            now--
                            if (now == 0) cancel()
                        } catch (ignored: NullPointerException) {
                            cancel()
                        }
                    }
                }.runTaskTimerAsynchronously(CityCore.plugin, 0, 1)
            }
        }

        init {
            action.runTaskTimer(CityCore.plugin, 20, blindTime)
        }
    }
}

运行原理: 每隔一定时间给予玩家失明和夜视的效果,这样玩家看起来会先啥都看不见然后逐渐恢复视野,就像眨眼一样。 虽然实现比较脏,但是玩起来还是挺有意思的,甚至挺真实2333。 (源代码上还有一个当玩家眨眼时会在头顶显示的眨眼 Tag 和一个类似 SCPSL 的剩余眨眼时间 Actionbar,可以说很真实了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-5-09 2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档