Ответы пользователя по тегу Lua
  • Замена числа N, на число N+1, но только в определенных строках?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Непосредственно перед этой колбасой нужно вставить что-то вроде такого:
    local counter = 46;
    local function CheckCounter()
      counter = counter + 1;
      return counter;
    end

    После этого каждое вхождение "== 47 then" в тексте можно заменить
    на "== CheckCounter() then" обычной массовой заменой.

    Функция сначала возвратит число 47, но при каждом следующем вызове будет возвращать на 1 больше, так что сработает нужный по счёту блок согласно твоей логике.
    Ответ написан
    Комментировать
  • Почему не выводится значение и название локальной переменной?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Всё выводит.
    Перепроверьте здесь: https://rextester.com/l/lua_online_compiler
    Ответ написан
  • Как получить размер объекта userdata?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Никак. Это объект среды. Если среда вам подконтрольна, то в самом объекте и реализуйте функцию типа GetSize(), которую можно будет вызывать из Lua.
    Ответ написан
  • Как отключить авто фокус вебки Logitech через скрипт LUA?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Луа - это просто язык программирования, безотносительно области применения. Если есть его поддержка в камере, это хорошо, хотя мог быть и какой-то другой упрощённый язык.

    Поэтому если есть возможность поменять авто-фокус через Луа, нужно смотреть инструкции к данной камере про тонкую настройку, какой именно функцией это делается. Может быть, там есть богатый API, а может быть и нет. Название такой функции (если она есть) не входит в спецификацию самого Луа, а относится конкретно к данной камере.
    Ответ написан
  • LuaMacros как убрать время нажатия клавиши?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Точно не знаю, как должно быть. У меня нет второй клавиатуры. Нужно пробовать.
    Кое-какую документацию нагуглил, получилось склеить такое:
    lmc_device_set_name('streamdeck','PNP0303')
    lmc_print_devices()
    
    local DOWN = 0
    local UP = 2
    
    lmc_set_handler('streamdeck', function(button, direction)
      if (button == 32) then -- пробел что ли? :)
        local dir = direction == 1 and DOWN or UP
        lmc_send_input(8, 0, dir) -- Backspace
      end
    end
    )

    По идее должно работать, как вы хотите.
    Ответ написан
    5 комментариев
  • Как вводить только числовые значения в lua?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Вот эта функция переводит строку в число, а при невозможности возвращает nil:
    tonumber(str)

    Поэтому ваш код можно изменить примерно так:
    a = io.read(); --строка
    local num = tonumber(a) -- число или nil
    if num ~= nil and num > 0 then
      print(num);
    end

    Ещё вариант:
    a = io.read(); --строка
    local num = tonumber(a) -- число или nil
    if num == nil then --строку невозможно перевести в число
      print("error") --выводим текст ошибки
    elseif num > 0 then --строка перевелась в число, и оно больше нуля
      print(num); --выводим это число
    end
    Ответ написан
    Комментировать
  • Можно ли реализовать то что я хочу на lua в gmod?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Lua - полноценный язык, так что в теории можно реализовать любой алгоритм. При том, это один из самых простых языков. Его изучение занимает крайне мало времени (при переходе с другого языка - около 30 минут). Основную сложность, и в то же время ограничение, составляет api gmod, его и смотрите. Всё, что он позволяет, будет вам доступно. Смотрите документацию.

    Простейших ботов там вроде можно создать. Насчёт мозгов именно через Lua - не уверен. Но если через api есть доступ к отдельным действиям NPC, то можно. Правда, само по себе это не простая тема.

    Локализация - тоже отдельная тема, явно выходящая за рамки lua и даже за рамки gmod api, тем более с озвучкой.

    Вообще, у вас куча амбиций, включая и локализацию, и геймдизайн, и т.д. Думаю, с такими хотелками проще свою игру создать на том же Unity, например. Естественно, в любом случае это будет долго и дорого, но свою игру по крайней мере легче окупить.
    Ответ написан
    Комментировать
  • Как расшифровать luaq?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Лучше начать с другого конца. Не с расширения файла и его содержимого, а с того, кто и зачем его создал, какое приложение. Далее с помощью гугла можно узнать про это приложение больше информации, что у него за файлы там такие и для каких целей. Какая история создания этого приложения. Чем авторы пользовались при разработке. Может это вообще к языку Lua не имеет отношения. А если имеет, то станет ясно, с чего начать "вскрытие" этой каши.

    Ну а если есть доступ к автору, то тогда совсем всё просто - можно спросить автора лично, чем он запаковал свои файлы, и можно даже попросить исходники. Не факт, что даст, но это то, с чего стоит начать. Можно написать не напрямую разработчику, а хотя бы в тех. поддержку.

    Ведь кто угодно и что угодно может назвать *.luaq, и на основании одного лишь расширения и отсутствия текста внутри было бы странно заключать, что конкретно там содержится, и уж тем более чем вскрывать. А больше подсказок в вопросе вы не привели.
    Ответ написан
    Комментировать
  • Как сравнить две таблицы и вывести только те значения, которых нет в первой таблице, но есть во второй?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Очевидно, что нужно перебрать значения в цикле.
    Очевидно, что раз уж мы не можем перебирать отсутствующие значения, то нужно перебирать присутствующие значения, то есть перебираем вторую таблицу.
    Таким образом, переформулируем:
    вывести только те значения, которые есть во второй таблице, но при этом отсутствуют в первой.
    spoiler
    local table1 = { [1] = "q", [2] = "p" }
    local table2 = { [1] = "q", [2] = "p",  [3] = "f"}
    
    for k,v in pairs(table2) do
        if not table1[k] then
            print(v)
        end
    end

    Если же соответствие ключей не учитывается, то решение будет чуть сложнее. Для больших таблиц лучше их переделать под новый формат, в котором ключами будут значения:
    local table1_fixed = { q = true, p = true }
    Далее можно будет проверять присутствие значения в первой таблице по ключу.
    Ответ написан
    Комментировать
  • Есть ли аналог this в lua?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Да.
    self
    Ответ написан
    Комментировать
  • Какие есть графические библиотеки lua?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    voproser45654, Lua не быстрый в плане быстродействия в сравнении с компилируемыми языками. Но да, он быстрый в плане набросать логику, не заморачиваясь с языком программирования. А для игр (помимо концентрации на геймдизайне) есть ещё один плюс - это сразу добавить возможность модификаций.

    Важно понимать, что Lua - встраиваемый язык. Он с самого начала таким был, и таковым остаётся до сих пор. Это значит, что он не самостоятельный. У той же игры будет некое ядро, которое будет являться средой для Lua.

    Графические функции обычно важно как раз-таки оптимизировать в плане быстродействия. А это значит, что библиотека или что-то подобное должно быть на компилируемом языке. Хотя использование этих функций в итоге можно будет "пробросить" в Lua, работать они будут вне его.

    Так что мой ответ: Lua и понятие графической библиотеки - несовместимы.

    В качестве примера могу привести TTS. Хотя, может быть, не самый удачный пример, но всё же. Там на уровне Lua можно работать с коллизиями и лучами в 3D. Однако это так лишь с точки зрения пользователя. На самом деле, конечно же, вызов соответствующих функций переадресуется в движок Unity, и работает именно там, а результат возвращается обратно в Lua. Должен заметить, что получается крайне медленно и не эффективно в целом. Чем больше таких вызовов, тем больше суммарный оверхед. Но пару сотен вызовов в секунду - это не так много.

    В плане скорости работы условно Lua можно считать в 100 раз медленнее С++. Это не заметно, когда расчёт занимает несколько наносекунд. А игровая логика обычно занимает не много. Типа hp==0, значит смерть. Как-то так, если утрировать.
    Ответ написан
    Комментировать
  • Как изменить параметры в love2d?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Почему что-то не работает в программе, нужно выяснять путём отладки.
    Для Lua это функция print()

    Проблема локализуется примерно так:
    1. Пробуем просто вызвать love.graphics.rectangle() с известными параметрами, чтобы убедиться, что с этими параметрами функция в принципе работает и дело не в ней.
    2. Вставляем print(mode, x1, y1, width, height), чтобы убедиться, что а) программа в принципе дошла до этого места, б) параметры именно такие, какие нужно.
    3. Далее в зависимости от увиденного делаем выводы. Ага, если оно вот так, значит давай-ка поставим print() в другое место, чтобы и его проверить.
    4. И т.д.


    Каждый следующий шаг поиска ошибки зависит от предыдущего. А здесь любой отвечающий, не имея доступа ко всему коду и к возможности запустить и проверить, вынужден будет играть в угадайку. А может то, а может это, миллион причин. Может ошибка в программе, а может вообще в каком-нибудь драйвере ОС или не та версия какого-то приложения. И даже если ошибка в программе, там миллион мест, где она может быть.

    Поэтому отладкой своей программы должен заниматься непосредственно сам программист, пишущий код.
    Ответ написан
  • Как удалить непечатаемые символы из строки?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Просто убрать все "нулёвые" символы:
    function zero_padding_remove(data)
      return string.gsub(data, '\0+', '')
    end

    Убирать исключительно в конце строки:
    function zero_padding_remove(data)
      return string.gsub(data, '\0+$', '')
    end
    Ответ написан
    4 комментария
  • Как сделать постепенное увеличение урона за отсутствие N-ово кол-ва здоровья?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Введём доп. величины для удобства изложения:
    local startDamage = damage -- Начальное значение на отрезке
    local endDamage = damage * maxMulty --Конечное значение

    Итак у нас есть startDamage, endDamage и percHP. Нам нужно скалировать значение урона от начального до конечного, в зависимости от процента. Показываю на пальцах, как дойти до формулы самому.
    • Очевидно, что когда percHP==1, мы берём startDamage.
    • Очевидно, что когда percHP==0, мы берём endDamage.
    • Что же брать, если percHP==0.5? Очевидно, среднее арифметическое. То есть (startDamage + endDamage)/2, или что то же самое startDamage/2 + endDamage/2

    И здесь уже виден намёк на то, какой будет формула. На 50% мы берём половину от начального и половину от конечного значения. На 60%, очевидно, надо брать 40% от начального и 60% от конечного.
    Значит, формула такая:
    startDamage * percHP + endDamage * (1 - percHP)
    Можно, конечно, подставить теперь сюда ваши переменные, но не советую этого делать, так как в текущем виде формула максимально проста и понятна.

    В мире программирования функцию линейной интерполяции принято называть lerp, хотя это дело вкуса. Тут важно, что она не связана с хп, а пишется в общем виде (немного адаптировал к данному вопросу):
    local function lerp(start_val, end_val, perc)
      return start_val * perc + end_val * (1 - perc) 
    end

    Если объявили эту функцию, то ниже можно будет писать:
    lerp(damage, damage * maxMulty, percHP)

    Если объявить функцию глобально, то можно будет использовать её в прерываниях в любом месте проекта. Глобально объявляется без слова local:
    function lerp(start_val, end_val, perc)
      return start_val * perc + end_val * (1 - perc) 
    end

    Проверка:
    print(lerp(100,400,0.9)) -- 130
    Ответ написан
    3 комментария
  • Ошибка в конфиге hardline neovim, как решить?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Ошибка говорит о том, что создание "lua chunk" провалилось, потому что вроде как всё шло хорошо, синтаксис распознавался, но внезапно файл закончился, и чего-то не хватает ближе к концу файла. Такое обычно сообщается, когда не совпадает количество скобок (где-то пропущена, либо в конце лишняя).

    Вам поможет любой редактор с подсветкой синтаксиса, который умеет автоматически распознавать блоки (те, что между скобками).
    Ответ написан
    Комментировать
  • Почему при многократном вызове функции нет многократно возвращаемых значений?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    function password(num) ----> фикс
      num = (num or 0) * 5 ----> новая логика разных слов
      local vars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
      local strlengths = string.len(vars)
      print(strlengths)
      local vars1 = ''
      math.randomseed(os.time() + num) ----> фикс
      arrys = {}
      for vars2 in vars:gmatch"." do
        table.insert(arrys, vars2)
      end
      for i = 2, strlengths do
        vars1 = vars1 .. arrys[math.random(2, #arrys)] 
      end	
    return vars1
    end
    
    list={}
    for i=1,10 do
      list[i]=password(i) ----> фикс
    end

    P.S. В саму функцию я не вникал. Если автор вопроса уверен, что она работает хорошо, то и с моими правками будет работать тоже неплохо, во всяком случае для целей получения разных слов. :)
    Ответ написан
    Комментировать
  • Замена JS на Lua?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Lua задумывался, как самый простой язык (но в то же время достаточно мощный).
    Поэтому замену Lua на JS я ещё могу представить, языки во многом похожи, но вот в обратную сторону - нет, из-за высокой запутанности JS.

    Можно попробовать какой-нибудь плагин или библиотеку. Предположу, что её название будет lua.js или что-то подобное. Но зачем Lua? Из-за лени учить новый язык? Ну, такое)
    Ответ написан
    Комментировать
  • Как установить nil переменной в тернарном выражении Lua?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Это не совсем тернарный оператор, а именно комбинация and и or.
    Выражение:
    A and B or C
    аналогично тернарному оператору (которого в Lua нет), только если B истинно.
    (доказательство)

    Для начала вспомним некоторые правила синтаксиса Lua:
    • and возвращает первый операнд, если он ложный, иначе второй.
    • or возвращает первый операнд, если он истинный, иначе второй.
    • and имеет выше приоритет (т.е. выполняется первым).
    • Ложными в Lua являются только false и nil

    Теперь построим таблицу истинности результатов:
    616d9c7ad77a1439930797.png

    Поэтому решение такое:
    local res = ((i ~= k) and 2 or nil)
    Ответ написан
    Комментировать
  • Какой ввести оператор чтобы было если на (число) больше?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Оператор: > (больше).

    И в Lua нет оператора += к сожалению. Этот язык позиционируется, как самый простой, без этих программерских иероглифов, понятных только им.

    В коде будет так:
    local energy = game.Players.LocalPlayer.leaderstats.energy
    local lvl = game.Players.LocalPlayer.leaderstats.lvl
    local country = game.Players.LocalPlayer.leaderstats.country
    while wait(2) do
      if energy.Value > 100 then --если энергии больше 100
        lvl.Value = lvl.Value + 1
      end
    end
    Ответ написан
    Комментировать
  • Не берет во всю длину, как быть?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    \[(\d+)\].+сек.+?(\d?\.?\d+) к?м

    .+ - жадный поиск, хватает всё, что может. А чтобы выражение подошло, допустимо захватить всё, кроме последней цифры.
    Так что самое простое решение - сделать этот захват ленивым.

    UPD: под Lua:
    string.match(str, "%[([0-9]+)%].+сек.-([0-9]?%.?[0-9]+) к?м")
    Ответ написан