スクリプトSDK · Luau
つくろう、自分だけのゲームモード。
状況:初期アルファ。 スクリプトAPIはメジャーバージョン内では拡張のみ行われるため、今書いたリソースは今後も動き続けます。カスタムモデル・テクスチャ・サウンドが次に登場します。
リソース
リソースは、サーバーのrecursos/フォルダー内にあるフォルダーで、resource.tomlマニフェストとスクリプトで構成されます。サーバースクリプトはサーバーで、クライアントスクリプトは各プレイヤーに送られてそのPCで動きます。サーバーに付属するゲームモードもすべてただのリソース。コピーして名前を変え、好きなように変更できます。
recursos/
hello/
resource.toml
server/main.luau
client/hud.luau -- optional: runs on each player's PCname = "hello"
version = "1.0.0"
description = "Says hello"
author = "You"
server_scripts = ["server/main.luau"]
client_scripts = [] # sent to each player and run on their PC
dependencies = [] # resources that must be running first
gamemode = false # true: this resource runs the rounds
autostart = trueはじめてのリソース
参加したプレイヤーにあいさつし、/diceコマンドを追加しましょう。サーバーを起動すればリソースが動き、編集後はサーバーコンソールでrestart helloと入力するとその場で再読み込みされます。
on("playerJoin", function(player: number)
players.message(player, "Hello, " .. (players.name(player) or "?") .. "!")
end)
registerCommand("dice", function(player: number)
chat.broadcast((players.name(player) or "?") .. " rolls " .. math.random(1, 6))
end)> resources # list what's running
> restart hello # reload after editing — no server restart
> players
> say Round starts in 1 minute
> ban 7 60 spamming # by player number, for 60 minutesAPIでできること
サーバーAPIは小さく目的別のライブラリにまとめられています。プレイヤーは番号で識別されます。プレイヤーリストでニックネームの横に表示される番号です。
イベント
参加、退出、ヒット、KO、アイテム、ラウンド、グラフィティ、メニュー選択、そしてリソース間の独自イベント。
チャットとコマンド
色付きチャット、引数付きの/コマンド、入力候補、プレイヤー個別のメッセージ。
タイマー
後で実行したり繰り返したりする処理のためのsetTimeout、setInterval、clearTimer。
プレイヤー
ニックネーム、名前の色とタグ、管理者、キック、期間付きBAN、固定のプレイヤーID。
ファイター
体力、チーム、スポーン地点、テレポート、キャラクター、フリーズ、無敵、リスポーン。
警官
任意のファイターを警官にし、手錠をかけたり外したり、手錠の鍵を配ったり。
クルーと命令
6種類のクルー命令の取得と発行、ゲームのクルーとそのメンバーの操作。
アイテム
武器や物を渡す・取り上げる・落とす、床にある物の一覧、重さの調整。
NPC
名前、アイコン、待機アニメーション付きでその場にとどまるキャラクターを配置。店主、勧誘役、依頼人など。
ディメンション
複数のマップを同時に動かし、ファイターを行き来させ、試合の合間にマップを切り替え。
マーカーとドア
何かが起きる場所を示す浮遊マーカーと、各マップのドアの制御。
オブジェクト
スクリプトやゲーム内エディターでマップオブジェクトを配置・移動・削除(1サーバーあたり最大5,000)。
グラフィティ
スプレー用の壁を作成し、ロックやリセットを行い、各層の完成に反応。
ラウンドとモード
ラウンドの開始・終了・中止。フリーローム、デスマッチ、ロールプレイならラウンドなしでも。
画面UI
テキスト、パネル、バー、画像、大きなアナウンス、番号付きメニュー、テキスト入力。
ウィンドウとクリック
クリックできる描画、ラベル、アイテム画像、独自ウィンドウ用のフリーカーソル。
アイコンとゾーン
各プレイヤーのマップ上のアイコンと色付きゾーン。
保存データ
サーバーを再起動しても消えない、リソースごとのキー・バリューストア。
パスワードとBAN
サーバーアカウント用のソルト付きで意図的に低速なパスワードハッシュ、IDとIPによる期間指定可能なBAN。
クライアントスクリプト
クライアントスクリプトは各プレイヤー固有のもののためにあります。HUD、メニュー、キー割り当て、ローカルのチャットコマンド、カメラ、サウンドなど。各リソースはプレイヤーのPC上でそれぞれのサンドボックス内で動きます。
戦闘の状態を読むことはできますが、変更はできません。変更できると各PCで見えるものが食い違い、チートも簡単になってしまうからです。何かを変えたいときは、クライアントスクリプトがサーバーに頼み、サーバーが判断します。
-- client/hud.luau
setInterval(function()
local me = fighters.get(localPlayer.fighter() or -1)
if me then
ui.text("hp", "Health " .. math.floor(me.health), { position = "bottom-right" })
end
end, 200)
on("keyDown", function(key)
if key == "F3" then
emitServer("askStats") -- handled on the server with onClient("askStats", ...)
end
end)サンドボックスと制限
外部アクセスなし
スクリプトはファイル、ネットワーク、OSに触れられず、API関数を置き換えることもできません。
1回の実行は250ms
一度に長く動きすぎたスクリプトは停止されるため、無限ループでサーバーが固まることはありません。
リソースごとに64MB
各リソースには専用のメモリ枠があります。
エラーは局所化
エラーはリソース名付きでサーバーログに記録され、リソースは動き続けます。
エディター対応: SDKにはサーバーとクライアントのAPIの型定義が付属します。luau-lsp (新しいタブで開きます)(例:VS CodeのLuau拡張機能)に追加すれば、補完と型チェックが使えます。
付属のテンプレート
どのサーバーにも次のリソースが付属します。ゲームに特別なものは何もなく、あなたのリソースでも同じこと、それ以上のことができます。
- welcome
- プレイヤーにあいさつし、保存データで訪問回数を数えます。
- basic-commands
- /players と、チャットへの定期的なヒント。
- player-hud
- クライアントスクリプト:HUD、F2で非表示、F3でサーバーに自分の戦績を問い合わせ。
- scoreboard
- KO表、大きな文字のラウンド表示、/stats メニュー。
- fight-basics
- KOとラウンド勝者を告知。/heal と /where 付き。
- deathmatch
- ラウンドなしのモード:リスポーン、キルフィード、先に10KOで勝利。
- roleplay
- アカウント、キャラクター、位置の保存、病院、地区間の地下鉄。
- roleplay-chat
- ローカルチャット、/me、/do、/shout、/ooc など。
- mapvote
- 各試合の終わりに次のマップを投票。
- mapping
- マップオブジェクトとゲーム内配置エディター。
- admin
- マップ上を自由に飛び回るなどの管理者ツール。
サーバーの運用
手軽な対戦ならゲームのメニューから立て、専用サーバーならゲームフォルダーのCreateServer.batでパッケージを作成します。対象のOS(WindowsかLinux)とマップを尋ねられ、サーバープログラム、データ、リソース、servidor.cfg、SDKドキュメントの入ったフォルダーが作られます。
- Linux: Ubuntu 24.04以降またはDebian 12以降(64ビット)、ALSAとudevのライブラリが必要です。
- ポート: ゲーム用にUDP 27015、サーバー検索用にUDP 27016(または設定したポートとその次の番号)。
- アップデート: 新しいバージョンが出ると、サーバーが起動時に知らせます。ゲームを更新してパッケージを作り直し、プログラムとデータを入れ替えれば、設定とリソースはそのまま残ります。
- 個人データ: パッケージの
data/フォルダーはあなた自身のオリジナルゲームから生成されます。決して公開しないでください。
完全リファレンス
すべての関数・イベント・オプションを網羅したAPIリファレンスは、各サーバーパッケージのsdk/README.mdに、エディター用の型定義はsdk/types/に同梱されています。常に実行中のバージョンと一致します。