Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
Malandrinus 615 Опубликовано 8 Мая 2013 Поделиться Опубликовано 8 Мая 2013 @Alex535, а кто сказал, что это скрипт? Все эффекты контролёра внутри движка. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Alex535 1 Опубликовано 9 Мая 2013 Поделиться Опубликовано 9 Мая 2013 @Malandrinus, Ну допустим я хочу изменить эти параметры , они же наверняка где-то прописаны. Так же как и параметры схемы sr_psy_antenna. Ссылка на комментарий
Shredder 49 Опубликовано 9 Мая 2013 Поделиться Опубликовано 9 Мая 2013 Вот и ищи в секции контроллера, все что найдешь - твое, все остальное в движке. Ссылка на комментарий
Alex535 1 Опубликовано 9 Мая 2013 Поделиться Опубликовано 9 Мая 2013 (изменено) @Shredder,В секции контроллёра указывается его иммунитет, параметры хита относительно актёра, модели, конфиги разные, звуки. Сам хит (параметры, эффекты, анимации) расписан где-то... аналогом расписан хит пси-излучения схемы sr_psy_antenna в скрипте sr_psy_antenna.script . Я лишь хочу указать тот же хит в пси-излучении этой схемы, что и при контролёре. Прекрати страдать ерундой. Всего в игре 12 типов урона: burn = 0, shock = 1, strike = 2, wound = 3, radiation = 4, telepatic = 5, chemical_burn = 6, explosion = 7, fire_wound = 8, wound_2 = 9, physic_strike = 10, max = 11 Предпоследние два в конфигах не используются, разве что упоминаются в actor.ltx. О последнем вообще ничего не известно. ColR_iT Изменено 9 Мая 2013 пользователем ColR_iT Ссылка на комментарий
Malandrinus 615 Опубликовано 9 Мая 2013 Поделиться Опубликовано 9 Мая 2013 Alex535, схема пси-антенны не имеет никакого отношения к контролёру. Эффект от антенны достаточно простой: постпроцесс + периодический спавн фантомов. Причём это всё сделано скриптами. Контролёр же управляется целиком и полностью движком, скриптового в нём вообще нет ни строчки. Поведение его и эффекты, связанные с ним, достаточно сложные: проверка видимости актора с его стороны, расстояния до актора, телепатические хиты, постэффекты, звуки, эффекторы камеры. Всего и не скажешь, поскольку оно там внутри, и как работает - до конца не ясно. Посему твоё желание сделать схему радара как у контролёра просто невыполнимо, да и смысла не имеет по большому счёту, поскольку радар - это не контролёр и не может иметь всех его особенностей поведения. Вообще, непонятно, что ты там так заморачиваешься с этим радаром. Все эффекты урона, которые здесь можно придумать - это периодический хит телепатического типа и может быть постпроцесс + эффектор камеры типа опьянения, чтобы изображение качалось и двоилось. Скомбинируй по вкусу, и всех делов. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Alex535 1 Опубликовано 10 Мая 2013 Поделиться Опубликовано 10 Мая 2013 (изменено) @Malandrinus, Хорошо. Значит, у контролёра тип хита -wound, следовательно - надо поставить его в sr_psy_antenna.script, и будет мне счастье. Только не могу понять, какой тип урона использует эта схема? Изменено 10 Мая 2013 пользователем Alex535 Ссылка на комментарий
volazar 151 Опубликовано 10 Мая 2013 Поделиться Опубликовано 10 Мая 2013 (изменено) следовательно - надо поставить его в sr_psy_antenna.script, Зачем его туда подставлять? У пси антенны уже прописан свой урон. Точно такое же влияние на пси здоровье, как и у контролера. Разве что оно постоянное, а не во время атаки. Вспоминайте Янтарь и Радар. Вам остается только заюзать схему sr_psy_antenna! Ну и по нужде прописать вывод всяких постэффектов как описал выше malandrinus. И получится не хуже атаки контролера, если не лучше. ЗЫ: Это хит wound. Подробнее описано в том же самом sr_psy_antenna.script. Изменено 10 Мая 2013 пользователем volazar Ссылка на комментарий
Alex535 1 Опубликовано 10 Мая 2013 Поделиться Опубликовано 10 Мая 2013 (изменено) @volazar, Хорошо, я уловил это, но поменять урон можно точно. У этой схемы урон в виде типа wound . Здоровье отнимается промежутками, у контроллёра - оно отнимается плавно. Получается, надо просто тупо изучить всё содержимое этого скрипта и самостоятельно редактировать параметры урона. Хорошо. Просто поставить хит у пси антенны на telepatic. Изменено 10 Мая 2013 пользователем Alex535 Ссылка на комментарий
mumie 2 Опубликовано 18 Мая 2013 Поделиться Опубликовано 18 Мая 2013 Привет, извиняюсь за глупый вопрос, но как определить динамически позицию, левел и гэйм вертексы заспавненного объекта?А теперь поясню:В инвентаре есть item мы "съедаем" его и он спавниться на позиции ГГ, иак вот как можно с течением времени заспавнить на эти координаты другие объекты? Знаю что можно сделать так: local pos = db.actor:position() local vid = db.actor:level_vertex_id() local gvid = db.actor:game_vertex_id() local obj=alife():create(spawn_item, pos, vid, gvid) obj:position() ...но с obj:level_vertex_id() и obj:game_vertex_id() не срабатывает, и вообще нужно обратиться к координатам заспавненного объекта в другой функции запускающейся таймером. Весь код готов, в этом ничего сложного нет, а вот к динамическим координатам обратиться мозгов не хватает.Заранее спасибо! Ссылка на комментарий
ColR_iT 171 Опубликовано 18 Мая 2013 Поделиться Опубликовано 18 Мая 2013 mumie, не очень ясно что же такое "динамическая позиция", но всё же... В данном случае, функции получения гейм- и левел- вертекса не будут работать, к слову функция определения позиции тоже, т.к. применимы они к онлайновому объекту, а у тебя obj - серверный, именно серверный объект возвращает функция create. Воспользуйся свойствами объекта position, m_game_vertex_id, m_level_vertex_id для получения координат, гейм- и левел-вертексов соответственно. Ссылка на комментарий
*Shoker* 322 Опубликовано 18 Мая 2013 Поделиться Опубликовано 18 Мая 2013 (изменено) Всё работает, просто ты перепутал типы объекта. В игре у почти каждого объекта есть клиентская и серверная часть. Функцией alife():create() ты создаёшь СЕРВЕРНЫЙ объект (а у него свои функции и свойства)А уже в апдейте ты (как один из вариантов) получаешь клиентский объект для которого функции position(), level_vertex_id() и прочие существуют. Собственно в твоём примере надо obj:position() заменить на obj.position Аналогично obj:game_vertex_id() на obj.m_game_vertex_id Откуда я это знаю? Открываешь scripts\lua_help.script Дальше ты должен знать название класса серверного объекта предмета который ты спавнишь (это уже сам как нить найдёшь), но в принципе этим можно пренебречь поскольку функции практически одинаковы для всех объектов. Допустим ты спавнишь сталкера, у него серверный класс это class cse_alife_creature_abstract Ищешь его в lua_help.script local obj=alife():create(spawn_item, pos, vid, gvid) В obj будет хранится именно объект серверного класса. Вообще если посмотришь этот класс то увидишь что функций position() и прочих в нём нету. Однако в замен есть СВОЙСТВА C++ class cse_alife_creature_abstract : cse_alife_dynamic_object_visual { property group; property id; property m_game_vertex_id; property m_level_vertex_id; property m_story_id; property online; property parent_id; property position; property script_version; ...И вот тут ты как раз можешь получить свою позицию. local pos = obj.position Чтобы в дальнейшем не путаться советую серверные объекты обозначать как sobj или типа того, просто чтобы самому была видна разница. Ну а клиентский объект можно получить через функцию local obj = level.object_by_id(<id-объекта>) Почему не сделать так? local sobj = alife():create(spawn_item, pos, vid, gvid) local obj = level.object_by_id(sobj.id) obj:position() Потому что когда ты спавнишь объект, создаётся его серверная часть (sobj) однако клиентской (obj) ещё не существует, она будет создана лишь на следующих апдейтах. PS: Извиняюсь за кривой пост, когда копирую текст он копируется вместе с задним фоном и форматированием. Забыл как выключить это. Изменено 18 Мая 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
toxictrace 1 Опубликовано 19 Мая 2013 Поделиться Опубликовано 19 Мая 2013 Доброго времени суток. Может тут кто-нибудь ответит. Подскажите, плз, есть ли возможность в ЗП вычислить на каком game vertex't лежит level vertex ? Имея только level vertex. (В пределах левела, конечно) Когда умрёшь, увидишь кнопки "О'кей" и "Главное меню"Под ними "Новая" и "Выход" И неактивная "Назад" Ссылка на комментарий
Shredder 49 Опубликовано 19 Мая 2013 Поделиться Опубликовано 19 Мая 2013 На сколько я знаю, только методом перебора: ---- -- Получение ближайшего гейм-вертекса по левел-вертексу function anomalies_manager:get_game_vertex(lv) local lname = level.name() local new_gv = 0 local min_dist = 100000 local pos = level.vertex_position(lv) for a = self.game_vertex_min, self.game_vertex_max do g1 = game_graph():vertex(a):game_point() if g1:distance_to(pos)<min_dist then min_dist = g1:distance_to(pos) new_gv = a end end return new_gv end self.game_vertex_min, self.game_vertex_max соответственно минимальный и максимальный гейм вертексы для текущего уровня. Ссылка на комментарий
АuReN 0 Опубликовано 20 Мая 2013 Поделиться Опубликовано 20 Мая 2013 Всем доброго времни суток. Есть n кол-во кнопок. for id=1,n do btn = CUIButton() btn:SetWindowName("Button_"..id) btn:InitTexture("button_tex_"..id) btn:Init(id*50,id*50,50,50) self:Register(btn) self:AttachChild(btn) self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, self.function, self) end Как определить какая из этих n-ных кнопок была нажата? Ссылка на комментарий
Charsi 440 Опубликовано 20 Мая 2013 Поделиться Опубликовано 20 Мая 2013 АuReN, например так: self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, self:get_callback_by_id(id)) function class_name:get_callback_by_id(btn_id) return function() get_console():execute("load ~~обрабатываем кнопку "..btn_id) end end Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
АuReN 0 Опубликовано 21 Мая 2013 Поделиться Опубликовано 21 Мая 2013 Charsi, Увы такая передача переменных не работает. Ссылка на комментарий
Shredder 49 Опубликовано 21 Мая 2013 Поделиться Опубликовано 21 Мая 2013 self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, loadstring("имя_скрипта.on_db_click('" .. id .. "')")) function on_db_click(id) get_console():execute("load ~~~нажата " .. id) end Ссылка на комментарий
Artos 99 Опубликовано 21 Мая 2013 Поделиться Опубликовано 21 Мая 2013 (изменено) Что-то совсем не в ту сторону заносить советчиков стало... АuReN, по сути у тебя уже все есть и нужно только нормально расписать строку: self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, self.function, self) а точнее саму функцию (self.function), которую вызывает коллбэк при двойном клике по каждой кнопке. Если все хочется одной функцией сделать, то это может быть, например так: self:AddCallback("Button_"..id,ui_events.WINDOW_LBUTTON_DB_CLICK, function() self:OnBtnClick(id) end, self) Ну а уже в этой 'OnBtnClick', которая в том же классе(!), и делай что нужно с получаемым аргументом, соответствующим индексу нажатой кнопки: function MyClass:OnBtnClick(id) news_manager.send_tip( db.actor, "нажата " .. tostring(id) ) end Изменено 21 Мая 2013 пользователем Artos 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Shredder 49 Опубликовано 21 Мая 2013 Поделиться Опубликовано 21 Мая 2013 Да? А ты пробовал? Ничего, что при нажатии на любую кнопку id в функции OnBtnClick(id) будет всегда равен последнему. Т.к. в каждой функции ты оставил ссылку на одну и ту же переменную, значение которой в конце цикла будет равно последнему числу. Поэтому, ещё неизвестно, кого куда занесло... Ссылка на комментарий
Artos 99 Опубликовано 21 Мая 2013 Поделиться Опубликовано 21 Мая 2013 (изменено) Shredder, советую подучить матчасть (в частности о таком понятии как "замыкания", aka "closures") или хотя бы, прежде чем кидаться репликами, самому проверить на практике... Данный код давным давно применяется в моем моде, да и не только в нем. Суть установки коллбэка - НЕ выполнять его в самом цикле, а именно задавать нужную функцию, которая должна сработать при нажатии кнопки (иль ином событии с нею). Т.о. в самом цикле (предполагаю он выполняется в InitControls) регистрируются имена объектов для последующей установки на эти объекты( по их именам) коллбэков. Предложенный выше вариант, для всех кнопок устанавливает единый обработчик, которому передается индекс нажатой кнопки... Что и требуется автору вопроса. Но, и ни что не мешает и каждой кнопке назначить собственный обработчик. В общем думаем головою, а не ... руками. ;-) Изменено 21 Мая 2013 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти