返信先: ARMA3 ミッションエディットスレ

ホーム フォーラム TRI Gaming フォーラム ARMA3 ミッションエディットスレ 返信先: ARMA3 ミッションエディットスレ

#28818
Line
参加者
    init.sqf作成編

自分なりのinit.sqf作成を紹介したいと思います。
init.sqfというのはミッションを開始する前の設定ファイルです。
mission.sqmのみでも動くには動きますが、ここでは更に詳しい設定が行えます。
配置階層はmission.sqmと同階層で名前は必ずinit.sqfとしてください。

ではinit.sqfを作成したらまずはこれを入力します。

if (!isDedicated) then {waitUntil {!isNull player && isPlayer player};};
これは何かというと参加したプレイヤーにinit.sqfを読み込ませる為の構文です。
訳すと、
もしサーバーではない時、また、プレイヤーがプレイヤーになるまで待つ。
プレイヤーというスロットに参加するプレイヤーが入るまで待たせる為の構文です。
これが無いと過去にinit.sqfが読み込まれないという問題が起きていました。
現在はもう既におまじないレベルですが回避策はいくらでも盛り込んでおいた方がよいです。

    init.sqf内設定編
if ((!isServer) && (player != player)) then
{
  waitUntil {player == player};
};

どちらでも良いので使用してください。

次に余計な物を省いておきます。

enableSaving [false,false];
enableRadio false;

マルチでセーブしてどうすんねんという感じなので1行目は必要ありません。
2行目は喧しいラジオチャッターを切りました。
しかし、2行目を切ってしまうとCfgRadioが全く反映されませんので注意してください。

さてお次はエディット中、またはテストミッション時に使える便利なコマンドを入れます。

onMapSingleClick "if ((local player) and _alt) then {(vehicle player) setPos _pos;}";
player addAction [">Copy Position","copypos.sqf"];
player addAction [">Copy Objectname","objectname.sqf"]; 

1行目はAltキーを押しながらマップを左クリックすると任意の場所に飛ぶことができます。
車両に乗った状態でも可能です。
2行目は前投稿で投稿している内容ですので説明は省きます。
3行目はマップ上に設置されている物の名前を調べるスクリプトです。

下記にスクリプト内容を書きます。
objectname.sqf

_object_type = typeOf cursorTarget;
hint format ["%1", _object_type];
copytoclipboard str(_object_type); 

アクションメニューから選択した後、メモ帳にコピーできます。

※ミッションを公開する時はこれらは必ずコメントアウトしてください。

    Briefing作成

エディタ上でもDiaryは作成できますが、日本語を使用するのであれば圧倒的にこちらが簡単です。
最初は少し見づらいかもしれませんが慣れるまでの辛抱です。

