Advertisement
Guest User

arma3 rougher offroad driving script

a guest
Nov 11th, 2023
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQF 5.83 KB | Gaming | 0 0
  1.  
  2. // speed limit
  3. if (hasinterface) then {
  4. // if (false) then {
  5.  
  6.     // todo:
  7.     // - Detect terrain / road
  8.     // - Damage wheels based on speed
  9.     // nearRoads
  10.     // isOnRoad
  11.     // getRoadinfo
  12.  
  13.     //
  14.  
  15.     player createDiaryRecord ["Diary", ["Rough Offroad Driving",
  16.     "<font size='25'>Rogher offroad driving is active!</font><br/><font size='15'>Driving offroad will slow your car down."
  17.     ]];
  18.  
  19.     ten_fnc_carSpeedLimit = {
  20.  
  21.         // discover the deltatime
  22.         private _deltaTime = ((missionNamespace getVariable ['mission_carSpeedLimit_LastTime',cba_missiontime]) - cba_missiontime);
  23.         missionNamespace setVariable ['mission_carSpeedLimit_LastTime', cba_missiontime];
  24.  
  25.         // only run on cars
  26.         //if !((vehicle player) isKindOf 'Car') exitWith {};
  27.         if !((vehicle player) isKindOf 'Land') exitWith {};
  28.  
  29.         // if ((isNull objectParent player ) && _killer isKindOf "CAManBase") then {
  30.         if (isNull objectParent player ) exitWith {};
  31.  
  32.  
  33.         private _vehicle = vehicle player;
  34.  
  35.         if (typeOf _vehicle isEqualTo 'B_Quadbike_01_F') exitWith {};
  36.  
  37.         private _s = speed _vehicle;
  38.  
  39.         private _o_Speed_Limit = 10;        // Above this km/h the vehicle speed is limited
  40.         private _o_Speed_Min = 30;          // wheels start taking damage above this speed
  41.         private _o_Speed_Max = 90;          // wheels take maximum damage at this speed
  42.         if (typeOf _vehicle isEqualTo 'B_MRAP_01_F') then {
  43.             _o_Speed_Limit = 50;
  44.             _o_Speed_Limit = 60;
  45.             _o_Speed_Limit = 120;
  46.         };
  47.  
  48.         // speed must be bigger than 10
  49.         if (_s < _o_Speed_Limit && (_s > -_o_Speed_Limit)) exitWith {};
  50.  
  51.         //private _v = velocityModelSpace _vehicle;
  52.         //_v = (_v vectorAdd [0,0,0]);
  53.         //_vehicle setVelocityModelSpace _v;
  54.         //systemChat ("Speed: " + str _s);
  55.  
  56.         private _modifier = 0.05;
  57.         private _modifierSpeed = 0.05;  // todo maker this based on  weight?
  58.  
  59.         // less effect when car is on road
  60.         if (isOnRoad _vehicle) then {
  61.             _modifier = 0.001;
  62.             _modifierSpeed = 0.0025;  // TODO make this based on weight of vehicle
  63.  
  64.  
  65.             _vehicle setVariable ['unit_carSpeedLimit_lastTimeOnroad', CBA_Missiontime];
  66.         } else {
  67.             // car is offroad
  68.  
  69.             _vehicle setVariable ['unit_carSpeedLimit_lastTimeOffroad', CBA_Missiontime];
  70.         };
  71.  
  72.         private _timeSpentOffroad = CBA_Missiontime - (_vehicle getVariable ['unit_carSpeedLimit_lastTimeOnroad', 0]);
  73.         private _timeSpentOffroadMod = linearConversion [0,3,_timeSpentOffroad,0,0.5,true];
  74.         //_modifierSpeed = _modifierSpeed * _timeSpentOffroadMod;
  75.  
  76.         //systemChat ("Speed.ModifierSpeed:" + "____new____");
  77.         //systemChat ("Speed.ModifierSpeed:" + str _modifierSpeed + " mod:" + str _timeSpentOffroadMod);
  78.  
  79.         private _timeSpentOnroad = CBA_Missiontime - (_vehicle getVariable ['unit_carSpeedLimit_lastTimeOffroad',0]);
  80.         private _timeSpentOnroadMod = linearConversion [0,3,_timeSpentOnroad,0.5,0,true];
  81.         //_modifierSpeed = _modifierSpeed * _timeSpentOnroadMod;
  82.  
  83.         //_modifierSpeed = _modifierSpeed * (_timeSpentOffroadMod + _timeSpentOnroadMod);
  84.         _modifier = _modifier * (_timeSpentOffroadMod + _timeSpentOnroadMod);
  85.  
  86.         //systemChat ("Speed.ModifierSpeed:" + str _modifierSpeed + " mod:" + str _timeSpentOnroadMod);
  87.         //systemChat ("Speed.Modifier:" + str _modifier);
  88.  
  89.  
  90.         // damage car when speed is high
  91.         if (_s > _o_Speed_Min || _s < -15) then {
  92.             if (isOnRoad _vehicle) exitWith {};
  93.  
  94.             // damage car
  95.  
  96.             // increase modifier ?? (not)
  97.  
  98.             // check timer
  99.             private _lastTime = _vehicle getVariable ['unit_carSpeedLimit_last', 0];
  100.             if ((cba_missiontime - _lastTime) < 1) exitWith {};
  101.             _vehicle setVariable ['unit_carSpeedLimit_last', cba_missiontime];
  102.  
  103.             // wheel_1_1_steering
  104.             // wheel_1_2_steering
  105.             // wheel_2_1_steering
  106.             // wheel_2_2_steering
  107.             call {
  108.  
  109.                 // also increase the forceFront or speed, that way car slows more when this happens
  110.  
  111.  
  112.                 private _wheel = selectRandom ['wheel_1_1_steering','wheel_1_2_steering','wheel_2_1_steering','wheel_2_2_steering'];
  113.                 private _wheelDamage = _vehicle getHit _wheel;
  114.                 if (_wheelDamage >= 1) exitWith {};
  115.                 private _addedDamage = linearConversion [_o_Speed_Min,_o_Speed_Max,_s,0.0,0.1,true];
  116.                 _vehicle setHit [_wheel,(_wheelDamage + _addedDamage)];
  117.                 // systemChat str (_wheelDamage + _addedDamage);
  118.             };
  119.         };
  120.  
  121.         //_object = vehicle player;
  122.         private _mass = getMass _vehicle;
  123.         private _force = (_s * _modifier) * _mass;
  124.         _force = _force * _deltaTime;
  125.         if (_s <= 0) then {
  126.             _force = 0 - (_force * 2);
  127.         };
  128.         private _forceFront = (_force * (_s * _modifierSpeed));
  129.         //private _forceFront = 0 - (_force / _s);
  130.         //systemChat str _forceFront;
  131.         private _forceSide = _force * 10;        // from 10
  132.         private _torque = _forceSide * 2;       // from 10
  133.         //if (_s <= 0) then {
  134.         //    _forceFront = -_forceFront;
  135.         //    _forceSide = -_forceSide;
  136.         //};
  137.  
  138.         // systemChat ("Speed.Side: " + str _forceSide);
  139.         // systemChat ("Speed.Front: " + str _forceFront);
  140.  
  141.         _vehicle addForce [_vehicle vectorModelToWorld [(_forceSide - random(_forceSide * 2)),(_forceFront - random (_forceFront * 0.2)),0],[0,0,0]];
  142.         _vehicle addTorque [(_torque - random(_torque * 2)),(_torque - random(_torque * 2)),0];
  143.  
  144.     };
  145.  
  146.     ten_carSpeedLimit_handle = [{[] call ten_fnc_carSpeedLimit}, 0] call CBA_fnc_addPerFrameHandler;
  147. };
  148.  
  149.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement