【焼】ARMA3 EXILE MODサーバの旅その124
追記:goemon exileサーバある理由で閉鎖
追記:AI飛び降り問題
追記:バックパック問題(Exileバグ)
追記:霧のトレーダー追加
追記:やっとバグ取れる&分からんバグ
追記:シャッフルされどシャッフル
追加:UAV・UGVパトロール追加
追記:ゴリゴリに微調整
追記:サプライBOXの改造
追記:ポータルの追加
プロジェクトベーコンのテストプレーに参加してまいりました。
テリトリーを広げるというのが目的、この下半身が埋まった人にはかなりお世話になるでしょう。
Tayaさんとの参加。心強い。
まだ、未実装な所もいくらかあるよう。職業やスキルツリー、シングルミッションなどもあり、長く遊べる内容になってる。
(今のところは・・ですが)落ち着く間もなく、突如AIからヌッ殺されます・・。
(;^ω^)調整するそうです
とはいえ、Looterと言われる、一匹狼の最弱AIなんですけどね。目の前に沸かれては・・・・w
たまーに、強敵AIが現れます。
全弾ぶちこんでも倒せないというやつ。兵装見て、ヤバそうだったら逃げるの選択を強いられます。
小奴らを倒すために、レベルを上げるなどしないといけない訳なのでしょう。
追記:ポータルの追加
アドオンに、軍事施設などにワープできるポータルを追加。
NamedCityのどこかの建物内に、ポータルが生成される。まだ、動作確認してないが、血の池にシャレコーベが置かれてる。
あえて、建物内に置いてるので、町の活用、逃避の方法としても利用できるかも。・・?
ワープ先は、ランダムなので、突如、AIが目の前にいるかもしれませんが。。。
追記:サプライBOXの改造
標準のサプライボックスだと、あまり美味みが無い印象。
もち、ゴリゴリに改造してますが、さらに、こんな感じはどうでしょう。
サプライだけではなく、リッチ車両も対象に入れる。
@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パトロール追加
以前から使ってみたかったUAV、ついでにUGVパトロールを追加。
UAVはドローンなので、ハエのようにプレーヤー達の上空をブンブン飛び回ってるだけ。
PvPの環境なら、場所が分かっちゃうので、結構嫌らしい存在になるかと思う。
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という標準コマンドでも同じシャッフルがあるのですが、調べて見るとこんな記事が。
配列の先頭ほど変更される確率が低いように見えます。
この記事内にあるコードを参考にこんなものを自作してみました。単純なので速度も問題ないかと。
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};
追記:やっとバグ取れる&分からんバグ
やっとバグ取れた。。
(;´Д`)
バグを取りながらも、品質を上げる努力は忘れない。
上写真は、サーバ上に出力される自作アドオンのログ。マップ上の全ての地点の詳細な情報が表示される。
むろん、この情報を見てアドオンが動作してる。
また、場所毎のこんな情報も出力される。
一番低い・高い所にある建物、地域の高低差、最も高い場所(標高)なんかも分かる。
上写真だと、全体が平坦ではあるものの、東側に高台(+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してる)
(;´Д`)
こればっかりは、なぜか分からない。でも、実際直ったのだ。
追記:霧のトレーダー追加
ファントムトレーダー、霧の中にふっと現れるトレーダー機能を追加。
マップ上にマークはされるものの、10分間しか存在しないし、視界不良の中にいるので、探すのにも難儀する。
ここだけのレアアイテムを買うことが出来るというもの。
追記:バックパック問題(Exileバグ)
Discordでこんな話題が。
WastDumpで一括売りの時、バックパックの中身が売値に考慮されてないという問題。
そういえば気づかなかった。
コードを見ると確かに、中身が考慮されてない。
(;^ω^)
しかも、バックパックの中に、金庫が入ってて、その中身だって同様。
ExileClient_util_containerCargo_list.sqf で売値対象のアイテムリストが生成されるんですが、ここの修正で対応できそうではある。
Arma3では長年の歴史が生んだ、似たようなコマンドが大量にあり・・・・w どれが正解なのか怪しい所ではあるが。
everyBackpack このコマンドが新しく、オブジェクトで管理されてるので正確であろうと(クラス名文字列管理だ、2つ同じバックパックがあった時、どっちか分からなくなる)
追記:AI飛び降り問題
ログを見てると、湧いては逝ってしまうという、スタンド攻撃のようなものを受けてしまってる。
(;´Д`)
これは、建物内に沸かせたAIなんですよね。
公式マップなら、こういう事もない・・と思うが、コミュニティマップだと、どんな構造か分からないので、どうしようか悩んでる。
上写真ログでは、Grishinoという村で、地上から13mの位置の建物内に沸いてる。
この村では一番の高い場所になるので、スナイパーとしては最高のポジションです。
(位置が高いというだけで、窓があるとは限らないが・・)
Higher House: Land_Nasypka(Bp:5) [5964,10173] asl:279.0m dir:SouthWest
ログ上では、南西側にあって、中心地からさらに30mほど高い場所なので、合計43mの高さというポジション。
この建物内の立てる位置は、5箇所あるらしい(BuildingPos)
実際にこのオブジェクトを見た訳じゃないけど、もしや、屋根とかの位置なのかもしれない。
各位置から、地表までの経路があるかどうかを調べるコマンドが無いし、落下死を避けるため、どーするかって事。
そういう場所って事は、スナイパー用に用意されてる?って事にして、動かないようにする?
いや、そうとは限らないよね。。
(;´∀`)
追記:goemon exileサーバある理由で閉鎖
詳しくはこちらのTwitterを。
ご活躍期待しております。成果を公開するそうですので、意思を継ぎたい方がいらっしゃったらどうでしょう?
鯖を上げたい方はぜひとも、Discord技術部屋へ。
超真面目な話なんですけど、4月から出家します。
これ過ぎると秋に行くことになります。
なのでサーバーデータ一応クラウド上げて公開しときます。
3月半ばには終わると思います。建てて半年もせず終わって申し訳ない!! pic.twitter.com/vKliWPKvcB
— goemon (@goemon_arma3) January 17, 2021
ディスカッション
コメント一覧
まだ、コメントがありません