【GAME】ARMA3 EXILE MODサーバの旅その51
追記: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;
とするだけで、ウェイポイントを追加できるようにしてます。
この書き方で、もう一回全部見直したい位です。。
(;^ω^)
追記:スモークどうやる?
そういえば、アレ、どうやってんの?
・・と思い、コードを追ってます。
ミッションクリア時に、はじめて、クレイトの中身を詰めまくってて、その際に、スモークグレネードをアタッチ(くっつけ)してます。
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大型アップデート
よって、Arma3本体の大型アップデートが入ってます。
これで予定されてたDLCは全部出揃ったかな。
Arma3サーバの管理者さんが大慌てで更新を掛けてるでしょう。
(;^ω^)
個人的には、このTANK DLCで追加されたオブジェクトが気になるところです。DLCの度に細かくオブジェクトが結構追加されてるんですよね。
使いみちありそうな、血糊とかLAW OF WARで追加されてる。
プレーヤーがDLCを所有してなくても、配置オブジェとしては使えるので無視できません。
追記:アドオン新機能追加
前記事で紹介した、AIパトロールの場所を、マップマーキングするようにしました(デバッグ用)
X印の場所がウェイポイントとして設定されてるところです。
これ、分かりやすいでしょう。
(;^ω^)
DMSフリーズがあるので、プレーヤーが町に入った辺りで、AIが動き出します。
当アドオンで湧いた車両(Serverの方も含み)と、近場の道路に顔を出します。
町にちょっとでも、雰囲気や動きを与えたいために、の配慮です。
炎上オブジェクトです。
燃やしたいオブジェクトは、設定可能です。
車両やヘリでも良いし、建物や資材系オブジェクトでもOKです。場所は、ランダムです。1ロケーションで複数置くことができます。
この演出はローカルの方だと思うので、サーバ負荷はほぼ皆無かと思います。
次公開版に適用します(設定項目は1個だけ追加)
ディスカッション
コメント一覧
ばんわです。相変わらず、武器のクラスネームを調べて、トレーダーへのコピー作業に明け暮れる日々ですw
シンプルオブジェクトの座標ズレは私も頭を悩ませていたのでこれは非常に助かりますw細かいコード関係は私では素人なんでいろいろ調べて試そうと思いますwこれと同じくDMS用に作った自作ミッションでスポーンするオブジェクト一式も縦に座標ズレを起こしてたので(同じくExile_Editを使ってポジションをコピーしたので)同じように対応すればできそうですねwありがとうございます!
今度ちゃんとしたコードも一緒に掲載しますね。
明日早いので、もうお布団の中なのでw
簡単に返信