Dennis_Chikin 3 665 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка Lua:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106 Руководство «Программирование на языке Lua», третье издание:http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308 Изменено 2 Марта 2015 пользователем Kirgudu Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-905371
Malandrinus 615 Опубликовано 4 Февраля 2016 Автор Поделиться Опубликовано 4 Февраля 2016 (изменено) @Graff46, ты не можешь читать бинарный файл функциями для текстового. Если ты хочешь искать фрагменты текста в бинарном файле, то тебе нужно бинарное же посимвольное чтение и собственная реализация функций поиска текста. Короче, тебе нужно читать файл средствами самого сталкира. класс reader тебе в помощь. Изменено 4 Февраля 2016 пользователем Malandrinus Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991959
Graff46 621 Опубликовано 4 Февраля 2016 Поделиться Опубликовано 4 Февраля 2016 (изменено) @Malandrinus, Файл в котором я работаю это сейв ТЧ, Если его открыть текстовым процессором, то можно увидеть как некоторые ресурсы (части логики, инфопоршни, переменные из пстор и т.д.) хранятся "прямым текстом", вот я и решил, что читать файл как текстовой. Изменено 4 Февраля 2016 пользователем Graff46 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991960
User_X.A.R26 261 Опубликовано 4 Февраля 2016 Поделиться Опубликовано 4 Февраля 2016 Файл в котором я работаю это сейв ТЧ Пожалуй ты его успешно теми своими экспериментами навернул Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991961
Graff46 621 Опубликовано 4 Февраля 2016 Поделиться Опубликовано 4 Февраля 2016 класс reader тебе в помощь Им можно воспользоваться до загрузки игры? Пожалуй ты его успешно теми своими экспериментами навернул Нет, он загружается нормально, я же файл не изменял, только читал его.reader Это который при загрузке в биндере? Я им не смогу воспользоваться до загрузки игры из гл. меню... Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991962
naxac 2 578 Опубликовано 5 Февраля 2016 Поделиться Опубликовано 5 Февраля 2016 (изменено) @Graff46, local file = getFS():r_open("$game_config$", "savename.sav") local str = file:r_stringZ()Пользоваться можно и до загрузки уровня/алайфа. Изменено 5 Февраля 2016 пользователем naxac Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991965
Graff46 621 Опубликовано 5 Февраля 2016 Поделиться Опубликовано 5 Февраля 2016 (изменено) @User_X.A.R26, @Malandrinus, Ура! получилось! Не понадобились бинарное же посимвольное чтение и собственная реализация функций поиска текста я то хотел уже из хекс редактора шаблоны текста брать, но даже открыв файл как бинарный он сохранил свою "текстовую" структуру. Вот мой код function load_dialog:load_game_internal() local console = get_console() local list = self:GetListWnd("list_window") if list:GetSize()==0 then return end local index = list:GetSelectedItem() if index == -1 then return end local item = list:GetItem(index) local fname = item.fn:GetText() if (alife() == nil) then local file = io.open(getFS():update_path("$app_data_root$", "savedgames\\") .. fname .. ".sav", "rb") get_console():execute(file:read("*a"):match("osen%d")) file:close() console:execute ("disconnect") console:execute ("start server(" .. fname .. "/single/alife/load) client(localhost)") else console:execute ("load " .. fname) end end Сохранение загрузилось, после выхода я вижу в логе ! Unknown command: osen2 Теперь можно делать самому враппер сейвов... local str = file:r_stringZ() Такое не сделать наверно без загрузки уровня? Изменено 5 Февраля 2016 пользователем Graff46 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991966
Graff46 621 Опубликовано 5 Февраля 2016 Поделиться Опубликовано 5 Февраля 2016 Пользоваться можно и до загрузки. я попробовал [error]Arguments : LUA error: ... of fukushima\gamedata\scripts\ui_load_dialog.script:275: attempt to call method 'r_stringZ' (a nil value) stack trace: Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991968
naxac 2 578 Опубликовано 5 Февраля 2016 Поделиться Опубликовано 5 Февраля 2016 @Graff46, на ТЧ работает 100%. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991969
Malandrinus 615 Опубликовано 5 Февраля 2016 Автор Поделиться Опубликовано 5 Февраля 2016 От кого, так от тебя я таких дебильных вопросов точно не ожидал. Или в тех пяти строчках кода что-то непонятно А вот я почему-то не удивлён твоему хамству. Могу только повторить, что твой код не соответствует твоему описанию "значение идет по кругу". Значение в приведённом алгоритме не идёт по кругу, а застревает в минимуме или максимуме. У подобной операции нет названия, а ближе всего по смыслу, как я сказал, получение остатка от деления, с помощью которой и делают обычно хождение по кругу. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-991970
Graff46 621 Опубликовано 5 Февраля 2016 Поделиться Опубликовано 5 Февраля 2016 (изменено) file:r_stringZ() Это методы reader'а? Я не могу найти описание этого класса на нашем форуме и на близлежащих, из луа _хелп ни чего не понял, там только перечислены методы. Если можно, тыкните носом на описание класса reader. Изменено 5 Февраля 2016 пользователем Graff46 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-992028
naxac 2 578 Опубликовано 6 Февраля 2016 Поделиться Опубликовано 6 Февраля 2016 @Graff46, да. Их описания , вернее всего, нигде и нет. Они похожи на методы класса net_packet. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-992137
Malandrinus 615 Опубликовано 7 Февраля 2016 Автор Поделиться Опубликовано 7 Февраля 2016 Забыл вчера дополнить пост примером, где обсуждаемый алгоритм может применяться - плейлист с музыкой - когда номер текущего трека доходит до конца плейлиста, нужно вернуться в начало или конец (если проигрывали в обратном порядке) и начать заново. Ну вот, как я и подозревал. Ты привёл как раз тот самый случай, когда этот алгоритм (на мой взгляд бессмысленный в общем случае) вырождается для строго единичного инкремента. В этом случае сразу после перехода верхней границы идёт переход на начало. Сразу - за счёт единичности инкремента. И в этом случае это в точности соответствует операции, обычно реализуемой с помощью остатка от деления. local low_boundary = 3 local upper_boundary = 7 local current_position = 5 for i=1,20 do print(current_position) current_position = current_position + 1 current_position = low_boundary + math.fmod(current_position - low_boundary, upper_boundary - low_boundary + 1) end Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-992297
Winsor 178 Опубликовано 18 Февраля 2016 Поделиться Опубликовано 18 Февраля 2016 (изменено) Уважаемое сообщество, хотел бы поинтересоваться Вашим мнением по такому вопросу: Все видели, наверное, мод автопаузы, который использует инжектор кода через подмену, например, апдейта актора. Но xray считает по другому, и на такие попытки разместить именно в коде класса функцию он уверенно сообщает, что "RUNTIME ERROR - no static '_update' in class 'actor_binder'". Вот меня и интересует - 1) Отходит ли от стандарта языка такая технология инжектора кода? 2) если язык это поддерживает - в данном случае luabind "не прав" (ибо сообщение о ошибке - выдает именно он)? 3) игнорировать ли мне такое сообщение или переписать код в соответствие со стандартами языка? Благодарю за Ваше мнение! не столь секретен, чтобы ограничиваться лишь туманными намеками - эээ... да никаких секретов... у меня в тексте сообщение так и написано - "мод автопаузы", впервые мне встретился, наверное в НС в каком то репаке. в ооп еще был. мод, который после загрузки добавляет паузу на нажатие любой клавиши (ТЧ). inj.script - там есть такой код, который не нравиться xray 1.0007 local function inj_main(func_name,flag,fn,narg) if not _G.bind_stalker.actor_binder["_"..fn] then _G.bind_stalker.actor_binder["_"..fn] = {} if narg==1 then _G.bind_stalker.actor_binder["_"..fn][1] = _G.bind_stalker.actor_binder[fn] _G.bind_stalker.actor_binder[fn] = function(...) for _,f in pairs (_G.bind_stalker.actor_binder["_"..fn]) do f(...) end end else _G.bind_stalker.actor_binder[fn.."_"] = _G.bind_stalker.actor_binder[fn] or function()end _G.bind_stalker.actor_binder[fn] = function(...) local arg={...} _G.bind_stalker.actor_binder[fn.."_"](...) for _,f in pairs (_G.bind_stalker.actor_binder["_"..fn]) do f(arg[narg]) end end end end _G.bind_stalker.actor_binder["_"..fn][func_name] = loadstring('return _G["'..string.gsub(flag and func_name or "_","%.",'"]["')..'"]')() end function inj_update(func_name,flag) inj_main(func_name,flag,"update",1) end в данном случае вызов в классе актора update подменяется на 2-а вызова , один - сохраненная функция (оригинальный actor_binder.update), второй - функция, переданная как параметр. Вот собственно. если такой подход применяется к функции в модуле - движок не возражает, если к классу - вызывает runtime error, описанная выше. Изменено 18 Февраля 2016 пользователем Winsor Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-994329
naxac 2 578 Опубликовано 18 Февраля 2016 Поделиться Опубликовано 18 Февраля 2016 (изменено) @Winsor, попробуй так: function inj_update(f) _G.actor_update = _G.bind_stalker.actor_binder.update _G.bind_stalker.actor_binder.update = function ( ... ) _G.actor_update(...) f(...) end endГде f - подключаемая функция. Да, и подключать можно только после инициализации класса, иначе изменений не будет. А вообще, ИМХО, метод так себе. Проще - написать нечто на подобии скрипта xr_s из ЗП, и через него подключать-отключать что угодно. Изменено 18 Февраля 2016 пользователем naxac 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-994377
Winsor 178 Опубликовано 18 Февраля 2016 Поделиться Опубликовано 18 Февраля 2016 можно только после инициализации класса Перенеся сохранение функции в модуль - избавился от ошибки. данную подмену необходимо делать после загрузки модуля но до инициализации класса , методы которого пытаемся подменить. Движок создает, например, биндер актора один раз, и любые подмены после вызова __init ни к чему не приводят. Но это частности. Интересовала вообще корректность такого подхода, насколько он оправдан. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-994389
naxac 2 578 Опубликовано 18 Февраля 2016 Поделиться Опубликовано 18 Февраля 2016 Движок создает, например, биндер актора один раз, и любые подмены после вызова __init ни к чему не приводят. Странно. У меня, в частности,с биндером актера, это работало (в ОП-2 такое использовал). Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-994398
Dennis_Chikin 3 665 Опубликовано 18 Февраля 2016 Поделиться Опубликовано 18 Февраля 2016 (изменено) Код странен. Я вообще не понял, что он должен делать. "RUNTIME ERROR - no static '_update' in class 'actor_binder'" - именно так, да. local s = "_" .. fn local binder = _G.bind_stalker.actor_binder local t = binder[s] if not t then t = {} binder[s] = t if narg==1 then t[1] = binder[fn] binder[fn] = function(...) for _,f in pairs ( t ) do f(...) end endbinder[fn] = function(...) - вот это вот что и зачем ?И зачем в цикле пытаться вызвать как функцию единственный элемент какой-то таблицы, который вообще то-ли есть, то-ли нет ? Изменено 18 Февраля 2016 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-994403
Winsor 178 Опубликовано 19 Февраля 2016 Поделиться Опубликовано 19 Февраля 2016 (изменено) что он должен делать - для простоты , все что дальше я буду писать - будет касаться bind_stalker.actor_binder.update. по логике автора - код должен заменить вызов этой функции на функцию автора, без изменения непосредственно кода самого actor_binder с сохранением старого функционала. вот это вот что и зачем - это и есть непосредственно сама замена (fn=="update" ), внутри которой и вызывается свой код + сохраненная версия. по поводу цикла - ничего не скажу. Возможно автор предполагал через дополнительные параметры при первоначальном инжекте добавлять в таблицу t несколько функций, и таким образом их вызывать. в том же скрипте автопаузы есть local function inj_mm_on_kbd(func_name) local name = "ap_mm_on_kbd" _G[name] = _G.ui_main_menu.main_menu.OnKeyboard _G.ui_main_menu.main_menu.OnKeyboard = function(...) local arg={...} if not loadstring('return _G["'..string.gsub(func_name,"%.",'"]["')..'"]')()(arg[1],arg[2],arg[3]) then return _G[name](...) end return true end end тут подмена вызова нажатий клавиш в главном меню. Изменено 19 Февраля 2016 пользователем Winsor Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-994474
naxac 2 578 Опубликовано 7 Марта 2016 Поделиться Опубликовано 7 Марта 2016 (изменено) Привет всем. Подскажите, можно ли через loadstring выполнить функцию, в параметр которой нужно передать строку? У меня получается только с числом. Или, может, как-то иначе можно это сделать: есть функция строкой и параметры разных типов (тоже строками), надо выполнить эту функцию? upd: решил так: function run(func, ...) ... local t = {...} for i,v in ipairs(t) do if tonumber(v) then t[i] = tonumber(v) elseif v == 'true' then t[i] = true elseif v == 'false' then t[i] = false end end return loadstring("return "..func)()(unpack(t)) end Изменено 7 Марта 2016 пользователем naxac Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-998439
Achiever 0 Опубликовано 22 Марта 2016 Поделиться Опубликовано 22 Марта 2016 Народ, кто нибудь в курсе, можно ли ограничить исполнение цикла "repeat" определенной продолжительностью времени. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/55/#findComment-1002314
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти