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

Nazgool

Жители
  • Число публикаций

    618
  • Регистрация

  • Последнее посещение

  • Дней в топе

    1
  • AMKoin

    37 [Подарить AMKoin]

Весь контент пользователя Nazgool

  1. Nazgool

    Скриптование

    Может кому интересно? Когда-то кто-то (и не один) спрашивал, - "Можно ли приостановить выполнение функции?" Ковырялся в таблице _G СТАЛКЕР-а и наткнулся на поле coroutine и вспомнил тут же про упоминание о coroutine в безымянном файле *.script. В общем проверил. Можно. Если кому нужно - обращайтесь, а если это уже было - удалите, плз, пост.
  2. Artos Пусть и углубились. Для людей будет повод задуматься и начать понимать (изучать) то, о чём мы говорим Дальше по сути. Как? добавить копии - не проблема. А вот для чего? Если очень нужно, то можно ПОвыяснять. Единственное что мне не понятно - для чего тебе нужно удалять занесенный в глобальный массив модуль? Но в любом случае интересно и об этом подумать.
  3. Разреши дать "ДО"толковалки, т.к. не могу гарантировать достоверность всей информации, но не могу не дополнить. Информация ниже дана не для "профессионалов", а только в качестве разъяснения. То, что нашёл, излагаю ниже (факты с моими комментариями - "ДО"толковалками и пояснениями): Итак факты : 1. Для таблицы _G (т.е. для глобальной таблицы Lua) в СТАЛКЕР-е существует СВОЯ метатаблица. 2. В этой метатаблице есть только одно поле с ключем __index и значением function 3. У каждого, уже ПОДКЛЮЧЁННОГО!, к игре файла-модуля (*.script) тоже существует своя метаблица с единственным полем __index и значением таблица. Этой таблицей является глобальная таблица Lua _G P.S. Всё далее, конечно, опровержимо, но... (...позволю себе умозаключения) При обращении (например, при вызове "if какой_то_ещё_не_ни_разу_не_запрашиваемый_файл then") в таблице _G происходит поиск поля с ключём "какой_то_ещё_не_ни_разу_не_запрашиваемый_файл". Естественно, не найдя его в себе (таблице _G), происходит обращение к метатаблице таблицы _G. И поскольку в этой метатаблице только одно поле с ключём __index и значением function, происходит вызов этой функции. Проверки показали, что при подобном вызове в глобальной таблице Lua (_G) сразу же появляется поле с ключём "какой_то_ещё_не_ни_разу_не_запрашиваемый_файл" и значением таблица. Т.к. не могу заглянуть в движок, могу только предполагать что эта функция зугружает файл как модуль, устанавливает для неё метатаблицу с индексом на таблицу _G. Короче, промоделировал подобный код в SciTE (Плохо, но зато быстро ) -- Тут вроде как прочитанные данные из 'fsgame.ltx' game_scripts = 'F:\\Games\\S.T.A.L.K.E.R.\\gamedata\\scripts\\' -- типа путь к папке 'scripts' package.path = game_scripts.."?.script" -- это для Lua-интерпритатора(не обр. внимания) -- Далее метатаблица для _G local mt_G = {__index = function(t,k) -- тут вызывается функция local scr_path = game_scripts..k..'.script' -- типа путь к файлу local f = loadfile(scr_path) if f then module(k, package.seeall) -- объявляем файл как модуль и устанавливаем "видимость" (package.seeall) setfenv(f,_M) -- поскольку loadfile "работает" в своём окружении (окружением для неё является _G), то назначим ей окружением загружаемый модуль (т.е. проведём операцию загрузки - содержимого файла в...) новый модуль. f() -- загружаем содержимое файла-модуля setmetatable(_M, {__index = _G}) -- как я уже констатировал факт, для этого модуля устанавливается метатаблица, ссылкой из которой является таблица _G) return require(k) -- ну и возвращаем подключённый модуль как таблицу end end } -- для глобальной таблицы Lua "_G" устанавливается метатаблица 'mt_G' setmetatable(_G, mt_G) Ну и дальше любой вызов вызов ещё несуществующего для игры файла (или ещё_несуществующего_файла.ещё_не_видимой_функции) приводит к запуску "механизма"(на моём скромном примере ) создания этой записи и вызова функции. Ну, например, при загрузке новой игры нет поля с индексом xr_effects. Обратившись : if xr_effects then ... Сначала происходит нечто, описанное сначала моего поста. И если файл-модуль с именем "xr_effects" существует и правильно загрузиться, то ... Дальше что там Вы хотите. Примерно так, ИМХО.
  4. Nazgool

    Скриптование

    Ulman Хотел подробнее?...
  5. КОКС local string1 = "12.00" local string2 = "12.0" local string3 = "12" local string4 = "12.05" local string5 = "12.50" tonumber(string1) --> 12 tonumber(string2) --> 12 tonumber(string3) --> 12 tonumber(string4) --> 12.05 tonumber(string5) --> 12.5
  6. Kirag Разреши и я свои 5 копеек вставлю. В функции find_teg всю эту конструкцию : local open = string.find(str,"<") or 1 local len = string.len(str) local declare_close = string.find(str,">",open+1,true) or len local declare_space = string.find(str," ",open+1,true) or len local declare_slash = string.find(str,"/",open+1,true) or len local name_end = math.min(declare_close, declare_space, declare_slash) -- ближайший к открытию пробел или ">" local teg_name = string.sub(str,open+1,name_end-1) можно заменить на : teg_name = str:match("<%s-(%S+)")
  7. Nazgool

    Скриптование

    draguno Cм. lua_help.script С++ class game_object ... function item_in_slot(number) ...
  8. Nazgool

    Скриптование

    TRAMP14 Использование string.find обязательное условие? Если нет, то можно хотя бы так : local name = mob:section() local val = tbl_part.name if val then spawn(val[1], val[2]) end
  9. Прямо пропорционально. Теоретически - пробуй разделять диалог по две фразы(точнее в тех местах, где необходимо "слушать" собеседника). Первая ГГ, вторая НПС. Диалог закрывается, но перед ним вызывается action, в котором после ожидания проигрывания звука вызывается start_stop_menu (я где-то делал - лень искать, спроси у Garry_Galler-а, он этим серьёзнее занимался) и следующие две фразы...В последней фразе start_stop_menu не вызывается.
  10. Nazgool

    Скриптование

    А кто сказал что rеturn лишний? Может лишнее то, что после него? Всё зависит от того, что именно ты хотел сделать. Но в любом случае метод тыка ("Не хотел ставить, но решил ...") в скриптовнии не проходит. Если уж тебе и захотелось его куда-то присобачить, то необходимо было хоть документацию почитать, чтобы точно знать куда и когда писать.
  11. Nazgool

    Скриптование

    Если не знаешь Lua - изучай. Если не хочешь - верь чекеру. Я его писал с использованием стандартной библиотеки Иерусалимски. Т.е. ошибки не придумывал. Конечно можно предположить что при написании кривые руки были у меня и у автора Lua, но только не у тебя. Так? Если не так и если чекер говорит что после return ... должен стоять end, то может быть так оно и есть? Ну а если возникнет вопрос "Почему?", то см. первую строку этого сообщения.
  12. Nazgool

    Скриптование

    TRAMP14 В принципе всё верно, и хотя в таблице мало полей, я бы всё-таки после функции спавна поставил break : if common == k then alife():create(v, pos, lv, gv, id) break end Ведь если при первом же обороте будет найдено поле, то зачем "крутить" таблицу до конца? Как вариант можно сделать и без pairs. local tbl = {bandit = "medkit", stalker = "antirad", killer = "vodka"} local item = tbl[common] if item then alife():create(item, pos, lv, gv, id) end
  13. Такой вариант действительно рабочий. По одному пути я переправлял всех написей с АТП в лагерь. Но обнаружилась некрасивая вещь. Если во время движения неписей (скажем на пол пути), ГГ выйдет за радиус алайфа и вернётся обратно, то неписи материализуются в начальной точке пути и их движение начинается снова. Так что нужно либо не выходить за этот радиус (что тоже некрасиво), либо разделить путь на несколько условных секций и в точках путей границ этих секций ставить сигналы на переключение в другую логику с путём, начинаюшимся с этой новой точки. По сути сгладить переходы он\оффлайн относитель пути.
  14. Nazgool

    Скриптование

    TRAMP14 Тебе же выше уже объяснили почему не работает. А теперь вот что. Допустим ты без костюма и статик не установлен. (Смотрим в любой из функций) 1. Одеваешь костюм : if item_in_slot ~= nil then -- Истина (костюм уже надет - не равен NIL) ... if cs == nil then -- Истина (статик пока не установлен) hud:AddCustomStatic("okul", true) --установить статик 2. Снимаешь костюм : if item_in_slot ~= nil then -- Ложь (Слот уже пуст - равен NIL) ... end end -- функция отработала, НО ! Костюм уже снят, а кто статик будет удалять? Ну и наконец, даже если бы работало, то всё это получилось достаточно затратно в ресурсах. Можно сделать не только одной функцией, но и оптимизировать. Например :
  15. Nazgool

    Скриптование

    Там много чего есть непонятного. Когда-то написал скрипт (никаких великих целей не ставил, поэтому потратил на него минут ... несколько), которым просмотрел папки config\scripts и config\misk и выбрал название всех секций и все записи, используемые в каждой из секций. До этого я считал, что знаю достаточно о логике :-) All_sections_SoC Правда писал специально для SciTE, поэтому на расширение не обращайте внимания Да и на значения тоже. Мне главнее были ключи.
  16. Nazgool

    Скриптование

    О, вот и хороший пример. Спасибо. Р.S. При вскрытии luа5.1.dll в сообщениях об ошибках используется словосочитание "no value". Что-то не хватило ума его проэмулировать. Теперь могу :-) И не только в движке встречаются "непонятки". Я не раз попадал в подобные ситуации и в "чистом" Luа. Как раз замена значений, например, объявленных локальных переменных на конкретное значение , прекращало серию "непонятных" ошибок. Так что хочу подтвердить - (конечно ситуация ситуации рознь, но...) лучше используйте какое-либо значение.
  17. Если переменная 'соst' определена до этого, то : local tbl = {} tbl[1] = tostring(cost) -- в принципе Luа прекрасно сама преобразовывает числа в строки и наоборот, но от греха подальше пусть лучше будет через tostring function send_msg() local text = "Стоимость "..tbl[1].." руб." -- и т.д... end Только зачем таблицу нужно создавать??? Тебе, я думаю, виднее.
  18. malandrinus патч 1.0004 Чтобы понять какие там числа вообще мелькают, поставил вызов раз в секунду. Сразу после момента загрузки (паузы) показывает ровно 100 постоянно. Дальше работает в среднем в диапазоне 9-22. Иногда некоторое время (порядка 10-15 секунд) идут стабильные показания в различных диапазонах (от 8 до 24) с разбросом 2-3 миллисекунды. При подходе к аномалиям (в половине случаев) падает до диапазона 5-9 При хите от аномалии скачок до 18-24. Похожая ситуация и при заходе в рестриктор. И наконец заметил различные скачки до 35, 41, 74, 85. Довольно редко. Все эти наблюдения субъктивны и стабильностью показаний не отличаются.
  19. Конечно можно. Но при условии, что если кондишн не выполнится, то диалог не зайдёт в тупик. Другими словами, должно быть продолжение диалога из предыдущей фразы, если эта фраза будет "закрыта". max_max_08 Хоть и понимаю как должна работать эта функция, но не было сказано ни это, ни то, что именно работает не так как нужно. Поэтому предложу, как минимум, добавить проверку на хитующего : if (bone_index==14 or ...) and who:id()==db.actor:id() then .....
  20. На счёт слова "ПОКА". Абсолютно не хватает времени для того, чтобы закончить, хотя и есть чем "заполнять". Так же массу времени отнимает оформление. Так что пока слово "пока" останется в силе (намеренная тавтология ). Да и вообще делал в принципе для себя как шпаргалку. Так что есть комментарии, рассуждения и неточности, которые обнаружились уже позже (с опытом так сказать)
  21. andrewrap смерть снайпера проверяется в файле gulag_mil_freedom1.ltx в секции [on_death@mil_freedom_sniper1] выдачей инфопорции +mil_sniper_dead Добавлено через 3 мин.: А затем в xr_effects функция mil_sniper_dead
  22. Vovan0792 у меня нет подобного мода, поэтому оставлю за собой право предполагать, ну и чем богат располагать. Возможно я бы сделал так : Поскольку эта зона может быть рестриктором, то должна находиться в таблице db.zone_by_name. Ну а раз рестрикторы не имеют собственного биндера, а вызываются из апдейта эктора, то нет разницы где располагать проверку, в bind_stalker или bind_restrictor. Если все ругаются на захламление первого, то можно расположить следующее во втором. В начале/конце файла создать таблицу и внести в неё все эти зоны. local tab_name_zones = {"имя_зоны_1", и т.д.} Далее в функции : restrictor_binder:actor_update(delta) перед последним эндом вставить : for k=1,#tab_name_zones do local in_zone = db.zone_by_name[tab_name_zones[k]] local check_in = utils.npc_in_zone(db.actor,in_zone) if check_in then --тут что нужно break end end Ещё раз скажу - это навскидку, я не знаю как построена установка рестрикторов в твоём моде. Пробуй.
  23. andrewrap если не ошибаюсь config\creatures\m_staller.ltx параметр use_single_item_rule поставить в off.
  24. Да, окно диалога. В верхней части отображаются все фразы, там строку можно перевести посредством "\n". А вот в нижней части, где только варианты фраз ГГ, "\n" не переводит строку. Но уже вроде разобрались.
  25. Спасибо. Я тоже нашел. config\ui\talk.xml если кому тоже нужно.
×
×
  • Создать...