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/62/#findComment-905371
Graff46 621 Опубликовано 14 Августа 2018 Поделиться Опубликовано 14 Августа 2018 (изменено) Подскажите почему при построении "башни" из таблиц (без явных ключей) в глубину, "срезать" таблицу на определённом уровне можно так: (не забываем про теорию - в луа переменные содержат ссылки на таблицы, а не копии таблиц!) Скрытый текст local t = {{{{{}}}}} -- 4 вложенных local g = t local tst = t[1][1][1] print(t[1][1][1][1]) -- table: t[1][1] = t[1][1][1] print(t[1][1] == tst, t[1][1][1][1] ) -- true, nil срезалась и "хвост" подтянула! -- А так нельзя print( t[1][1][1][1] ) -- table: local a = t[1][1] local b = t[1][1][1] a = b print( t[1][1][1][1] ) -- table: хвост не подтянут! print( t[1][1] == g[1][1]) -- true -- и срез не произошёл! Проверим ещ переменные: print( a == g[1][1], b == g[1][1], a==b) -- false, false, true print(a == g[1][1][1], b == g[1][1[1]]) -- true, true print(a == t[1][1][1], b == t[1][1[1]]) -- true, true print(t==g) -- true Как можно программно реализовать правильный срез таблицы из "башни", если вложенную таблицу на определённом уровне я получаю циклом: local pred = t while (pred) do pred = pred[1] if pred == t[1][1] then pred = pred[1] -- не работает так. см 2 пример end end Изменено 14 Августа 2018 пользователем Graff46 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1194923
abramcumner 1 229 Опубликовано 14 Августа 2018 Поделиться Опубликовано 14 Августа 2018 4 часа назад, Graff46 сказал: a = b print( t[1][1][1][1] ) -- table: хвост не подтянут! print( t[1][1] == g[1][1]) -- true Сначал ты в a положил t[1][1], потом t[1][1][1]. Почему в t что-то должно было измениться? Если думать в терминах ссылок, то сначала в а положили ссылку на таблицу второго уровня, потом в а положили ссылку на таблицу 3 уровня. Таблица t при этом никак не модифицировалась. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1194947
Graff46 621 Опубликовано 14 Августа 2018 Поделиться Опубликовано 14 Августа 2018 @abramcumner Я думал что я в а положил t[1][1] , потом t[1][1] приравнял к t[1][1][1], но это работает не так. Вот тут товарищ расписал, нужно было всего лишь таблицу уровнем ниже взять и к а приписать индекс. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1194953
Graff46 621 Опубликовано 17 Августа 2018 Поделиться Опубликовано 17 Августа 2018 (изменено) Часто бывают ситуации когда можно приравнять какой-то объект к функции и эта ф-ция будет вызываться при определенных условиях и параметрах, но часто этого мало - хочется несколько ф-ций повесить на 1 объект. Для этой цели я написал 2 реализации. Собственно хочется узнать какой способ более приемлем, я делал тест на множественное выполнение 4 функций (2^20 раз) - по времени результат приблизительно равный. Скрытый текст Ф-ции записываются в таблицы, а таблицы одна в другую, у каждой таблицы в метатаблице указано, что при вызове оной выполнится ф-ция и вложенная таблица и так по цепочке: local noop = function() end local storage = {noop} setmetatable(storage, {__call = function(slf, ...) return slf[1](...) end}) local b = storage function add(f) -- добавить ф-цию в линию выполнения local texe = {noop, f} setmetatable(texe, {__call = function(self, ...) self[2](...); return self[1](...) end}) b[1] = texe b = texe end function find(f_obj) -- поиск ф-ции из линии, если нашлась - возвращает её родительскую таблицу (сама найденная ф-ция 2 элемент в таблице) local stack, prevStack = storage, storage while (type(stack) == "table") do stack = stack[1] if stack[2] == f_obj then return prevStack end prevStack = stack end end -- не громоздкий поиск ф-ции в линии function del(fun) -- удаление ф-ции из линии local a = find(fun) a[1] = a[1][1] end 2-й способ: Скрытый текст local line = {test, test2, test3, test4} local function iniciator(...) for i=1, #line do line[i](...) end end setmetatable(line, {__call = function(slf, ...) return iniciator(...) end}) Специальных ф-ций для получения и удаления ф-ций из таблицы не писал, подразумеваю, что пользователь сам умеет работать с простыми таблицами. Первый способ содержит больше метатаблиц, подключенные ф-ции оборачиваются в талицу со своей метатаблицей и вызовом подключенной ф-ции, вызовом вложенной таблицы. Все хитро и не просто на первый взгляд. Второй способ проще, но там цикл с обходом. Интересно мнение и предложения знающих людей. Изменено 17 Августа 2018 пользователем Graff46 Ошибки исправлял Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1195342
naxac 2 578 Опубликовано 1 Октября 2018 Поделиться Опубликовано 1 Октября 2018 (изменено) Привет. Ребяты, помогите с шаблоном для удаления комментариев из xml. Пробовал так: <!%-%-.+%-%-> Но захватывается всё, начиная с первого и по последний комментарий. Ну, это ожидаемо. А так <!%-%-.-%-%-> Вообще ничего не захватывает, хотя, по идее, должно... upd: вопрос снят, очепятка была Изменено 1 Октября 2018 пользователем naxac Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1203072
Graff46 621 Опубликовано 1 Октября 2018 Поделиться Опубликовано 1 Октября 2018 (изменено) @naxac, использовал бы длл для хмл в луа или скрипт-модуль готовый xml.lua Изменено 1 Октября 2018 пользователем Graff46 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1203267
naxac 2 578 Опубликовано 2 Октября 2018 Поделиться Опубликовано 2 Октября 2018 (изменено) @Graff46, мне своё нравится делать, пусть даже это будет велосипед, который уже тысячу раз изобрели. Изменено 2 Октября 2018 пользователем naxac 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1203371
Norman Eisenherz 354 Опубликовано 3 Марта 2020 Поделиться Опубликовано 3 Марта 2020 Здрасьте. Задача: вызвать несколько функций при чтении нетпакета, составляя их названия из строки "r_" и типа переменной. На выходе должно получиться r_u8(), r_stringZ(), r_float() и т. д. Шаблон, насколько мне известно, такой: namespace["func"](arg1, arg2). Пример вызова функции без привязки к объекту: _G["time" .. "_global"](). Тест: • net_packet["r_u32"]() – вылет "pure virtual function call" (ожидаемо – нет ссылки на нетпакет) • pk:net_packet["r_u32"]() – вылет "attempt to index global 'script_filename' (a nil value)" Каким должен быть синтаксис при таком вызове функций? Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1318934
WinCap 323 Опубликовано 3 Марта 2020 Поделиться Опубликовано 3 Марта 2020 @Norman Eisenherz pk = net_packet() -- Если функция без аргументов pk["имя_функции"](pk) -- Если функция с аргументами a, b, c pk["имя_функции"](pk, a, b, c) 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1318935
Zander_driver 10 348 Опубликовано 19 Ноября 2020 Поделиться Опубликовано 19 Ноября 2020 Не уверен я, куда этот вопрос писать, но попробую сюда. Вопрос про объявление и наследование классов в Lua, c Luabind-ом из OGSR. Скрытый текст Код примерно такой структурно class "A" function A:__init() end function A:__finalize() end *** class "B" (A) function B:__init (...) super() self.params = {...} end *** class "C" (B) function C:__init (...) super(...) end *** class "D" (C) function D:__init (...) super(...) end *** class "E" (D) function E:__init (...) super(...) end *** class "F" (E) function F:__init (...) super(...) end *** // и т.д. function Create() same_object = G_script.G(...) end -- Где '***' - обозначают разные файлы... Возвращает примерно такой лог [19.11.20 15:41:07.174] expected class [B] to derive from or a newline [19.11.20 15:41:07.181] ***************************[ScriptCrashHandler]********************************** [19.11.20 15:41:07.181] stack traceback: [C]: at 0x018000bee4 ....a.l.k.e.r_ogsr\gamedata\scripts\script_B.script:20: in main chunk [C]: in function '__index' ....e.r_ogsr\gamedata\scripts\script_C.script:15: in main chunk [C]: in function '__index' ...a.l.k.e.r_ogsr\gamedata\scripts\script_D.script:15: in main chunk [C]: in function '__index' ....a.l.k.e.r_ogsr\gamedata\scripts\script_E.script:15: in main chunk [C]: in function '__index' ...a.l.k.e.r_ogsr\gamedata\scripts\script_F.script:15: in main chunk [C]: in function '__index' ....a.l.k.e.r_ogsr\gamedata\scripts\script_G.script:15: in main chunk [C]: in function '__index' ....t.a.l.k.e.r_ogsr\gamedata\scripts\subtask.script:270: in function 'Create' Где строка "expected class [ Х ] ... " неизменно указывает на тот класс, который является потомком класса, не имеющего родителей. Т.е. если например я C наследую от A - ругаться лог будет на C. Если же С наследует от B, B наследует от A, а для A я создам новый класс-родитель X. Так что А наследует от X, а X ни от кого - то ругаться будет на A. Разве я не могу наследовать от скриптовых классов? Если сам по себе скриптовый класс (т.е. просто вот это:) class "same" function same:__init() ... end function same:method0() ... end , etc... Исправно работает. Конструкции вроде биндеров class "actor_binder" (object_binder) function actor_binder:__init (obj) super(obj) ... Тоже работают, наследуя от классов, объявленных в движке. object_binder в данном случае. А от скриптового наследовать нельзя? * * * По-копавшись, обнаружил искомое в старом m_netpk.script, артосо-модуль т.е. Там объявлен class "net_base" - не наследующий ни от кого, и от него наследуются другие классы. Т.е. там это работало, хотя модуль не под OGSR создавался. А тут? Что я делаю не так, или что надо делать не так, объявляя наследование классов друг от друга в скриптах под OGSR. Проясните, кто в курсе. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1356767
Norman Eisenherz 354 Опубликовано 21 Марта 2021 Поделиться Опубликовано 21 Марта 2021 Здрасьте. Если this["подстановка"]() позволяет вызвать функцию по строковому имени из текущего скрипта, то для чего нужны конструкции вида this.точное_имя(), если прямой вызов по имени функции и так действует в текущем скрипте? Примеры: ЗП [utils.script] this.vector_copy_by_val() ТЧ [uilts.script] и [xr_talker.script] this.vector_copy_by_val() – две разные функции, но каждая вызывается только в своем скрипте Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1377048
dsh 3 824 Опубликовано 21 Марта 2021 Поделиться Опубликовано 21 Марта 2021 Если ты спрашиваешь, то тебе это сейчас точно не нужно. Когда и если понадобится, ты сразу поймёшь. Мне пару раз нужно было. Если я правильно помню, у меня в скрипте была функция с таким же именем, как и в _g.script, но с другим содержимым конечно. Вот для её вызоваа я и использовал вариант через this. Это если я ничего не перепутал за давностью. Кажется ещё какие-то заморочки были, но я уже не помню. 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1377067
Graff46 621 Опубликовано 28 Мая 2021 Поделиться Опубликовано 28 Мая 2021 (изменено) IDE: ZeroBraine. Lua 5.3 Решил написать ф-цию рандомной выборки из таблицы без повторений на каждом проходе по таблице. В 1 случае я теряю переменную (то ли аргумент, то ли вложенную ф-цию), но если я теряю переменную, то должны быть ошибка или nil. но у меня ф-ция начинает выдавать значения из 2х переменных. Вариант с ошибкой: Скрытый текст math.randomseed(os.time()) function foo (t, desc) local itera = 0 local skip = {} function bar () local val = math.random(1, #t) if itera == #t then skip = {}; itera = 0 end if skip[val] then return bar() else skip[val] = true itera = itera + 1 print(desc..':', t[val]) end end return bar end local t1 = {'red', 'blue', 'green', 'white', 'yellow'} local t2 = {'apple', 'orange', 'cherry', 'potatoes', 'tomato'} local c1 = foo(t1, 'color') local c2 = foo(t2, 'fruits') for i = 1, 20 do c1() if i % 5 == 0 then print('------------------') end end его вывод: Скрытый текст Программа запускается как '"E:\1\lua\ZeroBraneStudio\bin\lua53.exe" -e "io.stdout:setvbuf('no')" "E:\1\lua\ZeroBraneStudio\my\test1.lua"'. Программа 'lua53.exe' запущена в 'E:\1\lua\ZeroBraneStudio\my' (pid: 1816). color: blue color: white color: yellow fruits: apple color: red ------------------ fruits: cherry fruits: potatoes fruits: tomato fruits: orange fruits: cherry ------------------ color: green color: white color: blue color: red fruits: orange ------------------ fruits: apple color: green fruits: tomato color: yellow color: white ------------------ Программа завершена за 0.05 секунд (pid: 1816). Исправленный вариант: Скрытый текст math.randomseed(os.time()) function foo (t, desc) local itera = 0 local skip = {} return function () function bar () local val = math.random(1, #t) if itera == #t then skip = {}; itera = 0 end if skip[val] then return bar() else skip[val] = true itera = itera + 1 print(desc..':', t[val]) end end return bar() end end local t1 = {'red', 'blue', 'green', 'white', 'yellow'} local t2 = {'apple', 'orange', 'cherry', 'potatoes', 'tomato'} local c1 = foo(t1, 'color') local c2 = foo(t2, 'fruits') for i = 1, 20 do c1() if i % 5 == 0 then print('------------------') end end Вывод: Скрытый текст Программа запускается как '"E:\1\lua\ZeroBraneStudio\bin\lua53.exe" -e "io.stdout:setvbuf('no')" "E:\1\lua\ZeroBraneStudio\my\test1.lua"'. Программа 'lua53.exe' запущена в 'E:\1\lua\ZeroBraneStudio\my' (pid: 7496). color: yellow color: blue color: red color: white color: green ------------------ color: yellow color: white color: green color: blue color: red ------------------ color: green color: yellow color: blue color: red color: white ------------------ color: yellow color: white color: blue color: red color: green ------------------ Программа завершена за 0.05 секунд (pid: 7496). Я понимаю, что где то потерял переменные, но где и как? В 1м случае в вывод попали значения из 2-х таблиц, если вызов ф-ции был для одной таблицы? Изменено 28 Мая 2021 пользователем Graff46 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1384856
WinCap 323 Опубликовано 29 Мая 2021 Поделиться Опубликовано 29 Мая 2021 @Graff46, крутой код, ничего не скажешь... 1. А зачем в функции bar() рекурсия? Почему не использовать repeat-until? Представь стек вызовов если в таблице t будет 1000 значений. 2. Обязательно хранить в c1 и c2 замыкание bar() со всеми переменными? Особенно с параметром t, в котором может быть большая таблица. Лучше пересмотреть реализацию в сторону более "простого" кода. Откровенно говоря - не знаю где проблема. Возможно в том, что в первом примере функция bar() именованная. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1384862
Norman Eisenherz 354 Опубликовано 30 Октября 2022 Поделиться Опубликовано 30 Октября 2022 Здрасьте. Задача: показать разницу в работе модификаторов поиска * + - ?. Один пример удалось подобрать так, чтобы результат поиска отличался для всех вариантов, но хочется чего-то более наглядного. Может, кому попадалось более интересное сочетание строки и шаблона? Spoiler local str = "aa1a22a333" local t = {} for x in str:gmatch("a%d#") do t[#t +1] = x end # * a, a1, a22, a333 -- буква и 0+ цифр + a1, a22, a333 -- буква и 1+ цифра - a, a, a, a -- буква и 0+ цифр, короткое совп. ? a, a1, a2, a3 -- буква и 0/1 цифра Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1441374
Личность 0 Опубликовано 10 Мая 2024 Поделиться Опубликовано 10 Мая 2024 Почему нет статьи про анимации? Уже весь сайт перелопатил, но так и не нашел нужной мне статьи. Заметил, что довольно мало информации о работе с анимациями рук гг и неписей. Вообще интересует как можно вызвать определенную анимацию через функцию actor_binder:on_item_take пока только изучаю Lua и потому сложно самому что-то толковое сделать Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1483427
Zander_driver 10 348 Опубликовано 13 Мая 2024 Поделиться Опубликовано 13 Мая 2024 10.05.2024 в 20:02, Личность сказал: Почему нет статьи про анимации? Раньше точно были... Если на пальцах, в сталкере анимация это некая последовательность данных записанная в модель. В современных движках вроде OGSR, есть методы вызова нужной анимации по имени, у определенного объекта. Были ли они в оригинальном движке ТЧ, честно говоря не помню. Если были, то их должно быть возможно найти тут. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1483567
Balavnik 151 Опубликовано 20 Мая 2024 Поделиться Опубликовано 20 Мая 2024 Как сделать срез строки? Допустим, хочу получить символы с 42 по 55 индекс. Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1484032
Kirgudu 1 328 Опубликовано 20 Мая 2024 Поделиться Опубликовано 20 Мая 2024 string.sub(input, 42, 55) Больше о работе со строками: https://lua-users.org/wiki/StringLibraryTutorial Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1484038
RayTwitty 567 Опубликовано 4 Июня 2024 Поделиться Опубликовано 4 Июня 2024 13.05.2024 в 05:48, Zander_driver сказал: Были ли они в оригинальном движке ТЧ, честно говоря не помню. Если были, то их должно быть возможно найти тут. Только для мировой модели объекта - play_cycle. В случае с НПС/монстрами play_cycle практически бесполезен, так как перебивается движком или другими скриптовыми схемами. Подходит по сути только для неживых объектов. Для худа оружия (hud_item) проиграть анимацию на оригинальном движке нельзя. 1 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/11584-yazyk-lua-obschie-voprosy-programmirovaniya/page/62/#findComment-1484733
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти