# My First mission (Kind of a suggestion, but I've already started)

## Recommended Posts

When - Morning, 2018

Where - Fata, village of Tottah

Who's invovled - Two six-man Marine Force Recon teams (blufor, Players) and a large militia (Ind, AI) fighting Russian-backed Insurgents (Opfor, AI)

What they're doing - In the midst of a a militia assault on Insurgent-occupied Northern Tottah, MFR is sent in to neutralize a high-ranking insurgent, confiscate intel (cell phone, maps etc.), and collect dogtag/DNA evidence to confirm the kill, then GTFO

What I've been doing about it - Since it's my first mission, I'm trying to avoid using a framework and I've gotten pretty far. I finished loadouts (including radios) using the default 3DEN arsenal, placed AI and done all the fun "setUnitPos" type stuff to make MOUT tough, set waypoints where necessary, put markers on map, added various objects for immersion, set up ACE spectator, medical, etc., written the briefing with pictures, have startOnSafe working, and am working on triggers/end conditions. To my knowledge all SOPs are met except for proper end conditions.

What I'll need help with - Making triggers/end conditions that work, creating a respectable Endscreen, guidance on how much  AI to add/take away gauging server performance and difficulty level, as well as in the long run uploading the mission and testing testing testing

Any help and advice is much appreciated; Thanks!

Edited by TheHutch

I suggest using EG spectator since everyone here seems to love it. https://community.bistudio.com/wiki/EG_Spectator_Mode

As for end conditions this is what I use. You could simplify mine by using an array for objective objects.

Important note I still use the old GDT spectator and the variable specpen. If you where to use your own spectator script you could remove or replace(if you have a spectator box).

//init.sqf

setTerrainGrid 48;
setViewDistance 3500;
enableSaving [false, false];

[] execVM "briefing.sqf";
[] execVM "scripts\end.sqf";

if (isServer) then
{
params[ "_killed", "_killer", "_instigator" ];

if (_killed == helio) then {
[west, "HQ"] sideChat "Mi-8 was destroyed.";
};

if (_killed == zsu1) then {
[west, "HQ"] sideChat "ZSU #1 was destroyed.";
};

if (_killed == zsu2) then {
[west, "HQ"] sideChat "ZSU #2 was destroyed.";
};

if (_killed == officer) then {
[west, "HQ"] sideChat "Pilot was killed";
};

if (_killed == pilot) then {
[west, "HQ"] sideChat "Pilot was killed";
};
}];
};

if (!isDedicated) then {
waitUntil {!(isNull player)};

playerKilled = player addEventHandler [ "Killed", { [] execVM "scripts\spectator\prep.sqf"; } ];

[player] execVM "scripts\jip.sqf";

spectating = false;};

//scripts/end.sqf

wT = west countSide playableUnits; // Total West Units
eT = east countSide allUnits; // Total East Units

while {true} do
{
wA = {(side _x == west) && ((alive _x) or !(_x getVariable ["ACE_isUnconscious", false])) && ((_x distance specpen) > 256)} count playableUnits; // Total west units alive and wake.
eA = {(side _x == east) && ((alive _x) or !(_x getVariable ["ACE_isUnconscious", false]))} count allUnits; // Total east units alive and wake.

if (wA <= ceil((wT * 0.20))) then
{
cutText["OPFOR Victory.\n\nBLUEFOR took to many casualties.", "BLACK FADED"];

sleep 3;

cutText[format["OPFOR Victory.\n\nCasualties\nBLUFOR: %1\nOPFOR: %2", (wT - wA),(eT - eA)], "BLACK FADED"];

sleep 3;

endMission "END1";
};

if (eA <= ceil((eT * 0.10))) then
{
cutText["BLUFOR Victory.\n\nOPFOR took to many casualties.", "BLACK FADED"];

sleep 3;

cutText[format["BLUFOR Victory.\n\nCasualties\nBLUFOR: %1\nOPFOR: %2", (wT - wA),(eT - eA)], "BLACK FADED"];

sleep 3;

endMission "END1";
};

if ((!alive officer) and (!alive pilot) and (!alive helio) and (!alive zsu1) and (!alive zsu2)) then
{
cutText["BLUFOR Victory.\n\nAll objectives were destroyed.", "BLACK FADED"];

sleep 3;

cutText[format["BLUFOR Victory.\n\nCasualties\nBLUFOR: %1\nOPFOR: %2", (wT - wA),(eT - eA)], "BLACK FADED"];

sleep 3;

endMission "END1";
};

sleep 60;
};

Edited by Clark

I completely fail to comprehend your logic. Frameworks are designed to make your job easier by letting you use code that has been written and tested carefully by people that know what they are doing. Instead of using one line of code, you are writing stuff that will break in one way or another.

I could keep pointing out why your logic is flawed, but it's your mission and you can do whatever you want. Good luck finding someone that's willing to review it.

Framework has nothing to do with reviewing a mission.  Please avoid such discussions as it is disruptive to the thread and request of the thread's author.

Please feel free to learn how to make missions without a framework, as they are not required to submit a mission to our servers.

Nothing in our review process requires a framework to be used.

What I'll need help with - Making triggers/end conditions that work, creating a respectable Endscreen,

The main reason you use a framework. You can create your own solution, whether with sqf, triggers, or both, but it might be tricky if you're just starting out.

I will elaborate:

Review team is low on numbers currently, reviewing someone's never-seen-before code is PITA and makes the process even more time-consuming. There were enough broken missions that were using different kinds of frameworks, I can't imagine what would happen if everybody started rewriting every feature.

As Impulse pointed out, usage of framework isn't required to submit a mission, however it's generally a bad practice to redo features that have been already implemented and tested by someone else (in a framework for example), especially if you are novice mission maker (it doesn't apply only to mission-making!). What you are doing is basically trying to reinvent the wheel - coming up with solutions that are likely to be inferior to ones that have been implemented by people that have more scripting experience than you. Why is it bad? As you might have noticed while making your mission, game has many different moving parts and it's often close to impossible to predict how some things are going to break. There are concepts of locality, JIP compatibility, scheduler performance, reliability, extensibility and mod compatibility that are hard to grasp for someone that's just starting his mission-making adventure.

Frameworks are designed to make life easier not harder, especially for novices like you. As an example here's framework equivalent of code above

_eastCasualty = "OPFOR" call FNC_CasualtyPercentage;
if (_eastCasualty >= 95) exitWith {"The BLUFOR forces have aliminated the OPFOR forces." call FNC_EndMission;};

_westCasualty = "BLUFOR" call FNC_CasualtyPercentage;
if (_westCasualty >= 95) exitWith {"The OPFOR forces have aliminated the BLUFOR forces." call FNC_EndMission;};

if ((!alive officer) and (!alive pilot) and (!alive helio) and (!alive zsu1) and (!alive zsu2)) exitWith {"BLUFOR Victory. All objectives were destroyed." call FNC_EndMission;};


As you can see, you are provided with functions, like FNC_CasualtyPercentage, FNC_EndMission and that's basically essence of what framework is, it provides you with tools to accomplish some goals, which is perfect for novice mission makers. Wanting to stay away from this is pretty counter-intuitive for me, hence my initial response. Even if you want to learn how to implement features yourself, it's better idea to use ready solutions in order to more easily focus on basics instead of trying to tackle hard concepts straight away.

As to some of your questions:

You can un-pbo missions you have played. If you've played a mission and you liked it, you can navigate to %LOCALAPPDATA%\Arma 3\MPMissionsCache folder and use a un-pbo tool to unpack a mission file. Then move it to your missions folder and open it up to see how some things were done.

For end conditions, avoid using many triggers, especially if they cover large area. They might cause some performance degradation.

Second the use of EG Spectator. I can provide a few examples of how I've done player tracking in the past once I get home this evening, but the short answer is CBA events with event scripts.

Edited by TinfoilHate

Thanks Clark that script is really helpful. Player tracking/end conditions finished and working.

And to clarify, I'm not using a framework because I have absolutely no prior experience with scripting and want to make sure I understand the fundamentals of exactly what's going on in those fancy frameworks. Once I'm finished I might rebuild with a framework if I feel it needs a more polished feel, and almost definitely will use one if I choose to convert this into a TvT.

I'll check out EG spectator; does it warrant using a specpen?

Thanks Clark that script is really helpful. Player tracking/end conditions finished and working.

And to clarify, I'm not using a framework because I have absolutely no prior experience with scripting and want to make sure I understand the fundamentals of exactly what's going on in those fancy frameworks. Once I'm finished I might rebuild with a framework if I feel it needs a more polished feel, and almost definitely will use one if I choose to convert this into a TvT.

I'll check out EG spectator; does it warrant using a specpen?

It doesn't necessarily use a specpen. You can just toss people at 0,0,0 after removing their gear and making them invisible or whatever. Just set their oxygen to full every so often, because 0,0,0 is often water.

Okay so to spice up my endconditions and make it so I only have one trigger activated once, I'm using this here eventhandler for when players put the confiscated cellphone in a bin:

_objectives = addEventHandler ["Put", {
params[ "_unit", "_container", "_item"];

if ((_container == evidencebin) and (_item == ACE_Cellphone)) then {
[] execVM "scripts\endwin.sqf";}
}];



And Arma's giving me some good ole "ERROR MISSING ;"

Anyone see the problem? This is the first eventhandler I've made myself so I think my argument could be wrong

Edited by TheHutch

Okay so to spice up my endconditions and make it so I only have one trigger activated once, I'm using this here eventhandler for when players put the confiscated cellphone in a bin:

_objectives = addEventHandler ["Put", {
params[ "_unit", "_container", "_item"];

if ((_container == evidencebin) and (_item == ACE_Cellphone)) then {
[] execVM "scripts\endwin.sqf";}
}];



And Arma's giving me some good ole "ERROR MISSING ;"

Anyone see the problem? This is the first eventhandler I've made myself so I think my argument could be wrong

You'd need an object for the eventHandler to be on, which would be like BOX addEventHandler ["whatever"...

Edit: may I also recommend Discord, as it has a mission-making channel: https://discord.gg/dda7j7b

Edited by TinfoilHate

Mission became CO12 Bulls of Tottah. V2 is on srvr 3 if a handful of people are bored and want to test it. It seems higher player counts were behind V1 crashes

## Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

×   Pasted as rich text.   Paste as plain text instead

Only 75 emoji are allowed.