【GAME】ARMA3 EXILE MODサーバの旅その53
追記:Cargo関係メモ
追記:デバッグの週末
追記:AIカスタム装備
アドオン開発が終わらない。。
(;´Д`)
綺麗な線引した所で、決着を付けたいんです。
サウンド効果を追加する機能で調査してたんですが、結局のところ、クライアント部(要はミッションファイル)にコードを実装しなきゃならないので、アドオンの意味が無くなる。
よって、削除しました(;^ω^)
あれから変わった所は。
アイテムボックスの固定湧き、AI装備の設定を可能にするの2点。
MAP上に迷路があったり、高い山とか行きにくい場所のプライズ的に置けるかと思います。TANOAだったら、寺院とか小さい島とかね。
AIがDMS設定のまんまだと、装備が充実しすぎてて、プレーヤーっぽく無いのが理由(鹵獲されてしまう訳だし)
より、町で漁ってるプレーヤーっぽいテイにする。
Occupation Vehicleのパトロール車両です。
湧き場所指定できるけど、移動先はランダムです。
意味ない場所をパトロールしてる時があるので、これをなんとかしたい。サーバ負荷的にも、大量に出せないし。
最も大きな問題は、トレーダーエリアでも入ってくる点、ブラックリストに登録しても、それが適用されるのはスポーン地だけなんです。
やるとすれば、適切なウェイポイントを設定して、町の周囲やランドマーク間をパトロールさせたい。
しかしながら、Occupationの機能に完全に被ってしまうので、申し訳が立たない。どーしよう。
追記:
やっぱ、本サーバでは、Occupationをカスタマイズする方針でいこう。。(カスタマイズ内容は記事で紹介します)
これじゃいつまで経っても終わらない。
(;´Д`)
追記:AIカスタム装備
(;´Д`)
どないやっても、装備を変更できないんですよぉ。。
んで、気付いたのが、これ。
_unit enableSimulationGlobal false;
オブジェクトの一時無効化です。
アドオン内で、AI作成後すぐ無効化(フリーズ)してました。
この状態だと、装備の変更もでけへんじゃねぇーの?と。
sleep 0.5;
んで、解決したんが、これ。0.5秒もあれば、DMS側の処理も終わるだろうと・・
(;^ω^)
町で出くわすAIは、やっぱサブマシンガン系ですよ。
_group setBehaviour selectRandom[“SAFE","AWARE","COMBAT","STEALTH"];
ビヘイビアは、この様にしてるので、AIによって色々な行動します。
OccupationのAIで装備を設定できますが、ほとんどの項目はランダムで選択されます。
_weaponAttachments/_pistolAttachments/_backpackChance/_launcherChanceの4項目は、確立で無効化されます(アタッチメント、バックパック、ランチャー)
function/fnc_selectGear.sqfになりますので、必要ならば改造しましょう。私は、既にゴリゴリ弄ってます。
追記:デバッグの週末
ログを見続けて、エラーを見つけるんです。
ちゃんと作ってるつもりですが、やっぱバグは出てきますねぇ。。
今日の午後を潰してくれたバグをご紹介。
上写真のようなログが出た場合です。普通にサーバを運営してたら出ないログですけどね。
(;´∀`)
DMSアドオン内で出てるエラーなんですが、AIのキャパを超える装備品を設定した場合に出るモンです。
これに気付くまで、どんだけ時間を費やしたか・・・。
。゚(゚´Д`゚)゚。
皆さんもお気をつけください(日本には居ないでしょうけど)
追記:
早とちりでした。
DMS内で、通常アイテム分は以下のような特別なコードで書かれてまして、なぜか別スレッド内で遅延実行されてました。Arma3仕様で何かあるようです。
addMagazinesコマンド内に、装備可能なモノを入れちゃうとエラーとなってしまうようでした。
[
0.5,
{
params
[
“_unit",
“_magazines",
“_assignedItems"
];
{
if (_x isEqualType “") then
{
_x = [_x,1];
};
_unit addMagazines _x;
} forEach _magazines;
{
if (_x in [“Binocular","Rangefinder","Laserdesignator","Laserdesignator_02″,"Laserdesignator_03″]) then
{
_unit addWeapon _x;
}
else
{
_unit linkItem _x;
};
} forEach _assignedItems;
},
[_unit,_magazines,_assignedItems],
false,
false
] call ExileServer_system_thread_addTask;
かなりバグ潰しできたんじゃないだろうか。
(;´Д`)
追記:Cargo関係メモ
ユニットに、アイテムを与える際に、武器か弾、バックパック、装備品かで、コマンドが分けられてます。
addMagazines、addWeapon、linkItemとか。
入れられる場所は、服やベスト、バックパックと複数ありますが、それぞれのコンテナを取得するには。
uniformContainer、vestContainer、backpackContainerなど。
これは、コンテナや車両は、ただの倉庫扱いなのでシンプルです。
んで、こういうのを自動化したいな・・と前々から思ってた所、Exile側(exile_client.pbo)のコードを見ていたら発見しました。
これで、クラス名から、武器なのか、弾なのか、地雷、アイテムなどを判別できるようです。returnは、[カテゴリ,アイテム種類]です。
これは便利(゚∀゚)ノ
でも、MOD関連のモノまで判別できるのかは、未調査です。Exileコードで利用してるので、多分大丈夫だと思うけども。
ゲーム中は、何気に色々なアイテムを入手してますが、内部では涙ぐましい処理がされてます。
ExileClient_util_playerCargo_add.sqf
try
{
if ([_player, _itemClassName] call ExileClient_util_playerEquipment_canAdd) then
{
throw ([_player, _itemClassName, _bulletCount] call ExileClient_util_playerEquipment_add);
};
if (_player canAddItemToUniform _itemClassName) then
{
throw ([(uniformContainer _player), _itemClassName, _bulletCount] call ExileClient_util_containerCargo_add);
};
if (_player canAddItemToVest _itemClassName) then
{
throw ([(vestContainer _player), _itemClassName, _bulletCount] call ExileClient_util_containerCargo_add);
};
全てのコンテナに入れられるか逐一チェックしてます。もちろん、例外処理内です(エラーを想定)
追記:Exileユーティリティ
自前で書くこともできますが、EXILE専用だし、出来るだけ利用した方がええんでしょう。
まだ全体を見た訳ではありませんが、ちょっとだけ。
ExileClient_system_thread_addTask
バックグランドタスクを登録できる
ExileClient_util_array_shuffle
この前自前で作ったんですが、配列のシャッフルもありました。
ExileClient_util_math_floor
浮動小数点まるめとか(これは使わんな・・)
ExileClient_util_playerCargo_add
ユニットへのアイテム装備(今使わせてもらってる)
ExileClient_util_playerCargo_takeAll
TakeAllをクリックした時の処理、装備可能なものを優先にしてます。鹵獲の時の処理も入ってる。
ExileClient_util_world_isInTraderZone
トレーダーエリアかどうかを判断してくれる。Boolで帰る
みたいなモノがたんまり入ってます。
やっぱEXILE MODを開発した人らしく、もの凄くコードが洗練されてます。ただ、Arma2時代のコード遺産も残ってるらしく、古い書き方もあるようでした。