Это популярное сообщение. Malandrinus 615 Опубликовано 8 Июля 2009 Это популярное сообщение. Поделиться Опубликовано 8 Июля 2009 (изменено) В данной теме собраны сведения по скриптовой модели сталкера: функции и классы, методы и свойства, взаимосвязь классов и последовательность работы с ними, связь работы классов и файлов конфигураций. К наполнению темы приглашаются все желающие. В наполнении темы непосредственно участвовали и существенно мне помогли: @Monnoroch, @Kolmogor, @Unnamed Black Wolf, @меченый(стрелок), @IQDDD, @Kirag, @Taroz, @dan, @7.9, @Garry_Galler, @AKKK1, @Bak и много других людей. Скрытый текст Скрытый текст класс alife_simulator. Базовые операции с серверными объектами. Пространства имён. Глобальные функции для большого числа задач. "Создание своего класса" и "Наследование от экспортированных классов". Базовые сведения об объектно-ориентированном программировании для сталкера. Необходимо прочитать, для понимания темы про биндер и некоторых других. В одном посте: Общие слова об архитектуре и скриптовой модели сталкера "Класс object_binder" расширение онлайновых объектов, колбеки, сохранение состояния. "Класс net_packet" Регистрация скриптовых классов с помощью object_factory Серверные классы. Часть 1 Иерархия серверных классов, описание не закончено. Серверные классы. Часть 2 Картинка структуры наследования и несколько заключительных слов Клиентские классы Скрытый текст Класс game_object Интерфейс ко всем онлайновым (клиентским объектам) Класс hit для нанесения урона скриптом и другая информация (IQDDD) Некоторая информация по управлению путями патрулирования здесь (Kirag) и здесь (Taroz) Неполная информация по управлению памятью неписей с примером здесь (Bak) Физическая оболочка объектов (Garry_Galler) Пост о выборе (подборе) оружия НПС и стрельбы (*Shoker*) Скрытый текст Управление заданиями Класс 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. Проигрывание звуков в игре в произвольном месте, от произвольного объекта, в голове актора. Скрытый текст Оконные классы Некоторая общая информация о создании окон Список методов, XML-тегов и событий для оконных классов (ТЧ/ЧН/ЗП) (Norman Eisenherz) Представление материала в моих статьях оптимизировано для онлайнового просмотра. Если кому не хочется лазить по спойлерам, а нужно просмотреть текст какого-либо поста "потоком", то могу рекомендовать просмотр в режиме "текстовая версия". В этом же режиме удобно сохранять содержимое темы на диск. (прим. Malandrinus) Изменено 17 Февраля пользователем Опричник 5 5 16 Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/
Полтергейст 38 Опубликовано 12 Января 2011 Поделиться Опубликовано 12 Января 2011 Подскажите насчёт серверных объектов... Что вызывается чаще - cse_alife_*:update() или cse_alife_*:can_switch_*() ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-552720
Malandrinus 615 Опубликовано 12 Января 2011 Автор Поделиться Опубликовано 12 Января 2011 Полтергейст, update у серверных классов по-моему вообще не работает. По крайней мере нет ни одного примера их использования. can_switch_* вызывается вроде раз в секунду. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-552902
IQDDD 5 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 и за что этот can_switch отвечает? Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-552978
Malandrinus 615 Опубликовано 13 Января 2011 Автор Поделиться Опубликовано 13 Января 2011 За возможность перехода в онлайн/оффлайн. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-552982
Полтергейст 38 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 По крайней мере нет ни одного примера их использования. Я имею в виду вызов этой функции не из скриптов, а из симуляции... Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553012
Stalk15 27 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 load(string) -- загрузить конфигурацию задачи из файла config\gameplay\game_tasks.xml .... string get_id() -- даёт строку-идентификатор задачи. Это атрибут id из тега game_task в XML -- если не был выполнен метод load или не была добавлена хоть одна подзадача, то вернёт nil ... Как выполнить метод load, если квест скриптовый? Из-за не выполнения метода load при выдаче квеста игра велетает, потому что get_id(), использующийся при выводе сообщения о новом квесте, дает nil. Удалите вот этот мой пост. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553088
Malandrinus 615 Опубликовано 13 Января 2011 Автор Поделиться Опубликовано 13 Января 2011 Полтергейст, Я имею в виду вызов этой функции не из скриптов, а из симуляции... Чтобы задавать такой вопрос, надо для начала понимать, что этот метод делает. Вот я не понимаю, что он делает. Из предположений у меня есть две версии: 1. Это эквивалент update биндера, только для серверной стороны. Но тогда это явно не работающий механизм, просто потому, что нереально обновлять немерянное количество серверных объектов. Такой метод есть у всех монстров, сталкеров и аномалий. Даже если и задумывалось когда-то, что все они будут шевелиться в оффлайне, то сейчас такого нет точно. 2. Это может быть информационный метод, который на самом деле возвращает какое-то значение. Какое и зачем - неясно. В пользу этого может говорить отсутствие аргумента. Опять же есть два варианта - надо или не надо его перегружать. Т.е. это чисто внутренняя информация или предоставление скриптёру возможность что-то сказать, наподобие тех же can_switch ? Я пока не знаю ответа на эти вопросы. Т.е. я вообще не знаю, на кой нужен этот метод. Посему вопрос "как часто он вызывается" - для меня просто бессмысленный. У меня ни разу никак не вызвался. Stalk15, Как выполнить метод load, если квест скриптовый? Там же есть в статье пример. Вот он: local new_task = CGameTask() new_task:load("gar_car_graveyard_quest") -- задание "Предложить помощь Бесу" Чего же более? И по поводу примеров вообще. Я с самого начала ещё в первом посте обозначил, что тема для коллективного творчества. Будут постить сюда примеры - будут примеры. Не будут - "извиняйте хлопцы, бананов нема". Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553364
Stalk15 27 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 (изменено) malandrinus new_task:load("gar_car_graveyard_quest") Так это же загрузка уже существующего квеста. А ведь в скриптах делается новый квест, всеравно загружать существующий нужно? Как я понял, загружается квест из конфигов, а далее в скриптами можно его менять, так? Пример уже могу привести, работает в плоть до выполнения всего квеста, но одна проблема:После выполнения квеста(всех подзадач) он не изчезает из ПДА, хотя все подзадачи уже подмечены, как выполненые: function _on_task_() local task = CGameTask() task:load("teee") --teee - это "пустой" квест из конфигов task:set_title("Title") objective = SGameTaskObjective(task,1) objective:set_description("Description_1") objective:add_complete_func("sript.funct") task:add_objective(objective) objective = SGameTaskObjective(task,1) objective:set_description("Description_2") objective:add_complete_func("sript.funct") task:add_objective(objective) db.actor:give_task(task, 3600*22000, false) end Почему квест не изчезает после выполнения - непонятно, но зато ратотает=) Изменено 13 Января 2011 пользователем Stalk15 Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553368
Malandrinus 615 Опубликовано 13 Января 2011 Автор Поделиться Опубликовано 13 Января 2011 Stalk15, local task = CGameTask() task:load("teee") --teee - это "пустой" квест из конфигов ... objective = SGameTaskObjective(task,1) ... Почему квест не изчезает после выполнения - непонятно, но зато ратотает=) Ты берёшь из задания-заготовки подзадачу 1. Потом меняешь его и добавляешь в тоже задание. Но выходит, что там остаётся холостая подзадача с номером 1. А у этой подзадачи есть условие окончания? Может в этом причина? Думается мне, новое задание лучше сделать отдельное чистое. Для него то есть дефолтовый конструктор. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553380
Stalk15 27 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 Я скриптаи меняю этот квест: <game_task id="teee"> <objective> <icon>ui_iconsTotal_find_item</icon> </objective> </game_task> Условий нет, но они ведь добавляются в скрипте. А что за дефлотовый конструктор? Квест удалось выполнить, чтоб он изчез из ПДА, только тогда, когда я после выпонения последней подзадачи сменил статус квеста на completed. Если этот квест взять еще раз, то он уже не изчезнет из ПДА ни при каких условиях. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553389
Malandrinus 615 Опубликовано 13 Января 2011 Автор Поделиться Опубликовано 13 Января 2011 Stalk15, ну вот смотри: local task = CGameTask() -- создал пустую задачу task:load("teee") --teee - это "пустой" квест из конфигов -- не пустой!!! там есть одна подзадача objective = SGameTaskObjective(task,1) -- и вот её ты получаешь в этой строке -- меняешь свойства task:add_objective(objective) -- и добавляешь обратно, но уже второй, третьей и т.д. Я думаю, что это может объяснять происходящее. Возможно, стоит сделать так: local task = CGameTask() task:load("teee") objective = SGameTaskObjective(task,1) local new_task = CGameTask() new_task:add_objective(objective) это просто в качестве предположения. Мне сейчас не проверить. Добавлено через 22 мин.: Насчёт метода update серверных классов. Вот что выяснил. Это метод, который надо вызывать скриптами и это вызывает обновление разных вещей внутри объекта. Т.е. неправильными были оба моих ранее высказанных предположения. Если конкретнее. Для монстров и сталкеров вызов этого метода приводит к обновлению оффлайнового планировщика, что вообще-то можно сделать и непосредственно. Планировщик это который brain, есть там такие классы. Открытым остаётся вопрос о его (оффлайнового планировшика) работоспособности вообще. Тут ничего не могу сказать. Для всех остальных классов (смарты и online_offline_group кажется) метод update не делает вообще ничего. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553466
Stalk15 27 Опубликовано 14 Января 2011 Поделиться Опубликовано 14 Января 2011 (изменено) malandrinus Не. неполучается. После этого при выдче квеста - вылет - не может вывести сообщение с названием квеста(титл).Set_title не срабатывает. Вообщем, есть небольшой прогресс в скриптовом квесте. Теперь при выполнении последнего подзадания стало появлятся сообщение, что квест выполнен, но квест назойливый, и из ПДА все же не хочет изчезать: function _on_task_() local task = CGameTask() task:load("teee") local oo = task:get_objective(0) oo:set_article_id("descr_bar_resque_information_2") task:set_title(Title) local objective = SGameTaskObjective(task,1) objective:set_description("Description_1") objective:add_complete_func("CompleteFuncObjectiv1") task:add_objective(objective) objective = SGameTaskObjective(task,0) objective:set_description(""Description_2"") objective:add_complete_func("CompleteFuncObjectiv2") task:add_objective(objective) db.actor:give_task(task, 3600*22000, false) end Вот теперь и в правду непонятки, сообщение "Задание выполнено" есть, а квест в ПДА сидит. Изменено 14 Января 2011 пользователем Stalk15 Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553782
Garry_Galler 7 Опубликовано 14 Января 2011 Поделиться Опубликовано 14 Января 2011 (изменено) Хотел уточнить: класс CUIStatic действительно не поддерживает вывод анимированных текстур (в формате ogm) ? Попробовал создать экземпляр статика с ogm и вывести на худ (через AddDialogToRender()) свою видеоанимацию - вылетел(ругалась какая то движковая функция связанная с кодеком theora ). Решил попробовать тоже самое сделать с дефолтным ogm - ui\ui_mm_fire (вдруг мое видео нечитабельным было для сталка) - тоже вылетел, правда лог другой был (малоинформативный поэтому не привожу). Насчет CUIStatic я был неправ- он то как раз позволяет использовать анимированные текстуры\видео. Но если вывести их в скриптовое окно проблем нет, то вот на худ - непонятно как - использование AddDialogToRender() приводит к вылету. Изменено 14 Января 2011 пользователем kokkai Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-553931
Malandrinus 615 Опубликовано 14 Января 2011 Автор Поделиться Опубликовано 14 Января 2011 Garry_Galler, использование AddDialogToRender() приводит к вылету. А ссылку на окно сохраняешь? Там есть залипон, что если не сохранить ссылку на добавленное таким образом окно, то его приберёт сборщик мусора, и сразу за этим будет вылет. Добавлено через 31 мин.: Stalk15, Не. неполучается. После этого при выдче квеста - вылет - не может вывести сообщение с названием квеста(титл).Set_title не срабатывает. Да вообще-то работает. Заголовок устанавливается, задание выдаётся. Для справки, нарыл тут, что в CGameTask есть ещё несколько методов, не показанных в lua_help. Это: set_id set_priority get_priority у SGameTaskObjective также имеется кроме недокументированный метод set_icon_name. Кроме того, при выдаче задания надо наверное обращать внимание на третий логический аргумент функции give_task. Он отвечает за проверку наличия задачи с таким же идентификатором. Поскольку дефолтовый идентификатор всегда одинаковый, то если этот аргумент false - задача будет выдана повторно. Но всё ли при этом исправно сработает - не знаю. Возможно имеет смысл менять идентификатор задачи с помощью set_id. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-554318
Garry_Galler 7 Опубликовано 14 Января 2011 Поделиться Опубликовано 14 Января 2011 (изменено) malandrinus В точку. Спасибо за подсказку. Я свои прочие статики сохранял во внешней локальной таблице(но не для того, чтобы вылета избежать - о возможности которого даже не подозревал- просто нужно было доступ к ним иметь постоянный), а на этот статик ссылка была внутри функции. Вынес ссылку во внешку - все появилось(использовал для теста видео из игры). Теперь еще осталось разобраться с моим видео, которое сталкер воспроизводить не хочет - конвертил из avi в ogv прогой ffmpeg2theora, расширение сменил на ogm - но вылетает зараза - видимо что то с форматом не то. [spoiler=вот лог -думаю мало кому знакомый ]stack trace: 001B:004AF4B9 XR_3DA.exe, CPerlinNoise3D::Get() 001B:0047BE38 XR_3DA.exe, CTheoraSurface::Update() 001B:0048CB15 XR_3DA.exe, CTexture::apply_theora() PS: Да, вот еще - для расширения так как сказать кругозора - почему игра(компилятор) не видит уже скомпилированный скриптовый файл? Ради теста решил скомпилировать свой игровой скрипт в SCITE - положил потом в в папку script, расширение .script - так не видит в упор, как будто его там и нет вовсе. Изменено 14 Января 2011 пользователем Garry_Galler 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-554422
Полтергейст 38 Опубликовано 15 Января 2011 Поделиться Опубликовано 15 Января 2011 online_offline_group Разве этот класс вообще используется в ТЧ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-554554
Malandrinus 615 Опубликовано 15 Января 2011 Автор Поделиться Опубликовано 15 Января 2011 Полтергейст, Разве этот класс вообще используется в ТЧ? скажем так, он там есть. Хотя похоже какой-то недоделанный. В ЗП кстати его update уже что-то делает. Это вроде класс для управления отрядами, но подробностей я не знаю. Добавлено через 8 мин.: Garry_Galler, насчёт видео - это лучше в тему про SDK или в ковырялку. Я этим вообще не занимался никогда. почему игра(компилятор) не видит уже скомпилированный скриптовый файл? Помнится, когда я первый раз узнал про Lua и почитал мануал, то проделал точно такой же эксперимент =) Дело было кажется года так два или три назад. Признаться, до сих точного ответа не знаю. Вероятно, это так из-за компилятора JIT. Это же фактически альтернативная реализация Lua. Там не обязательно должно быть всё как в "настоящем". Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-554561
IQDDD 5 Опубликовано 17 Января 2011 Поделиться Опубликовано 17 Января 2011 (изменено) Где у меня ошибка со скриптовым постэффектом? Метод process не вызывается почему-то. Вот вызов: local ppe=recovery_effect(max_restored_health-db.actor.health) ppe:start() Вот сам класс: -- Постэффект class "recovery_effect" (effector) function recovery_effect:__init(add_health) super() self.params = effector_params() self.params.blur=0 self.params.gray=0 self.params.dual=duality(0,0) self.params.noise=noise(0,0,0) self.params.color_add=color(0,0,0) self.params.color_base=color(0,0,0) self.params.color_gray=color(0,0,0) self.max_add=add_health -- Максимальная яркость self.time_start=time_global() -- Время начала self.time_in=self.time_start+add_health*1.5*1000 -- Время максимального осветления self.time_white_scr=self.time_in+add_health*2.5*1000 -- Время начала сброса осветления self.time_out=self.time_white_scr+add_health*0.75*1000 -- Время конца self.time_start_in=self.time_in-self.time_start self.time_white_scr_out=self.time_out-self.time_white_scr self.pi2=math.pi/2 end function recovery_effect:process(pp) local time=time_global() msg("!") if time<self.time_in then local color_add_cur=self.max_add*math.cos(self.pi2*(self.time_in-time)/self.time_start_in) self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur) elseif time<self.time_white_scr then self.params.color_base=colol(self.max_add,self.max_add,self.max_add) elseif time<self.time_out then local color_add_cur=self.max_add*math.sin(self.pi2*(self.time_out-time)/(self.time_white_scr_out)) self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur) end effector.process(self,pp) pp:assign(self.params) return true end function recovery_effect:finished() return self.time_out<time_global() end Где найти соответствие имен костей и номеров костей? Изменено 18 Января 2011 пользователем Cyclone Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-555744
Malandrinus 615 Опубликовано 17 Января 2011 Автор Поделиться Опубликовано 17 Января 2011 IQDDD, а при чём здесь справочник? Я смотрел кости с помощью OGF Master. Там модель конвертилась в текстовый формат, и в начале файла шёл список костей. Ещё наверное в SDK можно посмотреть. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-555756
IQDDD 5 Опубликовано 18 Января 2011 Поделиться Опубликовано 18 Января 2011 Как работает level.vertex_in_direction? Конкретно алгоритм действия движка. Ссылка на комментарий https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkcijam-i-klassam/page/9/#findComment-556511
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти