Jump to content

RimBlock

Member
  • Posts

    1140
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by RimBlock

  1. Ok i'm kind of confused with the whole server_monitor business. Why not just leave it under server pbo\system\?

    Can do and just change the call in the init. Sqf.

    This way means people don't need to unpack the server pbo or load the server_monitor. Sqf back in and I don't need to write a tutorial for people who have not done it before, don't have the software and don't have to troubleshoot that going wrong.

    This way is simpler for new admins and easier to support.

  2. Ok, I am sorting out a solution to keep the server_monitor.sqf on the server only.

     

    Does everyone have access to the main server directory (the one with @Dayz_Epoch & @Dayz_epoch_server in) ?.

     

    I suspect some people do not but would like clarification.  

     

    For those with dedicated machine and full access I have sorted out the mod so the server_monitor.sqf does not need to be updated in the dayz_server.pbo but still only needs to sit on the server.

     

    For people with with hosting that does not allow access to the main server directory, the mod will have to have the server_monitor.sqf as part of the mission file.  I do not currently see any big issue with this as the version run will be from the mpmission folder on the server not on the client.

     

    Feedback welcome.

  3. The inability to downgrade the Cinder Garage Door is due to this mod (have just build and tested another vanilla test server).  Just trying to track back why....

     

    Ok, found the problem and have found a solution for it.  Will post up a new version later today.

     

    From now on I will be using the following naming convention.

     

    [Major Change] = i.e. Changing how the ownerUID is stored or an overhaul to allow this mod to exist with Epoch and be turned on or off.

    [Functional addition] = i.e. add building maintenance to the mod.

    [bugfix] = Any bug fix releases.

     

    The next version will be 2.1.1 and will be uploaded later today.

  4. Do not use the Player_Build i provided i must of broke something. The thing is now old safes can be unlocked but not re locked again but new ones work fine except only the person who placed it can lock it, is this done by design Rimblock?

     

    Thanks

     

    Looking at the code, yes it is by design by the Epoch team.  I have made no change to this logic, only that is uses the playerUID to check and where it gets it from.  Packing will also not work as for packing it locks the safe first.

     

    I can, however, give you some sql you can run to change the ownership of the safe to the owners playerUID (steamID) so it will work with this mod.

  5. Okay, i can confirm the problem you are experiencing. The safe deletes itself after you open them. It is NOT an infistar problem since i dont have that tool installed.

     

    How soon after you open them ?.

     

    I opened one, put a sandbag inside and then packed it without an issue.

     

    The safe is in the DB as well so not sure why this would be deleted as part of this mod.

     

    Has anyone tried doing the same with vanilla Epoch as I have seen a number of threads with safe issues posted since 1.0.5.

     

    Edit: one I noticed.

  6. But sure the player_build.sqf file shouldn't stop the option from appearing i thought that was all done in fn_selfactions?

     

    Sorry, not sure what you mean.

     

    I can choose to build a safe and actually build it.

    I can then choose to unlock the safe and unlock it.

    I can choose to lock or pack the safe and both the lock and pack actions are working for me.

    The safe is still there after reboot and all the actions appear as expected and the actual functions work as expected for me.

     

    If possible, it may be worth trying just this mod on its own and checking it is all working before adding anything else.  After that add one thing at a time and test.  A painful and laborious process but it can pick up a number of issues as you go rather than when it is all done and it feels like you are trying to find the end to a ball of wool.

     

    The remove lock and then remove door/doorway is not working still.  Did it work like that in vanilla Epoch as very little was changed, same with tagging.

     

    What exactly is not working with tagging.  Your old friends will need to be retagged as it is looking for playerUIDs now and not characterIDs.  You also may need to clear down the old tag ids in the character_data.currentstate field as the data will just grow and grow (there is no untagging).

  7. Ok, have tried the safe functionality and can build, unlock, lock, unlock, pack, build, restart server, log back in, unlock, lock.

     

    Seems it is working so most likely something else that is causing the problem.  

     

    Possibly the snapbuild especially as there seems to be a fair amount of issues with it based on the last two pages of posts.

     

    Would rather have this mod confirmed as working before bringing others in to the mix.

     

    Next is tagging.

  8. There's not a single piece of code from the snap builder in that, how would that ever work? Im not having any issues with the Plot Pole for Life mod, its just that i cant seem able to combine it with the snap build mod.

     

    Will have a look in a sec.  They should not affect each other and I would like to have the snapping working even on my test server.

     

    Ok, I have some SQL that will put a given value in to the right position in the worldspace field.  If you know the players value in the characterID relates to a SteamID then you can use it to update blocks of objects with a specific characterID.

     

    Any interest then I will pout it up.  It is for more experienced people though.

  9. It would be really nice if you wrote a tutorial for this script. I´m a "middlenoob" in scripting, and i have to see what changes were done in files. Only copy files over others don`t teach me anything, and i can`t fix bugs on my own. Your work here is great, and it`s ok if you say that would be to much work to explain every step. But i think i "speak" for many users here, so you can think about it. Perhaps i had misunderstood something, because i`m using only schoolenglish. Keep up you great work here :)

     

    Greetz, ed

     

    Hi Ed,

     

    I am going to provide a step by step guide to installing after I have the main bugs ironed out.  

     

    The logic of what the mod does is this (more or less).

     

    The ownersID (the SteamID) is saved in an objects worldspace field as an additional array on the end.  This is because what can be accessed from the DB by the game is very limited (deliberately so) by the hiveext.dll code.  A lot of mods place values they need to be persistent in the object_data.characterID field for the object in the DB.  Whilst this worked and was used by me for the Plot for Life v1 mod, I always wanted to move away from it to avoid clashes with other mods and as it is limited to numbers only.

     

    When the DB loads in I put this extra value in to a variable attached to the object being read or default it to "0" if the 'extra variable' does not exist.

     

    In each script that needs to check for the objects owner, it checks for the owners characterID against the objects characterID.  I am now getting it to check the new objectPUID variable against the playersUID (SteamID).

     

    The nice thing about this is that I have left more of the code using the characterID for the check in place so It could be amended to use either system based on a system variable the server owner sets.  I will look at that after the debugging settles down.

     

    Someone has proposed that this mod be included in the Epoch code on GitHub here.  I am all for it if I make it switchable so server Owners can choose to use it or not.  If you are in agreement then let vbawol know on the GitHub.

  10. Hi RimBlock,

    Great job so far, seems like i got it all working on 1.0.5.1 without much hassle.

    One thing though, i'm also using the Snap Build mod (extended v1.6. version) and both mods use the player_build.sqf so i merged them, but i think i did something wrong.

     

    player_build.sqf

     

    /*
    	DayZ Base Building
    	Made for DayZ Epoch please ask permission to use/edit/distrubute email [email protected].
    */
    private ["_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"];
    
    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;
    
    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_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 attachTo [player,_offset];
    
    	_position = getPosATL _object;
    
    	cutText [(localize "str_epoch_player_45"), "PLAIN DOWN"];
    		
    	/*
    		Build snapping
    	*/
    		
    		player allowDamage false;
    		SnappingOffset = _offset;
    		SnappingDir = 0;
    		SnappingSpotMarkers = [];
    		SnappingEnabled = false;
    		SnappedOffsetZ = 0;
    		SnappingResetPos = false;
    
    		if (isClass (missionConfigFile >> "SnapPoints" >> _classname)) then {
    			s_building_snapping = player addAction ["<t color=""#0000ff"">Toggle Snapping</t>", "custom\snap_build\player_toggleSnapping.sqf",_classname, 3, true, false, "",""];
    		};
    
    		_snapper = [_object, _classname] spawn snap_object;
    		_key_monitor = [_isAllowedUnderGround] spawn player_buildControls ;
    	
    	/*
    		/ Build snapping
    	*/
    	
    	_objHDiff = 0;
    
    	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;
    			_dir = 180;
    		};
    		if (DZE_6) then {
    			_rotate = true;
    			DZE_6 = false;
    			_dir = 0;
    		};
    
    		if(_rotate) then {
    			_object setDir _dir;
    			_object setPosATL _position;
    			//diag_log format["DEBUG Rotate BUILDING POS: %1", _position];
    		};
    
    		if(_zheightchanged) then {
    			detach _object;
    
    			_position = getPosATL _object;
    
    			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;
    			};
    
    			_object setDir (getDir _object);
    
    			if((_isAllowedUnderGround == 0) && ((_position select 2) < 0)) then {
    				_position set [2,0];
    			};
    
    			_object setPosATL _position;
    
    			//diag_log format["DEBUG Change BUILDING POS: %1", _position];
    
    			_object attachTo [player];
    
    		};
    
    		sleep 0.5;
    
    		_location2 = getPosATL player;
    
    		if(DZE_5) exitWith {
    			_isOk = false;
    			detach _object;
    			_dir = getDir _object;
    			_position = getPosATL _object;
    			//diag_log format["DEBUG BUILDING POS: %1", _position];
    			deleteVehicle _object;
    		};
    
    		if(_location1 distance _location2 > 5) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "You've moved to far away from where you started building (within 5 meters)";
    			detach _object;
    			deleteVehicle _object;
    		};
    		
    		/*
    			Build Snapping
    		*/
    		
    		if(((SnappingOffset select 2) > 5) or ((SnappingOffset select 2) < -5)) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Cannot move up or down more than 5 meters"; 
    			detach _object;
    		};
    		
    		/*
    			/ Build Snapping
    		*/
    			
    		if(abs(_objHDiff) > 5) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Cannot move up || down more than 5 meters";
    			detach _object;
    			deleteVehicle _object;
    		};
    
    		if (player getVariable["combattimeout", 0] >= time) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = (localize "str_epoch_player_43");
    			detach _object;
    			deleteVehicle _object;
    		};
    
    		if (DZE_cancelBuilding) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Cancelled building.";
    			detach _object;
    			deleteVehicle _object;
    		};
    	};
    
    	//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 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],_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],_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;
    

    Merges are marked with /* Build Snapping */

     

    build_snapping.sqf from snab_build mod

    /*
    	DayZ Base Building
    	Made for DayZ Epoch please ask permission to use/edit/distrubute email [email protected].
    */
    private ["_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"];
    
    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);
    
    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_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 and 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 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
    		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;
    
    	/* Commented out cause GHOST preview does not work with snapping!
    	// if ghost preview available use that instead
    	if (_ghost != "") then {
    		_classname = _ghost;
    	};
    	*/
    
    	_object = createVehicle [_classname, _location, [], 0, "CAN_COLLIDE"];
    	_object setDir _dir;
    	_object attachTo [player,_offset];
    	
    	_position = getPosATL _object;
    
    	cutText [(localize "str_epoch_player_45"), "PLAIN DOWN"];
    
    
    	player allowDamage false;
    	SnappingOffset = _offset;
    	SnappingDir = 0;
    	SnappingSpotMarkers = [];
    	SnappingEnabled = false;
    	SnappedOffsetZ = 0;
    	SnappingResetPos = false;
    
    	if (isClass (missionConfigFile >> "SnapPoints" >> _classname)) then {
    		s_building_snapping = player addAction ["<t color=""#0000ff"">Toggle Snapping</t>", "custom\snap_build\player_toggleSnapping.sqf",_classname, 3, true, false, "",""];
    	};
    	
    	_snapper = [_object, _classname] spawn snap_object;
    	_key_monitor = [_isAllowedUnderGround] spawn player_buildControls ;
    
    	while {_isOk} do {
    		sleep 1;
    		_location2 = getPosATL player;
    
    		if(DZE_5) exitWith {
    			_isOk = false;
    			detach _object;
    			_dir = getDir _object;
    			_position = getPosATL _object;
    		};
    
    		if(_location1 distance _location2 > 5) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "You've moved to far away from where you started building (within 5 meters)"; 
    			detach _object;
    		};
    		
    		if(((SnappingOffset select 2) > 5) or ((SnappingOffset select 2) < -5)) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Cannot move up or down more than 5 meters"; 
    			detach _object;
    		};
    
    		if (player getVariable["combattimeout", 0] >= time) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = (localize "str_epoch_player_43");
    			detach _object;
    		};
    
    		if (DZE_cancelBuilding) exitWith {
    			_isOk = false;
    			_cancel = true;
    			_reason = "Cancelled building.";
    			detach _object;
    		};
    	};
    
    	terminate _snapper;
    	terminate _key_monitor;
    	player removeAction s_building_snapping;
    	player allowDamage true;
    	
    	//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;
    
    		_location = _position;
    
    		if((_isAllowedUnderGround == 0) and ((_location select 2) < 0)) then {
    			_location set [2,0];
    		};
    	
    		_object 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;
    				};
    
    				_object 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;
    						};
    					};
    
    					_object setVariable ["CharacterID",_combination,true];
    					
    
    					PVDZE_obj_Publish = [_combination,_object,[_dir,_location],_classname];
    					publicVariableServer "PVDZE_obj_Publish";
    
    					cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5];
    
    
    				} else {
    					_object setVariable ["CharacterID",dayz_characterID,true];
    					
    					// fire?
    					if(_object isKindOf "Land_Fire_DZ") then {
    						_object spawn player_fireMonitor;
    					} else {
    						PVDZE_obj_Publish = [dayz_characterID,_object,[_dir,_location],_classname];
    						publicVariableServer "PVDZE_obj_Publish";
    					};
    				};
    			} else {
    				deleteVehicle _object;
    				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 _object;
    
    			cutText [(localize "str_epoch_player_46") , "PLAIN DOWN"];
    		};
    
    	} else {
    		deleteVehicle _object;
    		cutText [format[(localize "str_epoch_player_47"),_text,_reason], "PLAIN DOWN"];
    	};
    };
    
    DZE_ActionInProgress = false;
    

    Any chance you might be able to help me out here?

     

    Is this the Snapbuild by OtterNas3 ?.  Have you tested it was working before adding A Plot for Life ?.  I have seen some posts in OtterNas3s thread about it no longer working.

     

    I also like it very much and so will be adding it to my play server along with this mod so hope he gets it resolved.  I believe he is working on it.

     

    Otherwise, let me know what is and is not working ?.

  11. Ok this is odd i place a new safe and when i open it via infiSTAR and access the gear it just vanishes?

     

    I am using 1.0.5.1 and called all files in the folder?

     

    What could i be doing wrong?

     

    Sorry, I don't have InfinSTAR so cannot really help with that one.

     

    I will test again and confirm I can place, unlock, lock and pack a safe though to make sure there is not an issue with the mod.

  12. And also i'm assuming that server monitor is supposed to be used to change stuff in server pbo not kept in mission?

     

    Good spot.  Yes it should be server side and not mission side.  This would need to go in the Epoch server pbo file.  I will provide the instructions and changes later today.

     

     

    Fixed the vehicle issue forgot to compare 

    if(!_isMan && _characterID != "0" && !(_cursorTarget isKindOf "Bicycle")) then {
    				_player_lockUnlock_crtl = true;
    

    But now noone gets the option to unlock their safes

     

    and made sure by comparing and that section is identical?

     

    Any help

     

     

    Do the safes have the SteamID in the db worldspace field or are they newly placed ?.  If they are from an old DB then there will be no ownership info on them (i.e. the ownerID will = 0 so they will not get in to the unlock routine).

     

    I would edit the db object TBH for this one.

     

    Please try this on a test server first as I am writing from my head and cannot test.

     

    sql

    Update object_data
    set worldspace = "[Worldspace new values]"
    Where objectUID = [Safes object UID];

    [Worldspace new values] = old value but with ,"SteamID" near the end.

     

    e.g.

    Old value = [60,[10,10,1]]

    New value = [60,[10,10,1],"99999999999999999"]

    Where 99999999999999999 = Owners SteamID.

     

    After doing this you will need to restart to get the system to reload the DB objects.

  13. Rimblock, I dont see any issues with the Vehicles as stated above.  I have however found a bug removing buildables.

    If I upgrade a any door to a locked door and then remove the lock to downgrade then remove item, I lose the option for remove.

    If I remove the lock from the door then wait for a restart I have the option to remove the item once I Login.

     

    Also the claim of tagging friendly is not working for me either.

    The Maintain area reports 0 building parts in range.

     

    Thanks for the work you have put in this so far!

     

    Thanks for the details info.

     

    Open player_buildingdowngrage.sqf

    Find

       _objectCharacterID = dayz_characterID;

    Change to

       _objectCharacterID = dayz_characterID;   
       _obj setVariable["ownerPUID",ownerID,true];

    GIve that a go.  I have changed the code on GitHub which I do have access to but cannot test until home.  You can check on there if you want to confirm the exact change.

     

    That should sort out the lock downgrade.  Again, it was saving to the DB ok but the live world variable was not set.  I will repackage in to a zip when home if you would rather wait.

     

    The tagging I need to debug and test so will have to wait until I am at home.  Suspect it will be an easy fix as I spent days sorting it out for v1 so am quite familar with it :) .

     

    Maintain area is not included (and wasn't in v1 either) but I will look to add it in as it really should be.

     

    Will update later.

  14. Probably.

     

    I would look at spawning a process when the player is in a vehicle.  Maybe tying in to a vehicle event handler if there is one already available for engine on state.

     

    Loop every X minutes or until player leaves vehicle.

    Check engine damage

    Less than 90% wait for next check

    Greater than 90%

    Check engine is on

    Engine off then wait for next check

    Engine on then check for engine failure.

    Work out failure_percentage

    Run calculate chance_percentage and compare results.

    Chance_percentage greater than failure_percentage.

    Wait for next check.

    Chance_percentage less than failure_percentage.

    Turn engine off.

    Wait for next check.

     

    You could even add a difficult to restart check so fo X seconds after turning off the engine there is Y chance of the engine refusing to restart and fire that loop between the "Turn off engine" and "Wait for next check".

     

    Server variables like the following could be used to configure differently for each server;

    Check_Stall_Percentage 

    Above what engine damage value to instigate a stall chance.

     

    Check_Stall_Chance_Unit

    What is the percentage chance of a stall unit (i.e. every 5% above Check_Stall_Percentage)

     

    Check_Stall_Chance_Value

    What is the percentage chance of a stall value (i.e. for every Check_Stall_Chance_Unit above Check_Stall_Percentage there is a

    Check_Stall_Chance_Value chance of stalling).

     

    Check_Loop_time

    How often to check for a stall.

     

    Check_Restart_time

    How often to check for restart failure after a stall has occured.

     

    Check_Restart_Chance_Failure

    Every time a restart is tried, what is the chance of failure.

     

    You may need to check on how 'heavy' it would be load wise on the client to run it though and fine tune the check frequency.

     

    There are probably lots of other ways to do it but this seemed fairly easy off the top of my head.  How much the player base would like it is another matter ;) .

  15. There are multiple snapping mods out there.  I would suggest posting in the thread related to the one you are using and there should be lots of people there with experience of the mod who can help you figure out what is going wrong.

     

    THe more info you can provide about what you have done to install and what you are seeing happen (or not seeing) will make it easier for people to help get to the root of the issue.

     

    The snap build by OtterNas3 thread is

  16. After doing this players don't get options to lock and unlock vehicles?

     

    Hmm, that seems a bit strange.  I had to unlock and lok vehicles during testing and even ended up flying to a trader city to buy a safe as I had issues finding the class name for a packed safe inventory item (tried about 4 variations from the class files).  I don't run admin tools etc for injecting items in to the game.  My testing is on pure vanilla Epoch with just my mod. I therefore amend a vehicle inventory to add items and then restart the test server.

     

    Anyway, will check it out tonight and see if something else has caused an issue.  I only changed the player_build.sqf (bug fix) and server_monitor.sqf (apply 1.0.5.1 changes - i.e. changing "and" to "&&" and "foreach" -> "count") so not sure why it would not work unless you have some change in the sqf files from vanilla epoch or you have done something different to the DB object data from standard Epoch.

     

    Any other info on your setup will be helpful.

  17. I just looked at the updated instructions. No detailed instructions for those of use that run mods other than this one to follow? I have to go through and compare the files with what I already have, such as the fn_selfactions and player_build (Snapping)?

     

    Sorry mate, limited hours in the day.

     

    My current priorities with this mod are;

    • Get the technique verified: Done.
    • Get the mod amended to use the above technique: Done.
    • Get the mod through basic testing: Done.
    • Get the mod released in a package: Done.
    • Investigate reported bugs: WIP
    • Debug, build a solution and release fix for validated bugs: WIP
    • Provide detailed install instructions: Waiting.
    • Provide utilitiy code or sql for item realignment etc: Waiting.

    The reason for holding out on the instructions is because if people are happy to hack about with their sqf files then there is a good chance they can diffmerge if they need to get it in urgently although they may prefer to wait for a couple of rounds of bug fixes.

     

    Snapbuild should have almost no impact to this (I have only used the OtterNas3 version on the previous version of A Plot For Life) as they should be pretty seperate in the parts of the code they touch in any files.  Other mods would depend on the mod.  Anything that checks buildable ownership is likely to need amending as I have introduced a new variable (object.ownerPUID) for all objects in the game loaded from the DB.  Only buildables have this value filled in at the moment (including tents, safes and possibly dogs :) ) but there is scope to add ownership to vehicles as well as (or instead of) having keys.

     

    I will produce some detailed instructions when I get a lul in bug reports and working on fixes which I will probably include in the zip file and as a seperate download to save the first post turning in to a monstrosity (again) :) .

  18. "Also did a diffmerge and the only file with any differences from 1.0.5.1 was the server_monitor.sqf which I have now brought up to date so this version is for Epoch 1.0.5.1."

    Now i have two server_monitor.sqf. One in dayz _ Server /System, and one in your Mission /Custom /plotpolefolder. I'm using indestructibel cinder in system_monitor.sqf in systemfolder. Isn't this a problem? Don 't know If its caused by your script, but a Player build a door and a cinderwall and some more buildings. After some minutes he came back from his napftour, the door and the Wall dissappeard. Another player told me that he can' t tag his mate as friendly.

     

    If you are using more than one mod then you will need to merge any common files.  The changes in the files for this mod are actually fairly small (change a variable her, add 1 extra line there.).  The biggest change is in the server_monitor.sqf which is adding a small block of code and then a few small little changes like the other files.  If you are running another mod that deals with buildables there is a reasonible chance of a clash as this whole mod deals with which buildables are owned by who. 

     

    I have not seen buildables dissapear and if you are having possible conflits between tow buildable mods then this may well be the problem.  If you sort out that conflict and the buildables still disappear (or someone without another buildable mod reports the same) then let me know and I will look deeper.

     

    Grab a copy of windiff (check the link in my sig for Tools for Admins and mod makers) and compare my server_monitor.sqf to the standard Epoch file.  Then compare the other server_monitor.sqf to the vanilla epoch file and see if any of the differences from either mod to the vanilla Epoch file conflick with each other.  If you want to go a bit more advanced, grab diffmerge and you can then choose which changes from each of the mod files to apply to the vanilla server_monitor file to create a a file that may work with both in one go.

     

    Which map you are running makes no difference to this mod.  It should work with all.

     

    For the tag friendly, can I get a bit more detail please.   

    • Does the option to tag appear ?.
    • If the tagger selects the option to tag, does the tagee get the message that someone is wanting to tag them ?.
    • Does the tagee get the option to tag friendly ?.
    • Do they both tag friendly but the colour of their names not change to green ?.
    • Do they tag and then just get the option to tag again ?.
    • Do they tag adn then the tagee is still not able to build (if the tagger owns the nearest plot pole).

    The more info the easier and quicker to troubleshoot what is going on so your help would be appreciated. 

     

    I will try testing it out tonight but this means I need to get my son roped in to test and he is currently at the moody teenager phase :) .

  19. Issue confirmed.  

     

    Just checking the code now.

     

    Found a bug that stopped you building after placing a plot pole until the server rebooted: Fixed.

    Looking at not being able to remove items:  False alarm.  My character had no crowbar  :lol: .

     

    Just rezipping.

     

    Also did a diffmerge and the only file with any differences from 1.0.5.1 was the server_monitor.sqf which I have now brought up to date so this version is for Epoch 1.0.5.1.

     

    First post updated.

  20. Our facebook group is full of people who had absolutely no clue whatsoever about the Gamespy shutdown and the need to switch to 1.63.

    Given this fundamental lack of information the additional work of manually transferring gear pales before the effort of explaining over and over what has to be done to be able to connect to the 1.63 servers in the first place.

    On the bright side: the additional outcry when we simply truncated our character_data was negligible in comparison ;-)

     

    Yep good point on the 1.63 requirement and lack of advertising, even on Steam.

     

    A number of servers run mods like mine though so their players can invest in large bases that they do not loose as soon as they die and this is affecting them pretty badly as well.

     

    Epoch is more forgiving than DayZ but if someones found a rare weapon and suddenly loose everything and cannot access the hero trader etc it is not great for the server.  Most people will accept, some will rage quit.  Now if you can make it so the players are not affected and other servers are having that problem then +1 for your server.

     

    Anyhow.

×
×
  • Create New...