最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【全員逃走中】幕后: 移動(dòng)警報(bào)那些事

2023-05-13 10:46 作者:ZX夏夜之風(fēng)  | 我要投稿

觀前提醒

本文章有劇透內(nèi)容。雖然標(biāo)題可能已經(jīng)足夠劇透...但仍然推薦您先看完原片再看本文。 原片 ->【全員逃走中】布萊克城 第三季https://b23.tv/UgVxO2F 本期專欄是我所做的移動(dòng)警報(bào)插件的技術(shù)原理解析。閱讀前請(qǐng)確定您有一定的理解能力。

看個(gè)樂也行

插件的源代碼可以在 GitHub 的 SNWCreations/WarnOnMove 倉庫找到。 插件基于 Bukkit API 1.16.5 。 運(yùn)行時(shí)環(huán)境: Arclight 1.16.5, Java 8 這個(gè)插件并沒有太多的細(xì)節(jié)可講,主要是圍繞 org.bukkit.event.player.PlayerMoveEvent 進(jìn)行的事件監(jiān)聽與判斷,以及一些情景的特殊處理。

下文使用 player 一詞表示事件中的玩家。

基礎(chǔ)原型

插件的判斷條件是 玩家的頭盔欄是否放置著一個(gè)石質(zhì)按鈕。 源代碼中采用了先保存物品引用再檢查的方法。 其實(shí)也可以使用 java.util.Optional 類簡化。 代碼如下: Optional.ofNullable(player.getInventory().getHelmet()).map(i -> i.getType() == Material.STONE_BUTTON).orElse(false) 在滿足條件后,我們即可獲取玩家所在的位置及其所在世界,然后調(diào)用 World.playSound 方法將播放聲音的要求下發(fā)給客戶端,從而完成警報(bào)效果。 這是最簡單的原型。 特殊情況

后續(xù)測(cè)試時(shí)發(fā)現(xiàn),僅移動(dòng)視角也會(huì)發(fā)出聲音。 所以我借鑒了 org.bukkit.Location 中 equals 方法的內(nèi)容,比較 PlayerMoveEvent 中 from 與 to 的 x, y, z 坐標(biāo)是否一致,若一致,認(rèn)為是轉(zhuǎn)動(dòng)視角,無需播放聲音,此時(shí)直接 return 以退出事件處理。 但聲音頻率過大,導(dǎo)致 "動(dòng)多了就會(huì)聾掉" (茂茂原話,意思應(yīng)該是 "移動(dòng)一點(diǎn)點(diǎn)聲音就會(huì)很大")。 對(duì)于這個(gè)問題,我認(rèn)為是因?yàn)?PlayerMoveEvent 的產(chǎn)生只需要極短的距離,而導(dǎo)致短時(shí)間內(nèi)調(diào)用次數(shù)過多,太多聲音疊加導(dǎo)致的。 因此引入一個(gè) Collection ,若 player 的 UUID 存在于這個(gè) Collection ,則阻止發(fā)出聲音。若不包括 player 的 UUID ,則在 playSound 后將其 UUID 添加到 Collection ,并預(yù)定一個(gè)在 1 秒后執(zhí)行的計(jì)劃任務(wù),以將玩家的 UUID 從 Collection 中移除,使插件判定可以繼續(xù)工作。 解除警報(bào)的實(shí)現(xiàn)?

這已經(jīng)不是這個(gè)插件的范圍了,它是用原版的命令實(shí)現(xiàn)的。

雖然這部分命令也是主要由我編寫。

其實(shí)并不復(fù)雜。 首先我們規(guī)定一個(gè)標(biāo)簽(Minecraft 中的 /tag 命令的功能),這個(gè)標(biāo)簽只有那些有警報(bào)的玩家才會(huì)有,我們認(rèn)為,有這個(gè)標(biāo)簽的玩家,頭上一定有一個(gè)按鈕,下文稱這個(gè)標(biāo)簽為 warn 。 當(dāng)一個(gè)玩家按下解除按鈕時(shí),背后有 4 條命令會(huì)被執(zhí)行。它們的工作邏輯如下: 從有 warn 標(biāo)簽的玩家中隨機(jī)選取一個(gè)添加上名為 r 的臨時(shí)標(biāo)簽---清除所有持有 r 標(biāo)簽的玩家的頭盔欄---清除所有持有 r 標(biāo)簽的玩家的 warn 標(biāo)簽---清除所有持有 r 標(biāo)簽的玩家的 r 標(biāo)簽。 翻譯為 Minecraft 命令如下: /tag @r[tag=warn] add r /replaceitem entity @a[tag=r] armor.head air /tag @a[tag=r] remove warn /tag @a[tag=r] remove r (replaceitem 那條我不確定有沒有寫對(duì),比較這個(gè)命令我太久沒碰過了(捂臉)) 為什么這么設(shè)計(jì)?為什么不直接 @r[tag=warn]?

這么設(shè)計(jì)是為了避免選取到一個(gè)已經(jīng)解除警報(bào)的玩家,以避免這次警報(bào)解除操作是無效的這種情況。 這就是移動(dòng)警報(bào)的整個(gè)工作流程與實(shí)現(xiàn)原理。 喜歡的話點(diǎn)個(gè)關(guān)注吧!或許后續(xù)我還會(huì)發(fā)點(diǎn)幕后內(nèi)容?owo

【全員逃走中】幕后: 移動(dòng)警報(bào)那些事的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
双江| 高邑县| 沙湾县| 乳山市| 沾化县| 汝州市| 淳安县| 喀喇沁旗| 连南| 迁安市| 台前县| 东光县| 林周县| 商城县| 天镇县| 昭觉县| 宝山区| 志丹县| 通海县| 安福县| 湟中县| 曲阜市| 讷河市| 麻江县| 双城市| 南岸区| 保定市| 桑植县| 洪洞县| 潼关县| 弥勒县| 龙门县| 新建县| 阜平县| 迁西县| 彩票| 蒲城县| 兴和县| 宿州市| 汝南县| 芦溪县|