Jump to content

Question

First off I'll admit I'm far from skilled when it comes to code and scripting, but I can understand basic file/folder structure. 
 
After about an hour or two with winmerge I managed to get P4L working, so I added in Zupa's Plot Management and Door Management. Tested it on my home server with no obvious issues, so I pushed it live for more players to test. 
 
 
P4L required replacing the player_unlockVault and player_lockVault that were modified in Zupa's SC 3.0 script, so I merged those changes over the P4L's versions of those files. After that had no reported issues of loss of coins from safes. But after adding in Plot Management and Door Management player's are reporting safes being emptied and coins lost (which I have confirmed) and I cannot build on a plot that I'm granted permission to, although I can "manage" the pole. So I looked into those files and couldn't see anything obvious. Read that it might be changes made in server_updateObject (which there were a handful of), but again couldn't see any errors. Went back through the steps again and couldn't find anything. 
 
Only RPT errors are these:
 
12:05:54 "DayZ Epoch: PRELOAD Functions\init [[<No group>:0 (FunctionsManager)],any]"
//above has always happened, never had any issues. not sure what it's pointing to
12:05:37 Server error: Player without identity player (id xxxxxxxxx)
//always happens ~10 times when someone logs in on server startup, never been an issue
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone leftshoulder doesn't exist in some skeleton 
12:13:16 Error: Bone rightshoulder doesn't exist in some skeleton 
//no idea but i'm sure it's unrelated
12:19:50 Server: Object 4:65 not found (message 70)
12:19:50 Server: Object 4:51 not found (message 94)
12:19:50 Server: Object 4:52 not found (message 94)
12:19:50 Server: Object 4:53 not found (message 94)
12:19:50 Server: Object 4:54 not found (message 94)
12:19:50 Server: Object 4:55 not found (message 94)
12:19:50 Server: Object 4:56 not found (message 94)
12:19:50 Server: Object 4:57 not found (message 94)
//spams RPT occasionally, believe it's related to WAI, not sure. 

Here are any relevant files:

compiles.sqf: http://pastebin.com/3sZUqaGg

server_updateObject.sqf: http://pastebin.com/5LNu1s0w

player_lockVault.sqf: http://pastebin.com/GXYbrCAd

player_unlockVault.sqf: http://pastebin.com/iYUkcRnf

Any help is appreciated. Where to look, any obvious issues you see, any relevant threads; whatever. I've searched around but haven't found anything specific to my issue other than ancient threads in regards to old epoch bugs. 

Thanks dudes!


 

 
 
 

Share this post


Link to post
Share on other sites

12 answers to this question

Recommended Posts

  • 0

It's possible. Here's a copy of my player_build from the live server:

Maybe I can spot it in here, looking at n++ gives me an instead headache at this point, haha. I'm pretty sure it's unrelated to single currency, but it's possible that my modifications to P4L's vault files cause something, but I'm leaning towards plot management since it was last to be added and that's when the issues arose. I'll try and download a copy of my life server on a restart to test some more on the home server, but it's hard to with the increasing pop. 

 

/*
	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","_playerID", "_playerUID","_ownerID","_buildcheck","_isowner","_isfriendly","_maxBuildDistance","_vector","_buildOffset","_vUp"];

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 (([player] call FNC_GetPos) nearObjects ["All",DZE_PlotPole select 0])) >= 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 = [player] call FNC_GetPlayerUID;

if (DZE_APlotforLife) then {
	_playerID = [player] call FNC_GetPlayerUID;
}else{
	_playerID = dayz_characterID;
};

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;

DZE_updateVec = false;
DZE_memDir = 0;
DZE_memForBack = 0;
DZE_memLeftRight = 0;

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 (([player] call FNC_GetPos) 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");
};

if (_requireplot == 0) then{_requireplot = false}else{_requireplot = true};

_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 [(format [localize "str_epoch_player_44", DZE_PlotPole select 1]) , "PLAIN DOWN"]; };

if(_IsNearPlot == 0) then {

	// Allow building of plotpole or items not requiring a plot pole
	if(!(_requireplot) || _isLandFireDZ) then {
		_canBuildOnPlot = true;
	};

} else {
	// Since there are plot poles nearby we need to check ownership && friend status

	// check nearest pole only
	_nearestPole = _findNearestPole select 0;

	_buildcheck = [player, _nearestPole] call FNC_check_owner;
	_isowner = _buildcheck select 0;
	_isfriendly = _buildcheck select 1;
	if ((_isowner) || (_isfriendly)) 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 initial players position & set max build range origin.
	if ((DZE_BuildInPlotRadius) && (_requireplot)) then{
		_location1 = [_nearestPole] call FNC_GetPos;
		_maxBuildDistance = _Distance / 2;
		diag_log text "Pole initial location.";
	}else{
		_location1 = [player] call FNC_GetPos;
		_maxBuildDistance = 5;
		diag_log text "Player initial location.";
	};
	
	diag_log format["[Player_Build] _location1 = %1, _maxBuildDistance = %2, DZE_BuildInPlotRadius = %3, _requireplot = %4",_location1, _maxBuildDistance, DZE_BuildInPlotRadius, _requireplot];
	
	_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 = [_object] call FNC_GetPos;

	cutText [(localize "str_epoch_player_45"), "PLAIN DOWN"];

	_objHDiff = 0;

	if !(_item in DZE_noRotate) then{
		["","","",["Init","Init",0]] spawn build_vectors;
	};
	
	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(DZE_dirWithDegrees) then{
				DZE_memDir = DZE_memDir - DZE_curDegree;
			}else{
				DZE_memDir = DZE_memDir - 45;
			};
		};
		if (DZE_6) then {
			_rotate = true;
			DZE_6 = false;
			if(DZE_dirWithDegrees) then{
				DZE_memDir = DZE_memDir + DZE_curDegree;
			}else{
				DZE_memDir = DZE_memDir + 45;
			};
		};
		
		if(DZE_updateVec) then{
			[_object,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;
			DZE_updateVec = false;
		};

		if(_rotate) then {
			[_object,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;
		};

		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];
			
			[_object,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;

		};

		sleep 0.5;

		_location2 = getPosATL player;

		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;
		};

		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;
		};

		if(abs(_objHDiff) > 5) exitWith {
			_isOk = false;
			_cancel = true;
			_reason = "Cannot move up or 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 ((DZE_BuildOnGround) && !(_requireplot)) then{
		_toohigh = false;
		if (_ispole) then{
			if ((_position select 2) > DZE_MaxPlotHeight) then{_toohigh = true};
		}else{
			if ((_position select 2) > DZE_MaxNoPlotNeededHeight) then{_toohigh = true};
		};
		if (_toohigh) exitWith {
			_isOk = false;
			_cancel = true;
			_reason = "This item must be built at ground level.";
			detach _object;
			deleteVehicle _object;
		};
	};

	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;
	
		_buildOffset = [0,0,0];
		_vUp = _vector select 1;
		switch (_classname) do {
			case "MetalFloor_DZ": { _buildOffset = [(_vUp select 0) * .148, (_vUp select 1) * .148,0]; };
		};
		
		_location = [
			(_location select 0) - (_buildOffset select 0),
			(_location select 1) - (_buildOffset select 1),
			(_location select 2) - (_buildOffset select 2)
		];
		
		if (surfaceIsWater _location) then {
			_tmpbuilt setPosASL _location;
			_location = ASLtoATL _location; //Database uses ATL
		} else {
			_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,([player] call FNC_GetPos)] 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",_playerID,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];
                    systemChat format [(localize "str_epoch_player_140"),_combinationDisplay,_text];

				} else {
					_tmpbuilt setVariable ["CharacterID",dayz_characterID,true];
					_tmpbuilt setVariable ["ownerPUID",_playerID,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;

Share this post


Link to post
Share on other sites
  • 0

Update: vehicles are no longer saving positions either. Thought this was related to a script that would remove vehicles from the trader and TP them elsewhere on the map, but that has since been removed and the problem persist. Replaced the server_updateObject with a known working one and reapplied the changes. Will report back if I find anything else out in the meantime. 

Edit: they seem to revert to wherever they were purchased or last updated in DB. I obviously broke something when adding management, but can't figure it out. Trying to pull plot management, will update again.

Share this post


Link to post
Share on other sites
  • 0

Yeah, I get "unable to upgrade, plotpole nearby" whenever I'm tagged as friendly or added to the plotpole with plotmanagement. Door management works without any issues, but plot management is the one causing the issues. I'm wondering if it's just not compatible with AP4L 2.35 or if I'm just bad. The changes called for in player_build is throwing me off as this line doesn't even exist:

 

_friendlies     = player getVariable ["friendlyTo",[]];
// check if friendly to owner
if(_ownerID in _friendlies) then {
    _canBuildOnPlot = true;
};

And why these changes are breaking my server_updateObject:

 

if (typeOf (_object) == "Plastic_Pole_EP1_DZ") then{
    _inventory = _object getVariable ["plotfriends", []]; //We're replacing the inventory with UIDs for this item
} else {
    _inventory = [
    getWeaponCargo _object,
    getMagazineCargo _object,
    getBackpackCargo _object
    ];
};

Share this post


Link to post
Share on other sites
  • 0

"unable to upgrade" does nothing has to do with player_build

 

its player_upgrade.sqf

this line here kicks you out of the script:

if(!_canBuildOnPlot) exitWith {  DZE_ActionInProgress = false; cutText [format[(localize "str_epoch_player_157"),_needText,_distance] , "PLAIN DOWN"]; };

So are you not able to upgrade or build?

Share this post


Link to post
Share on other sites
  • 0

Neither. I've updated my player_buildingDowngrade, player_build_plotCheck and player_upgrade. Also the update_object server file is stable on my test server right now, so I'm going to push them, test and I'll report back with any changes. 

Thanks for your help so far by the way. 

Edit: objects seem to be updating. Will test changes to player build files ASAP. Not sure what I did, but I blame lack of sleep. 

Edit 2: Can build too. I must have missed something, but going back through it and it all works now. Although I seem to be able to build on someone else's plot now..

Can't upgrade or remove items on someone's plot, but I can build. Don't think there's anything in any of my admin tools that's allowing that. 
 

Share this post


Link to post
Share on other sites
  • 0

Found these errors in client rpt today:

 

Error in expression <en {
_canBuildOnPlot = true;
};  
};
};
};

_passArray = [_IsNearPlot,_nearestPo>
  Error position: <};

_passArray = [_IsNearPlot,_nearestPo>
  Error Missing {
File mpmissions\__CUR_MP.Chernarus\Custom\A_Plot_for_Life\Action\player_build_plotCheck.sqf, line 75
Error in expression <en {
_canBuildOnPlot = true;
};  
};
};
};

_passArray = [_IsNearPlot,_nearestPo>
  Error position: <};

_passArray = [_IsNearPlot,_nearestPo>
  Error Missing {
File mpmissions\__CUR_MP.Chernarus\Custom\A_Plot_for_Life\Action\player_build_plotCheck.sqf, line 75

Here's that block of code from that file:

 

	// check if friendly to owner
	if(_playerUID == _ownerID) then {  //Keep ownership
		// owner can build anything within his plot except other plots
		if(!_isPole) then {
			_canBuildOnPlot = true;
		};
	} else {
		// disallow building plot
		_friendlies = _nearestPole getVariable ["plotfriends",[]];
		_fuid  = [];
	{
		_friendUID = _x select 0;
		_fuid  =  _fuid  + [_friendUID];
	} forEach _friendlies;
		_builder  = getPlayerUID player;
		// check if friendly to owner
	if(_builder in _fuid) then {
		_canBuildOnPlot = true;
			};  
		};
	};
};

I feel like the error should be painfully obvious, but I'm not seeing it. 

More RPT spam:

 

if ((_rplayerUID in _friendlies) && (_playerU>
  Error position: <_rplayerUID in _friendlies) && (_playerU>
  Error Undefined variable in expression: _rplayeruid
File mpmissions\__CUR_MP.Chernarus\Custom\player_updateGui.sqf, line 188
Error in expression <t getVariable ["friendlyTo", []];

if ((_rplayerUID in _friendlies) && (_playerU>
  Error position: <_rplayerUID in _friendlies) && (_playerU>
  Error Undefined variable in expression: _rplayeruid
File mpmissions\__CUR_MP.Chernarus\Custom\player_updateGui.sqf, line 188
Error in expression <t getVariable ["friendlyTo", []];

if ((_rplayerUID in _friendlies) && (_playerU>
  Error position: <_rplayerUID in _friendlies) && (_playerU>
  Error Undefined variable in expression: _rplayeruid
File mpmissions\__CUR_MP.Chernarus\Custom\player_updateGui.sqf, line 188
Error in expression <t getVariable ["friendlyTo", []];

if ((_rplayerUID in _friendlies) && (_playerU>
  Error position: <_rplayerUID in _friendlies) && (_playerU>
  Error Undefined variable in expression: _rplayeruid
File mpmissions\__CUR_MP.Chernarus\Custom\player_updateGui.sqf, line 188
Error in expression <t getVariable ["friendlyTo", []];

I'll dig through that file some and see if I can find anything obvious. Sorry if I'm spamming here, just helps to get everything out in front of me and maybe somebody can point out the obvious. 

Share this post


Link to post
Share on other sites
  • 0

I've resolved all of the issues with Plot Management, but I'm still getting the errors in my client RPT and sometimes my HUD disappears. Only seems to affect me. 

 

if ((_rplayerUID in _friendlies) && (_playerU>
  Error position: <_rplayerUID in _friendlies) && (_playerU>
  Error Undefined variable in expression: _rplayeruid
File mpmissions\__CUR_MP.Chernarus\Custom\player_updateGui.sqf, line 188
Error in expression <t getVariable ["friendlyTo", []];

Not sure where the undefined variable error is coming from. 

Share this post


Link to post
Share on other sites
  • 0

Check for the line that assignes a value to _rplayeruid.  Make sure it is not assigning a value to _rplayerid or something like that.

 

Undefined variable usually means

  • You are not defining the variable (wrong name typo or something).
  • The value you are putting in tot eh variable is nil (ie nothing) which causes the variavle to be deleted.

A diag_log line will show what you are trying to put in tot he variable if that is the issue and you can track back from there.

Share this post


Link to post
Share on other sites
  • 0

After looking it over once more with diffmerge I realized I left _playerUID and _rplayerUID out of the private array. Oops. 

Thanks for that. 

edit: made the chages to my test server, all errors are gone. 

/thread

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Sandbird
      Dayz.Epoch.1.0.62 - 3d.Editor.Live.Mission with Database interaction


      -=Youtube Demo=-
       
      What is this
      A custom mission file for the purpose of testing/writing scripts for DayZ Epoch without the need of a server.
      It emulates the dayz_server and dayz_mission files, so you can write scripts using the 3d editor. No need to use a dayz_server for debugging anymore. We all know how time consuming that is.

      Features
      Full Database integration (yes thats right... [:)] I would suggest to have a maximum of 100 objects in your object_data table for faster results.
      Took 5 min to load 10000 objs from my real database, so also make sure you dont go crazy with the MaxVehicleLimit, MaxDynamicDebris values in the init.sqf Fully working GUI, zombies, hit registration, addactions, everything! Write code and execute it on the fly. No need to start a server and join with a client to test things. 100% of your scripts will work! (dynamic weather, default loadouts, custom scripts etc) 2 setups. A default 3d editor player with a default loadout or a Real database character based on your UID Includes most of BIS_fnc functions, so actions like BIS_fn_invAdd will work (i've added most common ones...more included though...check details bellow.) Everything works...when i say everything i mean EVERYTHING !. (Spawning objects on mission start, traders (buy/sell), maintenance, character update, events, stats...etc) New Features!
      All .FSM files have been converted to .SQF meaning the mission acts as a full fledged server / client merge. New character creation has been ignored though, so the server expects that the client that is about to connect exists in the database. The server will start, wait for a 'fake client connection to happen' (you pressing the Preview button), and then it will load your character from the database, spawn Hive objects and create new based on your MaxVehicleLimit values etc, then initialize the events and finally spawn the character to his worldspace location. Use AdminTools to spawn any Perm, Temp vehicle you want, including buildings, crates etc. Building objects is working as expected with a little AddAction trick. Unfortunately the primary display (eg: findDisplay 46) isnt working inside the editor. That means that building stuff or placing objects is very hard to do since we can't 'capture' keystrokes.
      Further details below after the Installation instructions. Arma2Net is not allowed by Battleye anymore, so i am using extDB3 now. Requirements:
      A mysql server on the same machine as your Arma2 editor. Well...a remote PC would work as well...just make sure YOU ARE NOT using your original database. Make a copy of it!. This mission will interact with your database !
      If you don't have a mysql server on your pc...i suggest you get WampServer. It's the easiest php/mysql server out there.
      Installation
      Head over to the GitHub where the project is. Click Download on the right sidebar, and extract the rar file. Copy the 3d.live1062.DayzEpochTemplate.Chernarus mission file in your \My Documents\ArmA 2\missions\ folder If your active Arma profile is not the default one, then you probably should extract it in the \My Documents\ArmA 2 Other Profiles 2\missions\ folder, otherwise you won't be able to find the mission inside the editor. Copy everything inside "Arma2OA root folder" in your root Arma2OA folder (the same folder where @DayZ_Epoch_Server, MPMissions are). The real_date.dll...(Thanks to killzonekid) is used to get your machine's date/time to be used for live day/night cycles inside the game (...you can set a fixed day if you want...details bellow). The tbbmalloc - tbbmalloc_x64.dll files are provided by extDB3. They shouldnt interfere with your normal game, but they are needed for the mission to be able to connect to your MySQL server. (Make a backup of your original ones if you want, just be safe.) EATbaseExporter is used by the AdminTools, and allows you to export bases to an .sqf format so you can import them afterwards to your server. Now edit -=START HIVE MISSION=-.bat which was placed in your Arma2 folder, and fix the paths to their proper values. If you are using DZLauncher then the @Dayz_Epoch folder is probably where i placed it myself.  Battleye needs to be disabled inside the editor otherwise the extDB3 addon will not work. The .bat is taking care of that. It will disable Battleye after 7 seconds. Depending on your machine, if you see that the time isn't sufficient, raise that value a little bit. A sample Database has been provided with me as a character and a basic loadout. You can of course use your own database, just remember to delete most of your Object_Data table vehicles. The more vehicles you have there, the longer it will take for the dayz_server to spawn them. If you just want to write a script independent of cars etc...why wait 5 minutes for the server to spawn 10000 vehicles :) Open "ArmaOA\@extDB\extdb3-conf.ini" and add your test database data there. I named the test SQL DB dayz_cherno [dayz_cherno] IP = localhost Port = 3306 Username = dayz Password = mypass123 Database = dayz_cherno # dayz_cherno is the name of the database (change it in both values) # localhost is your mysql server (could be an IP value as well) # 3306 your mysql port # dayz is your database username # mypass123 is your database password  
      When the game launches, press Alt+E, select Chernarus, then Load mission 3d.live1062.DayzEpochTemplate.Chernarus
      Open \My Documents\ArmA 2\missions\3d.live1062.DayzEpochTemplate.Chernarus\init.sqf
      Go to line 61 and start editing the values there. DB_NAME is the name of your database (same as the extdb3 config file).
      Add your PlayerUID value (same as the DB one) in line 72. (That the player you want to load from the database)
      Depending which map you want to use, you have to change the dayZ_instance variable and also the MarkerP values (line 62) based on your mission.sqm file. Its for the Hive to spawn random vehicles, roadblocks and mines at proper locations based on the map. Just read the comments there for how to get the values. Its really simple. Just copy paste stuff from your mission.sqm file.
      Default setup vs Database setup
      There are 2 ways of initializing your player.
      A live database player based on his UID in the character_data table (coordinates, medical states, inventory etc) A default 3d editor player with a basic loadout. (Ignores Hive Loadouts and initial vehicle spawns) Default setup (extDB3)
      [DefaultTruePreMadeFalse = true;] This option is now the default one, because it's so much easier to set up, plus a lot of things have changed in the 1062 Epoch version. I couldn't totally separate the server files from the client files, so in the end a Database is necessary for the Mission files to work properly. To setup your character with this method, leave DefaultTruePreMadeFalse to true;  Everything is database based..so no need to do anything else. The mission will start with all your stats, inventory, conditions and spawn you where your world coordinates are. Premade Character Setup
      [DefaultTruePreMadeFalse = false;] This setup DOES NOT initialize the character based on a database entry, or does any HIVE related queries on mission start. (like load objects etc). Instead it uses some premade stats that you set, and only uses the Database on updates (buy vehicles etc) The loadout of the player is set in the init.sqf in line 77  
      player setVariable ["CharacterID", "1", true]; // Set here the characterID of the player. It can be anything...just leave it 1 if you want. player setVariable ["playerUID", "111111", true]; // Set here the playerUID of the player you want to have. player setVariable["Z_globalVariable", 100000]; player setVariable["Z_BankVariable", 100000]; player setVariable["Z_MoneyVariable", 100000]; player setVariable["humanity", 11000]; player setVariable["humanKills", 10]; player setVariable["banditKills", 20]; player setVariable["zombieKills", 30]; player setVariable ["friendlies", ["222222","333333"], true]; //Both DZE_Friends and this must be set for friendlies to work properly DZE_Friends = ["222222","333333"]; Everything else should work fine with the database....like traders, salvaging, etc...Unfortunately since the 1062 ver had many differences from the 1051 one, i couldn't really make this Profile option a standalone one, without any Database interaction. So in order for you to minimize any errors in the log file, i would suggest you load my sample db file provided, and also change those CharacterID and PlayerUID values in PLAYER_Data and CHARACTER_Data tables to the ones you set up here, just in case.... The Premade character setup is for people that want to fast debug a script they are making and don't want to wait for the Hive to load all map objects and authenticate the player first. Further Details to change (in both Profile Cases)
      The description.ext, mission.sqf, mission.biedi files have your character's name in them. Just search for the word Sandbird in all of them and change it according to the PlayerName value you have in your Player_DATA table for your PlayerUID value.
      Example taken from description.ext. DONT change the actual My_Player text. The mission file needs that string to read what you typed in the name field.
      class My_Player { name="Sandbird"; face="Face20"; glasses="None"; speaker="Male01EN"; pitch=1.1; };  
      Important info
      Init.sqf values
      DefaultTruePreMadeFalse = true; // True: Read player's data from the database (based on UID), False: the normal player the editor has StaticDayOrDynamic = true; // A static date is set at the bottom of \dayz_server\init\server_function.sqf. Set this to false if you want real time/date inside the mission. DZEdebug = false; // Set to true if you want a more detailed log file Enable Keyboard actions (menu option) // (findDisplay 46) wont work inside the editor. That means that building stuff or placing objects is very hard to do since we cant 'capture' keystrokes. I kinda fixed this with a trick. In order to build something first you have to initiate the building action (holding the object in your hands) and then scroll with your mouse wheel and select Enable Keyboard actions. This will create a layer on your screen capturing your keystrokes thus allowing you to change orientations etc. Pressing ESC twice after and it will close the fake display and return to normal play mode. You will have to do this every time you want to build something. Related to coding
      Since the Editor has some limitations because its not a real server some things will never work. For example:
      _playerUID = getPlayerUID player; will never work in the editor. To get the _playerUID you have to do this:
      _playerUID = player getVariable ["playerUID", 0];
      This is the most important thing to remember. Lots of scripts use getPlayerUID. You have to remember to change it every time you want to use it.  Of course the player value is just an example here. If you were inside a loop and it had (getPlayerUID _x) then you have to rewrite it like this: (_x getVariable["PlayerUID",0]) findDisplay 46 does not work in the editor. If you are using/making a script that uses Display 46 try using my Enable Keyboard action. It might work in your case. publicvariableServercommands don't exist in the editor. There is no server to accept the command. If you want to use addpublicvariableeventhandler you can do it with call/spawn commands. You can find the handlers usually in the PublicEH.sqf.
      Example: PVDZE_plr_Save = [player,dayz_Magazines,false,true]; publicVariable "PVDZE_plr_Save"; can be written like:
      PVDZE_plr_Save = [player,dayz_Magazines,false,true]; publicVariableServer "PVDZE_plr_Save"; // keeping this so when you move the code to the real server you remember to add it. [player,dayz_Magazines,false,true] spawn server_playerSync; // what to call is usually inside publicEH.sqf. In this case search for PVDZE_plr_Save in the PublicEH file and check the call it makes in the end. You could also change the publicVariableServer to publicVariable. That should work inside the editor. But keep in mind these changes wont work on the live server, since one command broadcasts something to the server while the other just to the client running it. I would suggest you keep the original value and do the PublicEH call instead, marking it down with some debug comments next to it, so when you are done and want to transfer the files to your live server you just remove the call and everything should work as expected.
      Don't forget to change the paths when you are adding addons to test/modify them. For example, notice the differences here:  player_switchModel = compile preprocessFileLineNumbers "dayz_code\compile\player_switchModel.sqf"; player_checkStealth = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\player_checkStealth.sqf"; The first line will look up for player_switchModel.sqf inside the editor mission files, while the 2nd one will go to the @Dayz_Epoch map file and get the .sqf file. Same thing applies for the dayz_server files (server_functions.sqf). Once you are done with your script and you have added new compile lines, you need to fix them back to their proper values before you upload them to your live server.
        If you are missing any BIS_fnc functions then check the folder dayz_code\system\functions and see if it's available there to include it in the compiles.sqf. Set DZEdebug = true;  in the init.sqf. And ALWAYS check your RPT log file for debugging. Its located at : %AppData%\Local\ArmA 2 OA folder. Related to mission file included
      You'll notice when you start the mission there are 2 bots standing there. If you double click the soldier you'll see that he initiates this script scripts\BotInit.sqf. I left that in purpose in case you want to do some scripting that requires 'another player', and you want to initialize the fake player like that. The other bot can be deleted. I just left it there because i was testing a Tag Friendly script, and needed a 3rd 'player' that has me as a friend. I've included a simple Fireworks script i made a while back only this time i used some better effects taken from aliascartoons work. Just add a 'SMAW_HEDP' into your inventory and right click on it to test it out. Here is how the old script used to look like Fireworks. Also you'll find a little 'hat script' in the files, just right click a 'IRStrobe' item to add a hat to your player. Both script were written inside the editor using the mission file above...just a small example to show you how easy it is to write code there. The @extDB folder contains a folder called debug_files. These .dlls (when replaced the ones provided) activate a more detailed log file (found under arma 2 operation arrowhead\logs folder). It will show ALL MySQL queries going in/out of the database. Very useful if you are running any custom SQL queries and the RTP log file isn't enough.
      Final Notes
      These are heavily modified files...Dont overwrite them with your own files. Add to them instead of replacing them.
      If you are writing scripts that dont require the server to restart, then you can just go to 2D editor and press Preview again after you make the changes. No need to hit Restart. As long as you are doing changes that doesnt affect the Hive loading you can basically run things on the fly. For example in the init.sqf at the bottom i added a Add BankMonkey example. That command just loads the custom\money.sqf and shows a simple extDB3 example on how to select/update a DB table. Since this command doesnt require the server to restart, you can just hit Preview, test things out, and if you want to make changes, go back to 2D Editor, edit your changes in the money.sqf file and hit Preview again. No need to hit Restart and wait for the dayz_server functions to do their thing again.
      The whole purpose of this project was to not waste any more time trying to code on this god forsaken Arma engine.
      And a personal note....You will NEVER find an easier way to code stuff for Dayz....period. This is the fastest way to write code and see it in action.

      Hope this code will help you write code faster and easier !
      ### Credits
      This mission file would not be possible without the help of these addons/people

      DayzEpochTeam | http://epochmod.com
      killzonekid | http://killzonekid.com
      extDB3 | https://bitbucket.org/torndeco/extdb3/wiki/Home
      ebayShopper | https://github.com/ebayShopper/TestKit
      JasonTM (for the latest beta AdminTools)| https://epochmod.com/forum/topic/44863-release-epoch-admin-tools-v-1107-test-branch/
    • By Warburgg
      Hello everyone. I would like to ask for help regarding a problem I have been having on my server.
      Items stored in the vault are not being stored in the SQL database.
      I have tested with the safe and the lockbox and both are not working but with the tent it works and saves the items in the database after the server restart.
      ArmA2OA.RPT: https://pastebin.com/X2cT7BBU
      arma2oaserve.RPT: https://pastebin.com/rqFNGbDy
      server_log.txt: https://pastebin.com/ZVWAzgNP
      Please help me. My players do not want to stay on the server because of this and if I remove the safe and leave only the tent (which is what saves the items) they will cry hahaha
    • By DirtySanchez
      Had a fellow community member approach me about a serious question regarding removal of a vehicle mod and how to proceed.

      Situation:

      Mas vehicles was installed but host realized that CUP vehicles and weapons were already configured within Epoch for easy setup and start.
      So what we want to do here is get rid of those vehicles.
      Most mods use a common string for their mod in the class names.
      In this case it is "mas_" so we will check the classname for a partial match.
      If it finds the match, lets kill the vehicle and remove the database entry.

      At the end of EPOCH_server_loadVehicles we can add this code.
      after this line of code: https://github.com/EpochModTeam/Epoch/blob/release/Sources/epoch_server/compile/epoch_vehicle/EPOCH_load_vehicles.sqf#L228
      if(_class find "mas_" > -1)then { [_vehicle,""] call EPOCH_server_save_killedVehicle; };
      Start up the server with this code installed.
      Let the server fully start up.
      Remove the code and restart the server again
      ENJOY!



      ps. Someone asked why not do a _vehicle setDamage 1; Well do we really want to blow up a bunch of vehicles and possibly damage bases and other vehicles? NO
    • By anster3333
      ***PLEASE HELP*** 2017-12-13 16:25:01 HiveExt: [Information] HiveExt  2017-12-13 16:25:01 HiveExt: [Critical] Cannot create database: Error loading database module: DatabaseMySql   Ive tried changing the password to the database and user in the Hiveext.cfg For some reason whenever i join the server its all fine, but as soon as i log in as it says 'game started', it proceeds with the error 2017-12-13 16:25:01 HiveExt: [Information] HiveExt  2017-12-13 16:25:01 HiveExt: [Critical] Cannot create database: Error loading database module: DatabaseMySql then the server closes itself. I have no idea now how to fix this issue as no one else has posted about it from what ive seen and i could really do with any help if anyone knows how to fix this error, im probably just being stupid.   Thanks
    • By blueman
      I made some changes to the traders inventory.
      So they they have 15 drinks, and 15 food.
      However, when I restart server, and check, the inventory was just like it was before restart.
      I have a feeling I don't understand the loot system yet, and the traders.
      Looks like it's a running tally of what ever gets sold to them, and it carries over through restarts.
      Probably only resets after it reaches a certain point (amount of items).

      What I'd like to do, is have the traders have a minimum of 15 food and 15 drink at all times is that possible?
      Thanks,
  • Advertisement
  • Supporters
  • Discord

×
×
  • Create New...