「server」タグアーカイブ

【game】Arma3スクリプト未整理の書

sc20170724192804その都度調べるのに疲れてしまたので、乱暴にメモしていきます。検証してないので嘘も混じってます。まったくの未整理です。その都度、修正・追記していきます(多分、相当長くなる)

しょうが無いね。

EXILE MODサーバ用で調べてるだけですので、他用途では参考程度に。質問はコメントに(気分屋なので返信する保証は無いけどねッ)

ボヘミア公式:言語仕様 大分類

文法メモ(独特ですがJavaScript風?)

private _val; 変数定義は不要。局所用はスコープ忘れず

_val = [“000″,”111″,”222”]; よく利用する配列(文字・数値・オブジェクトなんでも入ります)何重入れ子もOK

if(true) then{}else{}; 例外無く最後は”;”で締める。if文は忘れっぽい

swicth(_ass)do{ case “hole”: { };} でもswitchの最後は要らない

{   }forEach(_objs); forEachは良く使う(中身は”_x”に入る)

_trg setTriggerStatements [“true”,””,””]; オブジェクト(_trg)への操作はこんな感じで書きます。先頭にオブジェクト

コメント

他の主要な言語系(CやJava等)と同じ。//、/* */

コマンドリファレンス(複雑怪奇)

https://community.bistudio.com/wiki/Category:Scripting_Commands_Arma_3

https://community.bistudio.com/wiki/Category:Arma_3:_Functions

古いモノも含まれてるので注意です(BIS_から始まるもの:関数)コマンド名は動詞が先にくるものが多い。isServerとかCreateVehiceとか。

ファイルパスのデミリタ

”/”でも”¥”でも良いようだが、公式では”¥”で書かれてるようなので、統一しておいた方が良いようです。つまりはWindows向けっぽく。これでもLinuxで動作します。

スクリプトの初期化実行順序(但し、処理待ちせず並列で動作するので注意)

https://community.bistudio.com/wiki/Initialization_Order

スクリプト並列処理の諸注意

多くのタスクが並列で動作するため、タイミングによっては動作しなくなる場面があります。切り分けが難しく、現在でもsleep()などでタイミングを取ってるスクリプトが多くあります。

デバッグログRPT出力公式

diag_log format [“%1, %2”, player, time];

_arr = [1, “foo”, player, “bar”]; diag_log _arr; 配列変数を渡しても展開して出力

時間を取得する

waitUntil {time > 0}; ミッションが始まるまで待機。timeはミッションスタートからの秒数

serverTime サーバとクライアントで同期されてるミッション開始からの秒数。但し、開始時5分間はその保証が無い。

diag_tickTime 1/1000秒

_now = date; 戻り値は[year, month, day, hour, minute]

フレームレートを取得する

diag_fps 平均フレームレート

diag_fpsMin 最小フレームレート

Description.extの書き方(各種定義・サウンド等)決まり事が沢山あるので要注意

https://resources.bisimulations.com/wiki/Description.ext

ファイルを探す場所(外部スクリプトやメディアファイルなど)

https://community.bistudio.com/wiki/Script_Path

サウンド

Description.extで定義して、その名前(クラス名)を指定して鳴らす。又は、Arma3本体内蔵サウンド。ファイル形式は、ogg(オープンソース)かwss(ボヘミア独自)ミッションファイルがデカくなるので多用は難しい。

通常再生の他、3D効果(SFX/SGX)、バックグラウンド(Music)などがある。

SFXサウンド(未検証)

トリガーを絡めないと再生できない。基本的にはリピート再生。止める場合はトリガー削除でOK。エラーが頻発バグがあるため、$NONE$で回避する必要アリ(サウンド設定の類はDescription.extで細かく指定)

private “_trigger”; _trigger = createTrigger [“EmptyDetector”, position player]; _trigger setTriggerStatements [“true”, “”, “”]; _trigger setSoundEffect [“$NONE$”, “”, “”, “サウンドを指定”];

Arma3本体内蔵の効果音(これだけじゃないはず)

https://community.bistudio.com/wiki/Arma_3:_SoundFiles

検索用:playsound3d、say3D

オブジェクトから音をループで再生(もっとスマートな方法がありそう)

https://steamcommunity.com/sharedfiles/filedetails/?id=772764361

文字列の結合

“ass”+”hole” まぁ・・今風スクリプト言語っぽい

ランダムでオブジェクトを選ぶ(戻り値は要素)

selectRandom [“あ”,”ほ”,”の坂田”] 便利です

BIS_fnc_selectRandomというモノもあるが、推奨されてない。こちらはArray(要素1)で戻る

オブジェクトの生成

createVehicleで生成する。車両やAIでも、あらゆる物体は何でもコレです。違和感感じますがしょうが無いね(静的オブジェクトだけは別)Arma3固有の機能が有る状態で生成されます(武器クレイトとか)

静的オブジェクトは別で生成

シンプルオブジェクトは、MAPと同じ様に振る舞うモノで、処理速度が速い。createSimpleObjectで生成。あの忌まわしい物理演算が働きません(重要)。hideSelectionで対象選択も出来なく出来る。

物理演算について

Arma3はNVidiaのPhysXのみ対応なので、IntelビデオやAMD Radeonでは恩恵を得られません。残念ッ!!ちなみに、GeForceとRadeon2枚刺しすると、PhysXが無効になるよ。NVidiaが意地悪をしてる性だよ。ヒドイね

座標系について(要は海面基準かどうか)

https://community.bistudio.com/wiki/Position

MAPの左下が、[0,0]になってる。ゲーム中のGPSで表示されるのは、10m単位(桁に注意)

MAPのサイズを知る

_size = worldSize; //8192 (単位はメートル)

MAPの名前を知る

_name = worldName;

ロケーション関連種類

nearestLocations [player, allLocationTypes, 500]; 近場のロケーションを得る(リスト)

createLocation [className, position, sizeX, sizeY] ロケーションの作成

MAP上のランドマークリストを得る(市町村の場所)

_locations = (nearestLocations [_spawnCenter, [“NameVillage”,”NameCity”, “NameCityCapital”], _maxDistance]); ロケーションタイプの指定で対象を変更

ある場所から平坦っぽい場所を得る公式

イベント発生地や安全に車両を沸かせたい場合に便利

findSafePosを利用する方法

_tempPosition = [_pos,0,_maxDist,15,_inWater,20,0] call BIS_fnc_findSafePos;

isFlatEmptyを利用する方法

position isFlatEmpty [minDistance, mode, maxGradient, maxGradientRadius, overLandOrWater, shoreLine, ignoreObject]

ある場所から最も近い建物を調べる(リスト)

_buildings = _selectedPlayer nearObjects [“building”, 20];

ある場所から最も近い道路を調べる(リスト)

_nearRoads = _position nearRoads 500;

ある場所から最も近いオブジェクトを調べる(リスト)

nearestObjects [_position,[“Land_UWreck_MV22_F”],750])

_list = player nearEntities [[“Car”, “Motorcycle”, “Tank”], 50];

オブジェクト間の距離を測る(distance/distance2D)

2次元平面での直線距離か、高度も入れた最短距離かで選びます。

_meters = position player distance nearestLocation [position player, “hill”];

ある場所が水・海の中かを調べる(bool)

_isOverWater = surfaceIsWater _position;

マップマーカー関連マーカー

_marker = createMarker [format [“%1”, _locationName],_spawnPosition];
_marker setMarkerShape “Icon”;
_marker setMarkerSize [3,3];
_marker setMarkerType “mil_dot”; マーカー種類
_marker setMarkerBrush “Solid”;
_marker setMarkerText _markerName;
_marker setMarkerColor _markerColour;
_marker setMarkerAlpha 0.5;

トリガーの動作

20170724221714_1イベント条件判断には、トリガーを利用する事になりますが、イマイチ良く分からない場合。

Arma3を英語モードにして、条件の可否を確認すると分かり易いです。

英語モードにすると、引数やらが公式リファレンスと同じ表記になるため。

トリガーの作成(詳しくはリファレンス)

デフォルト値を保有してるので全て指定する必要無し。

private _trg = createTrigger [“EmptyDetector”, _pos,true];
_trg setSoundEffect [“$NONE$”,””,””,””]; エフェクト類
_trg setTriggerActivation [“NONE”,”PRESENT”,true]; 対象
_trg setTriggerStatements [“true”,””,””]; 条件式や動作スクリプト

設定ファイル(config)から読み出す(Arma2時代とは違う所)

_header = getMissionConfig “Header”

_respawnDelay = getMissionConfigValue [“respawnDelay”,0]

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

20170723203716_1暑さと、仕事が忙しくて、ほとんど作業が捗ってません・・。

(;´Д`)

1PCで、ARMA3サーバ+クライアントを動かすと、CPU負荷率はほぼ100%にひっつきます。

よって、想像を超えた暖房器具になってんです。一時期は、PCを窓の外!?に置いて作業してたくらいです。

20170720214433_1ちょこちょこと弄っては改修してます。

この場面は、EXILE鯖缶なら誰しもが通る道、「缶詰整理作業」の様子(これも地獄の作業)

私は、これをやりたくなくて、別な方法(手抜きとも言う)でやってたんですが、やっぱスタンダードな方法でやり直してます。

ちなみに、この缶詰の名前は。。

「because arma」(;´Д`)・・・・

20170723205252_1テストプレーもしてます。

こんな・・とか。
20170723205821_1こんな。
20170723210624_1ニワトリさんの前で、FRIEDとか。


sc20170723211814公式ランチャーでは、EXILEサーバだけで、ざっと5000を越えてます

ヽ(;゚д゚)ノ!?

ほとんどが海外ですけども。

しかしながら、プレーヤーがインしてるサーバは、10%程度なんですよね。

sc20170723203530どうせ、サーバをあげるなら、過疎でも・・オリジナリティのあるモノに仕上げたいので、もうちょい粘って構築します。

やっぱ自分でプレーしていてもオモロイ出来にしないと。

アリモノだけじゃなくて、アドオンの改造にも手を入れてます。

ゾンビは今の所いないんですが、導入するか、悩んでます。

sc20170723224614

・・と考えながらも、沸いたアイデアは実現しようとすぐさま作業に入ってまいます。

(;^ω^)

ペンディングリスト(作業予定)が凄い事になってます。

あぅ、GIMP使いづらいよ・・。

sc20170724001812ARMA3のスクリプトは正直良く分かりません。

公式サイトはあるんですが、イマイチ。サンプルも皆無。

ほとんど情報が無いので、他の人が作ったスクリプトを見ながら、言語仕様を覚えていくという感じです。

乱数(random)は、単純に乱数を作る他、偏らせる事も出来るみたい。オモロイですな。

トリガー(createTrigger)でスクリプトを走らせる事ができます。EDENで適当に作って中身コードを見れば良いな・・と思っていたんですが、バイナリ?で生成されてんですね・・。

うむむ・・(;´Д`)

書いては、動作確認の繰り返しですな・・。

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

20170708182011_1地獄の様なサーバ構築作業中で御座います。

この写真が物語っております。

(;´Д`)

座標がズレまくっとるんです。

大量に配置したオブジェクトを、1個1個調整してるんですよ。

ほら、ARMA3って、起動に時間が掛かるでしょ。編集しては、確認の繰り返し・・想像出来ますでしょうかw

sc20170708194940もう、心が折れそうです。

ほとんどのEXILEトレーダーって、地べたに無造作に配置してるパターンが多いじゃないですか。

これが理由だったんでしょう。

ここまで来たからには、妥協はしたくないんですね。

20170708181918_1今は、トレーダー(NPC)の配置で調整してますが。

先日までは、(数百個の)MAPオブジェクトと格闘していたんです。

こちらは、もう、妥協できる所まで完了しました。

20170708182107_1もう、これ位のオブジェクトの浮きは勘弁してもらいたいw

(;^ω^)
20170708182936_1( ´Д`)=3・・w

0.01レベルで調整しないといけないんです。

これだと、Z軸で、0.03位かな・・と、目視で分かるようになってしまった私がここにいる・・。

sc20170708230657しかし・・訳が分からない。

オブジェクトには、大きく2種類あって、動作するか、又は、静的なシンプルオブジェクトがあって。

前者のもので配置してしまうと、問答無用で物理演算が働いてしまう。

ちょっとでも触れてたら、どっかに吹っ飛ぶ訳です。

(;´Д`)

トレーダーなんかだと、雰囲気作りのため沢山のオブジェクトを置くので、恐ろしい事になります。

なので、こういった場面では、シンプルオブジェクトを利用するのです。PhysX・物理演算も無いので、より高速で処理ができる。サーバにとっても、クライアントにとっても良い訳です。

しかし、オブジェクトによっては、シンプル化できないものがあるんです。

車両、ドアの開閉するもの、武器や装備品の多く、アイテムの一部など、結構存在してます。

これの判断材料が、今のところ分からない・・という問題が。

でも、一応、createSimpleObjectに、3Dモデルデータパスを指定すれば良いのは分かってるので、なんとかなりますが。

エディタ(M3Editor)が出力したデータは、クラス名だけで、そのままでは通せない(シンプル化できるオブジェはクラス名だけでも通るみたいだが)

sc20170708231801上の写真の様に、様々なスクリプトを書いてはテストしてるのですが、一向に改善しません・・。

ほんと、手作業で一個づつ書き直していくしか無いんか・・。

(´;ω;`)

以下は備忘録なので。

M3Editor書式そのままを、シンプルオブジェクトで置く(上記の問題有り)

private _simpleObject = createSimpleObject [_x select 0, _x select 1];
_simpleObject setVectorDirAndUp [_x select 2, _x select 3];

一度ダミーで動的オブジェクトを作り、それを元に3Dモデルパスを取得後、静的オブジェを作成(問題有り:そもそもモデルパスが帰らない)

private _dm = (_x select 0) createVehicleLocal[0, 0, 0];
private _in = getModelInfo _dm;
private _so = createSimpleObject [_in select 1,_x select 1];
_so setVectorDirAndUp(_x select 2);
deleteVehicle _dm;

静的オブジェクトでも、綺麗に整頓してくれる便利な関数。だが、結局のところ微妙。

[_so,_in] call BIS_fnc_adjustSimpleObject;

オブジェクトの作成で、以下のように5引数に”NONE”というのが最も高速なんだそうです。ちなみに、”CAN_COLLIDE”は、(物理演算しない?)強制配置になりますが、微妙でした。

private _so = createVehicle[(_x select 0),(_x select 1),[],0,”NONE”];//CAN_COLLIDE

createVehicleで作成されたオブジェクトは、非同期で作成されるので、ものによっては、生成前にコードが走ってしまう場合があります。なので、0.5秒は待てと、公式では言ってるようです。

(´・ω・`)知らんがな

(追記予定)