Kirgudu 1 264 Опубликовано 17 Июля 2019 Потому что срабатывает как "and (not q_name) == 36", а не "and not (q_name == 36)", вестимо. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 17 Июля 2019 @Norman Eisenherz, с чего бы это? Выражение «not число» тоже имеет свой результат в Lua (false), который вполне можно сравнить с другим числом. И они естественно не равны друг другу. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 18 Июля 2019 (изменено) @Norman Eisenherz, См. раздел "logical operators": http://lua-users.org/wiki/OperatorsTutorial В переменной q_name находится число. Выражение (not q_name), срабатывающее первым, даёт результат false. Сравнение false с числом 36 также даёт результат false (т. к. ложь не равна тридцати шести). Таким образом, всё, что идёт после "and", имеет результат false, а следовательно, общее условие не срабатывает. Настоятельно рекомендую подучить азы языка, чтобы не плавать в простейших вопросах. Шапка темы "Язык Lua. Общие вопросы программирования", вторая ссылка. Wiki по ссылке в начале моего поста также содержит немало полезных сведений. Изменено 18 Июля 2019 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 12 Августа 2019 @Full Noob, level.client_spawn_manager():add(l_i_mod_repairkit.id, -1, mod_set_newkit_condition) Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 16 Сентября 2019 @Баба ЯГА, local pso = so:play(db.actor, 0, sound_object.s2d) if pso:playing() then pso:stop() end 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 19 Сентября 2019 @_Sk8_AsTeR_, Скрытый текст table.insert(tab, {id = sobj.id, name = data.character_name}) -- пишем id и имя в таблицу tab function get_npc() return tab[math.random(#tab)] end local npc = testt.get_npc() amk.send_tip("тело сообщения", npc.name, время, 15, "common_channel") -- аналогично добавляем отъём денег по npc.id 1 2 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 24 Сентября 2019 Можно, но если выборка из таблицы будет значительно отнесена по времени от её заполнения, реальное кол-во денег будет уже другим. Тогда либо клиентский объект, либо снова считывать нет-пакет. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 24 Сентября 2019 @_Sk8_AsTeR_, примерно так: local sum = 10 -- здесь кол-во денег, котрое хотим отнять local pk = get_netpk(sobj) if pk and pk:isOk() then local data = pk:get() if data.money and data.money > sum then data.money = data.money - sum else data.money = 0 -- отнимаем сколько есть, если не хватает end pk:set(data) end 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 26 Сентября 2019 17 часов назад, Баба ЯГА сказал: Читал, там нет подробного объяснения. Всё там есть. level.start_stop_menu(wnd, true|false) - показывает|скрывает переданное в первом аргументе окно level.main_input_receiver() - возвращает открытое в настоящий момент окно (диалог, инвентарь и т. д.) 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 1 Октября 2019 @Баба ЯГА, обрати внимание на модуль lua_helper. В нём есть уже готовые функции как для поиска минимальных и максимальных game- и level-вертексов на локации, так и для определения ближайшего вертекса к заданным координатам ( а также куча других полезных функций). Если нет желания интегрировать весь модуль в свой мод, можно как минимум изучить реализацию. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 1 Октября 2019 @Баба ЯГА, initial, upd: никак, можно, не будет. upd2: сам же спрашивал и уже получал ответ здесь. upd3: только на объект. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 1 Октября 2019 (изменено) @Баба ЯГА, навскидку на ум приходит только перебор вертексов вокруг твоих координат и определение вертекса с минимальным расстоянием. См. комментарии выше и lua_helper. И прекрати флудить, задавая те же вопросы другими словами. Изменено 1 Октября 2019 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 1 Октября 2019 (изменено) 5 часов назад, Graff46 сказал: можно ли скриптово без использования патч поинтов заставить НПС ходить в оффлайне и на другие локации? В пределах локации можно и проще, по координатам - npc:set_dest_level_vertex_id(lvid) Для перемещения же на другие локации вроде надо работать с привязкой НПС к смартам. Что-то подобное обсуждали давно здесь. @Баба ЯГА, я-то всё прекрасно понял, а тебе все необходимые подсказки уже дали. У тебя есть level-вертекс и его координаты. Для поиска game-вертекса можно воспользоваться перебором, аналогичным тому, который предложил @naxac для level-вертексов. Например: Скрытый текст function get_gvid_by_pos(pos) local gmg, vpos, n = game_graph(), vector(), 0 for i = gvid_min, gvid_max do -- gvid_min, gvid_max - минимальный и максимальный game-вертексы для данной локации vpos = gmg:vertex(i):level_point() if vpos and vpos:distance_to_sqr(pos) < 9 then n = n + 1 log(i) end end log("found %s game vertexes", n) end Изменено 1 Октября 2019 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 1 Октября 2019 @Баба ЯГА, полегче, полегче. Красным цветом и прописными буквами пиши в другом месте. Надо разжевать и в рот положить, да? Извини, не по адресу обратился. Предпочитаю дать пищу для самостоятельных размышлений, хотя бы минимальных. 47 минут назад, Баба ЯГА сказал: Ну нашёл я в радиусе 20 метров по твоему скрипту 4 гейм вертекса и что мне с ними делать? Например, модифицировать функцию так, чтобы сразу искала единственный гейм-вертекс, находящийся на минимальном расстоянии от твоих координат, а не все вертексы в радиусе 9 метров. 52 минуты назад, Баба ЯГА сказал: И откуда мне знать какой минимальный гейм вертекс на локации вертекс а какой максимальный. 8 часов назад, Kirgudu сказал: обрати внимание на модуль lua_helper. В нём есть уже готовые функции как для поиска минимальных и максимальных game- и level-вертексов на локации, так и для определения ближайшего вертекса к заданным координатам ( а также куча других полезных функций) Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 13 Декабря 2019 4 часа назад, UriZzz сказал: мне бы примерчик пользования модуля se_stor Тебе какого рода примерчик-то нужен? В сборочном цехе смотрел? Там всё максимально подробно расписано - и автором, и я от себя добавил, даны примеры подключения для всех частей игры и даже подготовлены скрипты для оригиналов. А использование... что может быть банальней трёх добавленных глобальных функций SetVar, GetVar и DelVar, тоже описанных? Ведь работа модуля и сводится как раз к сохранению, чтению и удалению переменных. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 14 Декабря 2019 (изменено) @Zander_driver, насчёт фломастеров полностью согласен - кому как удобнее, тем более если скриптёр понимает, что именно делает. На мой взгляд, переопределить при замене (гипотетической) модуля четыре глобальные функции в одном месте проще, чем выискивать по всем скриптам вызовы внутренних функций модуля. Выше, кстати, есть опечатка: должно быть "se_stor.get(key, default)" 9 часов назад, UriZzz сказал: просто хочу увидеть реализацию в коде Вызовы глобальных функций будут выглядеть так: SetVar(key, value) -- установить значение переменной GetVar(key, default_value) -- получить значение переменной (default_value - значение по умолчанию для переменных типа таблица) DelVar(key) -- удалить переменную HasVar(key) -- проверить наличие переменной в хранилище Для всех частей игры работает одинаково. Изменено 14 Декабря 2019 пользователем Kirgudu 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 16 Декабря 2019 @DMT, функция не обязана что-то возвращать, чтобы проделать какую-либо работу. Вот здесь local tt = t_data[npc:id()] из массива менеджеров торговли (не знаю, из какого мода взят код, но это именно переделанный относительно оригинала trade_manager) читается экземпляр, соответствующий конкретному NPC. Далее происходит изменение свойств этого экземпляра (списков покупки/продажи) в зависимости от условий. При этом массив менеджеров торговли наполняется другой функцией (trade_init или её аналог), а результаты изменений, сделанных внутри функции update, доступны также и за её пределами. Для общего понимания рекомендую почитать, что такое ссылочные типы данных и типы значений (reference type и value type). 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 16 Декабря 2019 (изменено) 2 часа назад, DMT сказал: Насколько я знаю, в Lua ссылочные типы отсутствуют. Так ведь ? Не так. Таблица в Lua - объект, доступ к которому осуществляется именно по ссылке (указателю). Ещё раз, почитай. 2 часа назад, DMT сказал: Для какой цели записывать что-то в локал tt, объявленный внутри функции Посмотри внимательнее код. Как раз не внутри функции, а за её пределами, поскольку tt - это указатель на таблицу, являющуюся подтаблицей объекта, объявленного в модуле глобально. То есть твои изменения, сделанные функцией, сохраняются и после выхода из неё, и могут использоваться затем другими функциями/модулями. 2 часа назад, DMT сказал: То есть значение переменной s не сохраняется между двумя вызовами функции func. А вот у тебя переменная s имеет тип "значение", объявлена уже внутри функции func(), существует только в пределах этой функции и не сохраняется после её выполнения. При повторном выполнении она создаётся заново со значением nil, что ведёт к повторному выводу в консоль. Изменено 16 Декабря 2019 пользователем Kirgudu 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 14 Января 2020 @_Sk8_AsTeR_, условную одну переменную, не занимающую много места (а числовое значение именно такое), вполне можно сохранять в pstor актора без огорода с дополнительными модулями или новыми движками - см. штатные xr_logic.pstor_store и xr_logic.pstor_retrieve и их применение в оригинале. Вот с таблицами, длинными строками или множественными переменными - другое дело, в этом случае уже стоит последовать совету @Zander_driver. 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 15 Января 2020 (изменено) 2 часа назад, _Sk8_AsTeR_ сказал: xr_logic.pstor_store(db.actor, bank, 0) Вот если б было написано "bank" - тогда да, то же самое по синтаксису. А так здесь используется некая переменная bank. Что в ней, не таблица ли? 2 часа назад, Zander_driver сказал: Где одна, там и две, а где две, там и десять. Вот человек только начал - а уже таблицы в сохранение отправляет. Полностью согласен! Но мы ж тут знания стараемся повышать. Я потому и написал специально: "одну переменную", да ещё и "с числовым значением". Разве что жирным и подчёркнутым не выделил. Умный человек вычленит для себя важное, а глупому и модули с движком не помогут. Изменено 15 Января 2020 пользователем Kirgudu 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение