fivem-dev について
fivem-devは、LuaとNUI(JS/TS)でFiveMリソースを開発する方向けのドキュメント参照スキルです。QBox、QBCore、ESXに対応し、API使用前の公式資料による確認や、フレームワーク判定、開発パターンを扱います。
主な機能
- 01FiveMネイティブとフレームワーク資料の参照
- 02QBox、QBCore、ESXの判定
- 03LuaとNUI開発のガイド
- 04リソース構成と性能パターン
- 05サーバー側検証とセキュリティの重視
活用シーン
- 01FiveMネイティブ関数と引数の確認
- 02異なるフレームワーク向けのリソース開発
- 03NUIインターフェースの構築
- 04リソースの性能とセキュリティの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ melihbozkurt10/ fivem-dev-plugin --skill fivem-devインストール後、Claude Code で/fivem-devを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.npmignoreREADME.md.cursorrulesFIVEM_CURSOR_RULES.mdpackage.json.claude-plugin/marketplace.jsonplugin.json.github/workflows/publish.ymlassets/asset-discovery.mdcommands/fivem-dev.mdframeworks/esx.mdqbox.mdframework-detection.mdqbcore.mdresources/manifest.mdox-lib-guide.mdscripting/client-server.mdnui-guide.mdthread-management.mdlua-patterns.mdscripts/install.js詳細
FiveM 開発
FiveM リソース開発向けの動的ドキュメントオーケストレーターです。 Lua と NUI(JS/TS)を使用する QBox、QBCore、ESX フレームワークに対応しています。
基本方針
- 記憶せず、取得する - 常に信頼できる情報源から最新情報を取得します
- フレームワークに依存しない考え方 - パターンを理解し、フレームワークに合わせて応用します
- パフォーマンスを最優先する - FiveM のティック予算は厳格です
- セキュリティを重視する - サーバー側での検証は必須です
重要:ハルシネーション禁止ポリシー
ネイティブ関数、フレームワーク API、パラメーターを決して捏造したり、推測したりしないでください。
ルール:
- ネイティブ関数が不明な場合 → https://docs.fivem.net/natives/ から必ず取得してください
- フレームワーク API が不明な場合 → 公式ドキュメントから必ず取得してください
- 関数が存在しない場合 → 正直にユーザーに伝え、代替案を提示してください
- パラメーターが不明な場合 → 推測せず、ドキュメントを取得してください
ネイティブ関数や API の呼び出しを書く前に:
- これは実在する FiveM ネイティブ関数ですか? → docs.fivem.net/natives で確認します
- 関数名は正しいですか? → 正確なスペルを確認します
- パラメーターは正しいですか? → パラメーターの順序と型を確認します
- クライアント、サーバー、または両方で動作しますか? → 利用可能な環境を確認します
わからない場合:
"I'm not 100% certain about this native/API. Let me fetch the documentation..."
[Use WebFetch to get accurate info]
検証元:
| 種類 | 情報源 | アクション |
|---|---|---|
| ネイティブ関数 | https://docs.fivem.net/natives/ | WebFetch またはユーザーに確認を依頼 |
| QBox API | https://docs.qbox.re/ | WebFetch |
| QBCore API | https://docs.qbcore.org/ | WebFetch |
| ESX API | https://docs.esx-framework.org/ | WebFetch |
| ox_lib | https://overextended.dev/ox_lib | WebFetch |
| プロップ/車両 | https://forge.plebmasters.de/ | 検索方法をユーザーに案内 |
例 - 誤り:
-- DON'T: Inventing a native that might not exist
SetPlayerInvincible(playerId, true) -- Is this real? What are the params?
例 - 正しい:
-- DO: Use verified native with correct params
SetEntityInvincible(PlayerPedId(), true) -- Verified at docs.fivem.net
コンテンツ一覧
リクエストに関連するファイルのみを読みます:
| ファイル | 説明 | 読むタイミング |
|---|---|---|
frameworks/framework-detection.md | アクティブなフレームワークの検出 | 新しいタスクの開始時 |
frameworks/qbox.md | QBox のエクスポート、パターン | QBox プロジェクト |
frameworks/qbcore.md | QBCore のイベント、エクスポート | QBCore プロジェクト |
frameworks/esx.md | ESX xPlayer、イベント | ESX プロジェクト |
scripting/lua-patterns.md | FiveM 向け Lua のイディオム | Lua の記述時 |
scripting/nui-guide.md | NUI の HTML/CSS/JS パターン | UI の構築時 |
scripting/client-server.md | アーキテクチャパターン | 新しいリソース |
scripting/thread-management.md | パフォーマンスパターン | 最適化時 |
resources/manifest.md | fxmanifest.lua リファレンス | リソースの設定時 |
resources/ox-lib-guide.md | ox_lib ユーティリティ | ox_lib の使用時 |
assets/asset-discovery.md | GTA V アセットの検索 | プロップ、車両、ペッド |
動的取得 - 判断フロー
ステップ 1:リクエストを分類する
| ユーザーの質問 | アクション |
|---|---|
| ネイティブ関数(GetPlayerPed、CreateVehicle など) | ネイティブ関数のドキュメントから取得 |
| フレームワーク API(QBCore.Functions、ESX.GetPlayerData) | フレームワークのドキュメントから取得 |
| ox_lib の機能(lib.callback、lib.notify) | ox_lib のドキュメントから取得 |
| GTA V アセット(プロップ、車両、ペッドモデル) | PlebMasters へ案内 |
| リソースの構造、マニフェスト | ローカルファイルを読む |
| ベストプラクティス、パターン | ローカルファイルを読む |
ステップ 2:WebFetch の URL
ネイティブ関数
ベース URL: https://docs.fivem.net/natives/
WebFetch(
url: "https://docs.fivem.net/natives/",
prompt: "Find documentation for the native function '{FUNCTION_NAME}'.
Include: parameters, return values, usage examples,
client/server availability."
)
ネイティブ関数のカテゴリ:
| カテゴリ | 含まれる関数 |
|---|---|
| PLAYER | GetPlayerPed、GetPlayerServerId、PlayerId |
| VEHICLE | CreateVehicle、SetVehicleMod、GetVehicleClass |
| PED | CreatePed、SetPedComponentVariation、IsPedInVehicle |
| ENTITY | GetEntityCoords、SetEntityHeading、DeleteEntity |
| GRAPHICS | DrawRect、DrawText3D、DrawMarker |
| UI | SetTextEntry、BeginTextCommandDisplayText |
| CAM | CreateCam、SetCamActive、RenderScriptCams |
| AUDIO | PlaySoundFrontend、PlayAmbientSpeech1 |
| WEAPON | GiveWeaponToPed、GetSelectedPedWeapon |
| CFX | Statebags、サーバー固有のネイティブ関数 |
フレームワークのドキュメント
QBox:
WebFetch(
url: "https://docs.qbox.re/",
prompt: "Find documentation for QBox '{FEATURE}'.
Include exports, events, and usage examples."
)
QBCore:
WebFetch(
url: "https://docs.qbcore.org/qbcore-documentation/",
prompt: "Find documentation for QBCore '{FEATURE}'.
Include: function signature, parameters, examples."
)
ESX Legacy:
WebFetch(
url: "https://docs.esx-framework.org/",
prompt: "Find documentation for ESX '{FEATURE}'.
Include: xPlayer methods, events, server/client functions."
)
ox_lib:
WebFetch(
url: "https://overextended.dev/ox_lib",
prompt: "Find documentation for ox_lib '{MODULE}'.
Include: function signatures, options, examples."
)
アセットの検索
PlebMasters Forge:
WebFetch(
url: "https://forge.plebmasters.de/",
prompt: "Search for GTA V {ASSET_TYPE} matching '{SEARCH_TERM}'.
Return model names/hashes that can be used in FiveM."
)
アセットの種類: オブジェクト、乗り物、ペッド、武器、服、アニメーション
リクエストルーター — パターンマッチング
ルール 1:ネイティブの検出
次の場合に検出します:
- 特定のネイティブ名(
GetPlayerPed、CreateVehicleのようなパスカルケース) - 「native function」、「GTA native」、「FiveM native」
- ハッシュ参照(
0x...)
アクション: https://docs.fivem.net/natives/から取得
ルール 2:フレームワーク API の検出
次の場合に検出します:
QBCore.Functions.*、QBCore.Player.*exports.qbx_core:*、exports['qb-core']:*ESX.Get*、xPlayer:*、ESX.RegisterServerCallbackexports.es_extended:*
アクション: フレームワークを検出 → 適切なドキュメントから取得
ルール 3:ox_lib の検出
次の場合に検出します:
lib.*関数exports.ox_lib:*- モジュール:callback、notify、menu、context、progress、zones、target
アクション: https://overextended.dev/ox_libから取得
ルール 4:アセットの検索
次の場合に検出します:
- 「What's the model for...」、「prop name for...」、「vehicle spawn name」
- オブジェクトの配置、ペッドモデル、武器モデル
アクション: PlebMasters Forgeを案内し、使用例を提示
ルール 5:ローカルナレッジ
次の場合に検出します:
- fxmanifest.luaの構造
- クライアント/サーバーのパターン
- スレッド管理
- プロジェクトの構成
アクション: 関連するローカルのMarkdownファイルを読む
フレームワークの自動検出
タスクを開始するときに、プロジェクトファイルから有効なフレームワークを検出します。
fxmanifest.luaを確認
-- QBox indicators
dependency 'qbx_core'
dependency 'ox_lib'
-- QBCore indicators
dependency 'qb-core'
-- ESX indicators
dependency 'es_extended'
dependency 'esx_core'
コードのインポートを確認
-- QBox
local QBX = exports.qbx_core:GetCoreObject()
-- QBCore
local QBCore = exports['qb-core']:GetCoreObject()
-- ESX
local ESX = exports.es_extended:getSharedObject()
ベストプラクティス(クイックリファレンス)
パフォーマンスのルール
| ルール | 理由 |
|---|---|
ループ内でWait(0)を避ける | CPUを消費し、ラグの原因になります |
| プレイヤーのペッドをキャッシュする | local ped = cache.ped or PlayerPedId() |
| ox_libのtargetを使う | 距離チェックより優れています |
| イベントよりStatebagを使う | 状態の同期がより効率的です |
セキュリティのルール
| ルール | 理由 |
|---|---|
| サーバー側で検証する | クライアントは改ざんされる可能性があります |
| プレイヤーの入力をサニタイズする | インジェクションを防ぎます |
| コールバックを使う | イベントの悪用を防ぎます |
| 操作をレート制限する | スパムや悪用を防ぎます |
リソースの構成
resource_name/
├── fxmanifest.lua
├── config.lua
├── client/
│ └── main.lua
├── server/
│ └── main.lua
├── shared/
│ └── config.lua
└── html/ # NUI
├── index.html
├── style.css
└── script.js
フレームワークに依存しないパターン
local Framework = {}
if GetResourceState('qbx_core') ~= 'missing' then
Framework.Core = exports.qbx_core:GetCoreObject()
Framework.Type = 'qbox'
elseif GetResourceState('qb-core') ~= 'missing' then
Framework.Core = exports['qb-core']:GetCoreObject()
Framework.Type = 'qbcore'
elseif GetResourceState('es_extended') ~= 'missing' then
Framework.Core = exports.es_extended:getSharedObject()
Framework.Type = 'esx'
end
return Framework
アンチパターン
| しないこと | すること |
|---|---|
while true do Wait(0) | 適切な待機処理またはイベントを使う |
| クライアントのデータを信頼する | 常にサーバーで検証する |
| フレームワークをハードコードする | 動的に検出する |
| 毎フレームデータを取得する | 更新間隔を設けてキャッシュする |
| グローバル変数 | ローカル変数を使い、カプセル化する |
関連スキル
| 必要なもの | スキル |
|---|---|
| NUIのデザイン | frontend-design |
| データベース設計 | database-design |
| セキュリティ監査 | vulnerability-scanner |
| パフォーマンス | performance-profiling |