Перейти к контенту

Рекомендуемые сообщения

Shadows,

Ну это всё конечно хорошо, но не буду же я начинать новую игру и снова проходить всю сюжетку, чтобы добраться до ЧАЭС и потестить работоспособность функции. Неужели нет более приемлемого способа вызова?

 

ziStam, Спасибо, это полезная информация, может быть пригодится. А на каком языке кстати написан аll.sраwn? Не легче ли раскодировать его и достать всю нужную информацию из исходника?

Изменено пользователем Cyclone
Ссылка на комментарий

Может кому интересно?

 

Когда-то кто-то (и не один) спрашивал, - "Можно ли приостановить выполнение функции?"

Ковырялся в таблице _G СТАЛКЕР-а и наткнулся на поле coroutine и вспомнил тут же про упоминание о coroutine в безымянном файле *.script.

В общем проверил. Можно.

Если кому нужно - обращайтесь, а если это уже было - удалите, плз, пост.

 

Ссылка на комментарий
Habaromaniac, all.spawn это бинарный файл, на сколько я понимаю. Изменено пользователем iDreD
Ссылка на комментарий

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.

Если 'да' - то очевидно стОит подчищать или перенаправлять вопросы/ответы не по теме в соотв.темы, дабы тема не превращалась в свалку.

Или же топик носит общий характер(?), то сорри за вопрос и недопонимание ...

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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 мин.:

Забыл сказать, что на момент остановки можно получать текущие данные, а в момент запуска-продолжения передавать новые для обработки.

Изменено пользователем Gun12
Ссылка на комментарий

Gun12

Хм, тут с наскока не все понятно. Ты, вероятно уже поисследовал и наличие методов для 'coroutine' и аргументы для них. Без понимания этого, почему например именно ' coroutine.status(co) ~= "dead" ', а не нечто иное - сложновато целиком понять алгоритм и вариации его применимости.

Что-то тут есть довольно интересное!

Бум немного подумать/переваривать ... :-)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Вопрос вроде бы простой, но меня чот поставил в тупик, давно с ЧН не работал.

 

Соль в чём - есть эдакое моё 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()

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

*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

Наглядный пример - как из главного меню вызываются окна доп.опций (например в АМК) иль из инвентори тот же спальник (с отказом от 'поспать').

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

"Поисследовал" я это дело уже давно, только почему-то убедил себя в том, раз уж нет ни IО, ни DЕВUG, то и СОRОUTINЕ путь заказан.

Тут получается так, что основная задача уже не сам факт возможности прерывания выполнения функции, а сохранение и восстановление (после загрузки например) текущего состояния и данных.

Хорошо если эти данные простого типа (числа, стринги, булевы значения).

А если данные какого-то объекта (или же сам объект), который на момент работы своей очереди выполнения подпрограммы существовал, потом был удалён? И при загрузке текущего состояния нужны будут либо сам объект, либо его данные?

Короче, подумаю над этим.

Про работу СОRОUTINЕ постараюсь сегодня рассказать подробнее.

Ссылка на комментарий

Создали скриптовый файл в директории 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%

 

 

Как сделать, чтобы этот скрипт постоянно проверялся, как ПЫС-ские? Желательно показать на примере. Заранее спасибо.

Изменено пользователем monk
Ссылка на комментарий

Ты написал логику для рестриктора. Условия в ней постоянно проверяются в пределах отдельно взятого рестриктора.

Ссылка на комментарий

monk

1. Указанный файл - всего лишь конфиг-файл, содержащий строки для формирования скриптовой логики. Не стОит путать/перемешивать 'скриптовые' файлы, т.е. скрипты (*.script), с их конфигами (*.ltx и т.п.).

2. Подобные файлы (как правило) читаются единожды при загрузке игры/объекта и далее уже работает логика, сформированная из подобных конфигов. Делать постоянными проверки этого файла (перечитывать) не имеет смысла (если нет причины).

3. Подобные строки из конфиг-файлов (или аll.sраwn'а) считываются в момент перехода объекта, которому соответствуют, в онлайн, и инициализации общих схем логики. Будучи разобранными (распарсенными) различными схемами - формируют логику объекта.

4. Как указал уже iDreD, данные конфиги будут считаны схемой "sr_idle", если объект, которому прописаны строки относится к рестрикторам. Как и вся подобная логика для объектов игры, она периодически (пере)проверяется не будучи приравненной к nil-значению.

Дать пример, как она проверяется врядли возможно, по-сути это разбор кодов игры и комментарии всего алгоритма функционирования подобной логики. Да и тема скорее уже для иного топика, т.е. по логике объектов (хотя конечно же логика обеспечивается скриптами).

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Хотел я адаптировать к соли "драку в баре" вроде ничего как бы и сложного нет, прописал коды, но видимо не так, что я не туда поставил подскажите если можно.

Сначала так.

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: извините если много написал.

Изменено пользователем Cyclone

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

Ссылка на комментарий

Здравствуйте! Подсоединил к ЗП новую локу, хочу заспавнить туда скриптовый переход, изучение материалов со сталкерина нечего не дало, переход попросту не спавнится, куда бы я его не прописывал. Заранее благодарен!

Legend of Stalker

Ссылка на комментарий

Artos

Вызвать та я могу, а вот закрыть нет :D

Мне нужно чтобы старое окно оставалось фоном поверх нового (делаю ПДА)

 

Это у меня получается сделать, а как нужно закрыть это окно, и вернуть старое в рабочее состояние, у меня что то затык.

Код не привёл, потому что у меня его нет, я просто пробовал варианты наугад. Дело было поздно, поэтому голова особо не варила, щас буду пробовать опять.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Сделал большую и классную сборку модов, стал пробовать и - заметил просто ужасный глюк, помогите - в чём может быть проблема?!

После загрузки игры (даже если сохранение было сделано сразу после старта), Сидорович на половину своего тела уходит под землю.

Ссылка на комментарий

*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' и проблемах с объектом актора.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

 

Писал тогда поздно, поэтому не очень хорошо сформулировал.

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

speczadanie

Твой вопрос из категории "Для кашпировских". Наколбасил всего и вся и кто-то без возможности запустить игру и/или глянуть коды должен найти ошибку? :crazy:

Попробуй глянуть в своей солянке, не используется ли перезапись нет-пакетов для Сидоровича как объекта "сталкер", а не "торговец".

И вообще, смотри туда, где его координаты могли бы быть заменены на некорректные.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...