ホーム › フォーラム › TRI Gaming フォーラム › ARMA3 ミッションエディットスレ
-
投稿者投稿
-
2017年6月24日 11:52 AM #222806JFetch(ふぇっち)参加者
Exile Modなんかでセーフゾーンの弾消えるやつどうやってるのかなーって思ってたらイベントハンドラからやっていたんですね。
セーフゾーンに出入り&車両乗車時にも対応できるようにしてみました。
safeZone.sqf/* 2017/06/22 Author: Line File: safeZone.sqf Parameters: 1: String: マーカーもしくはトリガー(inAreaで指定できるパラメータ) セーフゾーンのエリアを表す トリガーの場合は、範囲のみ指定して、それ以外は初期値にする。 どうしてもセーフゾーンの監視を止めたいときはトリガーにする。(deleteVehicleでトリガーを消せば監視が終わる) 2: Array: 適用しないユニット、ビークルのタイプ(isKindOfで指定するパラメータ) Return: None Example: ["marker_0"] execVM "safeZone.sqf"; // グループ: sixGrp に規制区域内で発砲された場合通知する(すべてのクライアントで実行) [true, "TRI_safeZone_fired", { params ["_shooter", "_weapon"]; private "_hintStr"; _hintStr = format ["<<発砲規制区域内での発砲>>\n発砲者: %1\n使用武器: %2\n使用車両: %3", name _shooter, gettext (configfile >> "CfgWeapons" >> _weapon >> "displayName"), if (vehicle _shooter isEqualTo _shooter) then {"無し"} else { gettext (configfile >> "CfgVehicles" >> typeOf (vehicle _shooter) >> "displayName")} ]; _hintStr remoteExec ["hint", sixGrp]; }] call BIS_fnc_addScriptedEventHandler; */ #define FIRED_EH_INDEX "TRI_safeZoneEHIndex" #define EVENT_FIRED "TRI_safeZone_fired" if (isDedicated || !hasInterface) exitWith {}; params [["_target", objNull], ["_exceptType", [], [[]]]]; waitUntil {sleep 1; !isNull player}; /* ローカル関数 */ private _local_fnc_isAnyType = { params ["_obj", "_typeList"]; private _result = false; { if (_obj isKindOf _x) exitWith {_result = true}; } forEach _typeList; _result }; private _local_fnc_disableFiring = { params ["_unit"]; if (isNil {_unit getVariable FIRED_EH_INDEX}) then { private _command_fire = { private _projectile = param [6, objNull, [objNull]]; if (isNull _projectile) exitWith {}; deleteVehicle _projectile; hint "<<発砲規制区域>>\n武器、兵器の使用ができません。"; [missionNamespace, EVENT_FIRED, _this] call BIS_fnc_callScriptedEventHandler; }; systemChat "発砲規制 - 開始"; player setVariable [ FIRED_EH_INDEX, player addEventHandler ["FiredMan", _command_fire] ]; }; }; private _local_fnc_enableFiring = { params ["_unit"]; private _ehIndex = player getVariable FIRED_EH_INDEX; if !(isNil "_ehIndex") then { systemChat "発砲規制 - 停止"; player removeEventHandler ["FiredMan", _ehIndex]; player setVariable [FIRED_EH_INDEX, nil]; }; }; /* メイン処理 */ if (!local player) exitWith {}; // おまじない while {if (_target isEqualType objNull) then {alive _target} else {true}} do { if (player inArea _target) then { systemChat "発砲規制区域に入りました。"; player allowDamage false; while {player inArea _target} do { if ([vehicle player, _exceptType] call _local_fnc_isAnyType) then { // 発砲規制 - 除外タイプ [player] call _local_fnc_enableFiring; } else { // 発砲規制 - 対象 [player] call _local_fnc_disableFiring; }; sleep 2; }; systemChat "発砲規制区域を抜けました。"; [player] call _local_fnc_enableFiring; player allowDamage true; }; sleep 2; };
セーフゾーン複数ある時に効率悪いかなーと思ったけど、1つのファイルで終わらせようとすると見にくくなるし、そんなに沢山セーフゾーンあるわけでもないしなーと思って「セーフゾーン1個につき、1つの監視タスクを実行する仕様」にしました。
(ちなみに、paramsで指定したローカル変数は、privateを付けなくてもちゃんと識別されますよ。)
2017年6月27日 12:38 AM #223207michy_REV19キーマスターadvanced ballistic有効になってるみたいですけど最新のaceのサーバーコンフィグください!
2017年7月1日 6:14 PM #224490TorpolMゲスト質問です
人質救出ミッションを作っているんですが
トリガー内に特定のユニット(複数,c1~c6)が入った時にミッション終了にしたいと考えています
conditionに((c1 in thislist) and (c2 in thislist) and (c3 in thislist) and (c4 in thislist) and (c5 in thislist) and (c6 in thislist)) && isserver
や
([c1,c2,c3,c4,c5,c6] in thislist) && isserver
等試しましたが反応しないのですが
どうすればいいでしょうあk?2017年7月3日 5:08 PM #225242Line参加者Activation: Anybody
Condition
{vehicle _x in thisList} count [c1,c2,c3,c4,c5,c6] == 6
他にも色々方法は有りますが、これで試してみてください。
もしタスク完了通知を行う場合は、ServerOnlyにすると何かを各クライアントにpublicVariableかremoteExecもしくはbis_fnc_MPで配らなければいけないです。2017年7月11日 4:51 AM #226444michy_REV19キーマスターしれっとAdvanced Train Simulatorがサーバーサイドで導入されているようですけど、これはクライアント側に入れてミッションに出してもいいってことですか?
まだ試験段階ですか?2017年7月11日 9:57 AM #226470tricoキーマスターしれっと入れてみましたがプリセットに入れる予定は今のところありません。( ͡° ͜ʖ ͡°)
2017年7月17日 5:48 PM #228383TorpolM参加者Suicide Bomber Script
AIユニットが自爆攻撃するようになるスクリプトです(現在Beta版)使い方はsqfファイルの方にも書いていますが
description.extにこれを追加します
class CfgSounds { sounds[] = {sakebi}; class sakebi { name = "sakebi"; sound[] = {"\Sound\allahu_akbar.ogg",5,1,100}; titles[] = {0,""}; }; };
あとは自爆攻撃させたいユニットに
nul = [ユニット名,叫びだす範囲,爆発する範囲,検出範囲,爆発物の種類] execVM ["scripts/Suicide Bomber.sqf"];
と記入するだけです。
範囲内に入ったすべてのプレイヤーサイドのユニットのなかからランダムに目標を選定し接近していきます。
そのユニットが自爆する前に目標が死亡した場合は
10秒後に再び目標選出に戻ります。
なお、目標が設定されるまでは通常のユニットとして行動します。2017年7月17日 11:23 PM #228484JFetch(ふぇっち)参加者ミッション中に、自分と同じ装備のAIをすぐ近くにスポーンさせて自分のグループに参加させるscript
/* v1.0.000 *サーバ上で実行する *大量に本スクリプトを呼び出さないようにする Parameters: 1: Unit: 装備の参照元ユニット 2: Group: スポーンするユニットが所属するグループ -> *nilやnullの場合は新規にグループを作成 3: Position: スポーンする場所(座標) -> *未指定の場合はパラメータ1で指定したユニットの近くにスポーン Example: *player1というのはユニットに付けた名前(Variable Name) _nil = [player1] execVM "spawnIdenticalUnit.sqf" // player1と同じ装備のユニットをplayer1の近くにスポーン Other: [player1, group player1] // 同じ装備のユニットを近くに作成し、同じグループに入れる [player1, group player1, getPos player2] // 上記とほぼ同じだが沸く場所がplayer2の近くになる *スポーンしたユニットの値が欲しい時 _spawnedUnit = [player1] call (compile preprocessFileLineNumbers "spawnIdenticalUnit.sqf") Return: Spawned Unit */
spawnIdenticalUnit.sqf
#define VARNAME_SAVED_INV "TRI_savedInventory" if !(isServer) exitWith {}; private ["_unit", "_grp", "_spawnPos"]; _unit = param [0, objNull, [objNull]]; _grp = param [1, grpNull, [grpNull]]; _spawnPos = param [2, [], [[]], [2, 3]]; if (isNull _unit) exitWith {}; private ["_side", "_unitClass", "_clone"]; _side = side _unit; _unitClass = typeOf _unit; // 装備内容の保存 [_unit, [_unit, VARNAME_SAVED_INV]] call BIS_fnc_saveInventory; // スポーンさせるユニットの作成 if (isNull _grp) then {_grp = createGroup [_side, true]}; if (_spawnPos isEqualTo []) then {_spawnPos = getPos _unit}; _clone = _grp createUnit [_unitClass, _spawnPos, [], 0, "FORM"]; // 装備のコピー(反映, 読込) [_clone, [_unit, VARNAME_SAVED_INV]] call BIS_fnc_loadInventory; _clone
2017年8月11日 11:36 AM #233177muche3メンバーミッションエディットするためにスクリプト構文を解読中なんですが、プログラミング言語は初めてでいまいちさっぱりで、、、
4点ほどご質問させてください。▼質問1,2
例文 上記より引用
_nul = [this] execVM “ammo.sqf”;
中の”_nul” というのはどういう意味なんでしょうか・・・?
“0”だったり”this”でも大丈夫という認識であっていますか?▼質問3,4 別スレから引用
if (isServer) then {
{[_X] execVM “scripts\cargo_ammo.sqf”;}
FOREACH [CAR01,CAR02,CAR03,CAR04];
{[_X] execVM “scripts\cargo_repair.sqf”;}
FOREACH [REPAIR01,REPAIR02];
{[_X] execVM “scripts\cargo_Medical.sqf”;}
FOREACH [MEDICAL01];
{[_X] execVM “scripts\cargo_truck.sqf”;}
FOREACH [STRUCTURE04];
{[_X] execVM “scripts\ammo_box.sqf”;}
FOREACH [box01];
{[_X] execVM “scripts\base_ammobox.sqf”;}
FOREACH [box02];
[] execVM “scripts\tyers.sqf”;};
この例文の場合[_X]というのはどういう意味なのでしょうか・・?
また この場合 = がないのですが、これはどうしてでしょうか?以上、めちゃくちゃ初歩的で申し訳ありません。
どうかご教授お願い致します。2017年8月12日 2:09 AM #233199tricoキーマスター>muche3さん
こんばんは~。こむずかしいことは置いといて分かりやすくお答えすると、
質問124
= の左側を変数といいますが、オブジェクトのINIT欄に書く時は変数を指定しないといけないルールになっています。
他のスクリプトから参照とかしないなら null でも 0 でもなんでも構いません。
でも this は「このオブジェクト」という意味なので変数には使えないよ。質問3
_x は繰り返し処理などでなにかを代入する時に使います。forEach は後ろの [アレイ] の中身分だけ繰り返すという意味です。
{[_x] execVM “scripts\ammo.sqf”;} forEach [CAR01,CAR02,CAR03,CAR04];
つまりこういう場合、CAR01 から順番に _x に代入されて
[CAR01] execVM “scripts\ammo.sqf”; [CAR02] execVM “scripts\ammo.sqf”; ...
というふうに実行されるよ。
2017年8月13日 12:43 AM #233238michy_REV19キーマスターDev版試してたらものすごく便利なモジュールを見つけたので紹介しておきます。
※なんかいろんな方から巻き込みリプ頂いたんですけど次のDLCで実装予定らしいです。ごめんね!初期状態でMAPに配置されている建物や設備を削除したりダメージを与えたりしたいい時、多くの方はGame LogicやnearestObjectコマンド・Object IDを利用してオブジェクトを制御しているかと思います。
EDENエディタになってからIDを表示するのにコンソールを使用したりIDが見づらかったり、そもそも面倒くさかったりしますよね?
そんなときに便利なのがEdit Terrain ObjectモジュールとHide Terrain Objectsモジュールです!(両方ともEnvironment枠に入ってます)Edit Terrain Objectモジュールは、MAPに配置されているオブジェクトにダメージを与えたり、ドアの開閉状態を制御することが出来ます。
内容は勿論ですがそれ以上に便利なのが設置方法で、オブジェクトに対してスナップが効くので適用したいオブジェクト上までドラッグして、ハイライトが表示されたらドロップするだけです!すっごーい!
さらに、モジュールを設置したオブジェクトの外観はエディタ上でプレビューされます。
Hide Terrain Objectsモジュールは、MAPに配置されているオブジェクト群を削除することが出来ます。
先に紹介したEdit Terrain Objectモジュールでもオブジェクトを削除することは可能ですが、こちらはトリガーのような範囲指定になっているので、複数のオブジェクトを一気に消し去りたいときに便利です。
使い方は効果範囲を指定して設置するだけです。
下草以外のすべてのオブジェクトが削除されますが、建物だけとか壁だけとかフィルタを掛けることも可能です。モジュールで楽しよう!
- この返信は7年、 2ヶ月前にmichy_REV19が編集しました。理由: ひぃぃぃぃん
2017年8月13日 9:26 PM #233288muche3メンバーtricoさん
4点ともわかりやすくお答えいただきありがとうございます。
とてもよくわかりました!
プレイアブルユニットの動きを止めたりするのに使う構文の意味もすっぱり理解できるようになりました。
- この返信は7年、 2ヶ月前にmuche3が編集しました。理由: 本文の間違い
2017年8月21日 3:36 PM #233710donkey11ゲスト質問です。
アーセナルの中身をホワイトリスト(使いたいものを書く)ではなく、ブラックリスト(使いたくないものを書く)で制限したいのですが。方法がわかりません。ブラックリスト化の方法が存在するのかも分かっていません。
知っている方いましたらご教授お願いします。2017年8月22日 12:34 PM #233756く”らぅん参加者https://community.bistudio.com/wiki/BIS_fnc_removeVirtualItemCargo
このfunctionで出来ると思います。
ただ、Coopのミッションで使うのには賛成できません。2017年8月22日 3:37 PM #233770JFetch(ふぇっち)参加者一応できる方法を考えてみましたがアーセナルの仕様上ブラックリストでの管理は難しいように感じられました。
おそらく一番簡単な方法ですが…
["AmmoboxInit", [arsenalBox, true]] call BIS_fnc_arsenal; [arsenalBox, "ACE_Banana"] call BIS_fnc_removeVirtualItemCargo;
コレはできません!
原因はアーセナルの処理の仕様上です。(詳しくは最後)ならばConfigから全アイテムを取得して…と思いましたがBIのアーセナルスクリプトでやっていることをまたやるのは面倒なので…
若干不満は残りますが以下のようにして実現してみました。
※内容を設定するだけなのでアーセナルのアクション項目の追加は別途行ってください。
setArsenalContensByBlackList.sqf/* v1.0.000 Script: setArsenalContensByBlackList.sqf Description: アーセナルの中身をブラックリストを用いて設定する。 ブラックリストとは: 使用、許可するものを指定するホワイトリストに対して、 禁止するものや除くものを指定する方法がブラックリストという。 Parameters: 1: Object: アーセナルを設定するオブジェクト(ブラックリストを用いて) 2: Any: 指定されたタグで結びつけたクラスのリスト NestedArray: [["weapon", []], ["magazine", []], ["backpack", []], ["item", []]] *"weapon"等のタグは大文字小文字を区別するので変更しないように。 String: 上記配列を最後の行に記述したSQFファイル(例: "script\blacklist.sqf") Returns: true */ private ["_obj", "_blacklist"]; _obj = param [0, objNull, [objNull]]; _blacklist = param [1, [], [[], ""]]; // ローカル関数 private _local_fnc_getClass = { private ["_removeClasses"]; params ["_classes", "_blacklist", "_key"]; _removeClasses = ([_blacklist, _key] call BIS_fnc_getFromPairs); if (!isNil "_removeClasses") then {_classes = _classes - _removeClasses}; _classes }; if (_blacklist isEqualType "") then { _blacklist = call (compile preprocessFileLineNumbers _blacklist); }; /* メイン処理 */ private ["_data"]; // アーセナルで取扱うアイテムクラスを取得できるようにする _data = missionNamespace getVariable "bis_fnc_arsenal_data"; if (isNil "_data") then { ["Preload"] call BIS_fnc_arsenal; _data = missionNamespace getVariable ["bis_fnc_arsenal_data", []]; }; // アーセナルの内容設定 for [{private _i = 0}, {_i < count _data}, {_i = _i + 1}] do { private _classes = _data select _i; switch (true) do { case (_i in [0, 1, 2]): { _classes = [_classes, _blacklist, "weapon"] call _local_fnc_getClass; [_obj, _classes, false, false] call BIS_fnc_addVirtualWeaponCargo; }; case (_i in [22, 23, 26]): { _classes = [_classes, _blacklist, "magazine"] call _local_fnc_getClass; [_obj, _classes, false, false] call BIS_fnc_addVirtualMagazineCargo; }; case (_i == 5): { _classes = [_classes, _blacklist, "backpack"] call _local_fnc_getClass; [_obj, _classes, false, false] call BIS_fnc_addVirtualBackpackCargo; }; case (_i > 2): { _classes = [_classes, _blacklist, "item"] call _local_fnc_getClass; [_obj, _classes, false, false] call BIS_fnc_addVirtualItemCargo; }; }; }; true
blacklist.sqf
private ["_wpn", "_mag", "_bpack", "_item"]; _wpn = ["arifle_MX_Black_F"]; _mag = []; _bpack = ["B_AssaultPack_blk", "B_FieldPack_ocamo"]; _item = ["Binocular"]; [["weapon", _wpn], ["magazine", _mag], ["backpack", _bpack], ["item", _item]]
最後に ; が無いのは仕様です。
これをそのまま使うとロード画面が変なタイミングで入る上にスクリプトエラーを吐く(精神衛生上悪いだけ)のでアーセナルの設定時に以下のようなコードをInit欄に書くことをおすすめします。
(それでも予めアーセナルを開いてないのでスクリプトエラー吐くのは内緒)this addAction ["Initialize Arsenal", { private ["_obj", "_script"]; _obj = _this select 0; _script = [_obj, "blacklist.sqf"] execVM "setArsenalContensByBlackList.sqf"; waitUntil {sleep 0.1; scriptDone _script}; ["AmmoboxInit", [_obj, false]] call BIS_fnc_arsenal; (_this select 0) removeAction (_this select 2); }, nil, 6, false];
今回、たいしてデバッグしてないのでアイテムが足りないとかあるかも。
ぁ…アーセナル対象のオブジェクトを一旦初期化(クリア)する処理してないや…別にいいよね|д゚)チラッBIのArsenalスクリプトの仕様(予想)
Preloadの処理の時にConfigから扱えるアイテム類を全て列挙し、そこから各種値(名前とか性能)を取得し、GUIのデータを保持する領域に保存。
プレイヤーがアーセナルのアクションメニューを開いた時もしくは項目タブの切替時に、エディッターが設定したアイテムと比較して、それと合致するやつだけ表示するようにしている…はず。
その処理の際、簡略化のために全てのアイテムを取扱うときにのみ”%ALL”という特殊データを用いるので、全アイテムを使う処理→いらないやつを削除ができない。
なので、BIS_fnc_getVirtual…系で現在アーセナルで取り扱っているアイテム類を取得しようとしても、全てのアイテムを使う設定にしていると”%ALL”が返ってしまう。 -
投稿者投稿
- このトピックに返信するにはログインが必要です。