Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

@Norman Eisenherz, с чего бы это? Выражение «not число» тоже имеет свой результат в Lua (false), который вполне можно сравнить с другим числом. И они естественно не равны друг другу.

Поделиться этим сообщением


Ссылка на сообщение

@Norman Eisenherz,

См. раздел "logical operators": http://lua-users.org/wiki/OperatorsTutorial

В переменной q_name находится число. Выражение (not q_name), срабатывающее первым, даёт результат false. Сравнение false с числом 36 также даёт результат false (т. к. ложь не равна тридцати шести). Таким образом, всё, что идёт после "and", имеет результат false, а следовательно, общее условие не срабатывает.

Настоятельно рекомендую подучить азы языка, чтобы не плавать в простейших вопросах. Шапка темы "Язык Lua. Общие вопросы программирования", вторая ссылка. Wiki по ссылке в начале моего поста также содержит немало полезных сведений.

Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение

@_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

Поделиться этим сообщением


Ссылка на сообщение

Можно, но если выборка из таблицы будет значительно отнесена по времени от её заполнения, реальное кол-во денег будет уже другим. Тогда либо клиентский объект, либо снова считывать нет-пакет.

Поделиться этим сообщением


Ссылка на сообщение

@_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

Поделиться этим сообщением


Ссылка на сообщение
17 часов назад, Баба ЯГА сказал:

Читал, там нет подробного объяснения.

Всё там есть.

level.start_stop_menu(wnd, true|false) - показывает|скрывает переданное в первом аргументе окно

level.main_input_receiver() - возвращает открытое в настоящий момент окно (диалог, инвентарь и т. д.)

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

@Баба ЯГА, обрати внимание на модуль lua_helper. В нём есть уже готовые функции как для поиска минимальных и максимальных game- и level-вертексов на локации, так и для определения ближайшего вертекса к заданным координатам ( а также куча других полезных функций). Если нет желания интегрировать весь модуль в свой мод, можно как минимум изучить реализацию.

Поделиться этим сообщением


Ссылка на сообщение

@Баба ЯГА, навскидку на ум приходит только перебор вертексов вокруг твоих координат и определение вертекса с минимальным расстоянием. См. комментарии выше и lua_helper.

И прекрати флудить, задавая те же вопросы другими словами.

Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение
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

 

 

Изменено пользователем Kirgudu

Поделиться этим сообщением


Ссылка на сообщение

@Баба ЯГА, полегче, полегче. Красным цветом и прописными буквами пиши в другом месте. Надо разжевать и в рот положить, да? Извини, не по адресу обратился. Предпочитаю дать пищу для самостоятельных размышлений, хотя бы минимальных.

47 минут назад, Баба ЯГА сказал:

Ну нашёл я в радиусе 20 метров по твоему скрипту 4 гейм вертекса и что мне с ними делать?

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

 

52 минуты назад, Баба ЯГА сказал:

И откуда мне знать какой минимальный гейм вертекс на локации вертекс а какой максимальный.

 

8 часов назад, Kirgudu сказал:

обрати внимание на модуль lua_helper. В нём есть уже готовые функции как для поиска минимальных и максимальных game- и level-вертексов на локации, так и для определения ближайшего вертекса к заданным координатам ( а также куча других полезных функций)

 

Поделиться этим сообщением


Ссылка на сообщение
4 часа назад, UriZzz сказал:

мне бы примерчик пользования модуля se_stor

Тебе какого рода примерчик-то нужен? В сборочном цехе смотрел? Там всё максимально подробно расписано - и автором, и я от себя добавил, даны примеры подключения для всех частей игры и даже подготовлены скрипты для оригиналов.

А использование... что может быть банальней трёх добавленных глобальных функций SetVar, GetVar и DelVar, тоже описанных? Ведь работа модуля и сводится как раз к сохранению, чтению и удалению переменных.

Поделиться этим сообщением


Ссылка на сообщение

@Zander_driver, насчёт фломастеров полностью согласен - кому как удобнее, тем более если скриптёр понимает, что именно делает. На мой взгляд, переопределить при замене (гипотетической) модуля четыре глобальные функции в одном месте проще, чем выискивать по всем скриптам вызовы внутренних функций модуля.

Выше, кстати, есть опечатка: должно быть "se_stor.get(key, default)"

 

9 часов назад, UriZzz сказал:

просто хочу увидеть реализацию в коде

Вызовы глобальных функций будут выглядеть так:

SetVar(key, value) -- установить значение переменной
GetVar(key, default_value) -- получить значение переменной (default_value - значение по умолчанию для переменных типа таблица)
DelVar(key) -- удалить переменную
HasVar(key) -- проверить наличие переменной в хранилище

Для всех частей игры работает одинаково.

Изменено пользователем Kirgudu
  • Спасибо 1
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

@DMT, функция не обязана что-то возвращать, чтобы проделать какую-либо работу. Вот здесь

local tt = t_data[npc:id()]

из массива менеджеров торговли (не знаю, из какого мода взят код, но это именно переделанный относительно оригинала trade_manager) читается экземпляр, соответствующий конкретному NPC. Далее происходит изменение свойств этого экземпляра (списков покупки/продажи) в зависимости от условий. При этом массив менеджеров торговли наполняется другой функцией (trade_init или её аналог), а результаты изменений, сделанных внутри функции update, доступны также и за её пределами.

 

Для общего понимания рекомендую почитать, что такое ссылочные типы данных и типы значений (reference type и value type).

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение
2 часа назад, DMT сказал:

Насколько я знаю, в Lua ссылочные типы отсутствуют. Так ведь ?

Не так. Таблица в Lua - объект, доступ к которому осуществляется именно по ссылке (указателю). Ещё раз, почитай.

2 часа назад, DMT сказал:

Для какой цели записывать что-то в локал tt, объявленный внутри функции

Посмотри внимательнее код. Как раз не внутри функции, а за её пределами, поскольку tt - это указатель на таблицу, являющуюся подтаблицей объекта, объявленного в модуле глобально. То есть твои изменения, сделанные функцией, сохраняются и после выхода из неё, и могут использоваться затем другими функциями/модулями.

2 часа назад, DMT сказал:

То есть значение переменной s не сохраняется между двумя вызовами функции func.

А вот у тебя переменная s имеет тип "значение", объявлена уже внутри функции func(), существует только в пределах этой функции и не сохраняется после её выполнения. При повторном выполнении она создаётся заново со значением nil, что ведёт к повторному выводу в консоль.

Изменено пользователем Kirgudu
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@_Sk8_AsTeR_, условную одну переменную, не занимающую много места (а числовое значение именно такое), вполне можно сохранять в pstor актора без огорода с дополнительными модулями или новыми движками - см. штатные xr_logic.pstor_store и xr_logic.pstor_retrieve и их применение в оригинале. Вот с таблицами, длинными строками или множественными переменными - другое дело, в этом случае уже стоит последовать совету @Zander_driver.

  • Спасибо 1
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
2 часа назад, _Sk8_AsTeR_ сказал:

xr_logic.pstor_store(db.actor, bank, 0)

Вот если б было написано "bank" - тогда да, то же самое по синтаксису. А так здесь используется некая переменная bank. Что в ней, не таблица ли?

2 часа назад, Zander_driver сказал:

Где одна, там и две, а где две, там и десять. Вот человек только начал - а уже таблицы в сохранение отправляет.

Полностью согласен! Но мы ж тут знания стараемся повышать. Я потому и написал специально: "одну переменную", да ещё и "с числовым значением". Разве что жирным и подчёркнутым не выделил. :)

Умный человек вычленит для себя важное, а глупому и модули с движком не помогут.

Изменено пользователем Kirgudu
  • Спасибо 1
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...