CounterStrikeSharpプラグインでNuGetパッケージとデータベースを使う
便利なプラグインの多くは、BAN情報、統計、ランクなどのデータを保存します。そのためにプロジェクトへNuGetパッケージを追加しますが、いちばん大切なルールは、データベースの応答を待つ間にゲームを止めないことです。このガイドでは、DapperとMySqlConnectorを例に、その両方を解説します。
パッケージを追加する
NuGetパッケージは、プロジェクトファイルに記述します。Dapperはクエリを短く書けるようにし、MySqlConnectorはMariaDBやMySQLと通信します。当社のコンパイラーは、ビルド時にこれらを自動でダウンロードします。
<ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.*" />
<PackageReference Include="Dapper" Version="2.*" />
<PackageReference Include="MySqlConnector" Version="2.*" />
</ItemGroup>
コンパイル時に起きること
ビルドすると、プラグインのDLLと、その横に、プラグインが必要とするパッケージのDLLが出力されます。CounterStrikeSharpがすでに含んでいるファイルは別のフォルダーに分けられるので、二重にコピーしてしまうことはありません。
サーバーにコピーするもの
パッケージのDLLが入ったプラグインのフォルダーを、サーバーのpluginsフォルダーにコピーします。dependenciesフォルダーはコピーしないでください。サーバーにはすでに同じファイルがあり、二重に置くと競合の原因になります。
ゲームを止めずにクエリを実行する
ゲームは1本のメインスレッドで動いています。そこでデータベースを待つと、サーバー全体がカクつきます。クエリはTask.Runの中で実行し、ゲームの操作に戻るときはServer.NextFrameでメインスレッドに戻ります。
using CounterStrikeSharp.API;
using Dapper;
using Microsoft.Extensions.Logging;
using MySqlConnector;
public void CountPlayers()
{
Task.Run(async () =>
{
await using var connection = new MySqlConnection(Config.ConnectionString); var count = await connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM players");
Server.NextFrame(() => {
Logger.LogInformation("Players in the database: {Count}", count);
});
});
}
接続文字列は設定ファイルに置く
アドレス、ユーザー名、パスワードをコードに書かないでください。設定ガイドで紹介した方法で、接続文字列をプラグインの設定に置けば、サーバー管理者がそれぞれ自分のデータベースを使えます。
プラグインに向かないパッケージ
パッケージによっては、大きすぎたり、ゲームサーバーの中で動かす前提で作られていなかったりします。ASP.NETのようなWebフレームワークがその例です。小さなライブラリーを選び、読み込めないパッケージがあれば、不足しているネイティブファイルが必要でないか確認してください。
本番の前にテストする
まずテストサーバーとテスト用データベースでプラグインを試してください。テーブルが作成されること、接続に失敗してもプラグインがクラッシュしないこと、データベースが停止しているときにログにわかりやすいメッセージが出ることを確認します。
このチュートリアルは役に立ちましたか?
Barlap コミュニティのために。