mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-18 01:30:26 +03:00
fixes to typos, started removal of bandit / hero switching. New models now can carry backbacks, removed dupe issue but regained ammo dupe issue. DVS vehicle spawn limits introduced.
451 lines
14 KiB
Plaintext
451 lines
14 KiB
Plaintext
waituntil {!isnil "bis_fnc_init"};
|
|
|
|
BIS_MPF_remoteExecutionServer = {
|
|
if ((_this select 1) select 2 == "JIPrequest") then {
|
|
[nil,(_this select 1) select 0,"loc",rJIPEXEC,[any,any,"per","execVM","ca\Modules\Functions\init.sqf"]] call RE;
|
|
};
|
|
};
|
|
|
|
BIS_Effects_Burn = {};
|
|
object_spawnDamVehicle = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\object_spawnDamVehicle.sqf";
|
|
server_playerLogin = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerLogin.sqf";
|
|
server_playerSetup = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerSetup.sqf";
|
|
server_onPlayerDisconnect = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_onPlayerDisconnect.sqf";
|
|
server_updateObject = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_updateObject.sqf";
|
|
server_playerDied = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerDied.sqf";
|
|
server_publishObj = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishObject.sqf";
|
|
server_publishVeh = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishVehicle.sqf"; // Custom to add vehicles
|
|
|
|
server_tradeObj = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_tradeObject.sqf";
|
|
|
|
server_traders = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_traders.sqf";
|
|
local_publishObj = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_publishObj.sqf"; //Creates the object in DB
|
|
local_deleteObj = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_deleteObj.sqf"; //Creates the object in DB
|
|
local_createObj = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\local_createObj.sqf"; //Creates the object in DB
|
|
server_playerSync = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_playerSync.sqf";
|
|
zombie_findOwner = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\zombie_findOwner.sqf";
|
|
server_updateNearbyObjects = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_updateNearbyObjects.sqf";
|
|
server_spawnCrashSite = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_spawnCrashSite.sqf";
|
|
|
|
vehicle_handleInteract = {
|
|
private["_object"];
|
|
_object = _this select 0;
|
|
[_object, "all"] call server_updateObject;
|
|
};
|
|
|
|
check_publishobject = {
|
|
private["_allowed","_allowedObjects","_object"];
|
|
|
|
_object = _this select 0;
|
|
_allowedObjects = ["TentStorage", "VaultStorageLocked", "Hedgehog_DZ", "Sandbag1_DZ","TrapBear","Wire_cat1"];
|
|
_noncombatitems = ["ThrownObjects", "RoadFlare", "ChemLight"];
|
|
_allowed = false;
|
|
|
|
diag_log format ["DEBUG: Checking if Object: %1 is allowed", _object];
|
|
|
|
if ((typeOf _object) in _allowedObjects) then {
|
|
diag_log format ["DEBUG: Object: %1 Safe",_object];
|
|
_allowed = true;
|
|
};
|
|
if ((typeOf _object) in _noncombatitems) then {
|
|
diag_log format ["DEBUG: NONCombat: %1 Safe",_object];
|
|
_allowed = true;
|
|
};
|
|
|
|
_allowed;
|
|
};
|
|
|
|
//event Handlers
|
|
eh_localCleanup = {
|
|
private ["_object"];
|
|
_object = _this select 0;
|
|
_object addEventHandler ["local", {
|
|
if(_this select 1) then {
|
|
private["_type","_unit"];
|
|
_unit = _this select 0;
|
|
_type = typeOf _unit;
|
|
_myGroupUnit = group _unit;
|
|
_unit removeAllMPEventHandlers "mpkilled";
|
|
_unit removeAllMPEventHandlers "mphit";
|
|
_unit removeAllMPEventHandlers "mprespawn";
|
|
_unit removeAllEventHandlers "FiredNear";
|
|
_unit removeAllEventHandlers "HandleDamage";
|
|
_unit removeAllEventHandlers "Killed";
|
|
_unit removeAllEventHandlers "Fired";
|
|
_unit removeAllEventHandlers "GetOut";
|
|
_unit removeAllEventHandlers "GetIn";
|
|
_unit removeAllEventHandlers "Local";
|
|
clearVehicleInit _unit;
|
|
deleteVehicle _unit;
|
|
deleteGroup _myGroupUnit;
|
|
_unit = nil;
|
|
diag_log ("CLEANUP: DELETED A " + str(_type) );
|
|
};
|
|
}];
|
|
};
|
|
|
|
server_characterSync = {
|
|
private ["_characterID","_playerPos","_playerGear","_playerBackp","_medical","_currentState","_currentModel","_key"];
|
|
_characterID = _this select 0;
|
|
_playerPos = _this select 1;
|
|
_playerGear = _this select 2;
|
|
_playerBackp = _this select 3;
|
|
_medical = _this select 4;
|
|
_currentState = _this select 5;
|
|
_currentModel = _this select 6;
|
|
|
|
_key = format["CHILD:201:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:",_characterID,_playerPos,_playerGear,_playerBackp,_medical,false,false,0,0,0,0,_currentState,0,0,_currentModel,0];
|
|
//diag_log ("HIVE: WRITE: "+ str(_key) + " / " + _characterID);
|
|
_key call server_hiveWrite;
|
|
};
|
|
|
|
//was missing for server
|
|
fnc_buildWeightedArray = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_buildWeightedArray.sqf"; //Checks which actions for nearby casualty
|
|
|
|
//onPlayerConnected "[_uid,_name] spawn server_onPlayerConnect;";
|
|
onPlayerDisconnected "[_uid,_name] call server_onPlayerDisconnect;";
|
|
|
|
server_hiveWrite = {
|
|
private["_data"];
|
|
//diag_log ("ATTEMPT WRITE: " + _this);
|
|
_data = "HiveEXT" callExtension _this;
|
|
diag_log ("WRITE: " + _data);
|
|
};
|
|
|
|
server_hiveReadWrite = {
|
|
private["_key","_resultArray","_data"];
|
|
_key = _this select 0;
|
|
//diag_log ("ATTEMPT READ/WRITE: " + _key);
|
|
_data = "HiveEXT" callExtension _key;
|
|
diag_log ("READ/WRITE: " + _data);
|
|
_resultArray = call compile format ["%1;",_data];
|
|
_resultArray;
|
|
};
|
|
|
|
// Setup globals allow overwrite from init.sqf
|
|
if(isnil "dayz_MapArea") then {
|
|
dayz_MapArea = 10000;
|
|
};
|
|
if(isnil "DynamicVehicleArea") then {
|
|
DynamicVehicleArea = dayz_MapArea / 2;
|
|
};
|
|
if(isnil "HeliCrashArea") then {
|
|
HeliCrashArea = dayz_MapArea / 2;
|
|
};
|
|
|
|
|
|
spawn_heliCrash = {
|
|
private["_position","_veh","_config","_itemType","_itemTypes","_weights","_cntWeights","_index","_num","_i"];
|
|
|
|
_position = [getMarkerPos "center",0,HeliCrashArea,10,0,2000,0] call BIS_fnc_findSafePos;
|
|
_veh = createVehicle ["UH1Wreck_DZ",_position, [], 0, "CAN_COLLIDE"];
|
|
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_veh];
|
|
_veh setVariable ["ObjectID",1,true];
|
|
dayzFire = [_veh,2,time,false,false];
|
|
publicVariable "dayzFire";
|
|
|
|
_config = configFile >> "CfgBuildingLoot" >> "HeliCrash";
|
|
_itemTypes = [] + getArray (_config >> "itemType");
|
|
_index = dayz_CBLCounts find (count _itemTypes);
|
|
_weights = dayz_CBLChances select _index;
|
|
_cntWeights = count _weights;
|
|
_num = round(random 4) + 3;
|
|
for "_i" from 1 to _num do {
|
|
//create loot
|
|
_index = floor(random _cntWeights);
|
|
_index = _weights select _index;
|
|
_itemType = _itemTypes select _index;
|
|
[_itemType select 0, _itemType select 1, _position, 5] call spawn_loot;
|
|
_nearby = _position nearObjects ["WeaponHolder", 5];
|
|
{
|
|
_x setVariable ["permaLoot",true];
|
|
} forEach _nearBy;
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// Get all buildings and roads only once
|
|
MarkerPosition = getMarkerPos "center";
|
|
RoadList = MarkerPosition nearRoads DynamicVehicleArea;
|
|
BuildingList = MarkerPosition nearObjects ["House",DynamicVehicleArea];
|
|
|
|
spawn_vehicles = {
|
|
private["_vehicle","_isAir","_isShip","_position","_roadlist","_buildinglist","_istoomany","_marker","_veh","_objPosition","_weights","_index","_uid","_velimit","_counter"];
|
|
|
|
if (isDedicated) then {
|
|
|
|
_counter = _this select 0;
|
|
|
|
waituntil {!isnil "fnc_buildWeightedArray"};
|
|
|
|
_weights = [];
|
|
_weights = [AllowedVehiclesList,AllowedVehiclesChance] call fnc_buildWeightedArray;
|
|
|
|
_isOverLimit = true;
|
|
|
|
while {_isOverLimit} do {
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_index = _weights call BIS_fnc_selectRandom;
|
|
|
|
_vehicle = AllowedVehiclesList select _index;
|
|
_velimit = AllowedVehiclesLimit select _index;
|
|
|
|
_qty = {_x == _vehicle} count _counter;
|
|
|
|
// If under limit allow to proceed
|
|
if(_qty < _velimit) then {
|
|
_isOverLimit = false;
|
|
};
|
|
|
|
// TODO add counter to stop after X attempts
|
|
|
|
};
|
|
|
|
// Find Vehicle Type to better control spawns
|
|
_isAir = _vehicle isKindOf "Air";
|
|
_isShip = _vehicle isKindOf "Ship";
|
|
|
|
|
|
|
|
if(_isShip || _isAir) then {
|
|
if(_isShip) then {
|
|
// Spawn anywhere on coast on water
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = [MarkerPosition,0,DynamicVehicleArea,10,1,2000,1] call BIS_fnc_findSafePos;
|
|
//diag_log("DEBUG: spawning boat near coast " + str(_position));
|
|
} else {
|
|
// Spawn air anywhere that is flat
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = [MarkerPosition,0,DynamicVehicleArea,25,0,1,0] call BIS_fnc_findSafePos;
|
|
//diag_log("DEBUG: spawning air anywhere flat " + str(_position));
|
|
};
|
|
|
|
|
|
} else {
|
|
// Spawn around buildings and 50% near roads
|
|
if((random 1) > 0.5) then {
|
|
|
|
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = RoadList call BIS_fnc_selectRandom;
|
|
|
|
_position = _position modelToWorld [0,0,0];
|
|
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [_position,0,10,10,0,2000,0] call BIS_fnc_findSafePos;
|
|
|
|
//diag_log("DEBUG: spawning near road " + str(_position));
|
|
|
|
} else {
|
|
|
|
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = BuildingList call BIS_fnc_selectRandom;
|
|
|
|
_position = _position modelToWorld [0,0,0];
|
|
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [_position,0,40,5,0,2000,0] call BIS_fnc_findSafePos;
|
|
|
|
//diag_log("DEBUG: spawning around buildings " + str(_position));
|
|
|
|
};
|
|
};
|
|
// only proceed if two params otherwise BIS_fnc_findSafePos failed and may spawn in air
|
|
if ((count _position) == 2) then {
|
|
|
|
_dir = round(random 180);
|
|
|
|
_istoomany = _position nearObjects ["AllVehicles",50];
|
|
if((count _istoomany) > 0) exitWith { diag_log("DEBUG: Too many vehicles at " + str(_position)); };
|
|
|
|
//place vehicle
|
|
_veh = createVehicle [_vehicle, _position, [], 0, "CAN_COLLIDE"];
|
|
_veh setdir _dir;
|
|
_veh setpos _position;
|
|
|
|
// Get position with ground
|
|
_objPosition = getPosATL _veh;
|
|
|
|
clearWeaponCargoGlobal _veh;
|
|
clearMagazineCargoGlobal _veh;
|
|
|
|
[_veh,[_dir,_objPosition],_vehicle,true,"0"] call server_publishVeh;
|
|
};
|
|
};
|
|
};
|
|
|
|
spawn_roadblocks = {
|
|
private["_position","_veh","_num","_config","_itemType","_itemChance","_weights","_index","_iArray","_isRoad","_roadlist","_istoomany"];
|
|
_WreckList = ["SKODAWreck","HMMWVWreck","UralWreck","datsun01Wreck","hiluxWreck","datsun02Wreck","UAZWreck","Land_Misc_Garb_Heap_EP1","Fort_Barricade_EP1"];
|
|
_WreckLoot = ["DynamicDebris"];
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
if (isDedicated) then {
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_position = RoadList call BIS_fnc_selectRandom;
|
|
|
|
_position = _position modelToWorld [0,0,0];
|
|
|
|
waitUntil{!isNil "BIS_fnc_findSafePos"};
|
|
_position = [_position,0,10,5,0,2000,0] call BIS_fnc_findSafePos;
|
|
|
|
if ((count _position) == 2) then {
|
|
// Get position with ground
|
|
|
|
|
|
_istoomany = _position nearObjects ["All",5];
|
|
|
|
if((count _istoomany) > 0) exitWith { diag_log("DEBUG: Too many at " + str(_position)); };
|
|
|
|
//_isRoad = isOnRoad _position;
|
|
|
|
//_marker = createMarker [str(_position) , _position];
|
|
//_marker setMarkerShape "ICON";
|
|
//_marker setMarkerType "DOT";
|
|
//_marker setMarkerText "ON";
|
|
|
|
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_spawnveh = _WreckList call BIS_fnc_selectRandom;
|
|
waitUntil{!isNil "BIS_fnc_selectRandom"};
|
|
_spawnloot = _WreckLoot call BIS_fnc_selectRandom;
|
|
|
|
diag_log("DEBUG: Spawning a crashed " + _spawnveh + " with " + _spawnloot + " at " + str(_position));
|
|
_veh = createVehicle [_spawnveh,_position, [], 0, "CAN_COLLIDE"];
|
|
// Randomize placement a bit
|
|
_veh setDir round(random 360);
|
|
_veh setpos _position;
|
|
|
|
|
|
|
|
dayz_serverObjectMonitor set [count dayz_serverObjectMonitor,_veh];
|
|
_veh setVariable ["ObjectID",1,true];
|
|
|
|
_num = round(random 4) + 3;
|
|
_config = configFile >> "CfgBuildingLoot" >> _spawnloot;
|
|
_itemType = [] + getArray (_config >> "itemType");
|
|
_itemChance = [] + getArray (_config >> "itemChance");
|
|
|
|
waituntil {!isnil "fnc_buildWeightedArray"};
|
|
|
|
_weights = [];
|
|
_weights = [_itemType,_itemChance] call fnc_buildWeightedArray;
|
|
for "_x" from 1 to _num do {
|
|
//create loot
|
|
_index = _weights call BIS_fnc_selectRandom;
|
|
sleep 1;
|
|
if (count _itemType > _index) then {
|
|
_iArray = _itemType select _index;
|
|
_iArray set [2,_position];
|
|
_iArray set [3,5];
|
|
_iArray call spawn_loot;
|
|
_nearby = _position nearObjects ["WeaponHolder",20];
|
|
{
|
|
_x setVariable ["permaLoot",true];
|
|
} forEach _nearBy;
|
|
};
|
|
};
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// Damage generator fuction
|
|
generate_new_damage = {
|
|
private ["_damage","_rnd"];
|
|
_rnd = random 1;
|
|
if(_rnd > 0.5) then {
|
|
_damage = 0;
|
|
} else {
|
|
_rnd = random 1;
|
|
if(_rnd > 0.5) then {
|
|
_damage = 0.50;
|
|
} else {
|
|
_damage = 1;
|
|
};
|
|
};
|
|
_damage;
|
|
};
|
|
|
|
// Damage generator fuction
|
|
generate_exp_damage = {
|
|
private ["_damage","_rnd"];
|
|
_rnd = random 1;
|
|
if(_rnd > 0.5) then {
|
|
_damage = 0;
|
|
} else {
|
|
_rnd = random 1;
|
|
if(_rnd > 0.5) then {
|
|
_damage = 0.50;
|
|
} else {
|
|
_damage = 0.85;
|
|
};
|
|
};
|
|
_damage;
|
|
};
|
|
|
|
server_getDiff = {
|
|
private["_variable","_object","_vNew","_vOld","_result"];
|
|
_variable = _this select 0;
|
|
_object = _this select 1;
|
|
_vNew = _object getVariable[_variable,0];
|
|
_vOld = _object getVariable[(_variable + "_CHK"),_vNew];
|
|
_result = 0;
|
|
if (_vNew < _vOld) then {
|
|
//JIP issues
|
|
_vNew = _vNew + _vOld;
|
|
_object getVariable[(_variable + "_CHK"),_vNew];
|
|
} else {
|
|
_result = _vNew - _vOld;
|
|
_object setVariable[(_variable + "_CHK"),_vNew];
|
|
};
|
|
_result
|
|
};
|
|
|
|
server_getDiff2 = {
|
|
private["_variable","_object","_vNew","_vOld","_result"];
|
|
_variable = _this select 0;
|
|
_object = _this select 1;
|
|
_vNew = _object getVariable[_variable,0];
|
|
_vOld = _object getVariable[(_variable + "_CHK"),_vNew];
|
|
_result = _vNew - _vOld;
|
|
_object setVariable[(_variable + "_CHK"),_vNew];
|
|
_result
|
|
};
|
|
|
|
dayz_objectUID = {
|
|
private["_position","_dir","_key","_object"];
|
|
_object = _this;
|
|
_position = getPosATL _object;
|
|
_dir = direction _object;
|
|
_key = [_dir,_position] call dayz_objectUID2;
|
|
_key
|
|
};
|
|
|
|
dayz_objectUID2 = {
|
|
private["_position","_dir","_key"];
|
|
_dir = _this select 0;
|
|
_key = "";
|
|
_position = _this select 1;
|
|
{
|
|
_x = _x * 10;
|
|
if ( _x < 0 ) then { _x = _x * -10 };
|
|
_key = _key + str(round(_x));
|
|
} forEach _position;
|
|
_key = _key + str(round(_dir));
|
|
_key
|
|
};
|
|
|
|
dayz_recordLogin = {
|
|
private["_key"];
|
|
_key = format["CHILD:103:%1:%2:%3:",_this select 0,_this select 1,_this select 2];
|
|
diag_log ("HIVE: WRITE: "+ str(_key));
|
|
_key call server_hiveWrite;
|
|
};
|