ColR_iT 171 Опубликовано 19 Февраля 2013 (изменено) MEDICINE RC ver. 1.0 Версия игры: предположительно любая; ориентирован на ТЧ.Автор: @ColR_iTМод реализует реакцию ГГ на использование съедобного предмета. Всего в игре десять таких предметов: три аптечки, бинт, антирад, энергетик, водка, консерва, колбаса и батон. Медленное восстановлениеДля каждого из предметов можно определить до четырёх параметров (здоровье, пси-здоровье, радиация и выносливость), которые могут восстанавливать/"поломать" соответствующее свойство ГГ. Обновляются эти параметры независимо друг от друга, прекращение обновления каждого - также не зависит от других. Критический хитВ случае, когда мы использовали аптечку и во время восстановления здоровья получили значительный хит, то восстановление оного прекращается. Это относится исключительно к хиту полученному по здоровью. Запрет на повторное использованиеИспользовать медицинские препараты (аптечки, бинт, антирад) повторно нельзя, на протяжении некоторого времени. Еду и энергетик при этом использовать ничего не запрещает. Получение критического хита, позволяет воспользоваться аптечкой досрочно. Убирание оружияПосле использования предмета, некоторое время будет невозможно воспользоваться оружием. Критический хит, восстанавливает оружие преждевременно. Звуки при использованииВо время использования предмета проигрывается соответствующий звук. В файле use_item.script имеются общие настройки, а также настройки для каждого предмета, позволяющие отрегулировать мод под собственное видение игры. Все настройки весьма гибкие и описаны комментариями, поэтому разобраться что к чему не составит труда. Мод использует динамическое подключение и отключение функций от биндера атора, посредством функционала xr_s.script за авторством @xStream. Таким образом весь процесс вычислений происходит исключительно после использования какого-либо предмета. Когда действие всех эффектов заканчивается, функции отключаются от биндера и никаких вычислений не происходит. Благодаря этому, использование ресурсов системы - минимально, а процесс адаптации с другими модами - прост. Исходя из ограничений движков игры, без вмешательства в сам движок, скриптовая регенерация возможна лишь для пяти свойств ГГ: health (здоровье), psy_health (пси-здоровье), radiation (радиация), power (выносливость) и morale (мораль, но я не знаю для чего она). Остальные свойства: bleeding (кровотечение), satiety (сытость) и alcohol (алкоголь), к сожалению, скриптовому воздействию не поддаются (?) и поэтому изменять их нужно посредством соответствующих движковых параметров в конфигах предметов. Принцип действия до безумия прост - Вы используете предмет, скрипт отлавливает это действие и в зависимости от настроек производит то или иное действие. Как и прежде, я постарался свести процесс адаптации к минимуму.Для этого, Вам необходимо: Если подключаете мод к ТЧ, вписать в файле bind_stalker.script в метод (функцию) update следующую строку: xr_s.on_actor_update(delta) В этом же файле в колбек use_object дописать следующую строку: use_item.CheckSection(obj:section())Если у Вас нет данного колбека, то его нужно добавить. Как это сделать написано ниже. Адаптировать файл item.ltx с имеющимся у Вас.Процесс адаптации состоит в совмещении десяти секций предметов описанных выше. В частности нескольких параметров после комментария "eatable item" в каждой секции. Для параметров eat_health, eat_power и eat_radiation нужно обязательно(!) ставить значение равное нулю, в противном случае смысл мода сходит на нет. Можете вручную подправить параметры секций исходя из данных в табличке ниже. В редких случаях, возможен конфликт папки со звуками. Если таковой возник, то для параметра soundsFolder, который находится в самом низу в скрипте, укажите путь до папки, в которой находятся звуки. К слову, звуки используются из мода Lost World Trops of Doom, единственно что - прогнал их через СДК, дабы избавится от возмущений в логе. В файле bind_stalker.script в метод reinit класса actor_binder, в конец допишите следующую строку: self.object:set_callback(callback.use_object, self.use_inventory_item, self) Затем, в метод net_destroy допишите: self.object:set_callback(callback.use_object, nil) Теперь нужно добавить метод, который будет вызываться при использовании какого-либо предмета. Допишите данный код после одного из методов (не во внутрь функции!!!), например перед update: function actor_binder:use_inventory_item(obj) end Собственно всё.P.S. Может случится так, что в Вашем моде метод вызываемый колбеком уже есть, чтобы узнать какой именно метод Вам нужен, обратите внимание на регистрацию колбека в методе reinit, а именно на второй аргумент функции set_callback, в нашем случае это use_inventory_item. ------------------------------------------------------------------------------------------------------------ | Здоровье | Пси-здоровье | Радиация | Выносливость | Сытость | Кровотечение | Алкоголь | ------------------------------------------------------------------------------------------------------------ Аптечка | +25%/5c | +3%/5c | | -10%/5c | -3% | | | Армейская аптечка | +55%/9c | +8%/6c | -20%/6c | -15%/6c | -5% | | | Научная аптечка | +85%/14c | +13%/9c | -50%/9c | -20%/9c | -7% | | | Бинт | | | | -25%/5c | | -100% | | Антирадин | | | -100%/15c | -30%/10c | -15% | | | Энергетик | | | | +100%/15c | -25% | | | Водка | +3%/4c | +15%/9c | -10%/6c | -20%/9c | -30% | | +10% | Консерва | | | | +20%/12c | +40% | | -5% | Колбаса | | | | +15%/10c | +30% | | -4% | Батон | | | | +10%/8c | +20% | | -3% | ------------------------------------------------------------------------------------------------------------- Инструкция по подключению в картинках, от @Dniwe: >>ClicK Me<< К сожалению, без них не обошлось... При сохранении игры во время процесса восстановления, загрузка этого сохранения не приведёт к продолжению процесса, простыми словами - сие не сохраняется.В момент, когда Вы повторно воспользуетесь предметом, а его повторное использование запрещено настройками, то скрипт не позволит восстанавливать ни один из параметров, кроме тех, что не поддаются правки скриптами.Т.е. например: Вы использовали армейскую аптечку. Первое её использование запустит процесс постепенного восстановления четырёх параметров: здоровья, пси-здоровья, радиации и выносливости, плюс мгновенно изменится параметр сытости. При повторном использовании заново процесс запускаться не будет и аптечка вернётся к Вам в инвентарь, но к сожалению, параметр сытости будет изменен, т.к. это движковое действие и отловить этот момент не представляется возможным. Та же картина и с антирадом.Каких либо вылетов замечено не было, те что были - поправил. Если кто найдёт, будьте любезны, не поленитесь сообщить, можно в личку, но лучше сюда в тему - буду признателен. Яндкс.ДискRGhost Спасибо @Charsi, и @Malandrinus за оказанную помощь. С Удовольствием приму конструктивную критику и пожелания по развитию мода. Изменено 13 Апреля 2015 пользователем HellRatz 3 11 3 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 19 Февраля 2013 Sky_Line, это действительно делается весьма просто, обычным запуском звука функцией например перед/после строки: xr_s.register_callback("update", medicine.HideWeapon, time_global()) k01jan, я и не говорил, что это что-то новое. Основной задачей было не сделать "также" и не искать "поклонников", а реализовать данное именно так, как оно реализовано. Это не "колесо", это "дорога", по которой это "колесо" может ехать. Даже невооружённым взглядом можно увидеть, что адаптация данного "мода" в разы легче предложенного тобою, пусть и возможностей несколько меньше, но уделив ещё несколько часов внимания это легко можно поправить. Charsi показал мне возможности xr_s.script, за что ему огромное спасибо, я их изучил и решил поделиться с остальными, т.к. не многие знают что это за "фрукт", а те кто знают и без меня его прекрасно используют, кроме того динамически подключаться к колбекам можно не только этим методом - способов более чем достаточно. Что касается того, что в ЗП "давно" есть подобная система, то здесь я даже более тебе скажу - именно данный способ в нём и используется, правда единожды, но используется... Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 6 Марта 2013 Ребята, прелесть не в медленном восстановлении, а в том, как это восстановление реализовано. Судя из написанного - Вы понимаете, что это здорово, но совершенно не понимаете как оно работает... А жаль. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 9 Марта 2013 Куда уже подробнее? "после одного из методов" означает, что код нужно вписать между функциями, но никак не во внутрь. Как пример, можно разместить его перед строкой: function actor_binder:update(delta) Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 3 Июня 2013 sanjaaa, в таблицу item_, что в файле bind_stalker.script, допиши секцию своей еды после запятой, по аналогии. И в табличку itemParam, в файле medicine.script, допиши туже секцию и два числа: первое из которых - это количество жизней, которое будет пополнять еда; второе число - это сколько времени будет восстанавливаться здоровье (не забудь в конфиге убрать движковое восстановление). Если тебе не нужно, чтобы еда лечила, то во второй таблице пропиши по нолям, тогда при использовании твоей еды будет просто убираться оружие. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 4 Июня 2013 Артём_killer, а в "шапку" темы заглянуть не судьба? Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 4 Июня 2013 Артём_killer, скинь два файла: bind_stalker.script и medicine.script. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 4 Июня 2013 @Артём_killer, вообще-то, когда я говорил, чтобы ты скинул два файла, я ожидал увидеть ссылку, ну максимум две - на каждый файл... Ну да ладно. По сабжу... Я упустил из виду тот момент, что в ЧН в функцию hide_weapon передаётся (зачем-то) имя зоны. Измени функцию HideWeapon в файле medicine.script на вот эту: --# Убираем оружие. --# timeNow - время на которое убирать. function HideWeapon (timeNow) --# Прячем оружие. db.actor.hide_weapon() --# Если время вышло, то... if time_global() > timeNow + timeHide then --# Вернём оружие db.actor.restore_weapon() --# отключим данную функцию от апдейта. xr_s.unregister_callback ("update", medicine.HideWeapon) return end end Вылета более быть не должно. Вывод радиации по этому же принципу сделать можно. P.S. спасибо, за указанную ошибку. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 4 Июня 2013 @Артём_killer, в файле bind_stalker.script, в 421 строке убери повторный вызов функции on_actor_update. Возможно причина из-за этого, т.к. всё должно работать, ибо ничего архисложного там ничего нет... Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 4 Июня 2013 Вывод радиации делается аналогично функции UpdateHealth в файле medicine.script, только вместо пополнения здоровья нужно делать вывод радиации. Разгляди внимательно эту функцию, там к каждой строке приписаны комментарии, не сложно разобраться, если хоть чуть-чуть знаком с программированием, если же не знаком - "звиняйте" это не ко мне... Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 4 Июня 2013 @Соболь, уже есть. Два файла в одном "флаконе": >>RGhost<< 1 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 4 Июня 2013 (изменено) Артём_killer, в общем, посмотрел я, что происходит в ЧН и вспомнил "интересный" пост. Оказывается, функции hide_weapon и restore_weapon - это счётчики, поэтому сколько раз вызывали первую, столько и нужно вызывать вторую. Но лично у меня это проявилось только сейчас на ЧН, в ТЧ подобного "казуса" никогда не было. В итоге, вот рабочая функция HideWeapon для ЧН: --# Убираем оружие. --# timeNow - время на которое убирать. local hidden = false function HideWeapon (timeNow) --# Прячем оружие. if not hidden then db.actor:hide_weapon() hidden = true end --# Если время вышло, то... if time_global() > timeNow + timeHide then --# Вернём оружие db.actor:restore_weapon() --# отключим данную функцию от апдейта. xr_s.unregister_callback ("update", medicine.HideWeapon) hidden = false return end end Всё работает как нужно. Изменено 4 Июня 2013 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 6 Июня 2013 (изменено) Вопрос к тем кто заглянул в данную тему... Реализовываю по схеме из шапки темы реакцию на все "съедобные" предметы в ТЧ/ЧН, т.е. убирание оружия, звук, эффект и постепенное восстановление. Так вот некоторые предметы "влияют" на несколько параметров сразу, например, водка снижает радиацию и повышает уровень алкоголя, к тому же незначительно восстанавливает здоровье и сытость. Таковыми являются практически все.Вопрос заключается в следующем: на какие параметры, по Вашему мнению, должен или может влиять тот или иной предмет?P.S. Напомню, что в ТЧ их десять: три аптечки, бинт, антирад, водка, энергетик, консерва, колбаса и батон. Я думаю, что должно быть так: АпечкаЗдоровье: +25% от потерянного здоровья.Пси-здоровье: +3% от общего.Кровотечение: -30% от набранного.Выносливость: -10% от общего.Сытость: -5% от общего.Армейская аптечкаЗдоровье: +55% от потерянного здоровья.Пси-здоровье: +8% от общего.Кровотечение: -50% от набранного.Радиация: -20% от набранной.Выносливость: -15% от общего.Сытость: -10% от общего.Научная аптечкаЗдоровье: +85% от потерянного здоровья.Пси-здоровье: +13% от общего.Кровотечение: -40% от набранного.Радиация: -50% от набранной.Выносливость: -20% от общего.Сытость: -15% от общего.БинтКровотечение: -100%.Выносливость: -25% от общего.АнтирадРадиация: -100%.Выносливость: -30% от общего.Сытость: -35% от общего.ВодкаЗдоровье: +3% от потерянного.Пси-здоровье: +15% от набранного.Выносливость: -20% от общего.Радиация: -10% от набранной.Сытость: -30% от общего.ЭнергетикВыносливость: +100%.Сытость: -25% от общего.КонсерваСытость: +70% от потерянной.Выносливость: +20% от общего.КолбасаСытость: +50% от потерянной.Выносливость: +15% от общего.БатонСытость: +30% от потерянной.Выносливость: +10% от общего. Хотелось бы видеть мнение окружающих. Изменено 6 Июня 2013 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 6 Июня 2013 @Хемуль36рус, да я вот подумываю приплести сюда возможности X-Ray extension, тогда можно сделать двойное действие, сначала восстановление выносливость повышается, а затем падает.Но пока-что, придётся использовать либо-либо. И, лично мне, кажется, что всё таки она должна чуть-чуть повышать здоровье (опираюсь, на притупление чувств боли) и уменьшать выносливость (следствие алкогольного опьянения). Хотя с другой стороны... Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 20 Июня 2013 Скинь твой bind_stalker.script, но без "медицины". Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 22 Июня 2013 @sanjaaa, у тебя зарегистрировано два колбека на использование предмета в методе reinit: self.object:set_callback(callback.use_object, self.use_object, self) self.object:set_callback(callback.use_object, self.use_obj, self) Первый из этого метода удали. Теперь адаптация... Есть вот такой код у тебя: function actor_binder:use_obj(obj) main_sleep.sleep(obj) end Замени на вот такой: local item_ = {["medkit"] = true, ["medkit_army"] = true, ["medkit_scientic"] = true,} function actor_binder:use_obj(obj) main_sleep.sleep(obj) if item_[obj:section()] then medicine.Rehabilitation(obj) end end И в метод update впиши вот такую строку: xr_s.on_actor_update(delta) Ну и разумеется, закинь файлы medicine.script и xr_s.script себе в геймдату. 1 1 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 17 Июля 2013 (изменено) Наверно, логично, что bind_stalker.script ибо остальные у меня есть. По поводу вылета - я опять запамятовал, что в ЧН функции hide_weapon и restore_weapon принимают параметр, который в ТЧ никак не передать, ибо просто нечего. Решение достаточно простое...В файле use_item.script, найди функцию HideWeapon (вторая снизу) и измени в ней вот эти две строки: bind_stalker.hide_weapon() -- и bind_stalker.restore_weapon() На вот такие соответственно: actor:hide_weapon() -- и actor:restore_weapon() Изменено 17 Июля 2013 пользователем ColR_iT 1 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 18 Июля 2013 Возможно, но не вижу смысла, ибо водку действительно сразу же можно закусывать хлебом или колбасой. Да и хлеб жевать и рану перевязывать тоже вполне реально. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 18 Июля 2013 Лично я не моделировал никакой реальности, я лишь предоставил другой вариант реализации реакции ГГ на съеденные предметы. Поделиться этим сообщением Ссылка на сообщение