Случайная подборка модов
Путь Человека: Возвращение
4.1
Dead City Mod v. 4.80
3.7
Новое Время
3.2
Смерти Вопреки. Послушник
3.4
Dragon`s MOD
2.5
История снайпера: Ловушка Судьбы
2.9
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Модератор форума: FanG, Аdmin, FantomICW, Overfirst  
Форум » S.T.A.L.K.E.R. Модификации » Помощь в моддинге » Скрипты, конфиги, логика, движок » Динамическое подключение/отключение функций. (Всё элементарное - рядом...)
Динамическое подключение/отключение функций.
Украина  BozKurt
Вторник, 05.02.2013, 13:57 | Сообщение # 1
Статус:
Опытный:
Сообщений: 1753
Награды: 3
Регистрация: 25.05.2012

Думаю многим известно, что такое файл bind_stalker.script. В этом файле прописан класс actor_binder обрабатывающий действия актора. Всего в классе семнадцать методов. Коротко расскажу о назначении каждого:
Самым частым в использовании является метод update. Именно в него неосведомлённый модостроитель порою "заталкивает" такое, что волосы становятся дыбом, и невероятно часто данный метод используют для одноразовых "заданий", прописывая проверку инфопорции, чтобы результат не проверялся несколько раз, но тем не менее проверка продолжает выполняться. А что если использовать update по требованию и когда необходимость в нём отпадает - убирать проверку? Как? Оказывается не очень то и сложно...
Таковым функционалом обладает файл xr_s.script из папки скриптов ЧН или ЗП. Знающий скрипты человек, уделив некоторое внимание данному файлу, сам поймёт как его использовать, не знающий - будет долго всматриваться в код в поисках знакомых слов. Ничего страшного в этом нет - самообразование всегда похвально, я же помогу Вам разобраться в коде окончательно.
Идея скрипта как раз в том и состоит, чтобы в нужный момент подключить любую функцию к одному из колбеков, включая update, и когда необходимость в функции отпадёт - убрать её от туда, тем самым избавив колбек от лишней работы. При этом список колбеков можно свободно расширить, и подключать функцию можно вообще по сути куда угодно. Итак, давайте разберём файл более подробно.

Вот некоторые соответствия того, какую функцию из xr_s.script куда прописывать и какой "колбек" из таблицы callbacks использовать в последствии:
Подозреваю, что вышеизложенный текст, не для всех является простым, но изложить доступно словами всю идею, не отклоняясь от основной мысли (динамическое "включение" функций) достаточно сложно. Я стараюсь, на сколько это возможно, придерживаться этого компромисса, поэтому, если Вам не понятен текст выше, прочитайте его ещё раз, чтобы у Вас была теория "на уме", а не бегать в последствии глазами по тексту - так Вам же будет проще.

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

Пример вышел тривиальным, но более чем наглядным. Естественно его можно развить, добавить медленное восстановление здоровья, ограничить возможность использования нескольких аптечек подряд, пока работает таймер и т.д. Развитие функционала уже выходит за рамки "урока", поэтому это остаётся на Ваших плечах.
Всё работает без вылетов, лично преверял на ТЧ 1.0006. Хотя это и предполагается на ТЧ, но работать будет и на ЧН и на ЗП.

Ссылка на xr_s.script (ЗП 1.6.0.2), если у кого нет: >>ClicK Me<<



"Без лишних слов"




P.S.
Если возникли какие-то вопросы в плане использования функционала xr_s.script не стесняйтесь - задавайте вопросы. Только, ПОЖАЛУЙСТА, задавайте их так, чтобы было понятно не только Вам.
Если всё же у Вас возникли проблемы с реализацией примера (напомню - он на 100% рабочий) и происходит вылет - под спойлер в порядке действий: что-куда прописывали, что сделали в игре (в какой момент), лог вылета; дабы ускорить процессию разбирания Ваших кодов - пользуйтесь тегом [cоde][/cоde].

Любые возмущения, не довольствия - останутся без ответа, во всяком случае с моей стороны.
Сообщение отредактировал ColR_iT - Вторник, 19.02.2013, 12:50
  Злобная реклама
Вторник, 05.02.2013, 13:57
Статус:
Сообщений: 666
Регистрация: 25.05.2012
Российская Федерация  Uyman358
Вторник, 05.02.2013, 16:08 | Сообщение # 2
Закоулки Правды
Статус:
Бывалый:
Сообщений: 1098
Награды: 1
Регистрация: 13.06.2012

статья полезная. Хочу кое-что выделить добавить(не по скриптам):
Цитата (ColR_iT)
невероятно часто данный метод используют для одноразовых "заданий", прописывая проверку инфопорции, чтобы результат не проверялся несколько раз

У меня самого было около 15-ти(!) функций проверки инфопоршней и прочего хлама, висящего на апдейте - из-за этого игра начинала постепенно тормозить. Поэтому я не придумал ничего лучше, как вешать проверку на рестрикторы, ставил их в нужные места, создавая определенную логику. Может, кому и пригодиться. Лучше пожертвовать размерами олспавна, чем тормозами игры.
  Злобная реклама
Вторник, 05.02.2013, 16:08
Статус:
Сообщений: 666
Регистрация: 13.06.2012
Украина  BozKurt
Вторник, 05.02.2013, 16:20 | Сообщение # 3
Статус:
Опытный:
Сообщений: 1753
Награды: 3
Регистрация: 25.05.2012

Uyman358, можно и так, но иногда какое-то действие нужно выполнить не зависимо от местоположения, при этом другой возможности запустить функцию нет (имею ввиду схему логики или диалог), поэтому чуть ли не единственным вариантом становиться апдейт. Опытный модстроитель всегда подгонит скрипты под ситуацию , а вот новички, к сожалению, из-за отсутствия знаний/опыта/смекалки подгоняют ситуацию под скрипты, как следствие - горы хлама повсюду (как правило больше всего достаётся апдейту) и вполне ожидаемые вылеты.
Данный способ поможет "расставить всё по полочкам" параллельно оптимизируя игру.
  Злобная реклама
Вторник, 05.02.2013, 16:20
Статус:
Сообщений: 666
Регистрация: 25.05.2012
Российская Федерация  Sanjaaa
Вторник, 05.02.2013, 17:32 | Сообщение # 4
Dark Reaper Souls
Статус:
Бывалый:
Сообщений: 926
Награды: 6
Регистрация: 22.08.2012

ColR_iT, блин спасибо большое! долго же я искал)
  Злобная реклама
Вторник, 05.02.2013, 17:32
Статус:
Сообщений: 666
Регистрация: 22.08.2012
Украина  BozKurt
Вторник, 05.02.2013, 17:34 | Сообщение # 5
Статус:
Опытный:
Сообщений: 1753
Награды: 3
Регистрация: 25.05.2012

Искал что? Я статью только сегодня дописал...
Сообщение отредактировал ColR_iT - Вторник, 05.02.2013, 17:34
  Злобная реклама
Вторник, 05.02.2013, 17:34
Статус:
Сообщений: 666
Регистрация: 25.05.2012
Российская Федерация  Sanjaaa
Вторник, 05.02.2013, 17:40 | Сообщение # 6
Dark Reaper Souls
Статус:
Бывалый:
Сообщений: 926
Награды: 6
Регистрация: 22.08.2012

для других предметов в коде

if string.find(obj:section(), "medkit") then
end

вместо medkit любой предмет писать можно?

Добавлено (05.02.2013, 17:40)
---------------------------------------------
ColR_iT, как реализовать убирание оружие при использовании

  Злобная реклама
Вторник, 05.02.2013, 17:40
Статус:
Сообщений: 666
Регистрация: 22.08.2012
Российская Федерация  Danis88
Вторник, 05.02.2013, 17:44 | Сообщение # 7
Статус:
Бывалый:
Сообщений: 614
Награды: 2
Регистрация: 15.08.2012

ColR_iT, Ты как всегда, балуешь нас знаниями... wink Спасибо тебе!
Сообщение отредактировал Danis88 - Вторник, 05.02.2013, 18:06
  Злобная реклама
Вторник, 05.02.2013, 17:44
Статус:
Сообщений: 666
Регистрация: 15.08.2012
Украина  BozKurt
Вторник, 05.02.2013, 17:46 | Сообщение # 8
Статус:
Опытный:
Сообщений: 1753
Награды: 3
Регистрация: 25.05.2012

Нужно было дописать в конце: на глупые вопросы также не отвечаю...

Sanjaaa, прочитай внимательно, там расписано, хотя нет, не расписано - разжёвано, как это делается.
  Злобная реклама
Вторник, 05.02.2013, 17:46
Статус:
Сообщений: 666
Регистрация: 25.05.2012
Российская Федерация  Scouser
Вторник, 05.02.2013, 18:57 | Сообщение # 9
Статус:
Опытный:
Сообщений: 1614
Награды: 16
Регистрация: 21.10.2012

Спасибо, урок хороший smile
Сообщение отредактировал LaRento - Вторник, 05.02.2013, 19:01
  Злобная реклама
Вторник, 05.02.2013, 18:57
Статус:
Сообщений: 666
Регистрация: 21.10.2012
Российская Федерация  Mirage
Вторник, 05.02.2013, 20:38 | Сообщение # 10
Независимый аниматор
Статус:
Бывалый:
Сообщений: 1130
Награды: 2
Регистрация: 09.06.2012

Ребят, кто-нибудь скиньте xr_s.script.
  Злобная реклама
Вторник, 05.02.2013, 20:38
Статус:
Сообщений: 666
Регистрация: 09.06.2012
Российская Федерация  SkyLoader
Вторник, 05.02.2013, 20:53 | Сообщение # 11
Статус:
Бывалый:
Сообщений: 1116
Награды: 12
Регистрация: 29.11.2010

ColR_iT,
Цитата (ColR_iT)
Всего в классе семнадцать методов.

wacko Функции вроде info_callback это просто функции, не методы. Эти функции вызывают коллбэки. Не мешало бы разделить коллбэки и методы. И еще, ты забыл про коллбэк на использование предмета.
  Злобная реклама
Вторник, 05.02.2013, 20:53
Статус:
Сообщений: 666
Регистрация: 29.11.2010
Украина  BozKurt
Вторник, 05.02.2013, 21:04 | Сообщение # 12
Статус:
Опытный:
Сообщений: 1753
Награды: 3
Регистрация: 25.05.2012

Добавил в шапку ссылку на файл.

SkyLoader
Цитата (SkyLoader)
Функции вроде info_callback это просто функции, не методы.
, я перечислил исключительно методы класса actor_binder, всего их семнадцать, во всяком случае для ТЧ 1.0006.

Цитата (SkyLoader)
Эти функции вызывают коллбэки.
Вообще-то колбеки вызывают функции, в данном случае некоторые методы, если быть точным.

Цитата (SkyLoader)
Не мешало бы разделить коллбэки и методы.
Их то собственно ничего и не объединяет. Все методы данного класса вызываются движком при определённых действиях, если считать, что колбек - это "функция" вызываемая при определённых условиях, то все методы биндера и есть колбеки.

Цитата (SkyLoader)
И еще, ты забыл про коллбэк на использование предмета.
В ТЧ, например, он не используется, ровно как и в ЧН. Но даже так я о нём не забыл, так как использую его в примере.
Сообщение отредактировал ColR_iT - Вторник, 05.02.2013, 21:07
  Злобная реклама
Вторник, 05.02.2013, 21:04
Статус:
Сообщений: 666
Регистрация: 25.05.2012
Российская Федерация  SkyLoader
Вторник, 05.02.2013, 21:34 | Сообщение # 13
Статус:
Бывалый:
Сообщений: 1116
Награды: 12
Регистрация: 29.11.2010

Цитата (ColR_iT)
Вообще-то колбеки вызывают функции, в данном случае некоторые методы, если быть точным.

Да, я это и имел ввиду, для меня мое предложение имело тот же смысл smile

Цитата (ColR_iT)
В ТЧ, например, он не используется, ровно как и в ЧН. Но даже так я о нём не забыл, так как использую его в примере.

Спойлер с реализацией проглядел, сорри wink
  Злобная реклама
Вторник, 05.02.2013, 21:34
Статус:
Сообщений: 666
Регистрация: 29.11.2010
Российская Федерация  Mirage
Вторник, 05.02.2013, 21:54 | Сообщение # 14
Независимый аниматор
Статус:
Бывалый:
Сообщений: 1130
Награды: 2
Регистрация: 09.06.2012

ColR_iT,
Код
xr_s.register_callback("update", use_med.MedkitUsing, {time_global(), 4000})
и
Код
xr_s.unregister_callback ("update", use_med.MedkitUsing)

нужно прописать в xr_s.script, правильно я понял?
  Злобная реклама
Вторник, 05.02.2013, 21:54
Статус:
Сообщений: 666
Регистрация: 09.06.2012
Украина  BozKurt
Вторник, 05.02.2013, 22:05 | Сообщение # 15
Статус:
Опытный:
Сообщений: 1753
Награды: 3
Регистрация: 25.05.2012

Цитата (ColR_iT)
В проверку использования аптечки в колбеке use_object нужно добавить вот такой вызов:
Код
xr_s.register_callback("update", use_med.MedkitUsing, {time_global(), 4000})

Цитата (ColR_iT)
Нужно вписать вызов этой функции в том месте, где работа таймера закончена. После строки:
Код
bind_stalker.restore_weapon()
допишите:
Код
xr_s.unregister_callback ("update", use_med.MedkitUsing)
Сообщение отредактировал ColR_iT - Вторник, 05.02.2013, 22:06
  Злобная реклама
Вторник, 05.02.2013, 22:05
Статус:
Сообщений: 666
Регистрация: 25.05.2012
Форум » S.T.A.L.K.E.R. Модификации » Помощь в моддинге » Скрипты, конфиги, логика, движок » Динамическое подключение/отключение функций. (Всё элементарное - рядом...)
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: