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

sc20180413200518追記:トリガーの謎

追記:Arma3解析「This is War」BGMの場所

追記:Arma3サウンドファイル

追記:アドオンの新機能

追記:イベントトリガーの仕様

追記:3DENプラグイン中身

追記:投擲の武器

追記:イベントトリガー備忘録

前回記事のコメントに頂いたDorosiiさんへの返信で、コード掲載しますね(ハート)

(●´ω`●)

とか書いてしまったんですが。。(補足追加4/14)

3DENプラグインの書き出すinitServer.sqf(ミッション)コードを修正する形で考えてたんですが。。

そういや、3DENプラグインって、クラス名じゃなくて、モデルパスで羅列されてるんですよね。

調べまくったんですが、モデルパスからクラス名への変換方法が見当たらない(ほんと、ここだけの問題)

(;´Д`)

initServer.sqfのコード部分(3DENプラグインが書き出すやつ)

※ここまで書いた、残念だが動かない。:一時オブジェクト、:生成シンプルオブジェクト

{
    private _simpleObject = createSimpleObject [_x select 0, _x select 1];
    private _classname = getModelInfo _simpleObject select 0;

(てっきり、上でクラス名が帰ってくると思ってた)
   
    private _temp = _classname createVehicleLocal (_x select 1);
    private _tpos = getPosWorld _temp;
    _temp setVectorDirAndUp [(_x select 2), (_x select 3)];
    private _vectorDirUp = [vectorDir _temp, vectorUp _temp];
    deleteVehicle _temp;

    _simpleObject setPos _tpos;
    _simpleObject setVectorDirAndUp _vectorDirUp;

    {
        if ((toLower _x) in _invisibleSelections) then
        {
            _simpleObject hideSelection [_x, true];
        }; この辺のコードはプラグインのそのもの
    }
    forEach (selectionNames _simpleObject);
}
forEach _simpleObjects;

答えは、もろ、こんな感じです。青部分で、一時的なオブジェクトを生成します。欲しい情報は、_tpos(位置)_vectorDirUp(角度)だけです。なので、最後に削除。

クラス名 createVehicleLocal (位置);

その情報を元に、シンプルオブジェクトを作ります(上の例では、最初にシンプルオブジェクトを作ってしまってますけど)

createSimpleObject [クラス名, 位置];

setPos _tpos; 最終的な位置合わせ

setVectorDirAndUp _vectorDirUp; 最終的な角度合わせ

な事をやるだけです。

sc20180413202158問題は、3DENプラグインが、未だにモデルパスを出力する事なんですよね。。

M3エディタも同じなんかな?

んで、公式ドキュメントを調べまくった時に見つけたものに以下のものがありました。

surfaceNormalコマンド Wikipedia関連資料

今回の問題は、地形にうまく乗っかってくれない点にあると思うんです。

このコマンドを噛ますと、うまい具合になってくれるぅぅかもしれない。今日のところは時間が無くて、テストできませんでした。

補足:

P_20180414_122703思いついちゃいました。exile_3den.pbo自体を改造しちまえば、いいじゃないのぉ~。

・・と本日所用で行ってた、日本海側で思い付きました。

写真:山形県と秋田県の境にある鳥海山(標高2236m)

まだ、雪が残ってますなぁ。

P_20180414_122901時間があったので、ハードオフでジャンク漁りに。。

(;´∀`)なんも収穫無しッ
追記:イベントトリガー備忘録

sc20180414094259ええの見つけたぞ。

(;´∀`)

イベントトリガー

ちょうどここに、ContainerOpenedという欲しかったイベントが取れるじゃまいですか。

アイテムボックスに、もしかしたら、グレネードトラップが仕掛けられるんじゃ・・・なかろうかwそうじゃろか。

(゚∀゚)!(゚∀゚)!(゚∀゚)!

あと、Engineという車両エンジンのON/OFFにも、掛けられるんですよ。

スパイ映画で見掛ける、アレ、も出来ちゃうんじゃないのぉ~。

(;´Д`)んな、鬼畜すぎるわ

修正:

マルチプレイミッションでは、サーバとしてはMPイベントしか登録できないようでした。Killとか。

うむむ、残念。

ローカル側で実行すればいけるんでしょうけども。

追記:投擲の武器

sc20180414174530投擲武器はどうやるんだろ?

と前記事で書きましたが、その続きです。

そういえば、ExileZで、トラップゾンビがあったな。と思い、該当コードを調査。

やはり、ここでも、オブジェクトを生成してるだけだ。

ほう・・・(;^ω^)

追記:3DENプラグイン中身

sc201804161210193DENプラグインの中身を見てみました。

流石に綺麗なコードで勉強になる。

(;^ω^)

んで、例のエクスポート部分を見てみる。

綺麗なコードだからこその・・深~い部分で、モデルパスを取得してました。

fn_getModelPath.sqf

private _weaponModel = getText (configFile >> “CfgWeapons” >> _weaponClass >> “model”);

エディタ編集上で、シンプル化した際(缶詰になった時)に、オブジェクトに属性として、モデルパスを入れ込んでるようです。

fn_convertIntoDummy.sqf

_entity set3DENAttribute [“ExileModel”, _model];

エクスポート直前の部分はここ。

fn_serializeSimpleObject.sqf

format
[
    “[%1, %2, %3, %4]”,
    str _model, // Double-String it for extra “”
    (getPosWorld _this) call Exile3DEN_fnc_serializeVector3d,
    (vectorDir _this) call Exile3DEN_fnc_serializeVector3d,
    (vectorUp _this) call Exile3DEN_fnc_serializeVector3d
]

数字のリスト部分を出してる所です。このstr _modelの部分を書き換えちゃえば、クラス名として出せます。

typeOf _this

これに書きえれば、クラス名として出力できる(はず)です。まだ未検証ですけども。

もしくは、最後の行に、これを加えて5列出力にした方が、影響少ないかな。

私のサーバ構築の際に、これを適用してみるので、結果は追ってご報告(問題無いはず)

sc20180416122322んで、副産物なのですが。

色々なコードでよく見るこの書き方。

configFile >> “CfgWeapons” >> _weaponClass >> “model”

これは、上記のモデルパスを取得してる部分。

これの他にも、武器に応じたマガジンや弾薬の選択とかでも、しょっちゅう見掛けます。

なにかArma3側に設定情報ツリーのようなモノがあり、それを参照する事ができるようです。

今までスルーしてたんですが・・・これは、ちゃんと調べた方が収穫が大きそうです。

AllInOne Config(公式)

印象的に、Arma3全オブジェクト(建物や武器等すべて)の一覧と、対応関係、グラフィックス・サウンド含めを扱える訳でしょう。

つまり、Arma3そのものです。

m9( ゚д゚)!!

sc20180416123324こちらからダウンロードしてみました(正式なものかどうかはわからない)

写真のはAK47の所です。

modelには上記のモデルパス、magazinesには、対応してるマガジンの一覧。

武器の性能に関する記述すべてがあります。

続けて、AKMベースとなるアサルトの記述があります。継承されて書かれてます。

なるほど・・・、これは美味しいネタを見つけたかも。。

巨大すぎるので、時間がある時にじっくり堪能しよう。

(;^ω^)

むむ?つー事は、MODにも同じモノがある訳ですよね(これに統合される感じかな)

武器や弾薬の一覧とか、簡単に出せるんじゃね?・・と。

(;´∀`)前々から欲しかった情報

追記:イベントトリガーの仕様

sc20180416190007ゲーム中のイベント発生時にコードを実行できるようにすると、監視用負荷も無く、効率的です。

ですが、サーバ側でトリガーを掛けられるのは、Kill/Hit/Respawnの3つだけのようです。

Killに関しては、色々なアドオンで利用されてます。

OccupationやDMSなどでも、AIが死んだらマップマークを削除する、イベントクリアしたか?などの判定です。

ExileZなら、スコア系のモノと、トラップゾンビの処理をしてます。

拙作のアドオンでも、何かやりたいなぁ・・と思ってる所、前々から考えてたアイデアがありました。

AIバンディット同士の通信があってもいいじゃないか・・

と思ってて、AIに発見されたら、マップに場所がマークされてしまう・・という、プレーヤーに対するPvPサーバならではのペナルティです。

・・ですが、上記3つのトリガーだけでは実現不可能なのですが、ギリギリ、プレーヤーに攻撃されたら・・マークされてしまうで、なんとかイケるかと。

拙作アドオンのAIだけの仕様となりますけども。

