フォーラムへの返信
-
投稿者投稿
-
Stealerメンバー
市街地での殲滅ミッションの製作と進行を補助する S&D Marker Manager スクリプト
セクターごとに置いたエリアマーカーの色の状態によって、クリア状況を検知するスクリプトです。
市街地等の入り組んだ地形での殲滅ミッション作成を補助します。
多少アーケードライクにはなりますが、市街地での殲滅ミッションで懸念される”最後の一匹”の捜索避けなどに役立つので、プレイヤー規模よりも大きな街での殲滅作戦の実現や、大きさを問わず効率よく市街戦ミッションを作りたい/回したい要望に応えられると思います。SandD_area_marker_sample.Altis
(サンプルミッション同梱)参考動画:
S&D Marker Manager Scriptうごき:
・ミッション開始と同時にユニット検知を開始します。
・設定した陣営の敵ユニットの有無のみを検知し、存在すれば赤、クリアすれば青になります。
・クリア状態のエリアに再び敵ユニットが侵入した場合、再び赤に戻ります。
・全てのエリアのクリアを検知したら、タスク完了用の値ST_eliminatedone
がtrueになります。これを検知するトリガを作れば、クリア条件としてセットが可能です。とくちょう:
トリガarea_e_
と マーカarea_
からなるコピペして連番のエリアを作っていけば、その分だけスクリプト側が勝手に検知します。
サンプルのように街の形状に沿ったり、街のエリアが分かれている場合でも柔軟にエリアの配置ができます。つかいかた:
(サンプルミッションから設定したエリア全てをコピーし、貼り付け先のミッションで増やしたり減らしたり調整するだけで全て対応できますが、連番で動くという仕様の説明になります)・サンプルミッションにコピペ用の素材を枠と一緒に用意したので、こちらを使う前提で説明します。
サンプルミッションの素材をコピーするか、基本用のトリガarea_e_
と マーカarea_
を用意し、コピーします。
※トリガはデフォルトではEASTが検知条件になっていますが、検知したい陣営が異なる場合は予め変えてからコピーしてください。
このトリガとマーカの大きさが検知範囲=エリアのグリッドになりますので、お好みの大きさに設定してください。・エリアとして設定したい場所に、先程コピーしたエリアとマーカをポンポンと置いていきます。
ペーストされた最初のモノがarea_e_1
とarea_1
になっているか、必ず確認してください。スクリプトはこの連番を検知して動作します。
あとは枠のマーカを適当に配置します。こちらは検知に影響されないから好きに置いてOK・同梱のinit.sqfをmission.sqmと同じフォルダに入れます。既にある場合、中身をコピペしてください。
・引数を設定します。
nul = [設定したエリアの数,検知したい陣営] execvm "scripts\mkrmanager.sqf";
設定したエリアの数:
コピペしたエリアの数です。最後にペーストしたエリアの連番を入力します。例:サンプルミッションでは14個のエリアでeastユニットを検知したいので
nul = [14,east] execvm "scripts\mkrmanager.sqf";
となります。・全エリアをクリアしたことを検知すると、
ST_eliminatedone
を出力します。
タスク完了用にこの値を検知するトリガをミッション側に置いたら設定完了です。・設定が全て完了したら、連番作製用に作ったコピー元の基本トリガとマーカは消してしまってOKです。
Stealerメンバー3人組のAI歩兵ユニットを迫撃砲チームとして動かせるimmersive mortar unitスクリプト
3人組の歩兵ユニットのウェイポイント地点で実行させることで、FO(観測手)、ガンナー、ローダーの迫撃砲チームとして動かすことが出来るスクリプトです。
敵が襲撃してくるシチュエーションでこいつらを混ぜておくと、低強度のドンパチから一転、降り注ぐ砲弾が当たらないことを祈りながら親の仇が如くFOを血眼で探して狙撃する、マークスマンが輝くエモいシチュエーションが生まれること必至です。
immersiveを名乗るだけにアニメにこだわったので、ゴソゴソ組み立てているヤツ、双眼鏡でスケベしてるヤツを発見し、その生殺与奪を握る快感を没入と共に味わってもらえたら幸いmortar_unit_test.VR
参考動画:
ArmA3 Script – Immersive Mortar Unit動作:
・ウェイポイント到達
・観測手が双眼鏡に持ち替えて観測開始(双眼鏡はスクリプト実行時に自動付与されます)
・ガンナーが迫撃砲を組み立て(アクション)、展開、ローダーと共に着席(一人乗りの迫撃砲だった場合、ガンナーの補充要員として動作)
・砲撃開始
・規定弾数を撃ちきると迫撃砲を放棄し、突撃ユニットととして砲撃目標地点に攻める・FO無力化で砲撃精度が減少、ガンナー無力化でローダーが代わりに砲座に付き、装填速度減少する
オプション:
・FOが無力化されなかった場合、FOらしく諸元が徐々に修正され(発射ごとに散布範囲の2%)、砲撃の精度が上がって(最大50%)いく。修正値やスタック上限は調整/無効化が可能。
・砲撃タレットのクラスごとに出現位置が微妙に異なるので、ガンナー展開のアニメと重なったり離れすぎてるのが気になる方向けにY軸微調整(_spawnpoint_onfig)できる。詳細はスクリプト内参照。
つかいかた:
・3人グループを作り、init欄に以下のコマンドを貼る{_x disableAI "CHECKVISIBLE"} forEach (units this);
※意図しない戦闘を避け、砲撃に専念させるためにAIの視界情報をブロックします
・砲撃させたい地点に置いたウェイポイントのON ACT欄に以下の引数を入れたコマンドを入力します
nul = [FOになる人,ガンナーになる人,ローダーになる人, FOがいる場合の散布界(m), FOがいなくなった後の散布界(m), 規定の砲弾発射数(n), ターゲット(variable name), "迫撃砲タレットのクラスネーム"] execvm "scripts\mortar_unit.sqf";
例)
nul = [(units this select 0),(units this select 1),(units this select 2), 100, 180, 25, target1, "O_G_Mortar_01_F"] execvm "scripts\mortar_unit.sqf";
・FOになる人,ガンナーになる人,ローダーになる人
基本的に例文のままでOk・ターゲット
名前が付いてるものなら単なる目標地点として置いたGameLogicでも、おそらく予めAOに展開しているプレイヤーのCV車両でも、トリガに最初に入ったプレイヤーでもサーファーキャップでもなんでもOKStealerメンバーAI砲撃ユニットにFiremissionさせるsimple_artyスクリプト
何かと面倒だった砲撃をモジュールなし、単一スクリプトのポン置きで実現させようと思って作った簡易スクリプトです。
実体が存在するユニット用です。
飾り用にも実用にもいけます。SP/Dedicatedで動くよArty_Test.Stratis.zip
テスト中に撮った参考にならない動画:ArmA3 Script – Simple AI Arty Scriptつかいかた:
トリガなどに発動条件となる以下の構文を書きます
[[砲撃ユニット1,砲撃ユニット2],散布界n,1基当りの発射数n,次弾装填完了からのディレイ,ターゲット名,"砲撃終了後のユニット乗員へのオプション"] execvm "scripts\simple_arty.sqf";
[砲撃ユニット1,砲撃ユニット2] []の中に砲撃させたい砲撃ユニット名を書きます。「,」で区切っていくつでも入ります。
散布界n (整数) 着弾のバラケ具合[m]。
1基当りの発射数n (整数) 1回のfiremissionではなく、1基当りの発射数です。-1と入力すると死ぬまで撃ち続けさせられます。
次弾装填完了からのディレイ (整数)次弾装填完了後、次のシーケンスまでの遅延[sec]です。0で装填完了と同時に次第即次弾を照準/発射します。ユニットによって発射間隔が違うので、ここで調整します。
ターゲット名 (Varible Name) ゲームロジックでもユニット名でも何でもいいです。ターゲットの名前です。
砲撃終了後のユニット乗員へのオプション(“オプション名”) Firemission終了後の砲撃ユニットの要員を消すかのオプションです。
"ALL" ドライバーとガンナーを消去する "DRIVER" ドライバーのみ消去する "GUNNER" ガンナーのみ消去する "false" 何もしない
例:
nul = [[arty_1,arty_2,arty_3],180,2,1,tgt,"false"] execvm "scripts\simple_arty.sqf";
なかみ:
if !(isserver) exitwith {}; private ["_arty_ary","_radius_init","_rounds_init","_tgt_init","_option_init"]; _arty_ary = _this select 0; _radius_init = _this select 1; _rounds_init = _this select 2; _delay_init = _this select 3; _tgt_init = _this select 4; _option_init = _this select 5; if (_rounds_init == -1) then {_rounds_init = 99999}; _ST_Arty = { params ["_unit","_dispertion","_round","_delay","_target","_option"]; _tgt = getposasl _target; sleep random 3; for "_i" from 0 to (_round -1) do { _unit setammo [currentweapon vehicle _unit, 999]; _tgtpos = [ (_tgt select 0) - _dispertion + (2 * random _dispertion), (_tgt select 1) - _dispertion + (2 * random _dispertion), 0]; _unit commandArtilleryFire [ _tgtpos, getArtilleryAmmo [_unit] select 0, 1]; if (_i != _round) then {waituntil {currentcommand _unit == ""};}; sleep _delay; }; switch (_option) do { case "ALL": { deletevehicle gunner _unit; deletevehicle driver _unit; }; case "DRIVER": { deletevehicle (driver _unit); }; case "GUNNER": { deletevehicle (gunner _unit); }; }; }; for "_i" from 0 to ((count _arty_ary) -1) do { [(_arty_ary select _i),_radius_init,_rounds_init,_delay_init,_tgt_init,_option_init] spawn _ST_Arty; };
StealerメンバーTKゲリラの服装バリエーションを増やして湧かせるmixed_gurillagroupスクリプト
防衛シチュエーションなどに。CUPのTK勢力用なので要CUP MOD。
TKゲリラとTK反政府勢力のユニットをミックスして一つの部隊として湧かせる事によって服装や装備のバリエーションが増えます。
服装や装備をランダムに選ばせるよりクラス選んだほうが楽だと思っただけ
広く使われいてる既存の湧きスクリプトに変更を加えたものです。Mixed_GuerillaGroup_Spawn_Test.VR
つかいかた:
① エディタ上に湧きポイントのマーカを置きます。マーカの名前はenspwn_n (n=整数)
になります。
② 湧いた部隊の移動目標のマーカーを作ります。名前はなんでもいいです。
③ mixed_gurillagroup.sqf を開き、_spawnmkr =
の数値を先程置いたenspwn_n
の数と同じにします。
④ 湧かせるトリガなどに実行用の構文を書きます。nul = [グループの人数サイズ,陣営,部隊の移動目標マーカ] execvm "scripts\rnd_gurillagroup.sqf"; ie: nul = [7,RESISTANCE,"atkmkr"] execvm "scripts\mixed_gurillagroup.sqf";
※サンプルに同梱の死体処理スクリプトbury.sqfも一緒にscriptsフォルダに入れておいてください。
なかみ:
if (!isserver) exitWith {}; private ["_spawnmkr","_grpsize","_side","_ary","_inf_list","_createpos","_squadgroup","_wp"]; //エディタ上のスポーンさせたい所にマーカ enspwn_n (n=整数)を置き、下の_spawnmkr = に置いた数を書く _spawnmkr = 12; _grpsize = _this select 0; _side = _this select 1; _dest_mkr = _this select 2; _ary = []; _inf_list = [ "CUP_O_TK_INS_Soldier_MG", "CUP_O_TK_INS_Soldier_AT", "CUP_O_TK_INS_Soldier", "CUP_O_TK_INS_Soldier_AR", "CUP_O_TK_INS_Sniper", "CUP_O_TK_INS_Soldier_FNFAL", "CUP_I_TK_GUE_Soldier_TL", "CUP_I_TK_GUE_Soldier_MG", "CUP_I_TK_GUE_Sniper", "CUP_I_TK_GUE_Soldier_AT", "CUP_I_TK_GUE_Soldier_AK_47S", "CUP_I_TK_GUE_Commander", "CUP_I_TK_GUE_Soldier_AAT", "CUP_I_TK_GUE_Soldier", "CUP_O_TK_INS_Soldier", "CUP_O_TK_INS_Guerilla_Medic", "CUP_I_TK_GUE_Guerilla_Medic"]; for [{_i = 0}, {_i < _grpsize}, {_i = _i + 1}] do{ _ary set [_i,(_inf_list select (floor(random(count _inf_list))))]; sleep .25; }; _createpos = getmarkerpos (""+ "enspwn_" + (str ([1, _spawnmkr] call BIS_fnc_randomInt)) + ""); _squadgroup = creategroup (_side); sleep .2; _squadgroup = [_createpos, _side, _ary] call BIS_fnc_spawnGroup; sleep .2; _wp = _squadgroup addwaypoint [getMarkerPos _dest_mkr,20]; _squadgroup setCombatMode "RED"; _squadgroup setspeedmode "FULL"; _squadgroup AllowFleeing 0; _wp setWaypointType "SAD"; _wp setWaypointCombatMode "red"; _wp setWaypointBehaviour "AWARE"; _wp setWaypointSpeed "FULL"; _wp setWaypointFormation "LINE"; {_x addEventHandler ["killed", {handle = [_this select 0] execVM "scripts\bury.sqf"}]} forEach (units _squadgroup); { _x setskill ["aimingAccuracy",0.15]; _x setskill ["spotDistance",0.25]; _x setskill ["spotTime",0.65]; _x setskill ["courage",1]; _x setskill ["commanding",1]; _x setskill ["aimingShake",0.65]; _x setskill ["aimingSpeed",0.85]; }foreach (units _squadgroup); _squadgroup = GrpNull;
自分のミッション用に作ったので公開するほどのものではないのだけれど、
一応”違う陣営のランダムなクラスのユニットをミックスし、一つの部隊にして突進させる”ものなので、_aryの中身を変えれば他の用途にも使えるかと思いました。Stealerメンバー移動中の車輌に制圧射撃をさせられるRun-and-Gunスクリプト
依頼品。防衛ミッションや敵の増援が来るようなシチュエーションにおいて、遠方から接近中に制圧射撃をしてくるようになります。
ガンナー席のある車輌にのみ対応しています。
テクニカルに乗った陽気な人達による賑やかし、軍の容赦ない弾幕などの表現にお使いください。
SP/MP対応。だいぶ派手目なサンプル付き。動画:
ArmA3 script – Run and Gun scriptつかいかた:
・適用したい車輌のinitに↓のコマンドを貼り付けます。_nul = [this,制圧射撃をやめる距離n(m)] execvm "scripts\run_and_gun.sqf" 制圧射撃をやめる距離n(m)はトリガの中心範囲からの直径です。 例:_nul = [this,200] execvm "scripts\run_and_gun.sqf"
(湧かせた車輌にも適用できます。thisにあたる変数の変更はご自分で。)
・トリガ
suppress_point
を範囲を決めて配置します。
このトリガの範囲内に入ると車輌は制圧射撃を始めます。
入ると無条件で発砲を始める為、車輌の目標から目視できる範囲に置くといい感じです。動作について:
・より効果的な制圧射撃を行うため、車輌は通常交戦距離に入るまで視認距離・視認精度が大幅に向上しますが、射撃精度は落ちます。
・制圧射撃はガンナー席の各武器をランダムに選択して発砲します。また、制圧中に使用した武装は一定間隔ごとに自動で補充されます。
・suppress_point から制圧射撃をやめるまでの距離n(m)以内(通常交戦距離)に入ると制圧射撃・自動補充は停止し、デフォルトの挙動に戻り、調整されたスキルも元に戻ります。
・直近に目標が見つかるまでは suppress_point に向けて制圧射撃をします。
・とりあえず動くようにしたのでフィードバックや要望くださいなかみ:
if (!isserver) exitwith {}; sleep ((random 3)+3); private ["_veh", "_wep", "_mag", "_skill", "_rearm","_stop_range","_cur_mag","_cur_mag_ammo_cnt"]; _veh = _this select 0; _stop_range = _this select 1; _wep = count (_veh weaponsturret [0]); _mag = _veh magazinesturret [0]; _skill = skill _veh; _rearm = 0; gunner _veh dowatch suppress_point; gunner _veh dotarget suppress_point; _veh setskill ["spotDistance", 1]; _veh setskill ["spotTime", 1]; _veh setskill ["aimingShake", .75]; _veh setskill ["aimingAccuracy", .35]; waituntil {_veh inarea suppress_point}; while {_veh distance suppress_point > _stop_range} do { if (!alive gunner _veh) exitwith {}; if (isnull (_veh findnearestenemy _veh)) then {gunner _veh dowatch suppress_point; gunner _veh dotarget suppress_point;}; _rearm = _rearm +1; _rnd_wep = floor (random _wep); for "_i" from 0 to ((floor(random 20))+25) do { _veh action ["useweapon",_veh,_veh turretUnit [0], _rnd_wep]; sleep .02; }; sleep random 3; if (_rearm > 20) then { //武装の自動補充 for "_i" from 0 to count _mag -1 do { _cur_mag = _mag select _i; _cur_mag_ammo_cnt = (getNumber(configfile >> "CfgMagazines" >> _cur_mag >> "count")); _veh addmagazineturret[_cur_mag,[0],_cur_mag_ammo_cnt]; sleep .2; _rearm = 0; //hint format ["-REARMING- current magazine:%1 ammo count:%2",_cur_mag, _cur_mag_ammo_cnt]; }; }; }; _veh setskill _skill;
Stealerメンバー友軍兵士の死に弔意を表し弔えるTAPSスクリプト
Coopという戦いの場で発生する、ある意味では華でもある”損害”に焦点を当てた、勇敢に戦った末犠牲となった仲間を弔えるスクリプトです。
友軍勢力に損害が出る度、リアルタイムで墓が生成されます。ミッションから生還したらラッパの演奏(中心オブジェクトに付与されたアクションメニュー)で弔えます。
お墓のタイプは5種類(Triサーバーアドオン群に準拠)から出撃/帰還するベースに置いておいて、湿っぽいシメにどうぞ。動画:
ArmA3 – TAPS Script for MP動作デモ/確認用セクション付き。
SP/MPで動作します。また、ACE環境下での使用を前提としていますが、ACEなしでも動きます。
その場合スクリプト内の数値を変更する必要があるので、grave_yard.sqfを読んで下さい。
Triサーバアドオン群が入っていない環境の場合、お墓の候補はバニラ3種類からの選考になります。つかいかた:
grave_yard.sqfを参考にしてください。デモも同梱してあります。なかみ:
/* TAPS script by Stealer v0.02 grave_point と名付けたオブジェクトの周りに友軍が殺傷された分だけ墓が生成されます。 同梱のtaps.sqfと併用して使い、ミッション終了間際等に戦死者を弔えます。 ※ACE環境下用に制作しています。ACEなしの場合は挙動が変わりますので下の本体部分の数値を確認・変更してください ・init.sqfに下の構文を貼り付ける: nul = [適用したい勢力,お墓のタイプ] execvm "scripts\grave_yard.sqf"; 例: nul = [WEST,"Land_Tombstone_03_F"] execVM "scripts\grave_yard.sqf"; 適用したい勢力 = WEST EAST GUER CIV など お墓のタイプ = "クラスネーム" お墓は選べる5種類 "Land_Grave_soldier_F" 文字入り墓碑 "Land_Tombstone_03_F" R.I.P.の文字入り墓 "Land_Grave_dirt_F" 土を盛っただけの十字架付きの墓 "GraveCross1" ドッグタグ付き簡易十字架 ※要CUP MOD "PRAA_statics_bodybag" みんな大好きボディバッグ ※要PRAA MOD ※のMODは17/4/2現在Triサーバに入っているものです ・grave_point と名付けたオブジェクトに下の構文を貼り付ける: this addaction ["TAPS for Honor The Fallen","scripts\taps.sqf"]; ・grave_point オブジェクトの向きをエディタ上で変えることによって、生成されるお墓の向きを調整できます。 お墓はオブジェクトの背面(180°)から正面を向いて生成されます。一部オブジェクトはこの通りではありませんので一度テストで確認してください。 ・空母の甲板上など、地表から離れた場所(地表から1m以上)にオブジェクトを置いた場合は挙動が変わり、grave_point の15m半径(デフォルト)に墓が生成されます。 半径を変更したい場合は _rad の数値を変更してください。 ※この場合生成される位置は完全ランダムになり墓の配置にマージンを取りませんので、狭い半径に多く生成すると重なり合うなどして配置が歪になる場合があります。 */ //本体 if (isserver) then { sleep 10; private ["_pos","_dir","_opt","_side","_type","_rnd_x","_rnd_y","_posX","_posY","_rad"]; _pos = grave_point; _pos2 = getpos _pos select 2; _dir = getdir _pos; _side = _this select 0; _type = _this select 1; _rad = 15; //地表から離れた場所に生成される場合の半径n deathcount = 0; {_ehst = _x addmpeventhandler ["mpkilled",{deathcount = deathcount + 1}];} foreach (allunits select {side _x == _side}); while {true} do { waituntil {deathcount >= 2}; //ACE抜きで使いたい時はここを1にしてください deathcount = deathcount -2; //ここも-1に _grave = _type createvehicle [(position _pos select 0), (position _pos select 1), 0]; if (_pos2 >= 1) then { sleep .2; _rnd_x = (floor(random 2)); _rnd_y = (floor(random 2)); _posX = (floor(random _rad)); _posY = (floor(random _rad)); if ((_rnd_x) == 1) then {_posX = (-1*(_posX))}; if ((_rnd_y) == 1) then {_posY = (-1*(_posY))}; _grave setpos [(position _grave select 0) - (_posX), (position _grave select 1) - (_posY), (getpos _pos select 2)]; }; _grave setdir _dir; sleep .5; }; }; //テスト用セクション //以下のセクションのコメントアウトを外し、上の本体部分をコメントアウトすると grave_point 付近に _num 基分のお墓を生成します。 //お墓はオブジェクトの周りの空いた土地を使用し、円形に拡がっていく習性を持っています。 //配置済みのオブジェクトやその場にいる人を避けて配置されますが、間に進入可能な家などがあると壁を抜け家の中に作ってしまいますので、開けた場所が望ましいです。 //生成される向きの確認や、予定しているミッションの人数規模によって生成されるお墓がどれくらいの領域を使用するか確認できます。 /* if (isserver) then { private ["_pos","_dir","_opt","_side","_type","_rnd_x","_rnd_y","_posX","_posY","_rad"]; _pos = grave_point; _pos2 = getpos _pos select 2; _dir = getdir _pos; _side = _this select 0; _type = _this select 1; _rad = 15; _num = 30; //_num に指定したn基分の墓を生成します sleep 1; while {_num >= 0} do { _num = _num -1; _grave = _type createvehicle [(position _pos select 0), (position _pos select 1), 0]; if (_pos2 >= 1) then { sleep .02; _rnd_x = (floor(random 2)); _rnd_y = (floor(random 2)); _posX = (floor(random _rad)); _posY = (floor(random _rad)); if ((_rnd_x) == 1) then {_posX = (-1*(_posX))}; if ((_rnd_y) == 1) then {_posY = (-1*(_posY))}; _grave setpos [(position _grave select 0) - (_posX), (position _grave select 1) - (_posY), (getpos _pos select 2)]; }; _grave setdir _dir; sleep .1; }; }; */
TAPSとは戦死者の葬儀の際に送り出す為のラッパの演奏です。映画なんかで見たことあるかも。
あいつ死んじまったよwwwギャハハwwハハ…良い奴だったよな…なんてクッサイ芝居をしながら、彼/彼女のいる虚空に向けて弔砲を撃ったりなんかするといいですね。ちなみに弔砲は偶数という決まりがあります。
まあ、次のゲームでまた会えますけどね。ゲームで本当に良かったです。- この返信は7年、 7ヶ月前にStealerが編集しました。理由: v0.02 空母の甲板上など高さのある場所での配置が可能
Stealerメンバー湧かせたロシア語圏ユニットが英語喋りやがって萎えたので、作ってたミッション放り出して欲しい機能だけ付けた急造品だったので修正助かりま。
editedのクレジット付けて上げ直しときまーす。追記:
あと添削してもらって悪いけど、これそのまま適用したら動作してなくて修正が二度手間になってるので、PMなり飛ばしてもらって編集・動作確認してからのリリース出来る流れを作れると助かります。StealerメンバーSet Suit Language To Spawned AI Character
湧かせたAIユニットに選択した言語の中からバリエーションをランダムに選択して割り当てます。
MODで追加された兵士は設定された所属勢力に関係なくデフォルトが英語になっていたりするので、湧かせるとチェダキやタキスタンゲリラが英語を喋って萎えたので作りました。
同梱の湧きスクリプトは必須ではないので、各自用意した湧きスクリプトに組み込んで使用してください。
湧かせたグループに対して使用する単機能スクリプトです。使い方
要素0: 対象(人物) _x 要素1: 言語 "ENG": 英語(アメリカ英語) "PER": ペルシャ語 (CSAT兵の言語) "GRE": ギリシャ語 "ENGB": ブリングリッシュ "ENGFRE": タノア語 "CHI": 中国語 "FRE": フランス語 ---MODで追加された言語の対応--- "RU": ロシア語 CUP追加 "TK": パシュトゥーン語(タキスタン語) ※バリエーション無し CUP追加
例
if !(isserver) exitwith {}; private ["_person","_language","_num","_options","_selected","_voice","_vanilla"]; _person = _this select 0; _language = _this select 1; _vanilla = false; _voice = ""; switch (_language) do { case "ENG": {_num = 12; _vanilla = true}; case "ENGB": {_num = 5; _vanilla = true}; case "ENGFRE": {_num = 3; _vanilla = true}; case "PER": {_num = 3; _vanilla = true}; case "CHI": {_num = 3; _vanilla = true}; case "FRE": {_num = 4; _vanilla = true}; case "GRE": {_num = 6; _vanilla = true}; case "RU": {_num = 5}; case "TK": {_num = 1}; }; _options = [1, _num] call BIS_fnc_randomInt; _selected = str ([_options] call BIS_fnc_selectRandom); if (_vanilla) then {_voice = ("" + "Male0"+ _selected + _language + "");} else {_voice = ("" + "CUP_D_Male0"+ _selected + "_" + _language + "");}; sleep .2; [_person, _voice] remoteExecCall ["setSpeaker", 0]; //オプション: 声の抑揚(ピッチ) 一度に湧かせるユニットがそれほどの数でない場合適用(通信負荷軽減) //[_person, (0.9 + random 0.2)] remoteExecCall ["setPitch", 0];
v0.01ではとりあえずのリリースですが、配置済みのMODユニットに対する煩雑な言語変更を緩和する為に一括適用する更新も需要があればします。
(早く修正されてレガシーになるといいね)16/12/22
v0.02 – edited by POLPOX(動作確認部のみ)
・対応言語追加
・消し忘れの変数/宣言の削除
・抑揚オプション追加- この返信は7年、 10ヶ月前にStealerが編集しました。理由: v0.02
Stealerメンバー車輌のタレット情報を取得するShow Turretスクリプト
A3にはConfig Browserがエディタに搭載され、知りたい情報へのアクセスが以前よりとても簡単になりました。
しかし検索機能が無いので、知りたい情報へたどり着くのも一苦労です。
そしてエディタ諸兄がわざわざこのブラウザでアクセスしたい情報といえば、兵器が使用しているタレットパスや弾のクラスじゃないかと思います(個人的な経験から)。
しかもそのブラウザにも肝心のタレット情報が一切無かったりします。ので、私は不便なブラウザの使用を思考停止的にやめ、タレット情報を取得しクリップボードへコピーするモノを作ったので、ついでに公開します。
※パスがややこしい兵器固有の搭載武器、及びコマンダーシートの武器には対応してません。自分に必要な部分だけ作ったので、需要があったら完成させます。
あと他に方法があったら消します。だって不便だったんだもん。つかいかた
①mission.sqmと同階層にscriptsフォルダを作成します②その中にテキストファイルを作り、showturret.sqfという名前で保存します
③以下のなかみを貼り付けます↓
_p = vehicle player; _type = typeof _p; _mags_d = _p magazinesTurret [-1]; _mags_g = _p magazinesTurret [0]; _weps_d = _p weaponsTurret [-1]; _weps_g = _p weaponsTurret [0]; hint format ["TYPE: %1\n\nMAGAZINES(DRIVER)[-1]:\n%2\n\nMAGAZINES(GUNNER)[0]:\n%3\n\nWEAPONS(DRIVER)[-1]:\n%4\n\nWEAPONS(GUNNER)[0]:\n%5\n\nDATA COPIED TO CLIPBOARD",_type,_mags_d,_mags_g,_weps_d,_weps_g]; copytoclipboard ("Type: " + str _type + " Magazinesturret[-1]: " + str _mags_d + " Magazinesturret[0]: " + str _mags_g + " Weponesturret[-1]: " + str _weps_d + " weaponesturret[0]: " + str _weps_g);
④プレイヤーユニットのinit欄に、以下を書き込みます↓
this addaction ["let me see","scripts\showturret.sqf"];
⑤情報を知りたい車輌に乗り込むか、プレイヤーに指定した兵器でアクションを実行します。するとクリップボードにこんな感じで情報が保存されます。これはZU-23-4の場合です↓
Type: "CUP_O_ZSU23_TK" Magazinesturret[-1]: [] Magazinesturret[0]: ["CUP_2000Rnd_23mm_AZP23_M"] Weponesturret[-1]: [] weaponesturret[0]: ["CUP_Vacannon_AZP23_veh"]
web版のConfig Browserには必要な情報が普通に書いてあったりするのは知ってます。
しかし調べてもあったりなかったりするので、ものぐさな私はこれを貼っつけたミッションに車輌を出現させて飛行機や兵器のタレット情報を取得してます…Stealerメンバー追記:
先ほど某氏より
「森の中に基地を作りたいので、範囲内の木を倒すのでなく完全に消し去りたい」との依頼があり、色々試した結果方法を編み出せたので記載します。こういった要望の場合、マップ固有のオブジェクトでHouse属性のある建造物の削除は簡単ですが、
それに属さないもの、とりわけ木やパイプ等のobjectにはclassnameの取得(typeof)が難しいモノがあります。
こういったモノを手っ取り早く削除するには、IDを使った方法が良い…と思います(現時点では。)1.objectのIDを表示する
マップ固有のobjectにはIDが振られており、それを特定することで削除が可能です。
ID表示の方法はエディタツールの”ID”ボタンを押すか、Tools > Debug consoleを開いて以下のコマンドを打ちます。
do3DENAction "ToggleMapIDs"
この状態でマップを拡大していくと、白抜きに黒字の数字がたくさん出てくると思います。これがIDです。
これで消したいobjectのIDをひたすらメモります。めんどくさいです。
ここでは3本の木、1441,1440,1439を消すとします。2.消したい範囲の直近にGame Logicを作る。
Variable name: log1
Cond: True
On act: {((position log1) nearestObject _x) hideobjectglobal true} foreach [1441,1440,1439];
[]には先程メモったIDを”,”で区切って入れていきます
Classnameが存在する場合はもっと簡単ですが…めんどくさいので後で書きます。
とりあえず以上の方法まで。StealerメンバーどこでもLZ デイジーカッタートリガー
Tanoaが公開されましたね。リゾートの皮を被った鬱蒼としたジャングルが、不気味な口を開けて誘っています。
さて、ここで問題になるのは、ミッション作成者の悩みの一つである、ヘリボーン作戦に都合の良いLZの確保。
平坦で障害物の無いLZとして最適な場所は、マップでも限られた数しかありません。
しかし、トリガーを使えば、好きな範囲の障害物をあらかじめ切り倒すことで、ジャングルのどこでもLZにすることが可能です。まずはトリガに名前をつけます。Condにはtrue、on Act欄には以下のように書きます。
例) {_x setDamage 1} forEach nearestObjects [トリガ名,[],範囲]
トリガ名にはトリガの名前を、範囲はメートルで記入します。早い話が、トリガの範囲内のオブジェクトを全て破壊する事で平地にします。
トリガの範囲と同じ値をセットするとエディタ上で分かりやすいです。私はこのトリガを思いついた時から、デイジーカッタートリガと呼んでいます。
ベトナム戦争時、アメリカ軍は急ごしらえのLZ作る際、同名の巨大爆弾で周りを吹っ飛ばしていた事からです。核と間違われるほどの威力だったとか。ということで、こうしたエディットのマメ知識も公開していきましょう。
StealerメンバーRadioChatter Script
概要:
任意のユニットから無線通信のおしゃべり効果音を不定期に再生させる雰囲気スクリプト。だいたい15m以内くらいの範囲に聞こえます。
使用用途は様々ですが、基地を作る際の景観用や、潜入作戦で敵の警備兵に適用したりすれば通信の音を情報源に使えたりしますね。Radiochatter_Script_Sample_A3.Stratis.7z
使い方:
①Scripts,Soundsフォルダ、Description.extファイルを使いたいミッションのmission.sqmと同階層にコピペ
②以下のコマンドを喋らせたい任意のユニットのinit欄にコピペする。
_nul = [this] execVM "scripts\radiochatter.sqf";
StealerメンバーようやくA3をプレイできそうなので、手始めにスクリプトをいくつかA3用に書き直しました。
公開するスクリプトのサンプルファイルは補足がない限り、バニラ及びDedicatedサーバ下のMPでも動作する前提で作っています。Battle Damage Assessment(戦闘損害評価)スクリプト
その昔、某氏の要望で作ったもの。
ミッション終了時、戦闘のハイライトとなった場所を中心にカメラが回転し、
開始時の自軍のユニット数からの単純な差し引きで損害(死傷者)を計上・表示し、その率によってSSSからF-までの18段階で戦闘指揮の評価をするスクリプトです。
現verでは自陣営の損害を計上するのみですが、これをたたき台に要望によって表示項目を増やしていきます。AARにどうぞ。
https://www.dropbox.com/s/12cor1vf8pykz44/BDA_Sample_A3.Stratis.7z?dl=0使い方:
①mission.sqmと同階層に BDA_A3 フォルダを置く
②init.sqfにコマンドを記入:
["評価したい陣営"] execVM "BDA\BDA_main.sqf";
評価したい陣営 には陣営の頭文字を大文字で入れます。
W:West (BLUFOR)
E:East (OPFOR)
I:Resistance (Independent)
C:Civilian (Civilian)
例)["W"] execVM "BDA\BDA_main.sqf"
また、BDA起動時のBGMはデフォルトの曲ですが、カスタムBGMを使用したい場合、
オプションパラメータとしてクラス名(descrption.extにてCfgMusicで定義したもの)を記入すれば変更可能です:
[“評価したい陣営”,”BGMのクラス名”] execVM “BDA\BDA_main.sqf”
例)["W","customBGM"] execVM "BDA\BDA_main.sqf</blockquote>
③GameLogicに次の名前を付けて配置する:
BDA_camobj
BDA起動時、このロジックを中心にカメラが回転します。ミッションの象徴となった場所に置くといいです。④BDA起動トリガを設置:
BDA_report = true;
BDA_reportがtrueになった時点でBDAが起動、評価画面が表示された後、ミッションが終了します。
なかみ:
BDA_main.sqf
//initに記述した変数にBGMの変更があるかを判断し、なければデフォルト、あれば使用するようにパラメータを渡す準備をする _music = " "; _choosemusic = _this select 1; if (isnil ("_choosemusic")) then {_music = "Track07_ActionDark"} else {_music = _choosemusic}; //ミッション開始時、各クライアントでBDA表示用スクリプトを起動しておく [_music]execVM "BDA_A3\BDA_client.sqf"; //ここから先はサーバのみでの処理 if !(isServer) exitwith {}; //変数の定義 _side1 は[]内の要素0番目(=1番目) BDA_param_start1 は整数を宣言 _side1 = _this select 0; BDA_param_start1 = 0; BDA_report = false; BDA_compcalc = false; //switch構文で _side1 に入った文字を識別、計上する陣営を設定する switch (_side1) do { case "W": { BDA_param_side1 = West; }; case "E": { BDA_param_side1 = East; }; case "I": { BDA_param_side1 = Resistance; }; case "C": { BDA_param_side1 = Civilian; }; }; //ミッション開始時の陣営の総数を計上 BDA_param_start1 = ((BDA_param_side1) countSide allunits); //BDA起動(ミッション終了)トリガが立つまで待つ waituntil {BDA_report}; //ミッション終了時の陣営の総数を計上 BDA_param_end1 = ((BDA_param_side1) countSide allunits); //陣営の生き残りの兵士の内、負傷者(3割以上ダメージを受けた者)の数を計上 BDA_param_w1 = {(getdammage _x >= 0.3) && side _x == BDA_param_side1} count allunits; //sleepは「一呼吸」の感覚で意識的に処理の間に挟むと誤動作防止になる。0secと0.1secはサーバにとって天と地ほどの差がある。 sleep .2; //計上した変数を各クライアントに配信 publicVariable "BDA_param_start1"; publicVariable "BDA_param_end1"; publicVariable "BDA_param_w1"; //各クライアントで既に待機している計上終了トリガ BDA_compcalc を配信 BDA_compcalc = true; publicVariable "BDA_compcalc";
BDA_cliant.sqf
//「ここより先はクライアント処理のみ」を示すおまじない if (!local player) exitwith {}; BDA_compcalc = false; //ここから先は BDA_main の計上終了トリガを待つ waituntil {BDA_compcalc}; //変数をこのスクリプトのみで使う宣言(BDAと関係ない、同じ名前を用いた変数への干渉を防ぐため) private ["_commrank","_KIA1","_loss1","_msg1"]; //_commrank は文字列を宣言 _commrank = " "; _music = _this select 0; //BDA_mainの処理よりサーバから配信されたミッション開始時のユニット数を取得、終了時のユニットと計上する _KIA1 = BDA_param_start1 - BDA_param_end1; _loss1 = floor (100 - ((BDA_param_end1 / BDA_param_start1)*100)); //損害を百分率の割合によって評価する if (_loss1 == 0) then {_commrank = "SSS";}; if ((_loss1 >= 1) && (_loss1 <= 5)) then {_commrank = "S+";}; if ((_loss1 >= 6) && (_loss1 <= 10)) then {_commrank = "S";}; if ((_loss1 >= 11) && (_loss1 <= 13)) then {_commrank = "A+";}; if ((_loss1 >= 14) && (_loss1 <= 17)) then {_commrank = "A";}; if ((_loss1 >= 18) && (_loss1 <= 20)) then {_commrank = "A-";}; if ((_loss1 >= 21) && (_loss1 <= 23)) then {_commrank = "B+";}; if ((_loss1 >= 24) && (_loss1 <= 27)) then {_commrank = "B";}; if ((_loss1 >= 28) && (_loss1 <= 30)) then {_commrank = "B-";}; if ((_loss1 >= 31) && (_loss1 <= 33)) then {_commrank = "C+";}; if ((_loss1 >= 34) && (_loss1 <= 37)) then {_commrank = "C";}; if ((_loss1 >= 38) && (_loss1 <= 40)) then {_commrank = "C-";}; if ((_loss1 >= 41) && (_loss1 <= 43)) then {_commrank = "D+";}; if ((_loss1 >= 44) && (_loss1 <= 47)) then {_commrank = "D";}; if ((_loss1 >= 48) && (_loss1 <= 50)) then {_commrank = "D-";}; if ((_loss1 >= 51) && (_loss1 <= 53)) then {_commrank = "E+";}; if ((_loss1 >= 54) && (_loss1 <= 57)) then {_commrank = "E";}; if ((_loss1 >= 58) && (_loss1 <= 60)) then {_commrank = "E-";}; if (_loss1 >= 61) then {_commrank = "F-";}; playmusic _music; //カメラスクリプト起動 [] exec "BDA_A3\BDA_cam.sqs"; sleep 1; //メッセージ表示 _msg1 = "<t align='centre' size='1.8 font='puristaLight' color='#ffffff'>" + '--Mission Completed--'+ "<br/>" +"</t>" // + 'Battle Damage Assessment'+ "<br/>" +"<br/>" +"<t align='left' size='1.4 font='puristaLight' color='#ffffff'>" + 'Battle Damage Assessment'+ "<br/>" +"</t>" +"<t align='left' size='1' font='puristaLight' color='#ffffff'>" +' Resources: ' +str BDA_param_start1+ "<br/>" +' Remains: ' +str BDA_param_end1+ "<br/>" +' Wounded: ' +str BDA_param_w1+ "<br/>" +' KIA: ' +str _KIA1+ "<br/>" + "<br/>" +' Damage: ' +str _loss1+ '%'+ "<br/>" + "<br/>" + "<br/>" + "<br/>" +"</t>" +"<t align='center' size='1.25' font='puristaLight' color='#ffffff'>" + 'Commander Rank: ' +_commrank +"</t>"; [_msg1,0,0.1,50,5] call bis_fnc_dynamictext; sleep 10; //ミッション強制終了 endMission "END1";
BDA_cam.sqs
_camera1 = "camera" camCreate [0,0,0] _camera1 cameraEffect ["Internal","BACK"] _camera1 camSetTarget BDA_camobj _camera1 camSetRelPos [-200,-200,100] _camera1 camCommit 0 _camera1 camSetRelPos [200,-50,15] _camera1 camCommit 70 @(camCommitted _camera1) _camera1 cameraEffect ["TERMINATE","BACK"] camDestroy _camera1
処理自体は簡単なスクリプトですが、スクリプト本体に動作の仕組みを説明をコメントアウトで添えています。
私自身、不慣れなプログラム作りと英語ソースに体当たりでなんとか習得した経緯があるため、学びたい誰かのお役に立てれば幸いです 😉過去の遺物を改良しつつ、また楽しいミッション作りをしていきたいです。
Stealerメンバーそれについてですが、解決法が無くはないものの、非常に難しいです。
まず、open doorアクションを消去することは不可能です。
おそらくremoveactionのようなアクションを取り除く感覚を想像していると思いますが、まずremoveactionはデフォルトのアクションを取り除けません。
removeActionなので連続して閉め続けるアクションをするスクリプトがあれば解決できるのですが、ここで問題があります。
ArmAの建物関連のアクション、とりわけBIS謹製の物に関しては、非常に融通が利かず、最もコントロールの面倒くさいものの一つになっています。
というのも建物に付いているドアの一つ一つがアクションの名前が異なり、しかも例えば閉める動作が1、開く動作が0のものもあれば、その逆もあるのです。以下はchernarusとutesのドア全てをミッション開始時に開くスクリプトについてのポストですが、それでも空港や倉庫や一部のドアはカバーされていません。OAやアドオンの建物を含めると、そのアクションの名前自体の調査が煩雑であることも含め、”汎用性のあるドアを閉めるスクリプト”にどれだけの手間が掛かるか分からないのが現状です…
Huh,
I see, this is an old one. So what, I’m gonna reply anyway.
Closing doors, well, that’s not an easy one, thanks to BIS. I mean, basically, all you need is this:
Code:
_houses = [1000,1000] nearobjects [“house”, 1000000];
{
_x animate [“door”, 0];
sleep 0.0001;
} foreach _houses;
Or so you think! Problem: BIS forgot to use a standard or nomenclature for their buildings. So, some doors are named “door”, some are named “dvere”, then we have “door01” or “door_01” and so on. It’s a mess!
And it gets even worse! On ArmA 2 buildings, the parameter to close a door is 0, while on OA buildings, the parameter is 1! Dear BIS, how can you possibly confuse 0s and 1s?!?
Whatever! So, after a long period of trying, this came out:Code:
_houses = [1000,1000] nearObjects [“house”, 1000000];
_zeroes = [“dvere”,”dvere1l”,”dvere1r”,”dvere2l”,”dvere2r”,”dvere_spodni_r”,”dvere_spodni_l”,”dvere_vrchni”,”vrata1″,”vrata2″,”vratal1″,”vratar1″,”vratal2″,”vratar2″,”vratal3″,”vratar3″];
_ones = [“door”,”door_1_1″,”door_1_2″,”door_2_1″,”door_2_2″,”dvere1″,”dvere2″,”dvere3″,”dvere4″,”dvere5″,”dvere6″,”dvere7″,”dvere8″,”dvere9″,”dvere10″,”dvere11″,”dvere12″,”dvere13″,”dvere14″,”doorl”,”doorr”,”door_01″,”door01_a”,”door_02″,”door02_a”,”door_03″,”door_04″,”door_05″,”door_06″,”door_1a”,”door_1″,”door_2″];
{
_y = _x;
{_y animate [format [“%1”, _x], 0]} foreach _zeroes;
{_y animate [format [“%1”, _x], 1]} foreach _ones;
sleep 0.0001;
} foreach _houses;As far as I know, it works on most buildings. No, wait, I think forgot about the LHD. Ach, not that important, eh? If there’s more missing, or not working at all, just let me know.
Good day,
mr_bookEDIT: I just found out that above script doesn’t work on both Utes and Chernarus. A (rather unsatisfying) workaround is:
Code:
{
_y = _x;
{_y animate [format [“%1″, _x], 0]} foreach _zeroes;
if ((worldname==”Utes”) or (worldname==”Chernarus”)) then
{
{_y animate [format [“%1”, _x], 0]} foreach _ones;
} else
{
{_y animate [format [“%1”, _x], 1]} foreach _ones;
};
sleep 0.0001;
} foreach _houses;It does work now, although it looks really messed up. Take it or leave it, the choice is yours.
Stealerメンバーうーん…既にACE側で組まれてるルーチンを外部から制御する方法が私には見当がつかないけれど、
アプローチの仕方を変えて、”一般兵士がエピネフリンを持ったままテントから離れると持っているエピネフリンが消える”なら出来そうだけれど、
そういうのでいいのなら一応可能だと思います。追記:
このポストの後、実際に以下のソリューションを提示したら満足してくれたので、記載します。
・triggerを作る
10m x 10m
repeatedly
Activation: BLUFOR present
Condition: this && (vehicle player == player)
on Act: (無し)
on Dea: player removemagazines “Ace_Epinephline”;
・triggerの中央に医薬品の入ったMASHを置くこうすることで、triggerからモルヒネを持ったまま出ると、持っているモルヒネが全てボッシュートされます。
- この返信は10年、 9ヶ月前にStealerが編集しました。理由: ソリューション
-
投稿者投稿