Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // speed limit
- if (hasinterface) then {
- // if (false) then {
- // todo:
- // - Detect terrain / road
- // - Damage wheels based on speed
- // nearRoads
- // isOnRoad
- // getRoadinfo
- //
- player createDiaryRecord ["Diary", ["Rough Offroad Driving",
- "<font size='25'>Rogher offroad driving is active!</font><br/><font size='15'>Driving offroad will slow your car down."
- ]];
- ten_fnc_carSpeedLimit = {
- // discover the deltatime
- private _deltaTime = ((missionNamespace getVariable ['mission_carSpeedLimit_LastTime',cba_missiontime]) - cba_missiontime);
- missionNamespace setVariable ['mission_carSpeedLimit_LastTime', cba_missiontime];
- // only run on cars
- //if !((vehicle player) isKindOf 'Car') exitWith {};
- if !((vehicle player) isKindOf 'Land') exitWith {};
- // if ((isNull objectParent player ) && _killer isKindOf "CAManBase") then {
- if (isNull objectParent player ) exitWith {};
- private _vehicle = vehicle player;
- if (typeOf _vehicle isEqualTo 'B_Quadbike_01_F') exitWith {};
- private _s = speed _vehicle;
- private _o_Speed_Limit = 10; // Above this km/h the vehicle speed is limited
- private _o_Speed_Min = 30; // wheels start taking damage above this speed
- private _o_Speed_Max = 90; // wheels take maximum damage at this speed
- if (typeOf _vehicle isEqualTo 'B_MRAP_01_F') then {
- _o_Speed_Limit = 50;
- _o_Speed_Limit = 60;
- _o_Speed_Limit = 120;
- };
- // speed must be bigger than 10
- if (_s < _o_Speed_Limit && (_s > -_o_Speed_Limit)) exitWith {};
- //private _v = velocityModelSpace _vehicle;
- //_v = (_v vectorAdd [0,0,0]);
- //_vehicle setVelocityModelSpace _v;
- //systemChat ("Speed: " + str _s);
- private _modifier = 0.05;
- private _modifierSpeed = 0.05; // todo maker this based on weight?
- // less effect when car is on road
- if (isOnRoad _vehicle) then {
- _modifier = 0.001;
- _modifierSpeed = 0.0025; // TODO make this based on weight of vehicle
- _vehicle setVariable ['unit_carSpeedLimit_lastTimeOnroad', CBA_Missiontime];
- } else {
- // car is offroad
- _vehicle setVariable ['unit_carSpeedLimit_lastTimeOffroad', CBA_Missiontime];
- };
- private _timeSpentOffroad = CBA_Missiontime - (_vehicle getVariable ['unit_carSpeedLimit_lastTimeOnroad', 0]);
- private _timeSpentOffroadMod = linearConversion [0,3,_timeSpentOffroad,0,0.5,true];
- //_modifierSpeed = _modifierSpeed * _timeSpentOffroadMod;
- //systemChat ("Speed.ModifierSpeed:" + "____new____");
- //systemChat ("Speed.ModifierSpeed:" + str _modifierSpeed + " mod:" + str _timeSpentOffroadMod);
- private _timeSpentOnroad = CBA_Missiontime - (_vehicle getVariable ['unit_carSpeedLimit_lastTimeOffroad',0]);
- private _timeSpentOnroadMod = linearConversion [0,3,_timeSpentOnroad,0.5,0,true];
- //_modifierSpeed = _modifierSpeed * _timeSpentOnroadMod;
- //_modifierSpeed = _modifierSpeed * (_timeSpentOffroadMod + _timeSpentOnroadMod);
- _modifier = _modifier * (_timeSpentOffroadMod + _timeSpentOnroadMod);
- //systemChat ("Speed.ModifierSpeed:" + str _modifierSpeed + " mod:" + str _timeSpentOnroadMod);
- //systemChat ("Speed.Modifier:" + str _modifier);
- // damage car when speed is high
- if (_s > _o_Speed_Min || _s < -15) then {
- if (isOnRoad _vehicle) exitWith {};
- // damage car
- // increase modifier ?? (not)
- // check timer
- private _lastTime = _vehicle getVariable ['unit_carSpeedLimit_last', 0];
- if ((cba_missiontime - _lastTime) < 1) exitWith {};
- _vehicle setVariable ['unit_carSpeedLimit_last', cba_missiontime];
- // wheel_1_1_steering
- // wheel_1_2_steering
- // wheel_2_1_steering
- // wheel_2_2_steering
- call {
- // also increase the forceFront or speed, that way car slows more when this happens
- private _wheel = selectRandom ['wheel_1_1_steering','wheel_1_2_steering','wheel_2_1_steering','wheel_2_2_steering'];
- private _wheelDamage = _vehicle getHit _wheel;
- if (_wheelDamage >= 1) exitWith {};
- private _addedDamage = linearConversion [_o_Speed_Min,_o_Speed_Max,_s,0.0,0.1,true];
- _vehicle setHit [_wheel,(_wheelDamage + _addedDamage)];
- // systemChat str (_wheelDamage + _addedDamage);
- };
- };
- //_object = vehicle player;
- private _mass = getMass _vehicle;
- private _force = (_s * _modifier) * _mass;
- _force = _force * _deltaTime;
- if (_s <= 0) then {
- _force = 0 - (_force * 2);
- };
- private _forceFront = (_force * (_s * _modifierSpeed));
- //private _forceFront = 0 - (_force / _s);
- //systemChat str _forceFront;
- private _forceSide = _force * 10; // from 10
- private _torque = _forceSide * 2; // from 10
- //if (_s <= 0) then {
- // _forceFront = -_forceFront;
- // _forceSide = -_forceSide;
- //};
- // systemChat ("Speed.Side: " + str _forceSide);
- // systemChat ("Speed.Front: " + str _forceFront);
- _vehicle addForce [_vehicle vectorModelToWorld [(_forceSide - random(_forceSide * 2)),(_forceFront - random (_forceFront * 0.2)),0],[0,0,0]];
- _vehicle addTorque [(_torque - random(_torque * 2)),(_torque - random(_torque * 2)),0];
- };
- ten_carSpeedLimit_handle = [{[] call ten_fnc_carSpeedLimit}, 0] call CBA_fnc_addPerFrameHandler;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement