Это популярное сообщение. 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. Проигрывание звуков в игре в произвольном месте, от произвольного объекта, в голове актора. (Shadows) Пост удалён автором (прим. Kirgudu) Скрытый текст Оконные классы Некоторая общая информация о создании окон Список методов, XML-тегов и событий для оконных классов (ТЧ/ЧН/ЗП) (Norman Eisenherz) Представление материала в моих статьях оптимизировано для онлайнового просмотра. Если кому не хочется лазить по спойлерам, а нужно просмотреть текст какого-либо поста "потоком", то могу рекомендовать просмотр в режиме "текстовая версия". В этом же режиме удобно сохранять содержимое темы на диск. (прим. Malandrinus) Изменено 30 Июля пользователем Kirgudu 5 5 16 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 12 Января 2011 Поделиться Опубликовано 12 Января 2011 Подскажите насчёт серверных объектов... Что вызывается чаще - cse_alife_*:update() или cse_alife_*:can_switch_*() ? Ссылка на комментарий
Malandrinus 615 Опубликовано 12 Января 2011 Автор Поделиться Опубликовано 12 Января 2011 Полтергейст, update у серверных классов по-моему вообще не работает. По крайней мере нет ни одного примера их использования. can_switch_* вызывается вроде раз в секунду. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
IQDDD 5 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 и за что этот can_switch отвечает? Ссылка на комментарий
Malandrinus 615 Опубликовано 13 Января 2011 Автор Поделиться Опубликовано 13 Января 2011 За возможность перехода в онлайн/оффлайн. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 По крайней мере нет ни одного примера их использования. Я имею в виду вызов этой функции не из скриптов, а из симуляции... Ссылка на комментарий
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. Удалите вот этот мой пост. Ссылка на комментарий
Malandrinus 615 Опубликовано 13 Января 2011 Автор Поделиться Опубликовано 13 Января 2011 Полтергейст, Я имею в виду вызов этой функции не из скриптов, а из симуляции... Чтобы задавать такой вопрос, надо для начала понимать, что этот метод делает. Вот я не понимаю, что он делает. Из предположений у меня есть две версии: 1. Это эквивалент update биндера, только для серверной стороны. Но тогда это явно не работающий механизм, просто потому, что нереально обновлять немерянное количество серверных объектов. Такой метод есть у всех монстров, сталкеров и аномалий. Даже если и задумывалось когда-то, что все они будут шевелиться в оффлайне, то сейчас такого нет точно. 2. Это может быть информационный метод, который на самом деле возвращает какое-то значение. Какое и зачем - неясно. В пользу этого может говорить отсутствие аргумента. Опять же есть два варианта - надо или не надо его перегружать. Т.е. это чисто внутренняя информация или предоставление скриптёру возможность что-то сказать, наподобие тех же can_switch ? Я пока не знаю ответа на эти вопросы. Т.е. я вообще не знаю, на кой нужен этот метод. Посему вопрос "как часто он вызывается" - для меня просто бессмысленный. У меня ни разу никак не вызвался. Stalk15, Как выполнить метод load, если квест скриптовый? Там же есть в статье пример. Вот он: local new_task = CGameTask() new_task:load("gar_car_graveyard_quest") -- задание "Предложить помощь Бесу" Чего же более? И по поводу примеров вообще. Я с самого начала ещё в первом посте обозначил, что тема для коллективного творчества. Будут постить сюда примеры - будут примеры. Не будут - "извиняйте хлопцы, бананов нема". Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
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 Ссылка на комментарий
Malandrinus 615 Опубликовано 13 Января 2011 Автор Поделиться Опубликовано 13 Января 2011 Stalk15, local task = CGameTask() task:load("teee") --teee - это "пустой" квест из конфигов ... objective = SGameTaskObjective(task,1) ... Почему квест не изчезает после выполнения - непонятно, но зато ратотает=) Ты берёшь из задания-заготовки подзадачу 1. Потом меняешь его и добавляешь в тоже задание. Но выходит, что там остаётся холостая подзадача с номером 1. А у этой подзадачи есть условие окончания? Может в этом причина? Думается мне, новое задание лучше сделать отдельное чистое. Для него то есть дефолтовый конструктор. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Stalk15 27 Опубликовано 13 Января 2011 Поделиться Опубликовано 13 Января 2011 Я скриптаи меняю этот квест: <game_task id="teee"> <objective> <icon>ui_iconsTotal_find_item</icon> </objective> </game_task> Условий нет, но они ведь добавляются в скрипте. А что за дефлотовый конструктор? Квест удалось выполнить, чтоб он изчез из ПДА, только тогда, когда я после выпонения последней подзадачи сменил статус квеста на completed. Если этот квест взять еще раз, то он уже не изчезнет из ПДА ни при каких условиях. Ссылка на комментарий
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 не делает вообще ничего. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
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 Ссылка на комментарий
Garry_Galler 7 Опубликовано 14 Января 2011 Поделиться Опубликовано 14 Января 2011 (изменено) Хотел уточнить: класс CUIStatic действительно не поддерживает вывод анимированных текстур (в формате ogm) ? Попробовал создать экземпляр статика с ogm и вывести на худ (через AddDialogToRender()) свою видеоанимацию - вылетел(ругалась какая то движковая функция связанная с кодеком theora ). Решил попробовать тоже самое сделать с дефолтным ogm - ui\ui_mm_fire (вдруг мое видео нечитабельным было для сталка) - тоже вылетел, правда лог другой был (малоинформативный поэтому не привожу). Насчет CUIStatic я был неправ- он то как раз позволяет использовать анимированные текстуры\видео. Но если вывести их в скриптовое окно проблем нет, то вот на худ - непонятно как - использование AddDialogToRender() приводит к вылету. Изменено 14 Января 2011 пользователем kokkai Ссылка на комментарий
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. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
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 Ссылка на комментарий
Полтергейст 37 Опубликовано 15 Января 2011 Поделиться Опубликовано 15 Января 2011 online_offline_group Разве этот класс вообще используется в ТЧ? Ссылка на комментарий
Malandrinus 615 Опубликовано 15 Января 2011 Автор Поделиться Опубликовано 15 Января 2011 Полтергейст, Разве этот класс вообще используется в ТЧ? скажем так, он там есть. Хотя похоже какой-то недоделанный. В ЗП кстати его update уже что-то делает. Это вроде класс для управления отрядами, но подробностей я не знаю. Добавлено через 8 мин.: Garry_Galler, насчёт видео - это лучше в тему про SDK или в ковырялку. Я этим вообще не занимался никогда. почему игра(компилятор) не видит уже скомпилированный скриптовый файл? Помнится, когда я первый раз узнал про Lua и почитал мануал, то проделал точно такой же эксперимент =) Дело было кажется года так два или три назад. Признаться, до сих точного ответа не знаю. Вероятно, это так из-за компилятора JIT. Это же фактически альтернативная реализация Lua. Там не обязательно должно быть всё как в "настоящем". Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
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 Ссылка на комментарий
Malandrinus 615 Опубликовано 17 Января 2011 Автор Поделиться Опубликовано 17 Января 2011 IQDDD, а при чём здесь справочник? Я смотрел кости с помощью OGF Master. Там модель конвертилась в текстовый формат, и в начале файла шёл список костей. Ещё наверное в SDK можно посмотреть. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
IQDDD 5 Опубликовано 18 Января 2011 Поделиться Опубликовано 18 Января 2011 Как работает level.vertex_in_direction? Конкретно алгоритм действия движка. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти