Это популярное сообщение. 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 Ссылка на комментарий
=VENOM= 50 Опубликовано 30 Января 2011 Поделиться Опубликовано 30 Января 2011 Я так понимаю, float - это числа с плавающей точкой. Ссылка на комментарий
RvP 1 Опубликовано 30 Января 2011 Поделиться Опубликовано 30 Января 2011 TRAMP14, =VENOM=, эта аргументы с которыми ты вызываешь функцию. В данном случае это числа. То что это float было важно для С++, в сткЛуа все числа являются float-ами Vita sine libertate, nihil Vita sine litteris - mors est Ссылка на комментарий
Malandrinus 615 Опубликовано 30 Января 2011 Автор Поделиться Опубликовано 30 Января 2011 RvP, То что это float было важно для С++, в сткЛуа все числа являются float-ами Это в Lua всё одного типа, а при передаче внутрь происходит преобразование в указанный тип C/C++. Т.е. при описании я давал тип аргументов и возвращаемых значений самих движковых функций. Это важно для того, чтобы вы понимали, какой именно природы должны быть аргументы и что именно ожидать в качестве результата функции. Уже говорил, но повторюсь. Из-за того, что функции движковые, но используется из Lua, выходит по-нормальному описание типов не дать. Названия типов и классов в большинстве случаев изменены, поэтому не будет никакого смысла указывать реальный движковый тип, поскольку большинству это ни о чём не скажет и только запутает. Кроме того, не все понятия С/С++ имеют внятный эквивалент в Lua. К примеру ссылки/указатели всяко преобразуются в просто ссылку Lua. Или скажем строковому типу Lua string, в С++ соответствует три разных типа С++ да ещё с вариациями указатель/ссылка, ну и т.д. По этой причине принятый язык описания - это "псевдо C/C++", т.е. нечто в стиле С++, но строго стандарту языка не соответствующее. Для тех же строк для простоты указывается просто тип Lua string без лишних заморок с указателями/ссылками. Это вероятно может запутать или вызывать раздражение у пуристов, но в оригинале в lua_help.script было ещё хуже. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Garry_Galler 7 Опубликовано 31 Января 2011 Поделиться Опубликовано 31 Января 2011 (изменено) Если кто сможет выяснить условия работы этого метода - обязательно отпишитесь здесь Насчет move_to()-метод работает, хотя не со всеми партиклами корректно. Некоторые не перемещал вообще, либо перемещал, но весьма криво - например часть партикла(если это pg) остается на месте - другая движется, либо вместо движения - создается несколько визуальных объектов, которые никуда не движутся. local bPlay = false local iCountUpdate =0 local iPos local iDir local gObj local oPart= particles_object("static\\zharka_static") --// апдейтим function MoveParticle(sid) gObj = sid and level_object_by_sid(sid) or db.actor if not gObj then return end if bPlay then if not iPos then iPos = gObj:position() iDir = gObj:direction() end iCountUpdate=iCountUpdate+1 if iCountUpdate==20 then --// через каждые 20 циклов апдейта меняем направление движения и позицию (на 1 метр) iDir = vector_rotate_y(iDir, math.random (-15, 15)) iPos=iPos:add(iDir:mul(1)) iCountUpdate=0 end --// перемещаем local val = not oPart:playing() and oPart:play_at_pos(iPos) or oPart:move_to(iPos,iPos); --// выключаем else if oPart and oPart:playing() then oPart:stop() iPos=nil iDir=nil end end end --/ вкл/выкл партикл :-) function StartStop() bPlay = not bPlay end Изменено 31 Января 2011 пользователем Garry_Galler Ссылка на комментарий
Полтергейст 37 Опубликовано 13 Февраля 2011 Поделиться Опубликовано 13 Февраля 2011 (изменено) Вызывается ли метод on_unregister() для людей и мутантов после вызова on_death()? Если нет, удаляются ли они движком из раздела "рейтинг" в PDA? И ещё: почему при перегрузке метода on_before_register() его вызов из движка убрали? Т.е. cse_alife_human_stalker.on_before_register(npc) больше не вызывается. Можно ли его вернуть обратно без вылетов? Изменено 13 Февраля 2011 пользователем Полтергейст Ссылка на комментарий
amik 253 Опубликовано 19 Февраля 2011 Поделиться Опубликовано 19 Февраля 2011 Garry_Galler Скажу про партиклы: Тут дело в партикле а не в методе передвижения. Я вчера делал шаровую молнию и привязывал ее к разным anm файлам в СДК ПЕ. Было так как ты и говоришь (пишешь) создается несколько визуальных объектов, которые никуда не движутся Я поступил так, поставил такие параметры: Мах Партицлес 70 Рате 1000 Килл Олд 0,01 Все. Теперь любой скорости хватает чтобы сам партикл "успевал" за перемещением (проба была на тех анм что есть). Так что нужно переделывать сами партиклы... И кстати при таких условиях никак нагрузок на ПК нету. Если повысить Килл олд до 0.1 то будет Пост можно объединить с постом Garry_Galler чтобы без дела не болтался Мой архив Сталкером не занимаюсь. Ссылка на комментарий
strelok200 0 Опубликовано 1 Марта 2011 Поделиться Опубликовано 1 Марта 2011 Есть небольшой вопрос.Только ответьте пожалуйста.Как через скрипт выдать инфопорцию скажем после смерти сталкера? Создаю глобальный мод с новыми локациямЭ Ссылка на комментарий
Полтергейст 37 Опубликовано 1 Марта 2011 Поделиться Опубликовано 1 Марта 2011 Делаем секцию [known_info] в customdata сталкера и в ней (то есть после этой строки) пишем имена выдаваемых инфопоршней. Делается это через all.spawn. Если NPC заспавнен через скрипт, тогда надо через net_packet'ы записывать ему customdata. Как именно - не знаю. Ссылка на комментарий
Malandrinus 615 Опубликовано 1 Марта 2011 Автор Поделиться Опубликовано 1 Марта 2011 strelok200, Как через скрипт выдать инфопорцию скажем после смерти сталкера? Также, как и до смерти. Почитай статью про game_object. Там есть функция для этого. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 2 Марта 2011 Поделиться Опубликовано 2 Марта 2011 Почитай статью про game_object. Там есть функция для этого. А если его в оффлайне замочат или съедят? Ссылка на комментарий
Malandrinus 615 Опубликовано 2 Марта 2011 Автор Поделиться Опубликовано 2 Марта 2011 В оффлайне выдать инфопорцию нельзя, независимо от того, живой непись или нет. Да кстати и убить в оффлайне ещё постараться надо, а движок сам ничем таким не занимается. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 2 Марта 2011 Поделиться Опубликовано 2 Марта 2011 Да кстати и убить в оффлайне ещё постараться надо, а движок сам ничем таким не занимается. Я имел в виду АМК мод - там всё это реализовано, но обработку инфопоршней не видел. В движке (классы cse_alife_human_stalker, cse_alife_monster_*) есть функция on_death, которая вызывается, если существо (сталкер или зверюшка) сыграло в ящик. Можно было бы сделать что-нибудь вот такое: local infotable = {} --' Формат: infotable[npc:name()] = "info_portion" function on_death(killer) cse_alife_human_stalker.on_death(self, killer) if db.actor ~= nil and infotable[self:name()] ~= nil then db.actor:give_info_portion(infotable[self:name()]) end --' Тут можно вставить вызов других функций, например news_main.on_offline_death(self, killer) ... end Короче говоря, сопоставить имени (или другому критерию) объекта инфопоршень и выдавать его когда надо. То же самое можно сделать для on_spawn() - выдавать инфопоршень при появлении объекта. P.S. кстати, пробовал для этих классов перегружать функции health() и alive() - ругается на pure virtual call Ссылка на комментарий
Scarabay 98 Опубликовано 3 Марта 2011 Поделиться Опубликовано 3 Марта 2011 Полтергейст, что тебе мешает сделать выдачу инфопоршня после смерти непися через его логику? За это как раз и отвечает параметр on_death. [logic] active = активная_схема on_death = death [death] on_info = %+инфопоршень% [активная схема] бла-бла-бла Мой YouTube-канал Ссылка на комментарий
Malandrinus 615 Опубликовано 3 Марта 2011 Автор Поделиться Опубликовано 3 Марта 2011 Логика работает только в онлайне, а здесь нужно в оффлайне. Так что не годится. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 3 Марта 2011 Поделиться Опубликовано 3 Марта 2011 (изменено) Сегодня обнаружил, что класса CInfoDocument почему-то нет в lua_help, хотя в xr_game.dll он упоминается. Вот никак не пойму, есть он или нет. То же самое с CAttachableItem, CMedkit, CAntirad, CFoodItem, CBottleItem, CExplosive, CPda и некоторыми другими. Изменено 3 Марта 2011 пользователем Полтергейст Ссылка на комментарий
Malandrinus 615 Опубликовано 3 Марта 2011 Автор Поделиться Опубликовано 3 Марта 2011 Полтергейст, Он есть, просто не экспортирован в скрипты. У негo конфиговое имя сета II_DOC и скриптовое clsid.obj_document. Т.е. создать такой объект можно. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 3 Марта 2011 Поделиться Опубликовано 3 Марта 2011 И ещё такой вопрос: как определить, какой класс можно перегрузить, а какой нет? Вот, к примеру, есть такой сет: "CActor", "se_actor.se_actor", "O_ACTOR", "actor", но он (скрипт) не работает. А если я напишу так "CActor", "se_actor.se_actor", "S_ACTOR", "actor_s" это что-нибудь изменит? Или проблема не жёстко прописаном в движке конфиговом имени класса (O_ACTOR), а в самом классе cse_alife_creature_actor? Ссылка на комментарий
Malandrinus 615 Опубликовано 4 Марта 2011 Автор Поделиться Опубликовано 4 Марта 2011 Полтергейст, ты говоришь о "перегрузить" или о "создать свой сет" ? Это связанные, но всё-таки разные вещи. Перегружать или точнее наследовать можно только от серверных классов. От клиентских производные классы создавать нельзя. Сеты можно создавать как на основе перегруженных серверных, так и на основе базовых движковых (хотя в этом вероятно нет особенного смысла, поскольку такие сеты и так уже имеются). Основным условием возможности создания сета является наличие серверного и клиентского классов. Они должны друг другу строго соответствовать, произвольные сочетания недопустимы. Таким образом для примера с классом актора ситуация следующая. И клиентский и серверный классы в движке как были, так и есть во всех версиях. Серверный (cse_alife_creature_actor) экспортирован в скрипты во всех версиях и унаследовать можно во всех (правда без сета это ничего не даст), а вот клиентский в ТЧ не экспортирован, а в ЧН и ЗП есть. Там где есть, там соответственно можно и сет сделать и уже сделан с именем "S_ACTOR". Большую часть сказанного я кстати рассказывал в статье про object_factory. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Полтергейст 37 Опубликовано 19 Марта 2011 Поделиться Опубликовано 19 Марта 2011 Сегодня обнаружил, что для классов зверюшек и людей нельзя создавать переменную с именем m_smart_terrain_id. Помнится, когда-то я писал про "потерю из вида" движком методов класса se_smart_terrain. Сегодня я снова столкнулся с этой проблемой, но на этот раз разобрался. Оказывается, в классе cse_alife_monster_base есть поле m_smart_terrain_id, но оно не экспортировано. И так получилось, что во время своих эксперементов я создал в классе se_stalker поле с таким же именем. После этого игра не загружалась - вылетала с руганью на отсутствие того или иного метода класса se_smart_terrain. Как только я поменял имя этой переменной на другое - эти вылеты сразу исчезли, всё заработало. Ссылка на комментарий
Malandrinus 615 Опубликовано 20 Марта 2011 Автор Поделиться Опубликовано 20 Марта 2011 (изменено) Полтергейст, Оказывается, в классе cse_alife_monster_base есть поле m_smart_terrain_id, но оно не экспортировано. Это поле есть в классе cse_alife_monster_abstract, который является базовым для всех монстров и людей. Таким образом, это поле есть во всех унаследованных и в том числе в cse_alife_monster_base, который является базовым только для монстров. Конечно не надо пытаться создавать своё поле с таким же именем. Хм. Похоже моё описание в этой теме устарело. Я там написал, что это поле есть начиная с ЧН, но оно есть и в ТЧ, просто не используется и не документировано. Изменено 20 Марта 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти