Перейти к контенту

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

  1. krovosnork

    krovosnork

    Опытные


    • Баллы

      5

    • Число публикаций

      353


  2. 2clip

    2clip

    Опытные


    • Баллы

      4

    • Число публикаций

      166


  3. sabbat8310

    sabbat8310

    Проверенные


    • Баллы

      3

    • Число публикаций

      112


  4. Murarius

     Murarius

     Администраторы


    • Баллы

      3

    • Число публикаций

      13 691


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

Отображает публикации с лучшим балансом оценок с 27.04.2015 во всех приложениях

  1. Доброго времени суток, друзья. Что-то я давно не писал новостей, вот вам, пожалуй, парочка: 1. Бесшовная Зона. Как вы могли видеть раньше в видео, мы экспериментируем со склеиванием уровней. Если тестирование и заселение первого уровня (6 наземных + 2 подземные локации + новая геометрия) пройдет успешно, то доработанную версию локации вы увидите в "Петле Времени", то есть в нашей модификации. Ниже вы можете увидеть несколько рабочих скринов: 2. Подземелья Припяти. Локация разрабатывается совместно с Shadows`ом. Большая часть уровня уже затекстурирована, понемногу дорабатывается - добавляем новые детали, шлифуем старые. В заключение, хотелось бы выразить отдельную благодарность тов. abramcumner, без его помощи дальнейшая работа над локацией была бы невозможна, Павлу (Образец-47) и Глебу (Wolfram) за обнаружение огромного количества багов, а так же всем остальным, кто принимал участие в тестировании. Спасибо вам, друзья, что оставались с нами, новую информацию ждите через месяц.
    5 баллов
  2. бросаются потому что сейчас они на одном холсте. В игре рядом друг с другом данные розетку\выключатель практически(если не совсем)не встретишь.
    4 балла
  3. ОП-2. Бессмертные квестовики. 2.09-1 - 2 Скачать
    3 балла
  4. В общем, с ящиком, поскольку вариант shadowman'a когда-то еще увидит свет, если вообще увидит, а от того, что было - откровенно тошнит, на скорую руку слабал ящик-утилизатор. Из двух предметов делаем один. Наличие ремкомплектов (в ящике 3 штуки каждого вида, и не более того, докупаемы) - позволяет либо потихоньку "полировать" без запчастей (какой-то степени убитости, если в хлам - года за 2 игрового времени и сотней комплектов можно вытянуть, да, будем считать, что недостающие части лобзиком выпиливали), либо улучшить результат сборки полутрупа из двух трупов. Без ремкомплекта 100% получить невозможно (впрочем, с ними - тоже). Попытка ремонтировать что-либо 100% исправности результат дает печальный. большая картинка и еще, для наглядности Разбору на запчасти "впрок" решил отказать: тоже захламление инвентаря, + неизвестно, какие запчасти реально могут потребоваться. Мда, про что я: если есть идеи, что тут можно радикально улучшить, не сильно напрягаясь - желаю их услышать. Upd: графика и вообще весь интерфейс предельно аскетичный, по тому как важность этого компонента для игры - примерно такая же. Не вижу смысла напрягаться. 2 Murarius: Традиционно оставлено оружие и костюмы. Рем-ящик содержит в себе инструменты + запасные винты/гвозди/шкурку/масло/клей/ветошь. Да, основная идея именно в том, что единственную подкову от блохи отдираем, и приделываем охромевшей. Причем только от блохи - блохе. От таракана не подойдет. И поскольку подкова уже б/у - результат не 100%. Даже при перековывании с полностью комплектной блохи на полностью комплектную. Да, "донор" считается полностью разобранным в поисках наиболее сохранившихся подков и выпиливания недостающих из него-же. 2 Zander_driver: прав, прав. Делаются - как хочется автору. А вот играются потом... Так, как хочется игроку. upd: весь набор - здесь: http://www.amk-team.ru/forum/index.php?showtopic=8830&p=937187
    2 балла
  5. При загрузке одной из локаций стало стабильно выбивать игру с таким логом: Загрузка шейдеров... stack trace: 0023:0049FF36 XR_3DA.exe, CBlender_Compile::_lua_Compile() 0023:00493DD0 XR_3DA.exe, CResourceManager::Create() Возможно, как-то связано с текстурами, над которыми я работаю все последнее время. Но куда копать, даже близко не знаю. Если кто сталкивался с подобным - разъясните. upd. Разобрался. На локации был "кривой" файл level. Скорее всего допустил где-то ошибку во время его правки и перекомпиляции.
    2 балла
  6. За два вечера сделал пикрелейтед. Надеюсь, выйдет не слишком много полигонов, а то на старых компьютерах такая-то геометрия будет лагать. Полный вариант обязателен к просмотру, на нём можно увидеть все детали.
    2 балла
  7. - да. Снайперов на вышках сначала сними - остальное по чертежам.
    2 балла
  8. Вот это - лишнее: Инструкции по удалению - для тех, кто уже играл с предыдущими версиями мода с более ранними патчами и обновлениями. А вы ведь "с нуля" мод ставите? Зачем же удалять-то? И не понял, почему update_9 ставите? Последний же №16. Каждый следующий апдейт - кумулятивный (включающий все изменения предыдущего).
    2 балла
  9. @tihik, Этот убийца сидит в углу (бетонные плиты), он одиночка. Тот которого он завалить двигается со стороны "Грузовика смерти" - тоже одиночка! Ну, на элеваторе делать нечего. А вот подождать у перехода стоит.
    2 балла
  10. scripts\zvuki.script: комментируем следующее в функции use_snd и можем юзать предметы в инвентаре без закрытия инвентаря. Удобно при ремонте. if has_alife_info("ui_inventory") then level.start_stop_menu(level.main_input_receiver(), true) end
    2 балла
  11. Если кому-то еще не понятны причины перехода на ЗП, который одобрил лично Я, один из самых яростных противников ЧН/ЗП, обьясняю: 1 Локации LW больше не могут работать стабильно на движке ТЧ, какие бы хай-тек костыли на него не ставили. 2 Команда клятвенно обещала сделать все возможное, чтобы я смог работать на ЗП, я готов освоить его хоть с 0, ради своей команды, ради дальнейшей жизни LW. 3 После слитых исходников, единственная разница движков это их возраст и убогость кода. Мы всего лишь поменяли платформу кода, на более молодую. 4 Атмосфера LW - неделимый элемент, это не атмосфера ни ТЧ ни ЗП, я наделю душой LW и движок ЗП, главное чтобы в это верили те, кто верит в LW. Те кто знали мою позицию ранее, поймут какой ценой далось мне согласие на переезд. LW на ЗП никто из вас не может себе представить. Зато я могу, я вижу чем болен ЗП, и я его вылечу. А потому оставьте ваш пессимизм за периметром. Еще нет ничего, что дало бы вам повод для дискуссий о результатах.
    2 балла
  12. @tihik, Для ближнего боя изумительна монтировка Фримена и патроны не нужно тягать, с одного удара практически всех ложит, химеру с двух. Для остальных, до x16, есть убойная awp. Так как в этом моде по умолчанию не отключен прицел, попасть со средней дистанции не проблема и без прицела, да патронов к ней меньше тягать.
    1 балл
  13. @tihik, Монолит и наймов - бесполезно. Солдаты и бандиты бывают сереют, но не всегда
    1 балл
  14. Пытался лечить врагов, но ни один из них, даже нейтральным не становится. У кого-нибудь после лечения враг становился другом или нейтралом? А то мне надоело уже отстреливаться каждый раз после излечения. С нейтралами все в порядке. подлечил - другом стал.
    1 балл
  15. http://absolute.crommcruac.com/shadow-of-chernobyl/download.php
    1 балл
  16. "История Прибоя " , не ? Играл в него давненько, но уж чего-чего, а травы, кустов, деревьев и зелени там было выше Меченного. Сюжет вырежешь, а трава останется.
    1 балл
  17. @prjnik, у Осведомителя в Баре, можно купить нейтралитет и попробовать начинать отстреливать с этих двух у ямы. Если заходить сразу с боем, валят и этого и второго, в подвале.
    1 балл
  18. VAVKA Они в игрушку добавили реактивную установку типа "Град". )))
    1 балл
  19. левый верхний выключатель и левая нижняя розетка имеют совершенно одинаковую основу. Одну из них надо было развернуть, а то в глаза бросается.
    1 балл
  20. Делал для себя, но может кому то пригодится: Переработанный HUD Heroin_Zero И погода... Ребята, приношу свои извинения, совсем забыл про шкалы шума и видимости. Исправил и перезалил. Кто скачал до 29.04 перекачайте. Сделал ещё один вариант худа, что то среднее между оригиналом и Heroin_Zero. Так же убраны панель артов (зачем они на экране) и шкала радиации (тоже лишнее, хватает иконки сбоку). Чуть изменил цвета и добавил прозрачности. И отдельно биорадар. Изменил текстуру, уменьшил размер. Увеличил радиус захвата до 90м, может читерно (хотя минимальный eye_range в ОГСЕ не меньше 110 метров), но всё же это ценный и редкий прибор (которого нет в продаже). Просто с дальностью в 45м от него нет большого толка.
    1 балл
  21. Работая над новой версией своей текстурной сборки, решил поделится с форумчанами парой наработок по тем текстурам, о которых почти всегда забывают модмейкеры. В архиве:
    1 балл
  22. "Это вот зачем ты так сделал ? " © 1. ставишь ОГСЕ 2. ставишь STALKER_OGSE_0693_OBT_wipe_2_stable 3. ставишь STALKER_OGSE_0693_OBT_wipe_2_stable_up_16 4. Начинаешь НИ. 5. Всё.
    1 балл
  23. Отрадно видеть, что заветы Ильича АМК не забыты, и на форуме, как и раньше, царит атмосфера "пред за орфографию, рид онли за пунктуацию".))) Честно, боюсь даже представить, как вы в интернеты выходите, учитывая тотальную безграмотность его обитателей. Между событиями СВ1 и СВ3 - весьма значительный временной разрыв. События, произошедшие в этот период, кардинально повлияли на Зону, её территорию, обитателей, "правила игры". Изменилось отношение мировой общественности к проблеме Зоны в виду её экспотенциального роста. Именно тогда стали возводить новый Периметр (ибо старый, известный игрокам еще со времен Кордона в ТЧ или ЧН, остался глубоко "в тылу" Зоны, в виду роста её территории), на базе Периметра - исследовательские комплексы и экспериментальные установки, призванные сначала остановить рост Зоны, а затем - позволить всесторонне её изучить и исследовать. И занимается всем этим отнюдь не одна Украина - к "общему делу" официально и неофициально присоединились множество стран и их научный/военный потенциал. С бэкграундом в модификации всё в порядке, плюс ко всему не сценарий пишется по уровням, а уровни моделируются под сценарий, поэтому и Периметр, и исследовательские комплексы целиком и полностью вписаны в сюжет. Я бы даже сказал - играют там немаловажную роль, пусть и эпизодическую. Что же до "поновее" - именно эти левелы самые что ни на есть "поновее", то бишь с нуля. А х18 под Темной долиной сходу вряд ли кто узнает, изменения там кардинальные отнюдь не от слова "мы накидали там мусора и заспавнили мутантов", геометрия и освещение серьезно переработаны.
    1 балл
  24. I drooled to save Angela ... But anyway ... Hourrah ... She's safe and sound! http://i.imgur.com/AP8mWok.jpg http://i.imgur.com/jbQuqdS.jpg Awesome quest...Thank a lot for such moment of pleasure game! Congratulations.
    1 балл
  25. От мин есть маленько пользы. Пользуюсь ими иногда: квест на контриков на болотах, - раскидал по деревне; квест по Сепатору; взятие диска на атп; квест полковнику долговскому на складах в первый заход, - забыл как его звали; на блокпосту на кордоне раскиданы у меня, чтоб им жисть мёдом не казалась. Можно найти применение.
    1 балл
  26. @Korpus, Держи http://rghost.ru/6yc5Q6TtZ http://rghost.ru/6sgdDtdKs http://rghost.ru/87gbjjdxl
    1 балл
  27. Название новой версии LW - Quantum. Квант. Сразу говорю, что названия берутся не с потолка, они приходят сами, и каждая означает определенное настроение в моде. Квант для новой версии это символ того неделимого, что всегда есть в любом LW.
    1 балл
  28. Во суббо-о-ту День нена-а-астный. Нельзя в поле, Да нельзя в поле !
    1 балл
  29. Кстати, у меня сегодня был хентай с тенкалями (в смысле, ФГС, и, да, какое-то время еще жить буду, но, да, хреново), так ни кто ничего не пишет, и даже не набирает. Просто распечатывается подходящий образец из заранее заготовленных. И, да, кстати: http://pikabu.ru/story/esli_byi_vrachi_delali_logotipyi_3225119
    1 балл
  30. @Globus, @Sarmat80, @VVV32768, ребята, по непоняткам связанным с Прохоровым и его транспондером и я упоминал, и говорено было уже не раз ... а с новыми отзывами и обстоятельства (глюки) новые открываются ... в общем - "Зона" у каждого своя" - доработка требуется конкретная.
    1 балл
  31. Потому что Саббат еще не купил ниодного контейнера. Они в этом моде недешевые. Все реализовано и работает, как Саббат насобирает хабара чтоб стать побогаче - увидите. Апгрейд для комбезов активно разрабатывается. Для разгрузок - будет но немного. Для рюкзаков нет, что там собственно апгрейдить? В моде три оптических прибора, от поломанного прицела до навороченного бинокля. Купить что-то получше чем прицел, можно у торговцев, и опять же цена кусается.
    1 балл
  32. В первый день Ирбис освоил ЗП. И вышло это шикарно. На второй день команда довела до ума локации. И не был дыр в террейне, как это было в других модах (не в серии ЛВО - там дыр я вообще не видел). И на третий день, наделил Ирбис ЗП душой и атмосферой. И стало небо вечно хмурым, а игра захватывающей. На четвёртый день, вылечил Ирбис движок ЗП. И не было больше в нём недостатков. На пятый день, реализовали они полностью сюжет. На шестой день они тестировали, что вышло в итоге и исправили незначительные недоработки. А на седьмой день состоялся релиз. Библия LWO. Скажу честно, сначала воспринял новость с переходом на ЗП с некоторым недоумением... Но зато сейчас я твёрдо уверен, что перенос состоится успешно. Ребята, я верю в Вас!
    1 балл
  33. Оптимизированые сжатые текстуры, убрана альфа там где пустая, уменьшен размер бампов до 512, повышена четкость. Выйгрыш с 187мб до 46мб небольшой но всетаки http://rghost.ru/748vsmJ4s PS реквестую спаунер и коды на отключение динамической погоды Еще пережал текстуры act/arsenal_mod/metal/bogdan/plakat/ нпс добавил резкость остальное просто 512 http://rghost.ru/8l4fwkQ6N
    1 балл
  34. @User_X.A.R26, @Mirage2000, Нашла ОЛР версии 2.5 вдруг пригодится (ссылку постараюсь держать максимально долго) https://yadi.sk/d/91yQowP0fubgY
    1 балл
  35. Мы тут думали один эксклюзивный контент выпустить 24го...Но Лохотрон слил архивы СДК с некоторыми моделью монстра, которого считали вырезанным...Если что, этот паренек у нас проанимированный и рабочий. Модель появилась еще больше месяца назад. Да, господа, это, чтоб его, работающий морлок!
    1 балл
  36. Лаборатория X-18, первый тест, Зов Припяти.(освещение и качество не финальное)
    1 балл
  37. Есть наработки SGM, еще более продвинутые, чем вы подумали https://yadi.sk/d/WXmQUjusNukrD12Мб. Анимированное использование предметов инвентаря. Авторы: denis2000 (скрипты, модели), Johann (тестовые анимации, модели) Идея: denis2000 Описание: Данное решение позволяет сделать анимированое использование для всех без исключения предметов инвентаря. Таких как: Аптечка, Хлеб, Колбаса, Энергетик, Тушенка, Вакцина, Водка, Мин. вода, Взрывчатка, Пульт от взрывчатки и т.д. Теперь во время использования предмета из инвентаря или из слота быстрого задействования предмет появляется в руках ГГ и благодаря вашим анимациям ГГ может окусывать кусох хлеба, открывать и есть тушенку, использовать инекторы или таблетки, устанавливать взрывчатку и подрывать ее специальным пультом. Видео
    1 балл
  38. @Elz, Оружие - это оружие. Смерть - это человек. Смерть можно причинить и безо всякого оружия, голыми руками, обутыми ногами, автомобилем, столовой ложкой, словом и тэдэ. А оружие необходимо холить и лелеять. Оно и на страже жизни стоит, в том числе.
    1 балл
  39. Автор: chorik Совместимость: любая версия, мод, НИ не надо Размер: 99,9Мб Описание: более контрастные и "состаренные" текстуры. Флору, фауну, небо, воду, визуалы и оружие не трогал Скриншоты, для сравнения дефолтные и переделанные Всем удачи и приятной игры! P.S. в менюшку добавлена композиция Э. Артемьева из к/ф Сталкер (спасибо ivar) 20.02.2010 Исправил ошибки, переделал несколько текстур, например асфальт сделал более тёмным. Спасибо кто ответил и указал на недостатки. Можно перекачать. Скачать версию от 20.02.2010 Немного ИМХО: при игре постоянно казалось, что надо менять очки, всё смотрелось как то расплывчато. Когда распаковал и глянул текстуры, очень расстроился. Ожидал большего, больше половины ещё от ТЧ и ЧН, колличество и качество желают иметь лучшего. Да, будет теперь мастерам работа, что бы довести всё это до нормального вида. Себя особо великим мастером не считаю, и потому на критику не обижусь, а наоборот. Еже ли уж сильно будете пинать, то лучше в личку, не позорьте старика. А может кому и понравится, может я излишне самокритичен? Привет Бродяги! Выкладываю, исправленные txm-ки для текстур detail, убрал прописанный для них бамп. подробнее отписал тут http://www.amk-team.ru/forum/index.php?showtopic=5533&p=919326 скачать https://yadi.sk/d/8ogU3cKlepzWR
    1 балл
  40. @User_X.A.R26, Assets Converter - не распаковщик. Программа - конвертер ассетов (модели, текстуры) и упаковщик db-архивов. Функции распаковки в ней намерено нет (для этого есть отдельная программа S.T.A.L.K.E.R Universal Unpacker).
    1 балл
  41. Так, анинсталл, ибо это не игра, а мега-тренажер для идеального задрота: 1. НПС тырят ВСЁ! Честно, уже запарился искать место, куда они не достают. На Свалке уже запрыгнул на висящий в воздухе контейнер, там подвесил рюкзак, сложил добро, только перехожу на Кордон - уже местный петрович в чате продает мою Грозу 5.45 снятую с покойного Барина! Все собранные Сайги, АК Стрелка - все, что нажито непосильным трудом... эхъ, авторы хотят донести до нас, что в Зоне надо валить всех, ибо кто не враг - тот крыса? Мне не в кайф обходить каждый раз всех нейтралов, искть - какая падла у меня что слямзила и тихонько резать его в темном месте! 2. Дырявый рюкзак - ну это просто мега-находка! 3 дня собираешь эти 40 рук для Акима, перешел 2 локации - их в рюкзаке уже 26. Было 4 аномальных гранаты, иду в бой на следующей локе - а граната-то одна! Пошел к Акиму с "вывертами" прикупить замков, прихожу - ноль, потерялися! И хоть бы один бинтик или там бутерброд хоть раз выпал! Меченый нынче пускающий слюни даун, который не в состоянии контролировать, что у него по карманам распихано? 3. Квестовые НПС мало того, что дохнут, как коматозные - у них все признаки суицидальной шизофрении. Иначе чем объяснить тот факт, что Шустрый несется на АТП к бандитам где и складывает буйну голову, Шерстюк днем (!) оказывается на крыше базы на Агро, где и ловит мою пулю, Лис ковыляет строго к месту спавна бандосов на Свалке где и клеит ласты, Захар как подорваный несется воевать с наемниками... "берегите квестовых" - КАК? За всеми с памперсами ходить? 4. Коллекционер и прочие квесты из серии "пойди туда, не зная куда" - ну понятно, что авторы мода вылизали каждый квадратный сантиметр всей территории Зоны, спросонья способны по памяти дать координаты каждого кустика на Болотах, и от игрока ждут того же. Но невидимые шмотки, которые можно найти, тупо тычась с зажатой F во все углы - это уже перебор. Игра - от слова играть, а не от слова "задротить наглухо"! Я могу представить, что существуют граждане, от души прущиеся от рытья носом по 12 часов в сутки уже до тошноты переигранные пиксели, но я так же уверен, что многим это удовольствие начинает быстро приедаться. 5. Реализм. Ага, ладно - я могу поверить, что ГГ ловит 9*19 пулю со 100 метров глазом и ему нехорошо, это реализм. Но бригады упоротых трамалом и метадоном спецназовцев, принимающих на тушку по обойме бронебойных и только покряхтывающих... братцы, это я не дождался элитных монолитовцев по квесту на экзу ЧД - я понял, что на них я обедненного урана не напасусь! В меня попадают и я падаю, я попадаю - что ветерок подул... как-то не очень реально? Блин, я ждал выхода ОП-2 два года! Я специально купил в апреле SSD-диск и переустановил систему! И увидел, что авторы вместо того, чтобы сделать действительно интересные квесты на безглючной платформе, 90% усилий направили на то, чтобы всех поклонников превратить в задротов. Мега-задротов, супер-задротов! п.с у меня от левой кисти остался 1 палец - детонатор от РГД (настоящей) сработал не вовремя. Мне трудно прыгать, кран на АС с тайником - один из самых ненавистных моих квестов, но я справился. Все эти переходы по проводам, прыжки по балконам - на грани психического срыва, по 30-40 раз сейв-лоад... но я никогда на это не жаловался. Но то, что я вижу сейчас - это мега-задротство, сделанное старательно и с любовью, мега-разочарование для кучи поклонников. Это не игра для удовольствия, а тяжелая работа. Удаляю без жалости, простите, накипело.
    1 балл
  42. Вот кое что от Stalk15. Авторы функций не указаны (Для ТЧ). function spawn_x14 () alife():create("Секция",vector():set(-7.32,-34.48,13.18),1542,2799) end Функции типа "Проверка на взятие предмета..." я лично использую в квестах тегами <function_complete>файл.функция</function_complete> function search_weapon_complete1(actor, npc) if db.actor ~= nil then if db.actor:object("ПРЕДМЕТ") then db.actor:give_info_portion("ПОРШЕНЬ") return true end end return false end local t_wpn = {"ПРЕДМЕТ1", "ПРЕДМЕТ1", "ПРЕДМЕТ1"} function search_ALL_weapons_complete() local gg = db.actor if gg then for i=1,#t_wpn do if not gg:object(t_wpn[i]) then return false end end gg:give_info_portion("ПОРШЕНЬ") return true end return false end Основная функция: function Actor_Has_ListItems(sSection,iNum) if not iNum then iNum = 1 end local oActor = db.actor local iCnt = 0 if oActor and sSection then oActor:iterate_inventory( function (dummy, oItem) if oItem:section() == sSection then iCnt = iCnt + 1 if iCnt >= iNum then return true --/> актор имеет N предметов end end end ,nil) end return iCnt >= iNum --/> имеет ли актор N предметов end Вызов: function search_2_bumazhki_sidr_complete() return this.Actor_Has_ListItems("medkit", 10) end function search_weapon_complete(actor, npc) if db.actor ~= nil then return db.actor:object("wpn_vintorez")~=nil end return false end function have_docs_from_x14(first_speaker, second_speaker) return first_speaker:object("ПРЕДМЕТ") ~= nil end function give_sidor_docs(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "ПРЕДМЕТ", "out") end function give_nagrada_x14 (trader, actor) dialogs.relocate_item_section(trader, "ПРЕДМЕТ", "in") end function have_n_m1() return ИМЯ_СКРИПТА.have_n_m("bread",2,"kolbasa",2,"conserva") end function have_n_m(section,number) local actor = db.actor if actor then local cnt = 0 actor:iterate_inventory( function (dummy, item) if item:section() == section then cnt = cnt + 1 end end ,nil) return cnt >= number end return false end function punch() -- set_inactivate_input_time(30) local snd_obj = xr_sound.get_safe_sound_object([[affects\hit_fist]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) level.add_cam_effector("camera_effects\fusker.anm", 999, false, "") end Отнимаем: function reputation_down_10(stalker, player) db.actor:change_character_reputation(db.actor:character_reputation() - 10) end Плюсуем: function reputation_up_10(stalker, player) db.actor:change_character_reputation(db.actor:character_reputation() + 10) end function malo_hp() db.actor.health = -0.3 --Минус 30% дезек end function Delete_ak74u_from_Actor() local oItem = db.actor:object("medkit") --/ определяем предмет у ГГ if oItem then --/ у ГГ есть предмет db.actor:drop_item(oItem) --/ выбрасываем предмет (опционально) alife():release(alife():object(oItem:id()), true) --/ удаляем из игры end end function dell() for a = 1,65534 do local se_obj = alife():object(a) if se_obj and se_obj:section_name() == "СЕКЦИЯ ПРЕДМЕТА" then alife():release(se_obj, true) end end end function Delete_2_bumazhki_sidora_from_Actor() local cnt = db.actor:object_count() local ch=0 for i=0, cnt-1 do local item = db.actor:object(i) if item:section() == "medkit" then local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) ch = ch+1 if ch == 7 then --7 - кол-во удаляемых аптечек break end end end end end function teleportate_to_() local a = vector() a.x = -241.71509460448 a.y = -26.742816052856 a.z = -304.54711914063 db.actor:set_actor_position(a) end function ReleaseRandomItem(num) local actor = db.actor local cnt = actor:object_count() if cnt<num then return end for i=1,num do local item = actor:object(math.random(0, cnt-1)) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) cnt = actor:object_count() end end end вызывать так: ReleaseRandomItem(5) -- 5 - число удаляемых предметов Вызов через диалог: function RRI() имя_файла.ReleaseRandomItem(5) end Пример: <action>имя_файла.RRI</action> function join_monolith (actor, npc) -- ставить на дельта апдейт printf ("ACTOR NOW IN имя группировки COMMUNITY") if db.actor and level_id.имя уровня then -- пример l01_escape и т.п db.actor:set_character_community ("имя группировки", 0, 0) end end function habar_davay(actor, npc) treasure_manager.get_treasure_manager():give_treasure("имя тайника") end function test_index() local cnt = db.actor:object_count() for i=0, cnt-1 do local item = db.actor:object(i) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) end end end local iTimer function Start_Timer_5_minutes() --/ (пере)запуск таймера (из диалога) iTimer = time_global() + 5*1000 --/ взводим таймер на 5cek end function Timer_N_minutes() --/ вызывается из ':update' сталкер-биндера if iTimer and iTimer < time_global() then --/ проверка текущего значения iTimer = nil --/ выключаем таймер скрипт.функция() --/ выполняем действие end end local iTimer local last function start_timer_minutes_test(seconds) if last~= nil then iTimer = time_global()+last --/ взводим таймер на остаток времени last else iTimer = time_global() + 7*1000 --/ взводим таймер например 7 сек. end end function timer_n_minutes_test() --/ вызывается из ':update' сталкер-биндера if iTimer then last=iTimer-time_global() -- присваиваем переменной остаток времени до конца работы таймера if iTimer < time_global() then iTimer = nil --/ выключаем таймер last=nil СКРИПТ.ФУНКЦИЯ--/ выполняем действие end end end -- выводим значение таймера в обратном отсчете на худ function hud_static() --/ вызывается из ':update' сталкер-биндера local hud = get_hud() local st if iTimer then st = hud:GetCustomStatic("hud_timer") if st==nil then hud:AddCustomStatic("hud_timer", true) st = hud:GetCustomStatic("hud_timer") end if last~=nil then local hours = math.floor(last/3600000) local minutes = math.floor(last/60000 - hours*60) local seconds = math.floor(last/1000 - hours*3600 - minutes*60) local text = string.format("%02d:%02d:%02d",hours,minutes,seconds) -- выводим время в формате 00:00:00 --local text=string.format("%.f",last/1000) st:wnd():SetTextST(text) end else if hud:GetCustomStatic("hud_timer")~=nil then hud:RemoveCustomStatic("hud_timer") end end end Автор:Николай ФеНиКс(ФеНиКс) if bone_index > 0 and who then if who:id() == db.actor:id() then --/ для актора local oActiveItem = db.actor:object("wpn_svd") if oActiveItem then --/ у актера проверяемое оружие local kuda = "" if bone_index == 14 or bone_index == 15 then kuda = "Ранен в глаз" elseif bone_index == 13 then kuda = "Ранен в голову" elseif bone_index == 16 then kuda = "Ранен в челюсть" elseif bone_index == 17 then kuda = "Ранен в шею" elseif bone_index == 9 or bone_index == 10 or bone_index == 11 or bone_index == 18 then kuda = "Ранен в грудь" elseif bone_index >= 1 and bone_index <= 8 then kuda = "Ранен в ногу" elseif bone_index >= 19 and bone_index <= 42 then kuda = "Ранен в руку" end news_manager.send_tip(db.actor, kuda, nil, nil, 2000) end end end Вставлять функцию в мотиватор в функцию hit_callbak. Например, после этого: if self.st.hit then xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index) end function mochim_five_nps() if has_alife_info("первый_грохнут") and has_alife_info("второй_грохнут") and has_alife_info("третий_грохнут") and has_alife_info("четвертый_грохнут") and has_alife_info("и_пятый_наконец") then return true else return false end end Использование: В теле квеста пишем complete'ы: <infoportion_complete>esc_kvest_secret_merc_kill_poslannick</infoportion_complete> <function_complete>имя_файла.mochim_five_nps</function_complete> После выполнения условий функции mochim_five_nps выдается поршень esc_kvest_secret_merc_kill_poslannick и задание обновляется. local ObjId=0 function pda_killer_spawn() local obj= alife():create("pda_merc_killer_glav",vector():set(-223.700,-7.678,-129.688),17000,281) local text = "Текст метки" level.map_add_object_spot_ser(obj.id, "blue_location", text) --/blue_location - тип метки ObjId=obj.id end Эту метку можно удалить так: function delete_spot() for a=1,65534 do --Перебор айди local obj = alife():object(a) if obj and obj:section_name() == "pda_merc_killer_glav" then --/pda_merc_killer_glav -- Секция предмета или НПС level.map_remove_object_spot(obj.id,"blue_location") break end end end local obj = alife():story_object( 6 ) -- 6 - сид Волка local obj_id = obj.id function add_spot_on_map(obj_id,type,text) if obj_id then if not text then text = "no_text" end level.map_add_object_spot_ser(obj_id, type, text) end end Вызываем: function add_spot_on_map2(obj_id,type,text) имя_файла.add_spot_on_map(obj.id,"green_location","Текст") end Метку можно убрать вот так: local obj = alife():story_object( 6 ) local obj_id = obj.id function remove_spot_from_map(obj_id,type) if obj_id and level.map_has_object_spot(obj_id, type) ~= 0 then level.map_remove_object_spot(obj_id, type) end end эту вызывать: function remove_spot() this.remove_spot_from_map(obj.id,"green_location") end function kvest_search_2_bumazhki_sidr_complete() news_manager.send_tip(db.actor, "%c[255,255,128,128]Автор сообщения\n%c[default]Текст сообщения", 0, "wolf", 17000) end local text = "Здесь текст" function test() news_manager.send_tip(db.actor, text, 0, "trader", 20000) end Спавним рестриктор на координатах Волка с радиусом метра 2.Делаем логику рестриктору: [logic] active = sr_idle [sr_idle] on_actor_inside = %+esc_on_talk% ;Выдача поршня ;Или так(Выбрать одно): on_actor_inside = %=on_talk%" ;Функция Если выбрали поршень, то создаем его: <info_portion id="esc_on_talk"> <action>СКРИПТ.on_talk</action> </info_portion> Вызываем функцию и видим диалог: function on_talk() local npc = level_object_by_sid(006) db.actor:run_talk_dialog(npc) end function immotral() local npc1 = level_object_by_sid(006) --волк local npc2 = level_object_by_sid(092) --проводник local npc3 = level_object_by_sid(032)-- кузнецов local npc4= level_object_by_sid(100) --Серый if npc1 then npc1.health = 1 end if npc2 then npc2.health = 1 end if npc3 then npc3.health = 1 end if npc4 then npc4.health = 1 end end В голову дохнут. function name() local npc = level_object_by_sid(006) npc:set_character_community("имя группировки", 0, 0) end Если разговариваем с самим Волком, то вызываем эту функцию: function name(actor, npc) npc:set_character_community("имя группировки", 0, 0) end function dell_kluk_final() local se_obj = alife():object("esc_wolf") if se_obj then alife():release(se_obj, true) end end function do_something() local item = db.actor:object("antirad") if antirad then db.actor:eat(item) end end Должно быть так: function do_something() local item = db.actor:object("antirad") if item then db.actor:eat(item) end end Надет ли костюм function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" одет else return false --/"exo_outfit" не одет end end Не надет ли костюм function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" не одет else return false --/"exo_outfit" одет end end function hit_nanesti() for a=1,65635,1 do local obj=level.object_by_id(a) if obj and string.find(obj:name(),"ПРЕДМЕТ") then local h = hit (); h.power = 10000; h.direction = vector():set (0, 0, 0); h.impulse = 0; h.draftsman = obj; h.type = hit.explosion; obj:hit (h); end end end function rest() local npc = level_object_by_sid(006) --волк if npc and level.name() == "l01_escape" then return true else return false end end function go_to_marsh_complete() if level_name == "l01escape" then return true else return false end end
    1 балл
  43. Материал из S.T.A.L.K.E.R. Inside Wiki. Недавно решил поэкспериментировать с анимками НПС, и теперь выкладываю результаты моих опытов над "людьми". Разумеется, опытные модмейкеры все это давно знают – поэтому материал предназначен для новичков, которые еще не освоили как прописывать неписям разные прикольные анимки, а заодно и озвучку через логику. Все анимки взяты из файла state_lib.script. Анимки, которые имеются в движке, но не вписаны в указанный файл, не рассматриваются. Это тема для отдельной статьи. Озвучка взята из файла sound_script (папка misc). Конечно, хотелось использовать и звуковые темы не вписанные в этот файл, но имеющиеся в папке sounds - но с этим еще надо разобраться. Вся изложенная ниже схема является единым целым и ее можно ставить в ltx–ный файл логики любому вашему НПС целиком. Она будет зациклена и повторяться по кругу если кое-где поставить другие варианты перехода от одной ремарки к другой. [logic] active = remark@base danger = danger_condition meet = meet [remark@base] anim = hello_wpn no_move = true target = actor meet = meet on_actor_dist_le = 2| remark@sit [meet] meet_state = 10|salut@esc_bridge_soldiers| 5|salut_free@esc_lager_killer meet_state_wpn = 10|ward@cit_base_guard_talk_to_actor2| 5|probe_2@gar_bandits_seryi victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog В базовой ремарке мой чувак использует анимку Волка - hello_wpn – одной рукой машет ГГ, другой держит ствол. Это начальная анимка, которая будет отрабатываться НПС, пока ГГ не подойдет на дистанцию встречи. В секции meet задается схема реагирования НПС при подходе к нему эктора. В строчке meet_state – реакция при подходе безоружного ГГ. На расстоянии 10 метров НПС отдает честь, затем встает в позицию «смирно» - руки по швам. Это анимка salut. Ближе 5 метров – тоже самое, дальше переходит в позицию «вольно». Это анимка salut_free. В секции meet можно задавать и то, что НПС будет базарить при виде эктора. В моей схеме: «чего стоишь сталкер, подходи, будем разговаривать» (esc_bridge_soldiers) отдавая салют, и на второй дистанции - «разбежались сосунки и т.д». (esc_lager_killer) В строчке meet_state_wpn - реакция НПС если эктор с пушкой в руках. У меня в этой схеме он встает в позу ward – руки за спиной, голова наклонена вниз. Словом поза тюремщика или надсмотрщика (ward примерно так и переводится). В этой позе НПС на дистанции ближе 10 метров орет «повторяю для тупых - отошел к дальней стене камеры…» (cit_base_guard_talk_to_actor2), а если ГГ подойдет еще ближе - «ты щас сдохнешь падла, понял…» (gar_bandits_seryi) и еще несколько рандомных фраз, которые заданы звуковой темой gar_bandits_seryi. К начальной анимке также можно добавлять любую звуковую тему через строчку snd. В данной ремарке ее нет. Переходим к следующей схеме. Так как все эти схему у меня завязаны вместе, то переход ко второй ремарке произойдет, когда ГГ подойдет к НПС на дистанцию ближе двух метров. Прописано этой в строчке on_actor_dist_le = 2| remark@sit [remark@sit] anim = sit_ass snd = mil_guard_to_max no_move = true target = actor meet = no_meet ;on_actor_dist_le = 2| remark@raciya ;on_timer = 30000| remark@ raciya on_signal = sound_end| remark@raciya danger = danger_condition Итак, что делает НПС в этой ремарке. Сидит на заднице - sit_ass, орет - mil_guard_to_max – «макс, у нас тут проблема на хуторе нарисовалась, собирай народ…» В секции meet прописано отсутствие встречи, так как задано no_meet. Так что разговаривать с ГГ непись не будет. После отработки заданной звуковой темы идет переход к к ремарке remark@raciya. Сделано это через строчку on_signal = sound_end| remark@raciya. Переведу: на сигнал «конец звуковой темы» переходим к схеме remark@raciya. Следующая схема. [remark@raciya] anim = choose snd = bar_arena_public no_move = true target = actor meet = meet@raciya on_timer = 120000| remark@work ;on_actor_dist_ge = 35| remark@work danger = danger_condition [meet@raciya] meet_state = 7|binocular@val_escort_guards| 5|guard_rac@mil_pavlik_to_ara meet_state_wpn = 7|hide_rac@mil_ara_ambush victim = 7|actor victim_wpn = 7|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog Анимка choose – ГГ что-то высматривает: оглядывается по сторонам, прикладывает руку ко лбу, так же как это делам мы, когда смотрим вдаль против солнца. Звуковая тема – что то там из реплик на арене. При встрече – смотрит в бинокль (если он у него есть) и издевательски базарит - «скоро ты будешь работать обедом для мутантов» (в этой теме реплик несколько). На 5 метрах достает рацию (если есть) - анимка guard_rac и базарит реплики из темы предателя Павлика на милитари «все чисто можете подходить». При угрозе стволом - анимка hide_rac («сидит с рацией»), базар - «это засада, уходим» Через 120 секунд - переход к следующей ремарке: on_timer = 120000| remark@work. [remark@work] anim = caution no_move = true snd = mil_max_before_collect target = actor on_timer = 30000| remark@work2 meet = no_meet danger = danger_condition Анимка caution – ГГ слегка согнувшись, что-то внимательно высматривает на земле, руки прикладывает к коленям. А затем радостно сообщает - «ребята у нас появилась работа». Видимо, что-то высмотрел интересное. Через 30 секунд - снова переход. [remark@work2] anim = search no_move = true snd = mil_collect_phrase3 target = actor on_timer = 30000| remark@zombied meet = no_meet danger = danger_condition Анимка search - поиск, только более развернутый. ГГ встает на колени или на корточки и начинает что-то искать. Что он при этом произносит – узнаете, когда послушаете. Через 30 секунд переход к схеме зомби. [remark@zombied] anim = trans_zombied snd = pri_followers_leader_phrase1_1 no_move = true target = actor on_timer = 60000| remark@wounded meet = meet@zombied danger = danger_condition [meet@zombied] meet_state = 5|trans_0@hail meet_state_wpn = 5|trans_1@hail victim = 5|actor victim_wpn = 5|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog Анимка trans_zombied - падает на колени, головой двигает вверх-вниз. trans_1 - также стоит на коленях, только головой вращает по кругу. trans_0 – то же самое, только более энергичней. Или наоборот - извиняюсь если перепутал. Схема раненый. Тут все понятно. [remark@wounded] anim = wounded_heavy_3 snd = help_heavy target = actor meet = no_meet on_timer = 30000| remark@dinner danger = danger_condition wounded_heavy_3 – это анимка тяжелораненого. (есть еще и другие анимки раненого). Чувак скрючившись, грохнется на землю. Но на ней не остается, а тут же встает и бежит в сторону в денжере. Что и понятно – здоровье то у него норм. Остальные неписи видевшие как чувак упал, так же срываются в денжере с места. Ищут того, кто «стрелял». Не удивляйтесь, но так они запрограммированы. Схема обед. [remark@dinner] anim = sit_knee no_move = true target = actor meet = meet@dinner danger = danger_condition on_actor_dist_ge = 15| remark@dynamite [meet@dinner] meet_state = 5|eat_bread@wait| 3|eat_energy@wait meet_state_wpn = 5|eat_kolbasa@wait| 3|eat_vodka@val_escort_dead victim = 8|actor victim_wpn = 8|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog sit_knee - чувак сидит на заднице, опираясь на руку. eat_bread, eat_kolbasa, eat_energy, eat_vodka - тут я думаю ничего объяснять не надо. Чувак хавает и пьет. Пригубив водки, произносит – «пусть земля тебе будет пухом» При отходе эктора на дистанцию больше 15 метров - переход к схеме динамит. Звуковая тема wait – это пауза, в которой непись ничего не говорит. [remark@dynamite] anim = dynamite no_move = true target = actor meet = no_meet on_timer = 30000| remark@claim danger = danger_condition dynamite – закладка динамита. Как это выглядит – помните долговца на милитари у стены с динамитом? [remark@claim] anim = claim snd = esc_wolf_thanks target = actor meet = meet@claim danger = danger_condition on_timer = 60000| remark@story Анимка claim - НПС подзывает ГГ рукой. snd = esc_wolf_thanks - здесь НПС произносит фразу волка: «меченый теперь тебе проход в лагерь открыт, подходи». [meet@claim] meet_state = 7|refuse@mil_collect_phrase5| 5|probe_2@mil_collect_phrase6 meet_state_wpn = 7|backoff@gar_dm_bandit_demand victim = 7|actor victim_wpn = 7|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog Анимка refuse - непись пожимает плечами и произносит mil_collect_phrase5 - «не срать». probe_2 - судя по сопровождающим ее звукам (независимо от прописанной мной звуковой темы) – это анимка Круглова (его манипуляции с прибором, а может Сахарова - впрочем, это не важно). Если у вашего НПС будет в руках оружие - то смотреться она будет куда интереснее, так как выглядит будто непись проверяет свой ствол, совершая массу интересных движений. Фраза mil_collect_phrase6 - «опа – с нами новое мясо». backoff - обычная анимка. Непись начинает махать стволом в разные стороны – типа убери ствол, меченый. Фраза - gar_dm_bandit_demand - «бабки артефакты гони», «ты че козел не врубаешься», «гони бабло или бошку отстрелим». Так как тема рандомная (с окончанием rnd в имени темы в файле sound_script – то и фраз несколько) [remark@story] anim = mode_shlem no_move = true target = actor meet = meet@story danger = danger_condition on_actor_dist_ge = 30| %+passage_to_story_end% on_info = {+passage_to_story_end} remark@story_end [meet@story] meet_state = 10|probe@wait| 5|probe_1@hail meet_state_wpn = 10|probe_2@wait| 5|suicide@mil_crazy victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog mode_shlem - анимка то ли Круглова, то ли Сахарова. Непись будет что то вертеть в руках. probe_1 – тоже самое что и probe_2 , только здесь он плечами вроде бы не дергает. suicide - самоубийство. Советую посмотреть – тем более с озвучкой mil_crazy. probe - укороченный вариант probe_2 и probe_1 [remark@story_end] anim = probe_3 no_move = true snd = agr_doctor_1 target = actor on_signal = sound_end| remark@base ;on_timer = 180000| remark@ base meet = no_meet danger = danger_condition [danger_condition] ignore_distance = 10 probe_3 - интересная анимка (похоже что кругловская)- чувак срывается с места в панике, затем сгибается как будто от боли, хватается за голову. agr_doctor_1 - базар доктора в тайнике стрелка. Теперь поясню строчки on_actor_dist_ge = 30| %+passage_to_story_end% on_info = {+passage_to_story_end} remark@story_end Когда эктор отойдет от НПС дальше чем 30 метров, ГГ выдается инфопоршень passage_to_story_end. После его получения - on_info - произойдет переход к базовой ремарке. Сам инфопоршень необходимо регистрировать в соответствующих файлах. Так как мой НПС находится на кордоне, то поршень я сунул в файл info_l01escape. Сообственно инфопоршень в строчке on_actor_dist_ge писать не обязательно(я его использовал только для примера) - можно просто поставить имя следующей ремарки - и в нужный момент произойдет переход. Но инфопоршень может понадобиться для других случаев. Как я уже говорил в начале, схему можно сделать полностью зацикленной. Нужно лишь в тех блоках, где идет переход к следующей схеме через on_signal поставить таймер или дистанцию. Почему так - не знаю. Но у меня по второму кругу схема стопорилась на тех блоках, где шел переход через on_signal = sound_end|. По таймеру же все прекрасно крутится. Схема из второй части - как раз зацикленная. P.S. : Кажется понял почему у меня стопорилась схема при использовании перехода on_signal = sound_end|. Дело в том, что если в имени звука, по завершении которого схема должна перейти к новому блоку стоит флажок seq, то он вроде как отыграется только один раз (если в этой теме нет дополнительных реплик). Следовательно по второму кругу он просто не будет срабатывать, а значит и схема застопорится. Так что для этого нужно ставить звук в имени которого в файле sound_script есть флажок rnd. Тема mil_guard_to_max как раз с флажком seq (и реплика только одна - без вариантов). Потому здесь (в схеме sit) она и будет стопориться на втором круге, если не заменить тему на другую. Но это еще надо проверить. Закоментированные строчки - пред которыми стоит ; - может смело выкидывать - это остатки проб разных вариантов. Еще одна схема. На этот раз в нее добавлены еще постэффекты. [logic] active = remark@base danger = danger_condition meet = meet [remark@base] anim = hello_wpn no_move = true target = actor meet = meet on_actor_dist_le = 2| remark@punch danger = danger_condition С первой ремаркой все понятно. Переход ко второй на дистанции ближе 2 метров. [remark@punch] anim = punch snd = cit_jail_guard_sneer meet = meet@punch target = actor on_signal = sound_end| %=run_cam_effector(fatigue)% on_timer = 60000| remark@doctor_wakeup %=run_postprocess(deadcity_wake:1777:false)% danger = danger_condition [meet@punch] meet_state = 5|hide_s_left@wait| 4|hide_s_right@wait meet_state_wpn = 5|backoff2@threat_back victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog punch – анимка удара рукой (или прикладом). Так как я не специалист по боксу, то не скажу точно как именно называется этот удар с правой в челюсть. Если поставите ее в meet_state_wpn на дистанции 2 метра - ГГ получит реальный удар в морду прикладом ствола. Так как я эксперементировал на своем торговце - то он (будучи безоружным) бил чисто кулаком. А если вместо запуска анимации камеры %=run_cam_effector(fatigue)% поставите запуск функции %=killactor%, то НПС кинется вас убивать. hide_s_left* и hide_s_right - непись присядет с разворотом ствола вправо или влево. backoff2 - более веселая анимка backoff. НПС покажет ГГ что-то вроде фака, перед тем как помахать стволом и при этом скажет что-то весьма нелицеприятное. %=run_cam_effector(fatigue)% - это вызов анимации камеры /fatigue/ из папки anims. Земля уйдет из под ног ГГ. Ненадолго. Сработает сразу же после окончания фразы cit_jail_guard_sneer. А ровно через минуту от начала работы схемы – запуск постпроцесса %=run_postprocess(deadcity_wake:1777:false)% и переход к следующей схеме. deadcity_wake – это постпроцесс, который должен был использоваться в Мертвом городе, если бы разрабы МГ все таки доделали. Если не видели - обязательно посмотрите.Сначала черный экран, затем прояснение с раздвоением картинки и красным фоном. В следующей схеме идет продолжение постпроцесса – первые 15 секунд. Потом его остановка: on_timer = 15000| %=stop_postprocess(1777)%. [remark@doctor_wakeup] anim = doctor_wakeup snd = cit_doctor_start_dlg meet = meet@doctor_wakeup target = actor on_timer = 15000| %=stop_postprocess(1777)% on_timer2 = 180000| remark@prisoner danger = danger_condition [meet@doctor_wakeup] meet_state = 3|sleep@cit_jail_guard_sleep| 2|sleep_sit@wait meet_state_wpn = 3|wounded_zombie@wait victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog Начальная анимация - doctor_wakeup – доктор в мертвом городе. НПС склонится вниз – как будто над чьим то телом (по задумке – над меченым) и начнет базарить. Но совсем не то, что стоит у меня в строчке snd. Видимо, данная анимка завязана со звуком, и иначе не идет. Фразу прописанную мною - cit_doctor_start_dlg – нпс произнесет потом. Обе озвучки длинные – та, что идет с анимкой – монолог доктора в подземелье агропрома в тайнике Стрелка – типа, «что ж ты меченый в растяжку полез, сам же придумал эту хрень…» Моя озвучка - cit_doctor_start_dlg – неиспользованный монолог доктора в мертвом городе. Через 180 секунд – завершение схемы и переход к следующей. Схема – пленный. [remark@prisoner] anim = prisoner snd = agr_krot_fear meet = meet@prisoner target = actor on_timer = 60000| remark@base danger = danger_condition [meet@prisoner] meet_state = 5|help_me@gar_dm_newbie_no_money meet_state_wpn = 5|hands_up@agr_dont_shoot victim = 10|actor victim_wpn = 10|actor use = true use_wpn = true meet_dialog = escape_lager_guard_start_dialog [danger_condition] ignore_distance = 10 Анимка – prisoner – пленный. Помните Шустрого у бандитов? Вот это она и есть. Фраза - agr_krot_fear – не смотря на то, что в названии звуковой темы имя Крота, орет ее Шустрый: типа братцы я тут, спасите. help_me - машет рукой сидя на одном колене и орет, что у него "нет денег" - gar_dm_newbie_no_money. hands_up - руки кверху и орет "не убивай дяденька" (или типа того) - agr_dont_shoot. Через 60 секунд возврат к базовой ремарке. В файле state_lib – большая библиотека анимок. Я успел попробовать только часть. У одного бармена их 12. Правда, из пяти опробованных мной сработала только одна bar_sleep - НПС положит голову на руки сложенные перед лицом и будет спать стоя. Анимки - barman_talk_freу, barman_shock, barman_wait_danger, barman_walk_danger - никакого эффекта не дали. Видимо, они работают только на бармене. Остальные пробуйте сами. Анимка psy_pain – пораженный пси-излучением. Чувак сядет на колени, начнет трясти головой и бить себе руками по голове. psycho_pain – вроде бы тоже самое, только чувак обхватывает голову руками и так сидит. Анимки psy_shoot, psy_armed, psycho_pain, psycho_shoot – пока остаются на стадии исследования. Так как с ними либо глючит, либо вылетает. ------------------------------------------------------------------------ erlik ------------------------------------------------------------------------
    1 балл
  44. Уроки от @Zeka1996Korneev Сложность: Легко Файлы: Любой стандартный диалог 1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него: news_manager.send_tip - это сама функция, которая отсылает сообщение. "%c[255,255,128,128] - это цвет сообщения, идет по моему по цветам RGB. %c[default] - это конец кода цвета сообщения, дальше текст идёт в стандартном цвете. \n - это перенос на другую строчку. 2. В любой диалог пишем функцию: <action>ваше_название_скрипта.ваш_текст</action> Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13, пишем: <action>ваше_название_скрипта.ваш_текст</action> Теперь после того как поговорите с Доктором (NLC5) на ПДА придёт сообщение с вашим текстом. function ваш_текст(first_speaker, second_speaker) news_manager.send_tip(db.actor, "%c[255,255,128,128]ПРИМЕР:\n%c[default]ВАШ ТЕКСТ", nil, nil, 30000) end Сложность: Средне Файлы: spawn_sections.ltx, devices.ltx, любой стандартный диалог. Для того, чтобы замерить координаты можно воспользоваться аддончиком Position Informer. (В теме инструментарий для мододелов) 1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него: function ваше_название_функции() --/ название функции alife():create(section,position,levelvertex,gamevertex) --/ вписываем свои координаты end 2. В папке config/scripts создаём файл m_taynik.ltx и пишем в него: [spawn] --/ Это то, что появится в тайнике предмет предмет предмет предмет предмет 3. Открываем файл spawn_sections.ltx из папки gamedata/config/creatures и пишем: [m_taynik]:ваш_текст visual = equipments\item_rukzak radius = 1 custom_data = scripts\m_taynik.ltx 4. Открываем файл devices.ltx и пишем: [ваш_текст] --/ название секции GroupControlSection = spawn_group discovery_dependency = $spawn = "devices\inventory box" class = O_INVBOX cform = skeleton visual = physics\box\expl_dinamit.ogf script_binding = bind_physic_object.init 5. Пихаем в любой диалог функцию спавна: <action>ваше_название_скрипта.ваше_название_функция</action> Например в dialogs_trading.xml в диалоге doctor_dialog_start после фразы doctor_dialog_start_13, пишем: <action>ваше_название_скрипта.ваше_название_функции</action> Теперь после того как поговорите с Доктором (NLC5) по заданным координатам появится рюкзак. Cложность: Легко Файлы: unique_items.ltx Создание костюма, который например является модификацией существующего. 1. Открываем файл unique_items.ltx (gamedata/config/misc) и в конец файла пишем: [любой_текст_m1]:novice_outfit ;Модифицированный костюм $spawn = "outfit\uniq\любой_текст_m1" inv_name = название в конфиге inv_name_short = название в конфиге description = описание в конфиге cost = 3000 health_restore_speed = 0.0004 bleeding_restore_speed = -0.002 inv_grid_x = 12 inv_grid_y = 21 Тут прописаны отличия от самого костюма. В данном случае от novice_outfit inv_name - название inv_name_short - название description - описание cost - цена health_restore_speed - скорость восстановления здоровья когда одет этот костюм bleeding_restore_speed - скорость уменьшения кровотечения inv_grid_x и inv_grid_y - иконка. Получается, что в отличие от куртки новичка у этой куртки повышенная цена, она быстрее восстанавливает здоровье, убирает кровотечение, у куртки другое описание и название, другая иконка. Как создать абсолютно новый костюм с уникальным визуалом. Сложность: Тяжело 1. Открываем outfit.ltx (gamedata/config/misc) Копируем секцию например СКАТ-10М в конец файла и редактируем: [ваше_название_костюма]:outfit_base GroupControlSection = spawn_group discovery_dependency = $spawn = "outfit\ваше_название_костюма" ;$prefetch = 32 class = E_STLK cform = skeleton visual = equipments\ваше_название_костюма actor_visual = actors\soldier\ваша_модель.ogf ef_equipment_type = 4 inv_name = ваше_название_костюма_в_конфиге inv_name_short = ваше_название_костюма_в_конфиге description = ваше_название_костюма_описание_в_конфиге inv_weight = 16.0 ;Вес костюма slot = 6 inv_grid_width = 2 ;Координаты иконки inv_grid_height = 3 inv_grid_x = 18 inv_grid_y = 17 full_icon_name = npc_icon_militaryspec_outfit cost = 48000 ;Стоимость костюма full_scale_icon = 10,6 ;иконка сталкера в костюме в полный рост immunities_sect = ваше_название_костюма_immunities ;указывает на секцию с параметрами ; MEDIUM RESISTANCE burn_protection = 0.5 strike_protection = 0.5 shock_protection = 0.5 wound_protection = 0.5 radiation_protection = 0.5 telepatic_protection = 0.5 chemical_burn_protection = 0.5 explosion_protection = 0.5 fire_wound_protection = 0.5 bones_koeff_protection = armor_helmet_damage [ваше_название_костюма_immunities] ;коэффициенты иммунитета самого костюма burn_immunity = 0.004 strike_immunity = 0.003 shock_immunity = 0.003 wound_immunity = 0.005 radiation_immunity = 0.00 telepatic_immunity = 0.00 chemical_burn_immunity = 0.003 explosion_immunity = 0.004 fire_wound_immunity = 0.006 2. Открываем файл string_table_outfits.xml из папки (gamedata/config/text/rus) и в конец файла пишем: <string id="ваше_название_костюма_в_конфиге"> <text>То, что отображается в игре (название)</text> </string> <string id="ваше_название_костюма_описание_в_конфиге"> <text>То, что отображается в игре (описание)</text> </string> 3. Находим в папке gamedata/meshes/actors/soldier файл stalker_military_black.ogf делаем его копию и переименовываем её как хочется, например в stalker_military_white.ogf. Открываем её блокнотом и находим это: act\act_stalker_military_1. Меняем на любой текст, но главное чтобы символов было столько же, иначе модель не будет работать. Меняем например на это: _ct_stalker_military. 4. Делаем тоже самое с stalker_comander_suit.ogf (gamedata/meshes/equipments) - получаем stalker_comander_suit_white.ogf 5. Создаём текстуру с названием _ct_stalker_military.dds (можно взять готовую из любого текстурного мода и переназвать как надо. 6.Прописываем в продажу торговцу и радуемся. Сложность: Легко Как сделать простой диалог. 1. Открываем, например файл dialogs_escape.xml (gamedata/config/gameplay) и пишем в конец: <dialog id="test_dialog"> <phrase_list> <phrase id="0"> <text>test_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>test_dialog_1</text> </phrase> </phrase_list> </dialog> Это скелет диалога. В нём будут написаны все инфопоршни и actions. <dialog id="test_dialog"> - это название диалога, которое нужно будет написать НПС. <phrase id="0"> - номер фразы. <text>test_dialog_0</text> - это текст фразы. <next>?</next> - переход к фразе. 2. Теперь нужно написать тексты диалога. Заходим в файл stable_dialogs_bar.xml (gamedata/config/text/rus) и пишем в конце: <string id="test_dialog_0"> <text>Это тестовый диалог</text> </string> <string id="test_dialog_1"> <text>Угу.</text> </string> <string id="test_dialog_0"> - это то, на что ссылается скелет диалога. <text>Это тестовый диалог</text> - собственно текст. 3. Теперь нужно прописать этот диалог НПС. Например Бармену. Открываем файл character_desc_bar.xml и находим секцию Бармена. Она идёт самой первой. После всех <actor_dialog>???</actor_dialog>, прописываем свой: <actor_dialog>test_dialog</actor_dialog> Сложность: Средне Как создать диалог посложнее. Как создать диалог с разными вариантами ответов. Как создать диалог который исчезнет после прочтения. 1. Открываем, например файл dialogs_escape.xml (gamedata/config/gameplay) и пишем в конец: <dialog id="test_dialog"> <phrase_list> <phrase id="0"> <text>test_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>test_dialog_1</text> <next>2</next> <next>3</next> </phrase> <phrase id="2"> <text>test_dialog_2</text> </phrase> <phrase id="3"> <text>test_dialog_3</text> </phrase> </phrase_list> </dialog> <next>2</next> и <next>3</next> - это возможные ответы Меченого. 2. Теперь нужно написать тексты диалога. Заходим в файл stable_dialogs_bar.xml (gamedata/config/text/rus) и пишем в конце: <string id="test_dialog_0"> <text>Как дела?</text> </string> <string id="test_dialog_1"> <text>Нормально, а у тебя?</text> </string> <string id="test_dialog_2"> <text>Нормально</text> </string> <string id="test_dialog_3"> <text>Хреново.</text> </string> 3. Чтобы этот диалог не появлялся, пишем инфопоршень. Например в файле info_l01escape.xml, пишем: <info_portion id="test_pogovoril"></info_portion> 4. Дописываем инфопоршень в скелет диалога: <dialog id="test_dialog"> <dont_has_info>test_pogovoril</dont_has_info> <phrase_list> <phrase id="0"> <text>test_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>test_dialog_1</text> <next>2</next> <next>3</next> </phrase> <phrase id="2"> <text>test_dialog_2</text> <give_info>test_pogovoril</give_info> </phrase> <phrase id="3"> <text>test_dialog_3</text> <give_info>test_pogovoril</give_info> </phrase> </phrase_list> </dialog> <dont_has_info>test_pogovoril</dont_has_info> - если ГГ получил инфопоршень, диалог не показывать. <give_info>test_pogovoril</give_info> - дать ГГ инфопоршень. Получается, что когда ГГ скажет любую из 2 фраз, диалог больше не появится. Сложность: Сложно Как сделать разные action в диалогах. 1. Создаём обычный диалог: <dialog id="test_dialog"> <dont_has_info>test_pogovoril</dont_has_info> <phrase_list> <phrase id="0"> <text>test_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>test_dialog_1</text> <next>2</next> <next>3</next> <next>4</next> </phrase> <phrase id="2"> <text>test_dialog_2</text> </phrase> <phrase id="3"> <text>test_dialog_3</text> </phrase> <phrase id="4"> <text>test_dialog_4</text> </phrase> </phrase_list> </dialog> C такими текстами: <string id="test_dialog_0"> <text>Я тестю функции.</text> </string> <string id="test_dialog_1"> <text>Ок, какую?</text> </string> <string id="test_dialog_2"> <text>Дать деньги</text> </string> <string id="test_dialog_3"> <text>Дать ПМ</text> </string> <string id="test_dialog_4"> <text>Заспавнить ПМ</text> </string> 2.Создаём свой скрипт в папке gamedata/script например test.script и пишем в него 3 функции: function dat_dengi(first_speaker, second_speaker) dialogs.relocate_money(second_speaker, 3000, "in") end Это функция отдачи денег ГГ. На месте 3000 любое число. На месте dat_dengi любое название. function dat_item(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "wpn_pm", "in") end Это функция отдачи предмета ГГ. На месте wpn_pm любой предмет. На месте dat_item любое название. function spawn_item_or_monster_or_stalker() alife():create("wpn_pm",vector():set(pos),lvid,gvid) end Это функция спавна чего либо. На месте wpn_pm любой предмет,монстр или сталкер. На месте (pos),lvid,gvid) любые координаты. На месте spawn_item_or_monster_or_stalker любое название. Так же функция может быть одна, но с несколькими действиями. Например: function all(first_speaker, second_speaker) dialogs.relocate_money(second_speaker, 3000, "in") dialogs.relocate_item_section(second_speaker, "wpn_pm", "in") alife():create("wpn_pm",vector():set(pos),lvid,gvid) end Значит что одновременно ГГ дадут 3000 рублей, ПМ и по заданным координатам заспавнится ПМ. 3. Впишем функции в диалог: <dialog id="test_dialog"> <phrase_list> <phrase id="0"> <text>test_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>test_dialog_1</text> <next>2</next> <next>3</next> <next>4</next> </phrase> <phrase id="2"> <text>test_dialog_2</text> <action>test.dat_dengi</action> </phrase> <phrase id="3"> <text>test_dialog_3</text> <action>test.dat_item</action> </phrase> <phrase id="4"> <text>test_dialog_4</text> <action>test.spawn_item_or_monster_or_stalker</action> </phrase> </phrase_list> </dialog> Это значит что после после фразы <text>test_dialog_2</text> ГГ дадут 3000руб. А после после фразы <text>test_dialog_3</text>, ГГ дадут ПМ. И после после фразы <text>test_dialog_3</text>, заспавнится ПМ. Cложность: Сложно. Как сделать разные precondition в диалогах. Прекондишоны - это проверки на появление диалога 1. Создаём обычный диалог: <dialog id="test_dialog"> <phrase_list> <phrase id="0"> <text>test_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>test_dialog_1</text> <next>2</next> <next>3</next> </phrase> <phrase id="2"> <text>test_dialog_2</text> </phrase> <phrase id="3"> <text>test_dialog_3</text> </phrase> </phrase_list> </dialog> C такими текстами: <string id="test_dialog_0"> <text>Тест прекондишонов.</text> </string> <string id="test_dialog_1"> <text>Какой?</text> </string> <string id="test_dialog_2"> <text>Эта фраза появляется если у ГГ есть ??? рублей.</text> </string> <string id="test_dialog_3"> <text>Эта фраза появляется если у ГГ есть ??? предмет.</text> </string> 2. Создаём свой скрипт в папке gamedata/script например test.script и пишем в него 3 функции-прекондишона: function has_money_???() local money = math.floor(200 * xr_statistic_freeplay.get_freeplay_statistic():get_found_pda_discount()) return db.actor:money()>=money end Это функция проверки количества денег ГГ. На месте 200 любое число. На месте has_money_??? любое название. function has_item(task, objective) if db.actor ~= nil then return db.actor:object("wpn_pm") ~= nil end return false end Это функция проверки наличия какого либо предмета у ГГ. На месте wpn_pm любой предмет. На месте has_item любое название. 3.Впишем функции в диалог: <dialog id="test_dialog"> <phrase_list> <phrase id="0"> <text>test_dialog_0</text> <next>1</next> </phrase> <phrase id="1"> <text>test_dialog_1</text> <next>2</next> <next>3</next> </phrase> <phrase id="2"> <text>test_dialog_2</text> <precondition>test.has_money???</precondition> </phrase> <phrase id="3"> <text>test_dialog_3</text> <precondition>test.has_item</precondition> </phrase> </phrase_list> </dialog> Это значит что фраза <text>test_dialog_2</text> появится если у ГГ есть 200рублей Это значит что фраза <text>test_dialog_3</text> появится если у ГГ есть ПМ. Сложность: Легко Допустим вы захотели написать много диалогов, и не хочется их писать в оригинальные файлы. Делаем так: 1. Открываем localization.ltx и прописываем в самый конец: ваш_файл_текстов 2. Создаём ваш_файл_текстов в папке "gamedata/config/text/rus/" и пишем в них диалоги/описания/любые тексты по аналогии с другими файлами в папке "rus" Сложность: Средне Все характеристики персонажей находятся в файлах "character_desc_...xml". Откроем файл "character_desc_escape.xml" из папки gamedata/config/gameplay Находим секцию Волка: <!---------------------------------------esc_wolf-----------------------------------------------------> <specific_character id="esc_wolf" team_default = "1"> - Это id персонажа: на него ссылается например "all.spawn" <name>esc_wolf_name</name> - Это имя персонажа. <icon>ui_npc_u_stalker_neytral_balon_1</icon> - Это иконка персонажа <bio>esc_wolf_bio</bio> - Это биография персонажа(в игре не используется) <class>esc_wolf</class> <community>stalker</community> - Это группировка персонажа <terrain_sect>stalker_terrain</terrain_sect> <rank>434</rank> - Это ранг персонажа <reputation>5</reputation> - Это репутация персонажа <money min="600" max="2000" infinitive="0"/> - Это количество денег у персонажа(минимальное и максимальное) <snd_config>characters_voice\human_01\stalker\</snd_config> - Это звуки, которые использует персонаж <crouch_type>-1</crouch_type> <visual>actors\neytral\stalker_neytral_balon_1</visual> - Это визуал персонажа. Какой визуал, такой и костюм <supplies> [spawn] \n - Это спавн вещей, которые появятся у персонажа .........\n .........\n ..........\n hand_radio \n sigaret \n </supplies> #include "gameplay\character_criticals_4.xml" <start_dialog>escape_lager_volk_talk</start_dialog> - Это диалоги персонажа </specific_character> Запишем Волка в группировку "Свобода", дадим ему калашников, оденем в другой костюм, поменяем имя: <!---------------------------------------esc_wolf-----------------------------------------------------> <specific_character id="esc_wolf" team_default = "1"> <name>Долботряс</name> - тут заменили имя <icon>ui_npc_u_stalker_neytral_nauchniy</icon> <bio>esc_wolf_bio</bio> <class>esc_wolf</class> <community>freedom</community> <terrain_sect>stalker_terrain</terrain_sect> <rank>434</rank> <reputation>5</reputation> <money min="600" max="2000" infinitive="0"/> <snd_config>characters_voice\human_01\stalker\</snd_config> <crouch_type>-1</crouch_type> <visual>actors\neytral\stalker_neytral_nauchniy</visual> <supplies> [spawn] \n ammo_9x18_fmj = 1 \n wpn_ak74u \n ammo_5.45x39_fmj = 1 \n device_torch \n </supplies> #include "gameplay\character_criticals_4.xml" <start_dialog>escape_lager_volk_talk</start_dialog> </specific_character> Cложность: Сложно Внимание! Для работы метода необходимы функции АМК мода! -- если делать на оригинале по этой статье. Открываем файл character_desc_....xml (в зависимости от локи) 1. И пишем: <specific_character id="test" team_default = "1"> <name>Тестовый</name> <icon>ui_npc_u_stalker_do_nauchniy</icon> <map_icon x="0" y="0"></map_icon> <bio>sim_stalker_master_bio</bio> <class>test</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <money min="100000" max="110000" infinitive="1"></money> <rank>570</rank> <reputation>100</reputation> <visual>actors\dolg\stalker_do_nauchniy</visual> <snd_config>characters_voice\human_03\stalker\</snd_config> <crouch_type>0</crouch_type> <supplies> [spawn] \n wpn_groza \n ammo_9x39_ap \n ammo_9x19_fmj \n #include "gameplay\character_food.xml" \n #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_6.xml" #include "gameplay\character_dialogs.xml" </specific_character> 2. Открываем amk_npc_profile.xml и пишем: <character id="test"> <class>test</class> </character> 3. Открываем spawn_sections.ltx и пишем: [test]:stalker $spawn = "respawn\test" character_profile = test spec_rank = master community = stalker 4. Создаём файл test_npc_logic.ltx в папке config/scripts и пишем там: [logic] active = camper combat_ignore = combat_ignore [camper] sniper = false radius = 5 def_state_campering = threat_na path_walk = mil_zomb_stalker_walk1 path_look = mil_zomb_stalker_look1 5. Создаём любой скрипт и пишем туда: function spawn_npc_test() local obj=alife():create("test",vector():set(101.435539245605,-8.38547039031982,164.284591674805),3 96523,1643) local params=amk.read_stalker_params(obj) params.custom="[logic]\ncfg = scripts\\test_npc_logic.ltx" amk.write_stalker_params(params,obj) end Прописываем функцию в любой диалог и разговариваем в игре. В итоге наш НПС заспавнится в домике, где стоит Сумасшедший сталкер (на милитари). Cложность: Легко 1. Прописать в логике НПС: trade = misc\trade_....ltx 2. Создать этот файл в папке config/misc и прописать там: [trader] buy_condition = trader_generic_buy sell_condition = {+esc_kill_bandits_quest_done} trader_after_fabric_sell, trader_start_sell buy_supplies = {+esc_kill_bandits_quest_done} supplies_after_fabric, supplies_start #include "shop_???\???_buy.ltx" #include "shop_???\???_supl.ltx" #include "shop_???\???_trade.ltx" 3. Создать папку "shop_???" и скопировать туда файлы торговли от Сидоровича(например) переназвать файлы, изменить торговлю. Зачем это нужно? Для квестов. Внимание! Для работы метода необходимы функции АМК мода! -- если делать на оригинале по этой статье. Сложность: Средне 1. Создаём свой скрипт (подробно в предыдущих уроках) и пишем в него: function spawn_trupik_test() local obj=amk.spawn_item("секция НПС в файле spawn sections",vector():set(pos),game vertex,level vertex) if (_g.IsStalker(obj)) then local tbl = amk.read_stalker_params(obj) tbl.sid = 48802 tbl.health = 0 tbl.updhealth = 0 amk.write_stalker_params(tbl, obj) end 2. Прописываем эту функцию в любой диалог (подробно в уроках выше) На месте spawn_trupik_test ваш текст. Замерять координаты можно утилиткой Position Informer. Уроки от других авторов Автор: Руся Сложность: Сложно Итак, по многочисленным вопросам выкладываю способ, который в общем-то очень простой, но работает. Итак, как сделать, чтобы при нажатии кнопки ТАВ в игре у вас выполнялось какое-то действие? Сразу два пояснения. Известен способ как прибиндить кнопкам функции скрипта, но только когда открыто главное меню, или меню спальника, или любое другое скриптовое меню. В скриптовых файлах этих меню есть виртуальный колбек на отлов нажатия кнопок клавиатуры, поэтому когда открыто меню, например, спальника того же - нельзя использовать аптечку или бинт с помощью нажатия горячей кнопки [ или ]. А вот в файле скрипта на них можно прибиндить какую-то функцию, но повторюсь - это только в момент когда на экране есть скриптовое меню. Второй способ, как сделать работу скрипта по нажатию кнопки в игре - не существует. Однако, имитацию такого способа удалось создать, но только для клавиши ТАВ. Объяснение довольно простое - при нажатии кнопки ТАВ в игре на экран выводится текущее задание, которое отмечено в ПДА. Я подозреваю, что когда текущих заданий в ПДА не останется (например, в АМК 1.4 когда доходишь до уровня ЧАЭС 2, после разговора с О-Сознанием, пропадало последнее задание "Убить Стрелка", и не оставалось ни одного) - способ перестанет работать, но это надо проверять. Так вот, оказывается, текущее задание выводится на главный экран игры, то есть на ХУД, не просто так, а в виде кастом статика. Этот кастом статик записан в файле gamedata\config\ui\ui_custom_msgs.xml и называется он main_task. Вот его-то и можно поймать скриптом, и соответственно, назначить на момент его ловли какое-то действие. Пример ниже. Все мы знаем функцию апдейта из файла бинд_сталкер. Вот на неё-то и повесим колбек на специальный скрипт tabula_rasa.script, вот так: if tabula_rasa then tabula_rasa.update(delta) end Понятно, что вставить этот колбек надо в функцию апдейта в скрипте bind_stalker.script, а теперь займёмся самим новым скриптом. В нём будет две основных функции - самого апдейта, где будет проверяться, нет ли на главном экране кастом статика main_task, и вторая функция, где будет выполняться какое-то действие. local timer = 0 function update(delta) timer = timer+delta if timer>1000000 then timer = 1000000 end local hud = get_hud() if hud:GetCustomStatic("main_task") and timer>1000 then do_something() timer = 0 end end function do_something() local item = db.actor:object("antirad") if antirad then db.actor:eat(item) end end Вот такая вот функция. А теперь - что она делает? Правильно, при нажатии ТАВ происходит использование антирада, одной штуки, если он есть. Но такое использование произойдёт не чаще, чем раз в 1000 миллисекунд, для чего есть специальная проверка - в переменной timer хранится время, прощедшее с момента последнего нажатия ТАВ, при котором timer обнуляется. Время хранится в миллисекундах, поэтому 1000 равно одной секунде. Ну а строка где проверяется, не равен ли timer миллиону - это просто страховка от возможного огромного значения переменной Сложность: Сложно По распаковке алл.спавна с помощью acdc. Сегодня мы разберем основу работы с ACDC. Но... Для начала небольшое отступление. Вы зададите вопрос, почему же лучше работать с ACDC нежели чем с xrSpawner? Отвечаю: xrSpawner при всех его преимуществах имеет множество более значительных минусов. Во первых, xrSpawner не определяет не game_vertex, ни level_vertex. А также он измеряет только позицию. Я думаю работающие с xrSpawner, замечали что, порой объекты которые они спаунят спаунером не всегда появляются на месте. Или вообще не появляются. Потому что повторяю xrSpawner не определяет вертексы т.е. точная позиция и распределение по АИ-сетке. Итак начнём работу! У нас есть программа ACDC, руки и мозги в голове. Кладём all.spawn в папку utils и жмём на батник "распаковка". Итак all.spawn распакован! Мы там видим файлы alife и way. В файлах alife только обьекты которые спаунятся. А в way только пути. Я думаю с алайфом всё понятно. Разберем way. Пути. Путь это и ест путь. По которому может двигаться живой объект. Сейчас мы это рассмотрим: Для начала устроим текстовый беспредел Найдём файл alife_l01_escape, а в нём [869] ; cse_abstract properties section_name = actor name = level_prefix_actor_0001 s_rp = 0 position = -139.449829101563,-29.6908683776855,-351.492797851563 direction = 0,0.00895109120756388,0 s_flags = 0x29 [dont_spawn_character_supplies] [spawn] wpn_binoc novice_outfit device_torch END ; cse_visual properties visual_name = actors\hero\stalker_novice ; cse_alife_creature_abstract properties g_team = 0 g_squad = 0 g_group = 0 health = 1 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 1 upd:timestamp = 0x75732029 upd:creature_flags = 0x70 upd:position = -139.449829101563,-29.6908683776855,-351.492797851563 upd:o_model = 0 upd:o_torso = 0.00895109120756388,0,-0.999959945678711 upd:g_team = 0 upd:g_squad = 0 upd:g_group = 0 ; cse_alife_trader_abstract properties money = 40 trader_flags = 0 character_profile = actor ; cse_ph_skeleton properties ; cse_alife_creature_actor properties upd:actor_state = 0xd20 upd:actor_accel_header = 0 upd:actor_accel_data = 0 upd:actor_velocity_header = 0 upd:actor_velocity_data = 0 upd:actor_radiation = 0 upd:actor_weapon = 110 upd:num_items = 0 Примерно такие строки. Для начала расщедримся Припишем актору в: [dont_spawn_character_supplies] [spawn] такие строки. [dont_spawn_character_supplies] [spawn] wpn_binoc wpn_vintorez ammo_9x39_pab9 = 20 wpn_usp ammo_11.43x23_hydro = 22 novice_outfit device_torch Получиться что мы подарим Меченому при начале игры Винторез, 600 патронов к нему, пистолет USP и 420 патронов к нему. Так. Теперь Меченый у нас будет крутым рэмбо Теперь ещё и подарим ему денежек. ; cse_alife_trader_abstract properties money = 40 trader_flags = 0 character_profile = actor В строчке money напишем любое число. Тока астрономические не надо(не проверял). Ну теперь Меченый не только рэмбо но и миллионер. Теперь займемся координатами. У нас они такие: position = -139.449829101563,-29.6908683776855,-351.492797851563 direction = 0,0.00895109120756388,0 Это наши позиция и дирекция. ; cse_alife_object properties game_vertex_id = 19 (Тот самый вертекс на игре) distance = 0.699999988079071 level_vertex_id = 111256 (вертекс на уровне) object_flags = 0xffffffbf custom_data = <<END А теперь пропишем туда такие координаты: position = -167.232299804688,-25.4363708496094,-354.692901611328 direction = 0,-0.365248799324036,0 ; cse_alife_object properties game_vertex_id = 0 distance = 0.699999988079071 level_vertex_id = 82413 object_flags = 0xffffffbf custom_data = <<END upd:health = 1 upd:timestamp = 0x75732029 upd:creature_flags = 0x70 upd:position = -167.232299804688,-25.4363708496094,-354.692901611328 upd:o_model = 0 upd:o_torso = -0.365248799324036,0,0.930909931659698 upd:g_team = 0 upd:g_squad = 0 upd:g_group = 0 Теперь игра начнётся в здании блокпоста на 2 этаже. С этим мы закончим. Теперь создадим нового НПС: [871] ; cse_abstract properties section_name = stalker name = esc_bridge_soldier1 position = -133.27989196777,-30.146812438965,-372.0263671875 direction = 0.028013030067086,0,0.9996075630188 ; cse_alife_trader_abstract properties money = 5000 character_profile = esc_soldier_regular ; cse_alife_object properties game_vertex_id = 20 distance = 16.1000003814697 level_vertex_id = 118083 object_flags = 0xffffffbf custom_data = <<END [logic] active = walker [walker] path_walk = hodim_dvor END ; cse_visual properties visual_name = actors\soldier\soldier_bandana_3 ; cse_alife_creature_abstract properties g_team = 0 g_squad = 1 g_group = 2 health = 1 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 1 upd:timestamp = 0 upd:creature_flags = 0 upd:position = -133.27989196777,-30.146812438965,-372.0263671875 upd:o_model = 0 upd:o_torso = 0.028013030067086,0,0.9996075630188 upd:g_team = 0 upd:g_squad = 1 upd:g_group = 2 ; cse_alife_monster_abstract properties upd:next_game_vertex_id = 65535 upd:prev_game_vertex_id = 65535 upd:distance_from_point = 0 upd:distance_to_point = 0 ; cse_alife_human_abstract properties predicate5 = 1,2,2,1,2 predicate4 = 0,1,1,1 ; cse_ph_skeleton properties upd:start_dialog = ; se_stalker properties Так вот он наш друг НПС солдат на блокпосте Тут уже знакомы строки. Позиция, дирекция вертексы... Но есть кое что новое [logic] active = walker [walker] path_walk = hodim_dvor Элементарная логика НПС. hodim_dvor-Это путь по которому будет ходить НПС. НПС есть всё готово. Но путя то у нас нет Создадим его в файле way_l01_escape. Припишем вот такие строчки. [hodim_dvor] points = p0,p1 p0:name = name00 p0:position = -120.44634246826,-30.15016746521,-363.68786621094 p0:game_vertex_id = 24 p0:level_vertex_id = 132887 p0:links = p1(1) p1:name = name01 номер точки p1:position = -132.61611938477,-30.142726898193,-363.87365722656 - только позиция p1:game_vertex_id = 19 вертекс на игре p1:level_vertex_id = 118862 вертекс на уровне p1:links = p0(1) на какую точку после этой перейдёт НПС. (тут он будет ходить туда сюда, если не написать линкс то он остановиться на месте) Всё! Вгоняем в way эти строки(тока мои комментарии писать не надо) Всё готово можно тестить изменения:_))))). Как снимать координаты и работать с PI расскажу в следующей статье. Теперь жмём на батник запаковка и усё! Пихаем all.spawn в игру. Только лучше ещё поправить отношения актора к военным и наоборот в лучшую сторону. Чтобы непись сразу пошёл по своему пути. Он удет ходить от казармы до дома(там поймёте) Статью написал [[Rez@niy]] Автор: steelrat Для этого нам понадобятся стандартные файлы: config/ui/ui_custom_msgs.xml scripts/bind_stalker.script Сложность: Легко 1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него: function show_time() local hud = get_hud() local cs = hud:GetCustomStatic("hud_show_time") if cs == nil then hud:AddCustomStatic("hud_time_static", true) hud:AddCustomStatic("hud_show_time", true) cs = hud:GetCustomStatic("hud_show_time") end local time_h = level.get_time_hours() local time_m = level.get_time_minutes() local msg if time_m >= 10 then msg = string.format(" %02d:%02d\n", time_h, time_m) else msg = string.format(" %02d:%02d\n", time_h, time_m) end if cs ~= nil then cs:wnd():SetText(msg) end end 2. Далее открываем файл ui_custom_msgs.xml в config/ui и пишем туда: <hud_time_static x="852" y="17" width="156" height="52"> <text complex_mode="0" x="65" y="0" font="letterica16" r="255" g="255" b="255" a="130">Time</text> <texture>ui_hud_frame_clock</texture> </hud_time_static> <hud_show_time x="862" y="38" width="156" height="52"> <text x="0" y="0" font="graffiti19" r="255" g="255" b="255" a="140" align="c"/> </hud_show_time> 3. Открываем файл bind_stalker.script и пишем после: function actor_binder:update(delta) object_binder.update(self, delta) local time = time_global() game_stats.update (delta, self.object) следующее: ваше_название_скрипта.show_time() Автор: Xmk, на основе полоски оружия из Симбиона. Для этого нам понадобятся стандартные файлы: config/ui/maingame.xml config/ui/ui_custom_msgs.xml scripts/bind_stalker.script Сложность: Средняя 1. Создаём файл new_hud_health.script в папке gamedata/scripts и пишем в него: local hud_name = "hud_health" -- записываем переменную function save_variable(variable_name, value) xr_logic.pstor_store(db.actor, variable_name, value) end -- загружаем переменную function load_variable(variable_name, value_if_not_found) return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found) end -- удаляем переменную function del_variable(variable_name) if db.storage[db.actor:id()].pstor[variable_name] then db.storage[db.actor:id()].pstor[variable_name] = nil end end -- координаты(параметры) x, y, width, height local pbg = {x=0,y=0,w=0,h=0} --/ bg local plv = {x=0,y=0,w=0,h=0} --/ lv local skl_w = -1 --/ текущая длина шкалы local wide = false --/ текущий режим экрана local color = 0 local change_color = false local change_wpn = false local hud_show = false function update(bShow) local hud = get_hud() local cs_bg = hud:GetCustomStatic("hud_health_bg") local cs_lv = hud:GetCustomStatic("hud_health_lv") if (load_variable("opt_hp",true) == false or bShow == false) then if cs_bg then hud:RemoveCustomStatic("hud_health_bg") end if cs_lv then hud:RemoveCustomStatic("hud_health_lv") end return save_variable("opt_hp",false) end local hp = db.actor.health if (hp == nil or hp == 0) then if hud_show == false then --/ рамку можно не стирать при смене оружия if cs_bg then hud:RemoveCustomStatic("hud_health_bg") end end if cs_lv then hud:RemoveCustomStatic("hud_health_lv") end return end -- проверка смены режима экрана if wide ~= db.wide then wide = db.wide if cs_bg then hud:RemoveCustomStatic("hud_health_bg") end if cs_lv then hud:RemoveCustomStatic("hud_health_lv") end cs_bg, cs_lv = nil, nil end local cur_hud = "hud_health_bg" if cs_bg == nil then hud:AddCustomStatic(cur_hud, true) cs_bg = hud:GetCustomStatic(cur_hud) local wnd = cs_bg:wnd() if wnd then pbg = read_params(cur_hud) wnd:SetWndPos(pbg.x,pbg.y) wnd:SetWidth (pbg.w) wnd:SetHeight(pbg.h) wnd:SetAutoDelete(true) end end cur_hud = "hud_health_lv" if cs_lv == nil then hud:AddCustomStatic(cur_hud, true) cs_lv = hud:GetCustomStatic(cur_hud) local wnd = cs_lv:wnd() if wnd ~= nil then plv = read_params(cur_hud) wnd:SetWndPos(pbg.x+plv.x,pbg.y+plv.y) wnd:SetWidth (skl_w) wnd:SetHeight(plv.h) wnd:SetAutoDelete(true) change_color = true --/ смена цвета end end if cs_lv ~= nil then local hp_w = math.floor(hp * plv.w) if hp_w ~= skl_w then if hp_w < 1 then skl_w = -1 else skl_w = hp_w end end local texture_c = get_texture(hp) local wnd = cs_lv:wnd() wnd:SetWidth(skl_w) --/ Set Level Condition wnd:InitTexture(texture_c) --/ Set ColorTexture wnd:SetText(string.format(math.floor(hp*100+0.0001)).."%") end end function read_params(cur_hud) local ltx = ini_file("scripts\\new_hud_health.ltx") local section = cur_hud if wide then section = section.."_wide" end if ltx and ltx:section_exist(section) then local p = {x=0,y=0,w=0,h=0} local result, idx, value, i for i=0, ltx:line_count(section)-1 do result, idx, value = ltx:r_line(section, i, "", "") if idx == "x" then p.x = tonumber(value) elseif idx == "y" then p.y = tonumber(value) elseif idx == "width" then p.w = tonumber(value) elseif idx == "height" then p.h = tonumber(value) end end return p end end function get_texture(hp) local textures = { [0] = "ui_mg_progress_efficiency_full", --/ зеленая [1] = "ui_hud_shk_car", --/ оранжевая [2] = "ui_hud_shk_health" --/ красная } local clr = 0 --/ current color if hp > 0.7 then clr = 0 elseif hp > 0.3 then clr = 1 elseif hp < 0.3 then clr = 2 end if color ~= clr then color = clr change_color = true else change_color = false end return textures end 2. Создаём файл new_hud_health.ltx в папке gamedata/config/scripts и пишем в него: [hud_health_bg] x = 860 y = 660 width = 155 height = 34 [hud_health_lv] x = 33 y = 5 width = 110 height = 10 [hud_health_bg_wide] x = 900 y = 660 width = 123 height = 34 [hud_health_lv_wide] x = 24 y = 5 width = 84 height = 10 3. В файле ui_custom_msgs.xml прописываем: <hud_health_bg x="0" y="0" width="1" height="1" stretch="1" complex_mode="1"> <texture>ui_hud_shkala_health</texture> </hud_health_bg> <hud_health_lv x="0" y="0" stretch="1" complex_mode="1"> <texture><!-- заглушка --></texture> <text x="85" y="0" font="arial_14" r="255" g="255" b="255" a="255" ttl="8" complex_mode="1"/> </hud_health_lv> 4. Открываем файл maingame.xml Находим строчки: <static_health ....> ..... </static_health> и <progress_bar_health ...> .... </progress_bar_health> Выделяем и заменяем на следующее: <static_health x="860" y="660" width="155" height="34"> <texture></texture> <auto_static x="5" y="10" width="19" height="18"> <texture></texture> </auto_static> </static_health> <progress_bar_health x="33" y="5" width="110" height="10" horz="1" min="0" max="100" pos="0"> <progress> <texture></texture> </progress> </progress_bar_health> 5. Открываем файл bind_stalker.script и пишем после: ..... level_tasks.add_lchanger_location() self.bCheckStart = false end следующее: new_hud_health.update() После этой строчки должно стоять end, проверьте. Вроде все, если что пишите что неправильно поправлю Автор: Xmk Придумал давно, но толком не тестировал, сделал на основе голода из OGSM CS Для этого нам понадобятся файлы (AMK Mod): config/misc/items.ltx config/text/rus/string_table_enc_equipment.xml scripts/amk.script script/amk_mod.script Сложность: Сложно 1. Создаём файл ваше_название_скрипта.script в папке gamedata/scripts и пишем в него: snd = sound_object([[ambient\underground\rnd_giant]]) -- Проверяем нужно ли покурить. Вызывается каждые 6 игровых минут function test_for_need_kur() amk.save_variable("kur",amk.load_variable("kur",0)+1) amk.g_start_timer("kur",0,0,6) kur_reduce_health() end -- Уменьшение здоровья, если долго не курил function kur_reduce_health() local tmp = amk.load_variable("kur",0) if tmp > 150 then if db.actor.health > 0.15 then db.actor.health = - 0.15 end if not snd:playing() then snd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d) end end end -- Курение function kur_item(oid, time) if alife():object(oid)==nil then local tmp = amk.load_variable("kur",0) - time*10 if tmp < 0 then tmp = 0 end amk.save_variable("kur", tmp) kur_reduce_health() end end 2. Открываем файл amk.script. После: function __do_timer_action(select_string,params_string) пишем: if select_string=="kur" then название_вашего_скрипта.test_for_need_kur() end 3. Открываем файл amk_mod.script в функции first_run пишем: amk.g_start_timer("kur",0,0,6) затем в функции check_sleep_item(obj) после elseif section=="treasure_item" then stype="tr_item" но перед end пишем: elseif section == "sigaret" then stype = "sgr" 4. Открываем файл items.ltx. Добавляем новый предмет: [sigaret]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "food and drugs\antirad" $prefetch = 32 class = II_ANTIR cform = skeleton visual = weapons\sigaret\sigaret.ogf inv_name = sigareta inv_name_short = sigareta description = enc_food_sigareta inv_weight = 0.02 inv_grid_width = 1 inv_grid_height = 2 inv_grid_x = 10 inv_grid_y = 24 cost = 50 ; eatable item eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0 eat_alcohol = 0 wounds_heal_perc = 0 eat_portions_num = 1 ; food item animation_slot = 4 ;hud item hud = wpn_vodka_hud 5. Открываем файл string_table_enc_equipment.xml <string id="sigareta"> <text>Сигарета</text> </string> <string id="enc_food_sigareta"> <text>Пишем любое описание сигареты, мне че то в голову ниче не приходит</text> </string> вроде ни че не забыл...
    1 балл
Эта таблица лидеров составлена Москва/GMT+03:00

AMK-Team.ru

×
×
  • Создать...