「dayz」タグアーカイブ

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

20181029181843_1

追記:続き再開

追記:ゾンビアイテム格納場所:追記

追記:ゾンビその他改造

追記:看板とか・・

追記:ゾンビ爆発ランダム遅延

細かい調整に入っております。

ソロプレー志向なので、アイテム要素を多分に弄っております。

image

ゾンビが出るサーバなので、サーバMODであるExileZの改造に入ります(ゾンビスポーン用アドオン)

うちのゾンビは、ちょっと違うぞ。

(;^ω^)

ですが、動作のほとんどはRyanZombie MODで実現されているので、肝心なところは改造できないんですけどもね。

ゾンビ所持アイテム

ゾンビが生成される部分はここ。

ExileZ/scripts/SpawnZombie.sqf

所持アイテムがベストに1個だけという形になってるので、これを複数個ランダムにしようと思います。

_zombie addItemToVest call _lootGroup;

の部分を。

for “_i” from 0 to round(random 4) do {
     _zombie addItemToVest call _lootGroup;
}

とします。これで、0~3個ランダムとなります。

追記:格納場所(追記:服は無しだった)

そういえば、裸のゾンビは居ないので、ベストだけじゃなくて、服にもランダムで格納しちゃいましょう。上記を、これに変更するだけです。

if(random 1 >0.5)then{
     _zombie addItemToVest call _lootGroup;
}else{
     _zombie addItemToUniform call _lootGroup;
};

追記:ゾンビは服を着ていない事になってた。よって、このコードは意味無しッ!

爆発物をイジる

ゾンビを倒すと確率でグレネードが起爆するトラップがありますが・・。

これを、スモークグレネードだったりする、プチどっきりを入れ込みます。

ExileZ/scripts/MPKilled.sqf

コードの最後の方。

EZM_ExplosiveType createvehicle position _unit;

これを。

(selectRandom EZM_ExplosiveType) createvehicle position _unit;

とします。

EZM_ExplosiveTypeの設定項目は配列にする必要があります。こんな感じになります。

EZM_ExplosiveType=[“mini_Grenade”,”SmokeShell”,”SmokeShellRed”,”SmokeShellYellow”];

キル時の表示を無効にする

ゾンビを倒した時に表示されるスコア、設定で無効にできないのがこれ。

ExileZ/scripts/MPKilled.sqf

の、124行辺り。

[_playerObj, “showFragRequest”, [_killerRespectPoints]] call ExileServer_system_network_send_to;

これが表示のところですので、これをコメントアウトします。

建物の中からスポーンする

屋外でのみ湧いてるようなので、建物の中でも沸かせたい。

ExileZ/scripts/GetRandomLocation.sqf

ここで、スポーン場所を決めてるようです。

ExileZ/scripts/VerifyLocation.sqf

その後、ここで、スポーン場所のチェックを行ってる(トレーダー付近とか、ブラックリストとか)

追記:続き再開

プライベートで用事が出来たので、作業ができなかった。んで、続き。

GetRandomLocation内で、ランダムで場所が決められます(湧き範囲考慮)

ここに、近くに建物があった場合に、建物圏内から湧くようにします。

最後の方のここを改造。

    _position = _position findEmptyPosition [0,10,”Man”];

これを。

private [“_list”,”_pos”,”_cnt”];
_list = _position nearObjects [“House”,10];
_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”];
};

に変更(追記:ちょっと修正)

※まだテストしてません(追記:エラー無し確認)

ランダム地点から10m範囲に建物があったら、ランダムで建物が選ばれて、そこから湧きます。建物内番号は0に固定しました(入り口付近になるかと・・)

プレーヤー認識距離設定外だった場合に、建物内に棒立ち状態のはずです。つまり・・、ドアを開けた途端にゾンビに遭遇・・とかw

(;^ω^)

追記:ゾンビ爆発ランダム遅延

爆発する際に、秒数を設定できますが、これをランダムにしてしまうのも、アリ・・かと。

