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

    Create a theme in the appropriate section
    No need to write everything in the chat!
  • Sell or buy?

    Use the services of a guarantor
    We will make your transaction safe
  • Don't want a BAN?

    Please read our rules
    Don't disturb the order
  • Visit the market

    There you can sell or buy
    Everything related to game servers

Leaderboard


Popular Content

Showing content with the highest reputation since 03/06/20 in all areas

  1. 5 points
    И снова здравствуйте, товарищи и коллеги! Уже не один день наблюдаю среди многих из читающих такую проблему, как непонимание того, что написано в том или ином гайде, скрипте, теме форума по DayZ Standalone. А понимать бы это все это ой как бы не плохо было бы, да, товарищи? Ну хотя бы так, для себя, для осознания происходящего и упрощения своей жизни. Не все же за вас делать постоянно, как считаете? Что же, решил я вот для вас завести такую темку, полезную. В ней мы не будем рассматривать установку чего-либо или сборку мода. Мы попробуем разобраться в основах языка игры, а именно - написании своего кода, чтении кода игры, данного разработчиком, или чужим модом в мастерской. Разумеется, надеюсь я и на вашу бескорыстную помощь и поддержку, а также на помощь знатоков и экспертов скриптинга игры, ведь один я не справлюсь в написании этой безмерно полезной для многих и большой темы. А помощь ой как понадобится, чувствую затылком. Ну ладно, утомил я вас, начнем, пожалуй, согласны? Оговорюсь сразу, в данной теме мы затронем лишь скриптовую составляющую игры. Т.е. вопросы изменения модов, игры, создания собственных интерфейсов, игровых вещей и прочего освещаться не будут. Темы к ознакомлению, схожие с данным материалом: https://s-platoon.ru/topic/8622-enscript-delaem-skript-dlya-moda-i-osnovnye-principy-skriptinga-modov/ https://s-platoon.ru/topic/7838-sozdaem-svoy-servernyy-mod-dayz-14-to-discontined https://s-platoon.ru/topic/8859-enscript-rodnye-funkcii-v-kode-igry-opisanie-nahozhdenie/ Официальная документация, связанная с данным материалом (спасибо BorizzK😞 https://community.bistudio.com/wiki/DayZ:Enforce_Script_Syntax https://community.bistudio.com/wiki/Category:DayZ:Editing Начнем мы, пожалуй, с общего. Введение. Скрипты. Скрипты - важная часть функционирования игры, создания модов и модификации как игры, так и сервера. Они позволяют делать чудные модификации, создавать новые опции, настраивать или изменять в игре по своей задумке практически любой аспект и функционал, заданный разработчиками, дополнять его и разнообразить. Алгоритм Ваша первая задача при написании скриптов - определить, какие шаги надо предпринять, чтобы решить какую-либо проблему. Последовательность таких шагов - это и будет алгоритм. Например, намерение - передать другу ваш рюкзак. Значит необходимо выполнить следующие действия: Но тут у нас встает вопрос - игрок же вызывает какое-то меню или опцию, которая будет выполнять данные действия. Как это реализовать? Ведь игра - это лишь набор комманд, которые выполняются по одной за раз, как правильно объединить все и сделать корректно? Сделать это все можно именно посредством скриптинга в данной игре с использованием скриптов. Интерпретатор Когда вы составили алгоритм, вам нужно что-то, что может его исполнить. У нас есть компьютерная игра, которая может это сделать. В игре есть игроки, объекты которые могут выполнять те или иные действия, например, получение данных, создание объектов, открытие дверей и т.п. Все имеет свою комманду и результат выполнения. Иными словами, игра сама интерпретирует ваши скрипты и их код в рабочий вид в игре. Исходный код (Скрипт) Исходный код (скрипт) - это алгоритм, написанный на каком-либо языке программирования, который преобразуется в машинный код программы и будет выполнен в том или ином случае. В случае в нашей игрой это код, который игра преобразует в понятные для нее комманды и выполняет их. Скриптинг Скриптинг - какие-либо действия по написанию скриптов для своих работ\модов\игры. Скриптинг в DayZ в основном основывается на том, что уже имеется в игре. Т.е. на базовом функционале игры, который задан разработчиком. В DayZ вся скриптовая часть, написанная авторами игры, располагается в файлике "scripts.pbo" в папке "dta", который мы можем распаковать через "PBO Manager", например, и поглядеть. Любые скрипты могут содержать как набор из функций, так и набор из разных классов с функциями, которые могут вам понадобиться. Enforce Script Enforce Script (EnScript по простому)- это язык сценариев (интерпретации скриптинга), разработанный для движка игры DayZ "enforce Engine" компанией Bohemia Interactive Studio . Все скрипты EnScript, основные игровые логики находятся в "scripts.pbo" в папке "dta" каталога "DayZ" или "DayZ Server". Именно этот файл и будет нам полезен для выяснения того, как работают некоторые вещи (пока, наконец, не появится достойная ссылка на API от разработчиков игра, будь они прокляты). Основные принципы скриптинга на EnScript: Любая комманда, строка в функции должна завершаться на ; (точку с запятой) Тело любой функции/класса/структуры должно быть заключено в {} (фигурные скобки) Язык крайне чувствителен к регистру, т.е. MyPeremennaya и Myperemennaya будут 2 разными объектами для игры. Язык, крайне схожий с синтаксисом и коммандами C++, C# и JavaScript, для тех, кто знает эти языки хотя бы на любительском уровне, работать и писать свои скрипты будет проще в разы Структура скриптовой части игры Распаковав "scripts.pbo" (файл есть в клиенте игры и сервере, он одинаковый) мы увидим несколько папок, таких как "1_Core", "2_GameLib", "3_Game", "4_World", "5_Mission", "data", "editor" а также файлики "$PREFIX$", "$PRODUCT$","$VERSION$","config.bin","profile_fixed.cfg", "staticDefinesDoc.c". Из того, что мне известно, и что нам пригодится при написании скриптов, я отмечу лишь файлик "config.bin", который составляет основную конфигурацию pbo-файла и включенных в него файлов скриптов (по нему 'компилируются' при запуске игры в скрипты в определенные разделы кода запуска игры). А также папки "1_Core", "2_GameLib", "3_Game", "4_World", "5_Mission". Сам "config.bin" разбирать мы не будем, это сделано уже ранее в теме вот этой. Каждая из указанных ранее папок обозначает раздел инициализации кода игры. Например, в "1_Core", "2_GameLib" подгружается основной синтаксис всех функций и переменных игры (то как они будут объявляться в коде, вызываться, какие значения возвращать и принимать). В "3_Game" основной функционал самой игры, обозначающий используемые классы и базовые функции этих классов. В "4_World" все остальные классы, функции и параметры, которые будут исполняться в игре в зависимости от того, какие объекты окружения будут в ней будут и как будут функционировать. В "5_Mission" будет описываться функционал, относящийся к экранам загрузки, меню, их действиям и вызовам. На основе этих разделов и строится основной принцип скриптинга любого мода и функционирования игры в целом. Если вы откроете любой из модов, который имеет хотя бы 1 скрипт, увидите часть этой структуры. Основные разделы скриптов также взаимодействуют друг с другом, но только в порядке, в котором они выполняются и описываются. Например, из "5_Mission" вы можете вызывать классы и функции, описанные в "4_World", а из "4_World" вызвать функции в "5_Mission" не получится, поскольку игра их еще не знает на том этапе запуска и 'компиляции кода скрипта'. Функции Функции - это набор команд (действий) и параметров(переменных). Для ее вызова используется стандартный формат вида: {имя функции}({параметры функции}); Тело любой функции/класса/структуры должно быть заключено в "{}" (фигурные скобки) Функции могут быть как заданные разработчиками игры в каких-либо классах, так и написанные вами вручную собственные. Иногда для ее вызова хватает лишь одной лишь команды, например "MyFunction();". Но чаще в синтаксисе вызова функции присутствует один и более параметров, например "MyFunction("my text");" . Параметры функции могут не содержать значений, а могут иметь 1 или несколько значений, разделенных запятой, например: void MyFunction(int MyChislo, string text1, text2, bool value); У каждой команды может быть свой список данных, которые она может использовать в своем выполнении(например, как было в последнем примере), а также может быть и список данных, которые она вернет. Будут ли эти данные требоваться от функции зависит от автора, который эту функцию пишет (т.е. от разработчиков игры, если это скрипт родной игры, или от вас, если этот скрипт вы пишете сами) Функции с возвращаемыми данными (имеют тип значения, который они возвращают) могут вызываться как вот так: int chislo = MyFunction("my text"); т.е. переменная chislo пример значение, которое функция возвратила либо так: MyFunction("my text"); т.е. функция вернет значение, но оно не будет записано, и не будет использоваться далее. Функции без возврата значений (имеют тип void) могут вызываться только вот так: MyFunction("my text"); Функции могут иметь несколько типов. Например, void MyFunction() { } функция без возврата значения. А функция int MyFunction() возвратит значение типа int (число). Соответственно, функции без возврата значений будут содержать лишь код своих вычислений, а функции с возвратом обязаны иметь комменду return {значение} . Пример функции без возврата значений и принимаемых переменных: void MyFunction() { Print(" ---TEST--- "); } Функция запишет в script.log текст: " ---TEST--- " Пример вызова в коде: MyFunction(); Пример функции с возвратом значений и принимаемыми переменными: string MyFunction(string MyText) { Print(" ---TEST--- " + MyText); return "[" + MyText + "]"; } Пример вызова в коде: string MyTXT1 = MyFunction("TEXT FOR TEST"); Функция запишет в script.log текст: " ---TEST--- TEXT FOR TEST " и запишет в переменную MyTXT1 значение [MyText] Параметров, которые могут передаваться в функцию, может быть несколько, но не рекоммендую их делать более 10. Переменные и их типы Переменные - это типы данных, используемые в коде скриптов игры. Типы переменных обозначаются классами, заданными в игре. Это могут быть как заданные разработчиками поумолчанию типы данных, так и собственные классы, написанные вами. Обозначаются переменные общим видом так: {тип переменной} {название переменной} Строка с обозначением любой переменной или заданием ее значением должно быть закончено точной с запятой на конце! Например: int chislo, string text, bool value; или string text = "TEST"; Каждый тип означает, какие типы данных может принимать данная переменная, и какой объем в памяти игры она займет. Базовое количество типов схоже с c++ и c#, но есть и типы, обозначаемые заданными классами в игре. Стоит понимать, что объявленная 1 раз переменная в функции или классе не может быть объявлена в ней же еще раз, но ей может быть присвоено новое значение, например : void MyFunction() { string myperemennaya="text1"; // тут какие-то вычисления myperemennaya="text2"; } Список используемых типов переменных в игре можно прочитать тут (на немецком): https://germandayz.de/forum/thread/19551-guide-dayz-standalone-scripting-enforce-scripting/ Остальные имеют стандартный тип, используемый в том же с++ и c# Модификаторы функций и переменных. Также, переменные могут иметь модификаторы доступности данных в функциях. Например: public: делает переменную открытой к доступу в других функциях private: делает переменную закрытой к доступу в других функциях protected: ограничивает доступ к переменной только для дружественных и дочерних классов. static - переменная, которая сохраняется в памяти игры даже после удаления экземпляра функции (класса) или переменной из памяти (как в C++). native - Функция или переменная, реализованная игровым движком, не может быть перезаписана. В исходном коде движка такие функции отмечены со смещением. Невозможно изменить модами и сприптами, только использовать их сами. ref - ссылка на свой тип класса или переменной, ref - сокр. referal, т.е. ссылка в переводе Модификаторы также описаны по ссылке выше, и могут быть использованы не только в переменных, но и в функциях игры! Классы Классы - это структуры, которые могут содержать определенные функции и переменные, заданные автором скрипта. У классов может быть много функций, переменных, а каждый класс в свою очередь может быть задан и записан в отдельные переменные по нескольку раз. Т.е. это своего рода свой тип переменной, которая может содержать свои данные внутри себя. Отдельная переменная своего класса или одного из классов игры (например Playerbase) воспринимается как единичный некий экземпляр-объект данного класса, и чем больше таких переменных, тем больше экземпляров одного и того же класса существует в памяти игры. Например: PlayerBase player = NULL; Также, в классах можно обращаться к переменным и функциям, находящимся внутри классов через символ точки (это как вызов и получение результата функции или переменной). Т.е. для экземпляра класса: class MyClass { string MyText = ""; int Chislo = 0; void MyFunction() { Prnt("TEST"); } } ref MyClass Peremennaya = new ref MyClass(); создается переменная, и ее можно вызывать так: string MyResult = Peremennaya.MyText; и значение My Text будет записано в MyResult. Также можно и вызвать функцию или результат ее выполнения (если функция возвращает значение): Peremennaya.MyFunction() выполнит запись в script.log текста TEST. Переменные, объявляемые вне функций в классе одном будут доступны во всех функциях этого класса. Но переменные, заданные в классе, будут индивидуальны для каждого экземпляра этого класса. Т.е. если мы создаем свой класс, например, такого содержания: class MyClass { string MyText = ""; int Chislo = 0; } затем создаем экземпляры этого класса в памяти игры, коммандами ref MyClass Peremennaya = new ref MyClass(); ref MyClass Peremennaya2 = new ref MyClass(); то у Peremennaya и у Peremennaya2 будут свои данные в MyText и Choislo, не связанные между собой: Peremennaya.Text = "MyText1"; Peremennaya.Chislo = 2; Print("Peremennaya.Text = " + Peremennaya2.Text + " Peremennaya.Chislo = " + Peremennaya.Chislo.ToString()); Print("Peremennaya2.Text = " + Peremennaya2.Text + " Peremennaya2.Chislo = " + Peremennaya2.Chislo.ToString()); То мы получим в scriptlog: "Peremennaya.Text = Peremennaya.Text = MyText1 Peremennaya.Chislo = 2" "Peremennaya2.Text = Peremennaya2.Text = Peremennaya2.Chislo = 0" Т.е. в Peremennaya2.Text будет пусто. Обязательно для созданных собственных классов переменных указание ссылочности типов - ref (ref - сокр. referal, т.е. ссылка в переводе) - от этого зависит доступность данных в классах и функциях. Также, из классов можно вызывать и функции, и обращаться к переменным. Разумеется, если они не защищены функцией или модификатором. Например, создадим класс: Class ClassTest { string MyText1 = "123"; private string MyText2 = "456"; void MyFunction1 (string text) { string MyText3 = "789"; Print("!!!Used MyFunction:" + text); } int MyFunction2 () { return 2; } } и создадим экземпляр данного класса, и попробуем к нему обратиться: ref ClassTest Peremennaya3 = new ref ClassTest(); Print("Text1 = " + Peremennaya3.Text1); // В script.log будет Text1 = 123 Print("Text2 = " + Peremennaya3.Text2); // не запустится игра, так как модификатор private не позволит обратиться к переменной внутри класса Print("Text3 = " + Peremennaya3.MyFunction1 ("TEXT")); // В script.log будет Text3 = !!!Used MyFunction:TEXT Peremennaya3.MyFunction2(); // Выолнит функцию MyFunction2 и возвратит значение 2, но оно не будет записано А вот MyText3 из MyFunction1 не получить, так как она содержится внутри функции в классе. Моддинг Классов Классы, в свою очередь, можно менять модами, если они не являются 'нативными', либо не защищены движком игры разработчиков от изменений. Для этого применяют приписку "Modded" перед именем класса с сохранением его имени, например: Modded class PlayerBase { } Моддинг Функций в классах Функции в классах также можно перезаписывать. Для этого используется модификатор "override" перед тем, как задать эту функцию, а в теле самой этой функции можно (и крайне рекоммендуется, но не обязательно) использовать вызов "super." с дальнейшим вызовом этой функции и передачей оригинальных параметров функции. Например: Modded class PlayerBase { override void OnConnect() { Print("Test1"); // Эта строка выполнится до вызова оригинальной функции super.OnConnect(); // вызов оригинальной функции с сохранением ее параметров Print("Test2"); // Эта строка выполнится после вызова оригинальной функции } override string GetPlayerClass() { string returned_original = super.GetPlayerClass(); // вызов оригинальной функции с сохранением ее параметров и значения в переменную if(returned_original == "Bad Type") // Проверка значения { returned_original = "Good Type"; // Замена значения на нужное нам } return returned_original; // Возврат значения функцией } override void EEKilled( Object killer ) { super.EEKilled( killer ); // вызов оригинальной функции с сохранением ее параметров Print("Test3"); // Эта строка выполнится после вызова оригинальной функции } } Как видим, функции перепишутся с вызовом оригинального значения и допиской нужных или коррекцией. Можно делать и так, но крайне не рекоммендуется: Modded class PlayerBase { override void OnConnect() { Print("Test1"); // Эта строка выполнится до вызова оригинальной функции Print("Test2"); // Эта строка выполнится после вызова оригинальной функции } } Но в таком случае, если утеряно оригинальное выполнение кода игры и наследование функций, игра/сервер могут сломаться. Да и моды, которые параллельно с вашим, будут использовать эту функцию, могут перестать работать. Моддинг и скриптинг - Разница? Собственно, если вы осилили все. что описано выше, вы освоили базовую часть скриптинга в данной игре, а значит вас можно поздравить: Теперь вы готовы к написанию собственных скриптов и модов! Самой по себе разницы между скриптами и модами нету. Скрипты - это составляющая большинства современных модов в DayZ, т.е. непосредственная часть мода. Те же самые скрипты могут быть и в mpmissions и в моде, но с одной разницей - то что есть в mpmissions может быть в подключено в моде, а то что подключено в моде не всегда может быть подключено в mpmissions. А смысл как раз в том, что игра загружает скрипты последовательно, т.е. сначала оригинальный код игры с dta, потом моды, и только потом mpmission. Сама же "Mpmission" является частью, заданной в классе "5_Mission" в оригинальных скриптах игры, и делится на 2 файла в зависимости от типа запускаемой игры. Для клиента игры это "missionGameplay.c" а для сервера это "missionServer.c", откуда уже и читаем mpmission сервера. Иными словами, на момент чтения mpmission у нас по сути уже считаны и организованы все структуры разделов кода игры, и доступа к изменениям кодов и классов в "mpmissions" у нас нет. Т.е. то, что вносится в Mpmissions можно вносить в свой мод, но никак не наоборот. Сами же скрипты по своей стркутуре и особенностям такие же. Примечание: Что же касается модификаторов, типов переменных, функций, классов, используемых в игре в скриптах и модах, можно пока почитать вот тут на немецком: https://germandayz.de/forum/thread/19551-guide-dayz-standalone-scripting-enforce-scripting/ Позже будем пытаться создавать свою тему с данным описанием Что касается информации о родных функциях и классах, используемых в игре и на сервере - этой информации найти не смог. Но ее вы можете найти сами так: распаковываем весь scripts.pbo в папку, запускаем Notepad и используем поиск в папке по тексту (Ctrl+F вкладка №3), ищем по кусочкам нужных фраз на английском и смотрим как называется функция, ее расположение в классе. Также, предлагаю всем, кто заинтересован в облегчении поиска информации о таких функциях, помочь друг другу и составить этот список самим в вот этой теме на форуме: Поиск по форуму поможет остальным найти интересующую нас информацию 😉
  2. 3 points
    Пару раз в неделю вижу темы " FS (FIDOv STALKER) помогите поставить мутантов" И в большей части тем я помогал.. но хватит. Прочел? Помог? Поставь + И так. Обучать я буду только по одному типу тварей основанных на скелете волков. Какие файлы будем править. 1. events.xml 2. wolf_territories.xml 3. types.xml Поехали 1 Изменяем евент волков на нужных нам тварей (пример слепыши) <event name="AnimalWolf"> <waves>0</waves> <nominal>50</nominal> <min>2</min> <max>4</max> <lifetime>180</lifetime> <restock>0</restock> <saferadius>200</saferadius> <distanceradius>0</distanceradius> <cleanupradius>0</cleanupradius> <flags deletable="0" init_random="0" remove_damaged="1"/> <position>fixed</position> <limit>child</limit> <active>1</active> <children> <child lootmax="0" lootmin="0" max="2" min="1" type="FS_SlepDog_red"/> <child lootmax="0" lootmin="0" max="2" min="1" type="FS_SlepDog_Bronza"/> <child lootmax="0" lootmin="0" max="2" min="1" type="FS_SlepDog_Zmb"/> <child lootmax="0" lootmin="0" max="2" min="1" type="FS_SlepDog_White"/> <child lootmax="0" lootmin="0" max="1" min="1" type="FS_PseDOG"/> <child lootmax="0" lootmin="0" max="1" min="1" type="FS_WolfZmb_black"/> </children> <min>2</min> - минимальное количество в стае <max>4</max> - максимальное количество в стае max="2" min="1" -количество особей в стае На этом настройка файла event.xml окончена. 2. wolf_territories.xml <territory color="4289111595"> <zone name="Rest" smin="0" smax="0" dmin="0" dmax="0" x="7642.5" z="6180" r="50"/> <zone name="Water" smin="0" smax="0" dmin="0" dmax="0" x="7712.22" z="6416.39" r="50"/> <zone name="HuntingGround" smin="0" smax="0" dmin="0" dmax="0" x="7866.11" z="6142.5" r="50"/> </territory> Просто впиши свои координаты и все. не нужно больше не чего делать, 3. Пропиши мутантов в тайпс (Тайпса под рукой нет позже скину что вставить в тайпс нужно) Вайпай карту и проверяй. Есть способ куда проще и цивильнее о нем я опишу позже.
  3. 3 points
    BorizzK

    Скачал Workshop

    Перечитал первый пост Цитато: 🤣🤣🤣 Эталон ДВУЛИЧНОСТИ )))))))))))))))))))) То что воровать - брать чужое - вообще плохо, тебя мама с папой не научили?
  4. 2 points
    Делаю кастомное меню под заказ. Любой сложности под любую тематику. Можно участвовать в процессе разработке.
  5. 2 points
    DAP

    Куплю сервер dayz sa

    зачем флудите?возьмите и свяжитесь с данным заказчиком и не варите воду! это показывает то что вы не можете!
  6. 2 points
    NoNameUltima

    Ultima MOD

    Обновление R9. Добавлено: Горячие клавиши, для игроков, с возможностью изменять их в конфигурации игры: Антидюп, с логгированием и удалением объектов.*Возможно потребуется вайп. Возможность отключение имен в, и вне безопасных зон, - НПЦ, игроки. Возможность выдачи наличных, банка, доната, новому игроку(стартовые значения). Возможность автовыдачи наличных после каждой смерти игрока. Логгирование переводов. В дебаг монитор: Возможность отключение отображения иконок модов в меню. Исправлено: При переводе в банк, если у игрока переполнен банк, возврата средств не было. Удаление 3D метки на карте, при смерти игрока, если у него нет компаса. Путь к файлу привилегий в UltimaPowered Удалено: Некоторые конфигурации горячих клавиш, т.к. в них нет необходимости более.
  7. 2 points
    BorizzK

    Пропадают авто

    а в events.xml lifetime тут при чем? время жизни после спавна только в тайпсе лайфатам в эвентсе для эвента Vehicle* просто артефакт ни на что не влияющий В вышеуказанном случае может происходить следующее 1 Авта имея кривую геометрию/кривой конфиг модели - тупо при загрузки багуется и двиг ее дропает 2 Имеет место коллизия с предметами в тачке - орпять же при загрузке после некоторого количества коллизий авта багуется и двиг ее дропает Включите полное логгирование экономики mpmissions\dayzOffline.chernarusplus файл cfgeconomycore.xml Сделайте так <rootclass name="CarScript" act="car" reportMemoryLOD="yes" /> <default name="log_ce_loop" value="true"/> <default name="log_ce_dynamicevent" value="true"/> <default name="log_ce_vehicle" value="true"/> <default name="log_ce_lootspawn" value="true"/> <default name="log_ce_lootcleanup" value="true"/> <default name="log_ce_lootrespawn" value="true"/> <default name="log_ce_statistics" value="true"/> <default name="log_ce_zombie" value="true"/> <default name="log_storageinfo" value="false"/> <default name="log_hivewarning" value="true"/> <default name="log_missionfilewarning" value="true"/> <default name="save_events_startup" value="true"/> <default name="save_types_startup" value="true"/> проверьте включено ли сохранение тачек mpmissions\dayzOffline.chernarusplus\db файл economy.xml <vehicles init="1" load="1" respawn="1" save="1"/> И потом смотрите RPT, log
  8. 2 points
    Тема обновлена,Программа стала бесплатной.
  9. 1 point
    @RuslaNKZ учитывая, что кроме банальной смены координат вы хотите еще и товары менять, то верным решением будет подмена конфига Trader, как вы и предположили. Однако, делать это проще в таком случае не скриптами дейза, а скриптами винды (cmd или PowerShell) и привязкой полученного скрипта к виндовому же шедулеру. Погуглите как делается копирование/переименование файлов указанными средствами и вам станет все понятно.
  10. 1 point
    AKuznecov

    Мозги уже кипят!!!

    Константа static const float SHOES_MOVEMENT_DAMAGE_PER_STEP = 0.035 - Определяет повреждения обуви за 1 шаг. Чем меньше значение тем быстрее обувь изнашивается, чем больше соответственно обувь будет долговечнее 2 константа проверяет каждый 10 шаг и соответственно по 1 константе наносит урон обуви
  11. 1 point
  12. 1 point
    x0e2003

    Настройка топ лута

    чтобы одновременно не спавнились поиграйся с параметром <restock> в твоём случае, можно сделать одно здание, где спавняться 8 предметов редкие, но только один будет всегда выпадать в рандоме и если его уже игрок не унёс :))
  13. 1 point
    короче как оказывается если ты включаеш разделение нагрузки через мс конфиг то он с какого хера режет все в 2 раза. щас все вернул 6 ядер 12 потов 15 человек 1500фпс второй раз я беру ксеон и второй раз в дыру. ставим на продажу)))
  14. 1 point
    И так, ребятки, вот вам небольшая 'полезняшка' от меня, и совершенно бесплатно! Описание: Скрипт, добавляющий админу сервера возможность указывать для каждого игрока индивидуальный скин спавна, его персональную точку спавна и один из имеющихся на сервере стартовых наборов с лутом, которые можно составить самим. Если указано несколько точек спавна и/или наборов лута, то будет выбран один из предложенных вариантов рандомно. Также, любой из названных параметров можно отключить в скрипте и сделать его стандартным, как он есть поумолчанию на сервере. Дополнительно - есть возможность назначить свой набор стартового лута для всех игроков на сервере не из списка скрипта! Нам понадобится: 1. Сервер DayZ 1.0, сделанный по одному из гайдов: 2. Notepad++ 3. Немножечко трезвого ума и понимания того, что мы делаем, и как прописывается лут на новом языке enfusion Установка: Перед установкой: Обратите внимание, что имя 'стандартной' миссии сервера при загрузки со Steam называется: 'dayzOffline.chernarusplus'. На хостингах имя этой папки может отличаться. Если это так, то вам в информации ниже необходимо заменить 'dayzOffline.chernarusplus' на имя вашей папки миссии сервера, иначе вы не сможете запустить сервер игры! 1. По пути: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\ создать папку 'CustomSpawnPlayerConfig' и поместить в созданную нами папку 3 файла init_mod.c Script.c Sets.c или создать их самим со следующим содержанием: Script.c /* Описание: Скрипт выдачи индивидуального стартового лута, скина игрока и точек спавна Автор: 123new Установка: 1. По пути: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\ создать папку 'CustomSpawnPlayerConfig' и поместить в нее 3 файла скрипта: Script.c Sets.c init_mod.c 2. В файле: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\init.c в самом верху файла добавить: #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\init_mod.c" 3. В папке, обозначенной параметром запуска сервера '-profile=', поместить файл с именем CustomSpawnPlayerConfig.txt и заполнить его данными по следующему формату: UID|Skin_player|sets_numbers|points_spawns где UID - это steam64id от профиля игрока в steam Skin_player - точный id скина игрока (можно указать 0 для отключения опции) sets_numbers - номер сета со стартовым лутом (можно указать несколько через ';', указать один всего, либо указать 0 для отключения опции) points_spawns - координаты спавна игрока на карте в формате 'x y z' (можно указать несколько через ';', указать всего одну точку, либо указать 0 для отключения опции) Пример: 76561198141889254|SurvivorM_Oliver|1|12955.091797 16.115206 7993.588379 76561198141889256|SurvivorM_Oliver|1;2|14791.965820 76.481781 14041.661133;12029.079102 196.356125 7274.689941 76561198141889253|SurvivorM_Oliver|0|0 4. В файле Sets.c в папке: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\ настроить стартовый лут для ваших игроков и написать собственные сеты ВАЖНО: количество сетов можно делать любое, номера сетов брать от 1 и выше (не должно быть -1, либо 0, только от 1 и выше) Все что укажете в блоке default будет применено для всех игроков при респавне в случае, если им не выдан никакой сет! P.S. Прикрепить к соспавненному оружию магазин не получится, рабочего кода я не смог найти!! Если у вас папка активной миссии сервера отличается от dayzOffline.chernarusplus то переименуйте ее в строке, вписываемой в: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\init.c {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\init_mod.c */ class CustomSpawnPlayerConfig { private string Location_Directory_config = "$profile:"; // Расположение папки с конфигом скрипта private string Location_filename_config = "CustomSpawnPlayerConfig.txt"; // имя файла с конфигом скрипта private string default_log_block_name = "[CustomSpawnPlayerConfig] "; // Стандартный блок скрипта для идентификации с script.log private string disable_read_parameter = "0"; // Стандартное значение (без кавычек) для обозначения в файле конфига скрипта неиспользование параметра private string block_split_parameters_config = "|"; // Символ, обозначающий разделение параметров при чтении файла конфига private string block_split_multi_parameters_config = ";"; // Символ, обозначающий перечисление в одной ячейке параметра нескольких параметров при чтении файла конфига private bool enabled_loading_custom_spawnpoints = true; // Параметр, включающий и отключающий возможность использования приватной точки спавна для каждого игрока. В случае отключения кастомная точка спавна будет отключена для всех поумолчанию, вне зависимости от данных в конфиге! private bool enabled_loading_custom_sets = true; // Параметр, включающий и отключающий возможность использования приватного сета для каждого игроков. В случае отключения выдача сетов будет отключена для всех поумолчанию, вне зависимости от данных в конфиге, будет выдаваться только сет для всех игроков! private bool enabled_loading_custom_skins = true; // Параметр, включающий и отключающий возможность использования индивидуального стартового скина игрока для каждого игрока. В случае отключения эта возможность будет отключена для всех поумолчанию, вне зависимости от данных в конфиге! // ------------------------------------------------------------ // ---------------- NEXT CODE DON'T EDIT ----------------- // ------------------------------------------------------------ ref map<string, ref array<vector>> players_spawnpoints = new map<string, ref array<vector> >; ref map<string, ref array<int>> players_sets = new map<string, ref array<int> >; ref map<string, string> players_skins = new map<string, string>; private bool enabled_loaded_successfull_config = false; string Log_CustomSpawnPlayerConfig_GetDateTime() { private int year, month, day, hour, minute, second; GetYearMonthDay(year, month, day); GetHourMinuteSecond(hour, minute, second); string returned_message = "[" + day.ToStringLen(2) + "." + month.ToStringLen(2) + "." + year.ToStringLen(2) + " - " + hour.ToStringLen(2) + "." + minute.ToStringLen(2) + "." + second.ToStringLen(2) + "] "; return returned_message; } bool Check_coords_disable(vector coord) { private bool ret_zn = false; private float pos_x = coord[0]; private float pos_y = coord[1]; private float pos_z = coord[2]; if ((pos_x == 0.0) & (pos_y == 0.0) & (pos_z == 0.0)) { ret_zn = true; } return ret_zn; } vector Set_Read_coords_disable() { return Vector(0.0, 0.0, 0.0); } void CustomSpawnPlayerConfig() { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + "CustomSpawnPlayerConfig initialize start!"); Read_Update_Config(); } void ~CustomSpawnPlayerConfig() { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + "CustomSpawnPlayerConfig work end, class closed!"); } void Read_Update_Config() { private string name_block_work = "[ReadAndUpdateSettings] "; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + " Started Reading config!"); private array<string> readed_lines_config = ReadFileConfig(); private bool check_normal_read = AnaliseFileConfig(readed_lines_config); if (check_normal_read) { LoadFileConfig(readed_lines_config); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "config readed successfull!"); enabled_loaded_successfull_config = true; } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "config read failed, work script disabled for players!"); enabled_loaded_successfull_config = false; } } array<string> ReadFileConfig() { private string name_block_work = "[ReadFileConfig] "; private array<string> readed_lines_config = new array<string>; readed_lines_config.Clear(); if (FileExist ( (Location_Directory_config + Location_filename_config) ) ) { private string line_content; FileHandle file = OpenFile((Location_Directory_config + Location_filename_config), FileMode.READ); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Open file config: " + (Location_Directory_config + Location_filename_config)); if (file != 0) { while ( FGets( file, line_content ) > 0 ) { readed_lines_config.Insert( line_content); } CloseFile(file); } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! CAN'T OPEN FILE CONFIG : " + (Location_Directory_config + Location_filename_config)); } //readed_lines_config.Debug(); } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! CAN'T FOUND FILE CONFIG OR DIRECTORY: " + (Location_Directory_config + Location_filename_config)); } return readed_lines_config; } bool AnaliseFileConfig(array<string> readed_lines_config) { private bool return_zn = true; private string name_block_work = "[AnaliseFileConfig] "; if (readed_lines_config.Count() > 0) { foreach (string line : readed_lines_config) { if (line.Contains(block_split_parameters_config)) { private array<string> splited_line = new array<string>; line.Split( block_split_parameters_config, splited_line ); if (splited_line.Count() == 4) { private string UID_player = splited_line.Get(0); private string default_skin_player = splited_line.Get(1); private string sets_numbers_player = splited_line.Get(2); private string points_spawn_player = splited_line.Get(3); if ((UID_player == "") || (default_skin_player == "") || (sets_numbers_player == "") || (points_spawn_player == "")) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Lines in Readed file is not correct, please, fix your config script!"); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Line checking: " + line); return_zn = false; break; } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Readed file is have incorrect count parameters with a tag '" + block_split_parameters_config + "', please, fix your config script!"); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Line checking: " + line); return_zn = false; break; } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Readed file can't have a tag '" + block_split_parameters_config + "', please, fix your config script!"); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Line checking: " + line); return_zn = false; break; } } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "ERROR!!! Config file is empty, fix your config script!"); return_zn = false; } return return_zn; } void LoadFileConfig(array<string> readed_lines_config) { private string name_block_work = "[LoadFileConfig] "; players_spawnpoints.Clear(); players_sets.Clear(); players_skins.Clear(); foreach (string line : readed_lines_config) { private array<string> splited_line = new array<string>; splited_line.Clear(); line.Split( block_split_parameters_config, splited_line ); private string UID_player = splited_line.Get(0); private string default_skin_player = splited_line.Get(1); private string sets_numbers_player = splited_line.Get(2); private string points_spawn_player = splited_line.Get(3); private array<vector> temp_players_spawnpoints = new array<vector>; temp_players_spawnpoints.Clear(); array<int> temp_players_sets = new array<int>; temp_players_sets.Clear(); array<string> temp_players_spawnpoints_string = new array<string>; temp_players_spawnpoints_string.Clear(); array<string> temp_players_sets_string = new array<string>; temp_players_sets_string.Clear(); if (points_spawn_player.Contains(block_split_multi_parameters_config)) { points_spawn_player.Split( block_split_multi_parameters_config, temp_players_spawnpoints_string ); } else { temp_players_spawnpoints_string.Insert(points_spawn_player); } foreach (string line_spawnpoint : temp_players_spawnpoints_string) { if (line_spawnpoint == disable_read_parameter) { temp_players_spawnpoints.Insert(Set_Read_coords_disable()); } else { temp_players_spawnpoints.Insert(line_spawnpoint.ToVector()); } } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Generated massive for " + UID_player + " with " + temp_players_spawnpoints.Count().ToString() + " spawnpoints."); if (sets_numbers_player.Contains(block_split_multi_parameters_config)) { sets_numbers_player.Split( block_split_multi_parameters_config, temp_players_sets_string ); } else { temp_players_sets_string.Insert(sets_numbers_player); } foreach (string line_set : temp_players_sets_string) { if (line_set == disable_read_parameter) { temp_players_sets.Insert(0); } else { temp_players_sets.Insert(line_set.ToInt()); } } if (default_skin_player == disable_read_parameter) { default_skin_player = "0"; } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Generated massive for " + UID_player + " with " + temp_players_sets.Count().ToString() + " sets."); Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Detected for " + UID_player + " skin " + default_skin_player); players_spawnpoints.Insert(UID_player,temp_players_spawnpoints); players_sets.Insert(UID_player,temp_players_sets); players_skins.Insert(UID_player,default_skin_player); } } vector Load_And_Check_Spawnpoints(PlayerIdentity identity, vector pos_default) { private string name_block_work = "[Load_And_Check_Spawnpoints] "; private vector retun_pos = pos_default; if(identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string Game_UID_P = identity.GetId(); private string Game_ID_P = identity.GetPlayerId().ToString(); if (enabled_loading_custom_spawnpoints) { if ((players_spawnpoints.Count() > 0) && (enabled_loaded_successfull_config)) { if (players_spawnpoints.Contains(UID_P)) { private array<vector> readed_lines_config = new array<vector>; readed_lines_config = players_spawnpoints.Get(UID_P); private vector retun_pos_check = readed_lines_config.GetRandomElement(); if (Check_coords_disable(retun_pos_check)) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") disabled loading private spawn point. Will be used default spawn point!"); } else { retun_pos = retun_pos_check; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") setuped private spawn point: " + retun_pos.ToString()); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Can't founded private spawnpoint for player " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Config script is incorrect, checking private spawnpoints is disabled! Player: " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "disabled loading personal spawnpoints from config file script!"); } } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used spawn point: " + retun_pos.ToString()); return retun_pos; } string Load_And_Check_SpawnSkin_Player(PlayerIdentity identity, string characterName) { private string name_block_work = "[SelectStartSkinPlayer] "; private string retun_skin = characterName; if(identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string Game_UID_P = identity.GetId(); private string Game_ID_P = identity.GetPlayerId().ToString(); if (enabled_loading_custom_skins) { if (players_skins.Count() > 0) { if (players_skins.Contains(UID_P)) { private string readed_skin = players_skins.Get(UID_P); if (readed_skin == "0") { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") disabled loading private skin setting, will be used default setting game!"); } else { retun_skin = readed_skin; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") setuped private skin setting: " + retun_skin); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Can't founded private skin setting for player " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Config script is incorrect, checking private skin setting is disabled! Player: " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "disabled loading personal skin player settings from config file script!"); } } Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used skin: " + retun_skin); return retun_skin; } void Load_And_Check_StartLoadout(PlayerBase player) { private string name_block_work = "[SelectStartSetPlayer] "; private int use_set_id = -1; private PlayerIdentity identity = player.GetIdentity(); if(identity) { private string Name_P = identity.GetName(); private string UID_P = identity.GetPlainId(); private string Game_UID_P = identity.GetId(); private string Game_ID_P = identity.GetPlayerId().ToString(); if (enabled_loading_custom_sets) { if ((players_sets.Count() > 0) && (enabled_loaded_successfull_config)) { if (players_sets.Contains(UID_P)) { private array<int> readed_lines_config = new array<int>; readed_lines_config.Clear(); readed_lines_config = players_sets.Get(UID_P); private int chek_use_set_id = readed_lines_config.GetRandomElement(); if (chek_use_set_id == 0) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") disabled loading private set numbers. Will be used default set player! "); } else { use_set_id = chek_use_set_id; Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") setuped private set number is: " + use_set_id.ToString()); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Can't founded private sets for player " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "Config script is incorrect, checking private sets is disabled! Player: " + Name_P + "(steam64id=" + UID_P + ")"); } } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "disabled loading personal loadout sets player settings from config file script! Will be used default loadout!"); } if (use_set_id >= 0) { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used spawn set with number is: " + use_set_id.ToString()); } else { Print(Log_CustomSpawnPlayerConfig_GetDateTime() + default_log_block_name + name_block_work + "For player " + Name_P + "(steam64id=" + UID_P + ") will be used spawn default start set without number. "); } StartSetsPlayers.StartSetsPlayer(player, use_set_id); } } private array<EntityAI> GetItemListinobject(PlayerBase player,EntityAI item, bool check_player) { array<EntityAI> EntityAI_list_items = new array<EntityAI>; EntityAI_list_items.Clear(); int attIdx = 0; int attCount = 0; EntityAI item_in_object; if ((player) && (check_player)) { attCount = player.GetInventory().AttachmentCount(); for (attIdx = 0; attIdx < attCount; attIdx++) { item_in_object = player.GetInventory().GetAttachmentFromIndex(attIdx); if ( item_in_object.IsItemBase() ) { EntityAI_list_items.Insert(item_in_object); } } } if ((item) && !check_player) { attCount = item.GetInventory().AttachmentCount(); for (attIdx = 0; attIdx < attCount; attIdx++) { item_in_object = item.GetInventory().GetAttachmentFromIndex(attIdx); if ( item_in_object.IsItemBase() ) { EntityAI_list_items.Insert(item_in_object); } } } return EntityAI_list_items; } void RemoveAllItems (PlayerBase player) { private array<EntityAI> ItemListPlayer = new array<EntityAI>; private array<EntityAI> ItemsForDelete = new array<EntityAI>; private EntityAI itemInHands_player = player.GetHumanInventory().GetEntityInHands(); if (itemInHands_player != NULL) { if (player.CanDropEntity(itemInHands_player) && player.GetHumanInventory().CanRemoveEntityInHands()) { // Print("ItemForDelete: " + itemInHands_player.ToString()); ItemsForDelete.Insert(itemInHands_player); } } ItemListPlayer = GetItemListinobject(player,NULL,true); if (ItemListPlayer.Count() > 0) { foreach(EntityAI ItemPlayer: ItemListPlayer) { private array<EntityAI> ItemInItemInInventory = GetItemListinobject(NULL,ItemPlayer,false); private CargoBase cargo = ItemPlayer.GetInventory().GetCargo(); if(cargo) { if (cargo.GetItemCount() > 0) { for (int f = 0; f < cargo.GetItemCount(); f++) { if(cargo.GetItem(f)) { ItemsForDelete.Insert(cargo.GetItem(f)); } } } } if (ItemInItemInInventory.Count() > 0) { foreach(EntityAI items_temp: ItemInItemInInventory) { if(items_temp) { ItemsForDelete.Insert(items_temp); } } } if(ItemPlayer) { ItemsForDelete.Insert(ItemPlayer); } } } if (ItemsForDelete.Count() > 0) { foreach(EntityAI item_temp: ItemsForDelete) { if(item_temp) { GetGame().ObjectDelete(item_temp); } } } } }; Sets.c class StartSetsPlayersConfig { void StartSetsPlayer(PlayerBase player,int use_set_id) { EntityAI itemCreated = NULL; EntityAI itemCreated1 = NULL; ItemBase itemCasted = NULL; switch( use_set_id ) //Раздаем лут (можно использовать значения от 1 и выше, только не 0 и не -1) { case 1: //Set with number 1 (Сет с номером 1) { My_Custom_Spawn_Parameters.RemoveAllItems(player); // Чтобы удалить с персонажа уже имеющиеся стандартные стартовые шмотки раскомментировать строку itemCreated = player.GetInventory().CreateInInventory("CoyoteBag_Green"); // Выдаем рюкзак и записываем в переменную itemCreated if (itemCreated) // Проверяем, создался ли рюкзак. Если он создался, переменная itemCreated будет не пуста и проверка пройдет { SetRandomHealthItem(itemCreated); // Выдаем рюкзаку рандомное качество itemCreated1 = itemCreated.GetInventory().CreateInInventory("Apple"); // Добавляем в инвентарь созданного рюкзака яблоко и записываем в переменную itemCreated1 if (itemCreated1) // Проверяем, создалось ли яблоко в рюкзаке, яблоко у нас с переменной itemCreated1 { SetRandomHealthItem(itemCreated1); // Выдаем яблоку рандомное качество } itemCreated1 = NULL; // Обнуляем значение переменной после работы с ней, чтобы следующая проверка прошла корректно itemCreated1 = itemCreated.GetInventory().CreateInInventory("Rag"); // Выдаем игроку бинты в рюкзак и записываем в переменную itemCreated1 if (itemCreated1) // Проверяем, создались ли бинты в рюкзаке, они у нас с переменной itemCreated1 { itemCasted = ItemBase.Cast(itemCreated1); // Выполняем преобразование в другой класс для работы с нужной нам функцией, поскольку в классе EntityAI нет нужной нам функции SetQuantity, а в подклассе ItemBase она есть. Предмет при этом так и остается один и тот же! itemCasted.SetQuantity(4); // Определяем количество для созданных бинтов как 4 штуки SetRandomHealthItem(itemCreated); // Выдаем бинтам рандомное качество, функция работает с классом EntityAI (см. в конфе файла) } } // переменную itemCreated не обнуляем далее, поскольку мы ее не используем в проверке ниже. itemCreated = player.GetInventory().CreateInInventory("TTSKOPants"); // Выдаем игроку штаны itemCreated = player.GetInventory().CreateInInventory("TTsKOJacket_Camo"); // Выдаем игроку куртку itemCreated = player.GetInventory().CreateInInventory("CombatBoots_Black"); // Выдаем игроку обувь //itemCasted = ItemBase.Cast(itemCreated); // Строка не нужна, закоментирована. используется для изменения класса EntityAI в ItemBase (чтобы нужные операции были доступны) itemCreated = player.GetInventory().CreateInInventory("CombatKnife"); // Выдаем игроку ножик в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("FNX45"); // Выдаем игроку FNX в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"); // Выдаем игроку магазины к FNX в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_FNX45_15Rnd"); // Выдаем игроку магазины к FNX в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_AKM_30Rnd"); // Выдаем игроку магазины к AKM в любой свободный слот в инвентаре itemCreated = player.GetInventory().CreateInInventory("Mag_AKM_30Rnd"); // Выдаем игроку магазины к AKM в любой свободный слот в инвентаре itemCreated = NULL; // Обнуляем значение переменной после работы с ней, нужно если мы будем использовать ее далее itemCreated = player.GetHumanInventory().CreateInHands("akm"); // Выдаем игроку AKM в руки if (itemCreated) // Проверяем, создался ли АКМ { itemCreated.GetInventory().CreateAttachment( "PSO11Optic" ); // Выдаем игроку на AKM оптику ПСО 11 и крепим itemCreated.GetInventory().CreateAttachment( "AK_WoodBttstck" ); // Выдаем игроку на AKM цевье, приклад и глушитель, и крепим itemCreated.GetInventory().CreateAttachment( "AK_WoodHndgrd" ); // Выдаем игроку на AKM цевье, приклад и глушитель, и крепим itemCreated.GetInventory().CreateAttachment( "AK_Suppressor" ); // Выдаем игроку на AKM цевье, приклад и глушитель, и крепим } break; } case 2: //Set with number 2 (Сет с номером 2) { break; } case 3: //Set with number 3 (Сет с номером 3) { break; } case 4: //Set with number 4 (Сет с номером 4) { break; } case 5: //Set with number 5 (Сет с номером 5) { break; } case 6: //Set with number 6 (Сет с номером 6) { break; } default: //Default starting spawn set (Сет поумолчанию для всех игроков, если хотите назначить - добавляйте здесь!) { //My_Custom_Spawn_Parameters.RemoveAllItems(player); // Чтобы удалить с персонажа уже имеющиеся стандартные стартовые шмотки раскомментировать строку break; } } } void SetRandomHealthItem(EntityAI itemCreated) { if ( itemCreated ) { private int rndHlt = Math.RandomInt(55,100); itemCreated.SetHealth("","",rndHlt); } } } init_mod.c #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\Script.c" #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\Sets.c" ref CustomSpawnPlayerConfig My_Custom_Spawn_Parameters = new CustomSpawnPlayerConfig(); ref StartSetsPlayersConfig StartSetsPlayers = new StartSetsPlayersConfig(); modded class CustomMission { override void OnInit () { super.OnInit(); GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(My_Custom_Spawn_Parameters.Read_Update_Config, 120000, true); // Обновление настроек скрипта кастомных спавнов, 1 минута = 60000 } override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) { pos = My_Custom_Spawn_Parameters.Load_And_Check_Spawnpoints(identity, pos); characterName = My_Custom_Spawn_Parameters.Load_And_Check_SpawnSkin_Player(identity, characterName); super.CreateCharacter(identity, pos, ctx, characterName); return m_player; } override void StartingEquipSetup(PlayerBase player, bool clothesChosen) { super.StartingEquipSetup(player, clothesChosen); My_Custom_Spawn_Parameters.Load_And_Check_StartLoadout(player); } } 2. В файле: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\init.c в самом верху файла добавить: #include "$CurrentDir:mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\init_mod.c" Чтобы получилось примерно так 3. В папке, обозначенной параметром запуска сервера '-profile=', поместить файл с именем CustomSpawnPlayerConfig.txt и заполнить его данными по следующему формату: UID|Skin_player|sets_numbers|points_spawns где UID - это steam64id от профиля игрока в steam Skin_player - точный id скина игрока (можно указать 0 для отключения опции) sets_numbers - номер сета со стартовым лутом (можно указать несколько через ';', указать один всего, либо указать 0 для отключения опции) points_spawns - координаты спавна игрока на карте в формате 'x y z' (можно указать несколько через ';', указать всего одну точку, либо указать 0 для отключения опции) Пример: CustomSpawnPlayerConfig.txt 76561198141889254|SurvivorM_Oliver|1|12955.091797 16.115206 7993.588379 76561198141889256|SurvivorM_Oliver|1;2|14791.965820 76.481781 14041.661133;12029.079102 196.356125 7274.689941 76561198141889253|SurvivorM_Oliver|0|0 4. В файле Sets.c в папке: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\ настроить стартовый лут для ваших игроков и написать собственные сеты ВАЖНО: количество сетов можно делать любое, номера сетов брать от 1 и выше (не должно быть -1, либо 0, только от 1 и выше) Все что укажете в блоке default будет применено для всех игроков при респавне в случае, если им не выдан никакой сет! P.S. Прикрепить к соспавненному оружию магазин не получится, рабочего кода я не смог найти!! Если у вас папка активной миссии сервера отличается от dayzOffline.chernarusplus то переименуйте ее в строке, вписываемой в: {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\init.c {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\init_mod.c Благодарности: Товарищу Mizev за его первоначальные гайды в группе VK при появлении в сети серверной части игры
  15. 1 point
    PR9INICHEK

    VPPAdminsTools

    Ааа, точно Сам подписан на билет, а про это забыл https://feedback.bistudio.com/T144773 @123new извини, если что 🙂
  16. 1 point
    Fence - забор/ворота Watchtower - башня UndergroundStash - схрон Fireplace - костер FireplaceIndoor - каменная печь
  17. 1 point
    Ну,коровка пришла к хелику ,что такого? Пасётся рядом,ни кого не кусает....Вот если скажите как таких коровок сделать 15 на хеликраше,скажу как их убрать(шутка) Открываете файл с ивентами и у хеликрашей, полицеских машин просто убираете всё что то в строчке "вторичное".
  18. 1 point
    Alex39

    Сборка ZBK

    Продолжается работа над сборкой, не знаю зачем конечно, и кому нужна, но появилось желание, произвел деобфускацию файлов, теперь можно работать над полноценной сборкой, убираю ошибки
  19. 1 point
    Ок, спасибо, понял куда копать. Буду пробовать варианты
  20. 1 point
    123new

    пвп после рестарта

    было б там что расписовать cd %~dp0 set "batch_dir=%cd%" set "change_pvp=false" if %time:~0,2% GEQ 19 ( if %time:~0,2% LEQ 23 ( set "change_pvp=true" ) ) IF %change_pvp%" EQU true ( goto install_pvp ) else goto install_normal :install_pvp RD /S /Q "%batch_dir%\mpmissions\dayzOffline.chernarusplus\" xcopy "%batch_dir%\pvp\*.*" "%batch_dir%\mpmissions\dayzOffline.chernarusplus\*.*" /E /Y /Q goto next :install_normal RD /S /Q "%batch_dir%\mpmissions\dayzOffline.chernarusplus\" xcopy "%batch_dir%\survival\*.*" "%batch_dir%\mpmissions\dayzOffline.chernarusplus\*.*" /E /Y /Q goto next :next exit
  21. 1 point
    научитесь уже задавать порты стим и стимквери в параметрах запуска сервера и cfg сервера и такие проблемы пропадут навсегда
  22. 1 point
    BorizzK

    Болезни [1.03]

    player.AddHealth("", "Shock", 10 ); добавит к текущему значению player.AddHealth("", "Shock", -10 ); убавит текущее значение player.SetHealth("", "Shock", 0 ); в отключку
  23. 1 point
    ; по барабану я вообще так делаю @MODS #SERVERMODS И внутри уже папки с модами и указываются как "-mod@MODS\@MOD1;@MODS\@MOD2" для серверных тож самое но свой путь -servermod= обязательно после -mod в параметрах в папке каждого мода обязательна папка Addons где лежат pbo
  24. 1 point
    Обновление 1.3.0.0 -Rcon, скачивание модов из воркшопа, автообновление сервера/модов еще в разработке -База данных очищена, необходимо заново зарегистрироваться (изменен алгоритм шифрования паролей)
  25. 1 point
    Добавьте раздел сюда https://s-platoon.ru/forum/257-s-platoon/ а то ну флудилка вообще не то место куда скидывать предложения по сути эти темы взвешенные идеи которые нуждаются либо в обсуждении либо в реализации но не во флуде
  26. 1 point
    DAP респект и уважуха! Кстати прога хорошая, юзал.
  27. 1 point
    BLACK21

    Проблемы с BEC

    Привет У меня не сильно много опыта в этом, так как сам недавно начал делать сервак, но тоже сталкивался с этой проблемой, поэтому напишу что знаю) 1 вариант - ты не открыл нужные порты, в моем случае это (2302, 27016 и 8766). 2 вариант - ты неправильно указал ip своего компа (в настройках роутера, когда открывал порты) P.S. у тебя ведь белый ip? P.S.S. еще может быть 3 вариант - ты не поменял свой белый ip и порт в конфиге bec'a
  28. 1 point
    NightWolf

    MLOD Mil_Barracks1

    В модах в воршкопе ну очень мало зданий новых, может эта модель сподвигнет создать свое здание, по сути это гораздо легче чем создавать округлые модели... (Илон Макс вошел в чат) Эта модель для ознакомления так как багемия не соблаговолила поделиться инструкцией как создавать здания... загрузив этот здания в стим воркшоп вам багемия может дать бан там же :) Mil_Barracks1.rar Буду благодарен за плюсики они мотивируют заливать больше гайдов или информации для помощи мододелам.
  29. 1 point
    (краткая ода как я выносил себе мозг с помощью лута) Настроить лут на сервере постарались сразу после релиза ибо многое "не там и не тут".... Первая фигура Марлезонского балета. Файлов которые отвечают за лут прямым и коственным образом,судя по всему мнго,но настройки которые нам доступны сосредоточены в папке mpmissions\dayzOffline.chernarusplus и mpmissions\dayzOffline.chernarusplus\db cfglimitsdefinition.xml -файл в котором обозначены категории лута, тэги спавна, классы обьектов для спавна и зоны спавна.(если я правельно понял,в информатике это называеться "заданием классов" или как то так).Далле с чем я эксперементировал. <category name="......."/> Спавнящийся лут имеет (а может и не иметь) определенную категорию и судя по всему не одну. Сюда можно вписать свою категорию и давать её предметам.(ф файле тайпс) Тэги...Их всего два <tag name="floor"/> <tag name="shelves"/> Лут может их иметь,а может и нет.Как я понял-это определят точку спавна- "только на земле","только на предметах"....если ничего нет-может спавниться где разрешено и позволяет "обьём"(об этом позже). Новые не вписывал,бо не имеет смысла.. Классы обьектов для спавна <usage name="......."/> Стационарные обьекты имеют в своём обозначении один или несколько таких классов имён. Легко можно прописать свой и дать его категории стационарных обьектов или обьекту.(правда уникальных обьектов на карте-раз,два и обчёлся). Прописав свой к примеру "MyBox"....и потом в mapgroupproto.xml у военных контейнеров убрав все классы и оставив только этот,в нём будут спавниться только те предметы которым вы в "тайпс" пропишите данную категорию. Зоны спавна <value name="....."/> их всего четыре...И как они нанесены на карту-точно знают только бегемоты....Примерно,что берег-первая зона,дальше вторая..И так далее,но к примеру Алькатраз в какой зоне? К сожалению после релиза это дело не работало,а включили кажеться сравнительно недавно (поэтому пока на стадии познания:))) mapgrouppos.xml - Файл в котором определяться координаты "карты" лута для каждого обьекта.(мдя,чего я счас сморозил то) <group name="Land_Misc_FeedShack" pos="80.255409 113.792282 4422.158691" rpy="-0.000000 0.000000 -70.013718" a="160.013718" /> Land_Misc_FeedShack - название обьекта,его ID... pos="80.255409 113.792282 4422.158691" rpy="-0.000000 0.000000 -70.013718" - координаты центра "карты" лута для этого обьекта, совпадают с координатами обьекта формат записи X-Y-Z завал,наклон,поворот. a="........" Вектор поворота карты лута обьекта относительно направления С-Ю. Как он определятеься-непонятно,но эксперементально выяснил что частенько заспавнив здание и прописав в него лут,можно брать это значение с аналогичного обьекта,но всегда проверить,нормально ли спавниться лут,если нет-проще переспавнить обьект и снова попробовать,чем "искать угол"-(устарело),в принцпе....(угол поворота - 90)х(-1)...как то там ещё можно возиться переводить с +360, ноя просто пишу полученное знаечение и всё работает. Да-да,именно тут прописываеться что в вашем установленом обьекте появляеться лут! (имееться ввиду в оффлайн редакторе поставив "француз"-тут вы пропишите в него лут,как прописать в он-лайн сам обьект-другая история под названием "возврат водяных колонок") mapgroupproto.xml - Файл в котором прописана "карта" лута для объекта. Вначале идёт описание для "дефолта" ,то есть деревьев и растений,а также камней!(тут я не понял,но ...это нам и не нужно,яблаки падают и хорошо..) <group name="Land_Tisy_Barracks"> - название обьекта,ID <usage name="Military" /> - класс имени обьекта,может быть не один. (а если вы ввели свои-писать именно сюда) <container name="lootFloor" lootmax="8"> - имя "контейнера" и максимальное колличество лута котрое может там появиться.(колличество лута может быть и не обозначено,но ессли еть-никогда не будет больше чем колличество точек спавна что ниже) <category name="tools" /> - класс лута который будет спавниться,может быть не один. ........................... <category name="clothes" /> <point pos="-2.429444 -3.799637 3.698242" range="1.199951" height="2.000000" /> - точка спавна лута, расстояние по X-Y-Z от центральной точки "карты лута" (где она,можно выяснить только эксперементально для каждого обьекта). range="......." радиус спавна от заданной точки, то есть в этом "круге" будет спавниться лут. height="........."-высота возможного спавна,как я понял.... ниже всё тоже самое, но для своего "контейнера" данном здании.То есть обьект может иметь несколько контейнеров. </container> <container name="lootshelves" lootmax="8"> <category name="tools" /> <category name="containers" /> <category name="clothes" /> <tag name="shelves" /> <point pos="0.968751 -3.434326 7.507324" range="0.581250" height="0.532341" /> .................................................. </container> <container name="lootweapons" lootmax="8"> <category name="weapons" /> <category name="explosives" /> <point pos="3.985354 -3.434326 6.267576" range="0.478125" height="0.533684" /> ................................................... </container> </group> cfgrandompresets.xml - Файл в котором мы найдём так называемые "грузы"-группы предметов спавнящихся в предметах,зомби и тому подобное....(судя по всему сделано для удобства) <cargo chance="0.35" name="foodVillage"> - шанс появления этого набора (в данном случае 35%) и его название <item name="SodaCan_Cola" chance="0.11" /> - название (ID) предмета и его шанс выпадения (11%) ....................................................................... <item name="SpaghettiCan" chance="0.11" /> <item name="BakedBeansCan" chance="0.11" /> </cargo> То есть "груз" foodVillage может выпасть в 35% случаев, если условее истинно,то может выпасть предмет из списка с вероятностью которая задана для предмета или ,если ни один предмет не прошёл-то опять таки ничего не выпадет. Выпадает только один предмет из списка, так и не выяснил,влияет ли очерёдность списка предметов или нет. То есть возможностей настройки тут-море,кто хорошо разбираеться в теорией вероятности поймёт данный раздел влёгкую. Можно создавать свои собственные "миксы"....к примеру. </cargo> <cargo chance="1.0" name="mixOptics"> <item name="PUScopeOptic" chance="0.33" /> <item name="PSO1Optic" chance="0.33" /> <item name="HuntingOptic" chance="0.3" /> </cargo> То есть "микс" появиться стопроцентно в объекте из него может выпасть....с вероятностью 33% ...перечисленные вещи. Важно помнить,что если размер "контейнера" маленький (к примеру мишка),то в нём ни как не заспавниться ПСО-1. Размер имеет значение. cfgspawnabletypes.xml - Список тех вещей, "контейнеры" в которых спавняться наборы из прошлого файла. И самое важное! Именно тут указано степень износа заспавненых вещей,для остальных-пристин! Не то что в них....(но контейнером может стать и обычная вещь!) <damage min="0.2" max="0.7" /> - тут и задан разброс износа для "контейнеров"! Для всего списка! От 0,3 до 0,7 (в орегинале),я уже тут изменил немного. <type name="ammobox"> - название (ID) вещи-контейнера. <cargo preset="optics" /> -название набора который может появиться внутри с шансом( ккак было описано выше).... ........................................ <cargo preset="ammoArmy" /> </type> То есть можно прописать несколько наборов и если из каждого заспавниться вещь,то ограничение только "размер" контейнера и вещей. Но в этом файле есть ещё много "вкусного"..... Вторая фигура Марлезонского балета. <type name="ZmbM_PatrolNormal_Autumn"> <cargo preset="foodArmy" /> <cargo preset="ammoArmy" /> </type> Вот вам и первый "ходячий" контейнер.....Увеличив к примеру в cfgrandompresets.xml шанс выпадения данных наборов-получите "доставщиков пиццы на дом". Но не в каждом зомби такой набор и опять таки,вы можете их менять,добавлять,убирать.... А дальше-оружие... <type name="CZ61"> - ID оружия <attachments chance="0.10"> -Шанс что на нём будет аттачмент 10% <item name="AK_Suppressor" chance="1.00" /> - шанс появления самого аттачмента 100% (не факт что так и надо,просто так проще высчитыывать процент появления аттачементов на оружии) </attachments> <attachments chance="0.30"> -то же самое и для другого аттачмента,обратите внимание,что мы не смешиваем в одну кучу "глушители и магазины"... <item name="Mag_CZ61_20Rnd" chance="1.00" /> </attachments> </type> А если хочеться "АКМ" что бы мог спавниться в полном обвесе? А легко... <type name="AKM"> <attachments chance="1.00"> <item name="AK_WoodBttstck" chance="0.80" /> <item name="AK_PlasticBttstck" chance="0.30" /> <item name="AK_FoldingBttstck" chance="0.40" /> </attachments> <attachments chance="1.00"> <item name="AK_WoodHndgrd" chance="0.80" /> <item name="AK_PlasticHndgrd" chance="0.30" /> <item name="AK_RailHndgrd" chance="0.10" /> </attachments> <attachments chance="0.30"> <item name="Mag_AKM_30Rnd" chance="1.00" /> </attachments> <attachments chance="0.30"> <item name="AK_Suppressor" chance="0.50" /> </attachments> Видим что он может появляться с разными прикладами,цевьями,может с глушителем или без,с магазином или без....(хотите,можете и ПСО ему прописать). Как видите тут нет ни ИЖ18,ни МП133....и они,гады спавняться всегда "пристин".....Стоит добавить <type name="Izh18"> </type> .....и ИЖ18 будет спавниться с дамагом который вы установили. Думаете это всё?....Индейское жилище-фигвам! Машины!.... <type name="OffroadHatchback"> <attachments chance="1.00"> <item name="HatchbackWheel" chance="0.60" /> </attachments> <attachments chance="1.00"> <item name="HatchbackWheel" chance="0.60" /> </attachments> <attachments chance="1.00"> <item name="HatchbackWheel" chance="0.40" /> </attachments> <attachments chance="1.00"> <item name="HatchbackWheel" chance="0.40" /> </attachments> <attachments chance="1.00"> <item name="HatchbackWheel" chance="0.20" /> </attachments> <attachments chance="1.00"> <item name="CarRadiator" chance="0.20" /> </attachments> <attachments chance="1.00"> <item name="CarBattery" chance="0.30" /> </attachments> <attachments chance="1.00"> <item name="HeadlightH7" chance="0.40" /> </attachments> <attachments chance="1.00"> <item name="HeadlightH7" chance="0.40" /> </attachments> <attachments chance="1.00"> <item name="HatchbackDoors_Driver" chance="0.30" /> </attachments> <attachments chance="1.00"> <item name="HatchbackDoors_CoDriver" chance="0.30" /> </attachments> <attachments chance="1.00"> <item name="HatchbackHood" chance="0.20" /> </attachments> <attachments chance="1.00"> <item name="HatchbackTrunk" chance="0.20" /> </attachments> </type> Это он так выглядит сейчас вроде...раньше было всё намного хуже...Машина стандартно спавнилась с ОДНИМ колесом. Можете изменить аттачментам шансы хоть до "1.00" что бы машина спавнилась сразу собранная.(залить в неё жидкости-знает Боррзик,описывал на форуме,ищите). Правда мы подло могЁм положить в машину.....бензин,масло...можно и ремкомплект. <attachments chance="1.00"> <item name="SparkPlug" chance="0.6" /> </attachments> <attachments chance="1.00"> <item name="EngineOil" chance="0.5" /> </attachments> <attachments chance="1.00"> <item name="EngineOil" chance="0.5" /> </attachments> <attachments chance="1.00"> <item name="EngineOil" chance="0.5" /> </attachments> (в этом же файле,ПОЗЖЕ,появились и рождественские наборы...но было уже поздно-бегемоты должны быть повешаны!) Глыбжее,ширее,нижее. Преходим в папку db events.xml - файл в котором описаны "случайные" события,такие как зомби,полицейская волга, хеликраш, адми...тоесть петух!, ну и прочие коровы и звери. Например <event name="AnimalCow"> -название ивента <waves>0</waves> - ИМХО,аппендикс от 062 <nominal>8</nominal> - номинальное колличество стай на карте???? <min>6</min> - мин количество стай <max>8</max> - максимальное колличество стай <lifetime>180</lifetime> - "время жизни"????Бред. <restock>0</restock> - Непонятный параметр. <saferadius>200</saferadius> - радиус спавна <distanceradius>0</distanceradius> -неизвестный мне параметр <cleanupradius>0</cleanupradius> - неизвестный мне параметр <flags deletable="0" init_random="0" remove_damaged="1" sec_spawner="0"/> -флаги настройки <position>fixed</position> -позиция будет выбераться из зафиксированых в файле cfgeventspawns.xml <limit>child</limit> Непонятный мне параметр <active>1</active> -Вкл\Выкл....ставим ноль и "коровка нихт". <children> <child lootmax="0" lootmin="0" max="3" min="0" type="Animal_BosTaurusF_Brown"/> ..................................................... - То что будет спавниться в ивенте,тоесть состав "стада" и колличество. <child lootmax="0" lootmin="0" max="1" min="0" type="Animal_BosTaurus_White"/> </children> </event> Так же с хеликрашами и прочими зомбями. types.xml-великий и ужасный.Содержит в себе данные о всём спавнещемся луте и контейнерах (хеликраши,машины,зомби-по сути-контейнеры). Всякий лут должен быть в этом файле иначе-нет его спавна на карте. Также и синтаксическая ошибка в этом файле приводит к исчезновению всего лута с карты. Если из него убрать что-то,(но этот предмет останеться лежать на земле до истечения срока)....и игрок его поднимет-краш.Так что файл требует трезвого ума и терпения. <type name="Canteen"> - Название ID предмета <nominal>30</nominal> -номинальное колличество спавна на карте к которому стремиться "спавнер". <lifetime>7200</lifetime> - время "лежания" предмета после спавна ( а также судя,по всему-время после падения на землю с игрока).в сек. (на параметр влияет ускорение времени на сервере и параметр из скриптс-"колличество тактов в секунду") <restock>0</restock> - на сколько отложиться респан предмета после того как он должен "отспавниться" по новой. <min>20</min>- минимальное колличество предмета на карте после которого начинаеться работа спавнера. <quantmin>-1</quantmin> - если предмет "бутылка-магазин"-степень его наполнения минимальная <quantmax>-1</quantmax> - если предмет "бутылка-магазин"-степень его наполнения минимальная <cost>100</cost> - (апендикс бегемотов-думали ввести цену....) <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/> -флаги для настройки работы спавнера,тоесть какое колличество он учитывает перед тем как заспавнить вещь. count_in_cargo -колличество в палатках и машинах. count_in_hoarder -количество в бочках и закопанных схронах. count_in_map -лежащих в данный момент на карте. count_in_player -находящихся у игроков(неизвестно,учитываться все игроки или игроки он-лайн) crafted -собраные вещи deloot - если значение 0 то оружие будет в указанных зонах из тэгов, если 1, то только на хеликрашах в указанных зонах Tier 1 2 3 или 4 ну или всех Tier-(возможно что если "1" то вещь спавниться только на "ивентах") <category name="food"/> -категория лута ,может быть не одна. <tag name="shelves"/>-установлен "тэг" <usage name="Military"/> -класс обьекта в котором может заспавниться. <value name="Tier2"/> Зоны в каких будет спавниться лут <value name="Tier3"/> <value name="Tier4"/> </type> Если по простому,то "фляжка" будет спавниться в колличестве 30 штук постоянно в зонах 2-3-4 на военных обектах где возможно появление еды с использованием тэга shelves, то есть если в объекте совпадает в начале описания в mapgroupproto.xml,класс,категория,тэг -то предмет заспаниться в точке спавна,которые в этом же файле,для обьекта на карте из файла mapgrouppos.xml <type name="ACOGOptic"> <nominal>20</nominal> <lifetime>7200</lifetime> <restock>1800</restock> <min>15</min> <quantmin>-1</quantmin> <quantmax>-1</quantmax> <cost>100</cost> <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/> <category name="weapons"/> <usage name="Military"/> </type> <type name="AgaricusMushroom"> <lifetime>900</lifetime> <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="1" deloot="0"/> </type> как видите,есть даже грибы,которые спавняться динамически. (если вещевые или другие моды перезаписывают эти файлы,то следите за тем что бы они сливались в экстазе,а не выпихивали друг друга) По идее-ничего сложного,даже я разобрался.....почти. Третья фигура Марлезонского балета.... Пара примеров.... <type name="StartKitIV"> <nominal>50</nominal> <lifetime>7200</lifetime> <restock>0</restock> <min>40</min> <quantmin>-1</quantmin> <quantmax>-1</quantmax> <cost>100</cost> <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/> <category name="tools"/> <tag name="shelves"/> <value name="Tier1"/> <value name="Tier2"/> <value name="Tier3"/> <value name="Tier4"/> </type> Это "квадратик" или....гхм!. Что видим?Лут из категории "инструменты",спавниться постоянно в местах с тэгом,по всей карте....А какой он категории?А ни какой,вот и спавниться,хоть на лодках на берегу,хоть на вышке. Добавляем категорию... <type name="StartKitIV"> <nominal>50</nominal> <lifetime>7200</lifetime> <restock>0</restock> <min>20</min> <quantmin>-1</quantmin> <quantmax>-1</quantmax> <cost>100</cost> <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/> <category name="tools"/> <tag name="shelves"/> <usage name="Medic"/> <value name="Tier1"/> <value name="Tier2"/> <value name="Tier3"/> <value name="Tier4"/> </type> Всё,теперь только на обьектах с классом "медик"-как и положено. (бегемоты должны быть повешаны!).... Обьект радиовышка,кто лазил на неё,тот помнит что на ней спавнился полецейский лут. Почему? А смотрим mapgroupproto.xml <group name="Land_Tower_TC1"> <usage name="Village" /> <usage name="Industrial" /> <usage name="Police" /> <container name="lootFloor"> <category name="tools" /> <category name="containers" /> <category name="clothes" /> <category name="weapons" /> <category name="books" /> <category name="explosives" /> <point pos="-0.454809 14.404877 0.712779" range="0.314223" height="0.785558" /> <point pos="-0.582537 14.404785 0.034267" range="0.375000" height="0.913483" /> <point pos="0.773581 14.405716 0.067886" range="0.375000" height="0.915054" /> <point pos="-0.448550 14.404892 1.860424" range="0.432076" height="1.080190" /> <point pos="0.641068 14.405640 1.884647" range="0.512500" height="1.279480" /> <point pos="-1.132879 -1.965958 1.837671" range="0.581250" height="1.453125" /> <point pos="0.925214 -1.964554 -0.245559" range="0.821875" height="1.996796" /> <point pos="-0.880515 -1.965805 -0.105441" range="0.821875" height="2.000610" /> <point pos="0.998695 -1.964493 1.724339" range="0.890625" height="1.996490" /> </container> Лут категории "инструмент","контейнер"...."оружие" классов ...Да,"Полиция".....Удаляем нафинг полицию! <group name="Land_Tower_TC1"> <usage name="Village" /> <usage name="Industrial" /> <container name="lootFloor"> <category name="tools" /> <category name="containers" /> <category name="clothes" /> <category name="weapons" /> <category name="explosives" /> <point pos="-0.454809 14.404877 0.712779" range="0.314223" height="0.785558" /> <point pos="-0.582537 14.404785 0.034267" range="0.375000" height="0.913483" /> <point pos="0.773581 14.405716 0.067886" range="0.375000" height="0.915054" /> <point pos="-0.448550 14.404892 1.860424" range="0.432076" height="1.080190" /> <point pos="0.641068 14.405640 1.884647" range="0.512500" height="1.279480" /> <point pos="-1.132879 -1.965958 1.837671" range="0.581250" height="1.453125" /> <point pos="0.925214 -1.964554 -0.245559" range="0.821875" height="1.996796" /> <point pos="-0.880515 -1.965805 -0.105441" range="0.821875" height="2.000610" /> <point pos="0.998695 -1.964493 1.724339" range="0.890625" height="1.996490" /> </container> </group> Теперь в лучшем случае дробаш там будет. Ну,как то так....
  30. 1 point
    @NightWolf Бред про домашний хост. - Если норма машина, и не занята, а канал выделен, то там и 10мб\с хватит на сраных 50 тел. Синхронизационная инфа не гуляет гигабайтами. - Первая в мире ММОРПГ - UltimaOnline поддерживала до 600 тел на серваке, и серваки тогда чуть ли не на модемах стояли)))) все ок было. - Зависимость в латентности. На А2 в свое время недолго держал серв. 50 онлайн. Лагов не было. Многие кто играл тогда вообще приходили потому, что пинг был 1-10. Что за за фрейм должно улететь в сеть? - индекс анимации, да вектор направления * 50 * 50(это если все игроки в одну кучу встанут). В реалиях, только на СЗ кучкуются по 10-15 тел. Остальные вне буфера. Вектор = 3флоат. + Индекс. Плюс некие тех данные - выстрел\подъем шмота. Нагрузка от сервера гораздо меньше чем от клиента, чему там бсодить? Видеоданные не обрабатываются, проц нагружен на 40-50%(какой нить феном х6). Объем памяти в современных компах меньше 16Гб врядли встретишь, и для 1 сервака этого хоть опой жри. *На древнем как гавно мамонта Атлоне двух ядерном и 4Гб оперы ДДР2, по приколу запустил СА - все по 100%. - На 4 ядрах и 8Гб уже картина в корне другая. Про современные компы вообще молчу.
  31. 1 point
    Про enScript. Опубликую тут, что бы было. (С) Mizev Что же представляет из себя Enfusion Scripts — новый язык программирования игровых механизмов игры DayZ Standalone? С версии игры 0.59 Bohemia Interactive начала вводить новый внутренний язык программирования скриптов игры. Старый язык скриптов уже изжил себя и программировать на нем было весьма затруднительно. Как и в большинстве подобных скриптовых языках других игр за основу был взят синтаксис С++ и объектно-ориентированное программирование. Раз уж игра создается с помощью Visual C++, то это зачем придумывать что-то иное! Они создают игру на С++, затем компилируют DLL и EXE, но часть скриптов как бы «остается не скомпилированной» и представляется нам в текстовом виде, чистым листингом. Вот эту часть нам доступна для модификации и мы можем изменять эти скрипты сообразно нашей фантазии. Почти все скрипты упакованы в файл scripts.pbo и если его "разбинарить», то мы получим папку scripts с содержимым. Кто мало знаком с С++ я немного расскажу, что он из себя представляет. (В силу своих познаний.) И так… Фактически вся игра — это классы. Некоторые сущности со свойствами и функциями. Скажем класс PlayerBase — базовый класс игрока. Класс может наследовать другой класс. Т.е. есть родительский класс и есть наследуемый класс. Для того же PlayerBase родительским классом будет ManBase. Дочерний класс наследуют все свойства и функции родительского класса. При том в дочернем классе можно добавить новые свойства и функции, а если нужно функции можно «переопределять» — функция с одинаковым именем в родительском классе и дочернем будут выполнять разные действия. Свойства — это некоторый параметр класса. Может иметь значение разного типа: число, булево, строка, или ссылка на другой класс. Например (простой пример): Класс Игрок у него есть свойство Жизненные силы. Функция класса выполнит какое-то действие или произведет вычисление и может вернуть значение. Например (простой пример): ПредметВРуке = Игрок.ЧтоВРуке(); — в переменную вернется ссылка на предмет в руках у персонажа или NULL (ничего). Использование классов в скриптах. Первейшее — это мне нужно определить класс, указать что он наследует, какие будут свойства и функции у класса. class PlayerBase extends ManBase — имя класса PlayerBase и он дочерний класса ManBase. Так что все те свойства, которые были определены в классе ManBase, будут и у него. Добавляем новые свойства: private int m_BloodType; — ManBase не содержит свойства тип крови, а вот у PlayerBase такое свойство будет. Свойство я определил как private пользоваться им я могу только внутри класса и получить его из другого класса не смогу. Поэтому я добавлю функцию: int GetBloodType() { return m_BloodType; } При вызове этой функции из другого класса мне вернется тип крови. Мой класс выглядит так: Теперь, где мне нужно, я могу получить тип крови игрового персонажа. PlayerBase player; ← Создаю переменную класса PlayerBase. player = GetGame().GetPlayer(); ← присваиваю переменной значение нужного мне объекта. int bloodT = player.GetBloodType(); ← получаю тип крови моего объекта. К примеру класс ManBase имел свойство position. Тип vector. (Пример только для примера, в реальности это не так). Поскольку PlayerBase наследует класс ManBase, то имеет тоже свойство и я могу получить его: vector posPlayer = player.position; vector — это тип данных, как int (целые числа) или float (вещественные). Это массив вида [float, float, float]. Применяется в игре для задания координат или направления — [x, z, y].
  32. 0 points
    Selleti

    Рация частоты

    Самих частот я не нашел, они скорее всего в самом движке, но можно попробовать переписать функции, но скорее всего ничего не выйдет, так как там с большой вероятностью заточка чисто под частоты которые бисы прописали, и если они не будут совпадать, то ничего и не будет работать.
  33. 0 points
    123new

    Химза

    getMaxHealth? ну так, в теории
  34. 0 points
    paranoyk

    Настройка топ лута

    ...создать новы тип для лута, всем топ вещам прописать его,выделить в нужном здании ОДНО место под него....
  35. 0 points
    BorizzK

    VPPAdminsTools

    Вот рекомендую зобанить в баттле на сервере f729be0693ad5587dd4c01a791969ed1 -1 Admin Ban 517f17f15697ae008d858968bca63269 -1 Admin Ban bd30e2212acb90caa998c8441e72dc9c -1 Admin Ban f8b39affb10089487a32693709316f54 -1 Admin Ban
  36. 0 points
    123new

    VPPAdminsTools

    ВНИМАНИЕ!!! ВАЖНО ДЛЯ ВСЕХ, КТО ИСПОЛЬЗУЕТ VPP Admin Tools void PermissionManager() { m_UserGroups = new array<ref UserGroup>; m_Permissions = new array<string>; m_SuperAdmins = new array<string>; m_SuperAdmins.Insert("76561198420222029"); m_SuperAdmins.Insert("76561198321354754"); кусок кода из VPP Admin Tools мода https://steamcommunity.com/sharedfiles/filedetails/?id=1708571078 Баньте товарищей, т.к. админка VPP в чистом виде эксплоит для авторов мода на ваших серверах. Мод этот в чистом виде эксплоит, прописывающий авторов мода в админ права на ваших серверах скрытно. Факт такого случая пойман на 1 из серверов знакомого, при том что самой прописи нет в файлах сервера. Скриншоты приложены, как видите прописи нет, прав нет, а в логах есть. Как такое могло быть? Ответ прост, их данные прописаны в коде их мода. Совпадение? Решать вам!
  37. 0 points
    Вот нашел мод, может надо будет кому https://steamcommunity.com/sharedfiles/filedetails/?id=1878060278&searchtext=no+kill
  38. 0 points
    BorizzK

    Пропадают авто

    подловить момент пропажи и выложить сюда можно еще в конструкторе CarScript сдалать вывод лог о спавне тачки и в деструкторе о деспавне
  39. 0 points
    123new

    пвп после рестарта

    а кто мешает сделать в нем папку, например Trader1, Trader 2 и т.п., и в них класт ьсвои эти конфиги разные, а потом попросту активный подменять на нужный батником? Насчет с 1 по 5 не понял, это же делается абсолютно также в батнике прописыванием нужных файлов, ну либо хоть всю папку через xcopy копируй
  40. 0 points
    Папку storage_1 что бы сделать полный вайп.
  41. 0 points
    Вижу сходство мда)))
  42. 0 points
  43. 0 points
    юзаю СОТ-всё на месте...Странно. Без бумаги-сервер мод в мастерской NoPaperLitter..
  44. 0 points
    BLACK21

    Проблемы с BEC

    Есть дискорд? Пиши ♤ BLACK ♤#8256 Будем разбираться)
  45. 0 points
    { "active":1, "chance":1, "nominal":1, "restock":0, "timeOffset":0, "lifeTime":0, "missionRespawn":0, "timeRespawn":1800, "missionSafeSpawnRadius":100, "safeRadius":150, "distanceRadius":0, "cleanRadius":950, "sendInfo":1, "textInfo":"Beware of radiation disaster near #pos", "showInMap":1, "mapTitle":"Nidek radiation zone", "position": [ [6136.28,0,8179.62,0] ], "positionOffset":0, "radiusOfRadiation":[950,950], "strengthOfRadiation":[5,5], "enableDeactivation":0, "visualEffect":1, "loot":[ { "className":"alp_Barrel_Yellow", "position":[0,0,0], "yaw":0, "pitch":0, "roll":0, "cargo":[ { "title":"Medic_1", "chance":0.5 }, { "title":"Medic_1", "chance":0.5 }, { "title":"Food_1", "chance":0.5 }, { "title":"RadSuit_1", "chance":0.5 }, { "title":"Pistols_1", "chance":1.0 }, { "title":"Ammo_1", "chance":1.0 }, { "title":"Ammo_2", "chance":0.5 }, { "title":"Ammo_2", "chance":0.5 }, { "title":"Ammo_2", "chance":0.5 }, Вот вроде пример, но я не понимаю как тут все прописывать, вот смотри под класснеймом бочка есть [0,0,0] в них надо что то вписывать и еще "position": [ [6136.28,0,8179.62,0] ], Вот тут координаты, что за что отвечает там x или y и я так понял тут не надо вписывать z?
  46. 0 points
    paranoyk

    Cерверный ФПС

    ....а вот список забаненых в него воткнуть было бы приятственно. Как упоительны обновы по утрам.... "Админы сволочи" и вайпы и загрузки... Ах, мод с обновой снова перегрузки.... Как упоительны обновы по утрам....
  47. 0 points
    123new

    Химза

    значит касаемо радиации. scripts\4_World\classes\playermodifiers\modifiers\biohazzard.c при активации зоны (входе игрока) override protected void OnActivate(PlayerBase player) { if (player.GetNotifiersManager()) player.GetNotifiersManager().ActivateByType(MedicalAttentionNotifiers.NTF_POISONED); } при деактивации зоны (выходе игрока) override protected void OnDeactivate(PlayerBase player) { if (player.GetNotifiersManager()) player.GetNotifiersManager().DeactivateByType(MedicalAttentionNotifiers.NTF_POISONED); } во время нахождения в зоне игрока override protected void OnTick(PlayerBase player, float deltaT) { int count = player.GetSingleAgentCount(MedicalAttentionAgents.UNKNOWN_TOXINE); int countMax = PluginTransmissionAgents.GetAgentMaxCount(MedicalAttentionAgents.UNKNOWN_TOXINE); float protection = (float)player.m_SuitProtectionLevel / 100; if (protection > 1) { protection = 1; } float accumulationRate = 0; if (protection == 1) { accumulationRate = 0.278; //PluginTransmissionAgents.GetDieOffSpeed(MedicalAttentionAgents.UNKNOWN_TOXINE); } else // protection < 1 { float accumulationTime = Math.Lerp(MAGlobals.Get().g_ToxinAccumulationTimeMin, MAGlobals.Get().g_ToxinAccumulationTimeMax, protection) * 60; accumulationRate = (float)countMax / accumulationTime + 0.278; } float amount = accumulationRate * deltaT; if (count + amount > countMax) { amount = countMax - count; } player.InsertAgent(MedicalAttentionAgents.UNKNOWN_TOXINE, amount); // Obsolete float damage = MAGlobals.Get().g_BiohazardDamage * (1 - protection); player.AddHealth("GlobalHealth", "Health" , damage * deltaT * -1); } что дописывать: EntityAI attachment = player.FindAttachmentBySlotName("Mask"); if ( attachment && attachment.IsItemBase() ) { ItemBase item = Class.Cast(attachment); string className = item.GetType(); if ( className.Contains("GP5GasMask") ) { itemEnt.SetHealth("","",itemEnt.GetHealth() - 0.2); } } ну и по аналогии с нужными слотами в инвентаре и id вещей блоки делаем (я просто понятия не имею из чего там сет состоит и куда крепится). В примере если в слоте масок найден гп5 то здоровье предмета на 0.2 уменьшится. id слотов можешь найти в скрипте например тут Что модифицировать - думаю функцию OnTick
  48. 0 points
    Багемия для армы 3 так постоянно делает, выгружает какие то основные модели чтоб мододелы понимали как это работает, но в дейзет всем класть по этому dayzsib поможет 😉 Здесь Штаны и Курта Dayz Standalone 1.06, модель полностью разбинареная + конфиг - для мододелов которые хотят создать реально одежду, а не тупо перерисовать текстурку.... но не знаю не название нужных лодов не поинты скилета В архиве есть 2 файла 1. Hunting_jacket_F это модель разбинареная в которой собраны 3 основных LODa а) Лот основной с 1 по 7 с каждым увеличением числа будет видна модель от расстояния + от настроек детализации - это визуальный лод б) Геометрия - она нужна если вы хотите добавить коллизию на объект - но одежда используется как прокси, на классе men а значит не учитывается в данном случаи в) Визуальная геометрия - она нужный для вчитывания урона - - но одежда используется как прокси, на классе men а значит не учитывается в данном случаи г) Каждое наживание в 1 - 7 лоде связано со скилетом и имея правильное название на вашей модели вещь будет повторять тело персонажа на котором она надета... д) Если выделить нужную область она подсвечивается так же делайте на своей модели 2 файл model.cfg в нем прописаны связи к скелету... Это только для ознакомительных целей! если додумаетесь их забинарить и закинуть в игу с небольшим изменениями, вас багемия застрайкает! HunterPants_f.rar Hunting_jacket_F.rar Буду благодарен за плюсики они мотивируют заливать больше гайдов или информации для помощи мододелам.
×
×
  • Create New...

Important Information

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