【焼】ARMA3 EXILE MODサーバの旅その124

2021年1月2日プライベートarma3,dayz,exile,mod,server

image

追記:goemon exileサーバある理由で閉鎖

追記:AI飛び降り問題

追記:バックパック問題(Exileバグ)

追記:霧のトレーダー追加

追記:やっとバグ取れる&分からんバグ

追記:シャッフルされどシャッフル

追加:UAV・UGVパトロール追加

追記:ゴリゴリに微調整

追記:サプライBOXの改造

追記:ポータルの追加

プロジェクトベーコンのテストプレーに参加してまいりました。

テリトリーを広げるというのが目的、この下半身が埋まった人にはかなりお世話になるでしょう。

image

Tayaさんとの参加。心強い。

image

まだ、未実装な所もいくらかあるよう。職業やスキルツリー、シングルミッションなどもあり、長く遊べる内容になってる。

image

(今のところは・・ですが)落ち着く間もなく、突如AIからヌッ殺されます・・。

(;^ω^)調整するそうです

とはいえ、Looterと言われる、一匹狼の最弱AIなんですけどね。目の前に沸かれては・・・・w

image

たまーに、強敵AIが現れます。

全弾ぶちこんでも倒せないというやつ。兵装見て、ヤバそうだったら逃げるの選択を強いられます。

小奴らを倒すために、レベルを上げるなどしないといけない訳なのでしょう。

追記:ポータルの追加

image

アドオンに、軍事施設などにワープできるポータルを追加。

NamedCityのどこかの建物内に、ポータルが生成される。まだ、動作確認してないが、血の池にシャレコーベが置かれてる。

あえて、建物内に置いてるので、町の活用、逃避の方法としても利用できるかも。・・?

ワープ先は、ランダムなので、突如、AIが目の前にいるかもしれませんが。。。

追記:サプライBOXの改造

image

標準のサプライボックスだと、あまり美味みが無い印象。

もち、ゴリゴリに改造してますが、さらに、こんな感じはどうでしょう。

サプライだけではなく、リッチ車両も対象に入れる。

@Exileserver/ExileServer_system_event_supplyBox_start.sqfの、52行辺りに以下を追加すると実現できる。

_box = createVehicle [“Exile_Container_SupplyBox", [0, 0, 0], [], 0, “CAN_COLLIDE"];
_box setPosATL _position;
_box setDir (random 360);

上記が書かれてる部分を、丸っと、以下に変える。

if((random 1) > 0.5)then{
private _configs = “getNumber(_x>>’quality’)>3 && getNumber(_x>>’price’)>10000" configClasses (missionConfigFile >> “CfgExileArsenal");
while{true}do{
private _cn = configName(selectRandom _configs);
if(isClass (configFile >> “CfgVehicles" >> _cn))exitWith{
_box = [_class,[0,0,0],floor(random 360),true] call ExileServer_object_vehicle_createNonPersistentVehicle;
};
};
}else{
_box = createVehicle [“Exile_Container_SupplyBox", [0, 0, 0], [], 0, “CAN_COLLIDE"];
_box setPosATL _position;
_box setDir (random 360);
};

config.cppのCfgExileArsenalの欄からランダムに選ばれる。設定するなら、getNumber(_x>>’quality’)>3 && getNumber(_x>>’price’)>10000の部分で、’quality’や’price’で絞れる。

手書き設定不要なので楽でしょ?

車両にダメージを与えた状態にしたいなら、_box damage random 0.5;とか書けばいい。

追記:ゴリゴリに微調整

本日は超細かい所まで微調整。

パトロールAIは、建物の中にまで入ってくる事はマレですが、これを変えました。

より丹念にパトロールするようにしました。かつ、リアリティに。

(;^ω^)

車両パトロールとか、決まりきった物資しか積載されてませんでしたが(設定は可能だが)、これも完全にランダム化。

車両パトロール車両もランダム化。。

(;´∀`)

欲しい車両が走ってるかもしれませんです。プロな方には、品評会のようなものと見ても良いかもしれない。

だって、トレーダー無いんだもの。

高級車両は、エアーサプライですが。

その他にも、かなり細かい所まで手を入れました。覚えてないくらい。

(;^ω^)

追加:UAV・UGVパトロール追加

image

以前から使ってみたかったUAV、ついでにUGVパトロールを追加。

UAVはドローンなので、ハエのようにプレーヤー達の上空をブンブン飛び回ってるだけ。

PvPの環境なら、場所が分かっちゃうので、結構嫌らしい存在になるかと思う。

image

UGVは、無人の攻撃車両、結構な驚異ですよ、これ。

町と町を徘徊しながら、プレーヤーを探しては撃ってきます。

コードはこんなの。

//——————————-
// UGV patrol
LB_EH_CreateUGV={
     params[“_locs","_side"];
     private [“_pos","_dir","_road"];
     _pos=getPos(selectRandom _locs);
     _road = objNull;
     {
         private _inf = getRoadInfo _x;
         if(_inf#0 in [“ROAD","MAIN ROAD"] && !(_inf#2) && !(_inf#8))exitWith{_road=_x};
     }forEach (_pos nearRoads 100);

    if!(isNull _road)then{
         private _ConnectTo = roadsConnectedTo _road;
         private _connect = _ConnectTo#0;
         _dir = [_road,_connect] call BIS_fnc_DirTo;
         _pos=position _connect;
     }else{
         _pos=_pos findEmptyPosition [0,100,"I_UGV_01_rcws_F"];
         _dir = random 360;
     };
     waitUntil{
         uiSleep 60;
         ((allPlayers-entities"HeadlessClient_F")findIf{(_pos distance2D _x) < 300 && alive _x}) isEqualTo -1
     };
     private _v = [_pos,"I_UGV_01_rcws_F",_side] call BIS_fnc_spawnVehicle;
     createVehicleCrew(_v#0);
     {
         _x setCustomAimCoef 0.5;
         _x allowFleeing 0;
         hideObjectGlobal _x;
     }forEach crew _veh;
     _v#0 setVariable[“LB_PATUGV",[_locs,_side],false];
     _v#0 setDir _dir;
     _v#0 enableUAVWaypoints false;
     _v#0 enableRopeAttach false;

    private _l = nearestLocations [_pos,[“NameVillage","NameCity","NameLocal"],2000];
     if(count _l > 0)then{
         private _w=(v#2) addWaypoint[getPos(selectRandom _l),20];
         _w setWaypointSpeed “NORMAL";
         _w setWaypointCompletionRadius 20;
         _w setWaypointCombatMode “RED";
         _w setWaypointBehaviour “SAFE";
     }else{
         [group _v#0,_pos,1000] call BIS_fnc_taskPatrol;
     };
     // marker
     if(LB_UGV_MARKER)then{
         _v#0 spawn{
             private _v=_this;
             private _m = createMarker [“LB_"+str(_v),getPos _v];
             _v setVariable[“LB_PATUGV_MK",_m,false];
             _m setMarkerType “b_motor_inf";
             waitUntil{
                 uisleep 1;
                 _m setMarkerPos(getPos _v);
                 _m setMarkerDir(getDir _v);
                 alive _v;
             };
         };
     };
_v};
if(LB_UGV > 0)then{
     for “_i" from 1 to LB_UGV do{
         private _ret=[_locCapital+_locMilitary,_C_banditSide]call LB_EH_CreateUGV;
         (_ret#0)addEventHandler[“Killed",{
             params[“_unit","_killer","_instigator","_useEffects"];
             deleteMarker(_unit getVariable[“LB_PATUGV_MK",""]);
             [_unit getVariable"LB_PATUGV"]call LB_EH_CreateUGV;
         }];
         format[“UGV:%1",getPos (_ret#0)] call LB_fn_log;
     };
};

追記:シャッフルされどシャッフル

配列のシャッフルに、今までExile Mod内のUtilを利用してましたが、コードを見る機会があり、あれ?と思った次第。

んで、BIS_fnc_arrayShuffleという標準コマンドでも同じシャッフルがあるのですが、調べて見るとこんな記事が。

BIS_fnc_arrayShuffle – broken

配列の先頭ほど変更される確率が低いように見えます。

この記事内にあるコードを参考にこんなものを自作してみました。単純なので速度も問題ないかと。

LB_fn_shuffle={
     private [“_j","_t"];
     for “_i" from count(_this)-1 to 1 step -1 do{
         _j = floor(random _i);
         _t=_this#_i;
         _this set[_i,_this#_j];
         _this set[_j,_t];
     };
_this};

追記:やっとバグ取れる&分からんバグ

image

やっとバグ取れた。。

(;´Д`)

バグを取りながらも、品質を上げる努力は忘れない。

上写真は、サーバ上に出力される自作アドオンのログ。マップ上の全ての地点の詳細な情報が表示される。

むろん、この情報を見てアドオンが動作してる。

image

また、場所毎のこんな情報も出力される。

一番低い・高い所にある建物、地域の高低差最も高い場所(標高)なんかも分かる。

上写真だと、全体が平坦ではあるものの、東側に高台(+40m)であるのが分かります。

アドオンでは、この高台を、バンディットがスポーンしやすい場所の一つとして選ばれます。また、スナイパーを配置したりもします。

定期的にサーバーのステータスを表示してるんですが、こんな感じです。

“[LB]: ** Players:0 Units:102 Dead:3 Groups:94 Time:6.88h (x8) FPS:37(av:45) Started:15.95min Scripts:[68,55,0,2]"

プレーヤー数、全ユニットやグループ数、実行中の全スクリプト数など。

負荷調整にも参考になる数字じゃないだろうか。

プレーヤーが居ないので、動作してないスクリプトもありますが、既に94グループいる事になってます。最大値が256なので、わりかし余裕が無いという感じw

アドオンで、1AIで1グループで扱ってる性でもある。

そういえば、とっても意味不明なエラーで、かなり悩まされました。

エラー箇所が一切分からない、見当違いのエラー情報が表示されているのである。どっからどうみても、間違い無いのである。

こういう場合、結局の所、{ }の対忘れだったり、コードのコピペをそのまま残してしまっていた・・とか。

私の場合、paramsを文中にそのまま残しててたw

何が入ってるか分からない_thisに対して処理してた訳だ。

{ }の忘れが、とにかく厄介で、超~~見当違いのエラーが表示される。

しかも、ソースファイルすら違うという話だった(動的にcompileしてる)

(;´Д`)

こればっかりは、なぜか分からない。でも、実際直ったのだ。

追記:霧のトレーダー追加

image

ファントムトレーダー、霧の中にふっと現れるトレーダー機能を追加。

マップ上にマークはされるものの、10分間しか存在しないし、視界不良の中にいるので、探すのにも難儀する。

ここだけのレアアイテムを買うことが出来るというもの。

追記:バックパック問題(Exileバグ)

image

Discordでこんな話題が。

WastDumpで一括売りの時、バックパックの中身が売値に考慮されてないという問題。

そういえば気づかなかった。

コードを見ると確かに、中身が考慮されてない。

(;^ω^)

しかも、バックパックの中に、金庫が入ってて、その中身だって同様。

ExileClient_util_containerCargo_list.sqf で売値対象のアイテムリストが生成されるんですが、ここの修正で対応できそうではある。

Arma3では長年の歴史が生んだ、似たようなコマンドが大量にあり・・・・w どれが正解なのか怪しい所ではあるが。

everyBackpack このコマンドが新しく、オブジェクトで管理されてるので正確であろうと(クラス名文字列管理だ、2つ同じバックパックがあった時、どっちか分からなくなる)

追記:AI飛び降り問題

image

ログを見てると、湧いては逝ってしまうという、スタンド攻撃のようなものを受けてしまってる。

(;´Д`)

これは、建物内に沸かせたAIなんですよね。

公式マップなら、こういう事もない・・と思うが、コミュニティマップだと、どんな構造か分からないので、どうしようか悩んでる。

上写真ログでは、Grishinoという村で、地上から13mの位置の建物内に沸いてる。

この村では一番の高い場所になるので、スナイパーとしては最高のポジションです。

(位置が高いというだけで、窓があるとは限らないが・・)

Higher House: Land_Nasypka(Bp:5) [5964,10173] asl:279.0m dir:SouthWest

ログ上では、南西側にあって、中心地からさらに30mほど高い場所なので、合計43mの高さというポジション。

この建物内の立てる位置は、5箇所あるらしい(BuildingPos)

実際にこのオブジェクトを見た訳じゃないけど、もしや、屋根とかの位置なのかもしれない。

各位置から、地表までの経路があるかどうかを調べるコマンドが無いし、落下死を避けるため、どーするかって事。

そういう場所って事は、スナイパー用に用意されてる?って事にして、動かないようにする?

いや、そうとは限らないよね。。

(;´∀`)

追記:goemon exileサーバある理由で閉鎖

詳しくはこちらのTwitterを。

ご活躍期待しております。成果を公開するそうですので、意思を継ぎたい方がいらっしゃったらどうでしょう?

鯖を上げたい方はぜひとも、Discord技術部屋へ。

2021年1月2日プライベートarma3,dayz,exile,mod,server

Posted by nabe