page10 = player createDiaryRecord ["Diary", ["アップデート情報", "H26.ww.ww<br />バランス調整<br />所持品修正<br /><br />H26.xx.xx<br />リリース<br />"]];
page9 = player createDiaryRecord ["Diary", ["CREDIT", "Special Thanks<br /><img image='images\logo.paa' width='128' height='128'/><br />TESTER<br />
<br />テストに参加していただいた方の名前でも
<br />
<br />
<br />
Thank you for test!<br /><br />Go to " + (createDiaryLink ["Diary", page10, "アップデート情報"])]];
page8 = player createDiaryRecord ["Diary", ["RADIO PLAN", "COMMON FREQ 30.1<br />Alpha 1 FREQ 31.5<br />Alpha 2 FREQ 32.1
<br />Go to " + (createDiaryLink ["Diary", page9, "CREDIT"])]];
page7 = player createDiaryRecord ["Diary", ["SPECIFICATION", "AGM wounding system unconscious time : Unlimited<br />Only medics can use injection<br />
<br />Go to " + (createDiaryLink ["Diary", page8, "RADIO PLAN"])]];
page6 = player createDiaryRecord ["Diary", ["SUPPLY", "支給品。車両とか
<br />Go to " + (createDiaryLink ["Diary", page7, "SPECIFICATION"])]];
page5 = player createDiaryRecord ["Diary", ["EXECUTION", "作戦のチームの実行内容
<br />Go to " + (createDiaryLink ["Diary", page6, "SUPPORT"])]];
page4 = player createDiaryRecord ["Diary", ["MISSION", "ミッション名とか
<br />Got to " + (createDiaryLink ["Diary", page5, "EXECUTION"])]];
page3 = player createDiaryRecord ["Diary", ["SITUATION", "開始時刻、天候、民間人の有無等
<br />Go to " + (createDiaryLink ["Diary", page4, "MISSION"])]];
page2 = player createDiaryRecord ["Diary", ["BRIEFING", "ブリーフィング内容を記述。
<br />Go to " + (createDiaryLink ["Diary", page3, "SITUATION"])]];
page1 = player createDiaryRecord ["Diary", ["CONCEPT", "趣旨とかの説明をいれてください。<br />を使って改行ができます。
<br />Go to " + (createDiaryLink ["Diary", page2, "BRIEFING"])]];

ブリーフィング内に写真を挿入する場合は必ず画像の大きさは64の倍数でないと表示されません。
Arma2時代はどの大きさでも表示できてたんですけどね。。

例:
<img image='images\logo.paa' width='128' height='128'/>
こうやると表示されます。
また画像は.jpgか専用ファイルの.paaです。
アルファチャンネルをどうしても使いたい方はアルファの状態でpngに変換しTexView2を使用し.paaに変換してください。

    スクリプトの読み込み

私はinit.sqfでフィールド上に置いてある弾薬をカスタマイズする時が多いです。
例:

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";

};

文頭にif(isServer)then{をつける事により、サーバー側のみの処理になります。
弾薬箱のスクリプトも公開しておきます。

cargo_ammo.sqf

if (!isServer) exitWith {};

_box = _this select 0;

clearWeaponCargoGlobal _box;
clearMagazineCargoGlobal _box;
clearBackpackCargoGlobal _box;
clearItemCargoGlobal _box;

_box addWeaponCargoGlobal ["STI_M136", 2];
_box addItemCargoGlobal ["B_IR_Grenade", 10];
_box addItemCargoGlobal ["AGM_M84", 10];
_box addItemCargoGlobal ["AGM_CableTie", 5];
_box addItemCargoGlobal ["RH_SFM952V", 2];
_box addItemCargoGlobal ["AGM_SpareBarrel", 2];
_box addItemCargoGlobal ["AGM_M26_Clacker", 5];
_box addMagazineCargoGlobal ["30Rnd_65x39_caseless_mag_Tracer", 30];
_box addMagazineCargoGlobal ["1Rnd_HE_Grenade_shell", 20];
_box addMagazineCargoGlobal ["150Rnd_762x51_Box_Tracer", 5];
_box addMagazineCargoGlobal ["SmokeShell", 10];
_box addMagazineCargoGlobal ["SmokeShellRed", 10];
_box addMagazineCargoGlobal ["SmokeShellGreen", 10];
_box addMagazineCargoGlobal ["HandGrenade", 20];
_box addMagazineCargoGlobal ["DemoCharge_Remote_Mag", 3];
_box addMagazineCargoGlobal ["AGM_HandFlare_White", 20];
_box addMagazineCargoGlobal ["AGM_HandFlare_Red", 10];
_box addMagazineCargoGlobal ["AGM_HandFlare_Green", 10];
_box addMagazineCargoGlobal ["AGM_HandFlare_Yellow", 10];
_box addItemCargoGlobal ["AGM_Bandage", 10];
_box addItemCargoGlobal ["AGM_Morphine", 5];

init.sqfで既にif(isServer)then{};の枠で回避していますが、
if (!isServer) exitWith {};をつけておかないと、参加している全てのプレイヤーがこのスクリプトを読み込み、弾薬箱の中身がパーティー状態になってしまいますので必ず注意してください。

そして、これでもつけてあげといてください。

//TRISERVER

if (toLower name player == "trico") then {
	player addHeadgear "H_Cap_surfer" ;
} ;

そして最後はおまじない

// EOF
player globalChat format ["Mission Initialisation Complete. Press CONTINUE"];
finishMissionInit;

init.sqfが全て読み込まれると
「Mission Initialisation Complete. Press CONTINUE」と発言します。

    Dedicated ServerとListen Server

init.sqfの中身は、どれをプレイヤーに読み込ませ、どれをサーバー側だけ読み込ませるか、が重要です。
プレイヤー側にある命令文を読み込ませてしまうと参加している人数分だけ何かが増殖したり、最悪サーバーがクラッシュする可能性もあります。

また、エディット上ではうまく動作するが、Dedicated Serverでは動作しない場合も沢山あります。
この原因としてはエディット上ではListen Serverといって自分自身がDedicated Serverでは無いServerになっている。
プレイヤーでもあり、サーバーでもあるのでこの状態で動作してもDedicated Serverでの挙動は確証得られないですよね。
なので、本チャンでチャレンジするよりもまずは空いているDedicated Serverで一人若しくは数人でテストする事が必須です。

それでも私はいつもミスしてるんですけどね・・・

    TIPS

各陣営でブリーフィングを分ける方法

switch (side player) do
{
case WEST:
{
Task1 = player createSimpleTask ["トリコさんを排除しましょう"];   
Task1 setSimpleTaskDescription ["トリコさんを排除しましょう", "トリコさんを排除しましょう", "トリコさんを排除しましょう"]; 
player setCurrentTask task1;
task1 setSimpleTaskDestination (getMarkerPos "task1");
};
case INDEPENDENT:
{
Task1 = player createSimpleTask ["トリコさんを排除しましょう"];   
Task1 setSimpleTaskDescription ["トリコさんを排除しましょう", "トリコさんを排除しましょう", "トリコさんを排除しましょう"]; 
player setCurrentTask task1;
task1 setSimpleTaskDestination (getMarkerPos "task1");
};
case EAST:
{
Task1 = player createSimpleTask ["トリコさんはやっぱり守りましょう"];   
Task1 setSimpleTaskDescription ["トリコさんはやっぱり守りましょう", "トリコさんはやっぱり守りましょう", "トリコさんはやっぱり守りましょう"]; 
player setCurrentTask task1;
task1 setSimpleTaskDestination (getMarkerPos "task1");
};
};

これで各陣営別にブリーフィングが作成できます。