「dayz」タグアーカイブ

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

20190104234232_1

追記:AIパトロールの移動先(修正)

追記:ドアが開いてる(アイデア)

追記:Exile隠れアイテム

追記:loot_boxソースを綺麗にする

追記:poptab湧き

追記:アイテム湧きのふたたび調整

初期バランス調整のため、通常プレーを何度もやってます。

地平線が見えそうな、何もない荒野。

20190104233829_1

あれ?マップの変更があったのかな?若干違う気がする。

20190104233608_1

タキスタンには水溜りが数箇所ありますが、色バグは修正されたようです。以前は、中国の工場排水なドギツイ色でした。

(;^ω^)

ですが、水中には入れないようで・・・、水の上を歩いてしまってますが。。

20190104233429_1

ぬわっヽ(;゚д゚)ノ

出来るだけ、とんでもない所に配置するようにした、拙作アドオンのAIに殺られる。

なので、ちょっと嬉しいw

image

せっかく改造してるので、建物アイテム湧きを他サーバとは違う感じにする。

建物内2箇所とか湧くのが普通ですけど、これもランダム要素にしました。

湧き場所はこんな感じになってます。

_numberOfPositionsToUse = 1 max (((count _localPositions) * _maximumPositionCoverage / 100) min _maximumNumberOfLootPositions);

これをおもむろにコメントアウトにして、

_numberOfPositionsToUse = floor(random (_maximumNumberOfLootPositions+1));

で。0も考慮に入ってます。

image

てっきり忘れてた、ゾンビ湧きのプチ改造

近場に建物があれば屋内で沸くようになります。

正常に動作してました。

@exile_z/scripts/GetRandomLocation.sqf(最後の方)

private [“_list”,”_pos”,”_cnt”];
_list = _position nearObjects [“House”,20];
_cnt = count _list;
if(_cnt > 0)then{
     _pos = (_list select (floor(random _cnt))) buildingPos 0;
     if((_pos select 0) > 0)then{
         _position = ASLToATL(AGLToASL(_pos));
     };
}else{
     // clear walls and floors
     _position = _position findEmptyPosition [0,10,”Man”];
};
// return
_position;

追記:アイテム湧きのふたたび調整

20190105155613_1

そうそう、何が問題なのかわかっていなかった。

湧きポイントが少ない建物”で、違和感があったんだった。

ExileServer_system_lootManager_spawnLootInBuilding.sqf内

_localPositionsに設定リストが入ってるので、5箇所以上あるなら、と条件を加えてみる。

んで、ご覧の通り、このサーバでは”ナイフ”が湧きます。

(;^ω^)

20190105163037_1

快適なドライビング中で御座います。

image

以前、サーバで一緒になったニタロウさんの動画配信を見ながらの作業・・。

(;´∀`)DayZだけどもね

image

さらに、アイテム湧き調整。

空中に湧くときがあるので、これの対策もしておくが、完全じゃない。複数湧かすと、広がるため。

if ((_numberOfItemsToSpawn > 0) and (_lootPosition select 2 > 0.5)) then
{
     _numberOfItemsToSpawn = 1; // not ground
};

こんなので、ごまかしておく。

image

ガソリンスタンドで、無限に給油できるんですが、これをやめたい。・・が、どうにも仕組みが分からない。

ExileClient_util_fuel_getRealFuel

で、スタンドの給油量を、強制的に0にしたんだけど、駄目やった(CfgExileCustomCodeにてOverload)

追記:poptab湧き

image

Exile_PopTabsを登録しても、画面上に表示されないようで、通常のアイテムとしては使えないみたい。

こんな所に時間を掛ける訳にもいかないので、画面には表示されてないが、数Poptabをアイテムに添えておく事にする。

追記:loot_boxソースを綺麗にする

image

拙作loot_boxアドオンのソースが汚すぎる事に気づき、なるだけ綺麗に書き直す。

(;^ω^)private入れてへんかったw

可能であれば高速化する。

追記:Exile隠れアイテム

image

Exileのデフォルト設定ではコメントになってて、出現しない隠れアイテムやArma3側アイテムが結構あります。

せっかくなので、全開放してみようと決断。ちょいちょいやってたけど。

H_HelmetO_ViperSP_hex_F

とかいうヘルメット。最上級のようです。なんてったってサーマル機能付き。

optic_tws

というアイテムもデフォでは無効になってました。サーマル機能付きスコープ。

夜間でもプレーしやすくなりますよね。一応テストプレーしてみて、チート級アイテムだったら、無効にしますけど。

スプレイ缶/Exile_Item_SprayCan_Blackとか、消火器/Exile_Item_FireExtinguisherとか。

使いみちがないので、ゴミアイテム認定になってしまうけども・・。クラフトで使えるとか、あるかもしれない。

(;^ω^)ようはサバ缶次第

追記:ドアが開いてる(アイデア)

image

初期状態では、マップ上全ての建物のドアは、ご丁寧に閉まってます。

これをランダムにしたらどーかと・・。

(;^ω^)雰囲気出るねぇ~

プレーヤーが居た形跡として、このドアの状態を確認したりしますが、これを、無効化する訳です。。。

image

ドアの開け閉めには、BIS_fnc_doorコマンドを利用します。公式

残念ながら、公式を見ても、な~んにも書いてない・・という。

[_Buildding,ドア番号,0 or 1] call BIS_fnc_Door;

が仕様のようですが、ググッてみると、何か動作が怪しいようです。

コマンドにバグ(参考)が入ってるようで、一度”this”という変数にも、オブジェクト値を入れておけば大丈夫だそうです。

(;^ω^)

んで、この機能もloot_boxアドオンに入れ込む予定です。

ただ、クライアント側で実行しなきゃならんかったら、駄目やけど。

追記:AIパトロールの移動先

image

OccupationアドオンのAIパトロールが、結構適当なので、ちゃんとパトロールさせておきたい。

@a3_exile_occupation/scripts/occupationVehicle.sqf(304行付近)

                [_group, _spawnLocation, 2000] call bis_fnc_taskPatrol;

と書かれてる部分が、パトロール先を指定してる部分。つまり、完全にランダムです。

MAP上の意味の無い場所をパトロールしてても、せっかくの効果が無いわけです。

んで、これを、以下のコードに変更します(まだテストしてません)※修正

private [“_wp”,”_wppos”];
private _locations = (nearestLocations[_spawnLocation,[“NameCity”,”NameCityCapital”,”Airport”,”NameLocal”],3000]);
{
     _wppos = position _x;
     private _locationName = text _x;
     private _locationType = type _x;
     private _ok = true;
    
     if(_locationType isEqualTo “NameLocal”)then{
         private _name=toLower _locationName;
         if !((_name find “airport”)>-1 or(_name find “airfield”)>-1 or(_name find “military”)>-1)then{
             _ok = false;    // non military area
         };
     };
     if(_ok)then{
         _wp = _group addWaypoint [_wppos,300];
         _wp setWaypointBehaviour selectRandom[“SAFE”,”AWARE”,”COMBAT”];//,”STEALTH”
         _wp setWaypointCombatMode “RED”;
         _wp setWaypointCompletionRadius 100;
         _wp setWaypointType “MOVE”;
         _wp setWaypointSpeed “FULL”;
     };
}forEach _locations;
_wp = _group addWaypoint [_spawnLocation,300];
_wp setWaypointBehaviour selectRandom[“SAFE”,”AWARE”,”COMBAT”];//,”STEALTH”
_wp setWaypointCombatMode “RED”;
_wp setWaypointCompletionRadius 100;
_wp setWaypointType “CYCLE”;
_wp setWaypointSpeed “FULL”;

こうすると、スポーン位置から3Km内の大きな町や空港を、移動先として巡回します(小さな集落は無視)

修正しました。ミリタリーの判断を正確に行うようにしました(でも、マップの定義次第によるところがある)

ビヘイビアを、SAFEとかCARELESSとかにすると、ちゃんと道路を走るようになるようです。

addWaypointの300を、大きくすれば、よりランダムな位置になります。ここでは、300mの範囲でランダムとなります。

image

これだと、サーバ起動時に決まった順路になってしまいそうなので、順路をランダムにするのも手ですね。

private _locations行のすぐ下に、Exileのユーティリリティを使いましょう。

_locations = _locations call ExileClient_util_array_shuffle;

ウェイポイントの順序をシャッフルしちゃいます。

(;^ω^)

長くなってしまったので、結果は次の記事で。

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

20190101174244_1

追記:アイテム湧き最終調整

追記:超簡単さらなる圧縮

追記:オーディオファイルの編集

追記:SFXサウンド

追記:lootboxアドオンの更新

追記:ゾンビのLOOTアイテムも弾抜き

追記:謎エラーの原因わかった

追記:謎エラー

追記:高速化してる?

元日ですか、そうですか。。

(;^ω^)あけおめ~初詣行ったよ~

以前、Battleyeキックに悩まされてるので、いっそ、綺麗にゼロから書き直そうと、やり直し作業をしております。

嫌々ながら作業してたので、書き間違いがあるやも、しれなかったので。

20190101174254_1

管理用のAdminToolKitで十数個、これはしょうが無い。ミッションに含めてる、スクリプトで数個。

image

この世にチーターがいなけりゃ、こんな仕組み要らないのよ・・。

battleyeホルダーのscript.logにキック対象のコードが書き出されるので、これを以下のルールに従って、script.txtに追記していきます。

Exileでは、各行毎にコマンドが紐付けされてるので、エラーコードも控えておきます(例:#21 とか)

・”(ダブルクオート)にエスケープ処理(頭に半角/を書く)

・/(バックスラッシュ)にエスケープ処理

・改行を\nに書き直す

・頭と最後は、”・・・”の感じで括られる

※つまり1行で纏め上げる。これの他、余計な記述は一切許されない

エラーコードが、たとえば#7と書かれていたら、+2でscript.txtの9行に追加する必要があります(決まりごとなので+2で覚える

んで、追加する際は、空白と”!=”を頭に書く必要があります。

!=”・・・・・・” こんな感じになります。

意味的には、このコードはキックされない例外ですよーと、Battleyeに教えてる意味になります。

image

もうちょいだけ説明。各行の頭には、意味深な数字がありますが、7は、キック&ログ出力という意味(全部7だけども)

上写真のように、createVehicleなら、この行のフィルター内にこのコマンドが入ってるのが分かるはずです。

ちなみに、サーバ起動中に、このscript.txtを書き直しても、適用されないので、また、起動し直さないといけない。

そう、これが辛いのよ。。。

(;´Д`)

追記:高速化してる?

image

上作業で、何度も起動を繰り返してる訳ですが、ついでなので、起動パラメーターでの高速化もチェックしてます。

デフォルトで自動的に最適に設定されてそうですけども、あえて、明示的に設定してみる。

追加スレッド(exThreads)では、各処理にスレッドが割り当てられる。これは、サーバでも同様です。

大型ページのサポート(hugePages)では、より大きなメモリ操作が行えるようになる。今どきのPCなら、沢山メモリ積んでるわけですし。

ログなし(noLogs)クライアント限定。クライアント側なら、ログはまず不要でしょう。実際、ほとんどログ出てません。

世界(-world)クライアント限定。起動時に読み込むMAPです。実際にサーバに接続するまで、MAPは分かりっこないんですよ。

image

サーバはAMD CPUなので、もしかして自動適用されてないかも・・と思ったので、CPUカウントや、メモリ系関連パラメータをイジって起動テスト。

以前のように1コアに処理が集中する事が無くなったような気がします(気がするだけかもしれない)

追記:謎エラー

20190101213205_1

うむむ・・・。

アイテム湧きが動作しなくなる謎エラーで足止め状態。。

エラーログにも出てないし、改造したコードを戻しても治らない。

なんでや・・。

20190101220105_1

ね?ゾンビちゃん。

image

そうなると、自然とコード解析になってしまうんですよね。

(;^ω^)

実際のアイテム湧きは、サーバ側で実施されてますが、湧きのリクエストはクライアント側から行われてます。

ExileClient_system_lootManager_thread_spawn.sqf

なので、サーバ側は指定された1個の建物内に沸かせて、1ターン終了という感じ(建物には別途IDが振られる。これはガーベージコレクタ関連でしょう、多分)

ざっと見た所、特殊な事はしてない。

image

Youtube動画を見ながら深夜作業。

ExileServer_system_lootManager_spawnLootInBuilding.sqf

に、こんなの埋めて、湧き対象の建物を全てリストアップしようとしております。

diag_log format[“[********ITEM LOOT]:: %1 , %2 (%3)”,typeOf _building,_lootTableName,count(_localPositions)];

嗚呼・・地道なデバッグ作業ぇぇ。

(;´Д`)

20190103030712_1

むむむ?

アイテムが沸かなくなった建物のログが出てないぞ・・・。

CUP MODで仕様が変わったとか・・?(直前に、大きくバージョンが上がっていた)

3:05:35 Object id 9d629e3b (1595) not found in slot 83,235
3:05:35 In last 3000 miliseconds was lost another 2 these messages.
3:05:35 Link cannot be resolved

こんなログが出てる。

う・・・む、要調査や・・・。

(;´Д`)

20190103031558_1

建物のクラス名の変更は無いようですし。

image

MODのchangelogを見ても特に見当たらない。

もう一回、CUPをダウンロードしてこようか。。

image

(次の日)

サーバ(手動DL)クライアント側(SteamでDL)のCUP MODを見比べてみた。

