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 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 7 Июня 2016 Поделиться Опубликовано 7 Июня 2016 (изменено) Позволю и себе высказать мнение о проверке на nil в примере Kober(BRUC). Считаю что такая проверка абсолютно бесполезна. Ну хорошо. db.actor не nil. Остается 7 типов значений (перечислять не буду) Как это поможет, если db.actor окажется, например, числом? К этому числу будет применен метод position, ну или какой другой. Результат всё равно не изменить. Крах. Тут просто, видимо, разработчики предполагали что при наявности actor-a в таблице db обязательно будет создано поле actor, и его значением обязательно будут данные actor-а. Значит достаточно проверить: есть данные этого поля - есть actor нет данных - нет actor-а Поэтому руководствуясь "пишем в коде то, чего требуем", для этого случая достаточно проверки if db.actor then ... Именно это и требуется - проверка на то, что там есть реальные(не nil, а прицепом и не false) данные. Другое дело, когда очень хочется сравнить с чем-то, то вместо сравнения с nil, гораздо полезнее поставить сравнение с типом "userdata". Так вариантов для прокола станет намного меньше. Изменено 7 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий
dsh 3 824 Опубликовано 7 Июня 2016 Поделиться Опубликовано 7 Июня 2016 Вот вот, именно это я и имел ввиду, только не умею так развернуто излагать свои мысли. в каких случаях нужна проверка на nil Ну, тебе уже показали пример. Я добавлю. Часто я проверку на nil, или подобное значение в других языках, использую, как третье логическое значение. Т.е. я использую ДА, НЕТ и НЕ ЗНАЮ. Вот nil - это и есть это самое НЕ ЗНАЮ. Ну например. Есть у меня функция, которая возвращает, является-ли данный непись врагом. К примеру. Она возвращает true, что означает безусловно враг; false, что означает безусловно не враг; и nil, что означает не знаю, проверяй другими методами. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Nazgool 250 Опубликовано 7 Июня 2016 Поделиться Опубликовано 7 Июня 2016 (изменено) Говорим про nil, а Desertir напомнил про неэквивалентность. Вот я и вспомнил, хотя уже когда-то писал: Запись : function x() return end не эквивалентна : function y() return nil end Вроде бы и одинаковы : print(x()==nil) --> true print(y()==nil) --> true Но : print(select('#', x())) --> 0 print(select('#', y())) --> 1 в первом случае void, во втором nil - как совершенно определенный тип значения Изменено 7 Июня 2016 пользователем Nazgool 1 2 Ссылка на комментарий
Desertir 202 Опубликовано 7 Июня 2016 Поделиться Опубликовано 7 Июня 2016 (изменено) Поэтому руководствуясь "пишем в коде то, чего требуем", для этого случая достаточно проверки if db.actor then ...До этого я сразу высказался, что в том случае это не принципиально, я вообще за демократию.Возможно было бы лучше вообще написать функцию типа isActor, но вспоминая всякие isWeapon и прочая... Короче, языки с динамической типизацией, они такие. в первом случае void, во втором nil - как совершенно определенный тип значенияА вот тут хочу подискутировать. Строго говоря, в обоих случаях используется массив значений, только в первом случае он пустой, а во втором есть один элемент - nil.К этим ребятам можно добавить еще вот это: function z() -- здесь return'а нет endНу а так как имеем дело с Lua, где значение *ПУСТО* описывается только одним nil'ом, то и получаем, что x()==nil; y()==nil; z()==nil. Т.е. я использую ДА, НЕТ и НЕ ЗНАЮОпять же мой *любимый* JavaScript, этот экземпляр подвида скриптовых умеет переваривать значения null и undefined. В нем функции x() и y() отличаются.null типа "в этой переменной когда то будет значение, наверное" а undefined "я в душе не гребу, что это за переменная, и откуда она взялась" Изменено 7 Июня 2016 пользователем Desertir 1 ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Zander_driver 10 335 Опубликовано 8 Июня 2016 Поделиться Опубликовано 8 Июня 2016 Т.е. я использую ДА, НЕТ и НЕ ЗНАЮ. Вот nil - это и есть это самое НЕ ЗНАЮ. Напомнило комичный случай из личной практики когда начинал писать "скриптовый интерфейс" - он был только инвентарем, и ничем больше. Потом туда же добавилось окно обыска - потребовалось указать при создании интерфейса, что же рисовать. Добавил к входным аргументам еще один. Если он ~= nil - рисуем окно обыска. Потом туда же добавилось ПДА. Потребовалось выяснять еще значение этого аргумента. В итоге интерфейс рисуется по принципу: Нарисовать окно обыска? -> Если да (true), рисуем окно обыска -> Если нет (false), рисуем пда -> Если не известно (nil), рисуем инвентарь. Выглядит забавно, переписать более нормально руки не доходят, так и работает а undefined "я в душе не гребу, что это за переменная, и откуда она взялась" И почему я не пишу на JavaScript, он мне уже заочно нравится Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 8 Июня 2016 Поделиться Опубликовано 8 Июня 2016 Добрый день. Есть у меня допустим такой код: function grenage () alife():create("grenade_f1",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) alife():create("grenade_rgd5",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end И таких функций несколько. Только создается разные предметы. Например место гранат аптечки и бинты. Здесь как я понимаю переменная local не подойдет. Так как функций несколько, а local ставится только перед одной функцией(как я понял). В целом я хочу упростить эти функции. Т.е. вместо "db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())" написать так(в начале скрипта): position = db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) Ну, а потом уже функции в которых заместо "db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())" будет писаться просто position. Вот так: position = db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) function grenage() alife():create("grenade_f1",position alife():create("grenade_rgd5",position end function med() alife():create("bandage",position alife():create("medkit",position end Будет ли все это дело работать. И еще на последок. Если я сделаю отдельный скрипт где будут "тонны" этих сокращений, можно ли тогда их вызывать. Если да, то как? Ссылка на комментарий
naxac 2 445 Опубликовано 8 Июня 2016 Поделиться Опубликовано 8 Июня 2016 (изменено) Будет ли все это дело работатьКонечно нет. Одной переменной можно присвоить только одно значение.В твоём случае можно просто написать функцию для спауна предмета в инвентарь актера, и спаунить все через неё: function spawn_item_in_inv(section) return alife():create(section, vector():set(0, 0, 0), 0, 0, 0) endПотом, соответственно: function med() spawn_item_in_inv("bandage") spawn_item_in_inv("medkit") endP.S.: в функции везде нули, т.к. при спавне в инвентарь координаты значения не имеют. Последний ноль - id актера, он всегда равен 0. Изменено 8 Июня 2016 пользователем naxac 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Nazgool 250 Опубликовано 8 Июня 2016 Поделиться Опубликовано 8 Июня 2016 А вот тут хочу подискутировать Да тут и дискутировать особо не о чем. Только теория.Практическое использование подобного не встречал, да и на граблей на этой основе тоже.Это так, из раздела "Занимательная наука" )) Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 19 Июня 2016 Поделиться Опубликовано 19 Июня 2016 Добрый вечер. Потихоньку изучая lua столкнулся с такой проблемой: при вызове этого(не в сталкере): number_tbl = { 1, 2, 3, 4, 5, 6, 7, 8, 9} data = math.random(#number_tbl) print(data) Всегда получается число "8". Мне интересно, почему? Ссылка на комментарий
naxac 2 445 Опубликовано 19 Июня 2016 Поделиться Опубликовано 19 Июня 2016 @Kober(BRUC), вызови выше math.randomseed(os.time()) 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 19 Июня 2016 Поделиться Опубликовано 19 Июня 2016 @naxac, а в сталкере это тоже нужно делать? Ссылка на комментарий
naxac 2 445 Опубликовано 19 Июня 2016 Поделиться Опубликовано 19 Июня 2016 (изменено) @Kober(BRUC), не знаю, но я делаю каждый раз на загрузке, "на всякий случай")) Изменено 19 Июня 2016 пользователем naxac 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 Есть "ужасный" код: random = true say_tbl = { "Текст1", "Текст2", "Текст3", "Текст4", "Текст5", "Текст6", "Текст7", "Текст8", "Текст9", "Текст10"} data = math.randomseed(os.time()) data = math.random(1,10) if random and data == 1 then print(say_tbl[1]) elseif random and data == 2 then print(say_tbl[2]) elseif random and data == 3 then print(say_tbl[3]) elseif random and data == 4 then print(say_tbl[4]) elseif random and data == 5 then print(say_tbl[5]) elseif random and data == 6 then print(say_tbl[6]) elseif random and data == 7 then print(say_tbl[7]) elseif random and data == 8 then print(say_tbl[8]) elseif random and data == 9 then print(say_tbl[9]) elseif random and data == 10 then print(say_tbl[10]) end Хотел сделать его попроще и изменил вот на это: random = true say_tbl = { "Текст1", "Текст2", "Текст3", "Текст4", "Текст5", "Текст6", "Текст7", "Текст8", "Текст9", "Текст10"} data = math.randomseed(os.time()) data = math.random(#say_tbl) if random == true or random == nil then print(data) end Но вот беда. Вместо текста появляются числа от одного до десяти. Как это дело исправить? Ссылка на комментарий
Nazgool 250 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 (изменено) print(say_tbl[data]) И ещё, math.randomseed ничего не возвращает, поэтому записывать в переменную data нечего. Изменено 27 Июня 2016 пользователем Nazgool 1 Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 Добрый день. Есть такой код: language = eng -- ru or eng random_shpare = true -- Шар вкл/выкл say_tbl_ru = { -- Таблица с русскими ответами "да", "нет", "возможно", "не знаю"} say_tbl_eng = { -- Таблица с английскими ответами "Yes", "No", "Possible", "Don't know"} function random_shpare_language() if language == ru then -- Если глобальная переменная language равна ru sphare_ru() -- То вызываем эту функцию elseif language == eng then -- Если глобальная переменная language равна eng sphare_eng() -- То вызываем эту end end data_ru = math.randomseed(os.time()) data_ru = math.random(#say_tbl_ru) data_eng = math.randomseed(os.time()) data_eng = math.random(#say_tbl_eng) function sphare_ru() if random_shpare == true -- Если Шар включен(true) or random_shpare == nil then -- Или равен любому другому значению кроме false print(say_tbl_ru[data_ru]) -- То выводим данный текст end end function sphare_eng() if random_shpare == true -- Если Шар включен(true) or random_shpare == nil then -- Или равен любому другому значению кроме false print(say_tbl_eng[data_eng]) -- То выводим данный текст end end random_shpare_language() Сам код работает, но вот смена языка нет. Всегда текст появляется на русском. Ссылка на комментарий
Nazgool 250 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 Замени language = 'eng' ... if language == 'ru' ... elseif language == 'eng' 1 Ссылка на комментарий
Kober(BRUC) 99 Опубликовано 8 Июля 2016 Поделиться Опубликовано 8 Июля 2016 Добрый день. Написал такой код: all_tbl = { q, w, e, r, t, y, u, i, o, p, a, s, d, f, g, h, j, k, l, z, x, c, v, b, n, m, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0} local on = true function zoz() if on then oz() end end function oz() for fg = 1, 15 do math.randomseed(os.time()) random = math.random(#all_tbl) print(all_tbl[random]) end end zoz() Но значения берутся не из таблицы, а равны nil. В чем же проблема? Ссылка на комментарий
Kirgudu 1 204 Опубликовано 8 Июля 2016 Поделиться Опубликовано 8 Июля 2016 @Kober(BRUC), потому что сейчас это не массив, а не пойми что. Каждый буквенный элемент следует заключить в кавычки. 1 Инструмент Ссылка на комментарий
naxac 2 445 Опубликовано 9 Июля 2016 Поделиться Опубликовано 9 Июля 2016 Приветствую. Меня интересует - куда Луа определяет переменную, которую инициализируют, например, так: function mmm() var = 123 endИ раньше она нигде не была объявлена.Где ее можно найти? В _G? Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
dsh 3 824 Опубликовано 9 Июля 2016 Поделиться Опубликовано 9 Июля 2016 @naxac, подозреваю, в глобальном пространстве имен оно будет, т.е. в G. Хорошая, кстати, грабля. Ошибиться достаточно легко, а причину глюков потом искать у-у-у... 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти