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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Stalkersof 198 Опубликовано 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: Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502504
Chypakabra 664 Опубликовано 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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502506
Stalkersof 198 Опубликовано 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: Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502507
Stalkersof 198 Опубликовано 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) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502516
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". Рекомендую их как-то различать, чтоб не было двойных толкований. В данном случае это не критично, но в других, может сыграть злую шутку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502519
Stalkersof 198 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Shkiper2012 Попробовал и вылета нет и не работает. Да я так тоже пробовал. Короче надо ждать ОГСРовцев может подскажут чего Убрал условие if c_obj then Вылет. nil c_obj : [not available] Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502521
Balavnik 151 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof Откуда берёшь скрипт? В огсре по-моему у game_object вообще нет метода move_to_slot. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502524
Stalkersof 198 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 2 минуты назад, Balavnik сказал: @Stalkersof В огсре по-моему у game_object вообще нет метода move_to_slot. Я имел в виду движок ОГСР там есть этот метод. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502526
Balavnik 151 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof Ага, посмотрел в двиг, вижу. В lua_help почему-то не добавлен. Похоже, серверный объект уже существует, а клиентский нет. По-моему клиентский объект создаётся на следующем апдейте после создания серверного. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502527
Stalkersof 198 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 13 минут назад, Balavnik сказал: @Stalkersof По-моему клиентский объект создаётся на следующем апдейте после создания серверного. А что делать? Таймер штоль мутить Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502529
Balavnik 151 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта @Stalkersof Можешь и таймер. А используешь огсе-сигналы? Там по идее есть установка на следующий апдейт? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502530
Stalkersof 198 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 3 минуты назад, Balavnik сказал: @Stalkersof А используешь огсе-сигналы? Использую, но я пока только научился скрипты к биндеру подключать Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502531
Купер 3 327 Опубликовано 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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502534
Stalkersof 198 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта Ну да в этом проблема была. Я через level.add_call() сделал. Ща поставлю там секунду по времени, а то у меня там еще костюм из слота удаляется. В общем спавню костюм в рюкзак, удаляю в слоте, через секунду(можно и меньше перемещаю в пустой слот. Короче таймер. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502537
RayTwitty 562 Опубликовано 12 Марта Поделиться Опубликовано 12 Марта 3 часа назад, Stalkersof сказал: Я через level.add_call() сделал. Ща поставлю там секунду по времени Это неверно, тебе нужен асинхронный вызов с условием появления объекта, @Купер уже все правильно написал. Просто отсрочка по времени может не сработать по тем или иным причинам (например в связи с низкой производительностью), да и задержка в секунду явно много - при открытом инвентаре ты буквально будешь наблюдать самопроизвольный "полет" предмета в слот. Вообще, подобного рода вопросы (действия с объектами при выходе в онлайн) уже баян, причем очень давний. 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1502554
Norman Eisenherz 354 Опубликовано 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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1503388
h0N0r 382 Опубликовано 27 Марта Поделиться Опубликовано 27 Марта @Norman Eisenherz Я бы начал с этого: move_mgr.script, move_mgr:waypoint_callback - блок звук. Правильно понимаю, если в любом скрипте (в его начале, не в теле функции) объявить переменную, типа local my_var = 0 - то она локальна только для данного скрипта и функций в нём, и чтобы сделать её глобальной, нужно убрать local, или ещё перенести в _g.script? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1503444
Norman Eisenherz 354 Опубликовано 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 на точке и выполняется запуск назначенного звука, а не просто вычитывание его из памяти. К чему был абзац про глобальные переменные? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1503474
Kirgudu 1 324 Опубликовано 27 Марта Поделиться Опубликовано 27 Марта @Norman Eisenherz посмотри свойство self.mgr.synsound в state_mgr_animation.animation:play_rnd(). Это единственное место использования данного свойства и запуска звука после присвоения его в state_mgr.state_manager:set_state(). Если это действительно оно, тогда, возможно, надо будет подумать над передачей в модуль обработки анимации переменной switched как нового свойства менеджера. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1503492
RayTwitty 562 Опубликовано 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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/635/#findComment-1503497
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти