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

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

追記:アドオン新機能追加

追記:4/12Arma3大型アップデート

追記:スモークどうやる?

追記:アドオンAI挙動設定追加

EXILE1.0.4サーバ構築を続けておりますが。。

やっぱ、一度足を入れてしまったArma3スクリプティング、気になってるモノが、チョイチョイあった訳で、平行で調査しております。

ついでにアドオンの改良もしております。

そういえば、SimpleObjectの存在を忘れていたので、オブジェクト配置系を、これに刷新してます。

これで、サーバ負荷を10~20%程度下げられます。

もちろん、使わない理由は無かったんですが、ただ一つ、アレがついて回るんですよ。

座標ズレ m9( ゚д゚)!!!!

SimpleObjectは、通常のCreateVihecle(AGL系)とは違い、ASL座標系で扱わないといけないんです(これが原因)

※ATL/AGLは地表基準で、ASLは絶対座標なのです(Z軸)

exile_3den.pbo(プラグイン)でシコシコ置いたオブジェクトがズレてたでしょ?ズレる理由が、このASL変換によるものなのです。

これが・・、完全解決しましたッ!!!(副産物)

(゚∀゚)ノ

公式はこちら

ここの下の方に追記という形で参考コードが書かれてました。

(;^ω^)気付かんかった

一度、AGLのCreateVihecleで作成して、綺麗なポジションを確保した上で、位置をコピーするとええでぇ~(大阪弁風)

・・と。

単純にSimpleObject化しただけだと(AGLtoASL利用)、一部地面に埋もれてたんですが、確かに、ちゃんと綺麗に置かれてます。

つまりこれで完全に解決です。

Exileサーバにイン時の、初期オブジェクト配置も、同じ様に書けばええ訳です(ミッションファイル内の起動スクリプト)

_heli = “クラス名" createVehicleLocal (ATL位置);
_position = getPosWorld _heli;
_vectorDirUp = [vectorDir _heli, vectorUp _heli];
_model = getModelInfo _heli select 1;
deleteVehicle _heli;(不要なのでオブジェクト削除)

(ここでSimpleObject作成、位置や角度は上から持ってくる)
_simpleHeli = createSimpleObject [_model, _position];
_simpleHeli setVectorDirAndUp _vectorDirUp;

ちなみに、こんな、そのものズバリなSimpleObject化関数なんてのもあるようですが、パフォーマンスがよろしくないようです。

BIS_fnc_replaceWithSimpleObject

あのモヤモヤが一つ取れました。

(;^ω^)

安全な車両湧きについて。

これもアドオン開発で気付いたものですけども。

いままで、いろいろなサンプルコードから、以下のようなコードで空白地を探してました。

_pos = [_posStr,_size * 2,_size * 5,_size,0,0.5,0,_spawnedPositions] call BIS_fnc_findSafePos;

地面の傾きや水辺なども対象にでき、ブラックリストも同時に省けるので便利だったんですが。。

地表にある僅かな凹凸で、ダメージが入り爆発四散なんて事が結構ありました。

そこで、こんな形に変えると、あら不思議、安全に車両湧きができるようになりました。

_pos = (getPos _building) findEmptyPosition [_size,_size * 5,_vehicleClassName];

若干パフォーマンスが悪いようなのですが、規定個数を必ず湧かせるような目的の場合、何度もループして探すよりか、こちらの方が結果的に早かった。*

ただ、BIS_fnc_findSafePosにある機能がいくつか無いので、(必要なら)コードを書かなければならない。

※アドオンに次版から適応予定です

さらに良い感じな、車両湧きになりました。

ほら、誰かが駐車した感じ出てるでしょ。


軍事施設におもむろにテントが貼ってありますが、よーく見るとワイヤートラップが見えます。

(;^ω^)
追記:アドオンAI挙動設定追加

新しい機能として、AIをパトロールさせる機能を追加しました。

現在デバッグ中(ほぼ完了)

今までは、ただ、建物内に棒立ちだったので、これに追加で、パトロールも設定可能にしました。

んで、これにも色々と副産物が。。

(;^ω^)

AIに動きをさせるとなると、今までスルーしてたArma3仕様を理解しないといけませぇん。

(;´Д`)

AIをただ単純に棒立ちにさせるなら、これだけでいい。

_unit disableAI “PATH";

移動パスの設定を無効にしちゃえば、その場所から動くことができません。

_unit disableAI “MOVE";

なんてのもあるが、これだと射撃まで無効になっちゃうようです。

思い通りに動いてくれないぇぇぇ・・。

その度に、公式サイトで色々試しました。

本当に、AIに関しての様々なコマンドや設定値があるんです。

結果、余計な事はしない方が良いっぽい、と結論が出ました。

(;´∀`)

※下手に設定すると、固まって動かなくなる

Ocupationの町AIは、結構単純で、1パスのウェイポイントでのパトロールです。

SADモードなので、発見されたら、追っかけられますけども。

んで、DMSのAIは、多少凝ってますが、ベーシックな45度単位で全方位を見て回るウェイポイントでした。

んでは、当アドオンでは、町に注目したコンセプトなので。

近場の建物/車両/道路の3つの間をウェイポイントにしてみました(300m範囲内)

何度もインしては、AIの挙動を見て、”プレーヤーっぽい動き”をしてるか?を確認&微調整してます。

