FiveMでプラグイン開発をする

# FiveMとは
GTA5のシングルプレイやマルチプレイにアレンジを加えて、ロールプレイや様々なアイテムやシステムを追加して遊ぶMOD。本記事ではマルチプレイ用のFiveMを指す。
有志が沢山のサーバーやプラグインを提供していて、サーバーによっては500人ぐらいが同じサーバーで遊んでいたりする。
日本サーバーも昨今のイベントで活発になってきている模様。
なお、GTAオンラインとは**全く別物なので注意**。

以前は非公式のMODとして開発停止などを要求されていたが、FiveM開発元のCfx.reがRockstar Gamesの開発チームに参加したらしい。**いわば事実上の公認MOD**。


https://twitter.com/RockstarGames/status/1689969964923432960

だがしかしプラグインなどには著作権など法に触れるようなコンテンツもあるので取り扱いには気をつけたい。
個人が作っているプラグインがほとんどなので脆弱性などにも気をつけよう。

https://www.nullpt.rs/hacking-gta-servers-using-web-exploitation


クライアントがほぼ別なのでFiveMを導入してもGTAオンラインには入れる。
当然だが、FiveMはGTAオンラインと別サーバーではあるがGTA5を購入していない人は遊べない。（ログインチェックが入る）

他は公式FAQを要チェック。

https://docs.fivem.net/docs/support/client-faq/

# 必要な開発環境
本記事では公式マニュアルに則って話を進めるためこちらは必読。

https://docs.fivem.net/docs/

インストールしてFiveMが起動できるところからスタート。

クライアントのシステム要件はここに記述されているスペックが必要。（大型サーバーだとこれでは足りないが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/78e9a261-48b9-c680-ed18-956f1cf17de0.png)


- **必須**
<dl>
    <dt>GTA5</dt>
  <dd>当然ながらGTA5が必要。それと同時にSocial Clubのアカウントも作成する。（前記したログインチェックのため）</dd>
  <dt>サーバー</dt>
  <dd>本記事ではWindowsのサーバーを使うが、簡単な開発だけで公開はしない。そのためサーバーを公開したい人などは別にサーバーを用意する。</dd>
  <dd>Linuxサーバーでも動く。</dd>
</dl>

- **推奨**
<dl>
    <dt>VSCode</dt>
    <dd>言わずもがな定番のエディター。</dd>
    <dt>XAMPP</dt>
    <dd>データベースが必要だが用意するのが面倒なので使う。他のRDBMSがあるならそちらでもOK。</dd>
    <dd>余談だがXAMPPのRDBMSはMariaDBである。</dd>
    <dd>自前でデータベースを用意する場合はポートの設定を忘れないようにすること</dd>
</dl>

- **非推奨**
<dl>
    <dt>FxDK</dt>
    <dd>公式のエディターだが何かと不便なので直接クライアントを起動しながらのデバッグが良い。</dd>
    <dd>というのもプラグインの再読み込みがクライアント起動中に可能であり、なおかつそのまま動くのであまり使う必要もなく、特別に使いたいという理由がなければオススメはしない。</dd>

</dl>

開発言語はLua, C#, JavaScriptと用意されているが一般的にはLuaが使用されているのでLuaを使う。
なお筆者はLuaを触ったことがないので基礎からとなる。予めご了承頂きたい。

# サーバーの用意

txAdminを使うのが非常に楽なので頼ることにする。
余程のことがない限りは機能の少ないバニラ環境を使うことは無い。

このガイドに沿ってサーバーのインストールまでを終わらせる。
セットアップにあたってライセンスキーが必要なのでこちらも取得しておく。
なお、項目8において選ぶテンプレートを今回は変える
`CFX Default`ではなく`QBCore Framework`を使用する。

画像付きなので自動翻訳を使いながらやれば簡単にできる。

https://docs.fivem.net/docs/server-manual/setting-up-a-server-txadmin/

https://keymaster.fivem.net/

サーバーを立ち上げる際はXAMPPのMySQL（表記上はMySQLだが実際はMariaDB）を起動しておく必要がある。

# コーディング
なお本記事では入門編であるため簡単なプラグインしか作らない。
ゲーム内アイテムの実装等は後日。

Luaの作法を知らないので調べた一例。グローバル変数は非推奨とのこと。
他の言語と同じような作法だと思われる
```lua:sample.lua
myVariable = false -- Don't use this
local myVariable = false -- Use this

function someFunction() -- Don't use this
    print('Im a global function!')
end

local function someFunction() -- Use this
    print('Im a local function!')
end

--https://docs.qbcore.org/qbcore-documentation/guides/script-optimization より
```

https://docs.qbcore.org/qbcore-documentation/guides/script-optimization

大体ココに載ってるので見ながらが便利。

**クライアント側でプレイヤーとのお金やアイテム等のトランザクションはするな**とも書いてあるので気をつけよう。（セキュリティ的な問題で）

今回は簡単なコマンドを登録してコマンドを入力するとメッセージが送信されるプラグインを作る。
まずはFxServerのインストール先に移動してフォルダを作成する。今回は適当に選んだ。
`D:\FiveM\txData\QBCoreFramework_******.base\resources\[myplugins]\mymsg`

`\mymsg`下に`fxmanifest.lua`を作成する。
中身はこうする

```lua:fxmanifest.lua
fx_version 'cerulean' 
game 'gta5'

author 'IROHAS' --制作者の名前
description 'Test Plugin' --プラグインの説明
version '1.0.0' --バージョン

client_script 'client.lua' --実行するクライアント側のスクリプト
server_script 'server.lua' --実行するサーバー側のスクリプト
```

同じディレクトリに`client.lua`を作成する

```lua:client.lua
RegisterCommand('testmsg', function(source, args)
    TriggerEvent('chat:addMessage', {
        args = { 'テストメッセージです。クライアントにしか表示されません' }
    })
end, false)
```

関数の詳細

https://docs.fivem.net/natives/?_0x5FA79B0F

この二つが出来たらサーバーにリソースとして読み込ませるために`\txData\QBCoreFramework_EF69C6.base`下にある`server.cfg`を編集。
登録すれば`fxmanifest.lua`があるフォルダを自動で読み込んでくれる

```config:server.cfg
#   ____  ____   _____
#  / __ \|  _ \ / ____|
# | |  | | |_) | |     ___  _ __ ___
# | |  | |  _ <| |    / _ \| '__/ _ \
# | |__| | |_) | |___| (_) | | |  __/
#  \___\_\____/ \_____\___/|_|  \___|

## FiveM Documentation
## https://aka.cfx.re/server-commands

## QBCore Documentation
## https://docs.qbcore.org

## You CAN edit the following:
endpoint_add_tcp "0.0.0.0:32160" #TCPのポート番号を設定
endpoint_add_udp "0.0.0.0:32160" #UDPのポート番号を設定
sv_maxclients 48
set steam_webApiKey "none"
sets tags "default, deployer, qbcore, qb-core"

...

# QBCore & Extra stuff
ensure qb-core
ensure [qb]
ensure [standalone]
ensure [voice]
ensure [defaultmaps]

# test plugin 
ensure [myplugins]
...
```



`XAMPP`でSQLを立ち上げる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/b836a134-b990-368d-1895-b397ea689116.png)

`txData`より上のディレクトリにある`start_****_default.bat`を実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/c7c19b8c-1c04-42be-a8c7-0dd61fcb2689.png)

この画面になったらブラウザで`localhost:40120`に接続する
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/4ca2cfdf-c3f0-5391-ab6e-fb1a11ef72cd.png)

このページでログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/415f48b1-da6c-fd79-d9c2-d5059145fbd4.png)

ダッシュボードのステータスが`Online`なら起動している
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/d4d9b48a-53ae-5ff9-191c-110edfd00807.png)

FiveM側で接続。ローカルサーバーなので`server.cfg`で設定したポートで`127.0.0.1`に接続となる。
今回は`127.0.0.1:32160`である。

F8を押しコンソール開いて`connect 127.0.0.1:32160`と入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/63fa2a83-c6c7-a5da-7d7a-d6b8611950c6.png)

そうすると接続できるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/f03a3888-44b0-b7e7-3e24-4eed151fee6d.png)

ここで接続できない場合は何かしらのセットアップが出来ていないので公式のドキュメントを読もう。

ゲーム内で`T`キーを押しチャットを開く。
そして`/testmsg`と入力するとコマンドが実行される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/5b01beac-7780-30ab-3ef5-d2c2d2dff5de.png)

実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/e230db2a-c13d-84b1-1aea-7fc96e8f2c6a.png)

前述した通り、サーバーとクライアントが起動中でもプラグインを再読込することができる。

メッセージを編集してみる。
```lua:client.lua
RegisterCommand('testmsg', function(source, args)
    TriggerEvent('chat:addMessage', {
        args = { 'メッセージを変更してみました。' }
    })
end, false)
```

txAdmin左のパネルにある`Resource`を開く。すると自分が登録したプラグインがあるので`Restart`ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/dff6bd6e-7eb2-613d-8d10-3c58b479e41b.png)
左のパネルにある`Live Console`から`restart プラグイン名`でも同じことができる。

再読み込みが出来たか確認の為にもう一度ゲーム内チャットで`/testmsg`と入力してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2170587/50634947-3bd1-27c0-5b87-ac46b0466a30.png)

変更出来た。

次回はもう少し複雑なプラグインを作ってみる。

### 2025/01/13追記
使いそうなものメモりました

https://qiita.com/IR0IR0/items/f7c2a00032a68ebcabb3

具体的なプラグイン実装とかも書きます