Lurkers レーダー · BEARING
Luaスクリプトとゲーム内コマンド
このゲームのルールはLuaで書かれています。つまり自分でサーバーを立てれば、ルールごと作り替えられます。
01ルールがスクリプトで書かれている
公式wikiの Scripting ページには「スクリプトを1つも読み込まないと、参加したプレイヤーは観戦しかできない」と書かれています。それほどスクリプトが中心で、Bedwars やゾンビサバイバルのルールもLuaで実装されています。
公式のゲームモードのスクリプトは `server.jar` の中の `/assets/scripts` に入っています。jarを展開すれば中身を読めるので、ルールの実装を確認したいときはこれが一次資料になります。ただし各スクリプトの個別解説は公開されていません。
自分でサーバーを立てる場合、`sandbox.lua` のようなファイルを `server.jar` の隣に置き、`java -jar server.jar script="sandbox.lua"` で起動します。用意されている関数(`addSimpleShop`、`spawnPeerWithTimerAndCounter`、`handleSpawnPeer` など)を組み合わせてゲームモードを作る形です。
- 言語
- Lua(ルールの大半がスクリプト)
- スクリプト無し
- 観戦しかできない
- 公式スクリプト
- server.jar の /assets/scripts
- 起動
- java -jar server.jar script="sandbox.lua"
- デバッガ
- Mobdebug(既定ポート8172、devモードのみ有効)
02ゲーム内コマンド
モデレーター以上の権限があると、チャットからコマンドを打てます。`/lua` を頭に付けるとLuaを直接実行できるので、ワンライナーで物を出したり位置を取ったりできます。
プレイヤー向けの便利コマンドとしては、`/giveall medkit 3`(全員にメディキット3個)、`/spawn zombie 5`(ゾンビ5体)、`/announce`(全体アナウンス)、`/suicide`(自決)あたりが実用的です。`/give birchsapling 20` のように、木材が尽きたマップへ苗木を配る使い方も公式の例に載っています。
権限は `dev`(全権限)、`mod`(モデレーター)、`sup`(基本のモデレーション)の3段階で、`/addrole {player} {role}` で付与します。プレイヤーを右クリック(またはスコアボード上で右クリック)するとコンテキストメニューが開き、そこからも操作できます。
| コマンド | 動作 | 例 |
|---|---|---|
| /lua <コード> | Luaを直接実行 | /lua Game:addMessage("hi") |
| /spawn <type> [count] [x] [y] | エンティティを出す | /spawn zombie 5 |
| /giveall <item> <数> | 全員にアイテム | /giveall medkit 3 |
| /give <item> <数> | 自分にアイテム | /give birchsapling 20 |
| /kill <player> | プレイヤーを倒す | /kill Player123 |
| /kick <player> | 追い出す | /kick Player123 |
| /ban <player> <時間> | BANする | /ban Player123 2 |
| /mute /unmute <player> | ミュート(shadowmute) | /mute Player123 |
| /addrole /removerole | 権限の付与と削除 | /addrole Player123 mod |
| /announce <text> | 全体アナウンス | /announce Hello world! |
| /hurt /heal <player> <数> | ダメージと回復 | /hurt bergice 5 |
| /restartserver | サーバー再起動(壊れたときだけ) | /restartserver |
03設定値の書き換え
`/set` は定数を書き換えてクライアントに同期します。第3引数に true を付けると同期、付けないとサーバー側だけ、`/setc` はクライアントだけ、`/sets` はサーバーだけです。
公式チートシートに載っている実例は、ゲーム速度(`gameSpeedMultiplier` を 1.0 / 0.5 / 0.25)、照明(`lightingEnabled`)、ズーム段数(`maxZoomLevelPlaying`)、同時接続数(`maxPeers 48`)、チャンク読み込み距離などです。
`gameSpeedMultiplier` を 0.5 にするとゲーム全体が半分の速度になります。これは「移動が遅くなる」のではなく、時間の進み方そのものが変わる設定です。練習や検証で時間を伸ばしたいときに使えます。
| コマンド | 意味 |
|---|---|
| /set io.lurkers.game.Constants gameSpeedMultiplier 0.5 true | ゲーム速度を半分にして同期 |
| /set io.lurkers.game.Constants lightingEnabled false true | 照明を切る |
| /set io.lurkers.server.Server maxPeers 48 false | 同時接続数を48に |
| /set io.lurkers.game.Constants maxZoomLevelPlaying 5 true | ズームの最大段数を5に |
| /setc … | クライアント側だけに適用 |
| /sets … | サーバー側だけに適用 |
04固まったサーバーを外から再起動する
これは公式チートシートに書かれている、知らないと詰む仕様です。サーバーが壊れて参加できないとき、通常は管理画面から再起動できません。その場合は次のURLで接続すると、コマンドを送って再起動できます。
`https://lurkers.io/?command=restartserver` を開くだけです。このURL形式は任意のコマンドを渡せるので、`restartserver` 以外にも使えます。ただし mod 権限が必要です。
サーバーが空になったら自動で止める設定(`autoRestartWhenEmpty`)や、サーバーリストから隠す設定(`isPrivate`)も `/set` で切り替えられます。常時稼働させたくない個人サーバーでは、この2つを入れておくと課金とリソースの無駄が減ります。
- 壊れたサーバーへは `https://lurkers.io/?command=restartserver` で接続する
- このURLは任意のコマンドを渡せる(mod 権限が必要)
- 空になったら自動停止:`/set io.lurkers.game.Constants autoRestartWhenEmpty true`
- リストから隠す:`/set io.lurkers.server.GameServerHeadless isPrivate true`
- 試合終了時に再起動:`/lua function nextMap() Game:runCommand("schedulerestart 10 \"Scheduled update.\"") end`
05Luaでできること
チートシートに載っている例は、そのまま「このゲームで何ができるか」の一覧になります。ゾンビを100体出す、1秒に5体ずつ20体出す、銃を持ったNPCの軍団を作る、プレイヤーを別のプレイヤーの位置へ飛ばす、といった操作がワンライナーで書けます。
AIも動かせます。`LuaEntity:setZombieAI(npc)` でゾンビAIを、`setBaseAI(human)` で基本AIを割り当て、`human.inputController:moveTowards(player)` のように入力を直接注入できます。つまり「NPCが人間を追う」挙動を自分で組めます。
既存の関数を上書きして拡張することもできます。`triggerGameOver` を包んで追加処理を挟む例が公式に載っており、`local super = triggerGameOver` で元の関数を退避してから再定義する、Luaの定番の書き方です。
| やりたいこと | 書き方の例 |
|---|---|
| ゾンビを100体出す | `for i = 1, 100 do LuaEntity:spawnPhysicalEntity("Zombie", pos) end` |
| 1秒に5体ずつ20体 | `Timer:startTimer(function() ... end, i/5.0)` をループ |
| 位置をログに出す | `Game:addMessage(LuaEntity:getPlayer():getPosition())` |
| 別のプレイヤーの位置へ飛ぶ | `setPosition(Peer:getRandomPeer():getPlayer():getPosition())` |
| NPCにゾンビAIを付ける | `LuaEntity:setZombieAI(npc)` |
| NPCをプレイヤーへ歩かせる | `human.inputController:moveTowards(player)` |
| 既存関数を拡張 | `local super = triggerGameOver` して再定義 |
| ゲームオーバー処理を差し替え | `changeScript("bedwars_map_rotation", "maps/....png")` |