Habaromaniac 0 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 (изменено) Shadows, Ну это всё конечно хорошо, но не буду же я начинать новую игру и снова проходить всю сюжетку, чтобы добраться до ЧАЭС и потестить работоспособность функции. Неужели нет более приемлемого способа вызова? ziStam, Спасибо, это полезная информация, может быть пригодится. А на каком языке кстати написан аll.sраwn? Не легче ли раскодировать его и достать всю нужную информацию из исходника? Изменено 29 Августа 2011 пользователем Cyclone Ссылка на комментарий
Nazgool 250 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 Может кому интересно? Когда-то кто-то (и не один) спрашивал, - "Можно ли приостановить выполнение функции?" Ковырялся в таблице _G СТАЛКЕР-а и наткнулся на поле coroutine и вспомнил тут же про упоминание о coroutine в безымянном файле *.script. В общем проверил. Можно. Если кому нужно - обращайтесь, а если это уже было - удалите, плз, пост. Ссылка на комментарий
iDreD 5 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 (изменено) Habaromaniac, all.spawn это бинарный файл, на сколько я понимаю. Изменено 29 Августа 2011 пользователем iDreD Работа в Sculptris 3D [туториал] Страничка на Проза.ру Ссылка на комментарий
Artos 99 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 (изменено) Gun12 Хотя и не задавался вопросом "как приостановить выполнение функции", (ИМХО, вопрос достаточно натянут), но получить новую информации по вопросам связанными со скриптами/функциями и пр. - думаю мало кто из читателей топика откажется. :-) Может быть в топике "Справочник по классам и функциям" дашь информацию 'от себя для других' (например по 'coroutine')? Habaromaniac, прежде чем задавать вопросы и делать предположения, все же стОит предварительно почитать 'основы' того вопроса, который тебя волнует, ФАКи, статьи и т.п. Задаватьсяя вопросом 'на каком языке написан аll.sраwn', в топике в которов уже более сотни страниц и десятки постов о рас(за)пакове и использовании ресурсов этого файла - по-меньшей мере говорит о лени читать уже написанное. А по сути твоего начального вопроса: Действительно, самое простое взять уже имеющиеся в 'аll.sраwn' тебе потребные переходы и, если они по какой-то причине (моды разные) удалены из игры, просто их восстановить в нужный момент. Для этого всего лишь нужно распаковать 'аll.sраwn' и узнать индекс (порядковый номер) секции соответствующего перехода и переспавнить его строкою: alife():create(index) --/ спавн объекта по номеру секции из аll.sраwn'а. iDreD, понятие 'бинарный' можно применить к любому файлу (все файлы по сути состоят из некоего бинарного кода), но все же применяют понятие не к файлу, а к формату содержимого файла. Именно к файлу 'аll.sраwn' применимо определение "запакованный файл", который после распаковки превращается в набор обычных текстовых конфиг-файлов и один именно бинарный (section2.bin). (Есть хорошее правило: "Не знаешь или не уверен - не отвечай!") ================================ Господа/товарищи Куратор топика и Модераторы, нельзя ли получить разьяснения относительно направленности топика? Судя по подзаголовку (неплохо бы и его подправить): "Скриптование и спаун, Проблемы из со скриптами, их написанием, разбор и редактирование all.spawn" - топик подразумевает от вопрошающих и отвечающих знание элементарных понятий о скриптах (основы LUA) и all.spawn'a. Если 'да' - то очевидно стОит подчищать или перенаправлять вопросы/ответы не по теме в соотв.темы, дабы тема не превращалась в свалку. Или же топик носит общий характер(?), то сорри за вопрос и недопонимание ... Изменено 29 Августа 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 (изменено) Artos Не знаю, писать ли тутор, или по ходу дела будет видно. Coroutine мало кому известны, поэтому покажу как проверял, а потом уже, наверное, будут вопросы, ответы на которые и введут в курс дела. Хотя не уверен что кому-то понадобиться. Пошел по самому быстрому пути (несчастный bind_stalker ). Решил для наглядности прерывать цикл. В качестве "генератора" вызовов использовал не менее несчастный "update(delta)". Каждые 5 секунд прерывал работу цикла и затем снова продолжал: ..... co = coroutine.create(function (a) for i=1,10 do coroutine.yield(a+i) end end) local ttt = time_global() function actor_binder:update(delta) if time_global() - ttt >= 5000 then if coroutine.status(co) ~= "dead" then local _, result = coroutine.resume(co, 5) if result then news_manager.send_tip(db.actor, result) end end ttt = time_global()+5000 end ..... В результате каждые 5 секунд выводились сообщение 5,6,7,8 ... 15. Прошу заметить, что целью было не осуществление перебора (для этого есть более простые способы). Смысл coroutine в том, что (например) при первом обороте цикл останавливается, и ждёт до тех пор, пока не произойдёт следующий вызов. Игра идёт своим чередом дальше. и вызывать можно хоть отсюда. хоть из другого скрипта - не важно. Важно задать имя подпрограммы (co) глобально, чтобы была возможность последующего вызова из любого скрипта. Добавлено через 40 мин.: Забыл сказать, что на момент остановки можно получать текущие данные, а в момент запуска-продолжения передавать новые для обработки. Изменено 29 Августа 2011 пользователем Gun12 Ссылка на комментарий
Artos 99 Опубликовано 29 Августа 2011 Поделиться Опубликовано 29 Августа 2011 Gun12 Хм, тут с наскока не все понятно. Ты, вероятно уже поисследовал и наличие методов для 'coroutine' и аргументы для них. Без понимания этого, почему например именно ' coroutine.status(co) ~= "dead" ', а не нечто иное - сложновато целиком понять алгоритм и вариации его применимости. Что-то тут есть довольно интересное! Бум немного подумать/переваривать ... :-) "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 30 Августа 2011 Поделиться Опубликовано 30 Августа 2011 (изменено) Вопрос вроде бы простой, но меня чот поставил в тупик, давно с ЧН не работал. Соль в чём - есть эдакое моё UI меню. Из этого меню я вызываю другие менюшки (UI2), которые отображаются поверх старого UI (которое не активно в этот момент, но отображается) Проблема в том, что я забыл как закрыть это UI2 меню и заставить старое реагировать. Чтобы было понятнее, вот код: self.player_dlg = m_pda_player.pda_player_base() self.player_dlg.owner = self self:GetHolder():start_stop_menu(self.player_dlg, true) Это я открываю меню поверх предыдущего. Всё работает отлично. А вот когда дело доходит до закрытия и активации старого меню, я что то не могу понять как это правильно сделать. У меня либо закрываются оба меню (и в главном меню кнопки тоже не активны) либо прочие странности.... В ЗП это было так: открыть поверх self.player_dlg = m_pda_player.pda_player_base() self.player_dlg.owner = self self.player_dlg:FillList() self.player_dlg:ShowDialog(true) закрыть self.owner:ShowDialog(true) self.owner:FillList() self:HideDialog() Изменено 30 Августа 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 30 Августа 2011 Поделиться Опубликовано 30 Августа 2011 (изменено) *Shoker* Привел бы ской код на закрытие окна - было бы проще указать ошибку иль дать решение. Чтобы в ТЧ/ЧН закрыть свое окно и активировать вызвавшее его ('owner', если оно конечно не удалено) обычно достаточно так: self:GetHolder():start_stop_menu(self.owner, true) --/ activate main window self:GetHolder():start_stop_menu(self, true) --/ close slave window self.owner:Show(true) --/ show main window Наглядный пример - как из главного меню вызываются окна доп.опций (например в АМК) иль из инвентори тот же спальник (с отказом от 'поспать'). Изменено 30 Августа 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Nazgool 250 Опубликовано 30 Августа 2011 Поделиться Опубликовано 30 Августа 2011 "Поисследовал" я это дело уже давно, только почему-то убедил себя в том, раз уж нет ни IО, ни DЕВUG, то и СОRОUTINЕ путь заказан. Тут получается так, что основная задача уже не сам факт возможности прерывания выполнения функции, а сохранение и восстановление (после загрузки например) текущего состояния и данных. Хорошо если эти данные простого типа (числа, стринги, булевы значения). А если данные какого-то объекта (или же сам объект), который на момент работы своей очереди выполнения подпрограммы существовал, потом был удалён? И при загрузке текущего состояния нужны будут либо сам объект, либо его данные? Короче, подумаю над этим. Про работу СОRОUTINЕ постараюсь сегодня рассказать подробнее. Ссылка на комментарий
monk 2 846 Опубликовано 30 Августа 2011 Поделиться Опубликовано 30 Августа 2011 (изменено) Создали скриптовый файл в директории configs\scripts\alcohol_logic.ltx Внутри: [logic] active = sr_idle@alcohol [sr_idle@alcohol] on_info = {+vodka_use_1_info -vodka_use_2_info} sr_idle@1 on_info2 = {+vodka_use_1_info +vodka_use_2_info} sr_idle@2 [sr_idle@1] on_game_timer = 6500 | sr_idle@alcohol %-vodka_use_1_info% [sr_idle@2] on_game_timer = 3500 | sr_idle@alcohol %-vodka_use_2_info% Как сделать, чтобы этот скрипт постоянно проверялся, как ПЫС-ские? Желательно показать на примере. Заранее спасибо. Изменено 30 Августа 2011 пользователем monk Ссылка на комментарий
iDreD 5 Опубликовано 30 Августа 2011 Поделиться Опубликовано 30 Августа 2011 Ты написал логику для рестриктора. Условия в ней постоянно проверяются в пределах отдельно взятого рестриктора. Работа в Sculptris 3D [туториал] Страничка на Проза.ру Ссылка на комментарий
Artos 99 Опубликовано 30 Августа 2011 Поделиться Опубликовано 30 Августа 2011 (изменено) monk 1. Указанный файл - всего лишь конфиг-файл, содержащий строки для формирования скриптовой логики. Не стОит путать/перемешивать 'скриптовые' файлы, т.е. скрипты (*.script), с их конфигами (*.ltx и т.п.). 2. Подобные файлы (как правило) читаются единожды при загрузке игры/объекта и далее уже работает логика, сформированная из подобных конфигов. Делать постоянными проверки этого файла (перечитывать) не имеет смысла (если нет причины). 3. Подобные строки из конфиг-файлов (или аll.sраwn'а) считываются в момент перехода объекта, которому соответствуют, в онлайн, и инициализации общих схем логики. Будучи разобранными (распарсенными) различными схемами - формируют логику объекта. 4. Как указал уже iDreD, данные конфиги будут считаны схемой "sr_idle", если объект, которому прописаны строки относится к рестрикторам. Как и вся подобная логика для объектов игры, она периодически (пере)проверяется не будучи приравненной к nil-значению. Дать пример, как она проверяется врядли возможно, по-сути это разбор кодов игры и комментарии всего алгоритма функционирования подобной логики. Да и тема скорее уже для иного топика, т.е. по логике объектов (хотя конечно же логика обеспечивается скриптами). Изменено 30 Августа 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Хемуль36рус 1 789 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 (изменено) Хотел я адаптировать к соли "драку в баре" вроде ничего как бы и сложного нет, прописал коды, но видимо не так, что я не туда поставил подскажите если можно. Сначала так. function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) --game_stats.update_take_item (obj, self.object) local item = obj --AMK UTILS-- amk.on_item_take(obj) amk_utils.actor_item_take(obj) if obj:clsid() == clsid.wpn_ammo then dunin_ammo.on_take(obj) end sak.check_used_item(obj) braad_test.checking_use_item(obj) if xrs_ai then xrs_ai.actor_item_take(obj) end m_bar.take_item(obj) end потом function actor_binder:on_item_drop (obj) babah.li(obj) -- Vergas ogg-player player_ogg.lose_item(obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) m_bar.drop_item(obj) end -- if level.vertex_position(db.actor:level_vertex_id()):distance_to(db.actor:position())>1 then -- amk.mylog("Здесь нет вертексов") -- else -- amk.mylog("Вертекс "..db.actor:level_vertex_id().." "..db.actor:game_vertex_id()) -- end и вот так -- malandrinus --watch_value = 0 -- malandrinus scopeUsed = false function actor_binder:update(delta) -- DEBUG slowdown -- slowdown.update() -- malandrinus -- watch_value = game.time() -- /malandrinus amk.oau_watchdog=200 amk.oau_reason="actor_binder:update" --amk.updateGameTime() amk.oau_watchdog=2001 object_binder.update(self, delta) amk.oau_watchdog=199 в итоге получаю FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: f:\stalker\gamedata\scripts\sak_off_corpses.script:154: attempt to index field 'actor' (a nil value) stack trace: извините если много написал. Изменено 31 Августа 2011 пользователем Cyclone Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g. Ссылка на комментарий
ziStam 1 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 Здравствуйте! Подсоединил к ЗП новую локу, хочу заспавнить туда скриптовый переход, изучение материалов со сталкерина нечего не дало, переход попросту не спавнится, куда бы я его не прописывал. Заранее благодарен! Legend of Stalker Ссылка на комментарий
*Shoker* 322 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 Artos Вызвать та я могу, а вот закрыть нет Мне нужно чтобы старое окно оставалось фоном поверх нового (делаю ПДА) Это у меня получается сделать, а как нужно закрыть это окно, и вернуть старое в рабочее состояние, у меня что то затык. Код не привёл, потому что у меня его нет, я просто пробовал варианты наугад. Дело было поздно, поэтому голова особо не варила, щас буду пробовать опять. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
speczadanie 0 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 Сделал большую и классную сборку модов, стал пробовать и - заметил просто ужасный глюк, помогите - в чём может быть проблема?! После загрузки игры (даже если сохранение было сделано сразу после старта), Сидорович на половину своего тела уходит под землю. Ссылка на комментарий
Artos 99 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 (изменено) *Shoker* Что-то флудом потянуло ... Спрашивал о том "как закрыть" ("... забыл как закрыть это UI2 меню и заставить старое реагировать."), а теперь гутаришь о "как поверх, оставив фоном". И все это без приведения кодов. Неужели не понятно, что если у тебя в твоих кодах что-то не выходит, то довольно бессмысленно приводить примеры других кодов (тебе даже практические примеры из модов даны были). Кода в студию - тогда и возможен предметный разговор. Следует также учесть, что окна КПК (PDA) все же имеют свои особенности, т.к. слишком тесно завязаны на движек. ziStam Выше, уже даны были достаточно подробные материалы/советы по спавну переходов. Ты их прочитал? Не заспавниться переход ("level_changer") не может, если с координатами не перемудрил. Это всего лишь объект игры и спавнитчя не сложнее аптечки. Ну а для того, чтобы переход стал не просто объектом, а действительно переходом и следовало бы прочесть ранее написанное (см. от #2573) и учесть, что работа с нет пакетами в ЗП имеет некоторые отличия от ТЧ. И аналогично словам выше: приводи свои коды, которые не получаются - тогда и можно будет подсказать что упустил или где сделал ошибку. ХЕМУЛЬ36RUS В приведенных тобою отрывках кодов (их неплохо бы под спойлер засовывать!), ошибок нет. Правда, в методе апдейта ( actor_binder:update(delta) ) - следы адаптации вообще отсутствуют ... Ищи ошибки в других местах, возможно в самом 'm_bar'. Ошибка 'sak_off_corpses.script:154: attempt to index field 'actor' (a nil value)' говорит о измененном 'sak_off_corpses.script' и проблемах с объектом актора. Изменено 31 Августа 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 (изменено) Artos Спасибо Cработал такой вариант: Открыть Ui2 поверх другого UI1 self.player_dlg = m_pda_player.pda_player_base() self.player_dlg.owner = self self:GetHolder():start_stop_menu(self.player_dlg, true) Закрыть UI2 self:GetHolder():start_stop_menu(self, true) --/ close slave window ***** ПДА делаю свой скриптовый, не оригинальный. Вопрос был о том, как поверх одного своего UI1 открыть другой такой же UI2 (чтобы старый UI1 был тоже виден, но не реагировал) а потом закрыть этот UI2 Писал тогда поздно, поэтому не очень хорошо сформулировал. Изменено 31 Августа 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 (изменено) speczadanie Твой вопрос из категории "Для кашпировских". Наколбасил всего и вся и кто-то без возможности запустить игру и/или глянуть коды должен найти ошибку? Попробуй глянуть в своей солянке, не используется ли перезапись нет-пакетов для Сидоровича как объекта "сталкер", а не "торговец". И вообще, смотри туда, где его координаты могли бы быть заменены на некорректные. Изменено 31 Августа 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
_Призрак_ 11 Опубликовано 31 Августа 2011 Поделиться Опубликовано 31 Августа 2011 А ПДА для чего? Для ЧН или для билда 3120? Freedom Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти