Jump to content

Recommended Posts

@Jnr4817, @JohnKalo, @GEORGE FLOROS GR, @pierremgi, @The Real Bunc, @kremator, @Rhukha, @Plantroot,

I posted all the current dev files with and without FEMALE asset requirement. Totally playable, perhaps a little quirky.

Try clearing some rings. I promise it's tonnes of fun!


Check out a playable ALPHA without FEMALE: Drive Link

Check out a playable ALPHA with FEMALE: Drive Link

  • Thanks 3

Share this post


Link to post
Share on other sites

Cool ... will give it a go mate.

 

Good job.

 

Krem

  • Like 2

Share this post


Link to post
Share on other sites

Glad I found this. In the process of building a USCG mod right now and would love to see a proper winch and basket system created. I can help if need be. Aviation is my thing. Hope to see this developed further! 

Share this post


Link to post
Share on other sites

@typhoontiger,
 

Quote

Glad I found this. In the process of building a USCG mod right now and would love to see a proper winch and basket system created. I can help if need be. Aviation is my thing. Hope to see this developed further! 

I hope you can draw inspiration or useful script snippets from Fly Tanoa Air. @JohnKalo, suggested the winch system but neither of us know how to do it and it's beyond the immediate scope of this project so don't wait for us. Make a topic about winch scripts and we'll all contribute what we can.

FTA is undergoing a complete script overhaul as we speak.

Check out the new nextFARE.sqf
 

Spoiler

//New Fare
if (Pass==0 && (AP1==1 or AP1==2 or AP1==3 or AP1==4 or AP1==5)) then {
passenger1 = [CIV1, CIV2, CIV3, CIV4] call BIS_fnc_selectRandom;
    hint "You have a new passenger.";
    closeDialog 0;
sleep 2;
    passenger1 assignAsCargoIndex [playerJET, 0];
    passenger1 moveinCargo playerJET;
destination= []execVM "controlPOS.sqf";
sleep 2;
    hint "";
    pass=1;
};

//deliver passenger
if (Pass==1 && Dest==1) then {
    _list = fullCrew [ playerJET, "cargo" ] apply { _x select 0 };
    Passenger1 = _list select 0;
    closeDialog 0;
sleep 1;
    moveOut passenger1;
    unassignvehicle passenger1;
sleep 1;
    Passenger1 setpos (getpos locationNULL);
    destinationTRIG setpos (getpos locationNULL);
    hint "Passenger Delivered to destination.";
    playergroup = group Player;
    deleteWaypoint [playergroup, 0];
    ["task1",[objNULL,false]] call BIS_fnc_taskSetDestination;
sleep 3;
    hint "";
    pass=0;
    DEST=0;
};

//if passenger but no airport
if (Pass==1 && AP1==0) then {
    hint "You already have a passenger.";
sleep 3;
    hint "";
};

 


ControlPOS.sqf identifies which airport the player is currently at and determines the next destination. This was previously done by having every airport, and associated script, included in nextFARE.sqf.
 

Spoiler

//control current position

switch (AP1) do
{
    case 1:
    {
    WPmark = [airportMARK2, airportMARK3, airportMARK4, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 2:
    {
    WPmark = [airportMARK1, airportMARK3, airportMARK4, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 3:
    {
    WPmark = [airportMARK1, airportMARK2, airportMARK4, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 4:
    {
    WPmark = [airportMARK1, airportMARK2, airportMARK3, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 5:
    {
    WPmark = [airportMARK1, airportMARK2, airportMARK3, airportMARK4] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

};

 


Now that we have a passenger and the destination has been determined, we fix the location with markers and triggers,
controlDEST.sqf
 

Spoiler

//control destination

switch (WPmark) do
{
    case airportMARK1:
    {
	
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK1), 0];
	NEXTWP setWaypointType "hold";
	["task1",[approachAP1,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: Aeroport de Tanoa / APPR SS---RWY 3-5 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";

	LandCLEARtrig setpos (getpos approachAP1);
	DestinationTRIG setpos (getpos airportMARK1);
	terminate destination;
    };

    case airportMARK2:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK2), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP2,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: Tuvanaka Airbase / APPR SW---RWY 0-5 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP2);
	DestinationTRIG setpos (getpos airportMARK2);
	terminate destination;
    };

    case airportMARK3:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK3), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP3,true]] call BIS_fnc_taskSetDestination;
	
hint "Destination: Bala Airstrip / APPR WW---RWY N/A / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP3);
	DestinationTRIG setpos (getpos airportMARK3);
	terminate destination;
    };

    case airportMARK4:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK4), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP4,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: Saint-George Airstrip / APPR SE---RWY 3-1 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP4);
	DestinationTRIG setpos (getpos airportMARK4);
	terminate destination;
    };

    case airportMARK5:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK5), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP5,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: La Rochelle Aerodrome / APPR EE---RWY 2-9 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP5);
	DestinationTRIG setpos (getpos airportMARK5);
	terminate destination;
    };

};

 


 , and then executing nextFARE.sqf again will reset the whole scenario. Ready to repeat at any airport, any time.

This is a lot cleaner than before. It uses fewer variables, triggers, objects, markers. It's more reliable, versatile and optimized.

  • Like 2

Share this post


Link to post
Share on other sites
4 minutes ago, wogz187 said:

@typhoontiger,
 

