Нужна помощь?
Создайте тему в соответствующем разделе
Не нужно писать всё в чат!Загляните на торговую площадку
Там вы можете купить
всё что касается игровых серверовНе хотите бан?
Пожалуйста, ознакомьтесь с нашими правилами
Не нарушайте порядок!Продаёте или покупаете?
Пользуйтесь услугами гаранта
Мы сделаем вашу сделку безопасной
Таблица лидеров
Популярные публикации
Отображаются публикации с наибольшей репутацией на 08/12/23 во всех областях
-
1 баллПостоянный вопрос - как спавнить лут в зомби. Ванильные зомби изначально имеют инвентарь. Модовые-не всегда, поэтому тут или обращаться к разработчику мода или пробовать в меру возможности переписать конфиг у мода (как-рассматривается в профильных темах). Пример: class MyZombie; // ID зомби { class Cargo //указываешь, что у этого зомби есть карго { itemsCargoSize[]={4,4}; //Размер инвентаря allowOwnedCargoManipulation=1; //Возможность взять openable=0; //Доступность }; }; Далее есть три варианта спавна лута. Первый-с помощью пресетов Второй-с помощью карго Третий-смешанный Для первого варианта переходим в папку cfgrandompresets.xml , создаём нужны нам "набор", "пресет". <cargo chance="Шанс спавна пресета от 0 до 1" name="Наименование вашего персета"> <item name="ID лута" chance="Шанс выпадения лута от 0 до 1" /> <item name="ID лута" chance="Шанс выпадения лута" /> <item name="ID лута" chance="Шанс выпадения лута" /> <item name="ID лута" chance="Шанс выпадения лута" /> <item name="ID лута" chance="Шанс выпадения лута" /> <item name="ID лута" chance="Шанс выпадения лута" /> <item name="ID лута" chance="Шанс выпадения лута" /> </cargo> Количество предметов может быть любым но заспанится только один или вообще ни одного. Механика работает следующем образом. Шанс выпадения пресета - если рандомайзер выдаст число больше или равное вашему шансу что в пресете то спавн считается верным и переходит к проверке лута,если нет-спавна не будет. Грубо говоря если прописать 0 то спавна не будет, если 1.0 то пресет заспанится обязательно если лут пройдёт проверку (ниже). Далее аналогично шансу пресета рассчитывается выпадение каждого лута, если при проверке один должен заспавнится - остальные не проверяются. Если ни один не проходит проверку - спавна не будет. Если прописать 0, то лут точно никогда не заспавнится, если 1.0 то спавн будет. Порядок проверки лута случаен. (или псевдослучаен, если быть точнее). Поэтому если все вещи имеют шанс 1.0 то выпадет только одна из. Далее переходим в файл cfgspawnabletypes.xml . Находим вашего НПС или вписываем своего. <type name="ID вашего НПС"> <cargo preset="Имя вашего пресета" /> <cargo preset="toolsIndustrial (как пример с ванили)" /> <attachments preset="аттачменты НПС если они прописаны" /> <attachments preset="hatsIndustrial (как пример с ванили)" /> <attachments preset="bagsIndustrial" /> <attachments preset="vestsIndustrial" /> </type> НПС может иметь сколько угодно пресетов, для каждого походит расчёт на спавн лута. Если и из первого и второго, как примере, должен заспавнится лут-в НПС будет две вещи. Внимание! Спавнер не умеет поворачивать вещи в инвентаре и "играть в тэтрис". Если лут не помещается - спавна не будет! Что дают нам пресеты при спавне - рэндом спавна вещей из списка пресета. Второй вариант. Переходим сразу в файл cfgspawnabletypes.xml Находим НПС или вписываем своего <type name="ID вашего НПС"> <cargo chance="Шанс выпадения лута от 0 до 1"> <item name="ID лута" chance="Шанс выпадения конкретного лута от 0 до 1" /> <item name="ID лута" chance="Шанс выпадения конкретного лута от 0 до 1" /> <item name="ID лута" chance="Шанс выпадения конкретного лута от 0 до 1" /> </cargo> <cargo chance="Шанс выпадения лута от 0 до 1"> <item name="ID лута" chance="Шанс выпадения конкретного лута от 0 до 1" /> </cargo> <attachments preset="glassesVillage" /> <attachments preset="hatsPrisoner" /> </type> Всё одинаково с первым вариантом, используется чаще всего когда нужно прописать спавн одной-двух вещей, что бы не плодить пресеты. Или вы хотите конкретному НПС давать в инвентарь конкретную вещь. Третий вариант просто гибрид первого и второго варианта. Как пример. <type name="ZmbM_HikerSkinny_Yellow"> <cargo preset="foodHermit" /> <cargo preset="toolsHermit" /> <cargo chance="0.5"> <item name="TLRLight" chance="1.0" /> </cargo> <attachments preset="hatsFarm" /> <attachments preset="Headtorches" /> </type> ....У НПС есть шанс появления лута из пресета foodHermit и toolsHermit или оба два:) и шанс 0.5 TLRLight . И ещё раз, СПАВНЕР НЕ УМЕЕТ ИГРАТЬ В ТЭТРИС С ВАШИМ ЛУТОМ В ИНВЕНТАРЕ! Иногда когда используется второй вариант при обязательном спавне лута приходится менять порядок. Бывает что помогает. Насчёт расчёта шанса, можно считать что 1.0 это 100%, а 0.01 это один процент. Если кому так легче. Как то так.... создано в соавторстве с @skadjna
-
1 баллЗдравствуйте уважаемые форумчане. Столкнулся с такой проблемой, расчет соотношений дня и ночи, перечитал много статей, скачивал много калькуляторов, но все это не работало. Решил разобраться сам во всем. В итоге, со всеми проверками у меня ушел целый день! Начнем ломать устоявшиеся стереотипы!? Наверное самое ошибочное что было практически во всех статьях это то, что "serverTimeAcceleration" это общее продолжительность игровых суток, может я многих разочарую, но это не так, это функция на ускорение дня и не более, ночи и игровых суток там нет, (да он является триггером для ночи, но отвечает только за дневное ускорение). Теперь все по порядку. В DeyZ все просто, игровые сутки разделены на 2 части, 12 часов дня и 12 часов ночи (ночь с закатами и рассветами) функция serverTimeAcceleration отвечает за ускорение 12 часов игрового дня, а функция serverNightTimeAcceleration отвечает за ускорение вторых 12 часов ночного игрового времени, только с той разницей, что по умолчанию значение serverNightTimeAcceleration (ускорение ночи) умножается на значение serverTimeAcceleration (это очевидно, т.к. в реальности продолжительность ночи грубо говоря 8 часов, т.е. 1/3 от суток и уножение ночного ускорения на дневное выполняет это условие). По факту, ночное ускорение времени начинается в 18-00 игрового времени и заканчивается в 6-00 игрового времени (может там дает какое то значение время года, не проверял, но даже если оно и есть по сути оно не важно и будет максимум выражаться в минутах). Получается вы можете настроить продолжительность дня и ночи так, как вам удобно. Теперь к расчетам, начнем со всеми любимыми 4 часами, допустим мы хотим что бы день был 3 часа, а ночь 1 час. Считаем: Всегда начинаем считать день, т.к serverNightTimeAcceleration по дефолту умножается уже на известное число, итак. Так как у нас игровые сутки разделены на 2 части 12 часов дня и 12 часов ночи (с закатами и рассветами) то берем наши 12 часов от дневных игровых суток и делим их на 3 часа реального времени ( это то время, за которое у нас пройдет полный игровой день (без ночи) ) 12/3=4 вот мы и получили serverTimeAcceleration и он равен 4 (serverTimeAcceleration = 4), идем дальше и считаем множитель ночи, она у нас должна быть 1 (реальный час), делим вторые (ночные) 12 часов на 1 час того времени (ночного) которое мы хотим получить, получаем 12 (что бы ночь прошла за час, она должна идти в 12 раз быстрее) соответственно 12/1=12 но тут вспоминаем то, что у нас ночной множитель, который умножается на дневной, т.к. мы идем расчетом от обратного, на нужно ночное ускорение 12 поделить на дневное ускорение 4 и мы получим 3 итого serverNightTimeAcceleration = 3. Пройдемся просто по цифрам 12/3=4 (день); 12/1=12/4=3 (ночь) Теперь посчитаем соотношение 2 часа дневного времени и 2 часа ночного времени: 12/2=6 (serverTimeAcceleration = 6) 12/2=6/6=1 (serverNightTimeAcceleration = 1). Надеюсь что вы поняли мои расчеты, если не так, то прикрепляю таблицу ехель в ней нужно вставить только нужные вам значение, остальное она сама все посчитает, надеюсь что она вам поможет. PS1:На всякий случай, все тесты делались с "serverTime="1979/10/22/06/00";" PS2: В serverDZ.cfg на оф сайте богемии, разделитель множителя с десятичным значением показана запятая, это не так, ставьте точку. Если вы этого не учтете, то движок возьмет целое число, т.е. если вы поставите serverTimeAcceleration = 4,8 (вместо точки запятую) то движок будет считать не 4.8 и не будет округлять до 5 а возьмёт целое число 4 и по факту дневное ускорение у вас будет 4 а не 4.8. С точкой все отлично, движок видит и понимает десятичное значение. Правильно serverTimeAcceleration = 4.8 09.01.2023 г. Решил добить до конца вопрос и развенчиваю последний миф, времена года никак не влияют на продолжительность дней и ночей, оно всегда равно 12 часов день и 12 часов ночь.
-
1 балл
Регистрация анимации предметов в руках
MasterHiggins отреагировал на
aimlock за сообщение в теме
Всем привет, я заметил что некоторые люди не до конца понимают что такое регистрация анимаций для предметов в руках, как ее правильно делать и для чего она нужна? Для чего это нужно? Допустим вы добавляете предмет в игру и не привязываете его ни к какому объекту (создаете полностью с нуля, задаете свойства) и сталкиваетесь с тем что ваш объект без привязки не имеет должной анимации. А имеет стандартную анимацию банки консервы (в том числе и для предметов которые должны держаться в 2 руках), ну или вовсе предмет находиться в ногах у персонажа (примеры прикрепил скриншоты). Именно для этого и нужно привязывать анимацию положения объекта в руках через скрипт. На момент написания этого поста я знаю 3 вида регистрации анимаций для предметов в руках: 1. PlayerBase 2. JMAnimRegister 3. ModItemRegisterCallbacks До создания последних 2 способов все использовали PlayerBase : modded class PlayerBase { override void Init() { DayzPlayerItemBehaviorCfg fireArmsItemBehaviour = new DayzPlayerItemBehaviorCfg; fireArmsItemBehaviour.SetFirearms(); GetDayZPlayerType().AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", fireArmsItemBehaviour, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm"); super.Init(); } } Но у этого способа есть очень большой минус, это очень нестабильная штука. Нередко крашила сервера и имела ограничения на кол-во регистрации анимаций. С такими большими минусами, мододеллы начали искать решения как можно сделать это более стабильно и оптимизированно. И такой способ нашли. DayZPlayerTypeRegisterItems(DayZPlayerType Type) вот наше спасение, но тут тоже не все так просто, полумолчание это функция внутри класса, а для поставленной задачи (иметь возможность безопасно и стабильно вносить новую регистрацию предметов) это не подходит. Тогда разработчики мода CF создали кастомный класс с использованием схожих функций для регистрации анимаций положений предметов в руках. Этим классом является JMAnimRegister. Стабильная и оптимизированная функция, которой очень просто пользоваться. Разумеется использовать вы сможете этот класс только при наличии в своей сборке CF . Как им пользоваться? modded class JMAnimRegister { override void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) { super.OnRegisterFireArms( pType, pBehavior ); pType..AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm"); } }; Как самый простой пример. И так можно задавать любому количеству предметов положение в руках : modded class JMAnimRegister { override void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) { super.OnRegisterFireArms( pType, pBehavior ); pType..AddItemInHandsProfileIK("MyModdedWeapon", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm"); pType..AddItemInHandsProfileIK("MyModdedWeapon2", "dz/anims/workspaces/player/player_main/weapons/player_main_cz527.asi", pBehavior, "dz/anims/anm/player/ik/weapons/cz527.anm", "dz/anims/anm/player/reloads/cz527/w_CZ527_states.anm"); } }; Прошу обратить внимание, что мы используем modded, мы модифицируем уже существующий класс внутри мода CF . Как изначально и playerbase JMAnimRegister находиться в директории 4_World. Позже класс был доработан и добавлены более тонкие настройки : void OnRegisterEmptyHanded( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ){} void OnRegisterTwoHanded( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterOneHanded( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterRestrained( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterSurrender( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterHeavy( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterPistol( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterFireArms( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterArcheryItem( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnRegisterLauncher( DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior ) {} void OnBoneRemapping( DayZPlayerType pType ) {} Думаю комментировать не нужно и так понятно что за что отвечает! Тогда для чего нужен класс ModItemRegisterCallbacks ? Это класс, который был добавлен в v1.08, следовательно, он работает без любых модификаций, на чистом DayZ. modded class ModItemRegisterCallbacks { void RegisterEmptyHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterTwoHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterRestrained(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterSurrender(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterHeavy(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterPistol(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterFireArms(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterArcheryItem(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterLauncher(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior); void RegisterCustom(DayZPlayerType pType); void CustomBoneRemapping(DayZPlayerType pType); } Пример использования : modded class ModItemRegisterCallbacks { override void RegisterOneHanded(DayZPlayerType pType, DayzPlayerItemBehaviorCfg pBehavior) { super.RegisterOneHanded(pType, pBehavior); pType.AddItemInHandsProfileIK("твой предмет", "dz/anims/workspaces/player/player_main/props/player_main_1h_matchbox.asi", pBehavior, "dz/anims/anm/player/ik/gear/book.anm"); pType.AddItemInHandsProfileIK("твой предмет 2", "dz/anims/workspaces/player/player_main/props/player_main_1h_matchbox.asi", pBehavior, "dz/anims/anm/player/ik/gear/book.anm"); } } "dz/anims/workspaces/player/player_main/props/player_main_1h_matchbox.asi" "dz/anims/anm/player/ik/gear/book.anm" это пути до анимаций, почему 2? Одна для положения предмета в руке, вторая для анимации самой кисти персонажа. И в заключении : какой из способов наиболее эффективен? Это зависит от вас, используйте то что удобно для вас (главное не через playerbase). -
1 баллДоброго времени форумчане. Не давно искал как в мод Radio добавить свои песни. Не нашел, и решил изучить этот вопрос сам. Знаний языков у меня нету. Сразу скажу что автор этого мода явно не одобрит, ибо как я понял это перепаковка мода которую не кто не любит,оффицалам лучьше сваязаться с автором мода! Пиратам, а что пиратам,пиратам пофигу, но есть совесть. Лично я просто добавил музыку и не чего более не менял. И так начнем первое нам понадобиться PBO В теме у @123new возьмите. Загрузить не смог большой файл! Распаковываем мод(@Radio\Addons\YK_Radio.pbo) прога PBO и заходим в папку Cassettes Копируем любую папку и переименовываем под себя, я взял для эксперимента папку Tatu и назвал Osiris. Далее открываем в Dayz Tools в папку CfgConvert и переносим файл config.bin на файл BINToCPP.bat что в папке CfgConvert и получаtм раскодированный файл config.cpp открываем его и видим(Говорю сразу, знаний языков программирования у меня нету) заменяем все "NasNeDogoniat" на названия папки class CfgPatches { class YK_Cassette_Tatu { units[]= { "YK_Cassette_NasNeDogoniat" }; weapons[]={}; requiredVersion=0.1; requiredAddons[]= { "DZ_Data" }; }; }; class CfgVehicles { class YK_Cassette_Base; class YK_Cassette_NasNeDogoniat: YK_Cassette_Base { scope=2; displayName="$STR_NasNeDogoniat"; descriptionShort="$STR_NasNeDogoniat_desc"; hiddenSelectionsTextures[]= { "YK_Radio\Cassettes\Tatu\sounds\NasNeDogoniat.paa" }; class CfgCassette { soundSet="YK_SoundSet_NasNeDogoniat"; }; }; }; class CfgSoundSets { class Mods_SoundSet_Base; class YK_SoundSet_NasNeDogoniat { soundShaders[]= { "YK_NasNeDogoniat_Shader" }; }; }; class CfgSoundShaders { class YK_Cassette_SoundShader_Base; class YK_NasNeDogoniat_Shader: YK_Cassette_SoundShader_Base { samples[]= { { "YK_Radio\Cassettes\Tatu\sounds\NasNeDogoniat", 1 } }; }; }; И вот что у меня вышло class CfgPatches { class YK_Cassette_Osiris { units[]= { "YK_Cassette_Osiris" }; weapons[]={}; requiredVersion=0.1; requiredAddons[]= { "DZ_Data" }; }; }; class CfgVehicles { class YK_Cassette_Base; class YK_Cassette_Osiris: YK_Cassette_Base { scope=2; displayName="$STR_Osiris"; //первый раз я это не заменял и не было в админке видно descriptionShort="$STR_Osiris_desc"; //первый раз я это не заменял и не было в админке видно hiddenSelectionsTextures[]= { "YK_Radio\Cassettes\Osiris\sounds\Osiris.paa" // это картинка касеты }; class CfgCassette { soundSet="YK_SoundSet_Osiris"; }; }; }; class CfgSoundSets { class Mods_SoundSet_Base; class YK_SoundSet_Osiris { soundShaders[]= { "YK_Osiris_Shader" }; }; }; class CfgSoundShaders { class YK_Cassette_SoundShader_Base; class YK_Osiris_Shader: YK_Cassette_SoundShader_Base { samples[]= { { "YK_Radio\Cassettes\Osiris\sounds\Osiris", 1 } }; }; }; Далее конвертируем нужную нам музыку(Есть бесплатные конвертеры) в расширение .ogg и в пути(YK_Radio\Cassettes\Osiris\sounds) меняем название на нашу(Osiris) это названия трека. Так же там меняем картинку (YK_Radio\Cassettes\Osiris\sounds) названия.paa после того как все сделали упаковываем обратно с помощью PBO и создаем ключ, как это сделать расcказал @NoNameUltima . У меня все работает! Может я что то не сильно доходчиво объяснил.
-
1 баллКу! Выкладываю скрипт, который позволяет спавнить аномалии по таймеру, т.е. Аномалия спавнится, срабатывает и исчезает и так циклично. Для данного скрипта, требуется мод на аномалии, абсолютно любой, то-ли от Совы, либо от Никрона, используйте любые, будет работать... Заливать в мод, не требуется! Что-бы скрипт заработал, в Init.c нужно добавить строку, в самом начале: #include "$CurrentDir:mpmissions\Dayz.ExclusionZone\AnomalyElectraTimer.c" Сам скрипт: ref AnomalyElectraTimer m_AnomalyElectraTimer = new AnomalyElectraTimer(); class AnomalyElectraTimer { ref TVectorArray positions = { "(Координата без запятых)" //Просто вставь координату, в формате "X Y Z", Если координат много то: "X Y Z", "X Y Z" и т.д. }; ref array<EntityAI> objects = new array<EntityAI>; void AnomalyElectraTimer() { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.AnomalyTimer, 1 * 1000, true) GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.AnomalyTimerClear, 60 * 1000, true); } void AnomalyTimerClear() { for (private int i = 0; i < objects.Count(); i++) { GetGame().ObjectDelete(objects[i]); } objects.Clear(); } void AnomalyTimer() { objects.Insert(GetGame().CreateObject("(Название аномалии)", positions[Math.RandomInt(0, positions.Count() - 1)])); //Название аномалии должно быть с припиской Active, пример: "Electra_Active" } }
-
0 баллов/* Прописываем в Init.c данный конфиг #include "$CurrentDir:mpmissions\"Папка Миссии"\Speedrun.c" */ ref SpeedrunTimer m_SpeedrunTimer = new SpeedrunTimer(); class SpeedrunTimer { ref TStringArray unlimitedStamina = { //"ClassName предмета, с помощью которого будет бесканечная стамина" }; ref TStringArray gasMaskTimer = { //"ClassName предмета, с помощью которого будет заторможенная стамина" }; ref array<EntityAI> objects = new array<EntityAI>; void SpeedrunTimer() { GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(this.SpeedTimer, 1 * 500, true) } void SpeedTimer() { //GetGame().GetServerFPS(); //Print(); int MASK_TIMER = 5000 * 2; ref array<Man> players = new array<Man>; GetGame().GetPlayers( players ); for ( int i = 0; i < players.Count(); i++ ) { PlayerBase player = PlayerBase.Cast(players.Get(i)); if(!player.IsAlive()) return; int attachmentCount = player.GetInventory().AttachmentCount(); for (int aItem = 0; aItem < attachmentCount; aItem++) { EntityAI attachment = player.GetInventory().GetAttachmentFromIndex(aItem); if (attachment.IsItemBase()) { ItemBase item = ItemBase.Cast(attachment); if (unlimitedStamina.Find(item.GetType()) >= 0 ) { player.GetStaminaHandler().SetStamina(100); } if (gasMaskTimer.Find(item.GetType()) >= 0 ) { float health_remove = 0; int attachCount = item.GetInventory().AttachmentCount(); if (attachCount > 0) { for ( int x = 0; x < attachCount; x++ ) { ItemBase itemFilter = ItemBase.Cast( item.GetInventory().GetAttachmentFromIndex( x ) ); if (itemFilter.GetHealth("", "Health") > 0) { health_remove = itemFilter.GetMaxHealth()/MASK_TIMER; itemFilter.DecreaseHealth( "", "", health_remove ); itemFilter.AddHealth("", "", -health_remove); itemFilter.SetQuantity(Math.Round(itemFilter.GetQuantityMax()*(itemFilter.GetHealth()))/(itemFilter.GetMaxHealth())); } else { player.AddHealth("", "Health", -0.1); } } } else { if (item.GetHealth("", "Health") > 0 ) { health_remove = item.GetMaxHealth()/MASK_TIMER; item.DecreaseHealth( "", "", health_remove ); item.AddHealth("", "", -health_remove); item.SetQuantity(Math.Round(item.GetQuantityMax()*(item.GetHealth()))/(item.GetMaxHealth())); } else { player.AddHealth("", "Health", -0.1); } } } } } } } } Возможно есть ошибки, но у меня корректно работает на чистом серве... Приятного пользования! мой диск: ᴍᴇʟɴɪᴋᴏᴠ#3249
-
Рассылка
