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

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

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

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

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

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


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

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

  1. 3 балла
    vitacite

    Ретекстур чего угодно. (camoSelections)

    закрыто.
  2. 2 балла
    Cook1e

    Как сделать новый транспорт в DayZ ?

    Алилую, слава моим яйцам нашёл годный тутор по карам. Народ залетаем такие же, как я потерявшие надежду на светлое будущее
  3. 1 балл
    Друзья, некоторое время ранее я в теме вот этой описывал создание как своего серверного мода, так и самой базовой общей структуры любого клиент-серверного мода с нуля. Но я не затрагивал момент о написании собственных скриптов для такого мода. Собственно, этот момент в данной теме и рассмотрим. Данная тема размещена в разделе не гайдов, а описания по игре, так как она носит более информативный характер, нежели гайд. Всем новичкам. пытающимся создать свой сервер советую прочесть. эксперты могут смело проходить мимо. едва-ли что-то новое узнаете. Предупреждаю, статья длинная, 'много текста'. Заранее оговорюсь, что в теме буду рассматривать пример для серверного мода, но этот же принцип работает и в клиент-серверных модификациях. Разница в клиент-серверных модификациях исключительно во взаимодействии между клиентом и сервером по протоколу RPC. Предположим, что у нас имеется свой чистый сервер игры, и мы хотим добавить какое-то свое действие, например, после присоединения игрока на сервер игры. Например, некая своя запись в лог-файл сервера. Темы к ознакомлению, связанные с данным материалом: Небольшое отступление с пояснениями: Как мы знаем, базовые скрипты игры находятся у нас в 'scripts.pbo' в папке 'dta'. Эти скрипты, на минуточку, на стороне клиента игры и сервера игры идентичные, т.е. вне зависимости от того, что у нас запускается, они одинаковы и там, и там, но с одной лишь разницей, с определенного момента начинается разделение в выполнении кодов. Т.е. для сервера выполняется своя часть кода, для клиента своя. Например, для сервера выполнится код из файла missionServer.c а для клиента игры из missionGameplay.c Это я к чему - то что вы правите в скрипте для серверного мода не всегда может работать, так как эта часть кода может быть предусмотрена для клиентского мода, или наоборот. Аналогично и касается отдельных функций в коде сервера. Например, комманда GetGame().Chat("MyMessage", "colorAction"); выполняется только на клиентской стороне, а GetGame().Chat("MyMessage"); только на серверной (за исключением случаев, когда авторы игры могут ломать эти самые комманды с патчами обновлений). Но бывают и комманды, выполняющиеся и на сервере и на клиенте игры. Например, комманда Print("MyLogMessage"); выводящая в 'script.log' нужный нам текст. Вдаваться в особенности взаимодействия между сервером и клиентом игры не буду, скажу лишь то, что работает оно через id (идентификаторы вызова) и процедуру RPC (см. события OnRPC) Для ищущих и любопытных сразу отмечу, что можно делать одну общую функцию, разделяющую в зависимости от клиента и сервера код на нужное выполнение коммандами: GetGame().IsMultiplayer() - будет true(истина) если игра запущена для игры по сети, или false(ложь) во всех иных случаях GetGame().IsClient() - будет true(истина) если игра запущена клиентская часть игры (в том числе и если offline версия тоже), или false(ложь) во всех иных случаях GetGame().IsServer() - будет true(истина) если игра запущена серверная часть игры, или false(ложь) во всех иных случаях Не буду вдаваться и в подробности, но думаю эта информация вам пригодится, если вы всерьез решились заняться данной игрой. Добавлю только то, что игра может запускаться в 3 режимах: 1) Сервер 2) Клиент Мультиплеера 3) Клиент Offline версия, и во всех 3 случаях будут работа игры будет отличаться (к примеру, в Offline не будет PlayerIdentify, т.е. идентификатора игрока). Так вот, вернемся к нашему моду. Игрок с английского у нас Player. Логично предположить, что и название нужных нам событий и функций будут также содержать такой текст. Сразу отмечу, что у данной игры, как и у любой c++ подобной программы. есть подразделение по классам и подклассам. и практически все скрипты и функции игры разделены именно на них. Т.е. Если мы хотим искать Player - ищем его поиском по нахождению в папке (В Notepad++ есть крайне полезная опция, зажимаем CTRL+F и в 3 вкладке будет такой поиск). Среди результатов поиска будет много файлов и текстов. Нас интересует файл со строкой, начинающейся на class. В нашем же случае это будет 'class PlayerBase', который вы и найдете. Это базовый класс, содержащий в себе основные функции и события, связанные с персонажем, например DropItem - скидывает вещь, RemoveAllItems удаляет все вещи с игрока (см перевод текста в переводчике с англ.), а события EEKilled и OnConnect выполняются на сервере игры соответственно при смерти (и убийстве) игрока, и при присоединении к серверу. Отступление: Каждая функция имеет свой синтаксис. void - функция без возврата значения, например void OnConnect(), а бывают функции с возвратом значений, например bool IsBleeding(), возвращающая true(истина) если игрок страдает от кровотека, и false если нет. Также у каждой функции могут быть свои входящие и используемые переменные, например у void OnConnect() их нет, а у void EEKilled( Object killer ) есть. Вернемся к нашим 'интересностям' Как вы поняли уже, нас интересует OnConnect(). Открываем найденный файл PlayerBase.c. Ищем функцию OnConnect() поиском по файлу На патче 1.06 она выглядит вот так: void OnConnect() { Debug.Log("Player connected:"+this.ToString(),"Connect"); // analytics GetGame().GetAnalyticsServer().OnPlayerConnect( this ); m_PlayerOldPos = GetPosition(); if( m_AnalyticsTimer ) m_AnalyticsTimer.Run( 60, this, "UpdatePlayerMeasures", null, true ); //construction action data ResetConstructionActionData(); } Теперь, как вы сами понимаете, нам надо внести нужные нам изменения. Но как же это делать правильно, чтобы не сломать ничего в игре и модах? Объясняю ниже: Так что же нам делать то? Ведь мы не можем перепаковывать 'scripts.pbo' сервера, иначе включенный параметр verifysignatures перестанет пускать на сервер игроков. Отвечаю вам. Создайте свой текстовый файл, заполните его следующего вида данными: modded class PlayerBase extends ManBase { override void OnConnect() { super.OnConnect(); Pring("[MyTestLog] Player connected:"+this.ToString()); } } затем сохраните его в формате .с вместо txt. Как видите, вверху в файле modded class. Modded означает, что мы будем модифицировать базовый класс игры, или проще говоря писать мод на данный класс. Перед функцией OnConnect появилась override, что в переводе с англ. означает переопределение. Т.е. мы в класс PlayerBase будем переопределять функцию OnConnect. Отступление про override: Как некоторые любопытные заметили, в некоторых функциях уже имеются override. Не буду вдаваться в подробности данной структуры, скажу лишь то что в игре если главные базовые классы, есть мелкие наследуемые классы (для понимания можно подкатегориями их назвать). Так вот. один и тот же объект в игре может быть отображен в нескольких переменных под разными классами, но игровым объектом он останется одним и тем же. Делается это для того, чтобы получить доступ к тем или иным функциям. Для примера, в классе EntityAI (общий базовый класс всех объектов в игре) нет функции установки количества вещей SetQuantity (как например количество вещей), а у класса ItemBase такая функция есть. Вот для того чтобы выполнить нужное нам действие используют конверсию из одного класса в другой. хотя сам игровой объект от этого не изменяется никак. Пример такой конверсии в своих init.c миссии сервера можете наблюдать в таком вот виде: itemEnt = itemTop.GetInventory().CreateInInventory("Rag"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(4); Где сначала создается тряпка и записывается в класс EntityAI, а затем для совершения действий выполняется конверсия класса предмета в подкласс ItemBase с другими функциями, почле чего уже вызывается функция и используется параметр 4, означающий задать предмету количество 4 (Set Quantity в переводе установить количество). Также, есть у любого класса в игре, как и в c++, конструкторы и деструкторы класса. Указывать их не обязательно, но они могут иметься в классах. Пример своего класса: class My_MissionServerClassMod { void My_MissionServerClassMod() { Print("Build My_MissionServerClassMod TECT"); } void ~My_MissionServerClassMod() { Write_Log("DeBuild My_MissionServerClassMod"); } } Здесь: void My_MissionServerClassMod() - конструктор класса, выполняется в момент, когда создается объект или переменная этого класса. Т.е. в игре каждый персонаж имеет свой объект в игровом мире. Проще говоря, каждый игровой персонаж (в т.ч. и мертвый это объект класса PlayerBase). переменной такие вещи можно задавать вот так: ref My_MissionServerClassMod MyPeremennaya = new My_MissionServerClassMod; void ~My_MissionServerClassMod() - деструктор класса, выполняется в момент, когда объект или переменная удаляются с памяти, например скриптово удаление объекта с карты GetGame().ObjectDelete(MyPeremennaya); или при закрытии сервера если это переменная. Через override деструкторы и конструкторы переписывать нельзя, их в своем мод-скрипте просто объявляете, например в таком виде: modded class My_MissionServerClassMod { void My_MissionServerClassMod() { Print("Build My_MissionServerClassMod TECT"); } void ~My_MissionServerClassMod() { Write_Log("DeBuild My_MissionServerClassMod"); } } В этом случае они сами допишутся к оригинальным вызовам родного класса игры, если такие вообще были объявлены. Вернемся к объяснению в нашем классе PlayerBase: Теперь посмотрите функцию OnConnect . Как видите, куча кода в ней отсутствует, но появились 2 новые строки. Комманда super.OnConnect(); позволит нам вызвать оригинальную функцию базового класса игры с сохранением как всех ее оригинальных действий, так и зависимостей из других связанных классов в игре (напомню, в игре один и тот же объект может быть в разных классах и разных переменных). Вы сразу спросите: 'А зачем так, можно же взять оригинальный код и переписать его как нам надо' или 'А можно ли взять и переправить базовый оригинальный код?' - отвечаю - делать так тоже можно, но крайне не желательно. У вас, как мы можем догадываться, в игре могут быть разные модификации, и данный класс может с данной функцией встретиться в другом моде. Если вы вместо такого вызова вставите весь оригинальный код функции игры, вы тем самым можете сломать запуск одного из модов, которые у вас стоят. Вторая же строка в данном файле - Print("[MyTestLog] Player connected:"+this.ToString()); - т.е. запись в script.log метки с текстом [MyTestLog] Player connected:{данные о персонаже} (где + this подставит вместо текста текущие данные персонажа из данного класса, а функция-модификатор ToString() преобразует эти данные в формат текстовой строки для вывода(иначе сервер выдаст вам ошибку, так как this в данном случае - это объект текущего класса, т.е. Playerbase)). Сразу же упомяну для всех страждущих, комманда +this.ToString() не выведет данных о нашем персонаже в логе, даже не выведет никнейм или его данные. Для вывода таких сведений надо писать дополнительный код такого вида: modded class PlayerBase extends ManBase { override void OnConnect() { super.OnConnect(); PlayerIdentity identity_player = this.GetIdentity(); string nickname_player = identity_player.GetName(); string steam64id_player = identity_player.GetPlainId(); string bis_id_player = identity_player.GetId()(); Pring("[MyTestLog] Player with name " + nickname_player + "(steam64id=" + steam64id_player + " bisid=" + bis_id_player + ")connected!"); } } Собственно, этот код в готовом и сформированном вами виде вы и кладете в свой серверный мод, он у вас уже в готовом виде. Отступление на тему: В коде своего скрипта можно использовать все оригинальные функции, имеющиеся в базовом классе. который вы меняете. Также можно использовать и любые другие функции из других классов, предварительно конвертируя и используя переменные этих классов в игре. Также можно беспрепятственно использовать все переменные из модифицируемой функции и класса, ссылаясь на них, но не забывайте, что эти же переменные могут меняться и использоваться с других функциях. Куда размещать файл в своем моде, спросите вы? Отвечаю - поглядите в каком расположении находится файлик с оригинальным классом PlayerBase (4_World\Entities\ManBase\PlayerBase.c) и разместите в своем моде его по такому же пути, название файла не сильно важно, но желательно сохранять оригинальные имена для упрощения задач самим же себе. (на самом деле сервер читает скрипты в алфавитном порядке из main-разделов игры типа 5_Mission или 4_World) Любителей скриптить и писать свои моды с большим опытом работы с игрой может заинтересовать вопрос 'можно ли в моде добавлять свои переменные и функции, и вызывать их из базовых оригинальных (нативных) классов игры?' - отвечу, да, можно. Вы просто добавляете эти переменные и функции как обычные классы, например, так: modded class PlayerBase extends ManBase { string myPeremennaya = ""; override void OnConnect() { super.OnConnect(); MyFunctia(); } void MyFunctia() { Pring("[MyTestLog] Player connected:" + myPeremennaya); } } Обращу внимание, что к добавленным таким образом функциям и переменным можно обращаться лишь из своего мода, либо из других модов но только после указания зависимостей ваших других модов с текущим в cpp файле мода. Доп. информация: Отмечу сразу, что указанный в теме способ подходит для дописывания и модификации оригинальных классов скриптов сервера от разработчиков и модификации чужих модов с помощью моддинга. Изменять сам родной код функции без дописывание не рекоммендуется, но если это для вас требуется - используйте следующее: Изменение оригинальных скриптов, для которых не предусмотрена операция 'modded class' в движке игры, а также классов и функций, которые защищены языком и движком игры от такого рода действий через серверные моды не получится. Если вы столкнулись с этим, вам проще распаковать scripts.pbo и поместить папку scripts в корень сервера игры, добавить в параметры запуска сервера параметр -FilePatching и изменять напрямую в папке необходимые вам файлы. Также, подобные описанные выше оранжевым цветом действия будут работать, если вы будете использовать override без использования строки-комманды super в своей функции. Важно: не выполняйте указанную выше доп. информацию на стороне клиента игры, иначе это может стать причиной неработоспособности вашего клиента игры и входа на сервера, поскольку сервера игры поумолчанию защищены от такого рода действий и будут исключать вас с сервера на попытках входа на него! И так, если вы смогли осилить данную тему с кучей текста, вдумчиво и с пониманием всего описанного, вы сможете создать любой свой мод без особых проблем. Если же данная тема при изучении вызывает особые трудности, советую вам заказать готовое решение у кого-либо в специальной ветке форума. P.S. Прошу извинить меня за излишнюю монотонность чтения и оформления темы, а также неточности, я далеко не эксперт ?
  4. 1 балл
    vitacite

    Делаем тактическую фляжку для воды.

    закрыто
  5. 1 балл
    123new

    Проблемы с рандомным стартовым лутом

    все дело в синтаксисе. Вот смотрите, комманда player.GetInventory().CreateInInventory("что-то"); здесь указан player, т.е. объект типа PlayerBase, проще говоря персонаж игрока, уже созданный в момент начала выполнения функции. Ну или проще для нашего понимания, наш спавнящийся игрок. В данном случае вещь спавнится именно на игрока в любую свободную вещь, куда может поместиться в виде 'поумолчанию' (т.е. без поворотов, разворотов и т.п. игры в тетрис инвентаря, просто как есть). А вот в синтаксисе itemClothing.GetInventory().CreateInInventory("что-то"); объект будет спавниться именно в инвентарь того предмета, который записан у вас в переменной itemClothing. Т.е. например мы создаем предмет какой-то и присваиваем его значение в созданную нами только что переменную: EntityAI shtany = = player.GetInventory().CreateInInventory("JumpsuitPants_Blue"); если предмет создался, значение переменной shtany будет отличное от NULL и проверка if(shtany) вернет true (истина). А вот если он не смог создаться по какой-тор причине (например, места не было в инвентаре или слот занят или еще что-то) - будет NULL и проверка if(shtany) вернет false (ложь). Соответственно тут уже с условиями можно играться (это скриптинг буквальный). Соответственно если далее мы спавним предмет например так: shtany.GetInventory().CreateInInventory("Morphine"); то мы говорим предмету соспавниться именно внутри этого предмета, т.е. ранее появившихся штанов. И ту возможны следующие варианты: 1. Предмет соспавнится, если имеются слоты в нем свободные и он помещается в них (спавн поумолчанию опять же) 2. предмет не соспавнится т.к. дочерний предмет не имеет слотов, либо закрыт доступ к инвентарю (например, у бочек есть крышки) 3. предмет не соспавнится, т.к. дочерний объект просто не существует (т.е. переменная shtany имеет значение NULL) Все это выше описанное скриптинг буквальный. Даже сама комманда player.GetInventory().CreateInInventory делится на несколько операций, среди которых player - объект, GetInventory() - функция внутри объекта player с его типом класса, где CreateInInventory также функция внутри результата функции, который вернет GetInventory(). Все это можно и нужно изучать внутри scripts.pbo игры. Подробнее вдаваться не буду
  6. 1 балл
    123new

    Проблемы с рандомным стартовым лутом

    потому как к моменту выполнения функции StartingEquipSetup на персонаже стартовые шмотки уже имеются, те что игрок выбирает сам в гл меню игры в настройках стартового персонажа. Комманда player.RemoveAllItems(); должно решать этот вопрос перед спавном нового лута. Теперь пробегаемся по вашему иниту. Нюанс 1: player.RemoveAllItems(); вы удаляете лут, но далее itemClothing = player.FindAttachmentBySlotName("Body"); if ( itemClothing ) { itemEnt = itemClothing.GetInventory().CreateInInventory("Bandage"); itemEnt = itemClothing.GetInventory().CreateInInventory("Bandage"); itemEnt = itemClothing.GetInventory().CreateInInventory("Bandage"); itemEnt = itemClothing.GetInventory().CreateInInventory("TacticalBaconCan_Opened"); itemEnt = itemClothing.GetInventory().CreateInInventory("Canteen"); itemEnt = itemClothing.GetInventory().CreateInInventory("M18SmokeGrenade_Purple"); itemEnt = itemClothing.GetInventory().CreateInInventory("M67Grenade"); itemEnt = itemClothing.GetInventory().CreateInInventory("M67Grenade"); itemEnt = itemClothing.GetInventory().CreateInInventory("Morphine"); itemEnt = itemClothing.GetInventory().CreateInInventory("Epinephrine"); SetRandomHealth(itemEnt); string chemlightArray[] = { "Chemlight_White", "Chemlight_Yellow", "Chemlight_Green", "Chemlight_Red" }; int rndIndex = Math.RandomInt(0, 4); itemEnt = itemClothing.GetInventory().CreateInInventory(chemlightArray[rndIndex]); SetRandomHealth(itemEnt); } ищете предмет в слоте Body и пытаетесь в него спавнить вещи. Простите, а что вы пытаетесь найти? После первой комманды у вас даже тапочек белых быть не должно Нюанс 2: в коде, например, 1 сета: if ( rand < 0.1 ) { EntityAI FAL = player.GetHumanInventory().CreateInHands("FAL") FAL.GetInventory().CreateAttachment("Fal_OeBttstck"); FAL.GetInventory().CreateAttachment("ACOGOptic"); itemEnt = player.GetInventory().CreateInInventory("Mag_FAL_20Rnd"); itemEnt = player.GetInventory().CreateInInventory("Mag_FAL_20Rnd"); itemEnt = player.GetInventory().CreateInInventory("Mag_FAL_20Rnd"); itemEnt = player.GetInventory().CreateInInventory("Mag_FAL_20Rnd"); itemEnt = player.GetInventory().CreateInInventory("Mag_FAL_20Rnd"); itemEnt = player.GetInventory().CreateInInventory("Mag_FAL_20Rnd"); itemEnt = itemClothing.GetInventory().CreateInInventory("CombatBoots_Black"); itemEnt = itemClothing.GetInventory().CreateInInventory("USMCPants_Woodland"); itemEnt = itemClothing.GetInventory().CreateInInventory("USMCJacket_Woodland"); itemEnt = itemClothing.GetInventory().CreateInInventory("PilotkaCap"); itemEnt = itemClothing.GetInventory().CreateInInventory("HighCapacityVest_Black"); } вы пытаетесь спавнить CombatBoots_Black, USMCPants_Woodland, USMCJacket_Woodland, PilotkaCap, HighCapacityVest_Black на что? Ну, явно не на игрока, учитывая itemClothing.GetInventory().CreateInInventory. А теперь поглядите, что такое в переменной itemClothing ? Правильно, то что обозначено в 1 нюансе. Но так как на игроке на тот момент ничего не было, то откуда же этой переменной заполниться данными на момент исполнения последнего кода? Разумеется, она будет равна NULL, и на игроке эти вещи не соспавнятся, т.к. самой шмотки нету, сервер не знает на чем спавнить это. Причем, эти строчки не просто не будут работать, но еще и ошибки в крашлоге будут писать, .к. с точки зрения логики кода игры это критическая ошибка. Учитывая выше написанное, не удивительно, что не все спавнится у вас. Способ исправления сознательно не говорю, чтобы вы научились думать сами. Подсказки дал выше.
  7. 1 балл
    DrTauren

    Как сделать новый транспорт в DayZ ?

    Модели кто-то покупает, кто-то ворует где-то видимо, кто-т сам делает. Для начала изучите раздел (ссылка ниже), а потом можно и чужой мод на транспорт скачать и разобраться что там и как, многие так и начинали. https://s-platoon.ru/forum/266-3d-mody/
  8. 1 балл
    123new

    Проблемы с рандомным стартовым лутом

    как и сказал, с условии и в скобочке дело. Тогда уж вот так, если сильно хотите void main() { //INIT WEATHER BEFORE ECONOMY INIT------------------------ Weather weather = g_Game.GetWeather(); weather.MissionWeather(false); // false = use weather controller from Weather.c weather.GetOvercast().Set( Math.RandomFloatInclusive(0.4, 0.6), 1, 0); weather.GetRain().Set( 0, 0, 1); weather.GetFog().Set( Math.RandomFloatInclusive(0.05, 0.1), 1, 0); //INIT ECONOMY-------------------------------------- Hive ce = CreateHive(); if ( ce ) ce.InitOffline(); //DATE RESET AFTER ECONOMY INIT------------------------- int year, month, day, hour, minute; int reset_month = 9, reset_day = 20; GetGame().GetWorld().GetDate(year, month, day, hour, minute); if ((month == reset_month) && (day < reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month == reset_month + 1) && (day > reset_day)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } else { if ((month < reset_month) || (month > reset_month + 1)) { GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute); } } } } class CustomMission: MissionServer { void SetRandomHealth(EntityAI itemEnt) { if ( itemEnt ) { int rndHlt = Math.RandomInt(55,100); itemEnt.SetHealth("","",rndHlt); } } override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName) { Entity playerEnt; playerEnt = GetGame().CreatePlayer(identity, characterName, pos, 0, "NONE");//Creates random player Class.CastTo(m_player, playerEnt); GetGame().SelectPlayer(identity, m_player); return m_player; } override void StartingEquipSetup(PlayerBase player, bool clothesChosen) { EntityAI itemTop; EntityAI itemEnt; ItemBase itemBs; itemTop = player.FindAttachmentBySlotName("Body"); if ( itemTop ) { itemEnt = itemTop.GetInventory().CreateInInventory("Bandage"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(3); itemEnt = itemTop.GetInventory().CreateInInventory("TacticalBaconCan_Opened"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(1); itemEnt = itemTop.GetInventory().CreateInInventory("Canteen"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(1); itemEnt = itemTop.GetInventory().CreateInInventory("M18SmokeGrenade_Purple"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(2); itemEnt = itemTop.GetInventory().CreateInInventory("M67Grenade"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(2); itemEnt = itemTop.GetInventory().CreateInInventory("Morphine"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(2); itemEnt = itemTop.GetInventory().CreateInInventory("Epinephrine"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(2); SetRandomHealth(itemEnt); string chemlightArray[] = { "Chemlight_White", "Chemlight_Yellow", "Chemlight_Green", "Chemlight_Red" }; int rndIndex = Math.RandomInt(0, 4); itemEnt = itemTop.GetInventory().CreateInInventory(chemlightArray[rndIndex]); SetRandomHealth(itemEnt); } itemClothing = player.FindAttachmentBySlotName( "Legs" ); if ( itemClothing ) SetRandomHealth( itemClothing ); itemClothing = player.FindAttachmentBySlotName( "Feet" ); if ( itemClothing ) SetRandomHealth( itemClothing ); //___________ My Sets START ____________ float rand = Math.RandomFloatInclusive(0.0, 1.0); if ( rand < 0.1 ) { itemEnt = player.GetInventory().CreateInInventory("FAL"); itemEnt = player.GetInventory().CreateInInventory("Fal_OeBttstck"); itemEnt = player.GetInventory().CreateInInventory("ACOGOptic"); itemEnt = player.GetInventory().CreateInInventory("Mag_FAL_20Rnd"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(6); } if (( rand >= 0.1) && (rand < 0.2 )) { itemEnt = player.GetInventory().CreateInInventory("B95"); itemEnt = player.GetInventory().CreateInInventory("HuntingOptic"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); } if (( rand >= 0.2) && (rand < 0.3 )) { itemEnt = player.GetInventory().CreateInInventory("AK74"); itemEnt = player.GetInventory().CreateInInventory("AK_WoodBttstck"); itemEnt = player.GetInventory().CreateInInventory("AK74_Hndgrd"); itemEnt = player.GetInventory().CreateInInventory("AK_Suppressor"); itemEnt = player.GetInventory().CreateInInventory("Mag_AK74_30Rnd"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(6); } if (( rand >= 0.3) && (rand < 0.4 )) { itemEnt = player.GetInventory().CreateInInventory("MP5K"); itemEnt = player.GetInventory().CreateInInventory("MP5_PlasticHndgrd"); itemEnt = player.GetInventory().CreateInInventory("MP5k_StockBttstck"); itemEnt = player.GetInventory().CreateInInventory("ReflexOptic"); itemEnt = player.GetInventory().CreateInInventory("Battery9V"); itemEnt = player.GetInventory().CreateInInventory("PistolSuppressor"); itemEnt = player.GetInventory().CreateInInventory("Mag_MP5_30Rnd"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(6); } if (( rand >= 0.4) && (rand < 0.5 )) { itemEnt = player.GetInventory().CreateInInventory("CZ61"); itemEnt = player.GetInventory().CreateInInventory("Mag_CZ61_20Rnd"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(6); } if (( rand >= 0.5) && (rand < 0.6 )) { itemEnt = player.GetInventory().CreateInInventory("Winchester70"); itemEnt = player.GetInventory().CreateInInventory("HuntingOptic"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); itemEnt = player.GetInventory().CreateInInventory("Ammo_308Win"); } if (( rand >= 0.6) && (rand < 0.7 )) { itemEnt = player.GetInventory().CreateInInventory("Mosin9130"); itemEnt = player.GetInventory().CreateInInventory("Mosin_Compensator"); itemEnt = player.GetInventory().CreateInInventory("PUScopeOptic"); itemEnt = player.GetInventory().CreateInInventory("Ammo_762x54"); itemEnt = player.GetInventory().CreateInInventory("Ammo_762x54"); itemEnt = player.GetInventory().CreateInInventory("Ammo_762x54"); } if (( rand >= 0.7) && (rand < 0.8 )) { itemEnt = player.GetInventory().CreateInInventory("Colt1911"); itemEnt = player.GetInventory().CreateInInventory("PistolSuppressor"); itemEnt = player.GetInventory().CreateInInventory("Mag_1911_7Rnd"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(9); } if (( rand >= 0.8) && (rand < 0.9 )) { itemEnt = player.GetInventory().CreateInInventory("Izh18"); itemEnt = player.GetInventory().CreateInInventory("Ammo_762x39"); itemEnt = player.GetInventory().CreateInInventory("Ammo_762x39"); itemEnt = player.GetInventory().CreateInInventory("Ammo_762x39"); itemEnt = player.GetInventory().CreateInInventory("Ammo_762x39"); } if (( rand >= 0.9) && (rand < 1.0 )) { itemEnt = player.GetInventory().CreateInInventory("CZ527"); itemEnt = player.GetInventory().CreateInInventory("HuntingOptic"); itemEnt = player.GetInventory().CreateInInventory("Mag_CZ527_5rnd"); if ( Class.CastTo(itemBs, itemEnt ) ) itemBs.SetQuantity(9); } //___________ My Sets END ____________ } } Mission CreateCustomMission(string path) { return new CustomMission(); } но как по мне, проще было бы целочисленное число генерировать, и из него исходить по условию или блоку switch-case, так хоть ограничений бы не было в размете от 0.0 до 1.0
  9. 1 балл
    BorizzK

    Проблемы с рандомным стартовым лутом

    Че за нафиг? if (rand 0.1 < 0.2) Если перед этим rand = Math.RadomFloatInclusive(0.0, 1.0) Тогда if (rand < 0.1)
  10. 1 балл
    Васю Пирогова не обижайте он просто пишет код - не более
  11. 1 балл
    vitacite

    Как сделать свой рюкзак.

    Пример содержит незабинаренные *_m.p3d рюкзака camel, материалы и конфиги... текстур нет :))
  12. 0 баллов
    Сань привет я писал ему в ВК(Руслану), мягко говоря впечатлен его отношением к продажам) А боты эти у меня есть, протестировал - работают. Без обид для разрабов, не стоят они 15К.
  13. 0 баллов
    DrTauren

    Ретекстур чего угодно. (camoSelections)

    @vitacite шикарно. Всем бы такую активность на форуме (в том числе и мне времени бы побольше на эту активность) ?
×
×
  • Создать...

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

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

Поддержка