I hope you can draw inspiration or useful script snippets from Fly Tanoa Air. @JohnKalo, suggested the winch system but neither of us know how to do it and it's beyond the immediate scope of this project so don't wait for us. Make a topic about winch scripts and we'll all contribute what we can.

FTA is undergoing a complete script overhaul as we speak.

Check out the new nextFARE.sqf
 

  Reveal hidden contents


//New Fare
if (Pass==0 && (AP1==1 or AP1==2 or AP1==3 or AP1==4 or AP1==5)) then {
passenger1 = [CIV1, CIV2, CIV3, CIV4] call BIS_fnc_selectRandom;
    hint "You have a new passenger.";
    closeDialog 0;
sleep 2;
    passenger1 assignAsCargoIndex [playerJET, 0];
    passenger1 moveinCargo playerJET;
destination= []execVM "controlPOS.sqf";
sleep 2;
    hint "";
    pass=1;
};

//deliver passenger
if (Pass==1 && Dest==1) then {
    _list = fullCrew [ playerJET, "cargo" ] apply { _x select 0 };
    Passenger1 = _list select 0;
    closeDialog 0;
sleep 1;
    moveOut passenger1;
    unassignvehicle passenger1;


sleep 1;
    Passenger1 setpos (getpos locationNULL);

    destinationTRIG setpos (getpos locationNULL);
    hint "Passenger Delivered to destination.";
    playergroup = group Player;
    deleteWaypoint [playergroup, 0];
    ["task1",[objNULL,false]] call BIS_fnc_taskSetDestination;
sleep 3;
    hint "";
    pass=0;
    DEST=0;
};

//if passenger but no airport
if (Pass==1 && AP1==0) then {
    hint "You already have a passenger.";
sleep 3;
    hint "";

};

 


ControlPOS.sqf identifies which airport the player is currently at and determines the next destination. This was previously done by having every airport, and associated script, included in nextFARE.sqf.
 

  Reveal hidden contents


//control current position

switch (AP1) do
{
    case 1:
    {
    WPmark = [airportMARK2, airportMARK3, airportMARK4, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 2:
    {
    WPmark = [airportMARK1, airportMARK3, airportMARK4, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 3:
    {
    WPmark = [airportMARK1, airportMARK2, airportMARK4, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 4:
    {
    WPmark = [airportMARK1, airportMARK2, airportMARK3, airportMARK5] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

    case 5:
    {
    WPmark = [airportMARK1, airportMARK2, airportMARK3, airportMARK4] call BIS_fnc_selectRandom;
sleep 1;
destination= []execVM "controlDEST.sqf";
    };

};

 


Now that we have a passenger and the destination has been determined, we fix the location with markers and triggers,
 

  Reveal hidden contents


//control destination

switch (WPmark) do
{
    case airportMARK1:
    {
	
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK1), 0];
	NEXTWP setWaypointType "hold";
	["task1",[approachAP1,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: Aeroport de Tanoa / APPR SS---RWY 3-5 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";

	LandCLEARtrig setpos (getpos approachAP1);
	DestinationTRIG setpos (getpos airportMARK1);
	terminate destination;
    };

    case airportMARK2:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK2), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP2,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: Tuvanaka Airbase / APPR SW---RWY 0-5 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP2);
	DestinationTRIG setpos (getpos airportMARK2);
	terminate destination;
    };

    case airportMARK3:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK3), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP3,true]] call BIS_fnc_taskSetDestination;
	
hint "Destination: Bala Airstrip / APPR WW---RWY N/A / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP3);
	DestinationTRIG setpos (getpos airportMARK3);
	terminate destination;
    };

    case airportMARK4:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK4), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP4,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: Saint-George Airstrip / APPR SE---RWY 3-1 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP4);
	DestinationTRIG setpos (getpos airportMARK4);
	terminate destination;
    };

    case airportMARK5:
    {
	playergroup = group Player;
	deleteWaypoint [playergroup, 0];
sleep 3;
	NEXTWP = playergroup addWaypoint [(getPos airportMARK5), 0];
	NEXTWP setWaypointType "hold";
["task1",[approachAP5,true]] call BIS_fnc_taskSetDestination;

	hint "Destination: La Rochelle Aerodrome / APPR EE---RWY 2-9 / SPD LMT 380 km/h / ALT ENV 250 m - 500 m";
	
LandCLEARtrig setpos (getpos approachAP5);
	DestinationTRIG setpos (getpos airportMARK5);
	terminate destination;
    };

};

 


 , and then executing nextFARE.sqf again will reset the whole scenario. Ready to repeat at any airport, any time.

This is a lot cleaner than before. It uses fewer variables, triggers, objects, markers. It's more reliable, versatile and optimized.

On it!

  • Thanks 1

Share this post


Link to post
Share on other sites

A suggestion would be to zip the mission file before you upload it to google drive, this download is taking forever because

google drive has to zip the file just for you to download it.

  • Thanks 1

Share this post


Link to post
Share on other sites
Quote

 

A suggestion would be to zip the mission file before you upload it to google drive, this download is taking forever because

google drive has to zip the file just for you to download it.

 

@Gunter Severloh,
Yes, sir.

  • Thanks 2

Share this post


Link to post
Share on other sites

Major update!

What's new:


Script rewrites
Most of the important scripts have been completly rewritten or optimized.


Dash cam
You can now toggle the dash cam to look back inside the cabin.


Fly with Chad
Chad is kind of a prick but he's a great pilot. Fly with the Chad any time by pressing the dedicated "CHAD" button on the flight controller. To do well you must keep Tanoa 2-6 within a near distance to CHAD's plane, Tanoa 2-2. He'll tell you when you're doing well, or not. Trust me. He'll let you know what he thinks of your skill!


Intro
A brief introduction sequence.



BETA version coming soon!

readMe

Spoiler

 

Fly Tanoa Air DEMO for ARMA III, ver. BETA (2019) 

This download should be compatible with the base game.

Welcome to the Fly Tanoa Air ReadMe file!

Flying planes in ArmA III is difficult. It takes a lot of practice. Right when you think you've got it, you realize how much more there is to learn. Just dropping a plane in an empty scenario is fine and well to start but eventually gets boring and, as a pilot in training, you need something more compelling to keep logging more hours. Tanoa Air seeks to provide a fun and re-playable scenario in which to practice your skills.


What's new:


Script rewrites
Most of the important scripts have been completly rewritten or optimized.


Dash cam
You can now toggle the dash cam to look back inside the cabin.


Fly with Chad
Chad is kind of a prick but he's a great pilot. Fly with the Chad any time by pressing the dedicated "CHAD" button on the flight controller. To do well you must keep Tanoa 2-6 within a near distance to CHAD's plane, Tanoa 2-2. He'll tell you when you're doing well, or not. Trust me. He'll let you know what he thinks of your skill!


Intro
A brief introduction sequence.

Challenges

Ferry passengers
Industy and tourism dominate Tanoa's economy which means a constant supply of passengers to ferry from place to place. Pick up a passenger at any airport and deliver them to their destination.

Deliver cargo
Supply routes are a challenge to maintain. Sometimes emergency medical supplies and food get lost or mis-routed and must be delivered from the central airport. Pick up a crate at Aeroport de Tanoa and deliver it before time runs out and the sensitive cargo spoils.
 
Ring challenges
Follow the rings in 5 separate challenges and checkout some of Tanoa's most beautiful scenery while conducting a whiteknuckle acrobatic routine. (course 5 coming soon)

Fly with the Chad
Chad is kind of a prick but he's a great pilot. Fly with the Chad any time but try to keep up.


Emergencies:
Assist the Coastguard
The waters surrounding Tanoa are popular for fishing and boating. Inevitably something will go wrong. Scan radio channels for potential rescue missions and help conduct the search.


Find the missing campers (coming soon)
The archipelago, with all of its despondent islands and remote locations, is a dangerous place. Locate the missing campers so a rescue operation may begin.


Locate the car (coming soon)
Local police are in pursuit of a vehicle. Help them find the car before the bad guy gets away.


Features

Bad Luck
Watch out for bad luck which can cause unexpected conditions to appear at any time.


Weather
Utilizes Sil's dynamic weather system for 100% randomized weather conditions which update periodically throughout the mission.


Tanoa 2-6
Your plane comes installed with several features available on the Mission Controller.


Advanced Warning System
The AWS will help you stay within the flight envelope and safe operating perameteres of your aircraft. Warns if: too low, too fast, too slow, too high.


Cruise Control
The Cruise button determines your flight envelope, high or low. High is ~3500 m and low is ~250 m. Your co-pilot will maintain this envelope when you release control.


Time
This allows you to choose what time of day you wish to fly. Advance the time by 7 hours each time your press the button. 


Cabin Light
The cabin light allows you to see your passengers at night.


Dash Cam
You can toggle the dash cam between forward, to see what's ahead, and backward, to see inside the cabin. A good feature for keeping an eye on your passengers. The dash cam also has a NV feature to see in the dark.


AI Auto-pilot
In addition to your Co-pilot and the Landing Auto-pilot (highly discouraged) Tanoa 2-6 will engage a simple auto-pilot when you open the Mission Controller. The auto-pilot can be a little flaky but it will keep you in the air. Like a real auto-pilot it is best to engage it during level and stable flight.


Landing Proceedure
In Fly Tanoa Air you can follow the prescribed approach vector or opt for a completely manual landing. By clearing the approach vector your AWS will be disengaged automatically and you will be prompted "Clear to Land". A manual approach would mean you disable the Current Task Marker "Approach", and choose your own path to landing. In this case be sure to disable AWS manually or it may be a raccous landing.

INSTALLATION
Install the TanoaAir.pbo file to your ArmA III mission directory.


CONTROL DESCRIPTION 

TUNE
Tune your radio to Aeroport de Tanoa for final approach and landing. (WIP airport select)


CAM
Toggle dash cam mode (set mode before flight).


MODE
Toggle the dash cam NV mode


WARN
Enables/disables the AWS. Note: The AWS is automatically enabled the when you take off. You are advised to disengage the AWS during your landing proceedure so it doesn't go off while you're landing.


TIME
Move time forward by increments of 7 hours.


CRUISE
Defines and displays current flight envelope.


FARE
If you're at an airport terminal this button will collect a new passenger. Press this button again when you reach your destination terminal to drop off the passenger. Press the button once again, when prompted, to collect your next passenger.


SCAN
Scan the emergency band for potential emergencies.


LITE
Toggle the cabin light ON/OFF.


CHAD
Chad is kind of a prick but he's a great pilot. Fly with the Chad any time by pressing the dedicated "CHAD" button on the flight controller. To do well you must keep Tanoa 2-6 within a near distance to CHAD's plane, Tanoa 2-2.


ABORT
End the scenario any time.


The DEMO
This is your mission. Do as you please. There are no markers or indicators when the scenario begins so you may choose which activity you want to participate in. To get a passenger just approach any terminal on Tanoa and you will be greeted, "Welcome to airportX". Then shut off the engine, open the menu, and click "FARE".


To begin a cargo delivery mission just approach the Cargo Area at Aeroport de Tanoa and when the box is loaded into your aircraft you'll be prompted with a destination.

Ring challenges are spread out around the archipelago for you to find. When you enter the general area a system prompt will advise "There's a ring course near-by" and display the first ring. Clear the first ring to begin the challenge. To end a ring challenge simply fly out of the area. To restart the challenge enter the area again. This allows you to chain together different ring courses for a truly whiteknuckle spin around the island.
 

If you want to lend a hand, help the coastguard or ATC and be a hero just press the scan button on the mission controller any time you don't already have a passenger or cargo. A dynamically generated mission will begin and you'll be prompted to enter the search area. Find the missing boat or pilot and then leave the area so the rescue operation may begin. Note: There are not always emergencies happening. Sometimes the "SCAN" button may say "No Emergencies available", in which case you will have to wait 1 minute to try again.


Flying with the Chad is pretty self explainatory.


FAQ
Q: What is this?
A: Fly Tanoa Air is a dynamic air mission designed to make learning to fly in ArmA III fun. It uses a GUI Mission Controller to add several new options for in-game pilots.
Q: How do I use it?
A: Just install  the PBO file to your ArmA 3 mission folder and go. If you don't have a PBO file it means you downloaded the Developer version.
Q: Why can't I trigger ring courses and rescue missions?
A: Drop off your passenger or cargo before trying to begin a challenge.
Q: My engine stalls a lot. What's up with that?
A: Tanoa 2-6 has been serving the Tanoa archipelago for more than a decade. The old plane is not what it used to be. Stay within the flight envelope (speed/ALT) and pray for good luck.
Q: In the DEMO you have a female co-pilot and female passengers but in my game it's just generic NPC number 1. Is this false advertising!?
A: I have not been able to get license to include the female assets  to the scenario. A version with the NPC's configured like my DEMO is available but you must have the FEMALE mod assets installed to use it.
Q: Are you the worst script writer ever?
A: Undoubtedly.*
Q: I have a thousand ideas how you can make this better. Where do I send them?
A: Message me on BI ARMA III forums, wogz187. https://forums.bohemia.net/profile/1161172-wogz187/
* But I'm trying.


WIP
All scripts
GUI interface
This document
Ring course 5
Campers/Car emergencies

 

438077-1563907296.png

438077-1563907343.png

438077-1563907397.png

438077-1563907460.png

438077-1563907508.png


Thanks to a script overhaul FTA functions more reliably. Therefor is more fun. Script info soon,

Have fun!

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

Chase Chad!

 

if (isServer) then {playerJET addMagazineTurret ["2000Rnd_65x39_Belt_Tracer_Yellow_Splash", [0], 2000];

playerJET addWeaponTurret ["LMG_M200",[0]];

playerJET setObjectTextureGlobal[0,"#(argb,8,8,3)color(0.518,0.519,0.455,0.2)"];

playerJET setObjectTextureGlobal [1,"#(argb,8,8,3)color(0.518,0.519,0.455,0.2)"];

playerJET setObjectTextureGlobal [2,"#(argb,8,8,3)color(0.518,0.519,0.455,0.2)"]};

 

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

@pierremgi, @GEORGE FLOROS GR, @Grumpy Old Man, @Gunter Severloh, @kremator, @Jnr4817, @JohnKalo, @typhoontiger
The most interesting thing from this latest round of edits is the Topic: Learning to Count, in which I learn how to count-- sort of. This brought the script number for ring courses down from 1 per course to 2 scripts regardless of how many courses there are. This fulfilled the requirement of making it easy to add new courses. It also led to the creation of a VR module which makes it super-easy to add "checkpoint" courses to any map. The module is versatile and can create races or even combat missions (like whack-a-mole).

Otherwise, there are far fewer variables and concurrently running scripts which should improve the reliability of functions and overall performance. This was achieved by creating common variables to share between similar events. So, for example, AP1=1 and AP2=1, used to mean Airport 1 and Airport 2. Now, AP1=1 and AP1=2, means Airport 1 and Airport 2. Another example is the challenges. It used to be that pass=1 meant you have a passenger and cargo=1 meant you have cargo. Now chall=1 means you have a passenger and chall=2 means you have cargo.

Similar to above, there was many events that happened multiple times, like re-assigning your destination, which happened within the function of the associated script. Now, each time one of these events takes place it runs a common script (controlDEST) from the function of the main script.

I plan to remove the mission specific reference "playerJET" from most scripts and replace it with "vehicle player" so the scripts are more universal without a lot of editing.

The new feature "Fly with the Chad", comes from all the time I spent practicing to fly jets and the most fun is staying in close formation with the flight leader. The script just adds a task marker on Chad's plane but the fun element is that Chad will make fun if you lag behind and encourage when you stay near. The lines are dynamic, so he says different lines instead of the same thing each time the event fires. This is a super-simple version of what I have in mind for the radio chatter.

The number one thing I want to say about this mod is that, Fly Tanoa Air is FUN. If you liked PilotWings 64 back in the day, or you've ever just loaded a map with a plane to screw around with, then FTA has what you're looking for.

Mod page, beta version soon.
438077-1564068160.png

 

Have fun!

@pierremgi,
I totally used the olive drab paint scheme from above (without the 20mm). Tanoa 2-6 is supposed to be an aging bush plane so it works great. Thanks again!

  • Like 2
  • Thanks 2

Share this post


Link to post
Share on other sites

This is awesome. Love this mission. Can’t wait for helicopters to get added. And hopefully a winch script lol. Add me on steam when you can! 

  • Like 1

Share this post


Link to post
Share on other sites

This is too cool. When i get a chance, ill take a helo for a spin.

Share this post


Link to post
Share on other sites

Cool updates!

Maybe the airports can be more busy. With service trucks and other planes with passengers moving around! If that does not kill FPS that is.

  • Like 1

Share this post


Link to post
Share on other sites

Were you still considering making this compatible for MP or is that out-of-scope for the project?

  • Like 1

Share this post


Link to post
Share on other sites

@JohnKalo,

Quote

Maybe the airports can be more busy. With service trucks and other planes with passengers moving around! If that does not kill FPS that is.

I would love to detail the airports, add more air-traffic, road traffic, people, hustle and bustle but it would nuke the FPS. My computer is already hot enough to cook breakfast on.
@beno_83au

Quote

Were you still considering making this compatible for MP or is that out-of-scope for the project?

This should be multiplayer. For my part I'm trying to make the scripts more universal so they don't necessarily reference the named editor objects. I don't know about multiplayer, yet-- although it seems like syncing across the server is the most challenging part. In this case we don't want to sync anything except player positions, so I don't know if that will make it easier or not. The beta, which works 100% better than this alpha, will be posted tomorrow.

Not much happening script-wise with the mod this week. I got lucky. Locking the playerJET doors made it impossible for the player to initiate exiting the vehicle. That made my contingencies like cut in half. One contingency for when the aircraft is damaged and the group leader forcibly exits everyone.

This is the camera script that toggles the dash-cam front/back.
cam.sqf

Spoiler



pos1 = camMOUNT modelToWorld [0,0,0];
pos2 = camTARG modelToWorld [0,0,0];

call {
if (speed playerJET==0 && camVIEW==1) exitwith
    {
    cam cameraEffect ["terminate","back"];
    camDestroy cam;
sleep 1;

cam = "Camera" camCreate (camMOUNT modelToWorld [0,0,0]);
cam cameraEffect ["internal","back","rtt"];
"rtt" setPiPEffect [0];
sleep 0.5;
cam camSetDir (pos2 vectorFromTo pos1);
    cam camCommit 0;
[cam, playerJET, true] call BIS_fnc_attachToRelative;
camVIEW=0;
        };

if (speed playerJET==0 && camview==0) exitwith
    {
    cam cameraEffect ["terminate","back"];
    camDestroy cam;
sleep 1;
cam = "Camera" camCreate (camMOUNT modelToWorld [0,0,0]);

    cam cameraEffect ["internal","back","rtt"];

    "rtt" setPiPEffect [0];
sleep 0.5;
cam camSetDir (pos1 vectorFromTo pos2);
    cam camCommit 0;
[cam, playerJET, true] call BIS_fnc_attachToRelative;
camVIEW=1;
        };


hint "Set dash-cam position while parked";
sleep 4;
hint "";
};


 

I had a bunch of issues with my screen-recorder and with the Contact release I wanted to wait before posting the new version. All sorted, mod page tomorrow.

Have fun!

  • Like 2
  • Thanks 1

Share this post


Link to post
Share on other sites
23 hours ago, wogz187 said:

I would love to detail the airports, add more air-traffic, road traffic, people, hustle and bustle

Look at these scripts for civilians:

http://www.armaholic.com/page.php?id=25194

http://www.armaholic.com/page.php?id=23644

http://www.armaholic.com/page.php?id=34532

An interesting feature for all 3 of those scripts which is ideal for anyone with a low end computer is that, the

AI spawn and despawn based on destination, location, and how close you are to them, considering most of your time would be spent flying,

some brief time around the airport couldn't cause to much interference with performance, just set the density in the script, would be worth testing at

least or make a version for those who would want civilians roaming about and a version without.

 

Another idea aside the civilians is you use this

https://forums.bohemia.net/forums/topic/212755-zei-zeus-and-eden-interiors/

to add more furniture, and other objects in surrounding buildings, even outside, ambience, and immersion

i think would make the mission more interesting aside the flying.

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

@Gunter Severloh,

Quote

"... would be worth testing at least or make a version for those who would want civilians roaming about and a version without."

Yes. Absolutely.
 

Quote

"... which is ideal for anyone with a low end computer..."

Arma 3 is an interesting case. A game from 2013 that can still challenge modern systems with the settings turned up. I play FTA (any flight mission really) with the view distance all the way up (like 12000) but objects at 50% (around 3000 I think) and this computer (which is definitely not low end but is definitely a laptop) is literally 90 c. It's summer so unless I stick the air-conditioner right up the computer's butt, it's gonna be hot.

I guess what I'm driving at is: rendering the civilians and stuff probably isn't the issue. I don't think the GPU is the bottleneck. I think it's the CPU and I don't want to burden it any further.

You want to know what really grinds my gears? The shader error in the cockpit of the plane! When viewing terrain through the cockpit window at a certain angle (pretty much any angle at altitude), makes the edge of the landscape geometry "shimmer". This doesn't happen in other aircraft that I've noticed so it's just the civilian plane. Ever seen that? Any ideas?

I'm going to implement your AI population script but I've already got the BETA packaged and I'm setting up the page right now (link soon), so it'll be for the next release once I have a chance to play with it.

Also, @typhoontiger, has some interesting things brewing for the next release.

Thanks for all your help, bro!

  • Like 1

Share this post


Link to post
Share on other sites

It's possible for the car to get stuck. The AI drives pretty well most of the time but in my play-testing I've found him off track, stuck, a couple times. I wrote,
carDEF.sqf,

if (speed suspCAR < 20) then {

sleep 20;

    If (speed suspCAR < 20) exitWith {

hint "The car escaped";

radioTower sidechat "Looks like this one got away, 2-6.";

endZscene= []execVM "searchCAR.sqf";
    };

};

which probably does nothing but it's supposed to reset the car to default position if it isn't going +20 km/h for 20 seconds. What's a good way to determine if the car is stuck for any length of time? Once stuck the car never successfully recovers.

Also, using Sil's Weather system is great and I would like to program a severe weather warning. It doesn't have to be real-time weather update or anything. A threshold for "severe storm". I think that will look something like,

_cloudLevel = overcast;
if (_cloudLevel>0.7) exitWIth {
hint "Severe Weather Warning";
	}; 

any suggestions?

  • Like 2

Share this post


Link to post
Share on other sites

A summary of new and updated scripts:

WEAT
The weather button advises current conditions: "Clear skies", "Weather Watch in Effect", "Severe Weather Warning".
stormWARN.sqf

Spoiler

_weatherWARN= overcast;
    if (_weatherWarn > 0.7) exitWith {
    hint "Severe Weather Warning";
	};

 


Mobile
Your Mobile phone has many uses. Mount it on the cockpit window for an impromptu GPS system or switch on the camera for that selfie-style live-stream. Otherwise pay attention because you might receive an important call. (WIP coming soon)

hideGPS.sqf

Spoiler

call {

if (tGPS==0) exitWith {

phoneMODE= player addAction ["Phone Mode", "phoneFUNC.sqf"];
playTAB hideObject false;
tGPS=1;

    };

if (tGPS==1) exitWith {

player removeAction phoneMODE;
playTAB hideObject true;
playTAB SetObjectTexture [0,"jetSplash.jpg"];
tGPS=0;
    };
};

 


phoneFUNC.sqf

Spoiler

pos2 = camTARG modelToWorld [0,0,0];
pos5 = camMOUNT3 modelToWorld [0,0,0];

call {

if (sGPS==1 && camSELF==0) exitWith {

sleep 0.2;

camS = "Camera" camCreate (camMOUNT3 modelToWorld [0,0,0]);
camS cameraEffect ["internal","back","rtt1"];
"rtt1" setPiPEffect [0];
sleep 0.5;

camS camSetDir (pos5 vectorFromTo pos2);
    camS camCommit 0;
sleep 0.2;
camS setVectorUp [1,0,0];
camS camSetFov 1.1;
    camS camCommit 0;
[camS, playerJET, true] call BIS_fnc_attachToRelative;

playTAB SetObjectTexture [0,"#(argb,512,512,1)r2t(rtt1,1.0)"];
sGPS=0;
camSELF=1;
    };

if (sGPS==0 && camSELF==1) exitWith {

sGPS=1;

    };

if (sGPS==1 && camSELF==1) exitWith {

playTAB SetObjectTexture [0,"#(argb,512,512,1)r2t(rtt1,1.0)"];
sGPS=0;

    };
playTAB SetObjectTexture [0,"jetSplash.jpg"];
sGPS=0;
};

 


3rd Person with no cabin light. If you switch to 3rd with the cabin light turned on, it turns off and will not turn on again unless initiated in 1st person.
init.sqf

while {true} do {if(plight==1 && cameraView == "External") then {deletevehicle cpLight; pLight=0;};sleep 0.5;};


New camera modes: Wing-tip and cabin-view-- and better script. The cameras are created in the init and persist individually instead of creating each time. The script changes feeds.

init.sqf

Spoiler

pos3 = camMOUNT2 modelToWorld [0,0,0];
pos4 = camTARG2 modelToWorld [0,0,0];
cam = "Camera" camCreate (camMOUNT2 modelToWorld [0,0,0]);
cam cameraEffect ["internal","back","rtt"];
"rtt" setPiPEffect [0];
sleep 0.5;
cam camSetDir (pos3 vectorFromTo pos4);
    cam camCommit 0;
[cam, playerJET, true] call BIS_fnc_attachToRelative;
camVIEW=0;


pos1 = camMOUNT modelToWorld [0,0,0];
pos2 = camTARG modelToWorld [0,0,0];
cam2 = "Camera" camCreate (camMOUNT modelToWorld [0,0,0]);
cam2 cameraEffect ["internal","back","rtt2"];
"rtt2" setPiPEffect [0];
sleep 0.5;
cam2 camSetDir (pos2 vectorFromTo pos1);
    cam2 camCommit 0;
[cam2, playerJET, true] call BIS_fnc_attachToRelative;

 



cam.sqf

Spoiler

call {
if (camVIEW==1) exitwith
    {
ctrlSetText [1200, "#(argb,512,512,1)r2t(rtt,1.0)"];
camVIEW=0;
        };
if (camview==0) exitwith
    {
ctrlSetText [1200, "#(argb,512,512,1)r2t(rtt2,1.0)"];
camVIEW=1;
        };
ctrlSetText [1200, "jetsplash.jpg"];
camVIEW=0;
};

 

 


Have fun!

  • Like 3

Share this post


Link to post
Share on other sites

I always make a few mistakes in a new version. This time it turned into a good learning experience and a minor PSA.

Objects attached to vehicles, especially airborne vehicles, cause issues with AI. I posted this the other day,

and called it case closed. I was wrong.

At least with air vehicles. The problems it causes are somewhat inexplicable and not exactly consistent. If you want to see an example, load up the current version of FTA and watch the Chad Cam. He's all over the place but kinda still following his assigned flight plan with wild variations in altitude. If the challenge is to follow Chad, have fun and good luck.

Totally fixed now. Chad follows a laser straight path that is fun to tag along. Actually, it's way over fixed now. Chad has multiple flight paths using a variation of the ring clear script.

chadPATH.sqf
 

Spoiler

call {
    if (chadID==1) exitWith
    {
        pathID = pathID + 1;
    currentPATH = [objNULL, chad1_1, chad1_2, chad1_3, chad1_4, chad1_5, chad1_6] select pathID;

    chadDEST setpos (getpos currentPATH);
    chadWP = chadgroup addWaypoint [(getPos currentPATH), 0];
    chadWP setWaypointType "move";
    chadPLANE flyinHeight 20;
    chadPLANE flyinHeightASL [180,180,180]; 
    chadPLANE limitspeed 320;
        if (pathID == 6) then {
        pathID = 0;
        };
};
    if (chadID==2) exitWith
    {
        pathID = pathID + 1;
    currentPATH = [objNULL, chad2_1, chad2_2, chad2_3, chad2_4, chad2_5, chad2_6] select pathID;


    chadDEST setpos (getpos currentPATH);
    chadWP = chadgroup addWaypoint [(getPos currentPATH), 0];
    chadWP setWaypointType "move";
    chadPLANE flyinHeight 20;
    chadPLANE flyinHeightASL [180,180,180]; 
    chadPLANE limitspeed 320;
        if (pathID == 6) then {
        pathID = 0;
        };
    };

};

 


Also fixed a missing script during the stolen car scenario.

Updated file soon. (I'm gonna double-check for bugs tonight),

Have fun!

  • Like 2

Share this post


Link to post
Share on other sites

Not much has happened in the last week script-wise with FTA but I thought you guys might get a kick out of this,

chats.sqf
 

Spoiler

ucall= [1,2,3] call BIS_fnc_selectRandom;

call {

if (uCALL==1) exitWith {

unknownCALL= ["I saw a plane and thought of you. Call me.", "Are you ever gonna call me back?",
"What's up, hun? Call me.", "Who is Sasha and why did she like your picture?",
"Jeez! Why don't you ever text back?","What's your problem even?",
"Just so you know, we need to talk."] call BIS_fnc_selectRandom;

    actorFEM setgroupID ["Unknown"];
sleep 0.5;
    playsound ["Orange_PhoneCall_Ringtone", true];
    playTAB SetObjectTexture [0,"gpsMAPS\unkHead.jpg"];
    actorFEM sidechat format ["%1", unknownCALL];
    sleep 4;
    player sidechat "Who is this?";

uCALL=0;

    };

if (uCALL==2) exitWith {

momCALL= ["Hi, honey. I hope you're having a good day.", "Did you remember to take your vitamins?",
"How was your date last night? Did it go well?",
"The computer screen is stuck again. Will you come help when you're all finished flying?",
"Is everything okay, honey?", "Love you. Be safe."] call BIS_fnc_selectRandom;

    actorFEM setgroupID ["Mom"];
sleep 0.5;
    playsound ["Orange_PhoneCall_Ringtone", true];
    playTAB SetObjectTexture [0,"gpsMAPS\momHead.jpg"];
    actorFEM sidechat format ["%1", momCALL];
    sleep 4;
    player sidechat "Yes, mom.";

uCALL=0;

    };

if (uCALL==3) exitWith {

gomCALL= ["The moon landing is fake!", "Reptiles rule the world!", "Aliens are colonizing Uranus!",
"I saw a U.F.O. last night!", "Chem-trails turned my best frog gay!",
"Is this thing on?"] call BIS_fnc_selectRandom;

sleep 0.5;
    playsound ["Orange_PhoneCall_Ringtone", true];
    playTAB SetObjectTexture [0,"gpsMAPS\gomHEAD.jpg"];
    GOM sidechat format ["%1", gomCALL];
    sleep 4;
    player sidechat "Yes, sir.";

uCALL=0;

    };

};

Have fun!
        

      

 

 

        

  • Like 2

Share this post


Link to post
Share on other sites

Wow! It takes a lot to switch vehicles in FTA!

Added an action at the very start to switch to helicopter. The switch is permanent, so decide at the beginning what kind of flight it will be,


heloINIT.sqf

 

Spoiler

0 fadeSound 0;
titleCut ["", "BLACK FADED", 999];

heloTAB hideObject false;

deleteVehicle approachAP1; 
deleteVehicle approachAP2;
deleteVehicle approachAP3;
deleteVehicle approachAP4;
deleteVehicle approachAP5;
deleteVehicle approachBM1;
deleteVehicle approachBM2;
deleteVehicle approachBM3;
deleteVehicle bushFARMap1;
deleteVehicle approachBMplaya;

sleep 0.5;
titleText ["Switching Vehicles...", "BLACK FADED", 0.4];

approachAP1=approachAP1_1;
approachAP2=approachAP2_1;
approachAP3=approachAP3_1;
approachAP4=approachAP4_1;
approachAP5=approachAP5_1;
approachBM1=approachBM1_1;
approachBM2=approachBM2_1;
approachBM3=approachBM3_1;
bushFARMap1=bushFARMap1_1;
approachBMplaya=approachBMplaya_1;

    player removeAction chooseVEH;
    moveOut playerJETd;
    unassignvehicle playerJETd;
    moveOut player;
    unassignvehicle player;


    DeleteVehicle playerJET;
    DeleteVehicle PlayTab;

    moveOut chadPLANEd;
    unassignvehicle chadPLANEd;
    chadPLANEd setPos (getpos objNULL);

    detach chadTRIG;
    DeleteVehicle chadPlane;

sleep 0.5;

    playerJET=playHELO;
    playTab=heloTAB;

    chadPLANE=chadChopper;

    playTAB disableCollisionWith playerJET;

    playTAB attachTo [playerJET, [0.31,2.7,1.09], "vez"];

    playTAB setVectorDirAndUp [[1,0,0],[0,-1,0]];


    camDestroy cam;
cam cameraEffect ["terminate","back"];
    camDestroy camS;
camS cameraEffect ["terminate","back"];
    camDestroy cam2;
cam2 cameraEffect ["terminate","back"];

    camDestroy camC;
camC cameraEffect ["terminate","back"];

sleep 0.5;

pos1 = camMOUNTH modelToWorld [0,0,0];
pos2 = camTARGH modelToWorld [0,0,0];
pos3 = camMOUNTH2 modelToWorld [0,0,0];
pos4 = camTARGH2 modelToWorld [0,0,0];
pos5 = camMOUNTH3 modelToWorld [0,0,0];

cam = "Camera" camCreate (camMOUNTH2 modelToWorld [0,0,0]);
cam cameraEffect ["internal","back","rtt"];
"rtt" setPiPEffect [0];
sleep 0.5;
cam camSetDir (pos3 vectorFromTo pos4);
    cam camCommit 0;
[cam, playerJET, true] call BIS_fnc_attachToRelative;
camVIEW=0;

camS = "Camera" camCreate (camMOUNTH3 modelToWorld [0,0,0]);
camS cameraEffect ["internal","back","rtt1"];
"rtt1" setPiPEffect [0];
sleep 0.5;
camS camSetDir (pos5 vectorFromTo pos2);
    camS camCommit 0;
sleep 0.2;
camS setVectorUp [1,0,0];
camS camSetFov 1.1;
    camS camCommit 0;
[camS, playerJET, true] call BIS_fnc_attachToRelative;

cam2 = "Camera" camCreate (camMOUNTH modelToWorld [0,0,0]);
cam2 cameraEffect ["internal","back","rtt2"];
"rtt2" setPiPEffect [0];
sleep 0.5;
cam2 camSetDir (pos2 vectorFromTo pos1);
    cam2 camCommit 0;
[cam2, playerJET, true] call BIS_fnc_attachToRelative;

pos6 = camTARGc_1 modelToWorld [0,0,0];
pos7 = camMOUNTc_1 modelToWorld [0,0,0];
camC = "Camera" camCreate (camMOUNTc_1 modelToWorld [0,0,0]);
camC cameraEffect ["internal","back","rttc"];
"rttc" setPiPEffect [0];
sleep 0.5;
camC camSetDir (pos7 vectorFromTo pos6);
camC camSetFov 1.5;
    camC camCommit 0;
[camC, chadPLANE, true] call BIS_fnc_attachToRelative;
deleteVehicle camMOUNTc_1;
deleteVehicle camTARGc_1;

sleep 0.5;

playerJETd moveInDriver playerJET;
playerJETd assignAsDriver playerJET;
player moveInTurret [playerJET, [0]];
player action ["takeVehicleControl", playerJET];
playerJET setfuel 100;


chadPLANE hideobject false;
chadPLANEd moveInDriver chadPLANE;
chadPLANE enableSimulation true;
chadPLANEd enableSimulation true;
chadTrig setpos (getpos ChadPlane);
sleep 0.2;
[chadTRIG, chadPLANE, true] call BIS_fnc_attachToRelative;

    chadgroup = group chadPLANEd;
    chadgroup setGroupId ["Chad"];
    deleteWaypoint [chadgroup, 0];
execVM "chad\chadPATH.sqf";


commVEH=1;

5 fadeSound 1;

sleep 3;

titleCut ["", "BLACK IN", 5];

 


Phew!

Have fun!

  • Like 3

Share this post


Link to post
Share on other sites

@Smart Games, was kind enough to design a money script for the next version of FTA. Thanks, Smart!

Check it out,

initPlayerLocal.sqf

[] execvm "function.sqf";
player setvariable ["money",0]; 

function.sqf

fnc_moneyplus =
{
    _money = player getvariable "money";
    player setvariable ["money",_money + 100];
};

fnc_moneyminus =
{
    _money = player getvariable "money";
    player setvariable ["money",_money - 100];
};

call plus (in trigger or whatever)

[] call fnc_moneyplus;
hint "You got 100!";

call minus

[] call fnc_moneyminus;
hint "You lost 100!";

call balance

balance = player getvariable "money"; 
hint format ["balance %1", balance];



Thanks again, bro!

  • Like 3

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×