OFPEC Forum
Editors Depot - Mission Editing and Scripting => Arma2 - Editing/Scripting General => Topic started by: weamdreaver on 08 Jun 2009, 13:45:19
-
Does anyone know how to get the skeet-machine to shoot the skeets?
I've found some scripts. But I cant get the machine to work.
I have tried it with the simple command in the init of a skeet-machine:
this exec "launch_skeet.sqf"
or
this exec "skeet_program.sqf"
But with no success.
The scripts can be found here:
Arma2/Addons/missions.pbo/armory/Data/Scripts/Tryout/prichals/skeetShooting
launch_skeet.sqf
/*
File: launch_skeet.sqf
Author: Joris-Jan van 't Land / Pepa Zemánek
Description:
Launches a single skeet.
Parameter(s):
_this select 0: skeet machine (Object).
Returns:
Success flag (Boolean).
*/
private ["_machine"];
_machine = _this select 0;
if (!(isnil "_machine")) then
{
LIB_skeetFired = LIB_skeetFired + 1;
_machine say "LaunchSkeet";
private ["_disc", "_discPos"];
_discPos = [_machine, 0.6, 180] call BIS_fnc_relPos;
_disc = "SkeetDisk" createVehicle [(_discPos select 0), (_discPos select 1), 0.7];
_disc setPos [(_discPos select 0), (_discPos select 1), 0.7];
LIB_dynObjs = LIB_dynObjs + [_disc];
LIB_chalObjs = LIB_chalObjs + [_disc];
private ["_vel", "_ehCode"];
_vel = [[0, -1, 0], (direction _machine)] call BIS_fnc_rotateVector2D;
_disc setVelocity [(-(_vel select 0) * 9), ((_vel select 1) * 9), 10 + (random 2)];
_ehCode =
{
private ["_disc"];
_disc = _this select 0;
//Only score a hit while the skeet is airborne.
if (((position _disc) select 0) > 0.1) then
{
LIB_skeetHit = LIB_skeetHit + 1;
if ((_disc distance player) > 100) then
{
LIB_skeetScore = LIB_skeetScore + 3;
}
else
{
LIB_skeetScore = LIB_skeetScore + 2;
};
};
LIB_dynObjs = LIB_dynObjs - [_disc];
LIB_chalObjs = LIB_chalObjs - [_disc];
deleteVehicle _disc;
};
_disc addEventHandler ["killed", _ehCode];
sleep 1;
//Make sure the skeet flies a bit longer than normal physics would cause.
_vel = velocity _disc;
private ["_i"];
_i = 0;
while {(((position _disc) select 2) > 0.1) && (alive _disc)} do
{
_disc setVelocity [(_vel select 0) / (1 + (_i / 10)), (_vel select 1) / (1 + (_i / 10)), (_vel select 2) / (1 + _i)];
_i = _i + 0.1;
sleep 0.1;
};
LIB_skeetLanded = LIB_skeetLanded + 1;
};
true
skeet_program.sqf
/*
File: skeet_program.sqf
Author: Joris-Jan van 't Land
Description:
The skeet launcher program.
Parameter(s):
_this select 0: skeet machines (Array of Objects).
Returns:
Success flag (Boolean).
*/
scopeName "root";
private ["_machines"];
_machines = _this select 0;
while {(LIB_skeetFired < 20) && LIB_skeetProgram} do
{
private ["_available", "_launched"];
_available = +_machines;
_launched = 0;
for "_i" from 0 to ((count _machines) - 1) do
{
if (((_launched == 0) || ((random 1) > 0.7)) && (LIB_skeetFired < 20)) then
{
private ["_machine"];
_machine = _available call BIS_fnc_selectRandom;
private ["_handle"];
_handle = [_machine] execVM "ca\missions\armory\data\scripts\tryout\pricha ls\s keetShooting\launch_skeet.sqf";
_available = _available - [_machine];
_launched = _launched + 1;
};
};
[10 + (random 5), 0, true] call LIB_safeDelayFunction;
};
LIB_skeetProgram = false;
true
-
Not alot of people have had a chance to play with this yet. So it might be beneficial to provide a small sample mission that we can look at and help you out.
-
Ok, here is my shooting range I am testing with.
Unfortunately the only missions in ARMA2 with the skeet-machine in are the ones in the armory imho. But I can not find any *.sqm in the armory. So I cant compare how the skeet-machine has to be build into the mission.
Edit:
Sorry, there was an error in my first uploaded test1.Chernarus. I corrected that with test2.Chernarus
-
Actually the first mission in the campaign has it, when your on the aircraft carrier.
I don't see how you're executing/starting the skeet machine??
-
Well, that is my problem too. I dont know how to start the machine.
this exec "launch_skeet.sqf" does not work.
Oh, ok. I havent started the campaign yet.
I will try to look into the mission.
Edit:
When try to open FirstToFight (is that the mission you are referring to?) in the editor it crashes. :confused:
Edit2:
Ok, I think that skeet_program.sqf is the main script that controls the launch_skeet.sqf. I corrected the path in the skeet_program.sqf.
original
_handle = [_machine] execVM "ca\missions\armory\data\scripts\tryout\pricha ls\s keetShooting\launch_skeet.sqf";
now
_handle = [_machine] execVM "launch_skeet.sqf";
But it still shoots no skeets. :confused:
Edit3:
I have found another script that has something to do with the skeet shooting.
I tried it, but with no luck again. With this script Arma2 crashes during the loading of the mission or after a few seconds into the mission.
skeeShooting.sqf
/*
File: skeetShooting.sqf
Author: Joris-Jan van 't Land
Description:
Clear the skeet shooting range.
Parameter(s):
_this select 0: side ID.
_this select 1: type ID.
_this select 2: config entry.
*/
scopeName "root";
disableSerialization;
private ["_sid", "_tid", "_entry"];
_sid = _this select 0;
_tid = _this select 1;
_entry = _this select 2;
LIB_chalChoice = -1;
LIB_pChalInit = true;
//Incoming challenge texts.
private ["_handle"];
_handle = - execVM (LIB_path + "incomingChallenge.sqf");
waitUntil {scriptDone _handle};
if (!LIB_tryout || LIB_goingBack) then {breakOut "root"};
//Show primary challenge acceptance dialog.
_dlg = createDialog "RscLibrary_Challenge";
waitUntil {dialog};
private ["_dialog", "_title", "_description", "_image", "_cTitle"];
_dialog = findDisplay 10002;
_title = _dialog displayCtrl 20001;
_description = _dialog displayCtrl 20002;
_image = _dialog displayCtrl 20005;
_cTitle = localize "STR_LIB_CHAL_SKEET_SHOOT";
_title ctrlSetText _cTitle;
_description ctrlSetStructuredText (parseText ((localize "STR_LIB_CHAL_SKEET_SHOOT_BRIEFING") + "<br /><br />" + (localize "STR_LIB_CHAL_ACCEPT")));
_image ctrlSetText "challenge_skeet_shooting_co.paa";
//Wait for choice or end of LIB_Tryout or close dialog.
waitUntil
{
!dialog
||
!LIB_Tryout
||
LIB_chalChoice != -1
};
if (!dialog || !LIB_Tryout) then
{
//Decline - end challenge.
closeDialog 100002;
LIB_pChalInit = false;
LIB_pChal = -1;
}
else
{
closeDialog 100002;
if (LIB_chalChoice == 1) then
{
//Decline - end challenge.
LIB_pChalInit = false;
LIB_pChal = -1;
}
else
{
LIB_chalObjs = [];
LIB_chalMrk = [];
LIB_chalGrp = [];
//Accept - fade out and in, build challenge.
titleCut ["", "BLACK OUT", 1];
[1, 0, true] call LIB_safeDelayFunction;
startLoadingScreen [localize "STR_LIB_LOADING_ENTRY", "RscLibrary_Load"];
private ["_waterMode"];
_waterMode = [_tid] call LIB_waterModeFunction;
private ["_pos"];
_pos = [[], 0, -1, 30, _waterMode, 20 * (pi / 180), 0, LIB_blackList] call BIS_fnc_findSafePos;
[_sid, _tid, _entry, _pos, "fixed"] call LIB_respawnFunction;
(vehicle player) setDir 0;
//Create firing zone.
private ["_handle"];
if (_tid in [6, 7, 8, 11]) then
{
_handle = [_pos, _entry, _sid, _tid, 0] execVM (LIB_path + "tryout\prichals\skeetShooting\spawnSmallArms.sqf");
}
else
{
_handle = [_pos, _entry, _sid, _tid, 0] execVM (LIB_path + "tryout\prichals\skeetShooting\spawnHeavyArms.sqf");
};
//Create skeet machines (3 positions).
private ["_pos1", "_pos2", "_pos3"];
_pos1 = [(_pos select 0) - 20, (_pos select 1) + 10, 0];
_pos2 = [_pos select 0, (_pos select 1) + 10, 0];
_pos3 = [(_pos select 0) + 20, (_pos select 1) + 10, 0];
//Add concrete blocks under the machines when in water.
if (_tid == 5) then
{
_pos1 = [_pos1 select 0, (_pos1 select 1) + 5, -1.5];
_pos2 = [_pos2 select 0, (_pos2 select 1) + 5, -1.5];
_pos3 = [_pos3 select 0, (_pos3 select 1) + 5, -1.5];
private ["_block1", "_block2", "_block3"];
_block1 = "Land_ConcreteBlock" createVehicle _pos1;
_block2 = "Land_ConcreteBlock" createVehicle _pos2;
_block3 = "Land_ConcreteBlock" createVehicle _pos3;
LIB_dynObjs = LIB_dynObjs + [_block1, _block2, _block3];
LIB_chalObjs = LIB_chalObjs + [_block1, _block2, _block3];
_block1 setPos _pos1;
_block2 setPos _pos2;
_block3 setPos _pos3;
_pos1 = [_pos1 select 0, _pos1 select 1, 0.6];
_pos2 = [_pos2 select 0, _pos2 select 1, 0.6];
_pos3 = [_pos3 select 0, _pos3 select 1, 0.6];
};
private ["_machine1", "_machine2", "_machine3"];
_machine1 = "SkeetMachine" createVehicle _pos1;
_machine2 = "SkeetMachine" createVehicle _pos2;
_machine3 = "SkeetMachine" createVehicle _pos3;
LIB_dynObjs = LIB_dynObjs + [_machine1, _machine2, _machine3];
LIB_chalObjs = LIB_chalObjs + [_machine1, _machine2, _machine3];
_machine1 setPos _pos1;
_machine2 setPos _pos2;
_machine3 setPos _pos3;
_machine1 setDir (180 + 45);
_machine2 setDir 180;
_machine3 setDir (180 - 45);
//Detect player death.
private ["_player"];
_player = player;
//Player waypoint.
private ["_wp1"];
_wp1 = (group player) addWaypoint [_pos, 0];
_wp1 setWaypointType "HOLD";
_wp1 setWaypointDescription (localize "STR_LIB_CHAL_SKEET_SHOOT_TASK_SHORT");
//Player task.
private ["_task", "_descShort"];
_descShort = localize "STR_LIB_CHAL_SKEET_SHOOT_TASK_SHORT";
_task = player createSimpleTask [_cTitle];
_task setSimpleTaskDescription [localize "STR_LIB_CHAL_SKEET_SHOOT_TASK_DESC", _descShort, _descShort];
player setCurrentTask _task;
player createDiaryRecord ["diary", [_cTitle, localize "STR_LIB_CHAL_SKEET_SHOOT_BRIEFING"]];
["random", "daynight", "any"] call LIB_weatherTodFunction;
//Eventhandler for accuracy.
LIB_shotsFired = 0;
(vehicle player) addEventHandler ["Fired", {LIB_shotsFired = LIB_shotsFired + (_this call LIB_shotsFiredFunction)}];
//Main marker.
private ["_marker"];
_marker = createMarker ["LIB_marker_skeetShooting1", _pos];
_marker setMarkerType "hd_flag";
_marker setMarkerColor "ColorBlack";
_marker setMarkerText _cTitle;
LIB_dynMrk = LIB_dynMrk + [_marker];
LIB_chalMrk = LIB_chalMrk + [_marker];
endLoadingScreen;
titleCut ["", "BLACK IN", 1];
[1, 0, true] call LIB_safeDelayFunction;
LIB_pChalInit = false;
LIB_skeetHit = 0;
LIB_skeetFired = 0;
LIB_skeetLanded = 0;
LIB_skeetScore = 0;
LIB_skeetProgram = true;
private ["_endCause", "_timer", "_leftZoneTooLong", "_timeLeftZone", "_timesLeftZone"];
_endCause = -1;
_timer = 0;
_leftZoneTooLong = false;
_timeLeftZone = 0;
_timesLeftZone = 0;
//How many skeets may be missed?
private ["_maxMiss"];
if (cadetMode) then {_maxMiss = 12} else {_maxMiss = 8};
private ["_hintHeader"];
_hintHeader = parseText ("<t size='1.2' color='#ffff7700'>" + _cTitle + "</t><br /><br />");
while {true} do
{
if (!LIB_tryout) exitWith
{
_endCause = 0;
};
if (LIB_abortChallenges) exitWith
{
_endCause = 5;
};
if (_player != player) exitWith
{
_endCause = 1;
};
if (_timer == 4) then
{
//Start launching skeets.
_handle = [[_machine1, _machine2, _machine3]] execVM "skeet_program.sqf";
};
if (({(damage _x) > 0} count [_machine1, _machine2, _machine3]) > 0) exitWith {_endCause = 6};
private ["_hintBody"];
_hintBody = format [(localize "STR_LIB_CHAL_FIRING_RANGE_SHOTS_FIRED") + " " + "%1" + "<br />", LIB_shotsFired];
_hintBody = _hintBody + (format [(localize "STR_LIB_CHAL_SKEET_SHOOT_HIT") + "<br />", LIB_skeetHit, LIB_skeetFired]);
private ["_acc"];
_acc = 0;
if (LIB_skeetHit > 0) then
{
_acc = round ((LIB_skeetHit / LIB_shotsFired) * 100);
};
_hintBody = _hintBody + (format [(localize "STR_LIB_CHAL_FIRING_RANGE_ACCURACY") + " " + "%1%2", _acc, "%"]);
//Detect exit firing zone.
//Give warning first.
if (!((vehicle _player) in (list LIB_firingZoneTrigger))) then
{
if (_timeLeftZone < 10) then
{
if (_timeLeftZone == 0) then {_timesLeftZone = _timesLeftZone + 1};
_timeLeftZone = _timeLeftZone + 1;
_hintBody = _hintBody + "<br /><br />" + (localize "STR_LIB_CHAL_FIRING_RANGE_LEFT_AREA") + "<br />" + (localize "STR_LIB_CHAL_FIRING_RANGE_GET_BACK");
_hintBody = _hintBody + "<br />";
}
else
{
_leftZoneTooLong = true;
};
}
else
{
_timeLeftZone = 0;
};
if (_timesLeftZone > 1) then {_leftZoneTooLong = true};
//Abort because of exiting too often or too long.
if (_leftZoneTooLong) exitWith
{
_endCause = 3;
};
LIB_pChalHint = composeText [_hintHeader, parseText _hintBody];
call LIB_challengeHintFunction;
//All skeets launched.
if (!LIB_skeetProgram) exitWith
{
_endCause = 2;
};
//Missed too many skeets.
if ((LIB_skeetLanded - LIB_skeetHit) > _maxMiss) exitWith
{
_endCause = 4;
};
_timer = _timer + 1;
sleep 1;
};
switch (_endCause) do
{
//Died.
case 1:
{
_task setTaskState "FAILED";
_hintBody = parseText ((localize "STR_LIB_CHAL_DIED") + "<br /><br /><t color='#ffff0000'>" + (localize "STR_LIB_CHAL_FAILED") + "</t>");
LIB_pChalHint = composeText [_hintHeader, _hintBody];
call LIB_challengeHintFunction;
- call LIB_challengeMusicFunction;
LIB_pChalInit = true;
};
//Finished.
case 2:
{
_task setTaskState "SUCCEEDED";
_hintBody = (format [(localize "STR_LIB_CHAL_FIRING_RANGE_SHOTS_FIRED") + " " + "%1" + "<br />", LIB_shotsFired]);
private ["_ptMsg"];
_ptMsg = "";
if (LIB_skeetHit > 0) then
{
_ptMsg = " (<t color='#ff0000ff'>+%3</t>)";
};
_hintBody = _hintBody + (format [(localize "STR_LIB_CHAL_SKEET_SHOOT_HIT") + _ptMsg + "<br />", LIB_skeetHit, LIB_skeetFired, LIB_skeetScore]);
private ["_accScore"];
_accScore = 0;
private ["_acc", "_accMsg"];
_acc = 0;
if (LIB_skeetHit > 0) then
{
_acc = round ((LIB_skeetHit / LIB_shotsFired) * 100);
};
_accMsg = "";
if (_acc >= 85) then
{
_accScore = 15;
_accMsg = " (<t color='#ff0000ff'>+10</t>)";
};
_hintBody = _hintBody + (format [(localize "STR_LIB_CHAL_FIRING_RANGE_ACCURACY") + " " + "%1%2" + _accMsg + "<br />", _acc, "%"]);
private ["_nightScore"];
_nightScore = 0;
if (call LIB_isNightFunction) then
{
_hintBody = _hintBody + ("<br />" + (localize "STR_LIB_CHAL_NIGHT_BONUS") + "<br />");
_nightScore = 10;
};
_hintBody = _hintBody + "<br />";
_hintBody = _hintBody + ("<t color='#ff00ff00'>" + (localize "STR_LIB_CHAL_COMPLETED") + "</t>");
LIB_pChalHint = composeText [_hintHeader, parseText _hintBody];
call LIB_challengeHintFunction;
[1] call LIB_challengeMusicFunction;
LIB_pChalInit = true;
[5, 0, false] call LIB_safeDelayFunction;
private ["_points"];
_points = LIB_skeetScore + _nightScore + _accScore + 10;
[_points] call LIB_addPointsFunction;
};
//Left area.
case 3:
{
_task setTaskState "FAILED";
_hintBody = parseText ((localize "STR_LIB_CHAL_FIRING_RANGE_LEFT_AREA") + "<br /><br /><t color='#ffff0000'>" + (localize "STR_LIB_CHAL_FAILED") + "</t>");
LIB_pChalHint = composeText [_hintHeader, _hintBody];
call LIB_challengeHintFunction;
- call LIB_challengeMusicFunction;
LIB_pChalInit = true;
};
//Too many missed.
case 4:
{
_task setTaskState "FAILED";
_hintBody = parseText ((localize "STR_LIB_CHAL_SKEET_SHOOT_MANY_MISSED") + "<br /><br /><t color='#ffff0000'>" + (localize "STR_LIB_CHAL_FAILED") + "</t>");
LIB_pChalHint = composeText [_hintHeader, _hintBody];
call LIB_challengeHintFunction;
- call LIB_challengeMusicFunction;
LIB_pChalInit = true;
};
//Aborted.
case 5:
{
_task setTaskState "FAILED";
_hintBody = parseText ((localize "STR_LIB_CHAL_ABORTED") + "<br /><br /><t color='#ffff0000'>" + (localize "STR_LIB_CHAL_FAILED") + "</t>");
LIB_pChalHint = composeText [_hintHeader, _hintBody];
call LIB_challengeHintFunction;
- call LIB_challengeMusicFunction;
LIB_pChalInit = true;
};
//Damaged skeet machines.
case 6:
{
_task setTaskState "FAILED";
_hintBody = parseText ((localize "STR_LIB_CHAL_SKEET_SHOOT_MACHINES") + "<br /><br /><t color='#ffff0000'>" + (localize "STR_LIB_CHAL_FAILED") + "</t>");
LIB_pChalHint = composeText [_hintHeader, _hintBody];
call LIB_challengeHintFunction;
- call LIB_challengeMusicFunction;
LIB_pChalInit = true;
};
default {};
};
//Try to make sure the player isn't killed after the challenge ended.
if (alive _player) then {_player setCaptive true};
LIB_skeetProgram = false;
[3, 0, true] call LIB_safeDelayFunction;
if (LIB_tryout) then
{
LIB_pChalHint = "";
call LIB_challengeHintFunction;
if ((_endCause != 1) && !LIB_respawning) then
{
titleCut ["", "BLACK OUT", 1];
[1, 0, true] call LIB_safeDelayFunction;
(vehicle player) removeAllEventHandlers "Fired";
};
call LIB_cleanChallengeFunction;
LIB_pChalInit = false;
LIB_chalFinish = time;
LIB_pChal = -1;
//Respawn unless the player died during the challenge.
if ((_endCause != 1) && !LIB_respawning) then
{
[_sid, _tid, _entry, [], "random"] call LIB_respawnFunction;
titleCut ["", "BLACK IN", 1];
};
};
};
};
true