「警戒しながらアイテム漁り」してるテイなので、発見され次第、撃ってくるが、程よく追ってくる感じにしてます。

・・が、ゾンビちゃんに反応してしまって、動きが見れない。。もちろん、私自身もAIに見つからないように、遠目から見てます。

(;´Д`)

アドオンでの設定は、「AIが動く確立0-1」だけになります。0にすれば、全AIが建物に芋りっぱなしになります。

Occupation Placeとは違い、再湧きしません(裏タスクは無いので・・)

極端な事を言えば(2時間程度でサーバリスタートするので)、Occupation Placeの代わりになるかも・・です。

BIS_fnc_taskPatrolという簡単便利なコマンドがあるんですけどね。

Occupationだと車パトロールがこれです。

ランダムでウェイポイントが設定されるようです。

これを使ってやり過ごす事も考えましたが、「他プレーヤーっぽい動き」が出せなかったので、手書きになったのです。

Arma3スクリプトの新しいワザ。本当に今更ですけども、こんな書き方が出来たんですね。プログラム言語で言うところの無名関数。

アドオンのウェイポイント設定で使ってる部分です。

_addWaypoint={
    _wp = (_this select 0) addWaypoint [_this select 1, 5];
    _wp setWaypointBehaviour selectRandom[“AWARE","COMBAT","STEALTH"];
    _wp setWaypointCombatMode “RED";
    _wp setWaypointCompletionRadius 1;
    _wp setWaypointType “MOVE";
    _wp
};

こうすると、

[_group,_wppos] call _addWaypoint;

とするだけで、ウェイポイントを追加できるようにしてます。

この書き方で、もう一回全部見直したい位です。。

(;^ω^)

追記:スモークどうやる?

DMSミッションのクリア時に、クレイトから、煙が出ますが。

そういえば、アレ、どうやってんの?

・・と思い、コードを追ってます。

ミッションクリア時に、はじめて、クレイトの中身を詰めまくってて、その際に、スモークグレネードをアタッチ(くっつけ)してます。

fn_FillCrate.sqf

if (_crate getVariable [“DMS_AllowSmoke", true]) then
{
    if (DMS_SpawnBoxSmoke && {sunOrMoon == 1}) then
    {
        private _marker = “SmokeShellPurple" createVehicle getPosATL _crate;
        _marker setPosATL (getPosATL _crate);
        _marker attachTo [_crate,[0,0,0]];
    };

    if (DMS_SpawnBoxIRGrenade && {sunOrMoon != 1}) then
    {
        private _marker = “B_IRStrobe" createVehicle getPosATL _crate;
        _marker setPosATL (getPosATL _crate);
        _marker attachTo [_crate, [0,0,0.5]];
    };
};

昼なら通常スモーク、夜ならIRスモークとして切り替えてるようです。

ここまでは分かったんですが、これをどないして、起爆させてるんかが分からない。。

(;´Д`)

もしや、オブジェクトを生成した時点で、煙が出るんだろうか。いや、まさか。

特にそれっぽいコードが見当たらないんですよね。。あるとすれば、クリア時に、ミッション毎の登録されたコードを実行してるところ位です。これを追っても、特に何もしてない。

ユニットに、投擲アクションをさせるには、fireコマンドを使うらしいんですが、ユニットに当たる部分が、無機物のクレイトBOXじゃないですか(ちなみに、DMS全コードを検索かけてもfireコマンドが無い)

_soldier fire “SmokeShellMuzzle";

まぁ・・実際に実行して確認すりゃええだけですけどもね。

しかし、DMSのコードは素晴らしいです。素晴らしすぎて、コードを追うのが難儀です。

(;´∀`)

追記:4/12Arma3大型アップデート

そういえば、昨日、TANK DLCの発売日でしたね。

よって、Arma3本体の大型アップデートが入ってます。

これで予定されてたDLCは全部出揃ったかな。

Arma3サーバの管理者さんが大慌てで更新を掛けてるでしょう。

(;^ω^)

個人的には、このTANK DLCで追加されたオブジェクトが気になるところです。DLCの度に細かくオブジェクトが結構追加されてるんですよね。

使いみちありそうな、血糊とかLAW OF WARで追加されてる。

プレーヤーがDLCを所有してなくても、配置オブジェとしては使えるので無視できません。

追記:アドオン新機能追加

前記事で紹介した、AIパトロールの場所を、マップマーキングするようにしました(デバッグ用)

X印の場所がウェイポイントとして設定されてるところです。

これ、分かりやすいでしょう。

(;^ω^)

DMSフリーズがあるので、プレーヤーが町に入った辺りで、AIが動き出します。

当アドオンで湧いた車両(Serverの方も含み)と、近場の道路に顔を出します。

んで、これが新機能です。

町にちょっとでも、雰囲気や動きを与えたいために、の配慮です。

炎上オブジェクトです。

燃やしたいオブジェクトは、設定可能です。

車両やヘリでも良いし、建物や資材系オブジェクトでもOKです。場所は、ランダムです。1ロケーションで複数置くことができます。

この演出はローカルの方だと思うので、サーバ負荷はほぼ皆無かと思います。

次公開版に適用します(設定項目は1個だけ追加)

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

Posted by nabe