Dynamic Waypoint System
Introduction
I want to contribute with a waypoints system I have made for OFP. The absence of "AddWaypoint" and similar instructions in Cold War Assault really piss me off so I created this system to have a kind of "virtual waypoints" so I can establish them at any point and forget (I didn't want to create a custom script for baby-sitting each unit I wanted to have dynamic waypoints).
Files
vwaypoint_add.sqf
vwaypoint_run.sqs
vwaypoint_getin.sqs
//VWayPoint Add
// Parameters.................................................
// Group: target group
// Type: MOVE, GETIN, GETOUT, EJECT
// Speed: NOCHANGE, LIMITED, NORMAL, FULL. Default: NOCHANGE
// Behaviour: NOCHANGE, CARELESS, SAFE, AWARE, COMBAT, STEALTH. Default: NOCHANGE
// CombatMode: NOCHANGE, BLUE, GREEN, WHITE, YELLOW, RED. Default: NOCHANGE
// GetInInfo: [targetVehicle, arrayUnitIndex, roleInVehicle]. Default: []
// --> targetVehicle: vehicle to get in
// --> arrayUnitIndex: array of the unit indexes of the group to get in
// --> roleInVehicle: CARGO, DRIVER, GUNNER, COMMANDER
private["_group", "_position", "_type", "_speed", "_behaviour", "_combatMode", "_getInInfo", "_vwaypoint", "_groupWaypointList"];
_group = _this select 0;
_position = _this select 1;
if(count _this > 2) then { _type = _this select 2; }
else { _type = "MOVE"; };
if(count _this > 3) then { _speed = _this select 3; }
else { _speed = "NOCHANGE"; };
if(count _this > 4) then { _behaviour = _this select 4; }
else { _behaviour = "NOCHANGE"; };
if(count _this > 5) then { _combatMode = _this select 5; }
else { _combatMode = "NOCHANGE"; };
if(count _this > 6) then { _getInInfo = _this select 6; }
else { _getInInfo = []; };
_vwaypoint = [_position, _type, _speed, _behaviour, _combatMode, _getInInfo];
//if (isNull vWayPoints) then { vWayPoints = [] };
if (format ["%1", vWayPoints] == "scalar bool array string 0xfcffffef") then { vWayPoints = []; publicVariable "vWayPoints"; };
private "_found";
_found = false;
{ if((_x select 0) == _group) then { _groupWaypointList = _x select 1; _found = true; };} foreach vWayPoints;
if (!_found) then { vWayPoints set [count vWayPoints, [_group, [_vwaypoint]]]; }
else {
_groupWaypointList set [ count _groupWaypointList, _vwaypoint];
};
vwaypoint_run.sqs
@(format ["%1", vWayPoints] != "scalar bool array string 0xfcffffef")
private["_group", "_index", "_getIn", "_getOut", "_eject", "_waypointList", "_waypointListFound", "_waypoint", "_position", "_type", "_speed", "_behaviour", "_combatMode", "_getInInfo", "_i", "_getOutDone", "_isReady"];
private["_targetVehicle", "_arrayUnitIndex"];
_group = _this select 0;
_index = 0;
_getIn = false;
_getOut = false;
_eject = false;
_waypointListFound = false;
#BEGIN
~2
_getOutDone = false;
_isReady = true;
{ _isReady = (_isReady && unitReady _x); } foreach units _group;
if(!_isReady && !_getIn) then { goto "BEGIN"; };
if(_getIn) then { _getIn = false; [_group, _getInInfo] exec "vwaypoint_getin.sqs"; } else { goto "NOWAIT_GETIN"; };
#WAIT_GETIN
_targetVehicle = _getInInfo select 0;
_arrayUnitIndex = _getInInfo select 1;
{ if(!(((units _group) select _x) in vehicle _targetVehicle) && ( alive((units _group) select _x))) then { goto "WAIT_GETIN"; } } foreach _arrayUnitIndex;
#NOWAIT_GETIN
if(_getOut) then { _getOut = false; {unassignVehicle _x;} forEach units _group; _getOutDone = true;};
if(_eject) then { _eject = false; { _x action ["EJECT", vehicle _x]; } forEach units _group; _getOutDone = true;};
if(!_waypointListFound) then { { if((_x select 0) == _group) then {_waypointList = (_x select 1); _waypointListFound = true;}; } foreach vWayPoints;};
if(!_waypointListFound) then { goto "BEGIN"; };
_i = count _waypointList;
;hint format["waypoints count: %1", _i];
if(count _waypointList < (_index + 1)) then {goto "BEGIN"; };
_waypoint = (_waypointList select _index);
_position = _waypoint select 0;
_type = _waypoint select 1;
_speed = _waypoint select 2;
_behaviour = _waypoint select 3;
_combatMode = _waypoint select 4;
_getInInfo = _waypoint select 5;
_group move _position;
{ if(!_getOutDone && vehicle _x != _x) then { _x doMove _position; } } foreach units _group;
if(_type == "GETIN") then { _getIn = true; };
if(_type == "GETOUT") then { _getOut = true; };
if(_type == "EJECT") then { _eject = true; };
if(_speed != "NOCHANGE") then { _group setSpeedMode _speed; };
if(_behaviour != "NOCHANGE") then { _group setBehaviour _behaviour; };
if(_combatMode != "NOCHANGE") then { _group setCombatMode _combatMode; };
_index = _index + 1;
goto "BEGIN";
vwaypoint_getin.sqs
private ["_group", "_getInInfo", "_targetVehicle", "_arrayUnitIndex", "_roleInVehicle", "_command", "_fullComand"];
_group = _this select 0;
_getInInfo = _this select 1;
_targetVehicle = _getInInfo select 0;
_arrayUnitIndex = _getInInfo select 1;
_roleInVehicle = _getInInfo select 2;
_command = "assignAsCargo";
if(_roleInVehicle == "DRIVER") then { _command = "assignAsDriver"; };
if(_roleInVehicle == "GUNNER") then { _command = "assignAsGunner"; };
if(_roleInVehicle == "COMMANDER") then { _command = "assignAsCommander"; };
_fullCommand = "((units _group) select _x) " + _command + " _targetVehicle;";
{ [] call _fullCommand; [(units _group) select _x] orderGetIn true; } foreach _arrayUnitIndex;
Example of Use
Do not forget: first you have to copy/create the files described in the previous section to your mission folder.
This code is meant to be in the init of the leader of a group of soldiers:
In this example I have set these markers: BeachCharlie, BeachDelta, IslandCenter. I also have a boat named "ship" in "BeachCharlie". In this example the group mount the ship and goes to another island where they dismount and goes to "IslandCenter" on foot.
I think this is pretty self-explicative, anyway in case of doubt just ask :)
Any improvement is welcome!!
This code is meant to be in the init of the leader of a group of soldiers:
_vwaypoint_add = preprocessFile "vwaypoint_add.sqf";
[group this, getMarkerPos "BeachCharlie", "GETIN", "FULL", "NOCHANGE", "NOCHANGE", [ship, [2], "GUNNER"]] call _vwaypoint_add;
[group this, getMarkerPos "BeachCharlie", "GETIN", "FULL", "NOCHANGE", "NOCHANGE", [ship, [0,3,4,5,6,7], "CARGO"]] call _vwaypoint_add;
[group this, getMarkerPos "BeachCharlie", "GETIN", "FULL", "NOCHANGE", "NOCHANGE", [ship, [1], "DRIVER"]] call _vwaypoint_add;
[group this, getMarkerPos "BeachDelta", "GETOUT", "FULL"] call _vwaypoint_add;
[group this, getMarkerPos "IslandCenter"] call _vwaypoint_add;
[group this] exec "vwaypoint_run.sqs";
In this example I have set these markers: BeachCharlie, BeachDelta, IslandCenter. I also have a boat named "ship" in "BeachCharlie". In this example the group mount the ship and goes to another island where they dismount and goes to "IslandCenter" on foot.
I think this is pretty self-explicative, anyway in case of doubt just ask :)
Any improvement is welcome!!
This guide was created by its original author on the Steam Community. Are you the author and want it removed? Request removal.