バージョンは一緒っぽいけど、ファイルの数がちゃうッ!

ヽ(;゚д゚)ノ なんでや

Steamを信用して、クライアント側からサーバにコピーする。

無論、Linuxサーバなので、ファイル名の大文字が無いかのチェックも怠らない。

(;^ω^)

追記:謎エラーの原因わかった

20190103213020_1

単純にMODのバージョンが違っていたというオチでした。

短期間の間にCUP MODバージョンが上がっていたようでした。

(;´Д`)

TerrainsとCore両方1.11.0だったと思っていたんですが、この数日間の間に1.11.1に上がってたらしい(terrainsは1.11.2)

20190103211811_1

無事、アイテム湧きを確認。

( ´Д`)=3 ふぅ

MODバージョン相違すると、サーバからキックされると思ってたんですが、サブバージョンは無視されるとか?

image

サーバ起動してから、軽い気持ちで映画を見てしもうた。ピクセルってやつ。

これのお陰で、サーバリスタートが正常に動作するのを確認できたw

(;´∀`)2度もリスタートしてたわ

image

ログにはこんなケタタマしいほどのリスタートの文字が・・。

長い事やってるが、そういや、初めて見たw

(;^ω^)

追記:ゾンビのLOOTアイテムも弾抜き

image

アイテム湧きに、過酷なマガジン弾抜き改造を施してる訳ですが。。。。

ゾンビが所持してるアイテムにも、実施しませう。

(;^ω^)

@exilez/scripts/SpawnZombie/SpawnZombie.sqf(132行付近)

                _zombie addItemToVest call _lootGroup;

この行を以下の様にします。

private _vestContainer = vestContainer _zombie;
private _item = call _lootGroup;
private _ammoCount = getNumber(configFile >> “CfgMagazines” >> _item >> “count”);
if(_ammoCount > 1)then{
     _vestContainer addMagazineAmmoCargo [_item, 1,floor(random _ammoCount)+1];
}else{
     _zombie addItemToVest _item;
};

これで、華麗に弾抜きしちゃいますよぉ。

何度かテストプレーしてますが・・・

m9( ゚д゚)か、過酷ッ!

追記:lootboxアドオンの更新

image

拙作のlootboxアドオンも、同様に弾抜き機能を入れ込みます。

配布元(GIT)

また、loot箱内にアイテムが散乱しすぎてるきらいがあるので、適当に削除する機能も入れ込む。

Poptabが大量すぎる気がするので、デフォルト設定値を、Exileデフォルト値に近づける。

追記:SFXサウンド

image

マップ上で音が鳴るようにしてるんですが、だいぶ以前に書いた部分だったので見直し。

こんな感じで複数定義して、後はランダムで適当に選んで鳴らしてくれる(description.ext)公式CfgSFX

5番目の引数が、ランダムで適用される確率値で、多めに鳴らしたいサウンドに偏らせる事が出来る。

追記:オーディオファイルの編集

image

ミッションファイルを太らせてる原因だったサウンドファイルを、さらにダイエットするため編集。

大体半分程度まで圧縮できた。

(゚∀゚)

追記:超簡単さらなる圧縮

image

ミッションファイルは可能な限り小さい方が良い。全てのプレーヤーがダウンロードする訳なので。

設定ファイルとなると、軽く数千行行ってしまう訳で、そんな設定ファイルは大量にあります。

保存する際、改行コードをCR+LFではなくて、LFにする事で、1行辺り1バイト削る事ができる訳です。可逆なので安心。

って事は、1ファイル(≒設定)辺り、10~30KBは簡単に削れます。

追記:アイテム湧き最終調整

20190104215016_1

デバッグが済んで、やっとこさアイテム湧きの調整(多分これで最後でしょう)をやってます。

多からず、少なからず、たまにはボーナスも・・という微妙な感じを出したい。

途中、拙作アドオンのAIさんと遭遇。

装備がしょぼいので、すぐ分かるw

(;^ω^)

20190104215918_1

鹵獲もアイテム取得の手段です。こちらも、調整。

しかし、5.56mm使いやすい。プレーヤーとしてプレーしてた時は、7mmばっかだった。

20190104221112_1

どこぞの空港にて。

( ´Д`)=3 ふぅ

来年もよろしこで御座います

image

ずっとこさArma3サーバの作業をやっては、心が折れの繰り返しで、とんでもない長期に渡ってしまってます。

2019年には、公開できるはずですので。

(;´Д`)

年末年始は(現在も)まったりサーバ構築作業をしておりました。

気付いたら大晦日じゃねーかと、急いで記事を書いた始末。。