コピペですぐ使えるスクリプトコマンド集です。Edenエディター(3Dミッションエディタ)の実装により、ArmA3では既に必要ないコマンドもありますが、そのまま掲載します。
this setpos (nearestBuilding this buildingPos 0);
ユニットを設置した位置に最も近い建物の0番目のポジションにユニットを設置する。監視塔が沢山ある場合などに重宝する。
this setpos [ getPos this select 0, getPos this select 1, (getPos this select 2) +5]
setPosの引数は3次元座標の配列。建物内部に配置する時などに使用。
この例ではマップ上でユニットを置いた地点の地面を基準にして、+5m高いところに設置している。
ArmA2では高さを指定するコマンドが幾つかあり、SetPosを使用した場合は地面から(海など水面の場合は海底からの高さ)が基準点(0m)となる。
Eden Editorでは殆ど使うことはない
this setUnitPos "up";
ほぼ姿勢が変わらなくなる。"DOWN","UP","Middle"を指定。
{_x setUnitPos "UP"}forEach units group this;
this setCombatMode "RED";
Waypointのengage at willと同じ。engage at willになっていないとグループリーダまたは単品で置いたユニットは動きにくくなる。
グループリーダ指揮下のユニットはどの道リーダにengage命令を受ける事が多いのであまり意味はないかもしれない。
ウェイポイントを使用したくない場合使用する。
this setBehaviour "COMBAT";
参考 http://community.bistudio.com/wiki/AIBehaviour
ウェイポイントのBehaviourと同じ。ウェイポイントを使用したくない場合使用する。
this commandWatch 3D座標;
positionはgetPosやgetMarkerPosで座標を取得する事。
gunner this commandWatch 3D座標;
車両の砲塔などが自分の意図していない方向を向いている時などに。
this flyInHeight 100;
ただし戦闘開始すると守るとは限らない。Behaviourが"CARELESS"なら守るが夜間だとライトが付きっ放し。
ArmA3では5~30mの指定は無示される模様(2017/01/08現在)
group this setGroupId ["Sierra One"];
マルチプレイではAIスロットの無効化でユニットが消えてしまうのでグループ内の全てのユニットに記述する必要がある。
clearMagazineCargo this; clearWeaponCargo this;
[this] allowGetIn false;
機械化歩兵部隊などで歩兵ユニットが車両に乗って移動しようとするのを防ぐ。配列を要求されるので注意。
ウェイポイントのUNLOADで下車させると下車したままになるっぽいのでそれの方が良いかも。
this moveInCargo 車両名;
Init欄に書くとミッション開始時にvehicleNameの車両に乗車しているようになる。ほかにもDriverやGunnerのコマンドがある。
Gunner席が複数あるユニットの場合はmoveInTurretを使用する事。
this moveInTurret [車両名, [0,0]]
[0,0]の配列は1番タレットの1番目の席という意味。タレットが一つで一つの席しか持っていない場合は[0]になる。どのタレットが何番かは適当な数字を入れて試す事。
this forceSpeed 10;
数値は秒速であることに注意。コンボイを組むときに役立つ。
this allowDamage false;
["AmmoboxInit",[this,true]] call BIS_fnc_arsenal;
制限なしのArsenalにアクセスできるようになる。アクセスできる武器等を制限したい場合、3Dエディタでユニットをクリックした時に出てくるObject:Equipment Storageから、Virtualタブを選んで、使いたいアイテムの個数を∞に設定する。
{_x setPos waypointPosition[group this, 2]} forEach units group this;
この場合は一つ目のウェイポイントのOnActに書く事。なおグループに車両が入っていると車両のCrewだけワープしてしまう。
{vehicle _x setPos waypointPosition[group this, 2]} forEach units group this;
上記の乗り物を含むグループ版。注意点としては下車歩兵が同じ地点にワープするので少しでも乗り物が動くと重なっている歩兵が死んでしまう事。まれに起きるので歩兵は出来るならカーゴに入れておいた方が良いかもしれない。
vehicleはもし対象のユニットが乗り物に乗っていればその乗り物の名前を返し、乗っていなければ対象のユニットをそのまま返す便利なコマンド。なので上記の例は車両を含む場合も歩兵のみの場合も両方で使える。
vehicle this flyInHeight 100;
ウェイポイントのOnActでthisは乗員を返すのでvehicleが必要。
vehicle this setFuel 1;
MoveとCycleを組み合わせて周回させる場合に使う事もある。OAになって燃料切れが結構ある。
true
デフォで記述してあるthisを削除してtrueにする。
player == ユニット名
playerコマンドはサーバ、各クライアント上でそれぞれ結果が違うのでトリガの実行を誰かのPC上だけなど限定するのに使える。
viewDistanceやラジオで起動するトリガの表示、天候を各クライアントでばらばらにしたり等。
player == leader group player
player != leader group playerならグループリーダ以外のクライアント上という事になる。
vehicle player isKindOf "air"
航空機に乗ったプレイヤーのクライアント上だけviewDistanceを変更するというような処理に。
"land"なら陸上ユニット、"man"なら人ユニット等。
!alive ユニット名
人なら死亡すれば判定できる。乗り物は完全に破壊しないと判定できない。
!alive driver ユニット名
ドライバーが降車または死亡で成立する。硬い乗り物の場合はこちらを使用する事が多い。
!alive( nearestObject getMarkerPos "マーカー名" )
マーカーを対象にするオブジェクトの上に置いておく事。
!alive( getMarkerPos "マーカー名" nearestObject 82054 )
82054はマップ上オブジェクトのID。エディタでIDsのボタンを押すと表示される。
ユニット名 in thisList
Condition欄: (count (allPlayers - allDeadMen)) <= (count (thisList - (allUnits - allPlayers)))
なお、プレイヤー全員がwestの場合はトリガーの設定をBLUFOR, Presentにするのが簡単。
count (thisList - [ユニット名A,ユニット名B] ) > 0
配列の減算をして除外する。
count thisList <= 5
count units グループ名 <= 5
"Land" countType thisList > 0
"Land"が陸上。"Air"が航空など。Bisのユニットでは問題ないがクラスツリーに依存するのでaddonのユニットの場合は動かない事もあるかもしれないので確認する事。
getPos ユニット名 select 2 <= 100
{ getPos _x select 2 <= 100 } count thisList > 0
thisListの配列内にz軸の座標が100以下のユニットが1ユニットでもあればという条件。
isEngineOn ユニット名
count playableUnits == 0
シングルプレイではplayableUnitsは空の配列を返すらしいのでシングルで使ってしまうと達成しないトリガになるはず。
time > 時間(秒)
サーバの負荷が高い場合サーバ側の時間が遅れてしまう事があるらしい。クライアント側は正常っぽい。
isServer
publicVariableやcreateVehicleなど複数のクライアントで実行すると不都合が生じる場合につかう。
{ _x setDamage 1 } forEach thisList;
{ _x setBehaviour "combat" } forEach thisList;
ace_sys_spectator_exit_spectator = true;
これをENDトリガーに書いておかないと、先に死んでスペクトモードに入っている人はミッションが終了しない。
というのはA2時代の話で、ArmA3では主に以下を使う。
["end1"] call BIS_fnc_endMission;
hint str(typeOf cursortarget); copyToClipboard str(typeOf cursortarget);
このスクリプトが実行された瞬間にプレイヤーが見ているオブジェクトのクラスネームを取得する。
ヒントが表示されると同時に、クラスネームがクリップボードにコピーされる。
トリガーの条件が満たされた後、指定した秒数だけ実際の発動を遅らせる。
トリガーが発動するために、トリガーの条件が満たされ続けなければならない秒数を設定する。
例えばBLUFOR Detected by OPFORトリガーでTimeoutに10秒を設定した場合、BLUFORがOPFORに発覚されても10秒以内にそのOPFORを排除すれば、トリガーは発動しない。
min / mid / maxの指定はどのような分布でランダムな秒数を決定するかを設定する。全てを同じ秒数に設定すると、必ずその秒数が使用される。
ユニットには様々な動作をさせる事が出来る。参考 http://community.bistudio.com/wiki/ArmA_2:_Actions
ユニット名 fire ["pipebombmuzzle", "pipebombmuzzle", "pipebomb"];
ユニット名 action ["TOUCHOFF", ユニット名];
ユニット名 action ["scudLaunch", ユニット名];
ユニット名 action ["scudStart", ユニット名];
バラックのユニット名 animate ["door", 1];
バーゲートのユニット名 animate ["Bargate", 0];
バーゲートのユニット名 animate ["Bargate", 1];
{_x switchLight "OFF"} forEach ( (getMarkerPos "マーカ名") nearObjects ["StreetLamp",1000]);
この例ではマーカを中心とした半径1000m以内の街灯を全てオフにしている。
doStop
doStop ユニット名;
グループ指揮下のユニットにストップ命令をゲーム内で出すのと同じ。敵を発見するとEngageの指示がリーダから来るため動き出す。
stop
ユニット名 stop true;
姿勢が変化するだけで動かなくなる。ACE負傷システム下でも動かない。
disableAI
ユニット名 disableAI "MOVE";
上半身は動くので発砲する。ACE負傷システム下で負傷すると逃げ回るようになるので完全に停止出来ない。
player sideChat "文字列";
hint "文字列";
トリガが実行されたか目で見える形で確認したり等に。
player sideChat format ["Test1:%1 Test2:%2", 変数1, 変数2];
formatコマンドを使用して文字列を生成する。%1と%2は変数1と変数2の中身を表示する為の記号。好きなだけ変数を増やせる。
変数が「ANY」と表示される場合は変数が未定義で空っぽ。
player sideChat format ["%1", units グループ名];
formatは配列も対応しているので使いやすい。unitsを使用しないでグループ名だけだとグループ名のみ表示。
[nil, nil, rHINT, "文字列"] call RE;
サーバ側でローカルな変数をクライアントで表示する。
参考 http://community.bistudio.com/wiki/Multiplayer_framework
ユニット名 setDamage 1;
数値 = ユニット名 addAction [ "メニュー名", "ファイル名.sqf" ];
マウスのホイールメニューにメニューを追加する。メニュー名に任意の文字を指定、ファイル名.sqfは実行するスクリプトファイル。戻り値は数値でアクションメニューを消す時に使用する。ここには記述しないがオプションが沢山あるコマンド。
ユニット名 removeAction 数値;
数値はaddActionで取得した番号。
1 setRadioMsg "Null";
1はRadioAlpha。Null以外のラジオ名を表示するとラジオが使用可能になる。
publicVariable "変数名";
指定した変数の値を全てのクライアントで同じ物にする。JIPでも同期される。ただし実行した時点での値で同期されるので値を更新する場合はその都度実行する必要がある。
通常はisServerと合わせて実行するのをサーバのみに限定する。ミッションの経過によりタスクの結果が消失する場合(地点の通過や占拠など)はJIPのクライアント上ではそのタスク(トリガ)は未達成になる。この場合publicVariableでそのタスクのフラグのみ同期するようにしておけばJIPのクライアントでも達成したことにする事が出来る。
逆にオブジェクトの破壊などミッション終了まで結果の残るタスクの場合はこのコマンドを使用する必要がない。
タスクの結果が消失する場合でもミッションの最後のタスクである場合はJIPを考慮しなくて良いのでやはり使用する必要がない。
condition欄をthisからtrueにして
onMapSingleClick "if ((local player) and _alt) then {(vehicle player) setPos _pos;}";
MP環境では動かないので消し忘れても安心。ロケーション探しやテストにお使いください。また、Init.sqfにonMapSingleClick以下をコピペしても使えます。
ok = "ATV_CZ_EP1" createVehicle [(getpos player select 0)+5, getpos player select 1]
この例では、トリガが発動するとプレイヤーの東側5mの位置にATVが湧いてきます。
マルチプレイだと条件文にisServerを付けて実行しないと接続しているクライアントの数だけATVが生成されてしまうので注意。