【GAME】ARMA3 EXILE MODサーバの旅その53

2018年4月21日プライベートarma3,dayz,exile,mod,server

追記:Exileユーティリティ

追記:Cargo関係メモ

追記:デバッグの週末

追記:AIカスタム装備

アドオン開発が終わらない。。

(;´Д`)

綺麗な線引した所で、決着を付けたいんです。

サウンド効果を追加する機能で調査してたんですが、結局のところ、クライアント部(要はミッションファイル)にコードを実装しなきゃならないので、アドオンの意味が無くなる。

よって、削除しました(;^ω^)

あれから変わった所は。

アイテムボックスの固定湧き、AI装備の設定を可能にするの2点。

MAP上に迷路があったり、高い山とか行きにくい場所のプライズ的に置けるかと思います。TANOAだったら、寺院とか小さい島とかね。

AIがDMS設定のまんまだと、装備が充実しすぎてて、プレーヤーっぽく無いのが理由(鹵獲されてしまう訳だし)

より、町で漁ってるプレーヤーっぽいテイにする。

あともう1点だけ、気になってるモンがある。

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を参考にしたので、コードを追った記録をちょっとだけ書きます。

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関係メモ

Arma3には様々なアイテムがあって、自動化されてる関係上、なんだかキナ臭い印象もあります。

ユニットに、アイテムを与える際に、武器か弾、バックパック、装備品かで、コマンドが分けられてます。

addMagazines、addWeapon、linkItemとか。

入れられる場所は、服やベスト、バックパックと複数ありますが、それぞれのコンテナを取得するには。

uniformContainer、vestContainer、backpackContainerなど。

これは、コンテナや車両は、ただの倉庫扱いなのでシンプルです。

んで、こういうのを自動化したいな・・と前々から思ってた所、Exile側(exile_client.pbo)のコードを見ていたら発見しました。

BIS_fnc_itemType

これで、クラス名から、武器なのか、弾なのか、地雷、アイテムなどを判別できるようです。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_client.pbo(@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時代のコード遺産も残ってるらしく、古い書き方もあるようでした。

2018年4月21日プライベートarma3,dayz,exile,mod,server

Posted by nabe