Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
Ник

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

Рекомендованные сообщения

По-многочисленным просьбам сервостроителей, а также если Вам лень собирать сервер с нуля, предлагаю Вашему вниманию гайд, 
как установить 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

,>

Как её исправить не нашёл решение, но она не влияет на работу скрипта
 
На этом всё. Кто осилил - молодец
Изменено пользователем Ник (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





Оченьмногабукав!!11
Лови плюс :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Лови плюс :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Timofey сказал:

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 05.12.2016 в 12:31, Ник сказал:

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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

Изменено пользователем sanekxxz
Вот такая тока ошибка лог сервера а клиент чистый (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Клиент

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

Сервер

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

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

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

Лог клиента

Изменено пользователем sanekxxz (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

sanekxxz 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Ник сказал:

sanekxxz 

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

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

Хм понятно

Изменено пользователем sanekxxz
А где можно найти гайд где только один Plot 4 life поставить? (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Изменено пользователем psycho85 (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 28.10.2017 в 16:18, Ник сказал:

sanekxxz 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: Tamirlan
      Народ помогите! У меня проблема! В один момент все персонажи (игроки), когда залетают на остров одеты не в свою одежду и у всех в рюкзаках пустые пластиковые бутылки! не знаю вообще как это исправить! SOS! Есть подозрение что что то произошло с базой данных! но не уверен! Может кто сталкивался с такой проблемой? Как решали... не будьте равнодушными пожалуйста помогите... (началось с того что один из игроков покупал пластиковые бутылки и не заметил что купил слишком много что у него они стали вываливаться и появляться на земле (в рюкзаке место закончилось)) в момент покупки бутылок говорит что что то на секунду подвисло и после этого все кто залетает в игру стали появляться в его одежде и с бутылками. Это было вчера. Сегодня кто то купил одежду сантаклауса и теперь все появляются в одежде санты. Причем если корректно  выйти из миссии и после зайти на последнюю точку подключения все ок. А если выбрать любой город то все как я описывал выше. Плиз помогите решить этот полтергейст!) 
    • Автор: 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); Примеры того как это должно выглядеть есть выше, не буду повторяться. 
      Вот собственно и всё 
    • Автор: 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/  
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.