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

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

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

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

    Use services of the guarantor
    We will make your deal safe
Miduznya

карта чернорусьПлюс для арма3

Recommended Posts

Нашел на просторах инета, версия 0.61 вроде а3тв ;) из файлов и папок только

addons
keys

logo.paa

mod.cpp в нем следующий текст, ссылки убраны в файле

name = "A3TW: ChernarusPlus 0.58k";
hideName = "false";
picture = "logo.paa";
hidePicture = "false";
description = "Arma 3 Tactical Warfare: Chernarus Plus";
author = "********* (A3TW Team)";
actionName = "Website";
action = "**************";

сервер за основу @Desolation_REDUX
пытался в файл миссии добавить но так и не разобрался
есть идеи подсобите плиз, уж хочется запустить и побегать там хоть убейте.

Edited by Miduznya (see edit history)

Share this post


Link to post
Share on other sites









5 часов назад, Miduznya сказал:

Нашел на просторах инета, версия 0.61 вроде а3тв ;) из файлов и папок только

addons
keys

logo.paa

mod.cpp в нем следующий текст, ссылки убраны в файле


name = "A3TW: ChernarusPlus 0.58k";
hideName = "false";
picture = "logo.paa";
hidePicture = "false";
description = "Arma 3 Tactical Warfare: Chernarus Plus";
author = "********* (A3TW Team)";
actionName = "Website";
action = "**************";

сервер за основу @Desolation_REDUX
пытался в файл миссии добавить но так и не разобрался
есть идеи подсобите плиз, уж хочется запустить и побегать там хоть убейте.

написано же, что от 0,58к.

тебе вообще для каких целей карта нужна?

Share this post


Link to post
Share on other sites

AntonivkA 

В 01.05.2019 в 05:21, AntonivkA сказал:

написано же, что от 0,58к.

тебе вообще для каких целей карта нужна?

хотел для себя сделать сервер побегать, всплакнуть так сказать)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

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

Create an account

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

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By bountystory
      Всем привет, столкнулся с такой проблемой, поставил новую карту, появились объекты по типу : Деревья, дома и т.д от старой карты, пробовали убирать их через редактор карты, но ничего не помогло, либо делали что то не так, есть какой нибудь совет ? 
    • By vitacite
      Добрый день. Решил запилить тутор по портированию SATA и MASK карт из ARMA2/ARMA3.  Как источник текстур я использовал аддон CA для Arma3. А в качестве источника исходного проекта выложенные самими Бегемотами в открытый доступ модели и карты для ARMA2 в незабинаренном виде, включая .wrp файл.  Arma 2 Sample Models - от бегемотов  (там все модели карты и материалы для Arma 2, незабинаренные, но без текстур) Так что никаких авторских прав мы не нарушили.. но текстуры придется собирать из пакета CA для ARMA3.
       
      Карта была выбрана за малый размер 2048 на 2048, и содежание, (на мой взгляд это лучший пост.апокалиптический сеттинг на Арма 2, да и на Арма 3.  Гуляешь по этой карте и понимаешь - пушной зверек настал).  

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Сразу скажу, что .wrp карты импортировался без проблем и сразу подгрузил высотку и все модели (деревья и перекрестки понятное дело улетели вверх, часть моделей без текстур, но про это не сейчас). А вот "маску" и "сатку" пришлось собирать что говориться по частям.Нарезанные на слои спутниковая карта и ее маска находятся в папке 
      P:\ca\ProvingGrounds_PMC\data\Layers
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Обе они находятся там в нарезанном виде по слоям с учетом нахлеста (т.к. один слой заходит на другой при нарезке). Число этих слоев (layers), размер нахлеста (overlap) изначально при создании карты указываются в настройках mapframe. Соответственно мы должны собрать это все обратно.
       
      Для начала все эти текстуры из .paa надо конвертировать в .tga, формат доступный к редактированию в фотошоп. А их (слоев) много...

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      к слову сказать, .rvmat из папки сразу удаляем, она нам не пригодиться больше. С текстурами поступаем хитрыми образом. Из пакета DayzTools в корень диска P: копируем файл ImageToPAA.exe и конфиг TexConvert.cfg, создаем батник PAA2TGA_CONVERT.BAT с следующим содержимым - 
      @echo off FOR /F "tokens=1* delims=. " %%A in ('dir /b *.paa') do (P:\ImageToPAA.exe %%A.paa %%A.tga) После чего все что надо сделать для "пакетной" перекодировки *.paa в *.tga это скопировать данный батник (только батник) в папку с текстурами и запустить, после окончания работы получим перекодированные в формат *.tga файлы. Далее батник из папки, а так же текстуры *.paa можно смело удалить. Нам понадобиться только *.tga
      Всего в исходном варианте карты 6X6 слоев пронумерованных от 0-ля до 5-ти.  Соответственно верхний левый квадрат маски будет в нашем случае M_000_000_lca.tga нижний правый M_005_005_lca.tga, верхний левый квадрат спутниковой карты S_000_000_lco.tga нижний правый s_005_005_lco.tga.
       
      При склеивании всего этого добра в ручную в фотошопе следует учитывать следующее..
      1. Что все эти слои избыточны, т.е. нам придется накладывать слой на слой внахлест быть внимательными делать верхний слой прозрачным и подгонять по пикселям.
      2. У крайних слоев будет размытый край, который мы будем сдвигать за пределы холста, он нам не нужен, поэтому опять же делаем максимальное увеличение и двигаем осторожно и не дыша ручками. Особенно это касается самого первого верхнего квадрата, его надо выставть идеально, т.к. все остальное будет равняться по нему. 
      3. Сначала делаем SATA-map т.к. с маской все несколько сложнее..
       
      Технология следующая - создается пустой файл размером с предполагаемую сатку - 2048 x 2048, выставляется верхний левый квадрат S_000_000_lco.tga таким образом чтобы размытая часть ушла за грань холста, нам нужна только картинка. 

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Поэтому делаем все на большом разрешении (помимо того, что оно поможет разглядеть границу перехода, оно еще и обеспечивает плавное движение картинки) тут главное не переборщить, т.к. если будет сильная пиксализация то позиционировать будет сложно. Убедившись что все правильно закрываем слой на замок (дабы не сдвинуть) 
      За тем открываем следующий Layer - и копируем его в нашу будующую сатку поверх первого слоя..
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Как видно на скриншоте, "нахлест" занимает почти треть от верхнего слоя. Так что пользуемся прозрачностью, позиционируем 2-лайер и выравниваем по правому краю.. 
      Ну собственно все, далее повторяем, пока не получим полноценную sata map, как на первом скриншоте..
      В моем случае это заняло около 30-40 минут. Когда все готово и мы убеждаемся, что все сошлось и без косяков, сохраняем в *.psd со всеми слоями исходник (малоли найдем косяк, а склеивать второй раз...) затем сохраняем в формате _lco.tiff и c указанием на то что это satamap
      С маской повторяем все тоже самое сответственно, НО! там есть ньюанс. Когда terrainbuilder генерит слои.. то маску он делает по своим принципам. Поэтому маска содержащая разное число текстур может оказаться разного цвета... и это было для меня сюрпризом..

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      На скрине слева маска из трех цветов, справа маска из двух цветов.. В случае с pwg т.к. цветов мало, я вышел из ситуации просто скопиров цвета из красного канала в зеленый, а красный залил черным цветом, чтобы привести маску в однообразие. 
      В моем случае вышло черный - грязь, зеленый трава, красная дорога, так же на маске отстуствовала текстура для всем известной воронки... (изначально она накладывалась отдельно), поэтому я не стал выпендриваться, а обвел воронку синим карандашом в отдельном слое уже после сборки mask-map.
      Короче полтора часа работы и я стал обладателем спутниковой карты и детальной маски размером 2048 на 2048... 
      Далее в фотошопе можно узнать код палитры маски для каждого цвета, и внести соответствующие изменения в Lyaer.cfg.  Текстуры сильно рекомендую использовать стандартные из Dayz, 

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Теперь надо создать нормаль, т.к. без нее на карте любые клатеры (трава и тд), будет отображаться с кривыми тенями и белым ореолом.
      Для этого выгружаем из terrain Builder карту высот в формате .asc Загружаем путем импорта в программу L3DT - (доступна бесплатно). Сохраняем куда-нибудь в temp проект (он нам больше не понадобится, только временно чтобы сгенерировать эту самую нормаль)
      И генерируем нормаль карты.

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Далее выгружаем полученную normalMap в формате .bmp из L3DT. Закрываем L3DT, открываем Photoshop, открываем нашу нормаль, отражаем по вертикали, удаляем синий слой. сохраняем в папке 
      DATA нашей карты под именем  global_nohq.tga. Подвязываем ее в конфиг в строке
      terrainNormalTexture = "vwe\zone\worlds\prgrnd\data\global_nohq.paa"; Cобственно все. Папка моего проекта vwe\zone\worlds\prgrnd\  cоответственно все листинга привязаны к ней.
      листинг Layers.cfg
      class Layers { class cp_tiled { material = "DZ\surfaces\data\terrain\cp_concrete1.rvmat"; }; class cp_rock { material = "DZ\surfaces\data\terrain\cp_rock.rvmat"; }; class cp_gravel { material = "DZ\surfaces\data\terrain\cp_gravel.rvmat"; }; class cp_concrete1 { material = "DZ\surfaces\data\terrain\cp_concrete1.rvmat"; }; class cp_concrete2 { material = "DZ\surfaces\data\terrain\cp_concrete2.rvmat"; }; class cp_broadleaf_dense1 { material = "DZ\surfaces\data\terrain\cp_broadleaf_dense1.rvmat"; }; class cp_broadleaf_dense2 { material = "DZ\surfaces\data\terrain\cp_broadleaf_dense2.rvmat"; }; class cp_broadleaf_sparse1 { material = "DZ\surfaces\data\terrain\cp_broadleaf_sparse1.rvmat"; }; class cp_broadleaf_sparse2 { material = "DZ\surfaces\data\terrain\cp_broadleaf_sparse2.rvmat"; }; class cp_conifer_common1 { material = "DZ\surfaces\data\terrain\cp_conifer_common1.rvmat"; }; class cp_conifer_common2 { material = "DZ\surfaces\data\terrain\cp_conifer_common2.rvmat"; }; class cp_conifer_moss1 { material = "DZ\surfaces\data\terrain\cp_conifer_moss1.rvmat"; }; class cp_conifer_moss2 { material = "DZ\surfaces\data\terrain\cp_conifer_moss2.rvmat"; }; class cp_grass_tall { material = "DZ\surfaces\data\terrain\cp_grass_tall.rvmat"; }; class cp_grass { material = "DZ\surfaces\data\terrain\cp_grass.rvmat"; }; class cp_dirt { material = "DZ\surfaces\data\terrain\cp_dirt.rvmat"; }; }; class Legend { picture = "\vwe\zone\worlds\prgrnd\source\mapLegend.png"; class Colors { cp_rock[] = {{0,0,255}}; //скала использовал в воронке cp_gravel[] = {{0,255,0}}; //гравий cp_concrete1[] = {{255,0,0}}; // бетон под дорогой, бетон, строения cp_dirt[]={{0,0,0}}; // грязь }; }; листинг config.cpp
      class CfgPatches { class vwe_zone_worlds_prgrnd { requiredAddons[] = {"DZ_Data"}; }; }; class CfgWorlds { class CAWorld; class ProvingGrounds_vwe: CAWorld { description = "ProvingGrounds_vwe"; longitude = 30.0; latitude = -45.0; worldName = "vwe\zone\worlds\prgrnd\world\ProvingGrounds_vwe.wrp"; cutscenes[] = {}; class Navmesh { #include "cfgNavmesh.hpp" }; startTime = "14:20"; startDate = "11/10/2011"; centerPosition[] = {1024.0, 1024.0, 300.0}; clutterGrid = 1.0; clutterDist = 125.0; noDetailDist = 65.0; fullDetailDist = 10.0; volFogOffset = 0; terrainNormalTexture = "vwe\zone\worlds\prgrnd\data\global_nohq.paa"; class OutsideTerrain { satellite = "DZ\worlds\chernarusplus\data\outside_sat_co.paa"; enableTerrainSynth = 1; class Layers { class Layer0 { nopx = "DZ\surfaces\data\terrain\cp_grass_nopx.paa"; texture = "DZ\surfaces\data\terrain\cp_grass_ca.paa"; }; }; }; // 2d map location names class Names {}; // 2d map grid class Grid { offsetX = 0.0; offsetY = 0.0; class Zoom1 { zoomMax = 0.15; format = "XY"; formatX = "000"; formatY = "000"; stepX = 100.0; stepY = 100.0; }; class Zoom2 { zoomMax = 0.85; format = "XY"; formatX = "00"; formatY = "00"; stepX = 1000.0; stepY = 1000.0; }; class Zoom3 { zoomMax = 1e+030; format = "XY"; formatX = "0"; formatY = "0"; stepX = 10000.0; stepY = 10000.0; }; }; ilsPosition[] = {0.0,0.0}; ilsDirection[] = {0.0,0.0,0.0}; ilsTaxiIn[] = {0.0,0.0}; ilsTaxiOff[] = {0.0,0.0}; drawTaxiway = 0; class SecondaryAirports {}; // 2D map item params mapDisplayNameKey = "Порт карты ProvingGrounds из Арма 2"; mapDescriptionKey = "Порт карты ProvingGrounds из Арма 2 в Dayz"; mapTextureClosed = "dz\gear\navigation\data\map_chernarus_co.paa"; mapTextureOpened = "dz\structures\signs\tourist\data\karta_co.paa"; mapTextureLegend = "dz\structures\signs\tourist\data\karta_side_co.paa"; userMapPath = "dz\gear\navigation\data\usermap"; minTreesInForestSquare = 10; // for 2d map (also affects forest controller) minRocksInRockSquare = 5; // for 2d map soundMapAttenCoef = 0.01; // sound map params class SoundMapValues { treehard = 0.03; treesoft = 0.03; bushhard = 0.0; bushsoft = 0.0; forest = 1.0; house = 0.3; church = 0.5; }; class Sounds { sounds[] = {}; }; // ambient life (flies, leaves,..) class Ambient {}; }; };  
       
       
       
       
    • By vitacite
      Доброго времени суток комрады.  После успешного портирования карты 2048 на 2048 ProvingGrounds
      https://s-platoon.ru/topic/9864-portirovanie-sata-i-mask-map-iz-arma2arma3-v-dayz/
      решил исполнить свою "детскую мечту" и сделать ее большой ;)))) С этой целью для начала я решил увеличить ее в два раза.  И хотя уважаемый Олбиванкиноби задавал вопрос - а на х..я . Ну вот чтобы было.
      Увеличение карты требует, как минимум увеличения трех маски, сатки и карты высот.
       
      1.  Создание карты высот. 
      Оригинальная карта высот имеет Grid Size 512 px и превращается в 2048 путем умножения на Cell Size 1 px = 4 м. Мы не можем менять размер сетки в 4 т.е. это повлечет координальные изменения в том числе по отношению к установленным на карту объектам.  Поэтому путем умножением 512 x 2 приходим к следующим параметрам. 1024 px Grid Size и прежний Cell Size 1 px = 4 м.  Для успешного портирования узнаем среднюю высоту оригинальной карты высот для ProvingGrounds в моем случае 52 метра и создаем, используя l3DT пустую поверхность размером 1024 на 1024, и высотой 52 метра.

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

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Таким образом мы получим ровную поверхность размером 1024 px.  Координатная сетка в террейн билдер начинается с левого нижнего угла.  Соответственно туда мы и будем вставлять "родную" высотку 
      ProvingGrounds   Для этого в меню Layer выбираем ImportLayer, выбираем нашу высотку в 512 px. и выставляем формат Layer Type = Height Field 
       

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

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

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

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      На скрине видно, что помеченная карта высот 512 встала в нижний угол, т.к. крайний нижний угол это 0, то все объекты с карты останутся на своих местах, правда наращивать карту придется вверх и вправо, ну и фиг с ним.  Чернота вокруг = это 0 высота. Поэтому если не хотите мучаться с перепадами с 52 метров до 0 и тд. заранее поменяйте высоту на карте на среднюю высоту исходника.

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Собственно самая сложная часть процесса готова сохраняем полученный результат с размером 1024 px. 
      Сатка и Маска позиционируются в фотошоп по такому же принципу в 0 координату левый нижний угол.  А дальше все будет зависить от умения пользоваться карандашом (маска)

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

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

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

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

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Результат после перенаразки лайеров и изменения размерности, собственно все на своих местах.
      Было
       
      Grid Size 512 x 512
      Cell Size 4
      Terrain Size 2048 
       
      стало
       
      Grid Size 1024 x 1024
      Cell Size 4
      Terrain Size 4096
       
       
       
       
       
       
       
       
    • By vitacite
      При создании собственной карты, если мы хотим, чтобы все работало корректно, мы должны использовать специальную текстуру нормали.  Если в  Арма 3, нормаль была совсем не обязательным фактором, подцеплялась при желании в террейн билдер, и нарезалась в виде слоев, вместе с тектурами sata- и mask- map. То в Dayz все выглядит координально иначе. Для начала она подцепляется не в террейн-билдере (хотя рудиментальная возможность этого сохранилась), а через конфиг карты и служит абсолютно конкретной цели - без нормали тень от клаттеров (травы и тд). на текстурах не работает корректно. Без нормали (любой) появятся белые артефакты, по контуру травы.  Собственно информацию об этом можно подчерпнуть из конфига демонстрационной карты в Dayz-Samples Utes
              // normal map for shadowing of grass-clutter (пер. карта нормалей для затенения травы-клаттеров)         terrainNormalTexture = "samples\test_terrain\data\utes_global_nohq.paa"; Теперь о том, как выглядит нормаль для карты в Dayz 🙂  А выглядит она вот так..

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Мало того что она желтая, она еще и отражена по вертикали! Для сравнения я привел слева сата-мап, справа нормаль от нее 🙂Почему она перевернутая я Вам не расскажу, но поверьте это так. Перейдем к изготовлению ее для вашей карты.  Если у Вас есть карта высот,  Вы без труда можете изготовить нормаль в программе типа L3DT. 

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

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Полученный результат экспортируем в формат .bmp и открываем фотошоп, в фотошопе и заливаем синий канал черным цветом.

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Теперь через редактирование->трансформирование->отражение по вертикали - переворачиваем ее.

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      И сохраняем в папку data вашей карты в формате *.tga, конвертируем используя textview в *.paa  и собственно Ваша нормаль готова. Все что осталось сделать подвязать ее в конфиге путем изменения параметра на путь к вашей карте.
      terrainNormalTexture = "папка_проекта\моя_карта\data\моя_карта_global_nohq.paa"; PS:  огромное спасибо SteelRat за то что помог разобраться с этой темой.
      Всем бобра.
       
    • By 123new
      И так, ребятки, вот вам небольшая 'полезняшка' от меня, и совершенно бесплатно!
       
      Описание:

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      или создать их самим со следующим содержанием:
      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); // Чтобы удалить с персонажа уже имеющиеся стандартные стартовые шмотки раскомментировать строку DefaultSets(player); // Для выдачи своих сетов по рандому всем игрокам, не прописанным в скрипте, раскомментировать эту строку break; } } } void SetRandomHealthItem(EntityAI itemCreated) // Функция генерирует и применяет для предмета рандомное значение здоровья! { if ( itemCreated ) { private int rndHlt = Math.RandomInt(55,6); itemCreated.SetHealth("","",rndHlt); } } void DefaultSets(PlayerBase player) // Функция выдает сеты игрокам, не прописанным в конфигурации скрипта!!! { EntityAI itemCreated = NULL; EntityAI itemCreated1 = NULL; ItemBase itemCasted = NULL; // ниже пример, если вам нужно задать свои точки спавна для всех игроков. Этот код можно также использовать и для каждого сета индивидуально! // Код закомментирован, если это надо - раскомментируйте! // начало кода точек спавна игрока /* private array <vector> spawnpoints = {"7500 0 7500", "7500 0 7500","7500 0 7500", "7500 0 7500"}; private vector selected_spawnpoint = spawnpoints.GetRandomElement(); player.SetPosition(selected_spawnpoint); */ // конец кода точек спавна игрока private int random_set_number = Math.RandomIntInclusive(1,6); // генерируем рандом номер сета от 1 до 6 включительно (по значениям блоков case ниже) switch( random_set_number ) //Раздаем лут (можно использовать значения от 1 и выше, только не 0 и не -1) { case 1: //Set with number 1 (Сет с номером 1) { 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; } } } } 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 для отключения опции)
      Пример:
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      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 будет применено для всех игроков при респавне в случае, если им не выдан никакой сет!
      Поумолчанию в функции default вызывается функция DefaultSets, позволяющая рандомно выбирать любой из сетов для игроков, которым сет не задан в конфигурации скрипта. Принцип составления сетов такой же, как и выше. Если будете пользоваться этим, обратите вниманием на строку:
      private int random_set_number = Math.RandomIntInclusive(1,6); Эта функция генерирует число от 1 до 6 включительно. Соответственно если сетов будет больше 6, то число надо корректировать и тут тоже!
       
      P.S. Прикрепить к соспавненному оружию магазин не получится, рабочего кода я не смог найти!!
       
      Если у вас папка активной миссии сервера отличается от dayzOffline.chernarusplus то переименуйте ее в строке, вписываемой в:
              {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\init.c
              {папка с вашим сервером}\mpmissions\dayzOffline.chernarusplus\CustomSpawnPlayerConfig\init_mod.c
       
      Благодарности: Товарищу Mizev за его первоначальные гайды в группе VK при появлении в сети серверной части игры
       
       
  • Our picks

×
×
  • Create New...

Important Information

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