Dennis_Chikin 3 658 Опубликовано 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 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Desertir 202 Опубликовано 20 Сентября 2014 Поделиться Опубликовано 20 Сентября 2014 @Struck, только непонятно зачем это шаманство с псевдотестами. Условия совершенно разные, да, дело в "скрытом посыле", но к чему тут время? Операции элементарные, некоторое количество тактов процессора и все. В конкретном случае при value = nil условия проходят одинаково. За такие штуки никто никогда не парится. ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Struck 61 Опубликовано 20 Сентября 2014 Поделиться Опубликовано 20 Сентября 2014 @Desertir, я же написал для наглядности, пусть и время будет, разумеется что оно -> 0, но тем не менее возможно автору вопроса и на это нужен был ответ. В конкретном случае при value = nil условия проходят одинаково. Не понял. Ты хочешь еще другие случаи расписать? Удачи Ссылка на комментарий
Barmolini 1 Опубликовано 21 Сентября 2014 Поделиться Опубликовано 21 Сентября 2014 (изменено) Переменные в Lua по умолчанию принимают значение nil. Всё что не false и nil - это true (даже пустая строка). Поэтому явное сравнение с nil, занимает всё же больше времени, нежели банальная подстановка объекта (он либо true, либо false). Но есть мнение, что это не совсем надёжный случай, т.е. проверка if not nil then не всегда срабатывает (у меня такого никогда не было). local val local time = os.clock() for i = 1, 1000000 do if not val then end end print (os.clock() - time) time = os.clock() for i = 1, 1000000 do if val ~= nil then end end print (os.clock() - time) Результат как и предполагалось: 0.046 0.063 Изменено 21 Сентября 2014 пользователем Barmolini Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 21 Сентября 2014 Поделиться Опубликовано 21 Сентября 2014 Если говорить не о языке вообще, а о вполне конкретном сталкере (и конкретном ТЧ) в частности, то if not var then сработает в случае, если var == nil, var == false, а также, ВНИМАНИЕ, var - результат return без аргумента. if var == nil then сработает только тогда, когда var действительно == nil. If var then - любое var кроме случая, описанного в п1. if var == true then - только если var действительно == true. Несколько раз очень забавно нарывался на п1. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Zander_driver 10 333 Опубликовано 23 Сентября 2014 Поделиться Опубликовано 23 Сентября 2014 ВНИМАНИЕ, var - результат return без аргумента. а разве return без аргумента - не то же самое что return nil ? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 23 Сентября 2014 Поделиться Опубликовано 23 Сентября 2014 type() поможет отцам русской демократии. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Charsi 440 Опубликовано 23 Сентября 2014 Поделиться Опубликовано 23 Сентября 2014 "return" без аргумента возвращает 0 значений. "return nil" возвращает одно значение, равное nil. Трактовка возвращаемого значения зависит от конкретного контекста. Пусть будет, например, выше упомянутый type. print(pcall(type,loadstring"return nil"())) --> true nil print(pcall(type,loadstring"return"())) --> false bad argument #1 to '?' (value expected) do local _type = type type = function(arg) return arg and _type(arg) or "nil" end end print(pcall(type,loadstring"return"())) --> true nil 1 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
Nazgool 250 Опубликовано 3 Октября 2014 Поделиться Опубликовано 3 Октября 2014 (изменено) Вроде тут всё уже и сказано, но для новичка, по сути, трудно разобраться. В принципе проверка if "что-то" then - это булева проверка. И это "что-то" расценивается как булево значение. Такой вот простенький вопрос: ..... if not value then.... Для наглядности лучше переформулировать так : if value then.... Это означает следующее, - "Если (if) значение (value) существует, и оно есть истинна (т.е. по правилам Lua не false и не nil), то данная проверка сработает (then). Что значит - "существует" значение? В Lua есть 8 типов значений. Не попадающее ни под одно из них и будет "не существующим". Пример тебе уже показал Charsi - это возврат из функции без аргументов. Но...В lua определено одно из восьми значений (обзывается оно - nil), которое указывает на то, что у некой Lua переменной значение "вроде бы и задано", но его пока нет. Типа разметили территорию, а что тут будем строить - разберёмся позже. Но всё же это уже Lua значение, которое указывает на "не существование" значения. Оно тоже попадает под определение "не существующего" значения. Итак, мы например определились, что Lua значение существует. Т.е. оно (как уже выяснили) реально есть и не nil. Т.е. в контексте проверки if "что-то" then - это уже почти "true". Почему почти? Потому что эта проверка булева. Поэтому остаётся проверить, что "что-то" не является булевым значением "false". Ну а проверки типа if value == "что-то" then.... - это проверки строго на определённый (из 8-ми существующих) тип Lua значений. Т.е. те типы значений, которые сможет определить функция type(var_type) Изменено 3 Октября 2014 пользователем Nazgool Ссылка на комментарий
Zander_driver 10 333 Опубликовано 4 Октября 2014 Поделиться Опубликовано 4 Октября 2014 Вопрос. Какие проблемы могут быть (и будут ли?) если в файлах луа-скрипта присутствует текст кириллицы. не в названиях функций или переменных само собой, а к примеру так: local t = "Текст кириллицей" Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
naxac 2 445 Опубликовано 4 Октября 2014 Поделиться Опубликовано 4 Октября 2014 @Zander_driver, никаких. Строка, она строка и есть, не зависимо от того, какие символы в ней содержатся: кириллица или латиница. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Desertir 202 Опубликовано 4 Октября 2014 Поделиться Опубликовано 4 Октября 2014 (изменено) @naxac, а ты хоть знаешь что такое строка? Проблема может быть с кодировкой, но никто раньше за такое не запаривался, если будут кракозябры - пробуй ставить Юникод или Вин-1251, что-нибудь такое. Главное поставить ту, в которой эта самая кириллица есть, иначе строка побьется. Можно глянуть в xml файлы с русским текстом, где диалоги или описания вещей. Изменено 4 Октября 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Nazgool 250 Опубликовано 4 Октября 2014 Поделиться Опубликовано 4 Октября 2014 @Zander_driver, А как ты хочешь использовать эту строку? Если как идентификатор, то сохрани её в переменной, а потом используй как хочешь : var = 'ключ' _G[var] = 555 Ссылка на комментарий
naxac 2 445 Опубликовано 5 Октября 2014 Поделиться Опубликовано 5 Октября 2014 (изменено) @Desertir, конечно знаю. Про кодировки и отображение текста в игре речи не шло, я написал, что в общем проблем не будет) А так: все скрипты с кириллицей лучше создавать в кодировке windows-1251 Изменено 5 Октября 2014 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Zander_driver 10 333 Опубликовано 8 Октября 2014 Поделиться Опубликовано 8 Октября 2014 @Nazgool, В основном у меня такие вещи для вывода текста на статик. Ну еще бывает с ними перед этим string.format работает. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Solomon753 2 Опубликовано 3 Декабря 2014 Поделиться Опубликовано 3 Декабря 2014 (изменено) Уважаемые форумчане, помогите пожалуйста со скриптом. Привожу упрощенный пример гашения отдачи в шутере. Как сделать, чтобы при отпускании кнопки мыши цикл сразу прерывался? Сейчас дашь небольшую очередь, отпускаешь кнопку, а мышь дёргает пока цикл не закончится. delay = 54 --задержка между выстрелами x,y = 0,50 EnablePrimaryMouseButtonEvents(true); function OnEvent(event, arg) if (event == "MOUSE_BUTTON_PRESSED" and arg == 1) then Sleep(delay) MoveMouseRelative(x,y) Sleep(delay) MoveMouseRelative(x,y) Sleep(delay) MoveMouseRelative(x,y) Sleep(delay) MoveMouseRelative(x,y) Sleep(delay) MoveMouseRelative(x,y) Sleep(delay) MoveMouseRelative(x,y) end end Пробовал вариант: repeat -- Тело if not IsMouseButtonPressed(1) then break end и ему подобные, но либо выдаётся ошибка, либо остановки не происходит. В инете искал информацию, но везде примеры прерывания только с оператором for и введением переменной, как это применить здесь пока не разобрался, удивлён что нет простого решения для игровой мыши. Изменено 3 Декабря 2014 пользователем Solomon753 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 3 Декабря 2014 Поделиться Опубликовано 3 Декабря 2014 @Solomon753, Всем будет гораздо проще, если вы опишете задачу которую пытаетесь решить. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Карлан 1 049 Опубликовано 3 Декабря 2014 Поделиться Опубликовано 3 Декабря 2014 @Solomon753, я конечно не особо въехал че тебе надо, но по догадкам вот так: for i=1,6 do if (event == "MOUSE_BUTTON_PRESSED" and arg == 1) then MoveMouseRelative(x,y) Sleep(delay) else break end Ссылка на комментарий
Desertir 202 Опубликовано 3 Декабря 2014 Поделиться Опубликовано 3 Декабря 2014 (изменено) @Карлан, нет, это совершенно неверно, это возможно работало бы, если переменные event или arg менялись в другом потоке, но это не так. Вопрос действительно поставлен неверно и без необходимых пояснений. Ждем автора. @Solomon753, скорее всего тут тебе не помогут, надо хоть немного знать документацию по твоему случаю. Я бы сделал так, нашел какой нибудь апдейт мышки, сравнивал положение с центром, если различается - сдвигал бы мышь на некоторое постоянное расстояние (ну или для плавности - зависящее от от отклонения, чем меньше осталось до центра, тем меньше значение сдвига). Но так как я не знаю, какими возможностями обладает данный API, возможно этого не получится. А с событием нажатия мышки я так ничего и не понял. Наверное, лучше обратиться на спец форум, если такие в РУнете вообще есть. Изменено 3 Декабря 2014 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Solomon753 2 Опубликовано 3 Декабря 2014 Поделиться Опубликовано 3 Декабря 2014 (изменено) Solomon753, Всем будет гораздо проще, если вы опишете задачу которую пытаетесь решить. У меня ировая мышка Logitech G500, играю в онлайн-шутер, а именно Warface. У всего оружия есть отдача, эту отдачу хорошо убирают макросы для мышек X7 компании A4tech, там прилагается специальное ПО для этого дела, и макросы писать проще. У лоджитека только консоль на Lua, но тоже народ пишет, только в русскоязычном инете очень мало примеров именно для шутеров. Теперь к делу. Макрос нужен чтобы при стрельбе из автоматического оружия, после каждой выпущенной пули центр прицела(экрана) возвращался на исходную позицию, т.е. чтобы команды макроса синхронно с выстрелом тянули мышь в противоположное направление отдачи на расстояние увода прицела. Задержки и координаты подобрать опытным путём не сложно, макрос работает. Только проблема в том, что патронов 30 и если дал очередь из 5 и отжал кнопку макрос не останавливается, а дёргает мышь пока не истечёт время вылета всех 30. Итак задача, чтобы при отжатии левой кнопки мыши мгновенно останавливался цикл компенсации отдачи, а при повторном нажатии начинался сначала. У A4tech подобное прерывание цикла реализовано в ПО, а не в самом макросе, хотелось бы это же реализовать на Lua. На англоязычном форуме лоджитека нашел подобный вопрос, только решение предлагаемое там совершенно мне непонятно и делает цикл неудобным для быстрого редактирования, если оно вообще работоспособно. http://forums.logitech.com/t5/G-series-Gaming-Mice/Help-Regarding-Lua-Mouse-Script-in-LGS/m-p/1331203/highlight/true Вот ещё тщетная попытка остановить цикл с помощью оператора until not , тут он сперва тело завершает, потом по событию останавливается. http://stackoverflow.com/questions/24578998/game-lua-scripting-using-couroutine-or-polling Я так понимаю нужны операторы либо break, либо AbortMacro, как работать с последним не разобрался, мало примеров нашел. Хотелось бы такое решение, чтобы можно было быстро редактировать смещение мыши для каждой итерации. В крайнем случае хоть какое-то решение уже результат. Ещё появилась следующая идейка: создать переменную принимающую при нажатии кнопки значение A, а при отпускании B, как только она принимает значение B цикл прерывается, а по принятию А выполняется тело. Если такое возможно подскажите как это более грамотно прописать в скрипте. Изменено 3 Декабря 2014 пользователем Solomon753 Ссылка на комментарий
RayTwitty 492 Опубликовано 3 Декабря 2014 Поделиться Опубликовано 3 Декабря 2014 (изменено) http://www.amk-team.ru/forum/index.php?showtopic=11584&p=896785 Один я тут цикл не вижу? Попробуй: local delay = 54 -- задержка между выстрелами local x, y = 0, 50 local LEFT_BTN = 1 -- ЛКМ EnablePrimaryMouseButtonEvents(true) -- видимо включение событий function OnEvent(event, arg) if event == "MOUSE_BUTTON_PRESSED" and arg == LEFT_BTN then while IsMouseButtonPressed(LEFT_BTN) do Sleep(delay) MoveMouseRelative(x, y) end end endЕсли я всё правильно наванговал, то должно сработать. Изменено 3 Декабря 2014 пользователем Shadows Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти