跳至主要内容

CannonRTP(WorldCannon)

CannonRTP 是一個適用於 Minecraft 伺服器的多重大砲隨機傳送插件。「WorldCannon」是較舊的/wiki 區段名稱;插件在 Bukkit 中註冊為 CannonRTP,發佈檔案為 CannonRTP.jar,這也是玩家與管理員實際看到的名稱。

關鍵命名細節:

  • 插件名稱:CannonRTP
  • 根指令:/cannonrtp
  • 別名:/crtp/wc
  • 權限:cannonrtp.admincannonrtp.use
  • 設定資料夾:plugins/CannonRTP/

功能說明

CannonRTP 是一套多重大砲隨機降落系統,而非單一固定的發射器。每一個設定好的大砲可以在世界中放置一處或多處,而每個放置點都會偵測走入其觸發半徑內的玩家。

每一座大砲可以:

  • 透過 /wc create/wc place 多次放置 —— 一份大砲設定可驅動所有放置點
  • 偵測進入該大砲觸發半徑內的玩家(預設 1.75 格)
  • 在指定的目標世界中預先載入並維持一條安全降落點佇列(支援跨世界目標)
  • 拒絕不安全的地形、被阻擋的空間、受保護的領地,以及超出世界邊界的位置
  • 可選擇性地要求額外的個別大砲權限
  • 透過五個階段的電影式序列發射玩家
  • 顯示 FreeMinecraftModels 3D 動態大砲模型(個別大砲的 customModel,或透過全域優先順序清單);若未安裝 FMM,則回退至顏色變化的軌道粒子
  • 在大砲上方顯示一個面向玩家的浮動狀態標籤(Ready / Charging / Maintaining / Exhausted / Disabled / Invalid)

發射流程

發射序列由五階段的狀態機驅動(SEARCHING -> FIRING -> TELEPORTING -> DROPPING -> LANDING)。當玩家走入符合條件的大砲觸發半徑時:

  1. CannonRTP 檢查 cannonrtp.use
  2. 檢查該大砲可選的 requiredPermission
  3. 確認大砲已啟用、設定有效,且其佇列中至少有一個預先載入的降落點。
  4. 從該大砲佇列中消耗一個預先載入的安全降落點。
  5. 觸發 CannonRTPLaunchEvent(可取消)。若有監聽器取消此事件,目的地會被歸還至佇列,大砲恢復正常行為。
  6. Searching 階段(預設 42 ticks,可透過 launchWarmupTicks 設定):玩家獲得漂浮效果,若啟用了自訂模型,則大砲會播放其 fire 動畫,標題/副標題上會閃過隨機座標預覽。在模型啟用期間,玩家會獲得隱形效果,使動畫呈現更清晰。
  7. Firing 階段(預設 45 ticks,透過 verticalBoostTicks 設定):漂浮/隱形效果被移除,播放升空音效,生成火焰+煙霧+爆炸效果,並在每個 tick 套用 verticalBoostVelocity。真正的目的地座標被揭示。
  8. Teleporting 階段(單一 tick):玩家被傳送至目的地上方 50 格(被限制在世界最大高度內)並套用緩降效果。
  9. Dropping 階段:玩家伴隨著煙霧軌跡緩慢下降(LARGE_SMOKE + CAMPFIRE_SIGNAL_SMOKE)。
  10. Landing 階段:當玩家觸地時(或達到最大下降時長)緩降效果會提早被移除,並播放衝擊效果(雲霧衝擊波、火焰環、塵土轉場)。觸發 CannonRTPLandingEvent

降落安全規則

在某個位置被接受加入預載佇列之前,目前的程式碼會依序檢查:

  • 目標世界已載入
  • 搜尋中心有效
  • 候選位置位於世界邊界內
  • 候選區塊已載入(按需載入,不會產生新地形)
  • 候選位置所在欄位中存在最高的非空氣方塊
  • 該方塊上方的腳部與頭部空間可通過
  • 表層方塊為固體且非液體
  • 表層方塊不在設定的不安全地面材質清單中
  • 腳部與頭部方塊不在設定的不安全身體材質清單中
  • 所有啟用的保護插件整合允許該位置
  • 任何 CannonRTPLocationValidationEvent 監聽器未否決該候選位置

搜尋嘗試在全域上每 tick 限速一次(每秒 20 次),透過輪流方式公平地在所有啟用中的大砲之間分配。每座大砲擁有自己的逾時計數器(searchTimeoutAttempts,預設 100,最低 10)。

大砲狀態

每座大砲都有透過 /wc status/wc list 可見的內部狀態:

顯示內部狀態含義
Disabled--大砲在其設定中被明確停用
ChargingSEARCHING(佇列為空)仍在預載第一批安全位置
MaintainingSEARCHING(佇列非空)已有部分位置,但仍在補充已消耗的名額
ReadyREADY擁有足夠的預載位置(>= chargedLocationsPerCannon)以發射玩家
ExhaustedEXHAUSTED已用盡 searchTimeoutAttempts 仍未填滿儲備
InvalidINVALID_CONFIGURATION設定錯誤(例如目標世界未載入)

只要大砲佇列中有至少一個目的地,即可發射玩家。chargedLocationsPerCannon 門檻只會影響視覺上的 READY 標籤。

執行環境需求

  • Minecraft API:1.21.4(已測試至 1.21.11
  • Java:21
  • 建議的伺服器軟體:Paper 或現行相容的分支
  • MagmaCore:2.2.0 或更新版本(共用程式庫,已遮蔽進插件內)
  • 可選依賴:FreeMinecraftModels(用於 3D 動態大砲模型)

韌性

CannonRTP 會在世界與區塊生命週期事件中保持其視覺與佇列一致:

  • 當大砲所在的區塊卸載時,其標籤與模型會被移除;在區塊重新載入時會重新生成
  • 當大砲所在的世界卸載時,大砲會被暫停;若世界再次載入則會喚醒
  • 當 FreeMinecraftModels 於執行期間被啟用或停用時,模型快取會被清除,視覺會於下一個 tick 重新整理

從這裡開始