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

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

追記:トリガーの謎

追記: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; 最終的な角度合わせ

な事をやるだけです。

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

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

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

surfaceNormalコマンド Wikipedia関連資料

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

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

補足:

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

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

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

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

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

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

ええの見つけたぞ。

(;´∀`)

イベントトリガー

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

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

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

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

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

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

修正:

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

うむむ、残念。

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

追記:投擲の武器

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

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

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

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

ほう・・・(;^ω^)

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

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

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

(;^ω^)

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

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

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列出力にした方が、影響少ないかな。

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

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

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

configFile >> “CfgWeapons" >> _weaponClass >> “model"

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

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

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

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

AllInOne Config(公式)

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

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

m9( ゚д゚)!!

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

写真のはAK47の所です。

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

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

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

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

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

(;^ω^)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

追記:アドオンの新機能

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

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

カスタム看板の設置

街角3Dサウンドの設定

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

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

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

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

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

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

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

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

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

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

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

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

備忘録ですが。

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

Arma 3: SoundFiles

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

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

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

あの「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設定ツリーと言われるそのモノ。全データが格納されてます。超巨大なデータなのです。

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

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

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

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

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

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

(;^ω^)

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

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

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

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

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

・・・なんだそうです。

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

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

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

Posted by nabe