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

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

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

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

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

Таблица лидеров


Популярные публикации

Отображаются публикации с наибольшей репутацией на 04/01/20 во всех областях

  1. 1 балл
    paranoyk

    Спавн лута-вынос мозга.

    ©(краткая ода как я выносил себе мозг с помощью лута) Настроить лут на сервере постарались сразу после релиза ибо многое "не там и не тут".... Первая фигура Марлезонского балета. Файлов которые отвечают за лут прямым и коственным образом,судя по всему мнго,но настройки которые нам доступны сосредоточены в папке mpmissions\dayzOffline.chernarusplus и mpmissions\dayzOffline.chernarusplus\db cfglimitsdefinition.xml -файл в котором обозначены категории лута, тэги спавна, классы объектов для спавна и зоны спавна.(если я правельно понял,в информатике это называеться "заданием классов" или как то так). Даллее с чем я экспериментировал. <category name="......."/> Спавнящийся лут имеет (а может и не иметь) определенную категорию и только одну. Сюда можно вписать свою категорию и давать её предметам.(в файле тайпс) Тэги... в ванили <tag name="floor"/> <tag name="shelves"/> <tag name="ground"/> Лут может иметь или не иметь, для более точного "определения" что и где должно спавнится. Можно вводить свои и потом в mapgroupproto.xml вставлять в нужном мест. Если нет-спавнятся везде, если для лута есть тэг, только в тех местах где тэг присутствует .("пол"," полка","земля"-всего лишь для удобства и понимания, можно назвать тэг хоть "мистер питкин", без кирилицы ебстестенно, вводится в другом файле о чём ниже) Классы объектов для спавна <usage name="......."/> Стационарные объекты имеют в своём обозначении один или несколько таких классов имён. Легко можно прописать свой и дать его категории стационарных объектов или объекту. (правда уникальных объектов на карте-раз,два и обчёлся). Опять таки используется в тайпс. Лут может иметь или нет. (насчёт нескольких-не проверял, но не советую). Прописав свой к примеру "MyBox"....и потом в mapgroupproto.xml у военных контейнеров убрав все классы и оставив только этот, в нём будут спавниться только те предметы которым вы в "тайпс" пропишите данную категорию. Так же есть на карте СЕ в виде пятен, минус в том что нанесены они небрежно, результат-спавн к примеру медпредметов в машинах и киосках больницы Черногорска. Любой объект попавший в ореол получит спавн только обозначенного ореола. (после патча 1.20 стало проблематично сразу ввести новый класс, мгновенно ломается вся экономика. Приходится несколько раз пробовать с разными именами) Зоны спавна <value name="....."/> Тиры и иже с ними. Глобальные зоны на карте для определения спавна. Лут может иметь несколько или ни одного. Будет спавнится только там, если не оговорено особые условия. см опис. тайпс) И как они нанесены на карту-опять таки СЕ редактор... (картинка устаревшая). Они могут накладыватся друг на друга. Так же их можно редактировать в редакторе СЕ. mapgrouppos.xml - Файл в котором определяться координаты точки "карты" лута для каждого обьекта.(мдя,чего я счас сморозил то) То есть указывает спавнеру "в этой точке будет спанится лут по "сетке" из файла mapgroupproto " и если там ЕСТЬ описание. Это не место спавна лута конкретно, а место спавна массива координат по которым спавнится лут. Проще всего это понять если у вас есть нормальный маппинг со спавном....и убрать маппинг-лут будет спавнится в старых местах и даже висеть в воздухе. (получить все точки для "спавна" можно с помощью команд в init ) Пример: <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 - название обьекта из файла mapgroupproto ,его ID...Можно написать хоть "Мой генимальный спавн". И спавнер если найдёт в mapgroupproto объект с таким названием-заспавнит лут по сетке. (вот ещё способ как модифицировать спавн лута). pos="80.255409 113.792282 4422.158691" rpy="-0.000000 0.000000 -70.013718" - координаты центра "карты" лута для этого обьекта, совпадают с координатами обьекта формат записи X-Y-Z завал,наклон,поворот. a="........" Вектор поворота карты лута обьекта относительно самого обьекта. Как он определяется - экспериментально выяснил в принципе....(угол поворота объекта - 90)х(-1)...как то там ещё можно возиться переводить с +360, но я просто пишу полученное значение и всё работает. Да-да,именно тут прописывается что в вашей точке появляется лут и если он имеет прописанную сетку лута в mapgroupproto .(имееться ввиду в оффлайн редакторе поставив "француз"-тут вы пропишите в него лут,как прописать в он-лайн сам обьект-другая история под названием "возврат водяных колонок"). Сам объект НЕ НУЖЕН даже. Он всего лишь декорация карты и для спавна ка видите НЕ НУЖЕН. mapgroupproto.xml - Файл в котором прописана "карта" лута для объекта. Вначале идёт описание для "дефолта" ,то есть деревьев и растений,а также камней! (тут я не понял,но ...это нам и не нужно,яблоки падают и хорошо..) Пример: <group name="Land_Tisy_Barracks"> - название обьекта, ID ИЛИ придуманный вами обьект. <usage name="Military" /> - класс имени обьекта,может быть не один. (а если вы ввели свои-писать именно сюда) <container name="lootFloor" lootmax="8"> - имя "контейнера" и максимальное количество лута которое может там появиться.(количество лута может быть и не обозначено,но если есть-никогда не будет больше чем количество точек спавна что ниже. НЕ РАБОТАЕТ- можно даже не мучатся, есть подозрения что количество лута ни как не изменить именно этой переменной для обьекта. ) <category name="tools" /> - класс лута который будет спавниться в данном "контейнере" ,может быть не один. <tag name="ground" /> - тэг лута который будет спавнится.(может быть несколько). Спавн лута с этим тэгом. Если у лута нет тэга-спавн ТОЖЕ. <point pos="-2.429444 -3.799637 3.698242" range="1.199951" height="2.000000" flags="32" /> - точка спавна лута, расстояние по X-Y-Z от центральной точки "карты лута" (где она,можно выяснить только эксперементально для каждого обьекта или в редакторе или...с помощью мода). range="......." радиус спавна от заданной точки, то есть в этом "круге" будет спавниться лут.(не точно,если обьект имеет большие линейные размеры-не заспанится) height="........."-высота объекта спавна,как я понял....(не точно,если обьект имеет большие линейные размеры-не заспавнится) flags="32" - указание что спавн лута будет на уровне земли игнорируя координаты по высоте. Грубо говоря к примеру если спавн вокруг елки рождественской -весь лут будет лежать на земле. Вокруг ёлки. Или округ "воображаемой точки", если надо. ниже всё тоже самое, но для своего "контейнера" данном здании.То есть обьект может иметь несколько контейнеров. </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"> - шанс появления и его название. Тут маленькое отступление. Поначалу я тоже думал что это какие то проценты, да так легче воспринимать. Но таки и немного не так. Просто опишу как спавнер "думает". "Обьект имеет спавна внутри, получаем псевдослучайное число от 0 до 1. Сравниваем. Псевдочисло больше-нет спавна, иначе-спавн есть". Будем привычно называть его "шанс" и обозначим его как проценты, но ещё раз это НЕ ПРОЦЕНТЫ в прямом смысле. <item name="SodaCan_Cola" chance="0.11" /> - название (ID) предмета и его шанс выпадения ....................................................................... <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 - Список тех вещей, "контейнеры" в которых спавняться наборы из прошлого файла. Так же можно прописать спавн в контейнер отдельной вещи. И самое важное! Именно тут можно указать степень износа заспавненых вещей по отдельности, если степень износа не указана-вещь будет иметь износ зданный в файле globals.xml, это строчки: "LootDamageMax" и "LootDamageMin" . Но это не относится что спавнится в них, то есть наборы грузов, аттачменты и сами грузы в контейнере всегда будут "идеальны".....(но контейнером может стать и обычная вещь!) Тут же прописывается аттачменты если они есть и вы хотите заспавнитьвещь с прикреплёным аттачем. <type name="ammobox"> - название (ID) вещи-контейнера. <damage min="0.0" max="0.0" /> - этой строчки может и не быть, тогда износ будет взят из "глобалс". Означает что лут будет иметь при спавне не меньше едениц урона и не больше. То есть если выствите min=0.2 то лут всегда будет всегда иметь при спвне 20% урона. Не меньше, максимальный урон это max, поставите к примеру 0,9 то вещи даже заруиненые будут спавнится. Пороги когда вещь считается неповреждённой,а когда поношеной и тк.дл.-в другом файле и меняется уже сервер модом. <cargo preset="optics" /> -название набора который может появиться внутри с шансом( как было описано выше).... ........................................ <cargo preset="ammoArmy" /> </type> То есть можно прописать несколько наборов и если из каждого заспавниться вещь,то ограничение только "размер" контейнера и вещей. Так же тут есть наборы аттачей для зомби, о них ниже, собраны примерно также. Вторая фигура Марлезонского балета. <type name="ZmbM_PatrolNormal_Autumn"> <cargo preset="foodArmy" /> <cargo preset="ammoArmy" /> </type> Вот вам и первый "ходячий" контейнер.....Увеличив к примеру в cfgrandompresets.xml шанс выпадения данных наборов-получите "доставщиков пиццы на дом". Но не в каждом зомби такой набор и опять таки,вы можете их менять,добавлять,убирать.... А так же для зомби тут прописано что них может быть одето в виде аттачей. Не все зомби такое могут,смотреть нужно по ванильным файлам. Пример: <type name="ZmbM_HunterOld_Winter">-наш подопытный <cargo preset="foodHermit" />-набор лута в зомби <cargo preset="toolsHermit" />-набор лута в зомби <attachments preset="glassesVillage" />-какой набор может прирепится на местоаттача (очки в данном случае) <attachments preset="hatsFarm" />-какой набор может прирепится на местоаттача (кепка в данном случае) <attachments preset="bagsHunter" />-какой набор может прирепится на местоаттача (рюкзак в данном случае) <attachments preset="vestsHunter" />-какой набор может прирепится на местоаттача (разгрузка\броник в данном случае) </type> (очки ни когда не прописывайте-не работают) А дальше-оружие...(так,дышите глубже) <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"> <damage min="0.0" max="0.5" /> <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....и они,гады спавняться всегда как прописано в globals.....Стоит добавить <type name="Izh18"> <damage min="0.0" max="0.2" /> </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> (в этом же файле,ПОЗЖЕ,появились и рождественские наборы...но было уже поздно-бегемоты должны быть повешаны!) Дальше мы можем мелочь привесть к предметам,обычно это батарейка Но можно и "предмет в предмете"! Поле для извращений-огромно. Как пример: <type name="PersonalRadio"> <attachments chance="0.30"> <item name="Battery9V" chance="1.00" /> </attachments> </type> <type name="GPSReceiver"> <attachments chance="0.30"> <item name="Battery9V" chance="1.00" /> </attachments> </type> Файлы с названием по типу mapgroupcluster.xml -это тот же mapgrouppos для камней, грибов,яблок и прочего. Глыбжее,ширее,нижее. Преходим в папку db events.xml - файл в котором описаны "случайные" события,такие как зомби,полицейская волга, хеликраш, адми...тоесть петух!, ну и прочие коровы и звери. Например <event name="AnimalCow"> -название ивента. Можно прописывать свои НО! Название ивента может начинатся ТОЛЬКО строго определенно. аnimal - события с животными. static - для спавна статичных ивентов типа Ми-8 или дома... item - Для различных игровых предметов,как пример в ванили - блок досток. Infected-зомби Trajectory - спавн грибов,ягод и прочих камней <nominal>10</nominal> - Колличество ивентов на карту единомоментно.То есть сразу. Именно ИВЕНТОВ. Десять машин, десять СТАЙ волков, десять ТОЧЕК спавна зомби....(может и меньше если невозможно заспавнить ивент из-за других условий, к примеру наличие игрока на спавне) <min>6</min> - минимальное количество дочерних объектов указанных в <children> в ивенте <max>15</max> - максимальноеколичество дочерних объектов указанных в <children> в ивенте (обычно для стай волков и прочих живых организмов) Причем от 6 до 15 ВСЕХ вписанных <children>. А вот сколько конкретно каждого,это уже в них настраивается <lifetime>180</lifetime> - "время жизни" события Именно СОБЫТИЯ. То есть заспавнаня ивентом машина-пока стоит на точке спавна-это СОБЫТИЕ,как только вы отехали-это уже лут и время её жизни будет считыватся с (не кночи будет помянут сей файл) тайпса. <restock>0</restock> - на сколько будет отложен спавн ивента до номинала, когда остальные условия для начала ивента выполнены. Думате если два хеликраша они исчезнут и заспавнятся одновременно? Ага,счасЗъ. Тут зависит от много,даже от взаимодействия с ними игрока. <saferadius>200</saferadius> - это расстояние от позиции игрока, на котором может возникнуть это событие.(поставте для интреса 50 для зомби:))) <distanceradius>0</distanceradius> - минимальное расстояние от другого события.(очень актульно для машин, решать вам) <cleanupradius>0</cleanupradius> - это расстояние от позиции игрока, на котором событие исчезнет после того, как время жизни закончится. (добвлено- для хеликрашей имхо лучше ставить ОЧЕНЬ большое,с хороший километр) <secondary>InfectedArmy</secondary> - это имя другого события, которое вы хотите вызвать одновременно с этим событием, например, чтобы вызвать зомби вокруг здания или предмета. Настраивается в дочернем событии.(можно создать свой, но смешать зомбей с волками-не получится, генетика не та) <flags deletable="0" init_random="0" remove_damaged="1" sec_spawner="0"/> -флаги настройки deletable 1/0 - ивент удалятеся согласно параметрам самого события или по истечению времени в тайпс (не точно)...ИМХО init_random 1/0 - ??? remove_damaged 1/0 - будет ли событие удаляться если достигла состояния "уничтожено" или останется лежать до истечения срока события.(актуально для машин...но ТОЛЬКО НА ТОЧКЕ СПАВНА!) sec_spawner="0" - сорри не знаю, а чего не знаю-не меняю. <position>fixed</position> <position>player</position> - позиция будет выбираться из зафиксированых в файле cfgeventspawns.xml или событие срабатывает "на игрока". <limit>.......</limit> - может быть следующии custom - относится к внешнему файлу, например, для территорий животных. child - событие будет обращатся к атрибутам min и max каждого дочернего элемента parent - lотносятся к минимальным и максимальным атрибутам самого события mixed - будет учитыватся и дочерние и собсвенное min-max события <active>1/0</active> - включение и выключение события.(Вот она кнопка!) <children> <child lootmax="0" lootmin="0" max="3" min="0" type="Animal_BosTaurusF_Brown"/> lootmax="0" lootmin="0" ....если предмет имеет сетку лута или контейнер -колличество лута при спавне (а теперь фокус, если в ивенте есть <secondary> с зомбями то их колличество будет равно.... мин + макс) max="3" min="0" ......минимальное и максимальное колличество дочерних обьектов. (к примеру-коров данного типа в стаде) types.xml-великий и ужасный.Содержит в себе данные о всём спавнещемся луте и контейнерах (хеликраши,машины,зомби-по сути-контейнеры). Всякий лут должен быть в этом файле иначе-нет его спавна на карте. Также и синтаксическая ошибка в этом файле приводит к исчезновению всего лута с карты. Если из него убрать что-то,(но этот предмет останеться лежать на земле до истечения срока)....и игрок его поднимет-краш.Так что файл требует трезвого ума и терпения. <type name="Canteen"> - Название ID предмета <nominal>30</nominal> -номинальное колличество спавна на карте к которому стремиться "спавнер". <lifetime>7200</lifetime> - время "лежания" предмета после спавна ( а также судя,по всему-время после падения на землю с игрока).в сек. (на параметр не влияет ускорение времени на сервере, но влияет параметр из скриптс-"колличество тактов в секунду") <restock>0</restock> - на сколько будет отложен спавн предмета до номинала, когда остальные условия для начала спавна выполнены. "задержка спавна". <min>20</min>- минимальное колличество предмета на карте после которого начинаеться работа спавнера. <quantmin>-1</quantmin> - если предмет "бутылка-магазин"-степень его наполнения минимальная - Для остальных значение -1 <quantmax>-1</quantmax> - если предмет "бутылка-магазин"-степень его наполнения минимальная - Для остальных значение -1 (теперь это значение работает и для оружия у котрого нет "сьёмного" магазина, типа СКС или 133 ружжа) <cost>100</cost> - приоритет спавна грубо говоря. чем меньше-тем ниже будет вещь в очереди. <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/> -Флаги спавнера, они указывают в каких типах объектов считать nominal и min значения: count_in_cargo - считает все предметы в контейнерах, ящики, рюкзаки, включая автомобили count_in_hoarder - будет считаться в таких вещах как закопанные предметы, бочки, сундуки и всевозможные палатки count_in_map - объекты, размещенные на карте (здания) count_in_player - внутри инвентаря игроков, исключая руки (учёт для игроков онлайн, проверяется) crafted - указывает на то, что данный предмет может быть закрафчен игроками deloot - указывает что это объекты для спавна на динамических ивентах (событиях). (хеликрашыи, крушения поездов, дтп и прочее) <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> Теперь в лучшем случае дробаш там будет. Ну,как то так.... Запрещено копирование данной статьи без соглосование с Администрацией и автором на другие ресурсы. All Rights Reserved
  2. 1 балл
    AKuznecov

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

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

    Редактирование серверных scripts без pbo файлов

    Что то не нашел такой темы, а в свое время когда сервером начал заниматься чутка попотел в этом моменте, Может кто не знал есть 2 интересных момента у сервера 1. если не загружать .bisign в мод на сервере то файл мода не требуется на клиенте, надеюсь это все знают... 2. функция include работает с корнем папки сервера и не только но нам нужен корень Загружаем мод в котором прописаны для 3_Game 4_World 5_Mission я про class gameScriptModule { value = ""; files[] = {"ServerListMod/scripts/3_Game"}; }; class worldScriptModule { value = ""; files[] = {"ServerListMod/scripts/4_World"}; }; class missionScriptModule { value = ""; files[] = {"ServerListMod/scripts/5_Mission"}; }; в этих файлах создаем инклюиды по такому типу #include "$CurrentDir:\\ServerListMod\\scripts\\3_Game_modded.txt" для 3 #include "$CurrentDir:\\ServerListMod\\scripts\\4_World_modded.txt" для 4 #include "$CurrentDir:\\ServerListMod\\scripts\\5_Mission_modded.txt" для 5 далее создаем ServerListMod с нужными текстовыми файлами 3_Game_modded 4_World_modded и 5_Mission_modded а в них пишем например в 4_World_modded.txt modded class GameConstants { const int STAMINA_DRAIN_STANDING_SPRINT_PER_SEC = 2; // 4 в единицах (насколько спринт истощает выносливость) } и за 5 секунд правим стамину или что то еще и не нужно грузить сотни модов с воршопа стима... если мод серверный просто содержимое мода кидаете в нужный файл так же особенность можно инклюдить в разные файлы я например создал еще кучу файлов под каждый мод и очень удобно обновлять каждый мод при обнове стима. добавил пример такого мода @ServerListMods.rar Если помог поставь +
  4. 0 баллов
    nIkRon

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

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

    Лимит построек на карте

    по такому принципу dayzOffline.chernarusplus.rar
  6. 0 баллов
    paranoyk

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

    Дык СЕТКУ лута для этого здания сделай отдельную.Как пример....скажем тюряга на Кабанинке. Она прописана как Land_Mil_Barracks5 в mapgroupproto. Копируем полностью группу и вставляем в файл назвав уже Land_Mil_Barracks5_Paranoyk_genij Допустим ты создал новый тип лута под названием "pisec".... Вписываешь его только в созданную сетку. (только желательно знать, примерные габариты предметов что бы он МОГ спавнится) Далее идём в файл mapgrouppos. (надеюсь вы знаете как узнать координаты нужного здания и найти его в файле) И меняем Land_Mil_Barracks для кабанки на Land_Mil_Barracks5_Paranoyk_genij.....Всё,это единственное здание будет с таким лутом.
  7. 0 баллов
    NightWolf

    Редактирование серверных scripts без pbo файлов

    юзай поиск
  8. 0 баллов
    NightWolf

    Редактирование серверных scripts без pbo файлов

    не так путь другой там или 4 ворд или 5 миссион должен быть в пути так ты понимаешь в какую папку кидать далее в самый верх где нашел эту строку поднимаешься и будет что то типа class GameConstants или class MissionServer пишешь modded class MissionServer { и тут код, подробнее изучай в этом разделе как создавать мод там есть куча инструкций }
  9. 0 баллов
    NightWolf

    Редактирование серверных scripts без pbo файлов

    а тебе и не надо упаковывать, файл уже готов кидаешь создаешь как в примере тхт файлы а в НИХ уже правишь scripts
  10. 0 баллов
    thessend

    Как запретить крафт модовых предметов?

    Моддишь класс рецептов modded class PluginRecipesManagerBase { override void RegisterRecipies() { super.RegisterRecipies(); UnregisterRecipe("CraftWoodenCrate"); } } это можно сделать на серверной части.
  11. 0 баллов
    BorizzK

    DAYZ enScript (вопросы, ответы)

    VIRrusR Ну так вот //AUTHOR: elanc s-platoon.ru //EDITOR: BORIZZ.K s-platoon.ru //VERSION: 29.04.2019.1355 enum ZoneType //Это для удобства - перечисление //Zones types { SAFE = 1, //1 PVP, //2 GAS, //3 CHEM, //4 BIO, //5 RAD, //6 DAMAGE //7 } class Zone //Этот Класс используется для хранения параметров зон - для каждой зоны создается свой экземпляр класса //Zone container. Instance for each zone - see AddZone functions ( ref Zone zone = new ref Zone; ) { //Переменные класса: 22 параметра и 1 массив игроков в зоне //Зона string name; //имя зоны int id; //номер зоны vector center; //центр зоны float radius; //радиус зоны int type; //тип зоны (см ZoneType) //Приближение к зоне float warndistance; //расстояние приближения к зоне - если 0 сообщения не выводятся - warnenabled = false; bool warnenabled; // string warnmessage; //сообщение при нахождении рядом с зоной (по warndistance) //Вход в зону bool entermsgenabled; //вкл/выкл сообщение при входе в зону string entermessage; //сообщение при входе в зону //Нахождение в зоне bool messageenabled; //вкл/выкл сообщенияе при нахождении в зоне string message; //сообщение при нахождении в зоне int repeatmsgstep; //Шаг повтрения сообщений в зоне //in pogress // если repeatmsg = true и repeatstep = 0 - поторения не будет, repeatstep = 1 - повторение каждую итерацию и тп - 0 - повторения отключены - repeatmsg = false; bool repeatmsg; //Выход из зоны bool exitmessageenabled; //вкл/выкл сообщение о выходе из зоны string exitmessage; //сообщение о выходе из зоны //Дамаг игроку и симптомы float player_Dmg_Coef; //коэффициент повреждения для игрока float player_Health_Threshold_Symptom; //порог здоровья после которого применяются симптомы int player_Symptom; //симпотом для данной зоны //Комплект экипировки для проверки ref TStringArray complect; //комплект вещей для проверки //in pogress //массив требует инициализации - создании его экземпляра (complect = new TStringArray ;) для каждого экземпляра - иначе он бощий ref TStringArray checkslots; //слоты для проверки //Дамаг экипировке float item_Dmg_Coef; //коэффициент повреждения для вещей игрока float item_Health_Threshold; //порог здоровья для вещи после которого начинается наноситься урон персу игрока //Игроки в зоне ref map<PlayerBase, int> playersInZone; //массив - игроки находящиеся в данной зоне //1 - player, 2 - player id //массив требует инициализации - создании его экземпляра (playersInZone = new map<PlayerBase, int>;) для каждого экземпляра int repeatMessagesCurrentStep; bool messageSkip; void Zone() //Это конструктор. При создании нового экземляра "зоны" он будет выполняться. И в нем будет инициализироваться создание 2х массивов для этого экземпляра { Print("::: SERVER: [ZonesClass.c DEBUG]: Zone: Init."); // Массив типа map: он поддерживает методы Insert, Romove и Contains. Обычный массив методы Remove и Contsins не поддерживает. // Игроки вошедшие в зону будут помещаться в этот массив в конкретном экземпляре "зоны". // playersInZone.Instert(player, player.GetIdentity().GetPlayerId()); // и удаляться из него при выходе из зоны // playersInZone.Remove(player); // Это нужно для проверки (что бы, например, не отправлять повторно сообщение о входе в зону) // playersInZone.Contains(player); - вернет true если игрок в массиве (те в зоне) или false если его там нет (не в зоне) playersInZone = new map<PlayerBase, int>; //Создание экземпляра в конкретном экземпляре класса Print("::: SERVER: [ZonesClass.c DEBUG]: Zone: new playersInZone array init: " + playersInZone.ToString()); // Массив типа TString: он поддерживает методы Insert, Romove и Contains. Обычный массив методы Remove и Contsins не поддерживает. complect = new TStringArray; //Создание экземпляра в конкретном экземпляре класса //Комплект checkslots = new TStringArray; //Создание экземпляра в конкретном экземпляре класса //Слоты для проверки repeatMessagesCurrentStep = 0; messageSkip = false; Print("::: SERVER: [ZonesClass.c DEBUG]: Zone: new complect array init: " + complect); } void ~Zone() { } } ref array<ref Zone> ga_zones = new array<ref Zone>; //Массив класса Zone. В него помещаются ссылки на экземпляры класса откуда в последствии читаются параметры //zones array ref ZonesClass Zones = new ZonesClass; class ZonesClass { //Default params: bool my_Zones_Debug = true; bool my_Zones_Debug_Msg = false; bool my_SafeZone_Debug = true; bool my_PvpZone_Debug = true; bool my_GasZone_Debug = true; bool my_ChemZone_Debug = true; bool my_BioZone_Debug = true; bool my_RadZone_Debug = true; bool my_DamageZone_Debug = true; bool my_Zone_Debug = true; int zone_Check_Timer = 12; //Seconds bool zone_Damage_Debug_Msg = false; void ZonesClass() { Print("::: SERVER: [ZonesClass]: Init."); ZonesInit(); Print("::: SERVER: [ZonesClass]: Init end."); } void ~ZonesClass() { Print("::: SERVER: [ZonesClass]: UnInit."); } void ZonesInit() { Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): BEGIN."); //Default params: //Зона string Name; //1 int Id = 0; //2 vector Center = vector.Zero; //3 float Radius = 0.0; //4 int Type = ZoneType.DAMAGE; // = 7 //5 //Приближение к зоне float WarnDist = 52; //6 string WarnMsg = "Кажется я рядом с опасной зоной... Мне нужна защита..."; //7 //"Вы рядом с опасной зоной!" //Вход в зону string EnterMsg = "Хм... Кажется я вошел в опасную зону..."; //8 //"Вы вошли в опасную зону!" //Нахождение в зоне string Msg = "Я в опасной зоне..."; //9 //"Вы в опасной зоне!" int RepeatMsgStep = 3; //10 //Выход из зоны string ExitMsg = "Я покинул опасную зону..."; //11 "Вы покинули опасную зону!" //Дамаг игроку и симптомы float player_Dmg_Coef = 0.160; //12 //Per second // 0.332 - Radio // 0.221 - Others //0.160 - test player_Dmg_Coef = player_Dmg_Coef * zone_Check_Timer; float player_Health_Threshold_Symptom = 40.0; //13 int player_Symptom = SymptomIDs.SYMPTOM_COUGH; //14 // Class SymptomIDs - variable SYMPTOM_COUGH (кашель) // = 1 //Комплект экипировки для проверки и слоты для проверки в данной зоне TStringArray itemsComplect = {}; //15 TStringArray playerSlots = {}; //16 //Дамаг экипировке float item_Dmg_Coef = 0.025; //17 //Per Second // 0.050 - Radio // 0.031 - Others item_Dmg_Coef = item_Dmg_Coef * zone_Check_Timer; float item_Health_Threshold = 40.0; //18 /* "GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow" */ /* Params: 1 - zone name 2 - zone id 3 - zone center position 4 - zone radius 5 - zone type number (see enum ZoneType) 6 - warning distance, if 0 - warning disabled 7 - warning message during the approach to the zone 8 - message on enter to zone, if null - disabled 9 - zone message for player, if null - disabled 10 - zone message repeat steps, if 0 - repeat message disabled 11 - exit zone message, if null - disabled 12 - damage coefficient for player 13 - player start symptoms threshold 14 - symptom for player in current zone / add to player if health < damage coefficient for player 15 - items complect for check //for future 16 - slots for check in zone 17 - damage coefficient for items //for future 18 - item health threshold for start damage player */ //В последствии мы не будем создавать зоны построчно, а будем читать их из файла (.json) и создавать в цикле. Name = "Pavlovo"; //газ Id = 1; Center = "2125 0 3400"; Radius = 200.0; WarnMsg = "Чувствую запах ядовитого газа... Мне нужен противогаз..."; EnterMsg = "Я кажется я вошел загазованную зону..."; Msg = "Я в загазованной зоне..."; ExitMsg = "Я покинул загазованную зону..."; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5"}; playerSlots = {"Mask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Dichina"; Id = 2; Center = "4524 0 8290"; Radius = 60.0; WarnMsg = "Чувствую странный запах... Мне нужен противогаз..."; EnterMsg = "Я кажется я вошел загазованную зону..."; Msg = "Я в загазованной зоне..."; ExitMsg = "Я покинул загазованную зону..."; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5"}; playerSlots = {"Mask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Zeleno"; //химия Id = 3; Center = "2530 0 5112"; Radius = 150.0; WarnMsg = "Чувствую запах химических испарений... Мне нужна полная защита..."; EnterMsg = "Я кажется я вошел отравленную зону..."; Msg = "Я в отравленной зоне..."; ExitMsg = "Я покинул отравленню зону..."; player_Symptom = SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH; itemsComplect = {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow"}; playerSlots = {"Mask","Headgear","Gloves","Body","Legs","Feet"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Myshkino"; //химия Id = 4; Center = "332 0 9368"; Radius = 100.0; WarnMsg = "Чувствую запах химических испарений... Мне нужна полная защита..."; EnterMsg = "Я кажется я вошел отравленную зону..."; Msg = "Я в отравленной зоне..."; ExitMsg = "Я покинул отравленню зону..."; player_Symptom = SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH; itemsComplect = {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow"}; playerSlots = {"Mask","Headgear","Gloves","Body","Legs","Feet"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Troitskoe"; //газ Id = 5; Center = "7893 0 14689"; Radius = 300.0; WarnMsg = "Чувствую запах ядовитого газа... Мне нужен противогаз..."; EnterMsg = "Я кажется я вошел загазованную зону..."; Msg = "Я в загазованной зоне..."; ExitMsg = "Я покинул загазованную зону..."; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5"}; playerSlots = {"Mask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Tisy"; //Радиация Id = 6; Center = "1600 0 14030"; Radius = 600.0; WarnMsg = "Кажется я рядом с радиоактивной зоной... Мне нужна полная защита..."; EnterMsg = "Я кажется я вошел в радиоактивную зону..."; Msg = "Я в радиоактивной зоне..."; ExitMsg = "Я покинул радиоактивную зону..."; player_Dmg_Coef = 0.175; //Per second player_Dmg_Coef = player_Dmg_Coef * zone_Check_Timer; player_Health_Threshold_Symptom = 50.0; player_Symptom = SymptomIDs.SYMPTOM_VOMIT; // SymptomIDs.SYMPTOM_COUGH; //Primary symptom itemsComplect = {"GP5GasMask","GasMask","PKM_MASK","Massblackgp5","NBCJacketGray","NBCHoodGray","NBCGlovesGray","NBCPantsGray","NBCBootsGray","MassNBCglovesBlue","MassNBCJacketYellow","MassNBCpantsYellow","MassNBCbootsYellow","MassNBChoodYellow"}; playerSlots = {"Mask","Headgear","Gloves","Body","Legs","Feet"}; item_Dmg_Coef = 0.031; //Per second //0.054 item_Dmg_Coef = item_Dmg_Coef * zone_Check_Timer; item_Health_Threshold = 40.0; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(CheckZones, zone_Check_Timer * 1000, true); Print("::: SERVER: [ZonesClass.c DEBUG]: ZonesInit(): END."); } void AddZone(string Name, int Id, vector Center, float Radius, int Type, float WarnDist, string WarnMsg, string EnterMsg, string Msg, int RepeatMsgStep, string ExitMsg, float player_Dmg_Coef, float player_Health_Threshold_Symptom, int player_Symptom, TStringArray itemsComplect, TStringArray playerSlots, float item_Dmg_Coef, float item_Health_Threshold) { ref Zone zone = new ref Zone; //создается новый экземпляр класса Zone - указатель на экземпляр - переменная zone zone.name = Name; //имя зоны 1 zone.id = Id; //номер зоны 2 Center[1] = GetGame().SurfaceY(Center[0], Center[2]); // Поверхность zone.center = Center; //центр зоны 3 zone.radius = Radius; //радиус зоны 4 zone.type = Type; //тип зоны (см ZoneType) 5 if (WarnDist > 0) {zone.warndistance = Radius + WarnDist; zone.warnenabled = true;} else {zone.warndistance = 0; zone.warnenabled = false; } //расстояние приближения к зоне + //вкл/выкл сообщения о приблежении к зоне 6 zone.warnmessage = WarnMsg; //сообщение при приблежении к зоне 7 zone.entermessage = EnterMsg; //вкл/выкл сообщение при входе в зону 8 if (!EnterMsg) {zone.entermsgenabled = false;} else {zone.entermsgenabled = true;} //вкл/выкл сообщение при входе в зону zone.message = Msg; //сообщение при нахождении в зоне 9 if (!Msg) {zone.messageenabled = false;} else {zone.messageenabled = true;} //вкл/выкл сообщение при нахождении в зоне zone.repeatmsgstep = RepeatMsgStep; //повторяющиеся в зоне сообщения - шаг, сколько итераций пропускать перед выводом сообщения 10 if (RepeatMsgStep > 0) {zone.repeatmsg = true;} else {zone.repeatmsg = false;} //вкл/выкл повторяющиеся в зоне сообщения zone.exitmessage = ExitMsg; //сообщение выходе из зоны 11 if (!ExitMsg) {zone.exitmessageenabled = false;} else {zone.exitmessageenabled = true;}; //вкл/выкл сообщение выходе из зоны zone.player_Dmg_Coef = player_Dmg_Coef; //коэффициент повреждения для игрока 12 zone.player_Health_Threshold_Symptom = player_Health_Threshold_Symptom; //порог здоровья после которого применяются симптомы 13 zone.player_Symptom = player_Symptom; //симпотом для данной зоны 14 zone.complect = itemsComplect; //комплект вещей для проверки 15 zone.checkslots = playerSlots; //Слоты для проверки 16 zone.item_Dmg_Coef = item_Dmg_Coef; //коэффициент повреждения для вещей игрока 17 zone.item_Health_Threshold = item_Health_Threshold; //порог здоровья для вещи после которого начинается нанесение урона персу игрока 18 ga_zones.Insert(zone); //Массив класса Zone //каждый элемент массива содержит указатель на экземпляр класса зоны Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: zone.name: " + zone.name + ", zone.id: " + zone.id + ", zone.center: " + zone.center + ", zone.radius: " + zone.radius + ", type: " + zone.type + ", player_Dmg_Coef: " + zone.player_Dmg_Coef + ", player_Health_Threshold_Symptom: " + zone.player_Health_Threshold_Symptom + ", player_Symptom: " + zone.player_Symptom + ", item_Dmg_Coef: " + zone.item_Dmg_Coef + ", item_Health_Threshold: " + zone.item_Health_Threshold); Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: Complet items count: " + zone.complect.Count() + ", slots for check count: " + zone.checkslots.Count()); Print("::: SERVER: [ZonesClass.c DEBUG]: AddZone: zone.warnenabled: " + zone.warnenabled.ToString() + ", zone.entermsgenabled = " + zone.entermsgenabled.ToString() + ", zone.messageenabled = " + zone.messageenabled.ToString() + ", zone.repeatmsg = " + zone.repeatmsg.ToString() + ", zone.exitmessageenabled = " + zone.exitmessageenabled.ToString()); } void SendZoneMessage(PlayerBase player, string zonemessage) { Param1<string> m_MessageParam = new Param1<string>(zonemessage); GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, player.GetIdentity()); } bool InZone(PlayerBase player, ref Zone zone) { if (zone.repeatmsgstep > 1) { if (zone.repeatMessagesCurrentStep >= zone.repeatmsgstep) { zone.repeatMessagesCurrentStep = 0; } if (zone.repeatMessagesCurrentStep == 0) { zone.messageSkip = false; } else { zone.messageSkip = true; } zone.repeatMessagesCurrentStep++; } if (zone.playersInZone.Count() > 2048) zone.playersInZone.Clear(); if (!player.IsAlive() || !player.GetIdentity() ) //Player dead or disconnect/lost control { if (zone.playersInZone.Contains(player)) zone.playersInZone.Remove(player); return false; } if ( zone.warnenabled && (vector.Distance(player.GetPosition(), zone.center) > zone.radius) && (vector.Distance(player.GetPosition(), zone.center) < zone.warndistance) ) { if (!zone.messageSkip && !zone.playersInZone.Contains(player)) { SendZoneMessage(player, zone.warnmessage); } } if ( vector.Distance(player.GetPosition(), zone.center) <= zone.radius ) { //0: if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + "0.0: InZone zone.repeatMessagesCurrentStep = " + zone.repeatMessagesCurrentStep + " : zone.messageSkip: " + zone.messageSkip); if (!zone.playersInZone.Contains(player)) //1: { if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.0: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player)); zone.playersInZone.Insert(player, player.GetIdentity().GetPlayerId()); if (my_Zones_Debug) { Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.1: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player)); Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 1.2: entering zone.name: " + zone.name); if (my_Zones_Debug_Msg) SendZoneMessage(player, "1.0: InZone enter Zone: " + zone.name + " : " + zone.entermessage); } if (zone.entermsgenabled) SendZoneMessage(player, zone.entermessage); } else { if (zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, zone.message); } switch(zone.type) { case 1: //SAFE { SafeZone(player, zone); break; } case 2: //PVP { PvpZone(player, zone); break; } case 3: // GAS case 4: // CHEM case 5: // BIO case 6: // RAD case 7: //DAMAGE UNIVERSAL { DamageZone(player, zone); break; } } return true; } else { if (zone.playersInZone.Contains(player)) //2: { if (my_Zones_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.0: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player)); zone.playersInZone.Remove(player); if (my_Zones_Debug) { Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.1: leaving zone.name: " + zone.name); Print("::: SERVER: [ZonesClass.c DEBUG]: InZone: Player: " + player.GetIdentity().GetName() + ", 2.2: zone.playersInZone.Contains(player) = " + zone.playersInZone.Contains(player)); if (my_Zones_Debug_Msg) SendZoneMessage(player, "2.0: InZone exit Zone: " + zone.name + " : " + zone.exitmessage); } if (zone.exitmessageenabled) SendZoneMessage(player, zone.exitmessage); } return false; } } void SafeZone(PlayerBase player, ref Zone zone) { } void PvpZone(PlayerBase player, ref Zone zone) { } void GasZone(PlayerBase player, ref Zone zone) { } void ChemZone(PlayerBase player, ref Zone zone) { } void BioZone(PlayerBase player, ref Zone zone) { } void RadZone(PlayerBase player, ref Zone zone) { } void DamageZone(PlayerBase player, ref Zone zone) { EntityAI attachment; ItemBase item; float player_Dmg_Coeficient = 0; //Стартовое значение урона для игрока float player_Health; //Сюда вернём "здоровье" игрока float Item_Health; //Сюда вернём "здоровье" проверяемого предмета array<ItemBase> player_Items = new array<ItemBase>; //Тут будут <класснейм,вещичка> игрка int player_Complect_Count = 0; //Количество вещичек комплекта соответствующих комплекту зоны bool damageToPlayer = false; //По умолчанию ущерб отключен bool findComplect = false; //Комплект же еще не прочитан bool findPlayerItem = false; //Вещички же еще не найдены bool CurDamagMsg = false; if (my_DamageZone_Debug) { Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Player: " + player.GetIdentity().GetName() + ", zone.name: " + zone.name + ", zone.type = " + zone.type + ", zone.complect.Count() = " + zone.complect.Count()); } //======================================================================================================================================================================================================================= if (zone.complect.Count() > 0) //Комплект содержит что-то? { //..Да! Проверяем. Ибо если комплект не указан, то и проверять смысла нет, защититься в этой зоне нечем или дамаг для нее 0 и она только сообщуги выводит findComplect = true; //Комплект определен for (int i = 0; i < zone.checkslots.Count(); i++) //Проходимся по слотам игрока для этой зоны { attachment = player.FindAttachmentBySlotName(zone.checkslots[i]); //получаем содержимое очередного слота if (attachment && attachment.IsItemBase()) //Аттачка не НУЛЛ и относится к классу вещичек { //Да! player_Items.Insert(ItemBase.Cast(attachment)); //Собираем все в массивчик что бы потом не крутить лишних циклов по игроку } else { player_Items.Insert(NULL); //В слоте пусто? запихивам туда же } } if (player_Items.Count() > 0) //Вещички есть? {//..Да! Проверяем вещички for (i = 0; i < player_Items.Count(); i++) //проходимся по комплекту игрока { findPlayerItem = false; //Флаг по умолчанию - Вещичка пока не найдена if (player_Items[i] && zone.complect.Find(player_Items[i].GetType()) >= 0) //Вещичка найдена (вещичка не NULL и ее класснейм есть в комплекте) ? (player_Items[i] - выше могли и NULL запихать - тогда значицо слот тот пустой и значицо комплет неполный) { //..Да! findPlayerItem = true; //Флаг - Вещичка найдена player_Complect_Count++; //Временный подсчет if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Found complect item in: " + zone.checkslots[i] + ": " + player_Items[i].GetType()); if ( zone.item_Dmg_Coef > 0 ) { Item_Health = player_Items[i].GetHealth(); //Возвращаем значение "здоровья" вещички в переменную Item_Health Item_Health = Item_Health - zone.item_Dmg_Coef; //Декримент состояния вещички player_Items[i].SetHealth(Item_Health); //Устанавливаем новое состояние вещички player.SetSynchDirty(); //синхр / без этого игрок не всегда видит как его предмет дамажится } if (Item_Health <= zone.item_Health_Threshold) //Если значение "здоровья" вещички ниже равно порогу, заданному в переменной item_Health_Threshold... {//...то damageToPlayer = true; //ущербу быть! if (zone.messageenabled && !zone.messageSkip && !CurDamagMsg) { SendZoneMessage(player, "Защита изношена!"); CurDamagMsg = true; //повторять вывод сообщения будем только 1 раз, а не для каждой вещички } if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Item_Health less then item_Health_Threshold: " + Item_Health + ", player damage enabled."); } } //Нет, ищем дальше / комплект для зоны может быть меньше чем вещичек игрока - например может быть один противогаз else { // Вещичка не найдена! if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Not found complect item in: " + zone.checkslots[i]); } if (!findPlayerItem) //Вещичку не нашли - комплект не полный { findComplect = false; damageToPlayer = true; //ущербу быть! break; //Зачем проверять остальное // хотя может и есть смысл - ради дамага других вещичек - тогда прерывать не будем }//переходим к следующему классу из комплекта // надо еще поискать и отдамажить остальные } if (!findComplect) //оставил это на всяк случай { damageToPlayer = true; //ущербу быть! if (zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, "Я не защищен!"); } } else {//.. Вещичек Нет! findComplect = false; damageToPlayer = true; //Ущербу быть! if (zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, "Я не защищен!"); if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Not found any items."); } } else { //..Комплект не указан, наносить ущерб? нет - зона в которой не нужна зашита damageToPlayer = false; //Ущербу не быть } //======================================================================================================================================================================================================================= if (my_DamageZone_Debug) { Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: findComplect = " + findComplect.ToString()); Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: damageToPlayer = " + damageToPlayer.ToString()); } //Усчерб )) if ( damageToPlayer ) { if (zone.player_Dmg_Coef > 0) { player_Dmg_Coeficient = zone.player_Dmg_Coef; player_Health = player.GetHealth("GlobalHealth", "Health"); //получаем текущее здоровьишко player_Health = player_Health - player_Dmg_Coeficient; //понижаем здоровьишко player.SetHealth("GlobalHealth", "Health", player_Health); //Тут он может и помереть } if (player && player.IsAlive())//Если живой!!! мертвому нет смысла что-то уже делать //Вдруг он сдох только что (было такое на тесте) { if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Decrease player_Health by player_Dmg_Coef: " + player_Dmg_Coeficient + ", new health: " + player_Health); if (zone_Damage_Debug_Msg) SendZoneMessage(player, "Вам нанесен ущерб: " + player_Dmg_Coeficient + "!"); if (player_Health < zone.player_Health_Threshold_Symptom + 6 && zone.messageenabled && !zone.messageSkip) SendZoneMessage(player, "Срочно оденьте защиту!"); if (player_Health < zone.player_Health_Threshold_Symptom) { player.GetSymptomManager().QueueUpPrimarySymptom(zone.player_Symptom); //Тут надо поразбираться - корректно ли при каждой итерации добавлять симптом или достаточно 1 раза... //тут можно еще инсертить AGENT (заболевание) ... надо подумать над этой темой if (my_DamageZone_Debug) Print("::: SERVER: [ZonesClass.c DEBUG]: DamageZone: Add symptom: " + zone.player_Symptom); } } } else { if (findComplect && zone_Damage_Debug_Msg) SendZoneMessage(player, "Вам не нанесен ущерб. Вы защищены."); if (zone.messageenabled && !zone.messageSkip && findComplect) SendZoneMessage(player, "Хорошо что есть защита!"); } } void CheckZones() { ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); for ( int i = 0; i < players.Count(); i++ ) { PlayerBase player = PlayerBase.Cast(players[i]); if (player) { for ( int j = 0; j < ga_zones.Count(); j++ ) { if (InZone(player, ga_zones[j])) break; } } } } } //-------- Old zones: /* Name = "Aero SW"; Id = 5; Center = "4586 0 9533"; Radius = 220.0; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Aero SE"; Id = 6; Center = "5177 0 9960"; Radius = 350.0; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Aero W"; Id = 7; Center = "4228 0 10400"; Radius = 350.0; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GasMask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Aero E"; Id = 8; Center = "4785 0 10530"; Radius = 250.0; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GP5GasMask","GasMask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); Name = "Aero N"; Id = 9; Center = "4290 0 10956"; Radius = 250.0; player_Symptom = SymptomIDs.SYMPTOM_COUGH; // SymptomIDs.SYMPTOM_VOMIT; itemsComplect = {"GasMask"}; AddZone(Name, Id, Center, Radius, Type, WarnDist, WarnMsg, EnterMsg, Msg, RepeatMsgStep, ExitMsg, player_Dmg_Coef, player_Health_Threshold_Symptom, player_Symptom, itemsComplect, playerSlots, item_Dmg_Coef, item_Health_Threshold); */ //-------- Доработал - переработал конечно же потребуется оптимизация вобщем промежуточный вариант для изучения/обучения/обдумывания 2 часа гоняю на серве с онлайном 40 рыл отрицательного влияния на производительность сервера не замечено - работает норм
×
×
  • Создать...

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

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

Поддержка