(;´Д`)プレーヤーさん過酷な旅ですねぇ

追記:アドオンの新機能

sc20180416205845新しい機能として、今進行形でコードを書いてるのが以下。

オリジナルロケーション作成

カスタム看板の設置

街角3Dサウンドの設定

既に、炎上オブジェクト、AIパトロールは組み込み済み。

オリジナルロケーションで、任意の場所にアイテムボックス湧きが可能になるし、副産物として、マップ上に文字を表示できます。

カスタム看板は、好きな画像ファイルを看板に貼り付けられます。これは、良く見ますね。サーバルールとか書いたり。

街角3Dサウンドは、任意の場所から好きなサウンドを鳴らせます。

ただ、これはサーバ側から指定できるのか、調べてる所です。ローカルでは動作確認してるんですけどもねぇ。

20180417152242_1カスタム看板設置の機能。

良かった。。ちゃんと動いてる。

画像を看板に貼っ付けて、好きな場所に設置できます。

完全にサーバー側からの機能提供ですので、ミッションファイルにコードを書く必要はありません。楽ですね。

場所と角度だけは、EDENで事前にメモっておかないといけません(メニューから一発コピペできる)

画像は、ミッションファイルに格納しておきます。

追記:Arma3サウンドファイル

sc20180417173458備忘録ですが。

Arma3で持ってるサウンドファイルです。これで全部じゃないでしょうけども。DLC関連は別ホルダーになってるんかな。

Arma 3: SoundFiles

追記:Arma3解析「This is War」BGMの場所

sc20180417203108Arma3メイン設定ツリーの解析をチョコチョコとやってます。

ふっと目に止まったのが、これ。

あの「This is War」や、Arma3キャンペーン等のゲーム中BGMが入った場所を発見ッ!

ほんとの生音でまったり聞いてください。

(;^ω^)

んで、場所は、\Steam\steamapps\common\Arma 3\Addons\music_f_music

Arma3がインストールされた場所から、Addon/music_f_music.pboをアンパックすると、oggファイル(音楽)が沢山出てきます(Chromeブラウザで聞けます)

自分はキャンペーンをプレーしてないんで、どの場面で再生される楽曲なのか分かりませんけんども。

LeadTrack01a_F.oggがよく聞く「This Is War」のようです。

補足:

この「Addon」ディレクトリというのが、設定で目にする、これの事なのです(以下の例は、initServer.sqfファイルから)

a3\structures_f_epc\civ\tourism\touristshelter_01_f.p3d(3Dデータ)

んで、これがArma3設定ツリーと言われるそのモノ。全データが格納されてます。超巨大なデータなのです。

追記:トリガーの謎(メモ)

sc20180419111229サウンドを鳴らすのもそうですが、場所や条件でコードを実行できる便利なトリガーなんですが。

(翻訳しながら・・)ネットを徘徊していると、何やら気になる情報がありました。

Arma3の実行環境は、ローカル、ホステッドサーバ、デディケーテッドサーバの3種類あります。

このいずれかで、トリガーを掛けた際に、サーバ&クライアント間で正常に動作しないというバグがあるらしい、との事。結構沢山見掛けるので、有名な事柄なのかもしれません。

私がアドオンで今作ってるサウンドが正常に動作してないんで・・、の副産物情報なんですけどもね。

(;^ω^)

ローカルで作成されたトリガーは、プレーヤーがアウトしても、生き残っていたり、サーバで作成されたものでも、設定が引き継がれないなど。

どこぞの掲示板で正常を確認したのは以下なのだそうです(Dedicated serverで確認したそう)

まず、サーバで必要分の空トリガーを作成する。

クライアントが、publicVariable経由にてトリガーを受け取る

クライアントが、各種設定を行う。

・・・なんだそうです。

※publicVariableは、サーバクライアント間で同期と取る変数(基本、変更はできない)

こうすると、プレーヤーがアウトしても、トリガーはサーバで保有してる分だけがゲーム空間に残ってて問題無いそうです。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(゚∀゚)ノ

sc20180411103905公式はこちら

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

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

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

・・と。

20180411102825_1単純に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

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

(;^ω^)

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

(;^ω^)

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

(;´Д`)

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

_unit disableAI “PATH”;

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

_unit disableAI “MOVE”;

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

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

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

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

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

(;´∀`)

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

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

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

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

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

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

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

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

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

(;´Д`)

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

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

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

sc20180411210220BIS_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;

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

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

(;^ω^)

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

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

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

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

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

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大型アップデート

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

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

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

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

(;^ω^)

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

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

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

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

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

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

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

(;^ω^)

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

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

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

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

炎上オブジェクトです。

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

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

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

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

【net】CloudFlareが初めたオープンDNS速いかも

sc20180406093100先日のニュースで見掛けたんですが、米CloudFlare社とAPNICがネームサービスを無償公開したようで。

他社よりも高速に、ネットが利用できるらしい。

高速と言っても、回線の方じゃなくて、”名前引き”のところです(ドメインからIPアドレス)

いままで高速といわれてたGoogleの有名な8.8.8.8を利用してましたが、いま変更して、確認してますが・・

確かに若干、速いかも・・?という印象です。

アフィとかの広告がたんまり貼ってあるウェブサイトだと、名前引きだけで相当のアクセスを行ってる訳で、このオーバーヘッドが無くなるだけでも結構なもんだと認識できます。

※(死語)ポータルサイト、ニュースメディア系は良く分かる

ある記事では、Googleが30ms、CloudFlareは半分程度になるそうです。

sc20180406093851ネットワーク(IPv4)プロパティのDNSで簡単に試せます。

※DHCP使ってるならルータ側

1.1.1.1と1.0.0.1だそうです。

(IPv6の方も用意されてる)

なんだか、これもDNSサービス側で、どんなサイトを見ているか?等を収集してる事への反発で初めたサービスなんだとか。

本当かどうかは未知ですが、CloudFlareでは一切のログ収集をしていないそうです(24時間までに削除)

でも、まぁ便利にはなるけども、ネット犯罪への温床にならなければ、と一抹の不安もあります。

(;^ω^)いっそ、国でやればいいのに

nabekのなぬげなblog(゚∀゚)