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

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

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

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

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

Поиск по сайту

Результаты поиска по тегам '[DayZ'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Категории и разделы

  • Основной раздел сайта
    • S-Platoon
    • Приватный раздел
    • Рынок
    • Комната отдыха и развлечений
  • Серверостроение - DayZ Standalone
    • Инструкции
    • Помощь
    • Прочее
    • English section
  • Серверостроение - Общий раздел
    • ARMA 3
    • DayZ мод
    • ARMA 2
    • CS: Global offensive
    • ARK: Survival Evolved
    • Minecraft
    • Rust
  • Темы поддержки товаров

Категории

  • DayZ
    • Сборки серверов
    • Скрипты, моды, карты и т.д.
    • Транспорт
    • Оружие, инструменты, предметы
    • Дополнения для карты
    • Модели
    • Программное обеспечение
    • Прочее
  • Arma 3
    • Сборки серверов
    • Скрипты, моды, карты и т.д.
    • Транспорт
    • Модели
    • Программное обеспечение
    • Прочее

Группы продуктов

  • Привилегии на форуме
  • Реклама на сайте

Искать результаты в...

Искать результаты, содержащие...


Дата создания

  • Начать

    Конец


Последнее обновление

  • Начать

    Конец


Фильтр по количеству...

Зарегистрирован

  • Начать

    Конец


Группа


Вконтакте


Steam


ICQ


Skype


Город


Сайт


Интересы

Найдено 12 результатов

  1. В данной теме я распишу возможность создания серверного мода для сервера на собственном примере и объясню как его собрать.Работающий на момент публикации статьи на версии сервера игры 1.04.152050. Темы к ознакомлению, связанные с данным материалом: https://s-platoon.ru/topic/8701-enscript-uchimsya-osnovam-skriptinga/ https://s-platoon.ru/topic/8622-enscript-delaem-skript-dlya-moda-i-osnovnye-principy-skriptinga-modov/ Нам понадобятся: 1. Сервер игры актуальной версии, не ниже патча 1.04. Как установить можно узнать тут: До версии 1.04 параметра servermod у сервера игры не существовало!!! 2. Программа 'PBO manager' с состава инструментария армы из сети: https://www.armaholic.com/page.php?id=16369 Зеркало: https://yadi.sk/d/_gmzoNSDpNJTt Еще зеркало: Pbo manager.rar 3. Скрипты для упаковки в наш мод, сформированные и подготовленные нами вручную. Как - смотрите тему 4. Notepad++ https://notepad-plus-plus.org/download P.S. Вместо 'PBO manager' можно использовать DayZ Tools, но как им пользоваться разбираемся сами 😉 И так, приступим: 1. Предположим, что у нас имеется свой некий набор скриптов (если нет - читаем выше), который необходимо добавить серверу, но не на уровне миссии сервера, а на более ранних уровнях его загрузки. Например, добавить свой killfeed, модифицировать или изменить какой-либо из родных скриптов сервера игры, либо вовсе модификации, подключенной у вас. Для примера в этой теме и данного гайда я взял вот этот набор скриптов, собранный непосредственно для данной темы за 5 минут, и не изменяющий в сервере ровным счетом ничего. Он может послужить базой для создания своих модов, функций, переменных или классов. Данный гайд будем описывать, исходя из этого архива. Архив: MyScripts.rar Подробнее о создании скриптов для своих целей - читайте вот эту тему! 2. Создаем папку с нашим модом. Для примера, это будет папка '@My_Server_Mod'. В созданной нами папке создаем папку 'Addons', а в ней папку 'My_Server_Mod'. 3. Помещаем содержимое распакованного архива в папку 'My_Server_Mod'. Должно получиться так: 4. В папке 'My_Server_Mod' создаем файлик 'config.cpp' и заполняем его следующими данными (советую использовать Notepad++ для этого): class CfgPatches // требуется обязательно { class My_Server_Mod // требуется обязательно, совпадает с именем мода { units[]={}; // may be not worked weapons[]={}; // may be not worked requiredVersion=0.1; // may be not worked requiredAddons[]={}; /* requiredAddons[]= { "DZ_Data", // Перечисляем требуемые и используемые модом аддоны (pbo-файлы игры и модов по их внутренним скриптовым именам) }; */ }; }; class CfgMods // // требуется обязательно, совпадает с именем мода { // https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation class My_Server_Mod { dir = "My_Server_Mod"; // Имя папки мода, совпадает с именем мода picture = ""; // Картинка в описании мода action = ""; // Ссылка, например вот так: action = "https://dayz.com/"; hideName = 1; // Не уверен, что этот параметр работает hidePicture = 1; // Не уверен, что этот параметр работает name = "My_Server_Mod"; // Имя мода (а также его внутреннее скриптовое имя) logoSmall = "Mods/TestMod/modlogosmall.tga"; // значок рядом с именем мода, если описание не развернуто logo = "Mods/TestMod/modlogo.tga"; // логотип под меню игры logoOver = "Mods/TestMod/modlogohover.tga"; // при наведении курсора мыши на логотип tooltip = "tooltip"; // подсказка при наведении курсора мыши overview = "My Server Mod"; // Описание credits = "123new"; // credits author = "123new"; // author authorID = "0"; // author steam ID version = "1.0"; // version extra = 0; // Не уверен, что этот параметр работает type = "mod"; // требуется обязательно, остается неизменным // inputs = "mods\testmod\inputs\my_new_inputs.xml"; // необязательно, при использовании пользовательских inputs dependencies[]={"Core","GameLib","Game","World","Mission"}; // необязательно, если необходимо установить зависимость класса class defs { class engineScriptModule { value=""; // если значение пустое, используется функция ввода по умолчанию files[]={"My_Server_Mod/scripts/1_Core"}; // вы можете добавить любое количество файлов или каталогов, и они будут скомпилированы вместе с оригинальными скриптами игрового модуля }; class gameLibScriptModule { value=""; files[]={"My_Server_Mod/scripts/2_GameLib"}; }; class gameScriptModule { //value="CreateGameMod"; // когда значение заполнено, имя функции ввода модуля скрипта по умолчанию перезаписывается им value = ""; files[]={"My_Server_Mod/scripts/3_Game"}; }; class worldScriptModule { value=""; files[]={"My_Server_Mod/scripts/4_World"}; }; class missionScriptModule { value=""; files[]={"My_Server_Mod/scripts/5_Mission"}; }; }; // Если какой-то из разделов скриптинга вам не нужен и вы не сибираетесь его паковать, сотрите необходимый блок с ним выше и в массиве dependencies }; }; Пояснения в файле оставил. Файл готовый: config.cpp Как видите, в 'deffs' названия классов и путей соответствуют родным из 'scripts.pbo', но с допиской имени мода. Имя мода в данном случае и есть идентификатор для обращения к своему моду извне. А в 'dependencies' перечисляются используемые классы оригинальных скриптов без дописки номера секции. Количество используемых 'dependencies' и блоков 'deffs' должно быть идентично. Пояснения есть также и в официальной документации от разработчика: https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation 5. Запаковываем нашу папку 'My_Server_Mod' в pbo-файл 'My_Server_Mod.pbo' через 'PBO manager', как на скриншоте ниже: Можно использовать и другие способы запаковки, если знаете их или привычны вам. 6. Добавляем в параметры запуска сервера параметр: "-servermod=@My_Server_Mod;" -FilePatching 7. Радуемся, наш серверный мод готов. Пример готового серверного мода: @My_Server_Mod.rar P.S. Создавать bikey файл для мода и bisign подписи для него не требуется, иначе это может привести к неработоспособности серверной модификации (возможно, недоработка сервера игры разработчиком) Отмечу сразу, что данный способ подходит для модификации и переписывания оригинальных классов скриптов сервера от разработчиков и модификации чужих модов с помощью моддинга, применяется исключительно на стороне сервера игры и клиент игры не затрагивает. Распространять такой мод игрокам НЕ НУЖНО! Изменение оригинальных скриптов, для которых не предусмотрена операция 'modded class' в движке игры, а также классов и функций, которые защищены языком и движком игры от такого рода действий через серверные моды не получится. Если вы столкнулись с этим, вам проще распаковать scripts.pbo и поместить папку scripts в корень сервера игры, добавить в параметры запуска сервера параметр -FilePatching и изменять напрямую в папке необходимые вам файлы.Запаковывать назад в pbo папку и размещать в dta в таком случае не нужно! P.P.S. Процедура создания своего собственного клиент-серверного мода на основе скриптов работает таким же образом. В случае создания такого мода, файл 'config.cpp' может быть для стандартного мода более разнообразным, а также после требуется обязательная подпись такого мода в bisign и создание bikey файлов. Более подробно это освещать требуется отдельно!
  2. В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления, которые вы захотите сами. Нам понадобится: 1. Сервер DayZ 1.0, сделанный по одному из гайдов: 2. Notepad++ 3. Немножечко трезвого ума Приступим: 1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c 2. В самом начале файла добавляем: #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\InfoMessages.c" Находим функцию void main() и перед ее закрывающей скобкой "}"добавляем: GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CustomInformation, TIME_Information_Repeat, true); пример: 3. Помещаем в папку файл InfoMessages.c Либо создаем вручную этот файл с именем "InfoMessages.c" и заполняем его следующим текстом: int TIME_Information_Repeat = 60000; //in ms (60 seconds = 60000) ref TStringArray Messages = {"Welcome to My Server!", "This is server DayZ 1.0 Stable version!", "Our ip adress: ....", "Our site: ....", "Good day and big Loot for all!"}; void CustomInformation() { //GetGame().GetWorld().GetPlayerList(m_Players); array<Man> players = new array<Man>; GetGame().GetPlayers( players ); private int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { // GetGame().ChatPlayer(0,Messages.GetRandomElement()); foreach(Man player: players) { InfoMessages_SendPersonalMessage(Messages.GetRandomElement(), player); } } } void InfoMessages_SendPersonalMessage(string message, Man player) { if(( player ) && (message != "")) { Param1<string> m_GlobalMessage = new Param1<string>(message); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_GlobalMessage, true, player.GetIdentity()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке int TIME_Information_Repeat = 60000; //in ms (60 seconds = 60000) указываем время повтора вывода сообщений в чат (поумолчанию стоит минута) и сами сообщения в переменной ref TStringArray Messages = {"Welcome to My Server!", "This is server DayZ 0.63 Experimental!", "Our ip adress: ....", "Our site: ....", "Good day and big Loot for all!"}; Важно: в конце последней строки обязательно должна быть скобка и точка с запятой, иначе сервер не запустится! P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
  3. В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о количестве игроков. Нам понадобится: 1. Сервер DayZ 1.0, сделанный по одному из гайдов: 2. Notepad++ 3. Немножечко трезвого ума Приступим: 1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c 2. В самом начале файла добавляем: #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\PlayersMessagesCount.c" Находим функцию void main() и перед ее закрывающей скобкой "}"добавляем: GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(SendPlayersCount, CountPlayers_TIME_InfoPlayers_Repeat, true); 3. Помещаем в папку файл PlayersMessagesCount.c Либо создаем вручную этот файл с именем "PlayersMessagesCount.c" и заполняем его следующим текстом: int CountPlayers_TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) string Message_Chat = "Online Players: "; void SendPlayersCount() { array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { foreach(Man player: players) { CountPlayers_SendPersonalMessage(Message_Chat + numbOfplayers.ToString(), player); } // GetGame().ChatPlayer(0,Message_Chat + numbOfplayers.ToString()); } } void CountPlayers_SendPersonalMessage(string message, Man player) { if(( player ) && (message != "")) { Param1<string> m_GlobalMessage = new Param1<string>(message); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_GlobalMessage, true, player.GetIdentity()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке int CountPlayers_TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) указываем время повтора вывода сообщений в чат (поумолчанию стоит 2 минуты) и текст сообщений в переменной string Message_Chat = "Online Players: "; P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
  4. В данной теме я распишу мой вариант установки сейвзоны, работающий на момент публикации статьи на версии сервера игры 1.06.152885. Установка 1. Открываем 'init.c' в 'MpMissions' вашей. 2. Вверху файла добавляем 1 строкой: #include "$CurrentDir:\\mpmissions\\dayzoffline.chernarusplus\\Scripts\safezone.c" Где 'dayzoffline.chernarusplus' - имя папки с активной 'MpMissions' вашей. Т.е. для карты Livonia 'dayzoffline.chernarusplus' надо вручную заменить на 'dayzOffline.enoch' Пример: 3.Создаем папку 'Scripts' в корне 'MpMissions' вашей, а в ней создаем файл с именем 'safezone.c' следующего содержания: /* Author: Sania(ZoS) (aka 123new) Project: S-platoon.ru Install: 1. Create a 'Scripts' directory in your active mpmissions 2. Plase this filename (safezone.c) in 'Scripts' 3. Add in init.c this line: #include "$CurrentDir:\\mpmissions\\dayzoffline.chernarusplus\\Scripts\safezone.c" Where is 'dayzoffline.chernarusplus' is active mpmission directory in cfg filename server 4. Configure a next settings */ class SafeZone_PlugIn { protected bool Activate_SafeZone_PlugIn = true; // safezone on (true) or off (false) protected float SAFEZONE_time_repeat_checking = 10; //In seconds ref static TStringArray SAFEZONE_LOACTIONS = {"15145.1 32.9793 13919.0", "12145.1 32.9793 10919.0"};//Map coords (positions of the safe zone) protected static float SAFEZONE_RADIUS = 100; //In meter protected static string SAFEZONE_ENTRY_MESSAGE = "Welcome to The SafeZone! Godmode ENABLED!"; protected static string SAFEZONE_EXIT_MESSAGE = "You Have Left The SafeZone! Godmode DISABLED!"; void OnInit() { if(Activate_SafeZone_PlugIn) { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(RunCheckStart, (SAFEZONE_time_repeat_checking * 1000), true); } } static void RunCheckStart() { private array<Man> players = new array<Man>; GetGame().GetPlayers( players ); if (SAFEZONE_LOACTIONS.Count() > 0) { if (players.Count() > 0) { foreach(string SAFEZONE_LOACTION: SAFEZONE_LOACTIONS) { if( players.Count() > 0 ) { foreach(Man player: players) { if(player) { private PlayerBase player_casted = PlayerBase.Cast(player); CheckingPosition(player_casted,SAFEZONE_LOACTION.ToVector()); } } } } } } } static void CheckingPosition(PlayerBase player,vector SAFEZONE_LOACTION) { private float SAFEZONE_distance; private string SAFEZONE_ZoneCheck, SAFEZONE_UID_PLAYER, SAFEZONE_NAME_PLAYER; SAFEZONE_NAME_PLAYER = player.GetIdentity().GetName(); SAFEZONE_UID_PLAYER = player.GetIdentity().GetPlainId(); //Steam 64 private vector SAFEZONE_pos_player = player.GetPosition(); private vector SAFEZONE_LOCATION_FIXED = CorrectToGroundPosY(SAFEZONE_LOACTION); private string name_mesage_profile = "GodModeEnabledFor: " + SAFEZONE_UID_PLAYER + " Location: " + SAFEZONE_LOACTION.ToString(); SAFEZONE_distance = vector.Distance(SAFEZONE_pos_player,SAFEZONE_LOCATION_FIXED); if (SAFEZONE_distance <= SAFEZONE_RADIUS) //Player Inside Zone { SAFEZONE_ZoneCheck = ""; GetGame().GetProfileString(name_mesage_profile,SAFEZONE_ZoneCheck); if (SAFEZONE_ZoneCheck == "true") //Already in zone { GetGame().SetProfileString(name_mesage_profile,"true"); player.SetAllowDamage(false); //GodMode On return; } else { GetGame().SetProfileString(name_mesage_profile,"true"); Print("[SafeZone] " + SAFEZONE_NAME_PLAYER + " (" + SAFEZONE_UID_PLAYER + ") Enter in safeZone in position: " + SAFEZONE_LOCATION_FIXED.ToString()); player.SetAllowDamage(false); //GodMode On SendPersonalMessage(SAFEZONE_ENTRY_MESSAGE, player); } } else { //Player Outside of Zone if (SAFEZONE_distance > SAFEZONE_RADIUS) //Player Outside of Zone { SAFEZONE_ZoneCheck = ""; GetGame().GetProfileString(name_mesage_profile,SAFEZONE_ZoneCheck); if (SAFEZONE_ZoneCheck == "false") { GetGame().SetProfileString(name_mesage_profile,"false"); return; } else { if (SAFEZONE_ZoneCheck != "") { GetGame().SetProfileString(name_mesage_profile,"false"); Print("[SafeZone] " + SAFEZONE_NAME_PLAYER + " (" + SAFEZONE_UID_PLAYER + ") Left safeZone in position: " + SAFEZONE_LOCATION_FIXED.ToString()); player.SetAllowDamage(true); //GodMode Off SendPersonalMessage(SAFEZONE_EXIT_MESSAGE, player); } else { GetGame().SetProfileString(name_mesage_profile,"false"); return; } } } } } static vector CorrectToGroundPosY(vector pos) { private float pos_x = pos[0]; private float pos_z = pos[2]; private float pos_y = GetGame().SurfaceY(pos_x, pos_z); private vector tmp_pos = Vector(pos_x, pos_y, pos_z); return tmp_pos; } static void SendPersonalMessage(string message, PlayerBase casted_player) { Man player; Class.CastTo(player, casted_player); if(( player ) && (message != "")) { Param1<string> m_GlobalMessage = new Param1<string>(message); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_GlobalMessage, true, player.GetIdentity()); } } } /* class SafeZone_Config //test config for json { vector SAFEZONE_LOACTION = "15145.1 32.9793 13919.0"; //Map coords (position of the safe zone) float SAFEZONE_RADIUS = 100.0; //In meter string SAFEZONE_ENTRY_MESSAGE = "Welcome to The SafeZone! Godmode ENABLED!"; string SAFEZONE_EXIT_MESSAGE = "You Have Left The SafeZone! Godmode DISABLED!";\ } */ ref SafeZone_PlugIn SafeZone = new SafeZone_PlugIn(); modded class CustomMission { override void OnInit () { super.OnInit(); SafeZone.OnInit(); } } Ну или скачиваем его отсюда в готовом виде: safezone.c Здесь: 'SAFEZONE_LOACTIONS' - координаты точкек центра сейвзоны, можно указать несколько. 'SAFEZONE_RADIUS' - радиус от указанного центра севзоны, на котором действует защита 'ENTRY_MESSAGE' - сообщение о входе в зону (не рекоммендуется указывать русский язык, может не отображаться) 'EXIT_MESSAGE' - сообщение о выходе из зоны (не рекоммендуется указывать русский язык, может не отображаться) 'SAFEZONE_time_repeat_checking' - время повтора проверки наличия игроков в зонах, в секундах 'Activate_SafeZone_PlugIn' - активация плагина скрипта, true - ключен, false - выключен 4. Запускаем сервер и проверяем. Для совсем ленивых готовая миссия сервера с настроенной сейвзоной для патча игры 1.06 dayzOffline.chernarusplus.rar Гайд обновлен: 31.01.2020
  5. В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления о количестве игроков. Нам понадобится: 1. Сервер DayZ 0.63, сделанный по одному из гайдов: 2. Notepad++ 3. Немножечко трезвого ума Приступим: 1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c 2. В самом начале файла добавляем: #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\PlayersMessagesCount.c" И после строки weather.SetWindFunctionParams(0, 0, 0); добавляем: GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(SendPlayersCount, TIME_InfoPlayers_Repeat, true); Пример: 3. Помещаем в папку файл PlayersMessagesCount.c Либо создаем вручную этот файл с именем "PlayersMessagesCount.c" и заполняем его следующим текстом: int TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) string Message_Chat = "Online Players: "; void SendPlayersCount() { array<Man> players = new array<Man>; GetGame().GetPlayers( players ); int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { GetGame().ChatPlayer(0,Message_Chat + numbOfplayers.ToString()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке int TIME_InfoPlayers_Repeat = 120000; //in ms (120 seconds = 120000) указываем время повтора вывода сообщений в чат (поумолчанию стоит 2 минуты) и текст сообщений в переменной string Message_Chat = "Online Players: "; P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
  6. В данной теме разберем момент настройки количества спавнящегося лута на сервере, объектов типа "автомобили и хеликраши", животых и зомби. Скажу сразу, гайд может быть не точным, поскольку официальной информации по серверной части разработчики игры не предоставляют, все основано лишь на личных наблюдениях и комментариях остальных людей. Гайд относится исключительно к версии сервера DayZ Standalone 0.61 в настроенном режиме работы сервера private hive (dboffline) с рабочим респавном лута (полная генерация папки storage со всеми ее компонентами). Пример такого сервера можно наблюдать в соседней моей теме: Упомяну также сразу и о том, что в версии 0.61 и 0.60, по сравнению с старыми версиями игры, в игру разработчиками введена так называемая "центральная экономика лута сервера". Это означает, что сервер сам постоянно анализирует количество каждого предмета, объекта, вещи на сервере, их качество, то, сколько они лежат уже, сколько с ними взаимодействовали и т.п. информацию, и уже на основании этих данных динамически подспавнивает все необходимое сам по мере необходимости. Это удобно, не правда ли? Но есть и минусы такого плана, что если каких-то вещей в палатках и бочках у людей набралось много, эти вещи просто могут перестать спавниться на сервере, поскольку они уже имеются в наличии у кого-то. Также, не исключено, что самописная система сохранений на серверах наших также вносит свой вклад в это, поскольку с каждым перезаходом на сервер база данных лута сервера перезаписывается, и для сервера может создаться эффект, что она дублируется, а значит база данных захламляется лутом и в спавне его становится меньше (эта информация не проверенная, только лишь догадка). Собственно, настройку этой системы мы и будем разбирать ниже Собственно, приступим: 1. Первым делом откроем нашу папку миссии сервера в MpMissions, зайдем в папку db и откроем файлик с именем types.xml блокнотиком (советую с Notepad ++ открыть). Увидим вот такое: 2. Разберем на примере одного из блоков (принцип един для всех блоков и одинаков). Выберем, например вот этот блок. Вот что мы здесь имеем: <type name="P1"> <!--- Там где указано 'P1' это класснейм вещи. Т.е. внутрисерверный код вещи, по которому сервер распознает, что это именно эта конкретная вещь. Список такого рода класснеймов можно найти в интернете самим вручную.--> <nominal>20</nominal> <!--- Число 20 - это наиболее вероятное количество данной вещички, которое будет иметься на сервере на сервере в целом, подспавниваться, в случае нехватки вещей на сервере, или наоборот не спавниться, если вещичек на сервере уже имеется столько или больше. Число 20 это не конкретное количество, а лишь наиболее вероятное значение, которое сервер выберет сам. Конктретное значение назначить невозможно.--> <lifetime>8500</lifetime> <!-- Число 8500 это время жизни вещички на сервере от момента ее спавна до момента ее удаления (и последующего ее переспавна, если сервер решит, что это необходимо). Число, как понимаю, указывается в секундах. В случае, если с вещью этой кто-то повзаимодействовал, счетчик секунд до ее удаления и переспавна сбрасывается, и отсчет этого времени начинается заного.---> <restock>500</restock> <!-- Незвестный мне параметр ---> <min>10</min><!--- Число 10 - это минимально допустимое количество данной вещички, которое будет иметься на сервере в целом. Работает по принципу с параметром nominal выше. Число 10 это не конкретное количество, а лишь наиболее вероятное значение, которое сервер выберет сам. Иными словами, минимальная граница диапазона. Конктретное значение назначить невозможно.--> <max>100</max><!--- Число 100 - это максимально допустимое количество данной вещички, которое будет иметься на сервере в целом. Работает по принципу с параметром nominal выше. Число 100 это не конкретное количество, а лишь наиболее вероятное значение, которое сервер выберет сам. Иными словами, максимальная граница диапазона. Конктретное значение назначить невозможно. Сервер сам при первом запуске сервера генерирует себе в базу количество в луте этой вещи на всем сервере в целом, и это число сохраняет.--> <quantmin>-1</quantmin> <!-- Незвестный мне параметр ---> <quantmax>-1</quantmax> <!-- Незвестный мне параметр ---> <cost>100</cost> <!-- Незвестный мне параметр ---> <flags>7</flags> <!-- Незвестный мне параметр ---> </type> Возможно, имеются и какие-то иные параметры записи в этот файл. В класснеймы в этом файле вводятся не только вещи, но и класснеймы хеликрашей, животных, зомби и прочего (даже транспорт есть). Грубо говоря, это таблица всего, что будет спавниться на сервере вообще. 3. Теперь откроем файлик events.xml так же. Здесь принцип тот же, но некоторые параметры уже отличаются. 4. Разберем на примере такого вот блока в этом файле. Показатели, которые есть в types.xml и имеются тут дублируются, пояснения по ним копировать не стану. (какие рабочие не знаю, указываем их и там и там) <event name="VehicleTransitBus"> <!--- Все тот же класснейм в привычном нам виде, но не объекта, как понимаю, а категории объектов. Откуда названия брать не изучал. --> <waves>3</waves> <!--- Неизвестный мне параметр--> <nominal>5</nominal> <!--- См. комментарии в types выше --> <min>3</min><!--- См. комментарии в types выше --> <max>5</max><!--- См. комментарии в types выше --> <lifetime>25000</lifetime><!--- См. комментарии в types выше --> <restock>0</restock><!--- См. комментарии в types выше --> <saferadius>1000</saferadius> <!--- Радиус спавна лута около объета, актуально для хеликрашей. --> <distanceradius>2000</distanceradius><!--- Радиус, в котором, как понимаю, объекты данного типа рядом не появятся --> <cleanupradius>0</cleanupradius><!--- Радиус в метрах, на расстоянии которого будет пропадать зомби и лут, отходящий от объекта самовольно. --> <deletedamaged>1</deletedamaged> <!--- Актуально для машинок, думаю, с названия понятно что это. --> <flags>262400</flags> <!--- Неизвестный мне параметр--> <children> <!--- Простая покатегория --> <child flags="0" lootmax="3" lootmin="0" max="5" min="5" type="TransitBus"/> <!--- Класснейм объекта, который относится к этому типу event сервера, в параметрах минимум-максимум лута у объекта или в объекте, и количество самих объектов на серре данного типа. --> </children> </event> 5. теперь разберем server.xml и globals.xml В первом файле настройка работы с базой данных сервера официальной, такие как время синхронизации данных между клиентом игры и сервером, время жизни трупов после смерти, и параметр queuetime, который не работает (это время ожидания поумолчанию перед спавном, отключено в силу технической возможности впринципе зайти на сервер вообще). Во втором файле соответственно мы имеем параметры количества спавна зомби, дистанция для динамического спавна зомби на игрока и другие какие-то настройки, смысл которых я так и не понял. ВАЖНО!!! После редактирования всех этих настроек не забываем, что если у вас имеется папка storage, и в папке storage сервера имеются одноименные bin-файлы базы данных сервера, то настройки ваши не применятся с запуском сервера, поскольку они в таком случае считываются у вас именно из storage-директории. Потому если вы хотите применить эти настройки необходимо будет либо удалить всю директорию storage, либо конкретно данные файлы! Но помните, если вы будете удалять файлы, делайте копии базы перед удалением, поскольку файлы в папке storage взаимосвязаны, и всегда имеется риск, удалив один файл, вызвать вайп или переспавн какого-то из элементов на сервере (это заметно при старте сервера в ее консоли пhи подгрузке файлов множественным serious damaged). Вроде бы и все. Не уверен, что часть из настроек этих вообще работает, а часть пояснений к ним корректно написана, но это лично мои наблюдения. Надеюсь, прояснил хоть немного о известной системе работы сервера. Если у кого есть более точная и правильная информация, просьба писать ее, будем корректировать гайд вместе.
  7. PLAYERDEAD

    DAYZSC CONFIG TOOL [DayZ v1.0]

    Просто инструмент для редактирования файла конфигурации сервера. 1. Скопируйте файлы в вашу папку сервера DayZ. 2. Открыть DayZSC.ini и указать свой путь к вашей миссии «DayZServer\mpmissions\dayzOffline.chernarusplus» !!! PS: Не сохраняйте свои настройки во время работы Сервера! PSs: Используйте резервные копии ваших файлов, инструмент ещё свежий и не известно как себя поведет. Версия: v0.16E DayZSC_Config_Tool-0.16e.7z Зеркало | Источник
  8. Нам понадобится: 1. Сервер DayZ Standalone (см. тему вот эту) 2. Notepad++: бесплатно на оф. сайте 3. Немного времени и настойчивости (обычно бывает в комплекте и так) И так, начинаем: 1. Открываем блокнотом mpmissions\dayzOffline.chernarusplus\init.c P.S. Имя папки dayzOffline.chernarusplus у вас может отличаться, будьте внимательны 2. В начале файла добавляем: static int time_repeat_info_players = 10; //in seconds static string file_name_info_players = "$profile:PlayersLogFile.txt"; static void WriteFile(string file_name, string text) { private FileHandle fhandle; if ( !FileExist(file_name) ) { fhandle = OpenFile(file_name, FileMode.WRITE); } else { fhandle = OpenFile(file_name, FileMode.APPEND); } if ( fhandle == 0 ) { Print("[#Запись_в_файл]: Не удалось открыть файл для записи: " + file_name); Print("[#Запись_в_файл]: [Запись]: " + text); return; } FPrintln(fhandle, text); CloseFile(fhandle); } static void WritePlayersInfo() { array<Man> players = new array<Man>; Man player; Man player_test; GetGame().GetPlayers( players ); if (players.Count() > 0) { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } for ( int i = 0; i < players.Count(); ++i ) { player_test = players.Get(i); if( player_test ) { PlayerIdentity p_identity = player_test.GetIdentity(); private string coord_pl = player_test.GetPosition().ToString(); private string Name_P = p_identity.GetName(); private string UID_P = p_identity.GetPlainId(); WriteFile(file_name_info_players, "User name: " + Name_P + " UID: " + UID_P + " Coords: " + coord_pl); } } } else { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } } } Где 'PlayersLogFile.txt' меняем на нужное вам имя файла, а в 'time_repeat_info_players' настраиваем время повтора проверки списка игроков для перезаписи файла 3. Находим в файле блок 'void main()' и в его конце перед закрывающей '}', поумолчанию это строка weather.SetWindFunctionParams(0.1, 0.3, 50); добавляем ниже строку: GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(WritePlayersInfo, (time_repeat_info_players * 1000), true); 4. Готово, если не допустили ошибок, при наличии хотя бы 1 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
  9. Автор скрипта: http://s-platoon.ru/profile/14721-borizzk/ Все благодарности за этот скрипт непосредственно автору скрипта, не мне! И так, установка: 1. Первым делом нам необходим чистый стандартный сервер DayZ (без модов, поскольку моды могу приводить к неработоспособности частей гайда). Установить его можно по инструкции, например, так: Замечу сразу, гайд сделан для версии игры 0.63.149525 2. Заходим в папку 'DTA' и распаковываем с 'PBO-MANAGER' архив 'scripts.pbo', получив папку 'scripts'. 3. Перемещаем папку 'scripts с' папки 'DTA' в корень папки сервера 4. Переходим по следующему пути: scripts\4_World\Entities\ManBase\PlayerBase.c и открываем файл. В самом его начале после кода class PlayerBase extends ManBase { добавляем код // BY BORIZZ.K, s-platoon.ru (ThX Mizev, NoNameUltima, 123New and DaOne) //MY --- //PLAYER DEATH with MESSAGES START //MY int killscore = 0; // usage p_killer.killscore = p_killer.killscore + 1; // for kills count in EEKilled function. //p_killer must be PlayerBase - use p_killer = PlayerBase.Cast(killer) //See EEKilled function int diescore = 0; // usage Player.diescore = Player.diescore + 1; // for death count in EEKilled function. //Player must be playerbase void Message_PlayerKilled(Object player_obj, Object killer) { //MY --- PlayerBase p_Killer = NULL; // Killer PlayerBase Player = player_obj; // Killed player PlayerIdentity Player_Identity = Player.GetIdentity(); //Killed player Identity string Player_Name = Player_Identity.GetName(); //Killed player name string p_UID = Player_Identity.GetPlainId(); // Killed player UID bool enableSaveKills = true; // enable/disable save kill count to profile/file by Killer UID bool enableSaveDies = true; // enable/disable save death count to profile/file by Player UID if ( GetGame().ServerConfigGetInt("enableSaveKills") == 0 ) //place parameter enableSaveKills = 0; for disable SaveKills to server profile { enableSaveKills = false; } if ( GetGame().ServerConfigGetInt("enableSaveDies") == 0 )//place parameter enableSaveDies = 0; for disable SaveDies to server profile { enableSaveDies = false; } string deathMsg = ""; string deathMsgDist = ""; string deathMsgKillScore = ""; string DebugMessage; Print("::: EEKilled: Debug: Input: killer " + killer.ToString() + " => Class: " + killer.GetType() + ", Player " + Player.ToString() + " => Class: " + Player.GetType()); //DEBUG //Phase #1 if ( killer.IsMan() ) { if ( killer.IsKindOf("SurvivorBase") ) { p_Killer = PlayerBase.Cast(killer); DebugMessage = "killer.IsMan(): killer.IsKindOf('SurvivorBase'): killer " + p_Killer.ToString() + " kill player " + Player.ToString(); //DEBUG } } else { if ( killer.IsItemBase() ) { ItemBase bitem = ItemBase.Cast(killer); p_Killer = PlayerBase.Cast(bitem.GetHierarchyRootPlayer()); DebugMessage = "killer.IsItemBase(): killer " + p_Killer.ToString() + " => " + bitem.ToString() + " kill player " + Player.ToString(); //DEBUG } else { DebugMessage = "killer " + killer.ToString() + " kill player " + Player.ToString(); //DEBUG } } Print("::: EEKilled Debug: " + DebugMessage); //DEBUG //Phase #2 if (p_Killer) { if (Player == p_Killer) { deathMsg = Player_Name + " committed suicide."; } else { PlayerIdentity Killer_Identity = p_Killer.GetIdentity(); string killer_name = Killer_Identity.GetName(); string k_UID = Killer_Identity.GetPlainId(); //Get killer UID vector position_killer = p_Killer.GetPosition(); vector position_player = Player.GetPosition(); int dist = vector.Distance(position_player, position_killer); EntityAI itemInHands = p_Killer.GetHumanInventory().GetEntityInHands(); if (enableSaveKills) { string strkillscore; g_Game.GetProfileString("killscore"+k_UID,strkillscore); if (strkillscore) { Print("::: EEKilled Debug: LoadKills: Killer: " + killer_name + ", loaded killscore: " + strkillscore); //DEBUG p_Killer.killscore = strkillscore.ToInt(); } } p_Killer.killscore = p_Killer.killscore + 1; //You must declare a variable: int KillScore = 0; in PlayerBase class if (enableSaveKills) { g_Game.SetProfileString("killscore"+k_UID,p_Killer.killscore.ToString()); g_Game.SaveProfile(); Print("::: EEKilled Debug: SaveKills: Killer: " + killer_name + ", killscore: " + diescore.ToString()); //DEBUG } if ( itemInHands.IsItemBase() ) { ItemBase item = ItemBase.Cast(itemInHands); string className = item.GetType(); deathMsg = killer_name + " kill: " + Player_Name; deathMsgDist = " from a distance: " + dist.ToString() + "m by " + className; deathMsgKillScore = killer_name + " kills: " + p_Killer.killscore.ToString(); } else { deathMsg = killer_name + " kill: " + Player_Name; deathMsgDist = " from a distance: " + dist.ToString() + "m."; deathMsgKillScore = killer_name + " kills: " + p_Killer.killscore.ToString(); } } } else { if ( killer.IsKindOf("AnimalBase") ) { deathMsg = Player_Name + " killed by animal."; } else { if ( killer.IsKindOf("ZombieBase") ) { deathMsg = Player_Name + " killed by zombie."; } else { deathMsg = Player_Name + " died for an unknown reason."; } } } //Phase #3 GetGame().ChatPlayer(5, deathMsg); Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsg); //DEBUG if (deathMsgDist) { GetGame().ChatPlayer(5, deathMsgDist); Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsgDist); //DEBUG } if (deathMsgKillScore) { GetGame().ChatPlayer(5, deathMsgKillScore); Print("::: EEKilled Debug: killer: " + killer.ToString () + " ::: " + deathMsgKillScore); //DEBUG } if (enableSaveDies) { string strdiescore; g_Game.GetProfileString("diescore"+p_UID,strdiescore); if (strdiescore) { Print("::: EEKilled Debug: Load Die's: Player: " + Player_Name + ", loaded diescore: " + strdiescore); //DEBUG Player.diescore = strdiescore.ToInt(); } } Player.diescore = Player.diescore + 1; if (enableSaveDies) { g_Game.SetProfileString("diescore"+p_UID,Player.diescore.ToString()); g_Game.SaveProfile(); Print("::: EEKilled Debug: SaveDeath: Player: " + Player_Name + ", diescore: " + diescore.ToString()); //DEBUG } //MY --- if( GetHumanInventory().GetEntityInHands() ) { if( CanDropEntity(player_obj) ) { if( !IsRestrained() ) { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(ServerDropEntity,1000,false,( GetHumanInventory().GetEntityInHands())); } } } } затем находим функцию override void EEKilled( Object killer ) { и перед строкой Print("EEKilled, you have died"); добавляем Message_PlayerKilled(this, killer); 4. В параметры запуска сервера добавляем: -FilePatching 5. В 'config-файл' сервера (тот файл где название сервера) добавляем: enableSaveKills = 1; // Включение сохранения счетчика убийств по игрокам enableSaveDies = 1; // Включение сохранения счетчика смертей по игрокам где 1 - включено, 0 - выключено 6. Сохраняем, запускаем сервер и радуемся. Сообщения о смертях игроков будут у вас как в чате, так и в script.log. Где хранятся счетчики убийств и смертей? Ответ: Они хранятся в profile сервера игры. Т.е. после 1-го запуска создаются 2 файла (как у клиента игры в документах windows в папку dayz) в файлах с расширениями ".vars.DayZProfile" и ".DayZProfile". При удалении этих файлов счетчики сбросятся! ВАЖНО: Скажу сразу, добавить систему кастомного логирования вместо базового можно, но добавлять ее вам прийдется до иницилизации данного файла playerbase.c, поскольку уже в playerbase.c вы будете вызывать функцию, которая должна быть заранее определена и известна серверу! Добавлю, что сейчас масса модов, которые в своем составе имеют данный класс. Они также могут переписывать его, там самым приводя данный гайд в неработоспособность. Самый лучший вариант проверки гайда - на чистом сервере игры без модов. P.S. Данная тема является копией утраченной темы на нашем форуме, восстановлена по просьбам 'трудящихся'. Надеюсь, она вам поможет.
  10. В данной теме мы с вами научимся создавать простой скрипт, который позволит выводить в чат объявления, которые вы захотите сами. Нам понадобится: 1. Сервер DayZ 0.63, сделанный по одному из гайдов: 2. Notepad++ 3. Немножечко трезвого ума Приступим: 1. Открываем Mpmissions - dayzOffline.chernarusplus - init.c 2. В самом начале файла добавляем: #include "$CurrentDir:\\mpmissions\\dayzOffline.chernarusplus\\InfoMessages.c" И после строки weather.SetWindFunctionParams(0, 0, 0); добавляем: GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CustomInformation, TIME_Information_Repeat, true); пример: 3. Помещаем в папку файл InfoMessages.c Либо создаем вручную этот файл с именем "InfoMessages.c" и заполняем его следующим текстом: int TIME_Information_Repeat = 60000; //in ms (60 seconds = 60000) ref TStringArray Messages = {"Welcome to My Server!", "This is server DayZ 0.63 Experimental!", "Our ip adress: ....", "Our site: ....", "Good day and big Loot for all!"}; void CustomInformation() { //GetGame().GetWorld().GetPlayerList(m_Players); array<Man> players = new array<Man>; GetGame().GetPlayers( players ); private int numbOfplayers = players.Count(); if( numbOfplayers > 0 ) { GetGame().ChatPlayer(0,Messages.GetRandomElement()); } } 4. Настраиваем файл как нам нужно. Т.е. в строке int TIME_Information_Repeat = 60000; //in ms (60 seconds = 60000) указываем время повтора вывода сообщений в чат (поумолчанию стоит минута) и сами сообщения в переменной ref TStringArray Messages = {"Welcome to My Server!", "This is server DayZ 0.63 Experimental!", "Our ip adress: ....", "Our site: ....", "Good day and big Loot for all!"}; Важно: в конце последней строки обязательно должна быть скобка и точка с запятой, иначе сервер не запустится! P.S. Если сообщения вам не видны, включите их видимость в настройках вашего клиента игры для себя!
  11. В данной теме напишу простенький гайд о том, как самому на своем собственном сервере DayZ установить костомный (мой) скрипт на спавн, респавн и чистку хеликрашей. Гайд пригодится тем, кто сам делает свою сборку сервера, либо по каким-то причинам пользуется не моей сборкой сервера (где это уже сделано), а чьей-либо еще. Обращаю ваше внимание на тот факт, что часть файлов, описанных в гайде, у вас могут уже быть вынесены в другое место или названы несколько иначе (это зависит от сборки сервера, которую вы используете, например, в сборке dankdayz вся mpmissions вынесена в отдельный файл в addons сервера), гайд основывается на чистых серверных файлах игры и отталкивается от них. Гайд сделан для версий игры с серверной частью 0.60-0.62, но может быть совместим и с другими версиями игры, если файлы серверной части игры не поменяли своего текущего месторасположения и содержания. Гайд составлен по версии серверных файлов игры 0.62 чистой "девственной" и не правленой никем версии игры. Напоминаю заранее, в моих серверных файлах версий 0.60, 0.61 и 0.62 из моих гайдов на данном форуме это уже сделано и делать это не нужно!!! Нам понадобятся: 1. Notepad++ https://notepad-plus-plus.org/download/ 2. Ваши серверные файлы игры И так, приступим. 1. Первое, что нам понадобится - создать сам скрипт. Создаем по пути: "MPMissions\dayz_Auto.ChernarusPlus\" папку "scripts" , в ней папку "custom" , и в ней файл с именем "Helicarsh.sqf" . Если такие папки у вас уже имеются, просто не создавайте их, а перейдите в них. Если файл с там именем уже имеется у вас, задайте ему другое имя. 2. Вписываем в созданный файл код следующего содержания (либо скачайте его): Helicarsh.sqf diag_log format [" SpawnHeliCrashes: Reading Settings ..."]; /* Car Spawner for DayZ Standalone v 0.60.133.913 and high versions author: 123new Install: .\mpmissions\init.sqf Add in end file: init_spawn_cars = compile preprocessFileLineNumbers "scripts\custom\SpawnCars.sqf"; Call init_spawn_cars; and place this script file in: .\mpmissions\{your mission name}\scripts\custom\Helicarsh.sqf Settings: first massives: [count loot,type loot] end massive: [type car(classname), point car, selected first massive name] */ _zombs_heli_one = 15; // Maximum count zeds in one Heli _loot_heli_one = 15; // Maximum count loot in one Heli _max_distance_spawn_zeds = 25; // Maximum distance spawn zeds in one Heli _max_distance_spawn_loot = 10; // Maximum distance spawn loot in one Heli // Types HeliCrashes _HeliTypes = [ "Land_UH1Y_Wreck" ]; // SpawnPoints HeliCrashes _HeliPointsArray = [ [5738.4302,7605.0298], [6242.1201,8368.71], [4015.1001,7971.5698], [2320.3101,10217.8], [4506.8398,12748.3], [7121.3701,9646.6699], [1667.61,5293.3398], [1700.0699,2338.8501], [3563.6899,7537.1001], [4328.02,8489.7002], [5211.0698,7763.5498], [7455.7798,11574.3], [6119.3101,6631.1099], [5941.0601,6645.27], [5016.4302,6257.9199], [4781.8999,6270.2598], [4455.9302,6181.7202], [4074.98,6222.1802], [3622.3,6415.96], [3254.45,6682.6499], [2848.0601,6815.6401], [2572.1799,6781.1499], [2298.23,6513.3999], [2313.9299,6151.0498], [2461.02,5794.4102], [2028.4399,5166.5601], [1596.27,5234.5698], [3031.3401,10225.8], [3475.28,9765], [2863.99,9639.5195], [2067.3401,9272.2002], [1603.08,9231.04], [640.487,9119.4697], [4996.7798,9156.46], [5314.1802,9310.79], [5124.4502,9496.6504], [4847.1099,9867.2598], [4603.77,10245], [4454.6001,10666.2], [4696.3501,10736.4], [4174.2002,10879.6], [3904.0601,11112.5], [3453.49,10866.1], [2627.26,10443.4], [2243.21,10726.9], [1853.38,11309.6], [1949.3101,11759.8], [4832.6699,4767.9502], [3838.1101,4944.77], [3142.3401,4426.1899], [1263.8101,4081.76], [1371.08,4505.2598], [4712.8701,5869.5498], [5405.4502,5638.77], [3235.1799,8824.7598], [5928.0698,10975.5], [4661.25,11954.4] ]; // Classnames Loot HeliCrashes _arrayItemsHeli= [ ["food_canpeaches"], ["food_cansardines"], ["ghilliehood"], ["ghilliehoodtan"], ["ghilliehoodmossy"], ["ghilliehoodwoodland"], ["ghilliebushragwoodland"], ["ghilliebushragmossy"], ["ghillietoptan"], ["ghilliesuittan"], ["ghilliesuitmossy"], ["ghillietopwoodland"], ["ghilliebushragtan"], ["ttsko_pants_beige"], ["TTsKO_Jacket_Camo"], ["Ssh68Helmet"], ["tentmedium_packed"], ["tentlarge_backpack"], ["tentcar_packed"], ["Cultivation_CannabisSeeds"], ["Cultivation_CannabisSeedsPack"], ["BagAlice_Green"], ["BagAlice_Black"], ["BagAlice_Camo"], ["Fruit_Cannabis"], ["M249"], ["M_M249Box_200Rnd"], ["Ammo_556"], ["Saiga-12K"], ["Ammo_12ga_Pellets"], ["Ammo_12ga_Slug"], ["M_Saiga_5Rn"], ["M_Saiga_8Rnd"], ["M_SaigaDrum_20Rnd"], ["AKM"], ["M4A1"], ["Ammo_556_20Rnd"], ["Ammo_357_20Rnd"], ["ammo_762x39_20rnd"], ["ammo_762x39_20rnd"], ["CLIP_762_5Rnd"], ["Ammo_12ga_Pellets"], ["M_CMAG_10Rnd"], ["clip_762x39_10rnd"], ["Optics_Binoculars"], ["Optics_Rangefinder"], ["M_STANAG_30Rnd_COUPLED"], ["M_ak101_30Rnd"], ["M_Saiga_5Rnd"], ["M_ak74_30Rnd"], ["M_Vss_10Rnd"], ["M_svd_10Rnd"], ["Winchester70_Black"], ["M_Fal_20Rnd"], ["SKS"], ["b95"], ["AK101"], ["Att_Suppressor_AK"], ["Att_Optic_PSO1"], ["Att_Handguard_AK74_Camo"], ["Att_Buttstock_AK_Wood_Camo"], ["att_bayonet_ak"], ["ammobox_556_20rnd"], ["AmmoBox_9x39_20Rnd"], ["AmmoBox_308Win_20Rnd"], ["FAL"], ["Att_Optic_PUScope"], ["AmmoBox_762_20Rnd"], ["SVD"], ["Mosin9130_Green_Black"], ["CLIP_762_5Rnd"], ["magnum"], ["m_357_speedloader"], ["fnx45"], ["m_cz75_15rnd"], ["Att_Suppressor_Pistol"], ["1911_engraved"], ["cz75"], ["Att_Optic_FNP45_MRD"], ["m_fnx45_15rnd"], ["Glock19"], ["M_Glock_15Rnd"], ["MP5K"], ["Att_Optic_Reflex"], ["Att_Optic_ACOG"], ["Att_Optic_M4T3NRDS"], ["Att_Handguard_MP5_Rail"], ["Att_Buttstock_MP5_Stock"], ["M_MP5_30Rnd"], ["UMP45"], ["shotgunmp133"], ["Ammo_12ga_Pellets"], ["Ammo_556_20Rnd"], ["Ammo_357_20Rnd"], ["CLIP_762_5Rnd"], ["clip_762x39_10rnd"], ["M_STANAG_30Rnd_COUPLED"], ["vss"], ["m_ak74_30rnd_black"], ["M_Vss_10Rnd"], ["ak74"], ["m_ak74_30rnd_black"], ["m_ak74_30rnd_black"], ["m_ak74_30rnd_black"], ["m_ak74_30rnd_black"], ["M_Vss_10Rnd"], ["M_svd_10Rnd"], ["Winchester70_Black"], ["M_Fal_20Rnd"], ["SKS"], ["b95"], ["Att_Suppressor_AK"], ["Att_Handguard_AK74"], ["Att_Buttstock_AK_Wood"], ["ammobox_556_20rnd"], ["AmmoBox_9x39_20Rnd"], ["AmmoBox_308Win_20Rnd"], ["FAL"], ["Att_Optic_PUScope"], ["AmmoBox_762_20Rnd"], ["SVD"], ["Mosin9130_Black"], ["CLIP_762_5Rnd"], ["magnum"], ["m_357_speedloader"], ["b95_black"], ["sks_black"], ["ammo_762x39_20rnd"], ["m65_jacket_black"], ["att_optic_hunting"], ["m_cmag_30rnd"], ["m_cmag_40rnd"], ["m_cmag_40rnd"], ["m_cmag_40rnd"], ["attachment_optic_acog"], ["attachment_buttstock_m4oe"], ["attachment_handguard_m4ris"], ["attachment_bayonet_m9a1"], ["attachment_optic_m4t3nrds"], ["M_UMP_25Rnd"] ]; // Zombies HeliCrashes _arrayZedHeli= [ ["ZmbM_PatrolNormal_PautRev"], ["ZmbM_PatrolNormal_Autumn"], ["ZmbM_PatrolNormal_Flat"], ["ZmbM_PatrolNormal_Summer"], ["ZmbM_SoldierNormal"] ]; _Heli = DZ_COUNT_HELICRASHES; diag_log format [" SpawnHeliCrashes: Readed Settings! Start work script!"]; diag_log format [" SpawnHeliCrashes: Cleaning old HeliCrash!"]; _tmp_count_del_heli = 0; { if ((typeOf _x) in _HeliTypes) then { deleteVehicle _x; _tmp_count_del_heli = _tmp_count_del_heli + 1; }; } forEach (allMissionObjects ""); diag_log format [" SpawnHeliCrashes: Detected and deleted %1 HeliCrash",_tmp_count_del_heli]; diag_log format [" SpawnHeliCrashes: Start spawn new HeliCrash!"]; fnc_spawnHeli = { for "ii" from 1 to _Heli do { _thisHeli = _HeliPointsArray select floor(random(count _HeliPointsArray)); _thisTypeHeli = _HeliTypes select floor(random(count _HeliTypes)); _HeliCrach = NULL; _HeliCrach = createvehicle [_thisTypeHeli, _thisHeli, [], 0, "CAN_COLLIDE"]; if !(isNull _HeliCrach) then { _selected_name_heli = (typeOf _HeliCrach); _map_pos_heli = mapGridPosition _HeliCrach; // _HeliCrach setDir floor(random 360); _originalPos = getPosATL _HeliCrach; _Damage = random 0.7; _count_spawned_loot_heli = 0; _count_spawned_zed_heli = 0; for [{_j = 0}, {_j< _loot_heli_one}, {_j = _j + 1}] do { _loot_heli = NULL; _radius_heli_loot = random _max_distance_spawn_loot; _loot_heli = createvehicle [(_arrayItemsHeli select floor(random(count _arrayItemsHeli))) select 0, _originalPos, [], _radius_heli_loot, "CAN_COLLIDE"]; if !(isNull _loot_heli) then { if ((floor(random 4)) >= 2) then { _Damage_loot = random 0.7; _loot_heli setDamage _Damage_loot; }; _count_spawned_loot_heli = _count_spawned_loot_heli + 1; }; }; for [{_k = 0}, {_k < _zombs_heli_one}, {_k = _k + 1}] do { _Zomb_heli = NULL; _radius = random _max_distance_spawn_zeds; _Zomb_heli = createAgent [(_arrayZedHeli select floor(random(count _arrayZedHeli))) select 0, _originalPos, [], _radius, "CAN_COLLIDE"]; if !(isNull _Zomb_heli) then { // _Zomb_heli setDir floor(random 360); _count_spawned_zed_heli = _count_spawned_zed_heli + 1; }; }; diag_log format [" SpawnHeliCrashes: Spawned %1 in %2 with %3 loot around Heli and %4 Zeds around Heli!",_selected_name_heli,_map_pos_heli,_count_spawned_loot_heli,_count_spawned_zed_heli]; }; }; }; if (_Heli > 0) then { call fnc_spawnHeli; }; 3. Создаем по пути: "MPMissions\dayz_Auto.ChernarusPlus\" папку "scripts" , и в ней файл с именем "compiles.sqf" . Если такая папка у вас уже имеются, просто не создавайте ее, а перейдите в нее. Если файл с там именем уже имеется у вас, то не создавайте его, а допишите информацию со следующего пункта инструкции в конец файла! 4. Вставляем в файл следующую строку: init_spawn_Helicarshes = compile preprocessFileLineNumbers "scripts\custom\Helicarsh.sqf"; 5. Открываем по указанному далее пути файл в "Notepad++": "MPMissions\dayz_Auto.ChernarusPlus\init.sqf". Находим в файле строки с call compile preprocessFileLineNumbers 5. Вставляем после всех "call compile preprocessFileLineNumbers" следующее: call compile preprocessFileLineNumbers "scripts\compiles.sqf"; _Enable_SPAWNER_HELICRASHES = true; // Кастомный скрипт спавна хеликрашей (true - включить, false - выключить) DZ_COUNT_HELICRASHES = 12; // Максимальное кол-во хеликрашей при включенном кастомном скрипте их спавна 6. В этом же файле находим строки: simulWeatherSync; dbInitEconomy [true]; setTimeForScripts 0.03; 7. Добавляем после них: if (_Enable_SPAWNER_HELICRASHES) then { Call init_spawn_Helicarshes; }; Вот и все. ВАЖНО: Перед активацией скрипта отключите официальный спавнер хеликрашей сервера из официальной системы сервера игры. Инструкция есть тут: Как вы уже догадались, первой строкой мы можем включить или отключить сам скрипт без долгого копания в коде, а второй назначить нужное количество хеликрашей на сервере. _Enable_SPAWNER_HELICRASHES = true; // Кастомный скрипт спавна хеликрашей (true - включить, false - выключить) DZ_COUNT_HELICRASHES = 12; // Максимальное кол-во хеликрашей при включенном кастомном скрипте их спавна Все настройки по спавну хеликрашей есть в самом файле скрипта, который в п. 2 инструкции вы и создавали. Надеюсь, сложности с его настройкой не возникнет, пояснения там имеются.
  12. В данной теме напишу простенький гайд о том, как самому на своем собственном сервере DayZ установить костомный (мой) скрипт на спавн, респавн и чистку транспорта. Гайд пригодится тем, кто сам делает свою сборку сервера, либо по каким-то причинам пользуется не моей сборкой сервера (где это уже сделано), а чьей-либо еще. Обращаю ваше внимание на тот факт, что часть файлов, описанных в гайде, у вас могут уже быть вынесены в другое место или названы несколько иначе (это зависит от сборки сервера, которую вы используете, например, в сборке dankdayz вся mpmissions вынесена в отдельный файл в addons сервера), гайд основывается на чистых серверных файлах игры и отталкивается от них. Гайд сделан для версий игры с серверной частью 0.60-0.62, но может быть совместим и с другими версиями игры, если файлы серверной части игры не поменяли своего текущего месторасположения и содержания. Гайд составлен по версии серверных файлов игры 0.62 чистой "девственной" и не правленой никем версии игры. Напоминаю заранее, в моих серверных файлах версий 0.60, 0.61 и 0.62 из моих гайдов на данном форуме это уже сделано и делать это не нужно!!! Нам понадобятся: 1. Notepad++ https://notepad-plus-plus.org/download/ 2. Ваши серверные файлы игры И так, приступим. 1. Первое, что нам понадобится - создать сам скрипт. Создаем по пути: "MPMissions\dayz_Auto.ChernarusPlus\" папку "scripts" , в ней папку "custom" , и в ней файл с именем "SpawnCars.sqf" . Если такие папки у вас уже имеются, просто не создавайте их, а перейдите в них. Если файл с там именем уже имеется у вас, задайте ему другое имя. 2. Вписываем в созданный файл код следующего содержания (либо скачайте его): SpawnCars.sqf diag_log format [" SpawnCar: Reading Settings ..."]; /* Car Spawner for DayZ Standalone v 0.60.133.913 and high versions author: 123new Thanks for help: user BorizzK from s-platoon.ru for help and tests parts script and all community for this. Install: .\mpmissions\init.sqf Add in end file: init_spawn_cars = compile preprocessFileLineNumbers "scripts\custom\SpawnCars.sqf"; Call init_spawn_cars; and place this script file in: .\mpmissions\{your mission name}\scripts\custom\SpawnCars.sqf WARNING: add after string: dbInitEconomy CAUTION: When you are on the spawn cars in the game server with version 0.60 and higher (0.61 and 0.62 version it blocks events.xml) the transport can be re-spelled and re-spelled by the server itself, regardless of the script. For correct operation it is highly recommended to disable the official transport spawn! Info about script: This script will scan the server database for the specified transport types, push it to the server along with its parts in case of shortage, and clean the destroyed vehicles. A first massives - details for car (all details will be spawned) A second massives - possible spawn points of the technique (the spawn point will be selected randomly) A third (end) massive - configuration: specify the number of cars on writed type, a list of possible spawn points car for writed type and massive from first block with parts car. Settings format: A first massives: [count loot,type loot] A second massives: [(coordinate x),(coordinate y),(coordinate z)] A third (end) massive: [max count this type car, type car(classname) or massive types car for random select, selected second massive name, selected first massive name] If add after in 'A third (end) massive' 5 and more massives elements with details car, script will be select random details. */ // MAIN SETTINGS _enable_detect_old_ruined_cars = true; // Enable detect old ruined cars in server and delete him _enable_detect_old_cars_in_point_spawn_in_meters = true; // Enable detect old cars in point spawn in writed meters and secure him for spawn new car _meters_check_old_car_in_point_spawn = 10; // How many meters for chack old car in point spawn - wored only with _enable_detect_old_cars_in_point_spawn_in_meters = true - not recommend set up more 15 meters _check_damage_for_delete_ruined_car = 1; // How many damage for object car for delete him from server (for set up min 0.1 max 1) - wored only with _enable_detect_old_ruined_cars = true /////////////////////////// ---> A first massives <--- /////////////////////////// // (count this detail in vehicle),(type detail vehicle) _items_car_Volga = [ [4,"CivSedanWheel"], [1,"CivSedanDoors_Driver"], [1,"CivSedanDoors_CoDriver"], [1,"CivSedanDoors_BackLeft"], [1,"CivSedanDoors_BackRight"], [1,"CivSedanHood"], [1,"CivSedanTrunk"], [1,"CarRadiator"], [1,"CarBattery"], [1,"SparkPlug"], [2,"HeadlightH7"] ]; _items_car_Niva = [ [4,"HatchbackWheel"], [1,"HatchbackDoors_Driver"], [1,"HatchbackDoors_CoDriver"], [1,"HatchbackHood"], [1,"HatchbackTrunk"], [1,"CarRadiator"], [1,"CarBattery"], [1,"SparkPlug"], [1,"HeadlightH7"] ]; _items_car_Bus = [ [2,"TransitBusWheel"], [2,"TransitBusWheelDouble"], [1,"TruckBattery"], [1,"GlowPlug"], [1,"TruckRadiator"], [1,"LightBulb"], [1,"EngineBelt"] ]; _items_car_V3S = [ [4,"V3SWheel"], [4,"V3SWheelDouble"], [1,"V3SDoors_Driver"], [1,"V3SDoors_CoDriver"], [1,"V3SHood"], [1,"TruckBattery"], [2,"LightBulb"], [1,"EngineBelt"], [1,"HeadlightH7"] ]; _items_car_V3S_Blue = [ [4,"V3SWheel"], [4,"V3SWheelDouble"], [1,"V3SDoors_Driver_Blue"], [1,"V3SDoors_CoDriver_Blue"], [1,"V3SHood_Blue"], [1,"TruckBattery"], [2,"LightBulb"], [1,"EngineBelt"], [1,"HeadlightH7"] ]; _items_car_V3S_Grey = [ [4,"V3SWheel"], [4,"V3SWheelDouble"], [1,"V3SDoors_Driver_Grey"], [1,"V3SDoors_CoDriver_Grey"], [1,"V3SHood_Grey"], [1,"TruckBattery"], [2,"LightBulb"], [1,"EngineBelt"], [1,"HeadlightH7"] ]; _items_car_V3S_Orange = [ [4,"V3SWheel"], [4,"V3SWheelDouble"], [1,"V3SDoors_Driver_Orange"], [1,"V3SDoors_CoDriver_Orange"], [1,"V3SHood_Orange"], [1,"TruckBattery"], [2,"LightBulb"], [1,"EngineBelt"], [1,"HeadlightH7"] ]; /////////////////////////// ---> A second massives <--- /////////////////////////// // massives points spawn for vehicles _points_car_Volga = [ [10493.7,2348.17,0], [10150.7,1810.41,0], [11986.2,3839.67,0], [12883.2,6259.25,0], [12937.6,10185.7,0], [13845.8,13216.7,0], [4163.03,11104.75,0], [5954.25,10366.5,0], [3751.32,8858.37,0], [3048.92,7787.31,0], [2583.23,5073.8,0], [2654.09,5289.31,0] ]; _points_car_Niva = [ [13891.7,13425.6,0], [11262.4,12212.2,0], [4794.11,2539.87,0], [10740.4,10788.2,0], [10661.3,7994.43,0], [6063.77,7871.36,0], [4519.95,8291.32,0], [2182.85,3307.73,0], [3658.2,2194.58,0], [6855.9,2471.24,0], [6565.1,2547.52,0], [4262.06,11235,0], [6255.8,3256.48,0], [6682.32,3580.23,0], [13785.5,2930.17,0] ]; _points_car_Bus = [ [12275.8,9123.41,0], [11885.6,12469.2,0], [7185,7675.18,0], [4795.56,10250.1,0], [2716.53,10031.4,0], [2589.18,6355.03,0], [1672.24,3843.93,0], [1878.72,2254.03,0], [4334.19,2462.08,0], [5691.65,2579.14,0], [7805.4,3534.9,0], [12238.9,12635,0] ]; _points_car_V3S = [ [4767.29,9594.32,0], [13980.3,2931.02,0], [12238.9,12635,0], [12229.7,12590.2,0], [7216.52,7755.26,0], [3711.64,5969.98,0], [4392.4,10510.4,0], [1741.44,7930.12,0], [5590.24,2699.39,0] ]; /////////////////////////// ---> A third (end) massive <--- /////////////////////////// // (max count vehicles this type in server),(type vehicle or massive types for random select),(massive coords for spawn vehicle),(massive items for this car) // If add 5 and more massives elements with details car, script will be select random details. _types_car_V3S = ["V3S_Cargo_Orange","V3S_Cargo_Blue","V3S_Cargo_Grey","V3S_Cargo"]; /// massive types cars for random select _types_car_V3S_Chassis = ["V3S_Chassis_Orange","V3S_Chassis_Blue","V3S_Chassis_Grey","V3S_Chassis"]; /// massive types cars for random select _CarsSpawnConfig = [ [10,"CivilianSedan", _points_car_Volga, _items_car_Volga], [12,"TransitBus", _points_car_Bus, _items_car_Bus], [7,"OffroadHatchback", _points_car_Niva, _items_car_Niva], [4,_types_car_V3S, _points_car_V3S, _items_car_V3S,_items_car_V3S_Blue,_items_car_V3S_Grey,_items_car_V3S_Orange], [5,_types_car_V3S_Chassis, _points_car_V3S, _items_car_V3S,_items_car_V3S_Blue,_items_car_V3S_Grey,_items_car_V3S_Orange] ]; { if ((count _x) > 4) then { _rand = floor (random ((count _x) - 1)); while {(_rand < 4)} do { _rand = floor (random ((count _x) - 1)); }; _selected_items_car = _x select _rand; }; } foreach _CarsSpawnConfig; //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ---> NEXT CODE DON'T EDIT <--- /////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// diag_log format [" SpawnCar: Readed Settings! Start spawn car!"]; fnc_random_int_select = { private["_min","_max","_rand"]; _min = _this select 0; _max = _this select 1; _rand = round (random _max); if ((_rand < _min) or (_rand > _max)) then { while {(_rand < _min) or (_rand > _max)} do { _rand = round (random _max); }; }; _rand }; _massive_writed_alltypes_cars = []; _massive_writed_allcoords_cars = []; fnc_spawnCar = { _SelectedLine = _this; _selected_count_car = _this select 0; _selected_type_car = _this select 1; _selected_points_car = _this select 2; _selected_items_car = _this select 3; _count_incar_loot = 0; _count_aroundcar_loot = 0; _count_selected_type_car_in_server = 0; _count_selected_type_car_in_server = 0; if((typeName _selected_type_car) == "ARRAY") then { { _count_selected_type_car_in_server = _count_selected_type_car_in_server + (count (allMissionObjects _x)); } forEach _selected_type_car; diag_log format [" SpawnCar: %2 old cars of types '%1' has been detected on the server",_selected_type_car,_count_selected_type_car_in_server]; } else { _count_selected_type_car_in_server = count (allMissionObjects _selected_type_car); diag_log format [" SpawnCar: %2 old cars of type '%1' has been detected on the server",_selected_type_car,_count_selected_type_car_in_server]; }; if (_enable_detect_old_cars_in_point_spawn_in_meters) then { _temp_selected_points_car = _selected_points_car; { _selected_point_car = _x; { if (((typeOf _x) in _massive_writed_alltypes_cars) && (_selected_point_car in _massive_writed_allcoords_cars)) then { if (count _selected_points_car > 0) then { _selected_points_car = _selected_points_car - [_selected_point_car]; diag_log format [" SpawnCar: Detected previously spawned car in server: type '%1' at position %2 - point spawn %3 deleted from list spawn this type!",(typeOf _x),(getPos _x),_selected_point_car]; } else { diag_log format [" SpawnCar: Detected previously spawned car in server: type '%1' at position %2 - point spawn %3 can't be deleted from list spawn this type because spawnpoints this type allready <= 0!",(typeOf _x),(getPos _x),_selected_point_car]; }; }; } forEach (_selected_point_car nearObjects _meters_check_old_car_in_point_spawn); } forEach _temp_selected_points_car; }; if (_count_selected_type_car_in_server < _selected_count_car) then { _selected_count_car = _selected_count_car - _count_selected_type_car_in_server; if((typeName _selected_type_car) == "ARRAY") then { diag_log format [" SpawnCar: Required spawn %2 cars of type list '%1'",_selected_type_car,_selected_count_car]; } else { diag_log format [" SpawnCar: Required spawn %2 cars of type '%1'",_selected_type_car,_selected_count_car]; }; if (count _selected_points_car > 0) then { for "_j" from 1 to _selected_count_car do { _car_in_server = NULL; if (count _selected_points_car > 0) then { _selected_type_car_for_spawn = ""; if((typeName _selected_type_car) == "ARRAY") then { _selected_type_car_for_spawn = _selected_type_car select ([0,(count _selected_type_car)-1] call fnc_random_int_select); } else { _selected_type_car_for_spawn = _selected_type_car; }; if ((count _SelectedLine) > 4) then { _selected_items_car = _SelectedLine select ([3,(count _SelectedLine)-1] call fnc_random_int_select); diag_log format [" SpawnCar: Selected for next car massive details: %1 ",_selected_items_car]; }; _selected_point_car = _selected_points_car select ([0,(count _selected_points_car)-1] call fnc_random_int_select); _car_in_server = createvehicle [_selected_type_car_for_spawn, _selected_point_car, [], 0, "CAN_COLLIDE"]; if !(isNull _car_in_server) then { _selected_points_car = _selected_points_car - [_selected_point_car]; _car_in_server setDir floor(random 360); _selected_name_car = (displayName _car_in_server); _originalPos = getPosATL _car_in_server; _Damage = random 0.7; _map_pos_car = mapGridPosition _car_in_server; { _count_sel_loot = _x select 0; _type_sel_loot = _x select 1; for [{_i = 0}, {_i < _count_sel_loot}, {_i = _i + 1}] do { _loot_car = NULL; _loot_car = _car_in_server createInInventory _type_sel_loot; if (isNull _loot_car) then { _loot_car = createvehicle [_type_sel_loot, _originalPos, [], 5, "CAN_COLLIDE"]; if ((floor(random 4)) >= 2) then { _Damage_loot = random 0.7; _loot_car setDamage _Damage_loot; }; _count_aroundcar_loot = _count_aroundcar_loot + 1; } else { _count_incar_loot = _count_incar_loot + 1; }; }; } foreach _selected_items_car; diag_log format [" SpawnCar: Spawned %1 in %2 with %3 loot in Car and %4 loot around car ",_selected_name_car,_map_pos_car,_count_incar_loot,_count_aroundcar_loot]; } else { diag_log format [" SpawnCar: Type car '%1' is not spawned in server, because when i try spawn car in point '%2' exist errors!",_selected_type_car_for_spawn,_selected_point_car]; }; } else { if((typeName _selected_type_car) == "ARRAY") then { diag_log format [" SpawnCar: Random type car from array '%1' is not can be spawned in server, because setuped count cars this types > possible count points spawn this type!",_selected_type_car]; } else { diag_log format [" SpawnCar: Type car '%1' is not can be spawned in server, because setuped count cars this type > possible count points spawn this type!",_selected_type_car]; }; }; }; } else { if((typeName _selected_type_car) == "ARRAY") then { diag_log format [" SpawnCar: Spawn car from type list '%1' is not possible because not have possible points to spawn.",_selected_type_car]; } else { diag_log format [" SpawnCar: Spawn car type(s) '%1' is not possible because not have possible points to spawn.",_selected_type_car]; }; }; } else { if((typeName _selected_type_car) == "ARRAY") then { diag_log format [" SpawnCar: Random type car from array '%1' is not need spawn in server, because cars this types allready is max (or more max) in server!",_selected_type_car]; } else { diag_log format [" SpawnCar: Type car '%1' is not need spawn in server, because this cars allready is max (or more max) in server!",_selected_type_car]; }; }; }; if (_enable_detect_old_ruined_cars) then { _deleted_ruined_Cars = 0; { if (damage _x == _check_damage_for_delete_ruined_car) then { deleteVehicle _x; _deleted_ruined_Cars = _deleted_ruined_Cars + 1; }; } forEach (allMissionObjects "Car"); if (_deleted_ruined_Cars > 0) then { diag_log format [" SpawnCar: Deleted %1 old ruined cars from server",_deleted_ruined_Cars]; }; }; if (_enable_detect_old_cars_in_point_spawn_in_meters) then { { if((typeName(_x select 1)) == "ARRAY") then { { if (!(_x in _massive_writed_alltypes_cars)) then { _massive_writed_alltypes_cars = _massive_writed_alltypes_cars + [_x]; }; } foreach (_x select 1); } else { if (!((_x select 1) in _massive_writed_alltypes_cars)) then { _massive_writed_alltypes_cars = _massive_writed_alltypes_cars + [(_x select 1)]; }; }; { if (!(_x in _massive_writed_allcoords_cars)) then { _massive_writed_allcoords_cars = _massive_writed_allcoords_cars + [_x]; }; } foreach (_x select 2); } foreach _CarsSpawnConfig; }; { _x call fnc_spawnCar; } foreach _CarsSpawnConfig; 3. Создаем по пути: "MPMissions\dayz_Auto.ChernarusPlus\" папку "scripts" , и в ней файл с именем "compiles.sqf" . Если такая папка у вас уже имеются, просто не создавайте ее, а перейдите в нее. Если файл с там именем уже имеется у вас, то не создавайте его, а допишите информацию со следующего пункта инструкции в конец файла! 4. Вставляем в файл следующую строку: init_spawn_cars = compile preprocessFileLineNumbers "scripts\custom\SpawnCars.sqf"; 5. Открываем по указанному далее пути файл в "Notepad++": "MPMissions\dayz_Auto.ChernarusPlus\init.sqf". Находим в файле строки с call compile preprocessFileLineNumbers 5. Вставляем после всех "call compile preprocessFileLineNumbers" следующее: call compile preprocessFileLineNumbers "scripts\compiles.sqf"; _Enable_SPAWNER_CARS = true; // Кастомный скрипт спавна транспорта (true - включить, false - выключить) 6. В этом же файле находим строки: simulWeatherSync; dbInitEconomy [true]; setTimeForScripts 0.03; 7. Добавляем после них: if (_Enable_SPAWNER_CARS) then { Call init_spawn_cars; }; Вот и все. ВАЖНО: Перед активацией скрипта отключите официальный спавнер транспорта сервера из официальной системы сервера игры. Инструкция есть тут: Как вы уже догадались, этой строкой мы можем включить или отключить сам кастомный скрипт без долгого копания в коде. _Enable_SPAWNER_CARS = false; // Кастомный скрипт спавна транспорта (true - включить, false - выключить) Все настройки по спавну транспорта есть в самом файле скрипта, который в п. 2 инструкции вы и создавали. Надеюсь, сложности с его настройкой не возникнет, пояснения там имеются.
×
×
  • Создать...

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

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