Jump to content

aVa Savagerx

Member
  • Posts

    66
  • Joined

  • Last visited

Posts posted by aVa Savagerx

  1. Many people seem to be confused on what restrictions the Epoch license employs, and why the developers enforce them. I'd like to start off saying that, while I have taken some basic classes in intellectual propery, I am by no means a lawyer or an expert, but I think it's safe to say that there are many grey-areas as question is quite complicated. What you are about to read is purely my opinion on it, and nothing else.

     

    First of all, the "No Derivatives" attribute in a CC-license means that you are not allowed to take a work and transform it into something else. But this doesn't necessarily mean that you "can't touch" the work at all. In copyright law, a derivative work means that you take a work and modify it extensively enough so that your final product is so original on its' own that it constitutes as a separate work.

    For example, you could probably change the output of the debug monitor (where your Hunger and Stamina is displayed) and still be "in the clear" as the modification isn't sufficient enough to be considered as a separate work. However, if you were to remove the antagonists (Sappers, Cultists, etc) and replace them with Zombies, you would be running a server with a sufficient enough modification to be considered a derivative off the Epoch mod, which would not be acceptable.

     

    With the above said, many might wonder "okay, so what is allowed and what isn't?" which is not the question I think they should asking themselves. Before investigating what one can or cannot do, I think it's vital that one understands and respects the developers intent of placing said restrictions in the first place. From my (not-so-extensive) activity on the forums, it is my understanding that the developers want their code to be tested and receive feedback on it "as is". Servers with modified server-files may result in bugs being reported as false-positive Epoch flaws.

     

    Unfortunately, it seems safe to assume that numerous Epoch servers with modified server-files and/or "donor stores" will appear anyway, and they will be abusing any "grey-zones" of the legal system they can find to their advantage in order to justify their actions. But I believe it's important that those who actually do want to play by the book understand, not only what legal restrictions are placed upon them, but also why the developers placed them in the first place so that the appropriate response and feedback can be returned.

     

    So my conclusion on editing of server-files is that you are indeed free to modify them, as long as you don't edit them so much that you end up with a new mod or a variation to what Epoch is intended to be. But if you care about the mod and want to help the developers, do keep the modding to a minimum. Never alter their code any more than necessary.

     

    We need the community to take a stand and blacklist servers which break the terms and spread the word about which groups are doing so. That way they do not get any "business" for breaking the rules and the Epoch Devs do not need to resort to legal action. If the devs have to resort to legal action the whole time it will take up considerable time and tap into their finances which are better spent elsewhere like on A3 Epoch ;-).

     

    I study law and still find these terms hard to define, its why you pay lawyers so much to argue over them. The issue is with potential offenders all over the world, legal enforcement of the licence agreement becomes increasingly difficult. Also a lot of clans/communities which breach the agreement do not have the finances which make it viable to sue them, you need to go after the private individuals that run the clans themselves which is not always easy.

     

    All in all that is why it is up to us (the community) rather than the lawyers to solve the problems as they arise.

  2.  

    Is there away to tie the procedure to server reboot?

     

     To the best of my knowledge if you use static restart times, such as set times that your server restarts, you can set a trigger in your database to run those events at the same time. The problem is most people use dynamic restarting which would throw this method off somewhat.

     

    For dynamic restarting, my understanding is that they are both separate applications so you would need to create a batch file which runs both the SQL script as well as restarts the server for you. You should be able to do this through BEC so that when it shuts the server down it executes that batch file which then brings everything back up.

     

    I hope this helps. I have just woken up so may not be as coherent as possible, if you need me to explain further feel free to ask.

  3. Alrighty, I got some free time and had a few cracks at it. No luck :(

     

    I get the dialog option to build elevator but Infistar bans me. I am fairly certain that I am breaking the script when trying to implement the code.

     

    13:06:12 "infiSTAR.de Log: [aVa] Savage (123456789123456789) | GameFNCbroken: distance (BANNED)"
    13:06:12 "infiSTAR.de Log: SERVER kicked [aVa] Savage(123456789123456789) @123456"
    13:06:12 "nil player object attempting PV, :["123456789123456789","[aVa] Savage"]"

     

    Server RPT is clean

     

    Client Side RPT has errors

     

    ArmA2OA.RPT

    "Elevator script initialized"
    Error in expression <false];
    };
    } else {
    player removeAction s_player_elevator_next;
    s_player_elevato>
      Error position: <s_player_elevator_next;
    s_player_elevato>
      Error Undefined variable in expression: s_player_elevator_next
    File mpmissions\__CUR_MP.Tavi\Custom\Elevator\elevator_init.sqf, line 71

     

    Please also take a look at my AP4L Merged elevator build script.

     

    elevator_build.sqf

    private ["_args","_option","_obj","_id","_elevatorStop","_dist","_canBuildOnPlot","_distance","_needText","_findNearestPoles","_findNearestPole","_IsNearPlot","_nearestPole","_ownerID","dayz_characterID","_friendlies","_playerUID","_isPole","_requireplot"];
     
    if (DZE_ActionInProgress) exitWith { cutText ["Upgrade already in progress." , "PLAIN DOWN"]; };
    DZE_ActionInProgress = true;
     
    player removeAction s_player_elevator_upgrade;
    s_player_elevator_upgrade = 1;
    player removeAction s_player_elevator_upgrade_stop;
    s_player_elevator_upgrade_stop = 1;
     
    _playerUID = getPlayerUID player;
    
    distance = DZE_PlotPole select 0;
    
    _needText = localize "str_epoch_player_246";
    
    if(_isPole) then {
    	_distance = DZE_PlotPole select 1;
    };
    
    // check for near plot
    _findNearestPoles = nearestObjects [(vehicle player), ["Plastic_Pole_EP1_DZ"], _distance];
    _findNearestPole = [];
    
    {
    	if (alive _x) then {
    		_findNearestPole set [(count _findNearestPole),_x];
    	};
    } count _findNearestPoles;
    
    _IsNearPlot = count (_findNearestPole);
    
    // If item is plot pole && another one exists within 45m
    if(_isPole && _IsNearPlot > 0) exitWith {  DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_44") , "PLAIN DOWN"]; };
    
    if(_IsNearPlot == 0) then {
    
    	// Allow building of plot
    	if(_requireplot == 0 || _isLandFireDZ) then {
    		_canBuildOnPlot = true;
    	};
    
    } else {
    	// Since there are plots nearby we check for ownership && then for friend status
    
    	// check nearby plots ownership && then for friend status
    	_nearestPole = _findNearestPole select 0;
    
    	// Find owner
    	_ownerID = _nearestPole getVariable ["ownerPUID","0"];
    
    	 diag_log format["Player_build start: [PlayerUID = %1]  [OwnerID = %2]", _playerUID, _ownerID];
    
    	// check if friendly to owner
    	if(_playerUID == _ownerID) then {  //Keep ownership
    		// owner can build anything within his plot except other plots
    		diag_log text "Player is owner";
    		if(!_isPole) then {
    			_canBuildOnPlot = true;
    		};
    	} else {
    		// disallow building plot
    		if(!_isPole) then {
    			_friendlies		= player getVariable ["friendlyTo",[]];
    			// check if friendly to owner
    			if(_ownerID in _friendlies) then {
    				_canBuildOnPlot = true;
    			};
    		};
    	};
    };
    
    if(!_canBuildOnPlot) exitWith {  DZE_ActionInProgress = false; cutText [format[(localize "STR_EPOCH_PLAYER_135"),_needText,_distance] , "PLAIN DOWN"]; };
     
    _args = _this select 3;
    _option = _args select 0;
    switch (_option) do {
    case "build": {
    _obj = _args select 1;
    _id = [_obj] call ELE_fnc_generateElevatorId;
    if (_id == "") exitWith { cutText ["invalid elevator ID generated", "PLAIN"] };
    if ((ELE_RequiredBuildTools call AC_fnc_hasTools) && {ELE_RequiredBuildItems call AC_fnc_checkAndRemoveRequirements}) then {
    ["Medic", ELE_MaxRange] call AC_fnc_doAnimationAndAlertZombies;
    ELE_elevator = [_obj, _id] call AC_fnc_swapObject;
    titleText ["Elevator Built", "PLAIN"];
    };
    };
    case "build_stop": {
    _obj = _args select 1;
    if (isNil "ELE_elevator") exitWith { cutText ["no elevator selected", "PLAIN"] };
    _dist = _obj distance ELE_elevator;
    if (_dist > ELE_MaxRange) exitWith { cutText [format["Elevator Stop is to far away from Elevator (%1 > %2)", _dist, ELE_MaxRange], "PLAIN"] };
    _id = [ELE_elevator] call ELE_fnc_getNextStopId;
    if (_id == "") exitWith { cutText ["Elevator Stop already exists or to many (max. 9 per Elevator)", "PLAIN"] };
    if ((ELE_RequiredBuildTools call AC_fnc_hasTools) && {ELE_RequiredBuildStopItems call AC_fnc_checkAndRemoveRequirements}) then {
    ["Medic", ELE_MaxRange] call AC_fnc_doAnimationAndAlertZombies;
    _elevatorStop = [_obj, _id, ELE_StopClass] call AC_fnc_swapObject;
    titleText ["Elevator Stop Built", "PLAIN"];
    };
    };
    };
     
    DZE_ActionInProgress = false;
    s_player_elevator_upgrade = -1;
    s_player_elevator_upgrade_stop = -1; 

     

    Any ideas where I went wrong?

  4. Hey there, here is the simplest way and it involves stopping them spawning at all...or reducing the spawn rates of boats that you do not want!

     

    Go into

     

    @DayZ_Epoch_Server\addons\dayz_server\missions\DayZ_Epoch_11.Chernarus\dynamic_vehicle.sqf

     

    The format is the vehicle name and then how many can spawn. I have pulled out the boats whose names I recognise...remove them, reduce their spawns or choose which boats you want and do not want. Otherwise you can use the block of code in the spoiler and that will stop all boats from spawning. Note you can still buy them at traders.

     

    ["Fishing_Boat",3],  

    ["JetSkiYanahui_Case_Blue",1],
    ["JetSkiYanahui_Case_Green",1],
    ["JetSkiYanahui_Case_Red",1],
    ["JetSkiYanahui_Case_Yellow",1],

    ["PBX",3],

    ["RHIB",3],

    ["Smallboat_1",3], 

    ["Smallboat_2",3], 

    ["Zodiac",3],

     

    AllowedVehiclesList = [
    ["AH6X_DZ",3],
    ["AN2_DZ",3],
    ["ArmoredSUV_PMC_DZE",1],
    ["ATV_CZ_EP1",3],
    ["ATV_US_EP1",3],
    ["C130J_US_EP1_DZ",1],
    ["car_hatchback",3],
    ["car_sedan",3],
    ["CH_47F_EP1_DZE",1],
    ["CSJ_GyroC",3],
    ["CSJ_GyroCover",3],
    ["CSJ_GyroP",3],
    ["datsun1_civil_1_open",3],
    ["datsun1_civil_2_covered",3],
    ["datsun1_civil_3_open",3],
    //["Fishing_Boat",3], Removed
    ["GAZ_Vodnik_DZE",1],
    ["GAZ_Vodnik_MedEvac",1],
    ["GLT_M300_LT",3],
    ["GLT_M300_ST",3],
    ["GNT_C185",1],
    ["GNT_C185C",1],
    ["GNT_C185R",1],
    ["GNT_C185U",1],
    ["hilux1_civil_1_open",3],
    ["hilux1_civil_2_covered",3],
    ["hilux1_civil_3_open_EP1",3],
    ["HMMWV_Ambulance",1],
    ["HMMWV_Ambulance_CZ_DES_EP1",1],
    ["HMMWV_DES_EP1",3],
    ["HMMWV_DZ",3],
    ["HMMWV_M1035_DES_EP1",1],
    ["HMMWV_M1151_M2_CZ_DES_EP1_DZE",1],
    ["HMMWV_M998A2_SOV_DES_EP1_DZE",1],
    ["Ikarus",3],
    ["Ikarus_TK_CIV_EP1",3],
    //["JetSkiYanahui_Case_Blue",1], Removed
    //["JetSkiYanahui_Case_Green",1], Removed
    //["JetSkiYanahui_Case_Red",1], Removed
    //["JetSkiYanahui_Case_Yellow",1], Removed
    ["Kamaz",3],
    ["KamazRefuel_DZ",1],
    ["Lada1",3],
    ["Lada1_TK_CIV_EP1",3],
    ["Lada2",3],
    ["Lada2_TK_CIV_EP1",3],
    ["LadaLM",3],
    ["LandRover_CZ_EP1",3],
    ["LandRover_MG_TK_EP1_DZE",1],
    ["LandRover_Special_CZ_EP1_DZE",1],
    ["LandRover_TK_CIV_EP1",3],
    ["M1030_US_DES_EP1",3],
    ["MH6J_DZ",3],
    ["Mi17_Civilian_DZ",3],
    ["Mi17_DZE",3],
    ["MMT_Civ",6],
    ["MtvrRefuel_DES_EP1_DZ",1],
    ["MTVR_DES_EP1",3],
    ["MV22_DZ",1],
    ["Offroad_DSHKM_Gue_DZE",3],
    ["Old_bike_TK_INS_EP1",3],
    ["Old_moto_TK_Civ_EP1",3],
    //["PBX",3], Removed
    ["Pickup_PK_GUE_DZE",3],
    ["Pickup_PK_INS_DZE",3],
    ["Pickup_PK_TK_GUE_EP1_DZE",3],
    //["RHIB",3], Removed
    ["S1203_ambulance_EP1",3],
    ["S1203_TK_CIV_EP1",3],
    ["Skoda",3],
    ["SkodaBlue",3],
    ["SkodaGreen",3],
    ["SkodaRed",3],
    //["Smallboat_1",3], Removed
    //["Smallboat_2",3], Removed
    ["SUV_Blue",1],
    ["SUV_Camo",1],
    ["SUV_Charcoal",1],
    ["SUV_Green",1],
    ["SUV_Orange",1],
    ["SUV_Pink",1],
    ["SUV_Red",1],
    ["SUV_Silver",1],
    ["SUV_TK_CIV_EP1",1],
    ["SUV_White",1],
    ["SUV_Yellow",1],
    ["tractor",3],
    ["TT650_Civ",3],
    ["TT650_Ins",3],
    ["TT650_TK_CIV_EP1",3],
    ["UAZ_CDF",3],
    ["UAZ_INS",3],
    ["UAZ_MG_TK_EP1_DZE",3],
    ["UAZ_RU",3],
    ["UAZ_Unarmed_TK_CIV_EP1",3],
    ["UAZ_Unarmed_TK_EP1",3],
    ["UAZ_Unarmed_UN_EP1",3],
    ["UH1H_DZE",2],
    ["UH1Y_DZE",2],
    ["UH60M_EP1_DZE",1],
    ["UralRefuel_TK_EP1_DZ",1],
    ["Ural_CDF",3],
    ["Ural_TK_CIV_EP1",3],
    ["Ural_UN_EP1",3],
    ["V3S_Open_TK_CIV_EP1",3],
    ["V3S_Open_TK_EP1",3],
    ["V3S_Refuel_TK_GUE_EP1_DZ",1],
    ["VolhaLimo_TK_CIV_EP1",3],
    ["Volha_1_TK_CIV_EP1",3],
    ["Volha_2_TK_CIV_EP1",3],
    ["VWGolf",3],
    //["Zodiac",3], Removed
    ["CH53_DZE",1]
    ];
    

  5. Very interesting and thought provoking. A bit beyond my level of technical understanding but it makes sense. I was working along the lines of increasing server performance but what you say about offloading things like the object_helpers to clients makes sense (I believe thats how dayz handles zombies too). I know of headless client solutions and others too. 

     

    I suppose in the battle to keep mission file sizes down it would be nice to be able to leave a lot of the scripts serverside (like your bike example) where they can live in the server files and have little to no impact on performance and keep others such as SBP locally. Ultimately though I find that your discussion regarding taking only the CUSTOM parts of variables.sqf and compiles.sqf already makes a HUGE difference. Also diffmerging mods that use common files such as playerbuild.sqf for instance. 

     

    Some other mods also seem poorly constructed and use several files to do what could be done in one file with an array (I reckon it is because not everyone is a coding wizard :P ) such as the older deployables scripts where you needed a file for every deployable you wished to create etc. Through optimisations of these mods and different version releases for compatibility (Such as Vector building releasing different compatible versions for different mod combinations). I have found that the community is starting to reap some benefit.

     

    The other killer on mission file sizes is custom loading screens, custom audio (intro music ) and also custom textures for clothing or vehicles. A really simple thing but it often goes unnoticed! 

  6. First off, great video! Your videos may be 1+ hours long but they are always worth it.

     

    I have a question regarding the first part of your video, in particular the way in which the server initialises and uses the MPmission. The format etc you have used is default where init.sqf initialises the custom compiles.sqf and variables.sqf but I have noticed that some groups such as Vilayer and other hosts (also CCG clan) have exceptionally different formatting of their missions. Why is this? Is there any benefit?

     

    I am assuming you can host some of your mission file mods in your server files to prevent clients from being able to access them afterwards (ie theft/copying) but it comes at the cost of server performance because the files are not stored locally on the client pc?

     

    Any insight will be appreciated.

  7. Thanks for the reply RimBlock,

     

    I am using the version provided with the section that is preconfigured for compatibility with your mod and Raymix's Snap Build Pro. I am not sure which version that is however. (when I compared them with my standard APfL install (fused with snapbuilds playerbuild.sqf) there were no differences except for the vector build additions so I just used the one provided. Having looked at it I am fairly certain it is the current stable version released. 

     

    So in theory, if I use the lines 22 and the block from line 122 -> 182 that you linked, and add that to the elevator_build.sqf it should then do the ownership and tagged friendly check. got it.

     

    Essentially I am trying to prevent a glitch that allows people to build elevators within the boundaries of someone else's plot pole because the elevator build script did not account for this. It is simple in theory but in reality it is the variables that confuse me. I am new to scripting so this one is a challenge but I will take your suggestions and give it a crack! 

     

    Thank you for your time

  8. In short it is possible, 

     

    Search to find where DZE_helilift (whatever it is called) is actually called from and you will be able to find the config for it. I know I have seen it before but I cannot for the life of me remember where. I wish I could be more help but I am swamped with work atm.

     

    If you are still stuck let me know and I will try to help you further

  9. I am trying to use Plot Pole for Life's plot pole checking functions for the elevator script by Axecop. Essentially I only want plot pole owners and tagged friendlies to be able to build elevators and elevator stops around their bases, not randoms. I have tried and failed and thus am asking for help :) the non plot pole for life version does not work on my server unfortunately as it wont detect my player as being near a plot pole even when I am standing right next to it. I know it has something to do with UIDs, PUIDs etc but I lack the necessary scripting knowledge to solve the problem.

     

    Elevator Build Script

     

    elevator_build.sqf (vanilla)

    private ["_args","_option","_obj","_id","_elevatorStop","_dist"];
    
    if (DZE_ActionInProgress) exitWith { cutText ["Upgrade already in progress." , "PLAIN DOWN"]; };
    DZE_ActionInProgress = true;
    
    player removeAction s_player_elevator_upgrade;
    s_player_elevator_upgrade = 1;
    player removeAction s_player_elevator_upgrade_stop;
    s_player_elevator_upgrade_stop = 1;
    
    _args = _this select 3;
    _option = _args select 0;
    switch (_option) do {
    	case "build": {
    		_obj = _args select 1;
    		_id = [_obj] call ELE_fnc_generateElevatorId;
    		if (_id == "") exitWith { cutText ["invalid elevator ID generated", "PLAIN"] };
    		if ((ELE_RequiredBuildTools call AC_fnc_hasTools) && {ELE_RequiredBuildItems call AC_fnc_checkAndRemoveRequirements}) then {
    			["Medic", ELE_MaxRange] call AC_fnc_doAnimationAndAlertZombies;
    			ELE_elevator = [_obj, _id] call AC_fnc_swapObject;
    			titleText ["Elevator Built", "PLAIN"];
    		};
    	};
    	case "build_stop": {
    		_obj = _args select 1;
    		if (isNil "ELE_elevator") exitWith { cutText ["no elevator selected", "PLAIN"] };
    		_dist = _obj distance ELE_elevator;
    		if (_dist > ELE_MaxRange) exitWith { cutText [format["Elevator Stop is to far away from Elevator (%1 > %2)", _dist, ELE_MaxRange], "PLAIN"] };
    		_id = [ELE_elevator] call ELE_fnc_getNextStopId;
    		if (_id == "") exitWith { cutText ["Elevator Stop already exists or to many (max. 9 per Elevator)", "PLAIN"] };
    		if ((ELE_RequiredBuildTools call AC_fnc_hasTools) && {ELE_RequiredBuildStopItems call AC_fnc_checkAndRemoveRequirements}) then {
    			["Medic", ELE_MaxRange] call AC_fnc_doAnimationAndAlertZombies;
    			_elevatorStop = [_obj, _id, ELE_StopClass] call AC_fnc_swapObject;
    			titleText ["Elevator Stop Built", "PLAIN"];
    		};
    	};
    };
    
    DZE_ActionInProgress = false;
    s_player_elevator_upgrade = -1;
    s_player_elevator_upgrade_stop = -1;
    
    

     

    Solution (for epoch without PP4L)

     

    elevator_build.sqf 

    
    
    private ["_args","_option","_obj","_id","_elevatorStop","_dist","_canBuildOnPlot","_distance","_needText","_findNearestPoles","_findNearestPole","_IsNearPlot","_nearestPole","_ownerID","dayz_characterID","_friendlies"];
     
    if (DZE_ActionInProgress) exitWith { cutText ["Upgrade already in progress." , "PLAIN DOWN"]; };
    DZE_ActionInProgress = true;
     
    player removeAction s_player_elevator_upgrade;
    s_player_elevator_upgrade = 1;
    player removeAction s_player_elevator_upgrade_stop;
    s_player_elevator_upgrade_stop = 1;
     
    // check for near plot
    _canBuildOnPlot = false;
    _distance = DZE_PlotPole select 0;
    _needText = localize "str_epoch_player_246";
    _findNearestPoles = nearestObjects [(vehicle player), ["Plastic_Pole_EP1_DZ"], _distance];
    _findNearestPole = [];
     
     
    {
    if (alive _x) then {
    _findNearestPole set [(count _findNearestPole),_x];
    };
    } foreach _findNearestPoles;
     
     
    _IsNearPlot = count (_findNearestPole);
     
     
    if(_IsNearPlot == 0) then {
    _canBuildOnPlot = true;
    } else {
    // Since there are plots nearby we check for ownership and then for friend status 
    // check nearby plots ownership and then for friend status
    _nearestPole = _findNearestPole select 0;
    // Find owner 
    _ownerID = _nearestPole getVariable["CharacterID","0"];
    // diag_log format["DEBUG BUILDING: %1 = %2", dayz_characterID, _ownerID];
    // check if friendly to owner
    if(dayz_characterID == _ownerID) then {  //Keep ownership
    // owner can build anything within his plot except other plots
    _canBuildOnPlot = true; 
    } else {
    _friendlies = player getVariable ["friendlyTo",[]];
    // check if friendly to owner
    if(_ownerID in _friendlies) then {
    _canBuildOnPlot = true;
    };
    };
    };
    if(!_canBuildOnPlot) exitWith {  DZE_ActionInProgress = false; cutText [format[(localize "STR_EPOCH_PLAYER_135"),_needText,_distance] , "PLAIN DOWN"]; };
     
    _args = _this select 3;
    _option = _args select 0;
    switch (_option) do {
    case "build": {
    _obj = _args select 1;
    _id = [_obj] call ELE_fnc_generateElevatorId;
    if (_id == "") exitWith { cutText ["invalid elevator ID generated", "PLAIN"] };
    if ((ELE_RequiredBuildTools call AC_fnc_hasTools) && {ELE_RequiredBuildItems call AC_fnc_checkAndRemoveRequirements}) then {
    ["Medic", ELE_MaxRange] call AC_fnc_doAnimationAndAlertZombies;
    ELE_elevator = [_obj, _id] call AC_fnc_swapObject;
    titleText ["Elevator Built", "PLAIN"];
    };
    };
    case "build_stop": {
    _obj = _args select 1;
    if (isNil "ELE_elevator") exitWith { cutText ["no elevator selected", "PLAIN"] };
    _dist = _obj distance ELE_elevator;
    if (_dist > ELE_MaxRange) exitWith { cutText [format["Elevator Stop is to far away from Elevator (%1 > %2)", _dist, ELE_MaxRange], "PLAIN"] };
    _id = [ELE_elevator] call ELE_fnc_getNextStopId;
    if (_id == "") exitWith { cutText ["Elevator Stop already exists or to many (max. 9 per Elevator)", "PLAIN"] };
    if ((ELE_RequiredBuildTools call AC_fnc_hasTools) && {ELE_RequiredBuildStopItems call AC_fnc_checkAndRemoveRequirements}) then {
    ["Medic", ELE_MaxRange] call AC_fnc_doAnimationAndAlertZombies;
    _elevatorStop = [_obj, _id, ELE_StopClass] call AC_fnc_swapObject;
    titleText ["Elevator Stop Built", "PLAIN"];
    };
    };
    };
     
    DZE_ActionInProgress = false;
    s_player_elevator_upgrade = -1;
    s_player_elevator_upgrade_stop = -1;

     

     

     

    Solution (for epoch with PP4L)

     

    ?????????????

     

    Unsure how to properly merge only the owner and tagged friendly pieces of the PP4L player_build.sqf because it uses PUID and other variables and I am not sure exactly how they interact. I use a version of Vector Building which includes snap pro and plot pole for life etc. The player_build.sqf is linked below

     

    player_build.sqf

    /*
    	DayZ Base Building
    	Made for DayZ Epoch please ask permission to use/edit/distrubute email [email protected].
    */
    private ["_helperColor","_objectHelper","_objectHelperDir","_objectHelperPos","_canDo",
    "_location","_dir","_classname","_item","_hasrequireditem","_missing","_hastoolweapon","_cancel","_reason","_started","_finished","_animState","_isMedic","_dis","_sfx","_hasbuilditem","_tmpbuilt","_onLadder","_isWater","_require","_text","_offset","_IsNearPlot","_isOk","_location1","_location2","_counter","_limit","_proceed","_num_removed","_position","_object","_canBuildOnPlot","_friendlies","_nearestPole","_ownerID","_findNearestPoles","_findNearestPole","_distance","_classnametmp","_ghost","_isPole","_needText","_lockable","_zheightchanged","_rotate","_combination_1","_combination_2","_combination_3","_combination_4","_combination","_combination_1_Display","_combinationDisplay","_zheightdirection","_abort","_isNear","_need","_needNear","_vehicle","_inVehicle","_requireplot","_objHDiff","_isLandFireDZ","_isTankTrap","_ownerPUID","_playerUID"];
    
    DZE_BuildVector = [[0,0,0],[0,0,0]];
    
    if(DZE_ActionInProgress) exitWith { cutText [(localize "str_epoch_player_40") , "PLAIN DOWN"]; };
    DZE_ActionInProgress = true;
    
    // disallow building if too many objects are found within 30m
    if((count ((getPosATL player) nearObjects ["All",30])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_41"), "PLAIN DOWN"];};
    
    _onLadder =		(getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
    _isWater = 		dayz_isSwimming;
    _cancel = false;
    _reason = "";
    _canBuildOnPlot = false;
    
    _vehicle = vehicle player;
    _inVehicle = (_vehicle != player);
    _playerUID = getPlayerUID player;
    
    //snap vars -- temporary fix for errors so variables.sqf can be skipped
    if (isNil "snapProVariables") then {
    	if (isNil "DZE_snapExtraRange") then {
    		DZE_snapExtraRange = 0;
    	};
    	s_player_toggleSnap = -1;
    	s_player_toggleSnapSelect = -1;
    	s_player_toggleSnapSelectPoint=[];
    	snapActions = -1;
    	snapGizmos = [];
    	snapGizmosNearby = [];
    	snapProVariables = true; // will skip this statement from now on.
    };
    // snap vars
    
    helperDetach = false; 
    
    _canDo = (!r_drag_sqf and !r_player_unconscious);
    
    _vector = [];
    
    fnc_SetPitchBankYawBuild = { 
        private ["_object","_rotations","_aroundX","_aroundY","_aroundZ","_dirX","_dirY","_dirZ","_upX","_upY","_upZ","_dir","_up","_dirXTemp",
        "_upXTemp"];
        _object = _this select 0; 
        _rotations = _this select 1; 
        _aroundX = _rotations select 0; 
        _aroundY = _rotations select 1; 
        _aroundZ = (360 - (_rotations select 2)) - 360; 
        _dirX = 0; 
        _dirY = 1; 
        _dirZ = 0; 
        _upX = 0; 
        _upY = 0; 
        _upZ = 1; 
        if (_aroundX != 0) then { 
            _dirY = cos _aroundX; 
            _dirZ = sin _aroundX; 
            _upY = -sin _aroundX; 
            _upZ = cos _aroundX; 
        }; 
        if (_aroundY != 0) then { 
            _dirX = _dirZ * sin _aroundY; 
            _dirZ = _dirZ * cos _aroundY; 
            _upX = _upZ * sin _aroundY; 
            _upZ = _upZ * cos _aroundY; 
        }; 
        if (_aroundZ != 0) then { 
            _dirXTemp = _dirX; 
            _dirX = (_dirXTemp* cos _aroundZ) - (_dirY * sin _aroundZ); 
            _dirY = (_dirY * cos _aroundZ) + (_dirXTemp * sin _aroundZ);        
            _upXTemp = _upX; 
            _upX = (_upXTemp * cos _aroundZ) - (_upY * sin _aroundZ); 
            _upY = (_upY * cos _aroundZ) + (_upXTemp * sin _aroundZ); 		
        }; 
        _dir = [_dirX,_dirY,_dirZ]; 
        _up = [_upX,_upY,_upZ]; 
        _object setVectorDirAndUp [_dir,_up];
    	DZE_BuildVector = [_dir,_up];
    }; 
    
    DZE_Q = false;
    DZE_Z = false;
    
    DZE_Q_alt = false;
    DZE_Z_alt = false;
    
    DZE_Q_ctrl = false;
    DZE_Z_ctrl = false;
    
    DZE_5 = false;
    DZE_4 = false;
    DZE_6 = false;
    DZE_F = false;
    
    DZE_cancelBuilding = false;
    
    call gear_ui_init;
    closeDialog 1;
    
    if (_isWater) exitWith {DZE_ActionInProgress = false; cutText [localize "str_player_26", "PLAIN DOWN"];};
    if (_inVehicle) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_42"), "PLAIN DOWN"];};
    if (_onLadder) exitWith {DZE_ActionInProgress = false; cutText [localize "str_player_21", "PLAIN DOWN"];};
    if (player getVariable["combattimeout", 0] >= time) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_43"), "PLAIN DOWN"];};
    
    _item =	_this;
    
    // Need Near Requirements
    _abort = false;
    _reason = "";
    
    _needNear = 	getArray (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "neednearby");
    
    {
    	switch(_x) do{
    		case "fire":
    		{
    			_distance = 3;
    			_isNear = {inflamed _x} count (getPosATL player nearObjects _distance);
    			if(_isNear == 0) then {
    				_abort = true;
    				_reason = "fire";
    			};
    		};
    		case "workshop":
    		{
    			_distance = 3;
    			_isNear = count (nearestObjects [player, ["Wooden_shed_DZ","WoodShack_DZ","WorkBench_DZ"], _distance]);
    			if(_isNear == 0) then {
    				_abort = true;
    				_reason = "workshop";
    			};
    		};
    		case "fueltank":
    		{
    			_distance = 30;
    			_isNear = count (nearestObjects [player, dayz_fuelsources, _distance]);
    			if(_isNear == 0) then {
    				_abort = true;
    				_reason = "fuel tank";
    			};
    		};
    	};
    } forEach _needNear;
    
    
    if(_abort) exitWith {
    	cutText [format[(localize "str_epoch_player_135"),_reason,_distance], "PLAIN DOWN"];
    	DZE_ActionInProgress = false;
    };
    
    _classname = 	getText (configFile >> "CfgMagazines" >> _item >> "ItemActions" >> "Build" >> "create");
    _classnametmp = _classname;
    _require =  getArray (configFile >> "cfgMagazines" >> _this >> "ItemActions" >> "Build" >> "require");
    _text = 		getText (configFile >> "CfgVehicles" >> _classname >> "displayName");
    _ghost = getText (configFile >> "CfgVehicles" >> _classname >> "ghostpreview");
    
    _lockable = 0;
    if(isNumber (configFile >> "CfgVehicles" >> _classname >> "lockable")) then {
    	_lockable = getNumber(configFile >> "CfgVehicles" >> _classname >> "lockable");
    };
    
    _requireplot = DZE_requireplot;
    if(isNumber (configFile >> "CfgVehicles" >> _classname >> "requireplot")) then {
    	_requireplot = getNumber(configFile >> "CfgVehicles" >> _classname >> "requireplot");
    };
    
    _isAllowedUnderGround = 1;
    if(isNumber (configFile >> "CfgVehicles" >> _classname >> "nounderground")) then {
    	_isAllowedUnderGround = getNumber(configFile >> "CfgVehicles" >> _classname >> "nounderground");
    };
    
    _offset = 	getArray (configFile >> "CfgVehicles" >> _classname >> "offset");
    if((count _offset) <= 0) then {
    	_offset = [0,1.5,0];
    };
    
    _isPole = (_classname == "Plastic_Pole_EP1_DZ");
    _isLandFireDZ = (_classname == "Land_Fire_DZ");
    
    _distance = DZE_PlotPole select 0;
    _needText = localize "str_epoch_player_246";
    
    if(_isPole) then {
    	_distance = DZE_PlotPole select 1;
    };
    
    // check for near plot
    _findNearestPoles = nearestObjects [(vehicle player), ["Plastic_Pole_EP1_DZ"], _distance];
    _findNearestPole = [];
    
    {
    	if (alive _x) then {
    		_findNearestPole set [(count _findNearestPole),_x];
    	};
    } count _findNearestPoles;
    
    _IsNearPlot = count (_findNearestPole);
    
    // If item is plot pole && another one exists within 45m
    if(_isPole && _IsNearPlot > 0) exitWith {  DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_44") , "PLAIN DOWN"]; };
    
    if(_IsNearPlot == 0) then {
    
    	// Allow building of plot
    	if(_requireplot == 0 || _isLandFireDZ) then {
    		_canBuildOnPlot = true;
    	};
    
    } else {
    	// Since there are plots nearby we check for ownership && then for friend status
    
    	// check nearby plots ownership && then for friend status
    	_nearestPole = _findNearestPole select 0;
    
    	// Find owner
    	_ownerID = _nearestPole getVariable ["ownerPUID","0"];
    
    	 diag_log format["Player_build start: [PlayerUID = %1]  [OwnerID = %2]", _playerUID, _ownerID];
    
    	// check if friendly to owner
    	if(_playerUID == _ownerID) then {  //Keep ownership
    		// owner can build anything within his plot except other plots
    		diag_log text "Player is owner";
    		if(!_isPole) then {
    			_canBuildOnPlot = true;
    		};
    	} else {
    		// disallow building plot
    		if(!_isPole) then {
    			_friendlies		= player getVariable ["friendlyTo",[]];
    			// check if friendly to owner
    			if(_ownerID in _friendlies) then {
    				_canBuildOnPlot = true;
    			};
    		};
    	};
    };
    
    // _message
    if(!_canBuildOnPlot) exitWith {  DZE_ActionInProgress = false; cutText [format[(localize "STR_EPOCH_PLAYER_135"),_needText,_distance] , "PLAIN DOWN"]; };
    
    _missing = "";
    _hasrequireditem = true;
    {
    	_hastoolweapon = _x in weapons player;
    	if(!_hastoolweapon) exitWith { _hasrequireditem = false; _missing = getText (configFile >> "cfgWeapons" >> _x >> "displayName"); };
    } count _require;
    
    _hasbuilditem = _this in magazines player;
    if (!_hasbuilditem) exitWith {DZE_ActionInProgress = false; cutText [format[(localize "str_player_31"),_text,"build"] , "PLAIN DOWN"]; };
    
    if (!_hasrequireditem) exitWith {DZE_ActionInProgress = false; cutText [format[(localize "str_epoch_player_137"),_missing] , "PLAIN DOWN"]; };
    if (_hasrequireditem) then {
    
    	_location = [0,0,0];
    	_isOk = true;
    
    	// get inital players position
    	_location1 = getPosATL player;
    	_dir = getDir player;
    
    	// if ghost preview available use that instead
    	/*if (_ghost != "") then {
    		_classname = _ghost;
    	};*/
    
    	_object = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
    	_object setDir 0;
    	//Build gizmo
    	_objectHelper = "Sign_sphere10cm_EP1" createVehicle _location;
    	_helperColor = "#(argb,8,8,3)color(0,0,0,0,ca)";
    	_objectHelper setobjecttexture [0,_helperColor];
    	_objectHelper attachTo [player,_offset];
    	_object attachTo [_objectHelper,[0,0,0]];
    	_position = getPosATL _objectHelper;
    	
    	//cutText [(localize "str_epoch_player_45"), "PLAIN DOWN"];
    
    	_objHDiff = 0;
    
    	if (isClass (missionConfigFile >> "SnapBuilding" >> _classname)) then {	
    		["","","",["Init",_object,_classname,_objectHelper]] spawn snap_build;
    	};
    
    	DZE_updateVec = false;
    	DZE_memDir = getDir _objectHelper;
    	DZE_memForBack = 0;
    	DZE_memLeftRight = 0;
    	if !(_classname in DZE_noRotate) then{
    		s_player_setVectorsReset = player addaction ["Reset","Mods\SnapBuildPro\player_vectorChange.sqf","reset"];
    		s_player_setVectorsForward = player addaction ["Pitch Forward","Mods\SnapBuildPro\player_vectorChange.sqf","forward"];
    		s_player_setVectorsBack = player addaction ["Pitch Back","Mods\SnapBuildPro\player_vectorChange.sqf","back"];
    		s_player_setVectorsLeft = player addaction ["Bank Left","Mods\SnapBuildPro\player_vectorChange.sqf","left"];
    		s_player_setVectorsRight = player addaction ["Bank Right","Mods\SnapBuildPro\player_vectorChange.sqf","right"];
    		s_player_setVectors1 = player addaction ["Increment by 1 degree","Mods\SnapBuildPro\player_vectorChange.sqf","1"];
    		s_player_setVectors5 = player addaction ["Increment by 5 degrees","Mods\SnapBuildPro\player_vectorChange.sqf","5"];
    		s_player_setVectors45 = player addaction ["Increment by 45 degrees","Mods\SnapBuildPro\player_vectorChange.sqf","45"];
    		s_player_setVectors90 = player addaction ["Increment by 90 degrees","Mods\SnapBuildPro\player_vectorChange.sqf","90"];
    	};
    	
    	while {_isOk} do {
    
    		_zheightchanged = false;
    		_zheightdirection = "";
    		_rotate = false;
    
    		if (DZE_Q) then {
    			DZE_Q = false;
    			_zheightdirection = "up";
    			_zheightchanged = true;
    		};
    		if (DZE_Z) then {
    			DZE_Z = false;
    			_zheightdirection = "down";
    			_zheightchanged = true;
    		};
    		if (DZE_Q_alt) then {
    			DZE_Q_alt = false;
    			_zheightdirection = "up_alt";
    			_zheightchanged = true;
    		};
    		if (DZE_Z_alt) then {
    			DZE_Z_alt = false;
    			_zheightdirection = "down_alt";
    			_zheightchanged = true;
    		};
    		if (DZE_Q_ctrl) then {
    			DZE_Q_ctrl = false;
    			_zheightdirection = "up_ctrl";
    			_zheightchanged = true;
    		};
    		if (DZE_Z_ctrl) then {
    			DZE_Z_ctrl = false;
    			_zheightdirection = "down_ctrl";
    			_zheightchanged = true;
    		};
    		if (DZE_4) then {
    			_rotate = true;
    			DZE_4 = false;
    			if (helperDetach) then {
    				_dir = -45;
    				DZE_memDir = DZE_memDir - 45;
    			} else {
    				_dir = 180;
    				DZE_memDir = 180;
    			};
    		};
    		if (DZE_6) then {
    			_rotate = true;
    			DZE_6 = false;
    			if (helperDetach) then {
    				_dir = 45;
    				DZE_memDir = DZE_memDir + 45;
    			} else {
    				_dir = 0;
    				DZE_memDir = 0;
    			};
    		};
    		
    		if(DZE_updateVec) then{
    			[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYawBuild;
    			DZE_updateVec = false;
    		};
    		
    		if (DZE_F and _canDo) then {
    		
    			if (helperDetach) then {
    				_objectHelper attachTo [player];
    				DZE_memDir = DZE_memDir-(getDir player);
    				helperDetach = false;
    				[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYawBuild;
    			} else {		
    				_objectHelperPos = getPosATL _objectHelper;
    				detach _objectHelper;			
    				DZE_memDir = getDir _objectHelper;
    				[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYawBuild;
    				_objectHelper setPosATL _objectHelperPos;
    				_objectHelper setVelocity [0,0,0]; //fix sliding glitch
    				helperDetach = true;
    			};
    			DZE_F = false;
    		};
    
    		if(_rotate) then {
    			[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYawBuild;
    		};
    
    		if(_zheightchanged) then {
    			if (!helperDetach) then {
    			detach _objectHelper;
    			};
    
    			_position = getPosATL _objectHelper;
    
    			if(_zheightdirection == "up") then {
    				_position set [2,((_position select 2)+0.1)];
    				_objHDiff = _objHDiff + 0.1;
    			};
    			if(_zheightdirection == "down") then {
    				_position set [2,((_position select 2)-0.1)];
    				_objHDiff = _objHDiff - 0.1;
    			};
    
    			if(_zheightdirection == "up_alt") then {
    				_position set [2,((_position select 2)+1)];
    				_objHDiff = _objHDiff + 1;
    			};
    			if(_zheightdirection == "down_alt") then {
    				_position set [2,((_position select 2)-1)];
    				_objHDiff = _objHDiff - 1;
    			};
    
    			if(_zheightdirection == "up_ctrl") then {
    				_position set [2,((_position select 2)+0.01)];
    				_objHDiff = _objHDiff + 0.01;
    			};
    			if(_zheightdirection == "down_ctrl") then {
    				_position set [2,((_position select 2)-0.01)];
    				_objHDiff = _objHDiff - 0.01;
    			};
    
    			_objectHelper setDir (getDir _objectHelper);
    
    			if((_isAllowedUnderGround == 0) && ((_position select 2) < 0)) then {
    				_position set [2,0];
    			};
    
    			_objectHelper setPosATL _position;
    
    			//diag_log format["DEBUG Change BUILDING POS: %1", _position];
    
    			if (!helperDetach) then {
    				_objectHelper attachTo [player];
    			};
    			
    			[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYawBuild;
    		};
    
    		sleep 0.5;
    
    		_location2 = getPosATL player;
    		_objectHelperPos = getPosATL _objectHelper;
    		
    		if(DZE_5) exitWith {
    			_isOk = false;
    			detach _object;			
    			_dir = getDir _object;
    			_vector = [(vectorDir _object),(vectorUp _object)];	
    			_position = getPosATL _object;
    			//diag_log format["DEBUG BUILDING POS: %1", _position];
    			deleteVehicle _object;
    			detach _objectHelper;
    			deleteVehicle _objectHelper;
    		};
    
    		if(_location1 distance _location2 > 10) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "You've moved to far away from where you started building (within 10 meters)";
    			detach _object;
    			deleteVehicle _object;
    			detach _objectHelper;
    			deleteVehicle _objectHelper;
    		};
    		
    		if(_location1 distance _objectHelperPos > 10) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Object is placed to far away from where you started building (within 10 meters)";
    			detach _object;
    			deleteVehicle _object;
    			detach _objectHelper;
    			deleteVehicle _objectHelper;
    		};
    
    		if(abs(_objHDiff) > 10) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Cannot move up or down more than 10 meters";
    			detach _object;
    			deleteVehicle _object;
    			detach _objectHelper;
    			deleteVehicle _objectHelper;
    		};
    
    		if (player getVariable["combattimeout", 0] >= time) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = (localize "str_epoch_player_43");
    			detach _object;
    			deleteVehicle _object;
    			detach _objectHelper;
    			deleteVehicle _objectHelper;
    		};
    
    		if (DZE_cancelBuilding) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Cancelled building.";
    			detach _object;
    			deleteVehicle _object;
    			detach _objectHelper;
    			deleteVehicle _objectHelper;
    		};
    	};
    	
    	if !(_classname in DZE_noRotate) then{
    		player removeAction s_player_setVectorsReset;
    		player removeAction s_player_setVectorsForward;
    		player removeAction s_player_setVectorsBack;
    		player removeAction s_player_setVectorsLeft;
    		player removeAction s_player_setVectorsRight;
    		player removeAction s_player_setVectors1;
    		player removeAction s_player_setVectors5;
    		player removeAction s_player_setVectors45;
    		player removeAction s_player_setVectors90;
    	};	
    	
    	//No building on roads unless toggled
    	if (!DZE_BuildOnRoads) then {
    		if (isOnRoad _position) then { _cancel = true; _reason = "Cannot build on a road."; };
    	};
    
    	// No building in trader zones
    	if(!canbuild) then { _cancel = true; _reason = "Cannot build in a city."; };
    
    	if(!_cancel) then {
    
    		_classname = _classnametmp;
    
    		// Start Build
    		_tmpbuilt = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
    
    		_tmpbuilt setdir _dir;
    
    		// Get position based on object
    		_location = _position;
    
    		if((_isAllowedUnderGround == 0) && ((_location select 2) < 0)) then {
    			_location set [2,0];
    		};
    
    		_tmpbuilt setVectorDirAndUp _vector;
    		_tmpbuilt setPosATL _location;
    
    
    		cutText [format[(localize "str_epoch_player_138"),_text], "PLAIN DOWN"];
    
    		_limit = 3;
    
    		if (DZE_StaticConstructionCount > 0) then {
    			_limit = DZE_StaticConstructionCount;
    		}
    		else {
    			if (isNumber (configFile >> "CfgVehicles" >> _classname >> "constructioncount")) then {
    				_limit = getNumber(configFile >> "CfgVehicles" >> _classname >> "constructioncount");
    			};
    		};
    
    		_isOk = true;
    		_proceed = false;
    		_counter = 0;
    
    		while {_isOk} do {
    
    			[10,10] call dayz_HungerThirst;
    			player playActionNow "Medic";
    
    			_dis=20;
    			_sfx = "repair";
    			[player,_sfx,0,false,_dis] call dayz_zombieSpeak;
    			[player,_dis,true,(getPosATL player)] spawn player_alertZombies;
    
    			r_interrupt = false;
    			r_doLoop = true;
    			_started = false;
    			_finished = false;
    
    			while {r_doLoop} do {
    				_animState = animationState player;
    				_isMedic = ["medic",_animState] call fnc_inString;
    				if (_isMedic) then {
    					_started = true;
    				};
    				if (_started && !_isMedic) then {
    					r_doLoop = false;
    					_finished = true;
    				};
    				if (r_interrupt || (player getVariable["combattimeout", 0] >= time)) then {
    					r_doLoop = false;
    				};
    				if (DZE_cancelBuilding) exitWith {
    					r_doLoop = false;
    				};
    				sleep 0.1;
    			};
    			r_doLoop = false;
    
    
    			if(!_finished) exitWith {
    				_isOk = false;
    				_proceed = false;
    			};
    
    			if(_finished) then {
    				_counter = _counter + 1;
    			};
    
    			cutText [format[(localize "str_epoch_player_139"),_text, _counter,_limit], "PLAIN DOWN"];
    
    			if(_counter == _limit) exitWith {
    				_isOk = false;
    				_proceed = true;
    			};
    
    		};
    
    		if (_proceed) then {
    
    			_num_removed = ([player,_item] call BIS_fnc_invRemove);
    			if(_num_removed == 1) then {
    
    				cutText [format[localize "str_build_01",_text], "PLAIN DOWN"];
    
    				if (_isPole) then {
    					[] spawn player_plotPreview;
    				};
    
    				_tmpbuilt setVariable ["OEMPos",_location,true];
    
    				if(_lockable > 1) then {
    
    					_combinationDisplay = "";
    
    					switch (_lockable) do {
    
    						case 2: { // 2 lockbox
    							_combination_1 = (floor(random 3)) + 100; // 100=red,101=green,102=blue
    							_combination_2 = floor(random 10);
    							_combination_3 = floor(random 10);
    							_combination = format["%1%2%3",_combination_1,_combination_2,_combination_3];
    							dayz_combination = _combination;
    							if (_combination_1 == 100) then {
    								_combination_1_Display = "Red";
    							};
    							if (_combination_1 == 101) then {
    								_combination_1_Display = "Green";
    							};
    							if (_combination_1 == 102) then {
    								_combination_1_Display = "Blue";
    							};
    							_combinationDisplay = format["%1%2%3",_combination_1_Display,_combination_2,_combination_3];
    						};
    
    						case 3: { // 3 combolock
    							_combination_1 = floor(random 10);
    							_combination_2 = floor(random 10);
    							_combination_3 = floor(random 10);
    							_combination = format["%1%2%3",_combination_1,_combination_2,_combination_3];
    							dayz_combination = _combination;
    							_combinationDisplay = _combination;
    						};
    
    						case 4: { // 4 safe
    							_combination_1 = floor(random 10);
    							_combination_2 = floor(random 10);
    							_combination_3 = floor(random 10);
    							_combination_4 = floor(random 10);
    							_combination = format["%1%2%3%4",_combination_1,_combination_2,_combination_3,_combination_4];
    							dayz_combination = _combination;
    							_combinationDisplay = _combination;
    						};
    					};
    
    					_tmpbuilt setVariable ["CharacterID",_combination,true];
    					_tmpbuilt setVariable ["ownerPUID",_playerUID,true];
    
    
    					PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location,_playerUID,_vector],_classname];
    					publicVariableServer "PVDZE_obj_Publish";
    
    					cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5];
    
    
    				} else {
    					_tmpbuilt setVariable ["CharacterID",dayz_characterID,true];
    					_tmpbuilt setVariable ["ownerPUID",_playerUID,true];
    					
    					// fire?
    					if(_tmpbuilt isKindOf "Land_Fire_DZ") then {
    						_tmpbuilt spawn player_fireMonitor;
    					} else {
    						PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location,_playerUID,_vector],_classname];
    						publicVariableServer "PVDZE_obj_Publish";
    					};
    				};
    			} else {
    				deleteVehicle _tmpbuilt;
    				cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
    			};
    
    		} else {
    			r_interrupt = false;
    			if (vehicle player == player) then {
    				[objNull, player, rSwitchMove,""] call RE;
    				player playActionNow "stop";
    			};
    
    			deleteVehicle _tmpbuilt;
    
    			cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
    		};
    
    	} else {
    		cutText [format[(localize "str_epoch_player_47"),_text,_reason], "PLAIN DOWN"];
    	};
    };
    
    DZE_ActionInProgress = false;
    
    

  10. Glad I could help man,

     

    If your server is just you and your friends then its not an issue but when you have a large player base all building several bases you will find object clutter becomes a real issue and manually cleaning it up is a pain. There are other SQL scripts out there written to remove some objects and ignore others etc etc but I do believe that the maintenance method using free plot pole maintenance is probably the best way currently available though.

     

    Either way at least you reached a workable solution

  11. There are 3 events, 1 sets damage over time, the other 2 clean up old objects. If you disable maintenance (the setdamageonage event) as well as setting the cleanup objects to -1 or 999, You will still find bases disappearing unless they interact with their base objects. 

     

    The easiest solution that I am aware of is to keep the events but make maintenance free, that way the objects get interacted with and do not get picked up by the cleanup scripts. Your server also doesnt get full of useless junk.

     

    There are guides on how to do that on the forums but if you cannot find them let me know

  12. aahhhh im also running a taviana server lol. i was wondering if you had any ai islands or anything for taviana

     

    There are not too many map edits out for tavi but if there is something really close to your heart that you think would be great for Tavi in general feel free to ask :) I may get one of my clannies to make it or even do it myself. Otherwise use the map editing guides I linked to, its really easy! (building a completely new landmass on the other hand....not so much)

    As for Tavi specific stuff I came across this which may tickle your fancy:

    http://epochservers.com/viewtopic.php?f=14&t=54

    This includes 3 different map edits in 1

    1) sabina tunnel block (a must to stop people crashing into the invisible wall)

    2) Prison island military base (Is that what you wanted?)

    3) Knin base thing (not too sure if I like this one)

     

     

     

    Great idea! You should add one with player GUIDs that are banned or something?! Great work!

     

    There is a major drawback to community ban lists...namely every server has its own set of rules and just because I ban you off my server for "griefing" or "disrepecting an admin" does not mean that it is legitimate, justified or even obejctively measurable. Who will check to ensure that bans are legitimate? The flip side is that bans for clear hacking etc is objective and the reasons for the banning is relatively clear. Either way I doubt that we will see another community ban list unless there is a rigid and transparent process which allows people to scrutinise the bans and uploaders to provide logs etc of who and what they did in order to justify the bans.

×
×
  • Create New...