ExileZ/scripts/MPKilled.sqf

最後の方のこれを・・。

sleep EZM_ExplosionDelay;

これに変更します。設定秒が最大秒となって、ランダムとなります。最小値は+1の部分を弄ってください。

sleep floor((random EZM_ExplosionDelay)+1);

追記:ゾンビその他改造

image

ゾンビ毎にライフやアタック速度が違っていたら・・と調べていたら、これは出来ないらしい。

Ryanzombieshealth/Ryanzombiesattackspeed/Ryanzombiesattackdistance/Ryanzombiesattackstrenthなどなど

グローバル変数に格納する形で、値を渡してるので、全体の設定となってしまう。

追記:看板とか・・

image

これ、ミッションファイルの中身なんですけども・・。

(;´∀`)

こんな事やってるから、ミッションファイルがダイエットできへんねん。

b26

分かる人には分かる、このロゴマークッ!(北日本限定)

もっと凝るつもりだったが、この辺で勘弁願いたい。いやいや、凝るとこ間違ってる。

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

20181027133752_1

追記:ミッションファイルのダイエット

うむむ・・色々やってみたが、原因が分からない。

(;´Д`)

これでは全く進展がなさ過ぎるので、適宜、Battleyeフィルターを編集して様子を見ていこう。

前にもやった事はあるので、抵抗は無い・・・。

(;^ω^)

20181027131422_1

武器を拾うと確実にキックされていたが、確かに出なくなった。こんな感じで、1アクションづつ探しては潰していく作業が必要になるわけです・・。

(;´Д`)

Battleyeフィルタへ追記する方法

image

1.battleye/scripts.logに吐き出されたログをどこかにコピペします(例:下コードの赤字の部分)

27.10.2018 13:09:09: ***(****:2304) 20c31840bede2635cad1821a7dd7bf3b – #31 “ion) <= _range}) then
{
_players pushBack _x;
};
}
forEach allPlayers;
_players”

2.改行を”\n”に置換して、1行にまとめます。

“ion) <= _range}) then\n{\n_players pushBack _x;\n};\n}\nforEach allPlayers;\n_players”

3.特殊文字をエスケープします。

フィルター文字列は”~”でクオートで囲まれており、そのフィルター文字列内の特殊な文字をエスケープ処理します。

”があったら、頭に \ を書く(見難いので要注意)

\があったら、\\と書く(見難いので要注意)

最初と最後は、通常のクオートになるので、エスケープしないように。

4.そして、頭に”!=”を追記。

!=”ion) <= _range}) then\n{\n_players pushBack _x;\n};\n}\nforEach allPlayers;\n_players”

5.そして、ログの”#番号”を確認して、script.txtの番号+2行のところに移動します。

既に何かが記述されてるはずです。#31なら、33行目。

33: 7 allPlayers !=”[_index,・・・・・・

6.この行の最後に、空白に続けてコピペ追記します。

・・・ClimbingPlayer” !=”ion) <= _range}) then\n{\n_pla

これで完了です。サーバの再起動が必要になります。

image

かなりの量を追加しましたが、一向にキックされますねぇ。。

(;´Д`)しんどい

んで、ここで、今更ながら気付く事があった。

一度、Arma3クライアントを終了しとかないと、ミッションファイルを再ロードしてくれないッ!

m9( ゚д゚)!!おのれキャッシュ

ミッションPBOをイジったら、一度クライアント側も再起動しないといけないようです(大事な事なので2度チェックした)

えぇ・・前もそーだったかな。。

(;´Д`)

Arma3起動スイッチに、キャッシュ無効とか無かったよね・・。

image

一通り、Battleyeキックが無くなってきたので、次の進む。

initPlayerLocal.spfのトレーダーの書き方は、基本的に1.0.3のまんまだったんですが、これ、ダメみたい・・。

(;´Д`)

ExileClient_object_trader_create(Exile Mod/exile_client/code)を見てみると、引数はこうなってる。

_traderClassName = _this select 0;
_traderType = [_this, 1, _traderClassName] call BIS_fnc_param;
_traderFace = _this select 2;
_animations = _this select 3;
_position = _this select 4;
_direction = _this select 5;
_attachToObject = [_this, 6, objNull] call BIS_fnc_param;

1.0.3の頃の書き方と比べてみると、トレーダーの装備品の引数が無くなってしまってる。また、以前はベクトル指定だった角度も、単純な方向指定になってた。仕様変更してんのね。

戻り値は、createVehicleLocalオブジェクトそのままなので、カスタムしたかったら、自由にイジれます。

書き直しっすねぇ~。

(;´∀`)あはは・・

スタート時に書いてたスクリプトが動いてなかった理由がこれだった。理由が分かれば嬉しい(エラーで止まってた)

EDEN書き出しのリスト状態のトレーダーデータを使うなら、これでイケるはず。装備も角度も、そのまま使える。

{
     _trader = [(_x select 0),(_x select 0),(_x select 3),(_x select 1),(_x select 5),0] call ExileClient_object_trader_create;
     _trader setUnitLoadOut (_x select 4);
     _trader setVectorDirAndUp [_x select 6, _x select 7];
}
forEach _npcs;

image

ぞんびらいらいさんのライブ配信を見ながらの作業で御座います。

(;^ω^)

20181027161249_1

黄色のダックちゃん、めっけ。

(;^ω^)

20181027161418_1

自作アドオン、車両湧き、動作確認。

20181027161514_1

自作アドオンのクレイトも確認。

20181027204354_1

スタート時に動作するスクリプトも、久々に稼働した。

まだ、チョコチョコと、Battleyeキックされてるので、その都度フィルターに追記してます。

もう、30個位は追加したかもしれない。

(;^ω^)

追記:

Battleyeキックログは、scripts.logに出力されますが、remoteexec系のキックログは、違うファイルになるようです。

remoteexec.log

追記:ミッションファイルのダイエット

image

ミッションファイルをダイエットしなきゃ・・なと思いつつ、今のタイミングで、軽量化。

プレーヤーさんやサーバのロード時間の短縮にもなるし。

(;´∀`)

ミッションファイル内で最も大きいのが、config.cppという設定ファイル(総10000行近い巨大なテキストなんですよ)

EXILEのほとんどの設定情報がメタで存在してるので、無駄な空白やコメントが多い。

これらをメンテ可能なレベルのギリギリなところまでダイエットしてみる(空白をタブにしたり・・)

海が無いマップなので、海関連の設定を全削除。

※ついでに、ヘリの値段を3倍にする

一日がかりで、30KBほど削ったんですが、もう・・疲れた・・。せめて、総量1MB以下に抑えたいが難しい。

(´;ω;`)現在1178KB

あとは、オブジェクト配置データのinitServer.sqfも大きい。

これも空白コードを削除すれば、1/3位は削れると見込んでる。EXILEのシステムとは離れてるので、コードは自由にイジれるし・・。

正規表現で一気に置換するのは、とても気持ちいい。

(;´∀`)エラー出たら、ふりだしに戻る訳だが

エディタは、Notepad++というのを好んで使ってますが、もうちょっと痒いところまで設定できるモノの方が良いかもしれない。

今どきだと、VisualStudio Code辺りなのかな。環境変えるのもリスク有るし(sqf対応してたりして、pboパックとか?ま・・まさか・・な)

image

ミッションファイルは、一度サーバにインすると、(ドキュメント)/AppData/Local/Arma/MPMissionCacheという場所に保存されます。

これをアンパックすると、そのサーバの設定内容が全部モロバレなのです・・。

(;^ω^)暗号化PBOとか考えてよボヘミアさん

このファイルをイジっちゃえば、いくらでもチート出来るんじゃね?・・と思った貴方は賢い、がッ!これを監視してるのがBattleyeなのです。残念ッ!

んで、この前インした、BadAppleさんの現在のミッションファイルサイズが気になったので・・。

2.857MBですか。

あれだけのMODをサポートするとなると、やっぱ大きくなっちゃいますよね。

TKGさんのLythiumサーバだと、7.387MBッ!

ヽ(;゚д゚)ノ でかっ!

おいらのサーバの7倍っすか。

ちなみに、バニラのEXILEミッションだと、Altis 371KB、Tanoa 466KB、Malden 371KBと、とっても小さい。

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

image

なんなんですかね。。動いたり動かなかったり・・。

。゚(゚´Д`゚)゚。

根本的に見直すため、1個イジっては挙動を確かめる地道な作業をしておりますい。

確かめていくうちに、(設定がおかしいのは勿論ですが)、何か根本的なやつがおかしいっぽい空気を察してきました。

動く付属バニラExile.Altisミッションを交互に起動して、何が違うのか、もうちょっと時間が掛かりそうです。

(;´∀`)

今、直近のトラブルはこれ。

14:59:34 nabe uses modified data file
14:59:34 BattlEye Server: Player #0 nabe (*****:2304) connected
14:59:34 Player nabe connecting.
14:59:35 BattlEye Server: Connected to BE Master
14:59:44 BEServer::finishDestroyPlayer(********): users.get failed

ログにこれが書き込まれて、Arma3がロード画面フリーズになってしまう。Battleye関連なんだろうけども。検討つかん。

20181021182918_1

Battleyeを無効にすると、あっけなくインできるんだけどもねぇ・・・。

(;´Д`)・・・

んで、(今さら)分かった事を、随時書きなぐっていく(Linux Dedicated)

マップの選択

今までミッションでのマップの選択はどこに記述するのか明確に分かって無かった(これまで運良く動いてた訳)

めっちゃ単純やった。

Exile.Takistan.pbo

ファイル名の後ろに”.”に続けてマップ名を書くだけだった。これまで、EDENでファイル保存してから編集してたんだけども。バイナリコードでどこかに保存されてるんかと、思ってた。

MODの羅列

mods=@cup_terrains_core\;@cup_terrains_maps\;@zombies_and_demons\;@exile

ちゃんと調べてなかった自分が悪いんですが、正確にはこう書かなきゃいけないらしい(Linuxのばやい、セミコロンはシェルで特別な意味を持つ)

mods=”@cup_terrains_core;@cup_terrains_maps;@zombies_and_demons;@exile”

上:これは今までの悪い例。以前はこれでも動いてたんですが。

MODがシグネチャ見て正常に読まれてるように見えても、意味不明な挙動・エラーのまま動作し続ける事があるので、結構注意です(何度も遭遇)

BEserver.cfgのファイル名

このファイルももれなく、小文字にしなきゃいけない。

Battleyeが認識すると、beserver_active_5fc33ed1.cfgこんなファイル名に変更される。

bepathの書き方

確認した結果だけを。arma3serverコマンドへの引数として渡す、”-bepath”にしっかりパスを書かないと駄目みたい。

ネット上のチュートリアルだと、無記述が多いみたいだったので確認してみた。ちなみに、ログ上には何も出力されないので確認出来ない。

追記:

公式見ると、3パターンあり、-bepathの他、データパス内、profileの場所の順になるようです。

Linux版コマンドライン

Linux版ではいくつかは無効のようです。-profiles、-hugepagesなど。

-profilesが使えないとプロファイルはどーなる?と気になってしまいますが、個別指定ができないだけで、ファイル位置が決まってる(設定が散らばって気持ち悪いですが)

(ユーザー)/.local/share/Arma 3

(ユーザー)/.local/share/Arma 3 ‐ Other Profiles

これらのディレクトリを作成しとくと、プロファイルが自動で生成される。

メモリ使用量(参考)

image

アドイン無しバニラのExile.Altisを実行した際のものです(CUP MODの読み込み有り。TerrainsとCore)

ミッションスタート後1.56GBを消費。

32bit版なので少なめだろうと想定していただけに、結構いってます。

8GB積んでるので余裕だと思ってRAMDISKやら多めにしてただけに、スワップが発生していた。実稼働となると、他MODやスクリプト、MySQLが動き出すので、さらに消費する。

(;^ω^)

MODの読み込みを最低限(@Exile/@ExileServerのみ)で確認してみた所、ほぼ同様の1.52GBでした。

image

やった事&確認した事のリスト

イマイチ挙動が変わらんけども、作業した記録。インできたり出来なかったり、イン出来たとしてもBattlEye: Script Restrictionエラーが発生する。ここは、あえてBEフィルターを追加しないで対処を考える(とにかく原因が知りたい)

battleyeホルダー内スクリプトファイルの改行コードをLFに変更。

server/config.cfgの変更。

localClient[] = {“192.168.1.*”}; 帯域制限が掛からない書き方間違って解釈してた、設定不要

upnp=1; 1の方がいいよね?

verifySignatures=0; しばらくは0で確認してみる(高速化)

requiredSecureId=1; よく分からないけども記述

doubleIdDetected=”kick (_this select 0)”;の方がいいよね

allowedLoadFileExtensions[]とallowedPreprocessFileExtensions[]  手当たり次第読み込み系ファイル拡張子を記述

arma3serverのエラー出力を別ログに出力したが、特にヒントは無かった。

-checkSignaturesを確認のため取ってみる。

-debugを追加してみたが、特に変わらないような。。

-ip=**.**.**.** をあえて書いてみる(挙動が変わったような)

クライアント側の起動オプションを変更しながら、インしてみる(特に変わらない)

image

mission.sqmの書き方が丸っと違うのを確認。

自分のは、EDENが出力したまんまを利用してたんですが、ExileServer付属のモノを見ると書き方が違う。

付属のモノはシンプルになってる。

(;´Д`)直すか・・

下:俺のやつ。

class Entities{
     items=27;
     class Item0{
         dataType=”Group”;
         side=”Independent”;
         class Entities
         {
             items=100;
             class Item0
             {
                 dataType=”Object”;
                 class PositionInfo
                 {
                     position[]={0,0,0};
                 };
                 side=”Independent”;
                 flags=7;
                 class Attributes
                 {
                     isPlayer=1;
                 };
                 id=1;
                 type=”Exile_Unit_GhostPlayer”;
                 atlOffset=-294.48129;
             };

下:ExileServer付属のやつ。

class Item0
{
     position[]={13237.161,20.660374,11705.338};
     special=”NONE”;
     id=0;
     side=”GUER”;
     vehicle=”Exile_Unit_GhostPlayer”;
     player=”PLAY CDG”;
     leader=1;
     skill=0.60000002;
};

image

余談ですけども。。Arma3って、1コアに処理が集中するようで、上写真、見ての通りです。

Core i7とかRyzen2700とかの多コアは意味が無いっちゅー事になります。

Pentium位で、5Ghzで回るCPUとかあればベストでしょうね。そんな製品無いよ、・・と思ったら、過去に1個だけあったよ。。。

Pentium G3258 & Z87/87チップセット

(;´∀`)唯一のロックフリー

20181023232932_1

mission.sqmを書き直したら、おわっ、久々にインできた。

しかし、なぜだ。原因が分からないぞ。書き直しが原因とは思えない。

だが、武器を拾ったとたんBattlEye Restrictionで落ちてしまった。

BattlEye Server: Script Log: #0 nabe (20c31840bede2635cad1821a7dd7bf3b) – #31 “ion) <= _range}) then
   {
   _players pushBack _x;
   };
   }
   forEach allPlayers;
   _players”

この情報を、フィルターに書き足せば良いんだが、サーバアドイン系やスクリプトは全て無効にしてるので、バニラ状態なんですよねぇ・・。

もうちょっと基本に立ち返ってみてみよう。