Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation on 10/09/2015 in all areas

  1. 9 points
  2. 4 points
  3. 3 points
    Боевое Советское ("ППШ", "Мосин-наган" и т.д.) и Российское оружие, включая "СВД", оптимальнее "выдавать" в районе арм. складов ( на то они и склады). Там и "Натовское" в принципе объяснимо (наёмники же-ш). Но имхо, Сидорыч не должен в открытую барыжить стволами. Если уж и выдавать что-то посерьёзнее "ТТ" или "ПМ"-а, то отправлять к "нужному человеку", пусть на том же кордоне, но подальше (где диггер к примеру) и за ломовые бабки. Да вот ещё: Неплохо бы запретить военным пользовать обрезы? Не уставное всё же. А то насобирают с жмуров и АК свои в рюкзак прячут
  4. 3 points
    Файл amk_anoms.script. Сделай так: --or string_find(obj_name,"pri_zone_witches") -- электра на колесе обозрения (ЦП)
  5. 3 points
    Привет Всем ! Решил поделиться решением проблемы со всеми - мож кому поможет . Ща проходил квест по спасению вот этого придурка от Монолита на Затоне в лабе Гаусса . Монолит ,, постелил ,, - подхожу к этому другу . Поговорил , а он стоит , как вкопанный ! Раз попробовал перезагрузиться , два , три - один фиг . Нашел чей - то видеоролик по прохождению этого квеста - там человек заспавнил кабанчика и после этого ученый зашевелился , а до этого был столбом . Заспавнил и я кабана - ученый его грохнул и опять впал в ступор . Ну ... думаю - ,. Достал ,, ! Хрясь ему в черепушку из ,. Беретты ,, под Магнум - патрон ... Во . Ломанулся как электровеник - только не шуршит и даже не покраснел .
  6. 2 points
    У меня сосед гинеколог .... когда бухаем, тоже жалуется на работу, грит надоело фсе .
  7. 2 points
    AA-12 camo не совсем "убран", один остался, ну тот который для Креста, а вот убойность у него теперь вообще никакая, так что практического толка от него ровно "нуль".
  8. 2 points
    Если ты имеешь ввиду ствол , лежавший в палатке на Юпитере , то там в последних патчах ( во всяком случае на 2.09-2) лежит китайский дробаш Hawk .
  9. 2 points
    @FromplanetEarth, я тоже ищу ремкоплект для ЗП, хотелось бы как в Misery 2.0. У меня есть один, но он плохой из мода ТЧ https://yadi.sk/d/IGfaMEPpjdbMZ
  10. 2 points
    Вношу поправку:Последствия неграмотности психологов, приводят не к трагедиям, а обращению к хирургам. Иногда к паталогоанатомам..... А вообще, психолог это НЕ врач. Никогда врачом не был и не будет. Настоящие врачи, их даже за своих не считают.
  11. 2 points
    @Romz, в "Сборочный цех" по идее.
  12. 2 points
    Отбой ребят, намокание я вырезаю. Асфальт в игре есть только в паре мест, так что нету смысла оставлять его из-за пары метров.
  13. 2 points
    Ну от дыхалки всё зависит Кстати про курение ... Купил машинку для набивки гильз, сами гильзы с фильтром, табак, и щас получаю офигенное удовольствие и от процесса набивки и от курения. И ещё один плюс - курить стал в 2 раза меньше. Табака уже 6 видов попробовал, тобиш ищу "свой". И вот тут то как раз табак влажноватый должен быть, его просто не забить будет если сухой, я уже взял один такой кисет.
  14. 2 points
    Ты свои 5 копеек вставишь или ограничишься выкриком «браво/позор» постфактум? Этот триллер был бы ещё более качественным, если б у меня была возможность покрутить скрипт (в игре! а не краем глаза в паузах основной работы) самому. Но отпуск только на следующей неделе, а пока единственное, на что хватает времени - это мельком глядеть код и давать наводки. Вполне возможно, где-то я по этим причинам ошибся, написал неправильно.
  15. 2 points
    Мачете Сахаров выдаст, когда ему блокнот принесешь, по квесту "Сорвать сделку на Юпитере".
  16. 2 points
    UnLoaded, я извиняюсь перед модераторами, но... Подтектурка- да, я применяю это название, когда из одной текстуры "вытягиевается" другое значение название текстуры. Назови своими словами. Я иностранец! Буду очень благодарен твоему русскому. И да, мне проверить твою грамматику? Не будет стыдно? )))
  17. 2 points
    С 18 января 2015 вступают в силу изменения в Правилах форума. Список изменений: 1. Добавлен п. 2.0: 2. Как следствие, изменен п. 2.1:
  18. 1 point
    В данной теме собраны сведения по скриптовой модели сталкера: функции и классы, методы и свойства, взаимосвязь классов и последовательность работы с ними, связь работы классов и файлов конфигураций. К наполнению темы приглашаются все желающие. В наполнении темы непосредственно участвовали и существенно мне помогли: Monnoroch, Kolmogor, Unnamed Black Wolf, меченый(стрелок), IQDDD, Kirag, Taroz, dan, lekzd, 7.9, Garry_Galler, AKKK1, Bak и много других людей. Оглавление Основы: класс alife_simulator. Базовые операции с серверными объектами. Пространства имён. Глобальные функции для большОго числа задач. "Создание своего класса" и "Наследование от экспортированных классов". Базовые сведения об объектно-ориентированном программировании для сталкера. Необходимо прочитать, для понимания темы про биндер и некоторых других. В одном посте: Общие слова об архитектуре и скриптовой модели сталкера "Класс object_binder" расширение онлайновых объектов, колбеки, сохранение состояния. "Класс net_packet" Регистрация скриптовых классов с помощью object_factory Серверные классы. Иерархия серверных классов, описание не закончено. Серверные классы Часть 2. Картинка структуры наследования и несколько заключительных слов Клиентские классы Непосредственное управление игровыми объектами: Класс game_object Интерфейс ко всем онлайновым (клиентским объектам) Класс hit для нанесения урона скриптом и другая информация (IQDDD) Некоторая информация по управлению путями патрулирования здесь (Kirag) и здесь (Taroz) Неполная информация об управление памятью неписей с примером здесь (Bak) Всё, что относится к управление сюжетом: Управление заданиями Класс CGameTask и другие вспомогательные классы и функции. Управление инфопорциями функции, колбеки, форматы файлов Список специальных системных инфопорций (Unnamed Black Wolf) Система профилей и алгоритм генерации имён. Форматы файлов, функции Дополнительная информация по параметрам профилей terrain_sect (Kolmogor) Диалоги. Часть 1 Форматы файлов, базовые сведения Диалоги. Часть 2 Скриптовые диалоги Диалоги. Часть 3 Тематическая подборка функций управления диалогами Управление игровым временем: Функции времени Тематическая подборка функций, связанных с управлением игровым временем. Класс CTime Вспомогательный класс для управления игровым временем Полезная скриптовая функция с использованием CTime (Garry_Galler) Информация россыпью: class ini_file (меченый(стрелок)) класс FS и CSavedGameWrapper Бинарный доступ к файлам, в том числе в игровых архивах, управление сохранёнными играми. Скрипт уровня. Забытая фишка с колбеком на заход на уровень Класс vector некоторая полезная информация о разных вещах (меченый(стрелок)) "Класс render_device" Направление и положение камеры, характеристики экрана, программная пауза игры и др. Некоторая информация о различиях между ТЧ и ЗП в системе оконных классов и колбеков. (lekzd) Неплохо бы развить эту тему! Некоторая полезная информация о скриптовых функциях из модуля _g.script. (lekzd) Также требует развития! Полезные функции для работы с графом игры (Garry_Galler) В одном посте: Класс profile_timer Отладочные измерения скорости работы фрагментов программы Класс client_spawn_manager Колбек на выход в онлайн без использования биндера. Работа с консолью. Класс CConsole Анимации цвета. Класс color_animator Всякие моргающие элементы в окнах и пр. Управление постэффектами. Скриптовые постэффекты. Класс effector Создание и управление худом и пользовательским интерфейсом: Оконные классы Некоторая общая информация о создании окон Класс sound_object. Проигрывание звуков в игре в произвольном месте, от произвольного объекта, в голове актора. (Shadows) Представление материала в моих статьях оптимизировано для онлайнового просмотра. Если кому не хочется лазить по спойлерам, а нужно просмотреть текст какого-либо поста "потоком", то могу рекомендовать просмотр в режиме "текстовая версия". В этом же режиме удобно сохранять содержимое темы на диск. Физическая оболочка объектов
  19. 1 point
    Название: Hardcore mod 1.0 Авторы: FGLock, D.E.M.A.N. Версия игры : Lo$t Alpha 1.3003 Новая игра: ДА! ссылка:https://yadi.sk/d/dGNLziDLshA2Y
  20. 1 point
    Глянь сайтик супертабак.ру , набери в поисковике (не реклама). Там мне что понравилось - можно оформить заказ от 1000 рублей, во многих других интернет-магазинах минималка для заказа выше, и кстати выбор понравился, скоро буду заказывать потому как в наших табачных лавках ценник неимоверно завышен. И перед покупкой табака обязательно ищи отзывы в интернете, они есть. Например здесь https://vk.com/topic-39177_27850255 Я думаю знакомый уже самокруточкой угощал? Главное как я понял приноровиться как крутить, я то готовые гильзы набиваю, тоже первое время всё непросто было, рассчитать кол-во табака например. И ещё небольшая проблемка у меня - я купил машинку под тонкие сигареты (ну хватает мне их просто) , так под них гильз мало выпускается. А ты если хочешь можешь купить универсальную для обычных самокруток и для тонких, если для самокруток будешь брать. А если для гильз - то что то одно. И кстати отзывы о бумаге для самокруток ищи, люди пишут вкус сигареты очень зависит от марки купленой бумаги. Я вообще конкретно на эту тему подсел, постоянно разные форумы читаю, на работе уже даже заметили.
  21. 1 point
    @Хашим, Смотря какое образование. Если мент допустим или военный, то всё норм. - для школьного психолога самое то, что надо.
  22. 1 point
    Ищу ремонтный комплект для оружия и брони для ЗП. Желательно отдельными файлами.
  23. 1 point
    Ыыыыц....хорошо хоть не практикующим хирургом
  24. 1 point
    @nedved, мне monk отвечал по поводу этой проблемы. Просто убей рядом отряд мутантов, состоящий из псевдо-собаки, или как её там?... После смело иди на сигнал SOS
  25. 1 point
    Что странно, никаких предпосылок к этому я не вижу. Имя чанка никак не участвует в формировании технологического нет-пакета (только как ключ таблицы), а ошибка в логе говорит о том, что вместо нет-пакета во временную таблицу было записано значение типа boolean. Чего быть не может, судя по коду se_stor. Ну да ладно.
  26. 1 point
  27. 1 point
    @Mari, рукоять будет на сотке. Про обрез - это сарказм был, соррян Можно, конечно, и на него придумать обвесы, но НА ФИГА?? Тяжёлое пока не планируется. Отмаз такой - с пулемёта стрелять уметь надо. По прицелам - думаю, что есть - это всё. На винтовки, скорее всего, другой ночник будет (всё равно крепления чуть разные). Тут дело даже не в объёме работы, и не в том, что моделей нормальных не так много, а тупо костей не хватает. ТЧ максимум 64 поддерживает. Можно, конечно, выкрутиться - модели, например, подменять.. Вот только зачем плодить сущности? Лично я считаю, что 3 типа прицелов - разумно достаточный минимум. Разве что оптики переменной кратности, по типу бинокля, не хватает. Не в курсе, поддерживает ли ОГСЕ, для чистого ТЧ существуют в природе такие правки.. @Partisan, ага, план - такой! Сталкер - не АРМА. ИМХО, не воевать мужички в ЧЗО пришли. И делать стопиццот прицелов-близнецов (по характеристикам/применимости) - попахивает разноцветными пухами Арсенала. Кстати, на
  28. 1 point
    @specyurka, Варианты есть. Мой способ предусматривает только стирание одной или двух строчек. Чтобы заспавнить - нужно прописывать строки с названием предмета, функцию вызова спавна. Просто стереть показалось проще.
  29. 1 point
    В ЗП же движок так устроен, чтобы не вылетать без текстур. В ТЧ можно тоже xrcore.dll пропатчить в Xray Extensions.
  30. 1 point
    @Shoot-nic, А у меня эта машинка в другом месте была.
  31. 1 point
    Есть проблема со схемой напарников. На 4 патче всё работает отлично. При переходе на 6 патч вылетает при вступлении в диалог с НПС использующим диалоги из схемы напарников Actor_need_help.xml с одной единственной строкой stack_trace. Единственное, что смог выяснить что это происходит из за строчки в ветке диалога actor_give_command (приказ напарникам ждать на месте ГГ) Если эту строку удалить всё нормально работает. Но тогда нет возможности отдавать напарникам приказы. Подозреваю ,что это из за того ,что сам диалог с приказами выведен из XML диалогов в сам скрипт. Что изменили в 6 патче такого, что стало вылетать.. И как возможно это исправить? Возможно, что то в коде надо поменять....
  32. 1 point
    Главное не перебарщивать с количеством, а налегать на качество! А на кордоне, так вообще свести кол-во оружия к минимуму (как на руках, так и в тайниках). Не думаю, что вояки, увидев столько народу с оружием, просто наблюдали бы издалека. Особенно учитывая, что в начале игры, паре идиотов пришло в голову пальнуть в вертолёт. Да там через пол-часа одни руины дымились бы Народ в зону лезет пытаясь обогатиться, а не вести полномасштабные боевые действия.
  33. 1 point
    Я не понял, здесь чат или ЧТО !? @Forser, "Огласи целый список....пжалста" © Остальные посты в духе "с миру по нитке" будут удалятся.
  34. 1 point
    @BoBaH_671, по шапке? Постоянно пользуюсь тестовыми локациями для проверки всяких вопросов... Если бы ни у кого не получалось, то от куда бы тогда взяться различным новым локациям, и локациям портированных из разных частей игры и билдов? Тутор в шапке - по созданию одиночных локаций, а не по подключению их к оригинальной игре через СДК.
  35. 1 point
    Это именно оно и есть. Не прописан spawn_version=cop. Не то. default и cop указывают конвертеру от какой игры локации. spawn_version указывает под какую версию СДК сохранять результаты. У тебя ТЧ - значит default. Ну можешь еще проверить в converter.ini, что default=2947_config. После этого идешь в секцию 2947_config и добавляешь в нее параметр spawn_version=cop. Декомиплишь. По-хорошему лучше сделать отдельную секцию типа soc2cop и декомпилить с ней.
  36. 1 point
    Ответ прост: по каким причинам столько зверья там, может убавить ряды ... И что там делает отряд ЧН , "вечно" помогает ГГ, когда тот забредает в госпиталь, интересно.
  37. 1 point
    Почему идея? Я таким пользуюсь. Чтобы не творить велосипед, вот полная таблица перекодировки. А остальное? Вы же все профи. Все вопросы по ограничению к DS.
  38. 1 point
    А у меня было 2 забавных случая. Оба еще в далеком 2010, когда мы только что купили комп. Это еще была чистая ЗП, даже не пропатченная. А поскольку до этой игры у меня был опыт только с карточными пасьянсами и мышками, бегающими по трубам, то я еще не разобралась как делать скрины. Более того, я тогда еще в интернет за помощью по прохождению не догадалась заглянуть. И вот там голоса о помощи (аномалия с основателями Долга), я все кручусь возле градирни, и ищу вход во внутрь, чтобы помочь неизвестным. И вижу издали, как из рукотворной "пещеры" (где мы берем измененный проводник" для ученых), вышел контролер и движется в мою сторону. На мое счастье, он меня не увидел, у меня с собой было хорошее дальнобойное оружие, я его только пристрелила. И стала раздумывать - подойти ли поближе, рассмотреть? Тут из этой же пещеры, а точнее рядом с ней материализовался следующий. По игровому времени не смогу сказать точно - но в реале каждых 3 минуты в течении почти 2-х часов возникал контроша и шел в мою сторону, а я стреляла его, пока не расстреляла все патроны. Мне просто было интересно, когда они закончатся. Я потом уже со счета силась, да и в игре сильно стемнело. А второй забавный случай - это когда я в бинокль кровосса разглядывала, а он не то за шкирку, не то за хвост держал тушкана и болтал им в воздухе. В принципе такое уже и раньш нам попадалось, но что-то в этот раз было не так. Все разъяснилось, когда сосыч швырнул в сторону - оказалось, он до этого болтал не тушкой дохлого тушкана, а вполне себе живым, который и дал стрекача. Сколько после я не караулила, так мне кровосос больше и не попался с тушканом за шкирку так, чтобы я могла отскринить.
  39. 1 point
    По просьбам трудящихся... Создание играющего магнитофона\радио для ЗП.
  40. 1 point
  41. 1 point
    Перезалил мод - Облако
  42. 1 point
    "Динамическое подключение/отключение функций" Думаю многим известно, что такое файл bind_stalker.script. В этом файле прописан класс actor_binder обрабатывающий действия актора. Всего в классе семнадцать методов. Коротко расскажу о назначении каждого: bind_stalker.script Самым частым в использовании является метод update. Именно в него неосведомлённый модостроитель порою "заталкивает" такое, что волосы становятся дыбом, и невероятно часто данный метод используют для одноразовых "заданий", прописывая проверку инфопорции, чтобы результат не проверялся несколько раз, но тем не менее проверка продолжает выполняться. А что если использовать updateпо требованию и когда необходимость в нём отпадает - убирать проверку? Как? Оказывается не очень то и сложно...Таковым функционалом обладает файл xr_s.script из папки скриптов ЧН или ЗП. Знающий скрипты человек, уделив некоторое внимание данному файлу, сам поймёт как его использовать, не знающий - будет долго всматриваться в код в поисках знакомых слов. Ничего страшного в этом нет - самообразование всегда похвально, я же помогу Вам разобраться в коде окончательно.Идея скрипта как раз в том и состоит, чтобы в нужный момент подключить любую функцию к одному из колбеков, включая update, и когда необходимость в функции отпадёт - убрать её от туда, тем самым избавив колбек от лишней работы. При этом список колбеков можно свободно расширить, и подключать функцию можно вообще по сути куда угодно. Итак, давайте разберём файл более подробно. xr_s.script Вот некоторые соответствия того, какую функцию из xr_s.script куда прописывать и какой "колбек" из таблицы callbacks использовать впоследствии: Подозреваю, что вышеизложенный текст, не для всех является простым, но изложить доступно словами всю идею, не отклоняясь от основной мысли (динамическое "включение" функций) достаточно сложно. Я стараюсь, на сколько это возможно, придерживаться этого компромисса, поэтому, если Вам не понятен текст выше, прочитайте его ещё раз, чтобы у Вас была теория "на уме", а не бегать в последствии глазами по тексту - так Вам же будет проще. Перейдём, так сказать, к делу...В качестве примера приведу решение того, как реализовать убирание оружия во время приёма аптечки. Вопрос достаточно часто задают в соседней теме, поэтому это будет актуально, интересно, а самое главное наглядно отобразит основную идею динамического "включения" функций. Realization Пример вышел тривиальным, но более чем наглядным. Естественно его можно развить, добавить медленное восстановление здоровья, ограничить возможность использования нескольких аптечек подряд, пока работает таймер и т.д. Развитие функционала уже выходит за рамки "урока", поэтому это остаётся на Ваших плечах.Всё работает без вылетов, лично преверял на ТЧ 1.0006. Хотя это и предполагается на ТЧ, но работать будет и на ЧН и на ЗП.
  43. 1 point
    Кому нужен красный мозг- снимается с контролёра,у гаражей в Лиманске. Встретился он мне только при втором заходе туда(когда нёс глушитель на место от Скряги),при первом же заходе у контролёра был безоар только. Так-же там зомби космонавты появляются с хорошими стволами- снял три АА-12,шесть кастомов и антизомбин у них почти у каждого.
  44. 1 point
  45. 1 point
    Вот кое что от 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
  46. 1 point
    ~F'D~ Strelok, на самом деле, перегнать НПС из ЗП в ЧН довольно таки просто - конвертируем нужную модель из .ogf в .object (конвертером Бардака, входит в составе его же набора утилит), открыть .object в Actor Editor-е, перейти в раздел Motions и там из четырех архивов анимаций (отмечены галочками) оставить только три - stalker_animations, stalker_scripts_animations, stalker_smart_cover_animations (stalker_scenario_animations используется только в ЗП), затем для каждой текстуры меняем тип используемых шейдеров (shaders) c model_pn на model, далее нужно загрузить нормально настроенный файл косточек (*.bones), либо исправить вручную степени свободы по оси Y на противоположные (например, было - min:-110, max:0; делаем - min: 0, max: 110) для следующих костей: bip01_l_thigh, bip01_l_calf, bip01_r_thigh, bip01_r_calf, bip01_l_upperarm, bip01_l_forearm, bip01_r_upperarm, bip01_r_forearm. The End
  47. 1 point
  48. 1 point
  49. 1 point
    Материал из 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 ------------------------------------------------------------------------
  50. 1 point
    Уроки от @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> вроде ни че не забыл...
This leaderboard is set to Moscow/GMT+03:00

AMK-Team.ru

×
×
  • Create New...