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 Ссылка на комментарий
Stalkersof 191 Опубликовано 11 Марта Поделиться Опубликовано 11 Марта Пытаюсь после спавна костюма в рюкзак ГГ переместить его в слот. ОГСР движок. Получаю вылет, что не так то? function upgradeS:spawn_item(spawn_item, dist) -- спавним только в игре if self:check_game() then --self:on_quit() alife():create (spawn_item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) db.actor:move_to_slot(db.actor:object(spawn_item)) --Перемещаем объект в слот end end Скрытый текст [C]: in function 'move_to_slot' ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:367: in function 'spawn_item' ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:419: in function <...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:374> [11.03.25 22:09:13.074] Locals: [11.03.25 22:09:13.074] string (*temporary) : [luabind::detail::class_rep::function_dispatcher] Caught unhandled exception! [11.03.25 22:09:13.074] End [11.03.25 22:09:13.074] Locals: [11.03.25 22:09:13.074] userdata (*temporary) : (game_object): 000002C97146F1D0 [11.03.25 22:09:13.074] nil (*temporary) : [not available] [11.03.25 22:09:13.074] End [11.03.25 22:09:13.074] Locals: [11.03.25 22:09:13.074] Userdata: self [11.03.25 22:09:13.074] userdata self.owner : (CUIGameCustom): 000002C9725967B0 [11.03.25 22:09:13.074] string spawn_item : novice_outfit_aa [11.03.25 22:09:13.074] number dist : 1.000000 [11.03.25 22:09:13.074] End [11.03.25 22:09:13.074] Locals: [11.03.25 22:09:13.074] Userdata: self [11.03.25 22:09:13.074] userdata self.owner : (CUIGameCustom): 000002C9725967B0 [11.03.25 22:09:13.074] nil actor : [not available] [11.03.25 22:09:13.074] nil npc : [not available] [11.03.25 22:09:13.074] userdata outfit : (game_object): 000002C97CC7C9D0 [11.03.25 22:09:13.074] number UPcost : 200.000000 [11.03.25 22:09:13.074] End [11.03.25 22:09:13.074] ********************************************************************************* [11.03.25 22:09:13.074] ******************************************************************************** [11.03.25 22:09:13.074] !![LogStackTrace] Thread: [X-RAY Primary thread] [11.03.25 22:09:13.097] !!stack trace: Freeplay Graphic Mod(FGM) Ссылка на комментарий
Chypakabra 451 Опубликовано 11 Марта Поделиться Опубликовано 11 Марта (изменено) @Stalkersof, попробуй немного по другому: function upgradeS:spawn_item(spawn_item, dist) -- спавним только в игре if self:check_game() then --self:on_quit() local Sobj = alife():create (spawn_item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) if db.actor:object(Sobj) then db.actor:move_to_slot(db.actor:object(Sobj)) --Перемещаем объект в слот else -- тут действие если Sobj не найден!!! end end end Если я в чём-то не прав - вскоре @Купер, меня "поправит", в свойственной ему манере. Изменено 11 Марта пользователем ted.80 Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
Stalkersof 191 Опубликовано 11 Марта Поделиться Опубликовано 11 Марта @ted.80 Не. вылетает. Скрытый текст [C]: in function 'object' ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:367: in function 'spawn_item' ...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:425: in function <...д fgm\fgm_v_1_7_4\gamedata\scripts\ui_upgr_select.script:380> [11.03.25 23:10:23.134] Locals: [11.03.25 23:10:23.134] string (*temporary) : [luabind::detail::class_rep::function_dispatcher] Caught unhandled exception! [11.03.25 23:10:23.134] End [11.03.25 23:10:23.134] Locals: [11.03.25 23:10:23.134] userdata (*temporary) : (game_object): 000002623DF0C060 [11.03.25 23:10:23.134] Userdata: (*temporary) [11.03.25 23:10:23.134] End [11.03.25 23:10:23.134] Locals: [11.03.25 23:10:23.134] Userdata: self [11.03.25 23:10:23.134] userdata self.owner : (CUIGameCustom): 0000026237A52B20 [11.03.25 23:10:23.134] string spawn_item : novice_outfit_aa [11.03.25 23:10:23.134] number dist : 1.000000 [11.03.25 23:10:23.134] Userdata: Sobj [11.03.25 23:10:23.134] End [11.03.25 23:10:23.134] Locals: [11.03.25 23:10:23.134] Userdata: self [11.03.25 23:10:23.134] userdata self.owner : (CUIGameCustom): 0000026237A52B20 [11.03.25 23:10:23.134] nil actor : [not available] [11.03.25 23:10:23.134] nil npc : [not available] [11.03.25 23:10:23.134] userdata outfit : (game_object): 0000026230270A50 [11.03.25 23:10:23.134] number UPcost : 200.000000 [11.03.25 23:10:23.134] End [11.03.25 23:10:23.134] ********************************************************************************* [11.03.25 23:10:23.134] ******************************************************************************** [11.03.25 23:10:23.134] !![LogStackTrace] Thread: [X-RAY Primary thread] [11.03.25 23:10:23.159] !!stack trace: Freeplay Graphic Mod(FGM) Ссылка на комментарий
Stalkersof 191 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта Короче мне ответили на гитхабе ОГСР. Что db.actor:move_to_slot() Принимает не строку а клиентский объект и удалили пост. Вот теперь вопрос как из строки(секции костюма)получить этот самый объект. Попробовал так. function upgradeS:spawn_item(spawn_item, dist) -- спавним только в игре if self:check_game() then alife():create(spawn_item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local s_obj = alife():object( spawn_item ) local c_obj = level.object_by_id(s_obj.id) db.actor:move_to_slot(c_obj) --Перемещаем объект в слот end end Вылет string (*temporary) : attempt to index local 's_obj' (a nil value) Freeplay Graphic Mod(FGM) Ссылка на комментарий
Shkiper2012 35 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof попробуй так: Скрытый текст function upgradeS:spawn_item(spawn_item_sec, dist) -- спавним только в игре if self:check_game() then local s_obj = alife():create(spawn_item_sec, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) if s_obj then local c_obj = level.object_by_id(s_obj.id) if c_obj then db.actor:move_to_slot(c_obj) -- Перемещаем объект в слот end end end end Ещё, у тебя метод называется "spawn_item" и параметр в этом методе называется так же --> upgradeS:spawn_item(spawn_item, dist) В примере выше, изменил параметр на "spawn_item_sec". Рекомендую их как-то различать, чтоб не было двойных толкований. В данном случае это не критично, но в других, может сыграть злую шутку. Адаптация мода "AtmosFear" для мода "Боевая Подготовка" v.2.0.2. Адаптация мода "Магазинное питание" для мода "Боевая Подготовка" v.2.0.2. Ссылка на комментарий
Stalkersof 191 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Shkiper2012 Попробовал и вылета нет и не работает. Да я так тоже пробовал. Короче надо ждать ОГСРовцев может подскажут чего Убрал условие if c_obj then Вылет. nil c_obj : [not available] Freeplay Graphic Mod(FGM) Ссылка на комментарий
Balavnik 149 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof Откуда берёшь скрипт? В огсре по-моему у game_object вообще нет метода move_to_slot. А где зима? Ссылка на комментарий
Stalkersof 191 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 2 минуты назад, Balavnik сказал: @Stalkersof В огсре по-моему у game_object вообще нет метода move_to_slot. Я имел в виду движок ОГСР там есть этот метод. Freeplay Graphic Mod(FGM) Ссылка на комментарий
Balavnik 149 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof Ага, посмотрел в двиг, вижу. В lua_help почему-то не добавлен. Похоже, серверный объект уже существует, а клиентский нет. По-моему клиентский объект создаётся на следующем апдейте после создания серверного. 1 А где зима? Ссылка на комментарий
Stalkersof 191 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 13 минут назад, Balavnik сказал: @Stalkersof По-моему клиентский объект создаётся на следующем апдейте после создания серверного. А что делать? Таймер штоль мутить Freeplay Graphic Mod(FGM) Ссылка на комментарий
Balavnik 149 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof Можешь и таймер. А используешь огсе-сигналы? Там по идее есть установка на следующий апдейт? А где зима? Ссылка на комментарий
Stalkersof 191 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 3 минуты назад, Balavnik сказал: @Stalkersof А используешь огсе-сигналы? Использую, но я пока только научился скрипты к биндеру подключать Freeplay Graphic Mod(FGM) Ссылка на комментарий
Купер 3 099 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof , попробуй разнести события по времени. Выше, в общем, правильно суть озвучили. Ты на одном тике и пытаешься создать объект, и тут же им манипулировать. Что-то наподобие такого: function upgradeS:spawn_item(spawn_item_sec, dist) -- спавним только в игре if self:check_game() then --* создаём объект local s_obj = alife():create(spawn_item_sec, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) if s_obj then --* и вот тут уже пытаемся что-то с ним сделать level.client_spawn_manager():add(s_obj.id, 0, function (id, obj) db.actor:move_to_slot(obj) end) end end end Поиском поищи по форуму level.client_spawn_manager() - что такое и зачем. 1 2 2 Ссылка на комментарий
Stalkersof 191 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта Ну да в этом проблема была. Я через level.add_call() сделал. Ща поставлю там секунду по времени, а то у меня там еще костюм из слота удаляется. В общем спавню костюм в рюкзак, удаляю в слоте, через секунду(можно и меньше перемещаю в пустой слот. Короче таймер. Freeplay Graphic Mod(FGM) Ссылка на комментарий
RayTwitty 532 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 3 часа назад, Stalkersof сказал: Я через level.add_call() сделал. Ща поставлю там секунду по времени Это неверно, тебе нужен асинхронный вызов с условием появления объекта, @Купер уже все правильно написал. Просто отсрочка по времени может не сработать по тем или иным причинам (например в связи с низкой производительностью), да и задержка в секунду явно много - при открытом инвентаре ты буквально будешь наблюдать самопроизвольный "полет" предмета в слот. Вообще, подобного рода вопросы (действия с объектами при выходе в онлайн) уже баян, причем очень давний. 1 2 Ссылка на комментарий
Norman Eisenherz 334 Опубликовано 25 Марта Поделиться Опубликовано 25 Марта (изменено) [ТЧ 1.0006] Задача: привязать субтитры к звуку, который выдается после прибытия NPC в определенную точку и окончания анимации разворота. Пример логики: p2:name = wp02|sig=arrive|syn|s=mil_collect_phrase1 Привязка к флагу switched в [state_mgr.script] state_manager:set_state учитывает только прибытие на точку. Как правильно привязать обработку именно к моменту вывода звука? Spoiler [state_mgr.script] function state_manager:set_state(state_name, callback, timeout, target, emerg, synsound, extrakeys) (+) в конец if switched then if synsound then -- действие end end end Изменено 25 Марта пользователем Norman Eisenherz Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
h0N0r 372 Опубликовано 27 Марта Поделиться Опубликовано 27 Марта @Norman Eisenherz Я бы начал с этого: move_mgr.script, move_mgr:waypoint_callback - блок звук. Правильно понимаю, если в любом скрипте (в его начале, не в теле функции) объявить переменную, типа local my_var = 0 - то она локальна только для данного скрипта и функций в нём, и чтобы сделать её глобальной, нужно убрать local, или ещё перенести в _g.script? https://sites.google.com/view/xray-sdk-0-4-smg Ссылка на комментарий
Norman Eisenherz 334 Опубликовано 27 Марта Поделиться Опубликовано 27 Марта Я с этого начал и пришел к [state_mgr.script]: в waypoint_callback сначала обсчитывается звук, просто привязанный к анимации, потом, с проверкой if pt_chosen_idx, звуки, привязанные к определенным точкам пути с присвоением self.sound_after_anim_start. Дальше update_standing_state(look_pos, snd) и state_mgr.set_state(…, snd). Не могу найти, в какой момент завершается анимация разворота NPC на точке и выполняется запуск назначенного звука, а не просто вычитывание его из памяти. К чему был абзац про глобальные переменные? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 286 Опубликовано 27 Марта Поделиться Опубликовано 27 Марта @Norman Eisenherz посмотри свойство self.mgr.synsound в state_mgr_animation.animation:play_rnd(). Это единственное место использования данного свойства и запуска звука после присвоения его в state_mgr.state_manager:set_state(). Если это действительно оно, тогда, возможно, надо будет подумать над передачей в модуль обработки анимации переменной switched как нового свойства менеджера. 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий
RayTwitty 532 Опубликовано 27 Марта Поделиться Опубликовано 27 Марта 15 часов назад, h0N0r сказал: Правильно понимаю, если в любом скрипте (в его начале, не в теле функции) объявить переменную, типа local my_var = 0 - то она локальна только для данного скрипта и функций в нём, и чтобы сделать её глобальной, нужно убрать local, или ещё перенести в _g.script? my.script local var_A = 5 -- область видимости: только внутри скрипта var_B = 5 -- область видимости: по имени модуля my.var_B (если нужна пустота по умолчанию, явно указываем var_B = nil, иначе не пройдет по синтаксису) _G.var_C = 5 -- область видимости: везде 4 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти