Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
Ник

Plot for Life v2.35 + SnapPro v1.4 + DayzBuildVectors-master

Recommended Posts

По-многочисленным просьбам сервостроителей, а также если Вам лень собирать сервер с нуля, предлагаю Вашему вниманию гайд, 
как установить Plot for Life v2.35 + SnapPro v1.4 + DayzBuildVectors-master на сервер, заполненый различными скриптами.
 
Скачиваем архив с яндекс-диска, или с оригинала(Plot for Life можно только скопировать файлы, убрали кнопку скачать)
Ссылка на архив:https://yadi.sk/d/3CMIdOy032FAyC
Оригинал:
 
Если у Вас уже установлен SnapPro и векторы, то удалите их. Как удалить - следовать гайду, по которому устанавливали, только наоборот, читать от конца к началу.
 
                                            ****Установка Plot for Life v2.35 + SnapPro v1.4****
 
Откройте папку Custom и посмотрите какие файлы находятся в ней, если у Вас уже есть такие же, то удалите их из этой папки, позже внесёте изменения в свои.
Оставшиеся файлы(включая подпапки) скопируйте к себе в \MPMissions\DayZ_Epoch_11.Chernarus в папку Custom
Если не нравится структура расположения папок и файлов, можете изменить по своему усмотрению, не забыв при этом поменять пути к этим файлам.
Далее будет расписано какие изменения необходимо внести в файлы. Если Вы их просто скопировали к себе, то и изменять не надо.
Гайд будет большим, так что запаситесь терпением(в блокноте он занял 1730 строк). И так, поехали:
 
Серверная часть:
Файл server_publishFullObject.sqf из папки Server\compile скопировать в @DayZ_Epoch_Server\addons\dayz_server\compile
 
server_functions.sqf

1. Вставить строку
server_publishFullObject = compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\server_publishFullObject.sqf"
между server_publishObj и server_deleteObj

2. В блоке server_spawnCleanFire = {
в секции private заменить "_delQtyNull" на "_delQtyFP"

3. В строке diag_log (format["CLEANUP: Deleted %1 fireplaces out of %2",_delQtyNull,_qty]);
заменить _delQtyNull на _delQtyFP

4. В блоке server_logUnlockLockEvent = {
В секцию private добавить "_PUID"
Вставить
_PUID = [_player] call FNC_GetPlayerUID;
над строкой
diag_log format["SAFE %5: ID:%1 UID:%2 BY %3(%4)", _objectID, _objectUID, (name _player), (getPlayerUID _player), _statusText];

5. В строку
diag_log format["SAFE %5: ID:%1 UID:%2 BY %3(%4)", _objectID, _objectUID, (name _player), (getPlayerUID _player), _statusText];
добавить
_PUID, между (name _player), и _statusText

 

server_monitor.sqf

 

1. В секцию private в самый конец добавить "_ownerPUID"

2. Исправить в файле все переменные _intentory на _inventory если это не сделано ранее

3. Найти блок, начинающийся
if (_damage < 1) then {
и выше него вставить
// Realign characterID to OwnerPUID - need to force save though.
if (DZE_APlotforLife) then {
if (count _worldspace < 3) then
{
_worldspace set [count _worldspace, "0"];
};
_ownerPUID = _worldspace select 2;
} else {
_ownerPUID = _ownerID;
};
// diag_log format["Server_monitor: [ObjectID = %1] [ClassID = %2] [_ownerPUID = %3]", _idKey, _type, _ownerPUID];

4. В блоке
if (_damage < 1) then {
вставить строку
_object setVariable ["OwnerPUID", _ownerPUID, true];
после
_object setVariable ["ObjectID", _idKey, true];

5. Заменить } count (_BuildingQueue + _objectQueue);
на } forEach (_BuildingQueue + _objectQueue); (может и не надо)

 

 

Клиентская часть
Нам понадобятся кастомные файлы из dayz_code, если у вас уже есть какие-то файлы из перечисленных, вносите изменения, если нет, скопируйте их из архива

compiles.sqf,
publicEH.sqf,
variables.sqf,
fn_damageActions.sqf,
fn_selfActions.sqf,
player_lockVault.sqf,
player_packTent.sqf,
player_packVault.sqf,
player_unlockVault.sqf,
player_updateGui.sqf,
player_build.sqf,
player_buildingDowngrade.sqf,
remove.sqf,
tent_pitch.sqf,
vault_pitch.sqf,
dayz_spaceInterrupt.sqf,
object_showPlotRadius.sqf,
player_tagFriendly.sqf

 
compiles.sqf

1. Меняем пути к нашим кастомным файлам, если какие-то файлы уже подключены, не трогаем их, подключаем те из списка, которых нет.

2. В блоке
player_removeNet = {
заменить "DesertLargeCamoNet" на "DesertCamoNet_DZ"

3. В блок player_login = { в секцию private добвить "_PUID"
В этом же блоке после строки
_detail = _this select 1;
добавить
_PUID = [player] call FNC_GetPlayerUID;

4. Найти строку
if(_unit == getPlayerUID player) then {
изменить на
if(_unit == _PUID) then {

5. Найти строку
player_build = compile preprocessFileLineNumbers "\z\addons\dayz_code\actions\player_build.sqf";
и заменить на этот блок
if (DZE_modularBuild) then {
player_build = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\modular_build.sqf";
player_build_countNearby = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_countNearby.sqf";
player_build_states = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_states.sqf";
player_build_needNearby = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_needNearby.sqf";
player_build_getConfig = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_getConfig.sqf";
player_build_plotCheck = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_plotCheck.sqf";
player_build_buildReq = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_buildReq.sqf";
player_build_create = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_create.sqf";
player_build_controls = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_controls.sqf";
player_build_publish = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build_publish.sqf";
DZE_snap_build_file = "Custom\Snap_Pro\snap_build.sqf"; // Set as a global variable as it is also referenced in snapbuild.sqf
snap_build = compile preprocessFileLineNumbers DZE_snap_build_file;
} else {
player_build = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Action\player_build.sqf";
};
FNC_check_owner = compile preprocessFileLineNumbers "Custom\A_Plot_for_Life\Compile\fn_check_owner.sqf";

6. Найти блок, начинающийся
FNC_GetSetPos = { //DO NOT USE IF YOU NEED ANGLE COMPENSATION!!!!
и выше него вставить этот блок
FNC_GetPlayerUID = {
private ["_object","_version","_PID"];
_object = _this select 0;
_version = productVersion select 3;
if (DayZ_UseSteamID) then {
_PID = GetPlayerUID _object;
} else {
if (_version >= 125548) then {
_PID = call (compile "GetPlayerUIDOld _object");
} else {
_PID = GetPlayerUID _object;
diag_log format["Your game version, %1, is less than the required for the old UID system; using Steam ID system instead. Update to 1.63.125548 (or latest steam beta)", _version];
};
};
_PID
};

 
publicEH.sqf

после строки
"PVDZE_obj_Publish" addPublicVariableEventHandler {(_this select 1) call server_publishObj};
вставить
"PVDZE_fullobj_Publish" addPublicVariableEventHandler {(_this select 1) call server_publishFullObject};

 
variables.sqf

1. В самом верху, после строки disableSerialization;
вставить
if (isNil "DayZ_UseSteamID") then {
DayZ_UseSteamID = true;
};

2. После строки
Dayz_GUI_B = 0.26; // -0.26
вставить
if (isNil "Dayz_Dark_UI") then {
Dayz_Dark_UI = false;
};

3. В блок dayz_resetSelfActions = {
добавить переменные (в конец блока)
s_player_dropflare = -1;
s_player_toggleSnap = -1;
s_player_toggleSnapSelect = -1;
s_player_toggleSnapSelectPoint=[];
snapActions = -1;
s_player_plot_boundary_on = -1;
s_player_plot_boundary_off = -1;
s_player_plot_take_ownership = -1;

4. Найти строку s_player_combi = [];
и после неё добавить
//Modular player_build
snapGizmos = [];
snapGizmosNearby = [];

5. Найти
if (isNil "DZE_selfTransfuse_Values") then {
DZE_selfTransfuse_Values = [12000, 15, 300];
};
и после него добавить
if (isNil "helperDetach") then {
helperDetach = false;
};
if (isNil "DZE_modularBuild") then {
DZE_modularBuild = false;
};
if (isNil "DZE_snapExtraRange") then {
DZE_snapExtraRange = 0;
};
if (isNil "DZE_APlotforLife") then {
DZE_APlotforLife = false;
};
if (isNil "DZE_PlotOwnership") then {
DZE_PlotOwnership = false;
};
if (isNil "DZE_checkNearbyRadius") then {
DZE_checkNearbyRadius = 30;
};

6. Найти
if(isNil "DZE_maintainRange") then {
DZE_maintainRange = ((DZE_PlotPole select 0)+20);
};
и после добавить
DZE_snap_build_file = "";

7. Найти DZE_Lock_Door = ""; и после добавить
if (isNil "DZE_plotOwnershipExclusions") then {
DZE_plotTakeOwnershipItems = dayz_allowedObjects - (DZE_LockableStorage + ["Plastic_Pole_EP1_DZ","TentStorage","TentStorageDomed","TentStorageDomed2"]);
};

8. Найти
//Max local
dayz_maxLocalZombies = 30; // max quantity of Z controlled by local gameclient, used by player_spawnCheck. Below this limit we can spawn Z
//Current NearBy
dayz_CurrentNearByZombies = 0;
//Max NearBy
dayz_maxNearByZombies = 60; // max quantity of Z controlled by local gameclient, used by player_spawnCheck. Below this limit we can spawn Z
//Current total
dayz_currentGlobalZombies = 0;
//Max global zeds.
dayz_maxGlobalZeds = 3000;
dayz_spawnDelay = 120;
dayz_spawnWait = -120;
dayz_lootDelay = 3;
и заменить на это (не знаю для чего?)
//Max local
dayz_CurrentNearByZombies = 0;
//Max NearBy
if (isNil "dayz_maxNearByZombies") then {
dayz_maxNearByZombies = 60; // max quantity of Z controlled by local gameclient, used by player_spawnCheck. Below this limit we can spawn Z
//Current total
};
dayz_currentGlobalZombies = 0;
//Max global zeds.
if (isNil "dayz_maxGlobalZeds") then {
dayz_maxGlobalZeds = 3000;
};
if (isNil "dayz_spawnDelay") then {
dayz_spawnDelay = 120;
};
dayz_spawnWait = -(dayz_spawnDelay);
if (isNil "dayz_lootDelay") then {
dayz_lootDelay = 3;
};

9. Найти
DZE_6 = false;
и после добавить
DZE_F = false;

 
fn_damageActions.sqf

1. В секцию private добавить в конец "_targetUID" и удалить "_charID"

2. Найти строку
_charID = _unit getVariable ["CharacterID", 0];
и заменить на
if (DZE_APlotforLife) then {
_targetUID = [_unit] call FNC_GetPlayerUID;
}else{
_targetUID = _unit getVariable ["CharacterID", 0];
};

3. Найти блок
// should only fire if cursor target is man && not vehicle
if ((isPlayer _unit) && !(_charID in _friendlies)) then {
r_action = true;
_action = _unit addAction ["Tag as friendly", "\z\addons\dayz_code\actions\player_tagFriendly.sqf", [], 0, false, true, "", ""];
r_player_actions set [count r_player_actions,_action];
};
и заменить на
// should only fire if cursor target is man && not vehicle
if ((isPlayer _unit) && !(_targetUID in _friendlies)) then {
r_action = true;
_action = _unit addAction ["Tag as friendly", "Custom\A_Plot_for_Life\Action\player_tagFriendly.sqf", [], 0, false, true, "", ""];
r_player_actions set [count r_player_actions,_action];
};

 
fn_selfActions.sqf

1. В секцию private в конец добавить "_playerUID","_characterID","_plotDistance","_PlotsNear", "_classname","_isowner"

2. Найти
_hasToolbox = "ItemToolbox" in _itemsPlayer;
и после вставить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
}else{
_playerUID = dayz_characterID;
};

3. Найти строку
_ownerID = _cursorTarget getVariable ["CharacterID","0"];
и заменить на
_ownerID = _cursorTarget getVariable ["ownerPUID","0"];
_characterID = _cursorTarget getVariable ["CharacterID","0"];

4. Найти этот блок
if (s_player_maintain_area < 0) then {
s_player_maintain_area = player addAction [format["%1",localize "STR_EPOCH_ACTIONS_MAINTAREA"], "\z\addons\dayz_code\actions\maintain_area.sqf", "maintain", 5, false];
s_player_maintain_area_preview = player addAction [format["%1",localize "STR_EPOCH_ACTIONS_MAINTPREV"], "\z\addons\dayz_code\actions\maintain_area.sqf", "preview", 5, false];
};
и после него вставить
_plotDistance = (DZE_PlotPole select 0);
_PlotsmarkersNear = count (nearestObjects [_cursorTarget, ["Land_coneLight"], _PlotDistance]);

if (s_player_plot_boundary_on < 0) then {
If (_PlotsmarkersNear == 0 ) then{
s_player_plot_boundary_on = player addAction ["Show plot boundary", "Custom\A_Plot_for_Life\Action\object_showPlotRadius.sqf", "", 1, false];
};
};
if (s_player_plot_boundary_off < 0) then {
If (_PlotsmarkersNear > 0 ) then{
s_player_plot_boundary_off = player addAction ["Remove plot boundary", "Custom\A_Plot_for_Life\Action\object_removePlotRadius.sqf", "", 1, false];
};
};
if (s_player_plot_take_ownership < 0) then {
if (DZE_PlotOwnership) then {
_isowner = [player, _cursorTarget] call FNC_check_owner;
If (( _isowner select 0 )) then{
s_player_plot_take_ownership = player addAction ["Take plot items ownership", "Custom\A_Plot_for_Life\Action\plot_take_ownership.sqf", "", 1, false];
};
};
};

5. Найти строку
s_player_maintain_area_preview = -1;
и после вставить
player removeAction s_player_plot_boundary_on;
s_player_plot_boundary_on = -1;
player removeAction s_player_plot_boundary_off;
s_player_plot_boundary_off = -1;
player removeAction s_player_plot_take_ownership;
s_player_plot_take_ownership = -1;

6. Найти
if(_isModular && (dayz_characterID == _ownerID)) then {
и заменить на
if(_isModular && (_playerUID == _ownerID)) then {

7. Найти
if(_isModularDoor && (dayz_characterID == _ownerID)) then {
и заменить на
if(_isModularDoor && (_playerUID == _ownerID)) then {

8. Найти
if(!_isMan && _ownerID != "0" && !(_cursorTarget isKindOf "Bicycle")) then {
и заменить на
if(!_isMan && _characterID != "0" && !(_cursorTarget isKindOf "Bicycle")) then {

9. Найти
s_player_deleteBuild = player addAction [format[localize "str_actions_delete",_text], "\z\addons\dayz_code\actions\remove.sqf",_cursorTarget, 1, true, true, "", ""];
и заменить на
s_player_deleteBuild = player addAction [format[localize "str_actions_delete",_text], "Custom\A_Plot_for_Life\Action\remove.sqf",_cursorTarget, 1, true, true, "", ""];

10. Найти
_hasKey = _ownerID in _temp_keys;
_oldOwner = (_ownerID == dayz_playerUID);
и заменить на
_hasKey = _characterID in _temp_keys;
_oldOwner = (_characterID == dayz_playerUID);

11. Найти строку
_Unlock = player addAction [format[localize "STR_EPOCH_ACTIONS_UNLOCK",_text], "\z\addons\dayz_code\actions\unlock_veh.sqf",[_cursorTarget,(_temp_keys_names select (parseNumber _ownerID))], 2, true, true, "", ""];
и заменить на
_Unlock = player addAction [format[localize "STR_EPOCH_ACTIONS_UNLOCK",_text], "\z\addons\dayz_code\actions\unlock_veh.sqf",[_cursorTarget,(_temp_keys_names select (parseNumber _characterID))], 2, true, true, "", ""];

12. Найти
if (_ownerID == dayz_characterID) then {
и заменить на
if (_ownerID == _playerUID) then {

13. Найти строку
s_player_packtent = player addAction [localize "STR_EPOCH_ACTIONS_DESTROYTENT", "\z\addons\dayz_code\actions\remove.sqf",_cursorTarget, 1, true, true, "", ""];
и заменить на
s_player_packtent = player addAction [localize "STR_EPOCH_ACTIONS_DESTROYTENT", "Custom\A_Plot_for_Life\Action\remove.sqf",_cursorTarget, 1, true, true, "", ""];

14. Найти
if((_typeOfCursorTarget in DZE_LockableStorage) && _ownerID != "0" && (player distance _cursorTarget < 3)) then {
Заменить на
if((_typeOfCursorTarget in DZE_LockableStorage) && _characterID != "0" && (player distance _cursorTarget < 3)) then {

15. Найти (2 строки)
if(_ownerID == dayz_combination || _ownerID == dayz_playerUID) then {
Заменить
if(_characterID == dayz_combination || _ownerID == _playerUID) then {

16. Найти
if(_ownerID != dayz_combination && _ownerID != dayz_playerUID) then {
Заменить
if(_characterID != dayz_combination && _ownerID != _playerUID) then {

17. Найти
if(_typeOfCursorTarget in DZE_UnLockedStorage && _ownerID != "0" && (player distance _cursorTarget < 3)) then {
Заменить
if(_typeOfCursorTarget in DZE_UnLockedStorage && _characterID != "0" && (player distance _cursorTarget < 3)) then {

18. Найти
if (s_player_packvault < 0 && (_ownerID == dayz_combination || _ownerID == dayz_playerUID)) then {
Заменить
if (s_player_packvault < 0 && (_characterID == dayz_combination || _ownerID == dayz_playerUID)) then {

19. Найти
s_player_upgrade_build = player addAction [format[localize "STR_EPOCH_ACTIONS_UPGRADE",_text], "\z\addons\dayz_code\actions\player_upgrade.sqf",_cursorTarget, -1, false, true, "",""];
Заменить
s_player_upgrade_build = player addAction [format[localize "STR_EPOCH_ACTIONS_UPGRADE",_text], "Custom\A_Plot_for_Life\Action\player_upgrade.sqf",_cursorTarget, -1, false, true, "",""];

20. Найти
if((_isDestructable || _cursorTarget isKindOf "Land_DZE_WoodDoorLocked_Base" || _cursorTarget isKindOf "CinderWallDoorLocked_DZ_Base") && (DZE_Lock_Door == _ownerID)) then {
Заменить
if((_isDestructable || _cursorTarget isKindOf "Land_DZE_WoodDoorLocked_Base" || _cursorTarget isKindOf "CinderWallDoorLocked_DZ_Base") && (DZE_Lock_Door == _characterID)) then {

21. Найти
s_player_downgrade_build = player addAction [format[localize "STR_EPOCH_ACTIONS_REMLOCK",_text], "\z\addons\dayz_code\actions\player_buildingDowngrade.sqf",_cursorTarget, -2, false, true, "",""];
Заменить
s_player_downgrade_build = player addAction [format[localize "STR_EPOCH_ACTIONS_REMLOCK",_text], "Custom\A_Plot_for_Life\Action\player_buildingDowngrade.sqf",_cursorTarget, -2, false, true, "",""];

22. Найти
if(_isTent && _ownerID == dayz_characterID) then {
Заменить
if(_isTent && _ownerID == _playerUID) then {

23. Найти
if (_isDog && _isAlive && (_hasRawMeat) && _ownerID == "0" && player getVariable ["dogID", 0] == 0) then {
Заменить
if (_isDog && _isAlive && (_hasRawMeat) && _characterID == "0" && player getVariable ["dogID", 0] == 0) then {

24. Найти
if (_isDog && _ownerID == dayz_characterID && _isAlive) then {
Заменить
if (_isDog && _characterID == dayz_characterID && _isAlive) then {

25. Найти(которая ближе к концу файла)
player removeAction s_player_SurrenderedGear;
s_player_SurrenderedGear = -1;
Ниже этих строк вставить
player removeAction s_player_maintain_area;
s_player_maintain_area = -1;
player removeAction s_player_maintain_area_preview;
s_player_maintain_area_preview = -1;
player removeAction s_player_plot_boundary_on;
s_player_plot_boundary_on = -1;
player removeAction s_player_plot_boundary_off;
s_player_plot_boundary_off = -1;
player removeAction s_player_plot_take_ownership;
s_player_plot_take_ownership = -1;

26. Найти
_ownerID = "0";
if (!isNull cursorTarget) then { _ownerID = cursorTarget getVariable ["CharacterID","0"]; };
if (_canDo && !_inVehicle && alive _dog && _ownerID != dayz_characterID) then {
Заменить
_characterID = "0";
if (!isNull cursorTarget) then { _characterID = cursorTarget getVariable ["CharacterID","0"]; };
if (_canDo && !_inVehicle && alive _dog && _characterID != dayz_characterID) then {

 
player_lockVault.sqf

1. В секцию private в конец добавить "_characterID","_PlayerUID"

2. Найти
_ownerID = _obj getVariable["CharacterID","0"];
Заменить на
_characterID = _obj getVariable["CharacterID","0"];

3. После строки
_objectUID = _obj getVariable["ObjectUID","0"];
Вставить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
}else{
_PlayerUID = dayz_characterID;
};

4. Найти
if((_ownerID != dayz_combination) && (_ownerID != dayz_playerUID)) exitWith {DZE_ActionInProgress = false; s_player_lockvault = -1; cutText [format[(localize "str_epoch_player_115"),_text], "PLAIN DOWN"]; };
Заменить на
if((_characterID != dayz_combination) && (_ownerID != _PlayerUID)) exitWith {DZE_ActionInProgress = false; s_player_lockvault = -1; cutText [format[(localize "str_epoch_player_115"),_text], "PLAIN DOWN"]; };

5. Найти
_holder setVariable["CharacterID",_ownerID,true];
Заменить на
_holder setVariable["CharacterID",_characterID,true];
После строки
_holder setVariable ["OEMPos", _pos, true];
Вставить
_holder setVariable ["ownerPUID", _ownerID , true];

 
player_packTent.sqf

1. В секцию private в конец вставить "_playerUID"

2. Найти
_ownerID = _obj getVariable["CharacterID","0"];
Заменить
_ownerID = _obj getVariable["ownerPUID","0"];
После строки
_objectUID = _obj getVariable["ObjectUID","0"];
Вставить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
}else{
_playerUID = dayz_characterID;
};

3. Найти
if(_ownerID != dayz_characterID) exitWith {DZE_ActionInProgress = false; s_player_packtent = -1; cutText [localize "str_fail_tent_pack", "PLAIN DOWN"];};
Заменить на
if(_ownerID != _playerUID) exitWith {DZE_ActionInProgress = false; s_player_packtent = -1; cutText [localize "str_fail_tent_pack", "PLAIN DOWN"];};

 
player_packVault.sqf

1. В секцию private добавить "_playerUID","_combination"

2. Найти
_ownerID = _obj getVariable["CharacterID","0"];
Заменить на
_combination = _obj getVariable["characterID","0"];
_ownerID = _obj getVariable["ownerPUID","0"];
После строки
_objectUID = _obj getVariable["ObjectUID","0"];
Вставить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
}else{
_PlayerUID = dayz_characterID;
};

3. Найти
if((_ownerID != dayz_combination) && (_ownerID != dayz_playerUID)) exitWith { DZE_ActionInProgress = false; s_player_packvault = -1; cutText [format[(localize "str_epoch_player_119"),_text], "PLAIN DOWN"];};
Заменить на
if((_combination != dayz_combination) && (_ownerID != _playerUID)) exitWith { DZE_ActionInProgress = false; s_player_packvault = -1; cutText [format[(localize "str_epoch_player_119"),_text], "PLAIN DOWN"];};

 
player_unlockVault.sqf

1. В секцию private добавить "_characterID","_playerUID"

2. Найти
_ownerID = _obj getVariable["CharacterID","0"];
Заменить на
_characterID = _obj getVariable["CharacterID","0"];
_ownerID = _obj getVariable["ownerPUID","0"];
И после этой строки
_ownerID = _obj getVariable["ownerPUID","0"];
Вставить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
}else{
_playerUID = dayz_characterID;
};

3. Найти
// Promt user for password if _ownerID != dayz_playerUID
if ((_ownerID == dayz_combination) || (_ownerID == dayz_playerUID)) then {
Заменить на
// Prompt user for password if _ownerID != _playerUID
if ((_characterID == dayz_combination) || (_ownerID == _playerUID)) then {

4. Найти
_playerID = getPlayerUID player;
Заменить на
_playerID = [player] call FNC_GetPlayerUID;

5. Найти
_holder setVariable["CharacterID",_ownerID,true];
Заменить на
_holder setVariable["CharacterID",_characterID,true];
После строки
_holder setVariable ["OEMPos", _pos, true];
Вставить
_holder setVariable ["ownerPUID", _ownerID , true];

 
player_updateGui.sqf

1. Найти
_charID = player getVariable ["CharacterID", "0"];
Заменить на
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
_rplayerUID = [_humanityTarget] call FNC_GetPlayerUID;
}else{
_playerUID = player getVariable ["CharacterID", "0"];
_rplayerUID = _humanityTarget getVariable ["CharacterID", "0"];
};

2. Удалить строку
_rcharID = _humanityTarget getVariable ["CharacterID", "0"];

3. Найти
if ((_rcharID in _friendlies) && (_charID in _rfriendlies)) then {
Заменить на
if ((_rplayerUID in _friendlies) && (_playerUID in _rfriendlies)) then {

4. Найти
if !(_charID in _rfriendlyTo) then {
Заменить
if !(_playerUID in _rfriendlyTo) then {

5. Найти
_rfriendlyTo set [count _rfriendlyTo, _charID];
Заменить на
_rfriendlyTo set [count _rfriendlyTo, _playerUID];

 
object_showPlotRadius.sqf

1. В секцию private добавить "_light","_lightlocationtemp","_lightlocation","_lightarray"

2. После строки
_nearPlotPole = nearestObject [player, "Plastic_Pole_EP1_DZ"];
Вставить
_lightarray = [];

3. После строки
_BD_center = [_nearPlotPole] call FNC_getPos;
Вставить
_color = "#(argb,8,8,3)color(0.99,0.65,0.06,1,ca)"; //dark orange

4. Строку
for "_i" from 0 to 360 step (270 / _BD_radius) do {
Изменить на
for "_i" from 0 to 360 step (450 / _BD_radius) do {

5. Найти
_location = [(_BD_center select 0) + ((cos _i) * _BD_radius), (_BD_center select 1) + ((sin _i) * _BD_radius), _BD_center select 2];
Заменить на
_location = [(_BD_center select 0) + ((cos _i) * _BD_radius), (_BD_center select 1) + ((sin _i) * _BD_radius), (_BD_center select 2) - 0.18];

6. Найти
_object = createVehicle ["Plastic_Pole_EP1", _location, [], 0, "CAN_COLLIDE"];
Заменить на
_object = createVehicle ["Land_coneLight", _location, [], 0, "CAN_COLLIDE"];
_object setVariable ["Inventory", ["PPMarker"],true];
_object enableSimulation false;

 
player_build.sqf

1. В секцию private добавить "_playerID", "_playerUID","_ownerID"

2. После строки
_inVehicle = (_vehicle != player);
Вставить
_playerUID = [player] call FNC_GetPlayerUID;

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

3. Найти
if(_isPole && _IsNearPlot > 0) exitWith { DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_44") , "PLAIN DOWN"]; };
Заменить на
if(_isPole && _IsNearPlot > 0) exitWith { DZE_ActionInProgress = false; cutText [(format [localize "str_epoch_player_44", DZE_PlotPole select 1]) , "PLAIN DOWN"]; };

4. Найти
_ownerID = _nearestPole getVariable ["CharacterID","0"];
Заменить
_ownerID = _nearestPole getVariable ["ownerPUID","0"];

5. Найти
if(dayz_characterID == _ownerID) then { //Keep ownership
Заменить
if(_playerID == _ownerID) then { //Keep ownership

6. Найти
_tmpbuilt setVariable ["CharacterID",_combination,true];
После неё вставить
_tmpbuilt setVariable ["ownerPUID",_playerID,true];

7. Найти
cutText [format[(localize "str_epoch_player_140"),_combinationDisplay,_text], "PLAIN DOWN", 5];
После неё вставить
systemChat format [(localize "str_epoch_player_140"),_combinationDisplay,_text];

8. PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location],_classname];
Заменить
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location,_playerUID],_classname];

 
player_buildingDowngrade.sqf

1. В секцию private добавить "_playerUID"

2. После строки
_needText = localize "str_epoch_player_246";
Вставить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
}else{
_playerUID = dayz_characterID;
};

3. Найти
_ownerID = _nearestPole getVariable["CharacterID","0"];
Заменить
_ownerID = _nearestPole getVariable["ownerPUID","0"];

4. Найти
if(dayz_characterID == _ownerID) then {
Заменить
if(_playerUID == _ownerID) then {

5. Найти
_objectCharacterID = _obj getVariable ["CharacterID","0"];
После неё вставить
_ownerID = _obj getVariable["ownerPUID","0"];

6. Найти
_object setPosATL _location;
После неё вставить

7. Найти
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location],_classname,_obj,player];
Заменить
_playerUID = [player] call FNC_GetPlayerUID;
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location,_playerUID],_classname,_obj,player];

 
player_tagFriendly.sqf

1. Найти
_callerID = _caller getVariable ["CharacterID", "0"];
_targetID = _target getVariable ["CharacterID", "0"];
Заменить
if (DZE_APlotforLife) then {
_callerID = [_caller] call FNC_GetPlayerUID;
_targetID = [_target] call FNC_GetPlayerUID;
}else{
_callerID = _caller getVariable ["CharacterID", "0"];
_targetID = _target getVariable ["CharacterID", "0"];
};

 
player_upgrade.sqf

1. В секцию private добавить "_playerUID"

2. Найти
_ownerID = _nearestPole getVariable["CharacterID","0"];
Заменить
_ownerID = _nearestPole getVariable["ownerPUID","0"];
И под ней вставить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
}else{
_playerUID = dayz_characterID;
};

3. Найти
if(dayz_characterID == _ownerID) then {
Заменить
if(_playerUID == _ownerID) then {

4. Найти
_objectCharacterID = _obj getVariable ["CharacterID","0"];
После вставить
_ownerID = _obj getVariable["ownerPUID","0"];

5. Найти
_object setPosATL _location;
После вставить
// Set Owner.
_object setVariable ["ownerPUID",_ownerID,true];

6. Найти
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location],_classname,_obj,player];
Заменить
_playerUID = [player] call FNC_GetPlayerUID;
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location, _playerUID],_classname,_obj,player];

 
remove.sqf

1. В секцию private добавить "_playerUID"

2. Найти
_objOwnerID = _obj getVariable["CharacterID","0"];
Заменить
_objOwnerID = _obj getVariable["ownerPUID","0"];

3. Найти
_isOwnerOfObj = (_objOwnerID == dayz_characterID);
Заменить
if (DZE_APlotforLife) then {
_playerUID = [player] call FNC_GetPlayerUID;
_isOwnerOfObj = (_objOwnerID == _playerUID);
}else{
_playerUID = dayz_characterID;
_isOwnerOfObj = (_objOwnerID == dayz_characterID);
};

4. Найти
_ownerID = _nearestPole getVariable["CharacterID","0"];
Заменить
_ownerID = _nearestPole getVariable["ownerPUID","0"];

5. Найти
if(dayz_characterID != _ownerID) then {
Заменить
if(_playerUID != _ownerID) then {

 
tent_pitch.sqf

1. В секцию private добавить "_playerUID"

2. Найти
_isOk = [(vehicle player),_building] call fnc_isInsideBuilding;
После добавить
_playerUID = [player] call FNC_GetPlayerUID;

if (DZE_APlotforLife) then {
_OwnerUID = _playerUID;
}else{
_OwnerUID = dayz_characterID;
};

3. Найти
_object setVariable ["CharacterID",dayz_characterID,true];
После добавить
_object setVariable ["ownerPUID",_OwnerUID,true];

4. Найти
PVDZE_obj_Publish = [dayz_characterID,_object,[_dir,_location],_classname];
Заменить
PVDZE_obj_Publish = [dayz_characterID,_object,[_dir,_location, _playerUID],_classname];

 
vault_pitch.sqf

1. В секцию private добавить "_playerUID","_OwnerUID"

2. Найти
_location = player modeltoworld [_offset_x,_offset_y,_offset_z];
После добавить
_playerUID = [player] call FNC_GetPlayerUID;

if (DZE_APlotforLife) then {
_OwnerUID = _playerUID;
}else{
_OwnerUID = dayz_characterID;
};

3. Найти
_tent setVariable ["CharacterID",_combination,true];
После добавить
_tent setVariable ["ownerPUID",_OwnerUID,true];

4. Найти
PVDZE_obj_Publish = [_combination,_tent,[_dir,_location],"VaultStorageLocked"];
Заменить
PVDZE_obj_Publish = [_combination,_tent,[_dir,_location, _playerUID],"VaultStorageLocked"];

 
dayz_spaceInterrupt.sqf

1. Найти
//Prevent exploit of drag body
if ((_dikCode in actionKeys "Prone") && r_drag_sqf) exitWith { force_dropBody = true; };
Выше вставить
//Prevent exploit of glitching through doors
if (_dikCode in actionKeys "Prone") then {
_doors = nearestObjects [player, DZE_DoorsLocked, 3];
if (count _doors > 0) then {
_handled = true;
};
};

2. В самый конец файла, но выше _handled вставить
// F key
if ((_dikCode == 0x21 && (!_alt && !_ctrl)) || (_dikCode in actionKeys "User6")) then {
DZE_F = true;
};

 
Откройте файл init.sqf(который в MPMissions\DayZ_Epoch_11.Chernarus)

1. Добавьти переменные после DZE_BuildOnRoads = false;
DZE_APlotforLife = true;
DZE_PlotOwnership = true;
DZE_modularBuild = true;

2. Проверьте правильность путей к кастомным файлам variables.sqf, publicEH.sqf, compiles.sqf

 
Откройте description.ext
В самый конец файла добавьте
#include "custom\snap_pro\snappoints.hpp"
 
Если Вы скопировали из архива файл compiles.sqf и не вносили в него изменений, то исправьте в конце этого файла путь к server_functions.sqf на штатный
call compile preprocessFileLineNumbers "\z\addons\dayz_server\init\server_functions.sqf";
 
Если будет возмущаться BattlEye, то в файл createvehicle.txt добавить исключение !="Land_coneLight" в строку, начинающийся с: 5 "Land_"(у меня она 50) 
 
                                                    ****Установка векторов****
 
Папку BuildVectors из DayzBuildVectors-master закинуть к себе в \MPMissions\DayZ_Epoch_11.Chernarus\Custom
Откройте папки  A_Plot_for_Life и Snap_Pro, если Вы ни чего не вносили в эти файлы, то просто скопируйте их в соответствующие папки с заменой.
Если же Вы вносили какие-то свои изменения, то читаем гайд дальше, там будет расписано что и где заменить.                                                
 
Клиентская часть:
В файле init.sqf добавить переменные после DZE_modularBuild = true;

DZE_noRotate = []; //Objects that cannot be rotated. Ex: DZE_noRotate = ["ItemVault"] (NOTE: The objects magazine classname)
DZE_vectorDegrees = [0.01, 0.1, 1, 5, 15, 45, 90];
DZE_curDegree = 45; //Starting rotation angle. //Prefered any value in array above
DZE_dirWithDegrees = true; //When rotating objects with Q&E, use the custom degrees

 
В файле variables.sqf добавить переменные в блок dayz_resetSelfActions = {

s_player_toggleDegree = -1;
s_player_toggleDegrees=[];
degreeActions = -1;
s_player_toggleVector = -1;
s_player_toggleVectors=[];
vectorActions = -1;

 
В файле compile.sqf добавить после строки FNC_check_owner =

fnc_SetPitchBankYaw = compile preprocessFileLineNumbers "Custom\BuildVectors\fnc_SetPitchBankYaw.sqf";
DZE_build_vector_file = "Custom\BuildVectors\build_vectors.sqf";
build_vectors = compile preprocessFileLineNumbers DZE_build_vector_file;

 
snap_build.sqf

1. Найти
s_player_toggleSnap = player addaction [format[("" + ("Snap: %1") +""),snapActionState],DZE_snap_build_file,[snapActionState,_object,_classname,_objectHelper],6,false,true];
Заменить
s_player_toggleSnap = player addaction [format[("" + ("Snap: %1") +""),snapActionState],DZE_snap_build_file,[snapActionState,_object,_classname,_objectHelper],10,false,true];

2. Найти
s_player_toggleSnapSelect = player addaction [format[("" + ("Snap Point: %1") +""),snapActionStateSelect],DZE_snap_build_file,[snapActionStateSelect,_object,_classname,_objectHelper],5,false,true];
Заменить
s_player_toggleSnapSelect = player addaction [format[("" + ("Snap Point: %1") +""),snapActionStateSelect],DZE_snap_build_file,[snapActionStateSelect,_object,_classname,_objectHelper],9,false,true];

3. Найти
{snapActions = player addaction [format[("" + ("%1)Select: %2") +""),_cnt,_x select 3],DZE_snap_build_file,["Selected",_object,_classname,_objectHelper,_cnt],4,false,false];
Заменить
{snapActions = player addaction [format[("" + ("%1)Select: %2") +""),_cnt,_x select 3],DZE_snap_build_file,["Selected",_object,_classname,_objectHelper,_cnt],8,false,false];

4. Найти
_objectSnapGizmo setDir (getDir _nearbyObject);
Заменить
_objectSnapGizmo setDir (_nearbyObject getVariable["memDir",0]);

5. Найти
_objectHelper setDir _distClosestPointFoundDir;
Заменить
DZE_memDir = _distClosestPointFoundDir;
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;

6. Найти
_objectHelper setDir _distClosestPointFoundDir;
Заменить
DZE_memDir = _distClosestPointFoundDir;
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;

7. Найти
if (!helperDetach) then {_objectHelper attachTo [player]; _objectHelper setDir ((getDir _objectHelper)-(getDir player));};
Под ней добавить
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;

 
modular_build.sqf

1. В секцию private добавить "_vector"

2. Найти
DZE_cancelBuilding = false;
После вставить
DZE_updateVec = false;
DZE_memDir = 0;
DZE_memForBack = 0;
DZE_memLeftRight = 0;

3. Найти
_dir = _controls select 3; //int
Под ней вставить
_vector = _controls select 4; //array

4. Найти
[_cancel, _position, _classnametmp,_isAllowedUnderGround, _text, _isPole, _lockable,_dir, _reason] call player_build_publish;
Заменить
[_cancel, _position, _classnametmp,_isAllowedUnderGround, _text, _isPole, _lockable,_dir, _reason, _vector] call player_build_publish;

 

player_build.sqf

 

1. В секцию private добавить "_buildcheck","_isowner","_isfriendly","_maxBuildDistance","_vector","_buildOffset","_vUp"

2. Найти
if((count ((getPosATL player) nearObjects ["All",30])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_41"), "PLAIN DOWN"];};
Заменить
3. if((count (([player] call FNC_GetPos) nearObjects ["All",30])) >= DZE_BuildingLimit) exitWith {DZE_ActionInProgress = false; cutText [(localize "str_epoch_player_41"), "PLAIN DOWN"];};

4. Найти
DZE_cancelBuilding = false;
Вставить ниже
DZE_updateVec = false;

5. Найти
_isNear = {inflamed _x} count (getPosATL player nearObjects _distance);
Заменить
_isNear = {inflamed _x} count (([player] call FNC_GetPos) nearObjects _distance);

6. Найти
_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};

7. Найти
// Allow building of plot
if(_requireplot == 0 || _isLandFireDZ) then {
Заменить
// Allow building of plotpole or items not requiring a plot pole
if(!(_requireplot) || _isLandFireDZ) then {

8. Найти этот блок
} 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"];

// check if friendly to owner
if(_playerID == _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;
};
};
};
};
Заменить на
} 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;
};
};

9. Найти
// get inital players position
_location1 = getPosATL player;
Заменить
// 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];

10. Найти
_position = getPosATL _object;
Заменить
_position = [_object] call FNC_GetPos;

11. Найти
_objHDiff = 0;
После добавить
if !(_item in DZE_noRotate) then{
["","","",["Init","Init",0]] spawn build_vectors;
};

12. Найти
if (DZE_4) then {
_rotate = true;
DZE_4 = false;
_dir = 180;
};
Заменить
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;
};
};

13. Найти
if (DZE_6) then {
_rotate = true;
DZE_6 = false;
_dir = 0;
};
Заменить
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;
};

14. Найти
if(_rotate) then {
_object setDir _dir;
_object setPosATL _position;
//diag_log format["DEBUG Rotate BUILDING POS: %1", _position];
};
Заменить
if(_rotate) then {
[_object,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;
};

15. Найти
_object attachTo [player];
После вставить
[_object,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;

16. Найти
_dir = getDir _object;
После вставить
_vector = [(vectorDir _object),(vectorUp _object)];

17. Найти
// 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;
};
};

18. Найти
_tmpbuilt setPosATL _location;
Заменить

19. Найти[player,_dis,true,(getPosATL player)] spawn player_alertZombies;
Заменить
[player,_dis,true,([player] call FNC_GetPos)] spawn player_alertZombies;

20. Найти
PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location,_playerUID],_classname];
Заменить
PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location,_playerUID,_vector],_classname];

21. Найти
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location,_playerUID],_classname];
Заменить
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location,_playerUID,_vector],_classname];

 

 

player_build_controls.sqf

 

1. В секцию private добавить "_vector"

2. Найти
if (DZE_4) then {
_rotate = true;
DZE_4 = false;
_dir = -45;
};
Заменить
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;
};
};

3. Найти
if (DZE_6) then {
_rotate = true;
DZE_6 = false;
_dir = 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{
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;
DZE_updateVec = false;
};

4. Найти
if (DZE_F and _canDo) then {
if (helperDetach) then {
_objectHelperDir = getDir _objectHelper;
_objectHelper attachTo [player];
_objectHelper setDir _objectHelperDir-(getDir player);
helperDetach = false;
} else {
_objectHelperDir = getDir _objectHelper;
detach _objectHelper;
[_objectHelper] call FNC_GetSetPos;
_objectHelper setVelocity [0,0,0]; //fix sliding glitch
helperDetach = true;
};
DZE_F = false;
};
Заменить
if (DZE_F and _canDo) then {
if (helperDetach) then {
_objectHelper attachTo [player];
DZE_memDir = DZE_memDir-(getDir player);
helperDetach = false;
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;
} else {
_objectHelperPos = getPosATL _objectHelper;
detach _objectHelper;
DZE_memDir = getDir _objectHelper;
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;
_objectHelper setPosATL _objectHelperPos;
_objectHelper setVelocity [0,0,0]; //fix sliding glitch
helperDetach = true;
};
DZE_F = false;
};

5. Найти
if(_rotate) then {
if (helperDetach) then {
_objectHelperDir = getDir _objectHelper;
_objectHelper setDir _objectHelperDir+_dir;
[_objectHelper] call FNC_GetSetPos;
} else {
detach _objectHelper;
_objectHelperDir = getDir _objectHelper;
_objectHelper setDir _objectHelperDir+_dir;
[_objectHelper] call FNC_GetSetPos;
_objectHelperDir = getDir _objectHelper;
_objectHelper attachTo [player];
_objectHelper setDir _objectHelperDir-(getDir player);
};
};
Заменить
if(_rotate) then {
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;
};

6. Найти
if (!helperDetach) then {
_objectHelper attachTo [player];
_objectHelper setDir _objectHelperDir-(getDir player);
};
Заменить
if (!helperDetach) then {
_objectHelper attachTo [player];
};
[_objectHelper,[DZE_memForBack,DZE_memLeftRight,DZE_memDir]] call fnc_SetPitchBankYaw;

7. Найти
_dir = getDir _object;
После вставить
_vector = [(vectorDir _object),(vectorUp _object)];

Найти
_passArray = [_cancel,_reason,_position,_dir];
_passArray //[bool,string,array,int]
Заменить
_passArray = [_cancel,_reason,_position,_dir,_vector];
_passArray //[bool,string,array,int,array]

 

 

player_build_create.sqf

 

1. Найти
_passArray = [_location1,_object,_objectHelper];
Вставить выше
if !(DZE_buildItem in DZE_noRotate) then{
["","","",["Init","Init",0]] spawn build_vectors;
};


player_build_publish.sqf
1. В секцию private добавить "_vector","_buildOffset","_vUp"

2. Найти
_reason = _this select 8;
После вставить
_vector = _this select 9;

3. Найти
_tmpbuilt setdir _dir; //set direction inherited from passed args from control
После вставить
_tmpbuilt setVariable["memDir",_dir,true];

4. Найти
if((_isAllowedUnderGround == 0) && ((_location select 2) < 0)) then { //check Z axis if not allowed to build underground
_location set [2,0]; //reset Z axis to zero (above terrain)
};
После вставить
_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)
];

5. Найти
PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location,_playerUID],_classname];
Заменить
PVDZE_obj_Publish = [_combination,_tmpbuilt,[_dir,_location,_playerUID,_vector],_classname];

6. Найти
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location,_playerUID],_classname];
Заменить
PVDZE_obj_Publish = [dayz_characterID,_tmpbuilt,[_dir,_location,_playerUID,_vector],_classname];

 

 

player_buildingDowngrade.sqf

 

1. В секцию private добавить "_vector"

2. Найти
// Get direction
_dir = getDir _obj;
После вставить
// Get vector
_vector = [(vectorDir _obj),(vectorUp _obj)];

3. Найти
// Set direction
_object setDir _dir;
После вставить
_object setVariable["memDir",_dir,true];

// Set vector
_object setVectorDirAndUp _vector;

4. Найти
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location,_playerUID],_classname,_obj,player];
Заменить
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location,_playerUID,_vector],_classname,_obj,player];

 

 

player_upgrade.sqf

 

1. В секцию private добавить "_vector"

2. Найти
// Get direction
_dir = getDir _obj;
После добавить
// Get vector
_vector = [(vectorDir _obj),(vectorUp _obj)];

3. Найти
// Set direction
_object setDir _dir;
После добавить
_object setVariable["memDir",_dir,true];

// Set vector
_object setVectorDirAndUp _vector;

4. Найти
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location, _playerUID],_classname,_obj,player];
Заменить
PVDZE_obj_Swap = [_objectCharacterID,_object,[_dir,_location, _playerUID,_vector],_classname,_obj,player];

 

 

plot_take_ownership.sqf

 

1. В секцию private добавить "_vector"

2. Найти
_position = getPosATL _object;
_worldspace = [round(direction _object),_position,_playerUID];
Заменить
_position = [_object] call FNC_GetPos;
_vector = [(vectorDir _object),(vectorUp _object)];
_worldspace = [round(direction _object),_position,_playerUID,_vector];

 

 

player_lockVault.sqf

 

1. В секцию private добавить "_vector"

2. Найти
_dir = direction _obj;
Вставить после
_vector = [(vectorDir _obj),(vectorUp _obj)];

3. Найти
_holder setdir _dir;
Вставить после
_holder setVariable["memDir",_dir,true];
_holder setVectorDirAndUp _vector;

 

 

player_unlockVault.sqf

 

1. В секцию private добавить "_vector"

2. Найти
_dir = direction _obj;
Вставить после
_vector = [(vectorDir _obj),(vectorUp _obj)];

3. Найти
_holder setdir _dir;
Вставить после
_holder setVariable["memDir",_dir,true];
_holder setVectorDirAndUp _vector;

 

 

Серверная часть:
server_monitor.sqf

1. Найти
if (!_wsDone) then {
if (count _worldspace >= 1) then { _dir = _worldspace select 0; };
_pos = [getMarkerPos "center",0,4000,10,0,2000,0] call BIS_fnc_findSafePos;
if (count _pos < 3) then { _pos = [_pos select 0,_pos select 1,0]; };
diag_log ("MOVED OBJ: " + str(_idKey) + " of class " + _type + " to pos: " + str(_pos));
};
После вставить
_vector = [[0,0,0],[0,0,0]];
_vecExists = false;
_ownerPUID = "0";
if (count _worldspace >= 3) then{
if(count _worldspace == 3) then{
if(typename (_worldspace select 2) == "STRING")then{
_ownerPUID = _worldspace select 2;
}else{
if(typename (_worldspace select 2) == "ARRAY")then{
_vector = _worldspace select 2;
if(count _vector == 2)then{
if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
_vecExists = true;
};
};
};
};

}else{
//Was not 3 elements, so check if 4 or more
if(count _worldspace == 4) then{
if(typename (_worldspace select 3) == "STRING")then{
_ownerPUID = _worldspace select 3;
}else{
if(typename (_worldspace select 2) == "STRING")then{
_ownerPUID = _worldspace select 2;
};
};


if(typename (_worldspace select 2) == "ARRAY")then{
_vector = _worldspace select 2;
if(count _vector == 2)then{
if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
_vecExists = true;
};
};
}else{
if(typename (_worldspace select 3) == "ARRAY")then{
_vector = _worldspace select 3;
if(count _vector == 2)then{
if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
_vecExists = true;
};
};
};
};

}else{
//More than 3 or 4 elements found
//Might add a search for the vector, ownerPUID will equal 0
};
};
};

2. Найти
_object setVariable ["ObjectID", _idKey, true];
Вставить после
_object setVariable ["ownerPUID", _ownerPUID, true];

3. Найти
_object setdir _dir;
После вставить
if(_vecExists)then{
_object setVectorDirAndUp _vector;
};

4. Найти
if (DZE_GodModeBase) then {
Выше вставить
_object setVariable["memDir",_dir,true];

 
server_functions.sqf

1. Найти
dayz_objectUID2 = {
private["_position","_dir","_key"];
_dir = _this select 0;
_key = "";
_position = _this select 1;
{
_x = _x * 10;
if ( _x < 0 ) then { _x = _x * -10 };
_key = _key + str(round(_x));
} count _position;
_key = _key + str(round(_dir));
_key
};
Заменить
dayz_objectUID2 = {
private["_position","_dir","_key","_element","_vector","_set","_vecCnt","_usedVec"];
_dir = _this select 0;
_key = "";
_position = _this select 1;

if((count _this) == 2) then{
{
_x = _x * 10;
if ( _x < 0 ) then { _x = _x * -10 };
_key = _key + str(round(_x));
} count _position;
_key = _key + str(round(_dir));
}else{
_vector = [];
_usedVec = false;
{
_element = _x;
if(typeName _element == "ARRAY") then{
_vector = _element;
if((count _vector) == 2)then{
if(((count (_vector select 0)) == 3) && ((count (_vector select 1)) == 3))then{
{
_x = _x * 10;
if ( _x < 0 ) then { _x = _x * -10 };
_key = _key + str(round(_x));
} count _position;

_vecCnt = 0;
{
_set = _x;
{
_vecCnt = _vecCnt + (round (_x * 100));

} foreach _set;

} foreach _vector;
if(_vecCnt < 0)then{
_vecCnt = ((_vecCnt * -1) * 3);
};
_key = _key + str(_vecCnt);
_usedVec = true;
};
};
};
} count _this;

if!(_usedVec) then{
{
_x = _x * 10;
if ( _x < 0 ) then { _x = _x * -10 };
_key = _key + str(round(_x));
} count _position;
_key = _key + str(round(_dir));
};


};
_key
};

 

1. В файле server_publishObject.sqf
Найти
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _charID, _worldspace, [], [], 0,_uid];
Заменить
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _charID, _worldspace call AN_fnc_formatWorldspace, [], [], 0,_uid];

2. В файле server_functions.sqf
В самый конец файла вставить эти функции
KK_fnc_floatToString = {
private "_arr";
if (abs (_this - _this % 1) == 0) exitWith { str _this };
_arr = toArray str abs (_this % 1);
_arr set [0, 32];
toString (toArray str (
abs (_this - _this % 1) * _this / abs _this
) + _arr - [32])
};

KK_fnc_positionToString = {
format [
"[%1,%2,%3]",
_this select 0 call KK_fnc_floatToString,
_this select 1 call KK_fnc_floatToString,
_this select 2 call KK_fnc_floatToString
]
};

AN_fnc_formatWorldspace = {
private "_ws";
_ws = toArray str _this;
format ["[%1,%2%3]", _this select 0 call KK_fnc_floatToString, _this select 1 call KK_fnc_positionToString, toString ([_ws, (_ws find 93) + 1, count _ws - 2] call BIS_fnc_subSelect)]
};

3. В файле server_swapObject.sqf
Найти
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _charID, _worldspace, [], [], 0,_uid];
Заменить
_key = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance, _class, 0 , _charID, _worldspace call AN_fnc_formatWorldspace, [], [], 0,_uid];

4. В файле server_updateObject.sqf
Найти
_worldspace = [
round (getDir _object),
_position
];
Заменить
_worldspace = [getDir _object, _position] call AN_fnc_formatWorldspace;

5. Выполнить запрос в базу данных через phpMyAdmin или Navicat
DELIMITER ;;
CREATE FUNCTION `RemoveQuotes`(`ws` VARCHAR(128))
RETURNS VARCHAR(128)
DETERMINISTIC
BEGIN
DECLARE dir VARCHAR(128);
DECLARE pos VARCHAR(128);

IF SUBSTRING_INDEX(ws, '"', 4) = ws THEN
RETURN ws;
END IF;

SET dir = TRIM(LEADING '["' FROM SUBSTRING_INDEX(ws, '"', 2));
SET pos = TRIM(LEADING CONCAT('["', dir, '","') FROM SUBSTRING_INDEX(ws, '"', 4));

SET ws = REPLACE(ws, CONCAT('"', dir, '"'), dir);
SET ws = REPLACE(ws, CONCAT('"', pos, '"'), pos);

RETURN ws;
END;;
DELIMITER ;

UPDATE object_data SET Worldspace = RemoveQuotes(Worldspace);
DROP FUNCTION `RemoveQuotes`;

 
Известные ошибки в RPT клиента:

Error in expression _passArray
>
Error position: <_vector];
_passArray
>
Error Undefined variable in expression: _vector
File mpmissions\__CUR_MP.Chernarus\addons\custom\plot4life\player_build_controls.sqf, line 224

Error in expression };
}>
Error position: <_vector] call player_build_publish;
};
}>
Error Undefined variable in expression: _vector
File mpmissions\__CUR_MP.Chernarus\addons\custom\plot4life\modular_build.sqf, line 91

,>

Как её исправить не нашёл решение, но она не влияет на работу скрипта
 
На этом всё. Кто осилил - молодец
Edited by Ник (see edit history)

Share this post


Link to post
Share on other sites



Скрины бы неплохо было ещё...
За перевод плюсик поставил :)

Share this post


Link to post
Share on other sites

Оченьмногабукав!!11

Лови плюс :)

По этой причине все гайды по установке этой бяки сводятся к установки на чистый сервер, скопируйте и замените.

Share this post


Link to post
Share on other sites

Почему то у меня нет файла server_publishFullObject.sqf , да и папок Server\compile 

Share this post


Link to post
Share on other sites
1 час назад, Timofey сказал:

Почему то у меня нет файла server_publishFullObject.sqf , да и папок Server\compile 

 

Всё разобрался прошу прощения за поспешные выводы не в тот архив глянул)

Share this post


Link to post
Share on other sites
В 05.12.2016 в 12:31, Ник сказал:

Я поставил Plot for Life v2.35 , он всё нормально заработал, про блема в то что то его поставил и когда строишь то он пишет нужен плот в пределах 30 метр, а он стоит перед табой вчём проблема может быть так как логи пустые???????????????

 

Share this post


Link to post
Share on other sites

sanekxxz Значит ошибка где-то есть, если он пишет что плот нужен. Логи сервера и клиента выкладывай.

Share this post


Link to post
Share on other sites
18 минут назад, Ник сказал:

sanekxxz Значит ошибка где-то есть, если он пишет что плот нужен. Логи сервера и клиента выкладывай.

 

13:08:22 Error in expression <bject addMagazine _mt;};
};
};

_object setdir _dir;
_object setVectorDirAndUp _>
13:08:22   Error position: <setdir _dir;
_object setVectorDirAndUp _>
13:08:22   Error setdir: Type String, expected Number
13:08:22 File z\addons\dayz_server\system\server_monitor.sqf, line 185

Edited by sanekxxz
Вот такая тока ошибка лог сервера а клиент чистый (see edit history)

Share this post


Link to post
Share on other sites

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Клиент

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Сервер

29 минут назад, Ник сказал:

sanekxxz Значит ошибка где-то есть, если он пишет что плот нужен. Логи сервера и клиента выкладывай.

Вот логи Лог сервера

Лог клиента

Edited by sanekxxz (see edit history)

Share this post


Link to post
Share on other sites

Вот такая вот ещё ошибка в логах 

15:52:18 Error in expression <bject addMagazine _mt;};
};
};

_object setdir _dir;
if(_vecExists) then {
_obje>
15:52:18   Error position: <setdir _dir;
if(_vecExists) then {
_obje>
15:52:18   Error setdir: Type String, expected Number

Share this post


Link to post
Share on other sites

как бэ намекае

File mpmissions\__CUR_MP.Chernarus\fixes\compile\fn_selfActions.sqf, line 313
Error in expression <CursorTarget in DZE_LockableStorage) && _characterID != "0" && (player distance >
  Error position: <_characterID != "0" && (player distance >
  Error Undefined variable in expression: _characterid
File mpmissions\__CUR_MP.Chernarus\fixes\compile\fn_selfActions.sqf, line 548
Error in expression <(_isDog && _isAlive && (_hasRawMeat) && _characterID == "0" && player getVariabl>
  Error position: <_characterID == "0" && player getVariabl>
  Error Undefined variable in expression: _characterid
File mpmissions\__CUR_MP.Chernarus\fixes\compile\fn_selfActions.sqf, line 836
Error in expression <orLocked_DZ_Base") && (DZE_Lock_Door == _characterID)) then
{
if ((s_player_last>
  Error position: <_characterID)) then
{
if ((s_player_last>
  Error Undefined variable in expression: _characterid
File mpmissions\__CUR_MP.Chernarus\fixes\compile\fn_selfActions.sqf, line 677

Share this post


Link to post
Share on other sites

sanekxxz 

1. У тебя сборка Ультимы, а в ней вроде уже должны быть скрипты прилипания и вращения объектов.

2. В этом гайде установка осуществлялась на последний патч Армы(131169), а у тебя 112555.

Share this post


Link to post
Share on other sites
4 часа назад, Ник сказал:

sanekxxz 

1. У тебя сборка Ультимы, а в ней вроде уже должны быть скрипты прилипания и вращения объектов.

2. В этом гайде установка осуществлялась на последний патч Армы(131169), а у тебя 112555.

Хм понятно

Edited by sanekxxz
А где можно найти гайд где только один Plot 4 life поставить? (see edit history)

Share this post


Link to post
Share on other sites

вопросик. Я просмотрел файлы в архиве, и там все добавлено. Их можно просто скопировать с заменой? Сервер чистый

 

P.S. Не увидел сообщение выше. Вопрос отпал сам собой

Edited by psycho85 (see edit history)

Share this post


Link to post
Share on other sites
В 28.10.2017 в 16:18, Ник сказал:

sanekxxz 

1. У тебя сборка Ультимы, а в ней вроде уже должны быть скрипты прилипания и вращения объектов.

2. В этом гайде установка осуществлялась на последний патч Армы(131169), а у тебя 112555.

А тут люди сначала ставят, а потом смотрят.

В сборке и прилипание, и вращение, уже 100лет как стоят(п4л вроде и так в 1062 эпоче встроен, так что и он есть).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Tamirlan
      Народ помогите! У меня проблема! В один момент все персонажи (игроки), когда залетают на остров одеты не в свою одежду и у всех в рюкзаках пустые пластиковые бутылки! не знаю вообще как это исправить! SOS! Есть подозрение что что то произошло с базой данных! но не уверен! Может кто сталкивался с такой проблемой? Как решали... не будьте равнодушными пожалуйста помогите... (началось с того что один из игроков покупал пластиковые бутылки и не заметил что купил слишком много что у него они стали вываливаться и появляться на земле (в рюкзаке место закончилось)) в момент покупки бутылок говорит что что то на секунду подвисло и после этого все кто залетает в игру стали появляться в его одежде и с бутылками. Это было вчера. Сегодня кто то купил одежду сантаклауса и теперь все появляются в одежде санты. Причем если корректно  выйти из миссии и после зайти на последнюю точку подключения все ок. А если выбрать любой город то все как я описывал выше. Плиз помогите решить этот полтергейст!) 
    • By DrTauren
      Собственно, некоторым не нравится стандартный Statusbar, кому-то он не нужен, а кто-то хочет установить свой statusbar, для этого вам пригодится данная статья. Итак, как убрать стандартный statusbar в Altis Life:

      1) Открываем description.ext и комментируем, либо удаляем эту строку:
      #include "dialog\hud_stats.hpp" то есть должно получиться так (если кто не понял ):
       

      2) Открываем файл core\functions\fn_hudSetup.sqf и комментируем эти строки:
      disableSerialization; cutRsc ["playerHUD", "PLAIN", 2, false]; [] call life_fnc_hudUpdate; [] spawn {     private["_dam"];     for "_i" from 0 to 1 step 0 do {         _dam = damage player;         waitUntil {(damage player) != _dam};         [] call life_fnc_hudUpdate;     }; }; Результат:

      3) Открываем файл core\functions\fn_hudUpdate.sqf и комментируем эти строки:
      disableSerialization; if (isNull LIFEdisplay) then {[] call life_fnc_hudSetup;}; LIFEctrl(2200) progressSetPosition (life_hunger / 100); LIFEctrl(2201) progressSetPosition (1 - (damage player)); LIFEctrl(2202) progressSetPosition (life_thirst / 100); Примеры того как это должно выглядеть есть выше, не буду повторяться. 
      Вот собственно и всё 
    • By DrTauren
      На сколько я знаю, есть другой скрипт для создания системы крафта на сервер Altis Life, но данная статья позволит сделать это в разы проще. Без необходимости изменять кучу всего.
       
      Установка:
      1) Идём в папку core и создаем в ней папку craft. Затем в ней создаём файлы fn_craft.sqf, fn_craft_update.sqf, fn_craft_updateFilter.sqf, fn_craftAction.sqf и fn_craftCfg.sqf
      2) В файл fn_craft.sqf вставляем этот код:
      private["_dialog","_inv","_itemInfo","_filter"]; //Declare all private variables if(!dialog) then { //Verify if the window is open  createDialog "Life_craft"; }; disableSerialization; //Disable Serialization if(life_is_processing) exitWith{  closeDialog 2001;  closeDialog 0; }; _dialog = findDisplay 666; //find the craft dialog/window _inv = _dialog displayCtrl 669; //find the listbox of items can be created lbClear _inv; //clear the listbox _filter = _dialog displayCtrl 673; _filter lbAdd localize "STR_CRAFT_FILTER_Weapon"; _filter lbSetData[(lbSize _filter)-1,"weapon"]; _filter lbAdd localize "STR_CRAFT_FILTER_Uniform"; _filter lbSetData[(lbSize _filter)-1,"uniform"]; _filter lbAdd localize "STR_CRAFT_FILTER_Backpack"; _filter lbSetData[(lbSize _filter)-1,"backpack"]; _filter lbAdd localize "STR_CRAFT_FILTER_Item"; _filter lbSetData[(lbSize _filter)-1,"item"]; _filter lbSetCurSel 0; 3) В файл fn_craft_update.sqf вставляем это:
      #include "..\..\script_macros.hpp" private["_dialog","_inv","_mats","_item","_struct","_str","_invSize","_matsNeed","_matsNum","_config","_itemFilter"]; //Declare all private variables disableSerialization; //Disable Serialization _dialog = findDisplay 666; //find the craft dialog/window _inv = _dialog displayCtrl 669; //find the listbox of items can be created _mats = _dialog displayCtrl 672; _struct = ""; if ((lbCurSel 669) == -1) exitWith {hint localize "STR_ISTR_SelectItemFirst";}; _item = lbData[669,(lbCurSel 669)]; _itemFilter = lbData[673,(lbCurSel 673)]; _config = [_itemFilter] call life_fnc_craftCfg; {  if (_item == _x select 0) then {  _matsNeed = _x select 1;  _invSize = count _matsNeed;  for [{_i = 0},{_i < _invSize - 1},{_i = _i + 2}] do {  _str = M_CONFIG(getText,"VirtualItems",(_matsNeed select _i),"displayName");  _matsNum = _matsNeed select _i+1;  _struct = _struct + format["%1x %2<br/>",_matsNum,(localize _str)];  };  }; } foreach (_config); if (_struct == "") then {  _struct = "Es wird nichts benötigt"; }; _mats ctrlSetStructuredText parseText format[" <t size='0.8px'> %1 </t> ",_struct]; 4) В fn_craft_updateFilter.sqf:
      #include "..\..\script_macros.hpp" disableSerialization; private["_list","_filter","_dialog","_inv","_mats","_filterBox","_item","_itemFilter"]; _dialog = findDisplay 666; //find the craft dialog/window _inv = _dialog displayCtrl 669; //find the listbox of items can be created _mats = _dialog displayCtrl 672; _filterBox = _dialog displayCtrl 673; _itemFilter = lbData[673,(lbCurSel 673)]; lbClear _inv; _struct = ""; _config = [_itemFilter] call life_fnc_craftCfg; {     if(_itemFilter == "item") then{         _str = localize M_CONFIG(getText,"VirtualItems",(_x select 0),"displayName");         _inv lbAdd format["%1",_str]; //add a gun to the listbox         _inv lbSetData[(lbSize _inv)-1,_x select 0]; //set the data of the gun         } else {             _itemInfo = [_x select 0] call life_fnc_fetchCfgDetails;             _inv lbAdd format["%1",_itemInfo select 1]; //add a gun to the listbox             _inv lbSetData[(lbSize _inv)-1,_itemInfo select 0]; //set the data of the gun             _inv lbSetPicture[(lbSize _inv)-1,_itemInfo select 2];         }; } foreach (_config); _inv lbSetCurSel 0; _item = lbData[669,(lbCurSel 669)]; _config = [_itemFilter] call life_fnc_craftCfg; {     if(_item == _x select 0)then {         _matsNeed = _x select 1;         _invSize = count _matsNeed;         for [{_i = 0},{_i < _invSize - 1},{_i = _i + 2}] do {             _str = M_CONFIG(getText,"VirtualItems",(_matsNeed select _i),"displayName");             _matsNum = _matsNeed select _i+1;             _struct = _struct + format["%1x %2<br/>",_matsNum,(localize _str)];         };     }; } foreach (_config); _mats ctrlSetStructuredText parseText format[" <t size='0.8px'> %1 </t> ",_struct]; 5) В fn_craftAction.sqf:
      #include "..\..\script_macros.hpp" private["_dialog","_item","_itemInfo","_oldItem","_newItem","_upp","_itemName","_ui","_progress","_pgText","_cP","_allMaterial","_matsNeed","_invSize","_handledItem","_itemFilter","_backpackOldItems","_weight","_weightUsedItems"]; disableSerialization; _dialog = findDisplay 666; if((lbCurSel 669) isEqualTo -1) xitWith {hint localize "STR_ISTR_SelectItemFirst";}; _item = lbData[669,(lbCurSel 669)]; _allaterial = true; _itemFilter = lbData[673,(lbCurSel 673)]; _matsNeed = 0; _config = [_itemFilter] call life_fnc_craftCfg; life_action_inUse = true;//Lock out other actions during processing. {     if (_item isEqualTo (_x select 0))then {         _matsNeed = _x select 1;         _invSize = count _matsNeed;         for [{_i=0},{_i<_invSize-1},{_i=_i+2}] do {             _matsNum = _matsNeed select _i+1;             if ((ITEM_VALUE(_matsNeed select _i)) < _matsNum) then {_allMaterial = false;};         };     }; } foreach (_config); _newItem = _item; diag_log format ["%1",allMaterial]; if (!_allMaterial) exitWith {hint localize "STR_PM_NoMaterial"; life_action_inUse = false;}; //Some checks if ((count _matsNeed) isEqualTo 0) exitWith {life_action_inUse = false;}; if (_itemFilter isEqualTo "backpack" && backpack player != "") exitWith {     //hint localize "STR_CRAFT_AR_Backpack";     hint "Remove your backpack before making a new one.";     life_action_inUse = false; }; if (_itemFilter isEqualTo "uniform" && uniform player != "") exitWith {     //hint localize "STR_CRAFT_AR_Uniform";     hint "Remove your uniform before making a new one.";     life_action_inUse = false; }; if (_itemFilter isEqualTo "weapon") then {     if (!(player canAdd _newItem) || currentWeapon player != "") exitWith {         hint localize "STR_NOTF_NoRoom";         life_action_inUse = false;     }; }; if (_itemFilter isEqualTo "item") then {     _weight = [_item] call life_fnc_itemWeight;     _weightUsedItems = 0;     for [{_i=0},{_i<(count _matsNeed)-1},{_i=_i+2}] do {         _matsNum = _matsNeed select _i+1;         _weightUsedItems = _weightUsedItems + (([(_matsNeed select _i)] call life_fnc_itemWeight) * _matsNum);         diag_log format ["%1 - %2",(_matsNeed select _i),_weightUsedItems];     }     if ((life_carryWeight - _weightUsedItems + _weight) > life_maxWeight) exitWith {         hint localize "STR_NOTF_NoRoom";         life_action_inUse = false;     }; }; _oldItem = _matsNeed; if (_itemFilter isEqualTo "item") then {     _itemName = localize M_CONFIG(getText,"VirtualItems",_newItem,"displayName"); } else {  _itemInfo = [_newItem] call life_fnc_fetchCfgDetails;  _itemName = _itemInfo select 1; }; life_is_processing = true; _upp = format["Crafting %1",_itemName]; closeDialog 0; //Setup our progress bar. disableSerialization; 5 cutRsc ["life_progress","PLAIN"]; _ui = uiNamespae getVariable "life_progress"; _progress = _ui displayCtrl 38201; _pgText = _ui displayCtrl 38202; _pgText ctrlSetText format["%2 (1%1)...","%",_upp]; _progress progressSetPosition 0.01; _cP = 0.01; _removeItemSuccess = true; _invSize = count _oldItem; for [{_i=0},{_i<_invSize-1},{_i=_i+2}] do {     _handledItem = (_oldItem select _i);     if(!([false,_handledItem,_oldItem select _i+1] call life_fnc_handleInv)) exitWith {_removeItemSuccess = false;}; }; if (!_removeItemSuccess) exitWith {5 cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;}; for "_i" from 0 to 1 step 0 do {  sleep 0.3;  _cP = _cP + 0.01;  _progress progressSetPosition _cP;  _pgText ctrlSetText format["%3 (%1%2)...",round(_cP * 100),"%",_upp];  if(_cP >= 1) exitWith {}; }; if (_itemFilter isEqualTo "backpack") then {  if(backpack player isEqualTo "") then {  player addBackpack _newItem;  } else {  hint localize "STR_CRAFT_AR_Backpack";  life_is_processing = false;  life_action_inUse = false;  }; }; if (_itemFilter isEqualTo "uniform") then{  if(uniform player isEqualTo "") then{  player addUniform _newItem;  } else {  hint localize "STR_CRAFT_AR_Uniform";  life_is_processing = false;  life_action_inUse = false;  }; }; if (_itemFilter isEqualTo "weapon") then{  if(player canAdd _newItem) then{  player addIem _newItem;  } else {  if(currentWeapon player isEqualTo "") then{  player addWeapon _newItem;  } else {  5 cutText ["","PLAIN"];  for [{_i=0},{_i<_invSize-1},{_i=_i+2}] do {  _handledItem = (_oldItem select _i);  [true,_handledItem,_oldItem select _i+1] call life_fnc_handleInv;  };  life_is_processing = false;  life_action_inUse = false;  };  }; }; if (_itemFilter isEqualTo "item") then{  _handledItem = _newItem;  [true,_handledItem,1] call life_fnc_handleInv; }; 5 cutText ["","PLAIN"]; titleText[format[localize "STR_CRAFT_Process",_itemName],"PLAIN"]; [0] call SOCK_fnc_updatePartial; life_is_processing = false; life_action_inUse = false; 6) В fn_craftCfg.sqf:
      #include "..\..\script_macros.hpp" private["_craft","_return"]; _craft = param [0,"",[""]]; if(_craft == "") exitWith {closeDialog 0}; //Bad shop type passed. switch(_craft) do {     case "weapon": {         _return = [             //[Object classname, [item #1,quantity item #1,item #2,quantity item #2]],]             ["hgun_Pistol_01_F", ["diamond_cut",2,"copper_refined",1]],             ["SMG_01_F", ["gunbarrel",2,"copper_refined",5,"cloth",3,"diamond_uncut",2]],             ["SMG_05_F", ["gunbarrel",1,"cloth",2,"copper_refined",4,"diamond_uncut",1]],             ["hgun_PDW2000_F", ["gunbarrel",1,"cloth",1,"copper_refined",3]],             ["optic_Aco", ["diamond_cut",2,"glass",2,"iron_refined",1]],             ["optic_ACO_grn", ["diamond_cut",2,"glass",2,"iron_refined",1]],             ["optic_Holosight", ["diamond_cut",3,"glass",3,"iron_refined",2]]         ];     };     case "uniform": {         _return = [             //[Object classname, [item #1,quantity item #1,item #2,quantity item #2]],]             ["U_BG_leader", ["diamond_cut",5,"cloth",5,"iron_refined",8]]         ];     };     case "backpack": {         _return = [             //[Object classname, [item #1,quantity item #1,item #2,quantity item #2]],]             ["B_Carryall_mcamo", ["diamond_cut",1,"cloth",4,"kevlar",2]]         ];     };     case "item": {         _return = [             //[Object classname, [item #1,quantity item #1,item #2,quantity item #2]],]             ["spikeStrip", ["copper_refined",2]],             ["lockpick", ["copper_refined",1]]         ];     }; }; _return; 7) Открываем файл functions.hpp и добавляем туда:
      class Crafting {         file = "core\craft";         class craft {};         class craftAction {};         class craftCfg {};         class craft_update {};         class craft_updateFilter {};     }; 8) Открываем stringtable.xml и добавляем это:
          <Package name="Craft">           <Key ID="STR_CRAFT_Title">               <Original>Crafting Menu</Original>           </Key>           <Key ID="STR_PM_CraftStats">               <Original>Object to craft</Original>           </Key>           <Key ID="STR_PM_CraftMaterials">               <Original>Materials needed</Original>           </Key>           <Key ID="STR_CRAFT_Button">               <Original>Craft</Original>           </Key>           <Key ID="STR_PM_NoMaterial">               <Original>You do not have all the required materials</Original>           </Key>           <Key ID="STR_CRAFT_Process">               <Original>You have crafted: %1</Original>           </Key>         <Key ID="STR_CRAFT_FILTER_Weapon">               <Original>Weapons</Original>           </Key>           <Key ID="STR_CRAFT_FILTER_PWeapon">               <Original>Prim. Weapons</Original>           </Key>           <Key ID="STR_CRAFT_FILTER_HWeapon">               <Original>Sec. Weapons</Original>           </Key>           <Key ID="STR_CRAFT_FILTER_Ammo">               <Original>Ammos</Original>           </Key>           <Key ID="STR_CRAFT_FILTER_Uniform">               <Original>Uniforms</Original>           </Key>           <Key ID="STR_CRAFT_FILTER_Vest">               <Original>Vests</Original>           </Key>           <Key ID="STR_CRAFT_FILTER_Backpack">               <Original>Backpacks</Original>           </Key>           <Key ID="STR_CRAFT_FILTER_Item">               <Original>Items</Original>           </Key>           <Key ID="STR_CRAFT_AR_Question">               <Original>Would you like to equip this item?</Original>           </Key>           <Key ID="STR_CRAFT_AR_Backpack">               <Original>If you chose yes your current backpack will be deleted and replaced by the new one else it will spawn on the ground</Original>           </Key>           <Key ID="STR_CRAFT_AR_PWeapon">               <Original>If you chose yes your prim. weapon will be deleted and replaced by the new one else it will spawn on the ground</Original>           </Key>           <Key ID="STR_CRAFT_AR_HWeapon">               <Original>If you chose yes your sec. weapon will be deleted and replaced by the new one else it will spawn on the ground</Original>           </Key>           <Key ID="STR_CRAFT_AR_Uniform">               <Original>If you chose yes your current uniform will be deleted and replaced by the new one else it will spawn on the ground</Original>           </Key>           <Key ID="STR_CRAFT_AR_Vest">               <Original>If you chose yes your current vest will be deleted and replaced by the new one else it will spawn on the ground</Original>           </Key>     </Package> 9) Переходим в папку dialog и создаём там файл craft.hpp со следующим содержимым:
      class Life_craft {     idd = 666;     name= "life_craft";     movingEnable = false;     enableSimulation = true;     onLoad = "[] spawn life_fnc_craft";     class controlsBackground {         class Life_RscTitleBackground:Life_RscText {             colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])"};             idc = -1;             x = 0.1;             y = 0.2;             w = 0.8;             h = (1 / 25);         };         class MainBackground:Life_RscText {             colorBackground[] = {0, 0, 0, 0.7};             idc = -1;             x = 0.1;             y = 0.2 + (11 / 250);             w = 0.8;             h = 0.6 - (22 / 250);         };     };     class controls {         class Title : Life_RscTitle {             colorBackground[] = {0, 0, 0, 0};             idc = 667;             text = "$STR_CRAFT_Title";             x = 0.1;             y = 0.2;             w = 0.6;             h = (1 / 25);         };         class craftListHeader : Life_RscText         {             idc = 668;             colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5};             text = "$STR_PM_CraftStats";             sizeEx = 0.04;             x = 0.105; y = 0.26;             w = 0.275; h = 0.04;         };         //Craft list         class craftList : life_RscListBox         {             idc = 669;             sizeEx = 0.030;             onLBSelChanged = "[] spawn life_fnc_craft_update";             x = 0.105;             y = 0.31;             w = 0.275; h = 0.44;         };         //Materials list header         class materialListHeader : Life_RscText         {             idc = 670;             colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5};             text = "$STR_PM_CraftMaterials";             sizeEx = 0.04;             x = 0.395; y = 0.26;             w = 0.275; h = 0.04;         };         //Materials list         class materialList : Life_RscControlsGroup         {             idc = 671;             w = 0.275;             h = 0.44;             x = 0.395;             y = 0.30;             class Controls             {                 class mats : Life_RscStructuredText                 {                     idc = 672;                     sizeEx = 0.020;                     text = "";                     x = 0;                     y = 0;                     w = 0.27; h = 0.44;                 };             };         };         //FILTER         class FilterList : Life_RscCombo         {             idc = 673;             colorBackground[] = {0,0,0,0.7};             onLBSelChanged  = "[] call life_fnc_craft_updateFilter";             x = 0.69;             y = 0.32;             w = (6.25 / 30);             h = (1 / 25);         };         //Craft button         class ButtonCraft : Life_RscButtonMenu {             idc = 674;             text = "$STR_CRAFT_Button";             colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5};             onButtonClick = "if(!life_is_processing) then {[] spawn life_fnc_craftAction};";             x = 0.69;             y = 0.26;             w = (6.25 / 40);             h = (1 / 25);         };         class CloseButtonKey : Life_RscButtonMenu {             idc = -1;             text = "$STR_Global_Close";             onButtonClick = "closeDialog 0;";             x = 0.1;             y = 0.8 - (1 / 25);             w = (6.25 / 40);             h = (1 / 25);         };     }; };  10) Открываем файл Masterhandler.hpp и добавляем туда:
      #include "craft.hpp" 11) В папке dialogs открываем player_inv.hpp и добавляем код:
              class ButtonCrafting: Life_RscButtonMenu {             idc = 2025;             text = "Crafting";             onButtonClick = "createDialog ""Life_craft"";";             x = 0.1 + (6.25 / 19.8) + (1 / 250 / (safezoneW / safezoneH));             y = 0.805;             w = (6.25 / 40);             h = (1 / 25);         };  
       
      Оригинал на английском:
      https://www.altisliferpg.com/topic/3964-tutorial-crafting-system/  
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.