BigCrazyCat

[ГАЙД] Оружие за спиной. Как носить два основных оружия

60 сообщений в этой теме

Описание: данная модификация предоставляет возможность носить два основных оружие одновременно - одно в руках, другое - за спиной.
Оружие за спиной сохраняется в БД, не пропадает после переодевания, добавляется в тело персонажа после его смерти.
 
1. Нам понадобятся следующие кастомные файлы: compiles.sqf, variables.sqf, fn_selfActions.sqf, player_switchModel.sqf, player_gearSet.sqf, player_death.sqf, dayz_spaceInterrupt.sqf.
Все файлы копируем в папку custom и подключаем.
 
Подробнее:

compiles.sqf, variables.sqf подключаются в init.sqf (меняете пути на свои).
Другие кастомные файлы подключатся в compiles.sqf (меняете пути на свои).
Найти их можно в @DayZ_Epoch/addons/dayz_code.pbo.
 
Серверная часть. Путь: @DayZ_Epoch_Server\addons\dayz_server\compile\server_playerSync.sqf.
Фильтр BattleEye. Путь: instance_11_Chernarus\BattlEye\publicVariable.txt (зависит от карты)
 
Все файлы сохраняйте в кодировке UTF-8 (без BOM).


2. В fn_selfActions.sqf:


Добавляем в начале, после блока //Grab Flare, следующий код:

_dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
_dayz_onBackActive = player getVariable ["dayz_onBackActive",false];
_primaryWeapon = primaryWeapon player;
 
if (_dayz_onBack != "EMPTY" && !_dayz_onBackActive && !_inVehicle && !_onLadder) then {
	if (s_player_equip_carry < 0) then {
		_text = getText (configFile >> "CfgWeapons" >> _dayz_onBack >> "displayName");
		_text2 = ("Оружие "+ str(_text));
		s_player_equip_carry = player addAction [_text2, "custom\player_switchWeapon.sqf", "action", 0.5, false, true];
	};
} else {
	player removeAction s_player_equip_carry;
	s_player_equip_carry = -1;
};
 
if (_dayz_onBack == "EMPTY" && _primaryWeapon != "") then {
	if (s_player_equip_toback < 0) then {
		_text = getText (configFile >> "CfgWeapons" >> _primaryWeapon >> "displayName");
		s_player_equip_toback = player addAction [format["<t color=""#888888"">'%1' за спину</t>",_text], "custom\player_addWeaponToBack.sqf", "action", 0.5, false, true];
		int_addToBack = _primaryWeapon;
	} else {
		if (_primaryWeapon != int_addToBack) then {
			int_addToBack = _primaryWeapon;
			_text = getText (configFile >> "CfgWeapons" >> _primaryWeapon >> "displayName");
			player removeAction s_player_equip_toback;
			s_player_equip_toback = player addAction [format["<t color=""#888888"">'%1' за спину</t>",_text], "custom\player_addWeaponToBack.sqf", "action", 0.5, false, true];
		};	
	};
} else {
	player removeAction s_player_equip_toback;
	s_player_equip_toback = -1;
}; 

 

Добавляем действия "Оружие за спину" и "Взять оружие из-за спины" в скрол меню.
 
3. Создаем папку custom/func и формируем два файла с нашими функциями.

player_addWeaponToBack.sqf

 

int_addWeaponToBack = {
_primaryWeapon = primaryWeapon player;
player removeWeapon _primaryWeapon;
player setVariable ["dayz_onBack", _primaryWeapon, true];
_onbackName = getText (configFile >> "CfgWeapons" >> _primaryWeapon >> "displayName");
DiagLog = format ["%2 added %1 (%3) to back", _onbackName, (name player), _primaryWeapon];
publicVariable "DiagLog";
};
 
_this call int_addWeaponToBack;

 

Функция перемещает оружие за спину. Также, в дополнении предоставлен один из способов логирования некоторых событий или действий. В данном случае, мы записываем в лог информацию о том, что игрок взял оружие за спину. Таким образом, вы можете следить за популярностью опции и контролировать взаимодействие игроков с ней.
 
player_switchWeapon.sqf

 

private ["_event", "_onLadder", "_inVehicle", "_isOk", "_primary", "_current", "_rifle", "_pistol", "_melee"];
_event = if (count _this > 1) then { _this select 3 } else { _this select 0 };
_findRifle = {
    private ["_return", "_primary"];
    _return = "";
    _primary = primaryWeapon player;
 
    if (_primary != "") then {
        if !(_primary in MeleeWeapons) then {
            _return = _primary;
        };
    };
    _dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
    if (_dayz_onBack != "EMPTY" && _return == "") then {
        if !(_dayz_onBack in MeleeWeapons) then {
            _return = _dayz_onBack;
        };
    };
    _return;
};
 
_findMelee = {
    private ["_return", "_primary"];
    _return = "";
    _primary = primaryWeapon player;
    if (_primary != "") then {
        if (_primary in MeleeWeapons) then {
            _return = _primary;
        };
    };
    _dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
    if (_dayz_onBack != "EMPTY" && _return == "") then {
        if (_dayz_onBack in MeleeWeapons) then {
            _return = _dayz_onBack;
        };
    };
 
    _return;
};
 
_findPistol = {
    private ["_return"];
    _return = "";
 
    {
        if (getNumber (configFile >> "CfgWeapons" >> _x >> "type") == 2) then {
            _return = _x;
        };
    } foreach (weapons player);
 
    _return;
};
 
_selectMuzzle = {
    private ["_return", "_wpn", "_muzzles"];
    _wpn = _this select 0;
    _muzzles = getArray(configFile >> "cfgWeapons" >> _wpn >> "muzzles");
 
    if (_muzzles select 0 != "this") then {
        _return = (_muzzles select 0);
    } else {
        _return = _wpn;
    };
 
    _return;
};
 
_clearActions = {
    if (s_player_equip_carry > -1) then {
        player removeAction s_player_equip_carry;
        s_player_equip_carry = -1;
    };
};
 
_switchPrimary = {
    private ["_primary", "_current"];
    _primary = primaryWeapon player;
    _current = currentWeapon player;
    _timer = 0;
 
    [] call _clearActions;
    if (_primary != "") then {
        _animState = animationState player;
 
        switch (true) do {
            case (_animState == "amovpknlmstpsraswrfldnon_gear" || _animState == "amovpercmstpsraswrfldnon_gear"): {
                player playMove "amovpknlmstpslowwrfldnon_amovpknlmstpsraswrfldnon";
                waitUntil { animationState player == "amovpknlmstpslowwrfldnon_amovpknlmstpsraswrfldnon" };
            };
            case (_animState == "amovpknlmstpsraswpstdnon_gear" || _animState == "amovpercmstpsraswpstdnon_gear"): {
                player playMove "amovpknlmstpslowwpstdnon_gear_amovpknlmstpsraswpstdnon";
                waitUntil { animationState player == "amovpknlmstpslowwpstdnon_gear_amovpknlmstpsraswpstdnon" };
            };
            case (["aidlpercmstpslowwrfldnon", _animState] call fnc_inString): {
                player playMove "amovpercmstpslowwrfldnon_amovpercmstpsraswrfldnon";
                waitUntil { animationState player == "amovpercmstpslowwrfldnon_amovpercmstpsraswrfldnon" };
            };
        };
        player removeWeapon _primary;
        if (_current != [] call _findPistol) then {
            _timeout = diag_tickTime + 2;
            _animArray = [
                "amovpercmstpsraswrfldnon_amovpercmstpsnonwnondnon",
                "amovpercmstpsraswrfldnon_amovpercmstpsraswpstdnon", 
                "amovpknlmstpsraswrfldnon_amovpknlmstpsraswpstdnon", 
                "amovppnemstpsraswrfldnon_amovppnemstpsnonwnondnon", 
                "amovppnemstpsraswrfldnon_amovppnemstpsraswpstdnon" 
            ];
 
            waitUntil { (animationState player) in _animArray || diag_tickTime >= _timeout };
            waitUntil { !((animationState player) in _animArray) || diag_tickTime >= _timeout };
        };
    };
    
    _dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
    if (_dayz_onBack != "EMPTY") then {
        player addWeapon _dayz_onBack;
        player selectWeapon ([_dayz_onBack] call _selectMuzzle);
    };
    
    if (_primary != "") then {
        player setVariable ["dayz_onBack", _primary, true];
    } else {
        player setVariable ["dayz_onBack", "EMPTY", true];
    };
 
    _primaryName = getText (configFile >> "CfgWeapons" >> _primary >> "displayName");
    _onbackName = getText (configFile >> "CfgWeapons" >> _dayz_onBack >> "displayName");
    
    if (_primaryName != "") then {
        DiagLog = format ["%3 switched from %1 (%4) to %2 (%5)", _primaryName, _onbackName, (name player), _primary, _dayz_onBack];
        publicVariable "DiagLog";
    } else {
        DiagLog = format ["%2 take %1 (%3) from back to gear", _onbackName, (name player), _dayz_onBack];
        publicVariable "DiagLog";
    };
    call dayz_meleeMagazineCheck;
};
 
_switchPrimaryUI = {
    private ["_primary", "_current"];
    _primary = primaryWeapon player;
    _current = currentWeapon player;
 
    [] call _clearActions;
 
    if (_primary != "") then {
        player removeWeapon _primary;
    };
 
    _dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
    if (_dayz_onBack != "EMPTY") then {
        player addWeapon _dayz_onBack;
 
        if (_primary == _current) then {
            player selectWeapon ([_dayz_onBack] call _selectMuzzle);
        };
    };
 
    if (_primary != "") then {
        player setVariable ["dayz_onBack", _primary, true];
    } else {
        player setVariable ["dayz_onBack","EMPTY", true];
    };
};
_onLadder = (getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState player) >> "onLadder")) == 1;
_inVehicle = (vehicle player != player);
_dayz_onBackActive = player getVariable ["dayz_onBackActive",false];
_isOK = (!_onLadder && !_inVehicle && !r_player_unconscious && !_dayz_onBackActive);
if (_isOK) then { player setVariable ["dayz_onBackActive", true, true] };
switch (_event) do {
    case "action": {
        if (_isOK) then {
            [] call _switchPrimary;
        };
    };
    case "gear": {
        [] call _switchPrimaryUI;
    };
    case "rifle": {
        if (_isOK) then {
            _rifle = [] call _findRifle;
            
            if (_rifle == "") then {
            _rifle = [] call _findMelee;
            };
 
            if (_rifle != "") then {
                _dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
                if (_rifle == _dayz_onBack) then {
                    [] call _switchPrimary;
                } else {
                    player selectWeapon ([_rifle] call _selectMuzzle);
                };
            } else { systemChat "Слот пустой.";};
        };
    };
    case "pistol": {
        if (_isOK) then {
            _pistol = [] call _findPistol;
 
            if (_pistol != "") then {
                player selectWeapon ([_pistol] call _selectMuzzle);
            } else { systemChat "Слот пустой.";};
        };
    };
    case "second": {
        if (_isOK) then {
            _dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
            if (_dayz_onBack != "EMPTY") then {
                [] call _switchPrimary;
            } else { systemChat "Слот пустой.";};
        };
    };
    case "melee": {
        if (_isOK) then {
            _melee = [] call _findMelee;
 
            if (_melee != "") then {
                _dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
                if (_melee == _dayz_onBack) then {
                    [] call _switchPrimary;
                } else {
                    player selectWeapon ([_melee] call _selectMuzzle);
                };
            } else { systemChat "Слот пустой.";};
        };
    };
};
if (_isOK) then {player setVariable ["dayz_onBackActive", false, true]};

 

Функции отвечают за поиск оружия в слотах, его перемещение и анимацию.
 
4. В player_switchModel.sqf:


После:

_magazines = _countMags select 0;

Добавляем:

_dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];

После:

_newUnit setDir _dir; 

Добавляем:

_newUnit setVariable ["dayz_onBack",_dayz_onBack,true];
_newUnit setVariable ["dayz_onBackActive", false, true]; 

После:

{player reveal _x} count (nearestObjects [getPosATL player, dayz_reveal, 50]); 

Добавляем:

player setVariable ["dayz_onBack", _dayz_onBack, true];
player setVariable ["dayz_onBackActive", false, true]; 

В секцию private добавляем:

,"_dayz_onBack" 

 

Сохраняем оружие, которое было за спиной, при смене скина.
 
5. В player_gearSet.sqf:


После:

_mags = _inventory select 1;

Добавляем:

if (count _inventory > 2) then {
    _backweap = _inventory select 2;
    player setVariable ["dayz_onBack",_backweap,true];
} else {
    player setVariable ["dayz_onBack","EMPTY",true];
};

В секцию private добавляем:

,"_backweap"

 


6. В player_death.sqf:


После:

disableUserInput true;

Добавляем:

_dayz_onBack = _body getVariable ["dayz_onBack","EMPTY"];
if (_dayz_onBack != "EMPTY") then {
    _body addWeapon _dayz_onBack;
};

В секцию private добавляем:

,"_dayz_onBack"

 

Сохраняем оружие, которое было за спиной, в луте персонажа после смерти.
 
7. В dayz_spaceInterrupt.sqf:

 

if (_dikCode in[0x02,0x03,0x04,0x58,0x57,0x44,0x43,0x42,0x41,0x40,0x3F,0x3E,0x3D,0x3C,0x3B,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05]) then {
    _handled = true;
}; 

На:

switch (_dikCode) do {
    case 0x02: {
        ["rifle"] spawn player_switchWeapon;
        _handled = true;
    };
    case 0x03: {
        ["second"] spawn player_switchWeapon;
        _handled = true;
    };
    default {
        if (_dikCode in [0x58,0x57,0x44,0x43,0x42,0x41,0x40,0x3F,0x3E,0x3D,0x3C,0x3B,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04]) then {
            _handled = true;
        };
    };
}; 

 

Назначаем смену оружия на клавиши "1" и "2".
 
8. В compiles.sqf:


После:

fn_gearMenuChecks = compile preprocessFileLineNumbers "\z\addons\dayz_code\compile\fn_gearMenuChecks.sqf"; 

Добавляем:

player_addWeaponToBack =    compile preprocessFileLineNumbers "custom\func\player_addWeaponToBack.sqf";
player_switchWeapon =    compile preprocessFileLineNumbers "custom\func\player_switchWeapon.sqf";

 Ищем:

dayz_meleeMagazineCheck = { 

И заменяем всю функцию на:

dayz_meleeMagazineCheck = {
    private["_meleeNum","_magType"];
    _wpnType = primaryWeapon player;
    if (_wpnType in MeleeWeapons) then {
        _magType = ([] + getArray (configFile >> "CfgWeapons" >> _wpnType >> "magazines")) select 0;
        if (isNil "_magType") exitWith {};
        _meleeNum = ({_x == _magType} count magazines player);
        if (_meleeNum < 1) then {
            player addMagazine _magType;
        };
    };
}; 

 

Объявляем новые функции и редактируем dayz_meleeMagazineCheck.
 
9. В variables.sqf:


После:

dayz_resetSelfActions = {

Добавляем:

s_player_equip_toback = -1;
s_player_equip_carry = -1;

 

Избегаем спама, связанного с действиями, в клиентском логе.


10. В init.sqf:


Для того, чтобы логирование правильно функционировало, добавим обработчик события.
После:

if (isServer) then {

Добавляем:

diag_server_log = compile preprocessFileLineNumbers "scripts\diagLog.sqf";
"DiagLog" addPublicVariableEventHandler {_id = (_this select 1) spawn diag_server_log};

И сразу подключим простой скрипт, который сделает оружие за спиной не активным при входе. Внизу добавьте:

execVM "scripts\onLogin.sqf";

 

 


11. В каталоге scripts создадим 2 файла.


diagLog.sqf

private ["_targetObj"];
_targetObj = _this;
diag_log format["DIAG_LOG: %1",_targetObj];

onLogin.sqf

disableSerialization;
waitUntil { !isNil "dayz_animalCheck" };
 
player setVariable ["dayz_onBackActive",false, true];

 

 


12. В server_playerSync.sqf:


Ищем:

_playerGear = [weapons _character,_magazines]; 

Заменяем на:

_playerGear = [weapons _character,_magazines, _character getVariable ["dayz_onBack","EMPTY"]]; 

 

Сохраняем оружие за спиной в базу данных.


13. И последнее. Добавим исключение в фильтр publicVariable для нашего логера. 


Добавьте в конец второй строки:

!="DiagLog" 

 

 


На этом закончим. Если гайд был полезен, не забудьте поставить плюс :)
 
Скриншоты. Дополнение отлично сочитается с графическими хоткеями.
268d05a0417d4604bfc837c06a9a87e0.png 3846d2ba595644ad8ad8254eb0000359.png

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

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


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


Все отлично работает! Единственное поправьте в гайде  

  1. после строки player_switchWeapon =    compile preprocessFileLineNumbers "custom\func\player_switchWeapon.sqf" нужно добавить ;

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


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

Топ!!!

Только как мне его к своему HotKey прикрутить?????

Пример:

_dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
if (!isNil "_dayz_onBack") then {_pic3 = gettext(configFile >> 'CfgWeapons' >> _dayz_onBack >> 'picture');};
Изменено пользователем BigCrazyCat (история изменений)

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


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

 Добрый день! подскажите пожалуйста как добавить ["cashMoney",0],

  1. _playerGear = [weapons _character,_magazines, _character getVariable ["dayz_onBack","EMPTY"]];  

 а то вместо наличных около иконки появляется "EMPTY"

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

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


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

Если вы используете ZSC 3.0:
1. От мода уже есть кастомный player_gearSet.sqf
Найдите:

if (count _inventory > 2) then {
    _money = _inventory select 2;
    player setVariable["cashMoney",_money,true];
} else {
    player setVariable["cashMoney",0,true];
};

Добавьте ниже:

if (count _inventory > 3) then {
    _backweap = _inventory select 3;
    player setVariable ["dayz_onBack",_backweap,true];
} else {
    player setVariable ["dayz_onBack","EMPTY",true];
};

2. server_playerSync.sqf.
Замените:

_playerGear = [weapons _character,_magazines,_character getVariable["cashMoney",0]];

На:

_playerGear = [weapons _character,_magazines,_character getVariable["cashMoney",0], _character getVariable ["dayz_onBack","EMPTY"]];

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


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

Топ!!!

Только как мне его к своему HotKey прикрутить?????

_display = uiNamespace getVariable "GuiHotPic";
_primaryWeapon = primaryWeapon player;
_magazine = magazines player;
_dayz_onBack = player getVariable ["dayz_onBack","EMPTY"];
_backpack = unitBackpack player;
_packtype = (typeOf _backpack);
_bandage = "ItemBandage";
_pic1 = "";
_pic2 = "";
_pic3 = "";
_pic4 = "";
_ctrl1 = _display displayCtrl 101;
_ctrl2 = _display displayCtrl 102;
_ctrl3 = _display displayCtrl 103;
_ctrl4 = _display displayCtrl 104;
if (!isNil "_primaryWeapon") then {_pic1 = gettext(configFile >> 'CfgWeapons' >> _primaryWeapon >> 'picture');};
if (_bandage in _magazine) then {_pic2 = gettext(configFile >> 'CfgMagazines' >> _bandage >> 'picture');};
if (!isNil "_dayz_onBack") then {_pic3 = gettext(configFile >> 'CfgWeapons' >> _dayz_onBack >> 'picture');};
if (!isNil "_backpack") then {_pic4 = gettext(configFile >> 'CfgVehicles' >> _packtype >> 'picture');};
_ctrl1 ctrlSetText _pic1;
_ctrl2 ctrlSetText _pic2;
_ctrl3 ctrlSetText _pic3;
_ctrl4 ctrlSetText _pic4;

 

Вот, только к своему прикрути.

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


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

Сделал всё по инструкции работает, но пропадает инвентарь с трупа  в руках остаётся лишь основное оружие которое держал  и в добавок тело не прячется) 

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

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


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

Сделал всё по инструкции работает, но пропадает инвентарь с трупа  в руках остаётся лишь основное оружие которое держал  и в добавок тело не прячется) 

Потому что не сделали всё по инструкции. Смотрите лог на наличие ошибок.

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


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

Потому что не сделали всё по инструкции. Смотрите лог на наличие ошибок.

Значит что то вы упустили , файл player_death только в compiles подключается или его ещё надо в AH подключать?) Потому что  камера  смерти которая прописывается в этом же файле якобы простая в установке, работает не должным образом слишком быстро отдаляет в небо!) 

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


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

 

Привет такая проблема после смерти оружие проподает

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: BorizzK
      Накатал по быстрому для себя и своих ребят от нефиг делать, тк в командировке и дейзить возможности нет, только удаленно ковырять сервер
      Внутри настройки через переменные
      путь к базе сервера и инстанс ид берет из конфига сервера (нужно настроить имя файла и путь в файле)
      Мониторит сервер по названию окна, сохранив pid
      При вылете в 90% случаев корректно убивает процесс
      При перезапуске так же
      При каждом старте с 0 и при перезапусках делает бэкапы баз/настроек/логов в папку !Backup в корне сервера
      Можно настроть кол-во хранимых бэкпов для базы сервера и логов

      Вобщем заглянете внутрь и все поймете
       
      Вдруг кому пригодится
       
      Закрепляю тут краний боевой вариант
      Что к чему - прочтите всю тему и все станет ясно
       
      Сцыл на стрницу темы с крайней версией заточенной на использование с версией 1.04 и параметром -servermod
       
      Крайняя версия
       
    • Автор: NoNameUltima
      Автор: Я.
      Модификация банка, для DayZ Standalone для мода торговли(Trader)
       
      Мод позволяет:
      Снимать деньги со счета. Вносить деньги на счет. Переводить средства из банка, в банк другого игрока, даже если он не в сети( по UID )  
      Настройки серверной части:
      Точки в которых доступен банк. Радиус в котором доступен банк(от центра точки - см. выше). Горячая клавиша вызывающая на клиентской стороне меню банкомата. Папку профиля для хранения данных о банковских балансах игроков.  
      *Мод автоматически производит обмен валюты по номиналу, при внесении, или изъятии денежных средств.
      *Клиентскую часть можно скачать в STEAM.
      *Для подключения серверной части, - достаточно закинуть ее в папку сервера, и указать папку для хранения баланса.
       
      Цена: 1500
       
      Контакты:
      Skype: hf-trade  
      STEAM: https://steamcommunity.com/sharedfiles/filedetails/?id=1714035636
      Видео работы:
       
       
      Серверная часть, подключается как -serverMod=
    • Автор: NoNameUltima
      Автор:
      Я. Версия админки:
      v.0.0.2  
      Описание:
      Админка поставляется с ключами, и подписями. Админка разделена на 2 части - клиентская, и серверная. Так же работает в оффлайн режиме.  
      Для установки админки, необходимо:
      На сервере подключить серверный мод. На сервере подключить клиентский мод. На сервере скопировать ключ из клиентского мода, и поместить в папку keys сервера. На клиенте добавить клиентский мод. В конфигурационный файл администрации прописать UID(ы) администраторов и модераторов.  
      Рабочие пункты админки:
       
      Отображение в 3D(ESP до 100м)
      Игроки. Зомби. Техника. Постройки. Объекты. Отображение на карте(в радиусе игрока до 100м):
      Игроки. Зомби. Техника. Постройки. Объекты. НПЦ. Сервер:
      Установка времени на сервере. Установка погоды на сервере(В бете). Собственные:
      Телепорт по векторам(4 - по направлению взгляда. 5 - вверх). Телепорт по карте. Неуязвимость. Бесконечный БК. Невидимость. Защита от зомби. Игроки:
      Телепорт игрока к администратору. Телепорт администратора к игроку. Телепорт в заданные координаты. Лечение. Очистка инвентаря. Выдача БК к текущему оружию(в руках). Заблокировать. Разблокировать. Убить. Отсоединить. Забанить(свой файл банов по UID) Создание объектов:.
      Фильтр при выборе раздела создания предметов(поиск по имени класса).  
      Другое:
      Админская карта. Дебаг монитор. Информационный виджет. Удаление объектов.(только при включенном дебаге - отображающем объект в прицеле).  
      Горячие клавиши:
      [        -     Вызов панели администратора. HOME     -     Вкл\Выкл отображения полосы отладки. DELETE    -    Удаление объекта в прицеле. 4        -    Телепорт по направлению взгляда. 5        -    Телепорт вверх.  
      Сообщения:
      Вывод сообщений игрокам, о действиях модератора(если в админке UID указан, как UID модератора).  
      Журналы:
      Действия администрации.  
      Стоимость:
      3500  
      Видео:( ВНИМАНИЕ! В ВИДЕО, ВНУТРИ ПАНЕЛИ АДМИНИСТРАТОРА, РАБОТАЮТ ТОЛЬКО ТЕ ПУНКТЫ КОТОРЫЕ УКАЗАНЫ ВЫШЕ! ОСТАЛЬНЫЕ ПУНКТЫ ДОБАВЛЕНЫ НА БУДУЩЕЕ, И МОГУТ БЫТЬ ИЗМЕНЕНЫ)
      P.S. Обновления платные - 25% от стоимости админки.
      Скайп: hf-trade
    • Автор: NoNameUltima
      Автор: NoNameUltima
      v. 0.1.7
      Стоимость: 2500
       
      Мод предоставляется в двух частях:
      Клиентский мод(для игроков). Ключи и подписи, присутствуют(При необходимости изменения содержимого - ключ и подписи можно переделать). Серверный мод(только для сервера). *Моды связанны между собой.
       
      Что присутствует:
       
      Дебаг монитор *Есть настройка в конфигурации - отображать, или нет монитор при заходе на сервер.
      **Кнопка вкл\выкл настраивается в конфигурации
      За убийство зомби, повышается счетчик убийств зомби. За убийство зомби, начисляются наличные(кол-во настраивается в конфигурации). При смерти игрока, наличные остаются в трупе.(Забрать можно). За убийство игрока, повышается счетчик убийств людей. Метки на карте с указанием торговых зон. Стартовое приветствие игроков. ПНВ работающий от батарейки. Панель игрока Зараженные зоны. Стартовый инвентарь для игроков(по UID'ам, и общий). Стартовые позиции для игроков(по UID'ам, и случайные для тех кого нет в списке). Статичные постройки на карте(загрузка из класса). Создание коробок с содержимым. Команды чата:  
      Доп. статичные функции:  
      skype: hf-trade
       
      P.S. Обновления платные(для тех кто приобретал мод ранее: 25% от общей стоимости, до актуальной версии).
      P.S.P.S. Весь функционал является БЕТА-ВЕРСИЕЙ!