本文へスキップ
Gang Fights

スクリプトSDK · Luau

つくろう、自分だけのゲームモード。

Gang Fightsのサーバーは、Luau (新しいタブで開きます)(オプションの型を備えたLua)で書かれたリソースを実行します。サイコロを振るコマンドから本格的なロールプレイの街まで、サーバーで起きることならスクリプトで作れます。

状況:初期アルファ。 スクリプトAPIはメジャーバージョン内では拡張のみ行われるため、今書いたリソースは今後も動き続けます。カスタムモデル・テクスチャ・サウンドが次に登場します。

リソース

リソースは、サーバーのrecursos/フォルダー内にあるフォルダーで、resource.tomlマニフェストとスクリプトで構成されます。サーバースクリプトはサーバーで、クライアントスクリプトは各プレイヤーに送られてそのPCで動きます。サーバーに付属するゲームモードもすべてただのリソース。コピーして名前を変え、好きなように変更できます。

フォルダー構成
recursos/
  hello/
    resource.toml
    server/main.luau
    client/hud.luau        -- optional: runs on each player's PC
resource.toml
name = "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と入力するとその場で再読み込みされます。

hello/server/main.luau
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 minutes

APIでできること

サーバーAPIは小さく目的別のライブラリにまとめられています。プレイヤーは番号で識別されます。プレイヤーリストでニックネームの横に表示される番号です。

  • イベント

    参加、退出、ヒット、KO、アイテム、ラウンド、グラフィティ、メニュー選択、そしてリソース間の独自イベント。

  • チャットとコマンド

    色付きチャット、引数付きの/コマンド、入力候補、プレイヤー個別のメッセージ。

  • タイマー

    後で実行したり繰り返したりする処理のためのsetTimeout、setInterval、clearTimer。

  • プレイヤー

    ニックネーム、名前の色とタグ、管理者、キック、期間付きBAN、固定のプレイヤーID。

  • ファイター

    体力、チーム、スポーン地点、テレポート、キャラクター、フリーズ、無敵、リスポーン。

  • 警官

    任意のファイターを警官にし、手錠をかけたり外したり、手錠の鍵を配ったり。

  • クルーと命令

    6種類のクルー命令の取得と発行、ゲームのクルーとそのメンバーの操作。

  • アイテム

    武器や物を渡す・取り上げる・落とす、床にある物の一覧、重さの調整。

  • NPC

    名前、アイコン、待機アニメーション付きでその場にとどまるキャラクターを配置。店主、勧誘役、依頼人など。

  • ディメンション

    複数のマップを同時に動かし、ファイターを行き来させ、試合の合間にマップを切り替え。

  • マーカーとドア

    何かが起きる場所を示す浮遊マーカーと、各マップのドアの制御。

  • オブジェクト

    スクリプトやゲーム内エディターでマップオブジェクトを配置・移動・削除(1サーバーあたり最大5,000)。

  • グラフィティ

    スプレー用の壁を作成し、ロックやリセットを行い、各層の完成に反応。

  • ラウンドとモード

    ラウンドの開始・終了・中止。フリーローム、デスマッチ、ロールプレイならラウンドなしでも。

  • 画面UI

    テキスト、パネル、バー、画像、大きなアナウンス、番号付きメニュー、テキスト入力。

  • ウィンドウとクリック

    クリックできる描画、ラベル、アイテム画像、独自ウィンドウ用のフリーカーソル。

  • アイコンとゾーン

    各プレイヤーのマップ上のアイコンと色付きゾーン。

  • 保存データ

    サーバーを再起動しても消えない、リソースごとのキー・バリューストア。

  • パスワードとBAN

    サーバーアカウント用のソルト付きで意図的に低速なパスワードハッシュ、IDとIPによる期間指定可能なBAN。

クライアントスクリプト

クライアントスクリプトは各プレイヤー固有のもののためにあります。HUD、メニュー、キー割り当て、ローカルのチャットコマンド、カメラ、サウンドなど。各リソースはプレイヤーのPC上でそれぞれのサンドボックス内で動きます。

戦闘の状態を読むことはできますが、変更はできません。変更できると各PCで見えるものが食い違い、チートも簡単になってしまうからです。何かを変えたいときは、クライアントスクリプトがサーバーに頼み、サーバーが判断します。

player-hud/client/hud.luau
-- 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/に同梱されています。常に実行中のバージョンと一致します。