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

Справочник по функциям и классам


Рекомендуемые сообщения

По классу CTime:

Универсалка для получения текущих игровых даты\времени (для вывода например на худ) от Artosa (ну и меня тоже - вместе как то на форуме СП забавлялись вышеприведенными методами и в итоге пришли к почти идентичным кодам :rolleyes: )

  Код (Показать)

 

Изменено пользователем Kirgudu
Ссылка на комментарий
  Постэффекты (Показать)

 

Изменено пользователем Kirgudu
  Полезный утиль (Показать)
Ссылка на комментарий

Обновляю старый-престарый пост про alife_simulator. Теперь описаны и прокомментированы почти все функции, оформление приведено в порядок. Старый пост будет удалён.

 

  alife_simulator (Показать)

 

Добавлено через 107 мин.:

Отредактировал шапку. Там теперь оглавление со ссылками на конкретные посты. Оглавление для удобства сделано не в хронологическом, а в тематическом порядке.

Изменено пользователем Kirgudu
  Полезный утиль (Показать)
Ссылка на комментарий
  Кое что по метатаблице _G сталкера. (Показать)
Изменено пользователем Garry_Galler
Ссылка на комментарий
  Garry_Galler писал(а):
Что хотелось бы узнать:

1) Как это можно использовать в игровых целях?

Обычно порядок другой :) Есть игровая цель и думается: "Как это можно сделать?"

 

  Цитата
2) Как можно загрузить в эту таблицу модуль который туда еще не был кэширован (есть мнение, что пока к своему (не дефолтному) файлу(точнее к функции из него) не обратишься, он туда не кешируется, и следовательно автономный вызов функции из этого файла

function Func() body end

Func()

приводит к вылету, так как в _G его еще нет.

Если у тебя модуль выполняется - значит он уже загружен и вылета не будет.

Вообще с подгрузкой не понял - пишешь модуль_который_не_закеширован.функция() и движок сам загружает файл модуль_который_не_закеширован.script.

 

  Цитата
Ну и какой-нибудь дoполнительный теорбазис обо всем этом тоже не помешал бы.

Функциональность модулей реализуется luabind, а в нем с помощью метатаблиц. Грубо говоря ставится коллбек на запрос несуществующей переменной в _G и в коллбеке пытаются подгрузить скрипт с таким именем

Ссылка на комментарий
  Цитата
Обычно порядок другой smile.gif Есть игровая цель и думается: "Как это можно сделать?"

Обычно я так и делаю :)

 

Про кеширование: я имел ввиду вот что -

берем функцию - например такую -

function TestMessage()

news_manager.send_tip(db.actor, "Функция вызвана автономно", 0, "default", 180000)

end

и вставляем ее в файл в котором есть функции вызываемые из апдейта.

И пишем под функцией ее автономный вызов

TestMessage()

При загрузке игры функция благополучно вызывается.

Но если ее поместить в файл, который ни откуда не вызывается, то вызова не будет - так как в _G данный файл еще не был загружен.

К тому же при попытке обратиться к незагруженному в таблицу _G файлу из xml тегов (это уже пишу на основе чужого опыта) может произойти вылет.

Отсюда и вопрос - как этим процессом загрузки данных в метатаблицу _G можно манипулировать.

Ссылка на комментарий

можно, например, написать скрипт, который при старте игры будет перебирать файлы в папке scripts и у нужных вызывать функцию init

или же просто прописать вызов функции из start_game_callback

 

Насчет вызова xml тегов не скажу - не знаю. Знаю что было что-то похожее в вызове функций из файлов логики. Но там причина была совершенно в другом - в скрипте обрабатывающем логику было жестко прописано, что функции должны вызываться из xr_effects.script. В АМК это было исправлено и можно было вызывать функции из любого файла.

А скорее всего в файле была ошибка и он просто не загружался :unsure: Хотя, если есть реальный пример, было бы интересно посмотреть

Ссылка на комментарий
  Цитата
прописать вызов функции из start_game_callback

Но это уже не будет автономным вызовом функции. Вызов то во внешний файл можно поставить куда угодно.

----------------------------------------------------------------------------------------

По поводу вылетов при обращении к своему файлу из xml -тегов:

как я уже отметил - это не мой опыт - но опыт человека многим известного - Artosa(разработчика мультимода Симбион).

Вот что он писал по этому поводу:

  Цитата
То, что вызов функции из скрипта, имеющего синтаксические ошибки невозможен - это собственно и так понятно. Скрипт не считывается в метатаблицу _G/db и обращение к отсутствующей таблице -> nil.

А вот с фактом того, что первичное обращение к 'самописному' скрипту порой приводит к аналогичному результату (nil), заметил еще в давние времена, когда начинал ковыряться в кодах игры.

Причем практически 100% это заметно при вызове из диалогов (xml-ек) 'своих' функций из 'своих' скриптов.

Предполазаю, что при косвенных вызовах (через xml-тэги или аналогичное) идет обращение НЕ к скрипту, а к метатаблице _G (или даже db!) и если файл скрипта еще не был кеширован в нее - результат ->nil.

--------------------------------------------------------------------------------------

И еще - можно чуток поподробнее о функции init :rolleyes: ?

Заметил, что во всех биндерах есть функция init() или bind() и указывается она в конфиг секциях объектов которые биндятся.

Какую функцию ты имел ввиду?

---------------------------------------------------------------------------------------------

malandrinus

Спасибо за указание на prefetch() - будем тестить.

-------------------------------------------------------------

Все работает - один минус - вызов prefetch() нужно куда-то ставить :wacko: - автономность вызова функций опять же убивается.

Изменено пользователем Garry_Galler
Ссылка на комментарий

Garry_Galler,

  Цитата
2) Как можно загрузить в эту таблицу модуль который туда еще не был кэширован (есть мнение, что пока к своему (не дефолтному) файлу(точнее к функции из него) не обратишься, он туда не кешируется, и следовательно автономный вызов функции из этого файла

Глобальная функция prefetch(<имя модуля>)

Имя модуля указывается без расширения ".script"

  Полезный утиль (Показать)
Ссылка на комментарий
  Garry_Galler писал(а):
И еще - можно чуток поподробнее о функции init :rolleyes: ?

Заметил, что во всех биндерах есть функция init() или bind() и указывается она в конфиг секциях объектов которые биндятся.

Какую функцию ты имел ввиду?

Это обычная функция, можно и по-другому назвать. К биндерам отношения не имеет. Просто чтобы эту функцию можно было вызвать. prefetch в этом отношении может даже и лучше

 

Непонятно зачем тебе автономность нужна? Можешь привести пример?

В сталкере нет никакого механизма автономности - вызовы функций должны быть где-то прописаны.

Есть файл script.ltx, в нем прописыван class_registrator.script, из него подгружаются серверные и клиентские классы

Из конфигов секций объектов подгружаются скрипты биндеров.

Из них подгружаются по мере необходимости остальные скрипты

 

Можешь сделать такой же механизм. Заведи ltx и прописывай туда скрипты, которые надо автономно запускать, ну и скрипт напиши, обрабатывающий этот ltx и вызывающий prefetch для прописанных скриптов.

 

---------

По поводу вызова функций из xml: проверил на ЗП - прописал в прекондишен свою функцию в своем скрипте - все нормально загружается и вызывается, хотя мой скрипт на момент вызова функции закеширован не был

Изменено пользователем Kolmogor
Ссылка на комментарий

Garry_Galler,

  Цитата
вызов prefetch() нужно куда-то ставить :wacko: - автономность вызова функций опять же убивается.

Если сильно надо, поставь все необходимые вызовы prefetch в начале модуля _g.script.

 

Kolmogor,

  Цитата
По поводу вызова функций из xml: проверил на ЗП - прописал в прекондишен свою функцию в своем скрипте - все нормально загружается и вызывается, хотя мой скрипт на момент вызова функции закеширован не был

Я никогда не понимал особенного смысла в этой функции, но по мотивам данного обсуждения могу предположить, что это вроде заплатки. Возможно, в ЗП выловили все такие ситуации, и необходимость в заплатке отпала.

  Полезный утиль (Показать)
Ссылка на комментарий

Kolmogor

Смысл всей этой затеи с автономностью - делать свои разработки как можно менее зависимыми от дефолтных файлов(совместимость модов будет более простая) - в плане вызовов своих функций. Например на данный момент для одной своей разработки я полностью избавился от необходимости использовать bind_stalker как для апдейта, так и в плане некоторых каллбеков - переустановил их на эктора заново в своем биндере.

 

malandrinus

  Цитата
Если сильно надо, поставь все необходимые вызовы prefetch в начале модуля _g.script.

Так тут дело не в том куда поставить - вариантов то масса - а в том именно, что нАдо кУда То ставить :rolleyes: - а это значит опять задейстовать\править дефолтные файлы.

Изменено пользователем Garry_Galler
Ссылка на комментарий

Распишу немного то, что по работе с физикой объектов освоил:

Для начала требуется получить управление над физической оболочкой объекта для чего существует уже описанный в справочнике метод get_physics_shell().

Применяем метод к клиентской юзердате объекта.

Далее можно обратиться к методам нижеследующих классов для нужных нам действий.

  class physics_shell (Показать)

 

Методы класса physics_element следует применять к предварительно полученному объекту элемента физической оболочки предмета.

  class physics_element (Показать)

 

Пример фиксации объекта - хоть в воздухе, хоть на земле. Фиксация сохраняется и после сейв\лоада. Но у мелких объектов фиксация после сейва\лоада слабая - и может легко разрушаться от приложения к нему силы. До перезагрузки - фиксируется намертво.

  фиксация (Показать)

 

Кстати насчет метода script_server_object_version()

вот для чего он используется:

local ss_ver = script_server_object_version()
local IS_SOC = (ss_ver <= 7) -- although anything earlier then 1.0004 won't work
local IS_CS = (ss_ver > 7 and ss_ver < 12) -- although anything earlier then 1.5.0.4 won't work
local IS_COP = (ss_ver >= 12) --(ss_ver == 12)
 

комментарии думаю излишни.

 

Kirag

Спасибо. Я так и думал что как то не так их применял. Теперь более менее понятно.

Но вот только что они дают интересного(линеарное и угловое ускорение?).

И как работать с полученными значениями?

 

Изменено пользователем Kirgudu
  • Нравится 1
Ссылка на комментарий

Garry_Galler,

 

Методы get_linear_vel и get_angular_vel рабочие (для всего шелла - проверено, для отдельного элемента - наверняка то же самое), применяются они так:

 

-- ps - ранее полученная физ. оболочка объекта
lvel = vector()
ps:get_linear_vel(lvel)
avel = vector()
ps:get_angular_vel(avel)
-- дальше с переменными lvel и avel делается все, что нужно

 

 

По поводу практического применения - оба метода используются в нашей с malandrinus-ом "Гравипушке". Линейная скорость - для контроля положения захваченного объекта - как и куда нужно пнуть объект, чтобы он остался в фокусе захвата, обе скорости - для определения факта соударения брошенного объекта - оба вектора при ударе должны заметно измениться.

Изменено пользователем Kirag

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Ссылка на комментарий

Garry_Galler,

  Цитата
Но вот только что они дают интересного(линеарное и угловое ускорение?).

И как работать с полученными значениями?

Это вектор скорости и угловой скорости соответственно. Вектор угловой скорости направлен по оси вращения, а его значение = количеству радианов в секунду.

 

 

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus,

Занялся недавно скриптовыми диалогами - на практике.

В общем думаю стоит добавить в твои посты про них следующий момент:

При использовании метода AddAction(string) функция, которая вызывается им, принимает вот такой набор аргументов:

func(oSpeaker1, oSpeaker2, sDlgId, idPhrase)

первые два аргумента думаю всем понятны - юзердата собеседников, sDlgId - строковое имя диалога, и самый важный для меня аргумент - idPhrase - айди фразы (строковое или числовое - в 1.0004 используются числовые идентификаторы).

Не зная всего этого - потратил лишнее время на изобретение системы отслеживания активированных фраз в диалоге - но все оказалось гораздо проще. ;)

Функция, которая вызывается методом AddPrecondition(string) принимает немного другой набор аргументов:

precondition(oSpeaker1, oSpeaker2, sDlgId, idParent, idPhrase)

как видно тут добавился еще один - idParent, который возвращает айди родительской фразы, то есть фразы идущей перед той, в которой данный прекондишен находится.

При динамическом формировании фраз (например как у меня через цикл) - когда число фраз заранее неизвестно - значение аргумента idPhrase просто незаменимо.

Без этого я например просто не смог бы передать нужные данные для каждой конкретной фразы.

Ну правда я немного схитрил и использовал give_talk_message для некоторых ответных фраз NPC - просто с иконкой фразы красивше смотрелись (и иконка в тему).

Вот. Пока все, что выяснил интересного. Работает мой диалог отлично - так что тебе большое спасибо за раскрытие темы.

Изменено пользователем Garry_Galler
Ссылка на комментарий
  Работа с консолью. Класс CConsole (Показать)


Добавлено через 77 мин.:

Garry_Galler

  Цитата
стоит добавить в твои посты про них следующий момент:

Там это всё есть в первой части. В части про скриптовые диалоги я просто ссылаюсь на ранее описанные теги. А зачем тебе потребовались скриптовые диалоги? Они же не дают практически никаких преимуществ по сравнению с XML. Я об этом писал. Они скриптовые, но ни разу не динамические. А вся динамичность в равной степени доступна как при скриптовом создании, так и при использовании XML.

 

Кстати, в описании тега action у меня была ошибка. Заметил и исправил благодаря твоему посту. Спасибо!

Изменено пользователем Kirgudu
  • Полезно 1
  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus

  Цитата
Там это всё есть в первой части

Вот как раз потому, что только в первой части - я и не обратил внимания - поскольку был сосредоточен именно на скриптовых методах.

Если продублировать и там - тогда думаю многим будет яснее. :rolleyes:

  Цитата
Они же не дают практически никаких преимуществ по сравнению с XML.

Ну как это не дают преимуществ - еще как дают.

Я их применил для динамического создания диалога (у одного NPC ) о продаже кодов к закодированным схронам.

Фразы во первых формируются в цикле - что в xml сделать нельзя - то есть их число заранее неизвестно и определяется длиной таблички, которая хранит коды. В момент инициализации диалога специальная функция у меня формирует временную(существующую только до закрытия диалога) табличку со всеми нужными(и свежими данными), а далее в каждую новую фразу подставляются табличные данные. И хотя сами фразы однотипные по структуре - наполнение у всех разное. Что опять же нельзя сделать из xml, где наполнение предустановлено заранее.

Ну и на каждую фразу ГГ стоит скриптовый экшен, который выполняет нужное действие ориентируясь на номер фразы.

Также использованы скриптовые прекондишены. Диалог динамически меняет - не знаю как правильно сказать - граф не граф - в общем свой состав - каждая активированная фраза о покупке тут же исчезает из диалога(так как больше не нужна), при новой инициации диалога он строится уже в новом составе(с новым числом фраз) и с обновленными данными. В случае, если данных нет - кончились - выводится фраза NPC типа "на сегодня предложений больше нет".

Диалог у меня конечно маленький (и развилок всего пара штук)- но работает как надо.

Изменено пользователем Garry_Galler
Ссылка на комментарий

Garry_Galler,

 

ок, надеюсь, ты внимательно прочитал вот этот комментарий из первой части

  Важное разъяснение относительно инициализации диалогов. (Показать)
  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus,

  Цитата
В противном случае можно нарваться на абсолютно непредсказуемые ошибки, которые зависят от таких вещей, как запустили ли вы программу только что или это уже второй и далее сейв

Нда, вот я и нарвался на непредсказуемые ошибки.

  spoiler (Показать)
Изменено пользователем Garry_Galler
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

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