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

Язык Lua. Общие вопросы программирования

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

С чего начинать и где взять.

 

Установка 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

Изменено пользователем Kirgudu
Ссылка на комментарий

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

Ничто не вечно под луной.

Ссылка на комментарий

@KitkaT.Net, разумеется она сбрасывается. Модуль при загрузке игры переинициализируется, я уже не раз это говорил. И при загрузке игры без обращения к функции где идет рандомизация она у тебя будет равна nil. Делай рандомизацию непосредственно перед проверкой.

  • Полезно 1
Ссылка на комментарий

@Карлан, ну рандомизировать то мне по логике квеста надо один раз, поэтому обойдусь инфопоршнями на каждый из случаев. Ладно, хотя бы разобрался из-за чего у меня такая ерунда происходила :)

Ничто не вечно под луной.

Ссылка на комментарий
хотя бы разобрался из-за чего у меня такая ерунда происходила

Попробуйте инициировать вашу "глобальну переменню" при её объявлении сразу радомнным значением, а не nil.

А в фунции souls_died_armors_give_quest() рандомизацию уберите вообще. Эту переменную в Вашем случае можно вовсе сделать локальной для скрипта (не функции!), чтобы не засорять глобальную таблицу. Конечно это справедливо, если код, который Вы привели, действительно реальный, а не какой-то тестовый пример. 

И будет Вам счастье.

--глобальная переменная для того чтобы фильтры заспавнились только в одном вертолете
local FILTERS_PLACE=math.random(3)

function souls_died_armors_give_quest() 
    task_manager.get_task_manager():give_task("souls_died_armors_task")
	task_manager.get_task_manager():give_task("souls_died_armors_task_jup")
	task_manager.get_task_manager():give_task("souls_died_armors_task_zat")
	--task_manager.get_task_manager():give_task("souls_died_armors_task_zat2")	--так как нельзя залезть на плато
	task_manager.get_task_manager():give_task("souls_died_armors_task_zat3")
--[[	
	math.randomseed(os.time()) 
	FILTERS_PLACE=math.random(3)
--]]	
	printf("FILTERS_PLACE= %s",FILTERS_PLACE)
	--news_manager.send_tip(db.actor, FILTERS_PLACE, nil, "seeker", nil, nil)
end

function searchingHeliJupiter(actor, npc)
	if xr_conditions.actor_in_zone(actor, npc, {"jup_b8_heli_4"})
		then
		printf("FILTERS_PLACE= %s", FILTERS_PLACE)
		if FILTERS_PLACE==1 then
			db.actor:give_info_portion("soulsDiedArmorsHeliJupiterDone")
			db.actor:give_info_portion("soulsDiedArmorsHeliFounded")
			alife():create("dust_filter", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
			alife():create("dust_filter", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
		else
			db.actor:give_info_portion("soulsDiedArmorsHeliJupiterDone")
			news_manager.send_tip(db.actor, "no_filters2", nil, "seeker", nil, nil)
		end
		
	end
end

 

 

 

 

Делай рандомизацию непосредственно перед проверкой.

 

Мысль безусловно верная, только фразу я бы сформулировал так: : "Делай рандомизацию непосредственно перед её использованием".

Проверять можно когда угодно и где угодно, а вот её значение важно только в момент использования этой переменной

Изменено пользователем Serge!
Ссылка на комментарий

Я призадумался. Когда я начал изучать в ВУЗ'е вэб-программирование, то конечно же столкнулся с фреймворком "jQuery" в теории по этой библиотеке описывалось почему есть jQuery.js и  jQuery_min.js. Дело все в представлении листинга "в одну строку" (Для Нотпад++ есть плагин JStool --> JS_min). Такое представление кода хоть и некрасива, но повышает скорость исполнения. Что если использовать эту ф-цию для критичных по времени участков кода в скриптах Сталкера? 

Ссылка на комментарий

Сомнительное утверждение. Минимизация javascript кода имеет своей целью не повышение скорости исполнения, а повышение скорости загрузки скрипта с сервера на клиент за счёт уменьшения его размера. В случае обфускации - ещё и усложнение реверс-инжиниринга. И то и другое имеет слабое отношение к ускорению выполнения скрипта.

Если требуется ускорить выполнение, лучше потратить свои усилия на оптимизацию кода, а не его минимизацию.

Изменено пользователем Kirgudu
  • Нравится 1
  • Согласен 1
  • Полезно 1
Ссылка на комментарий

Вообще-то стоит еще понимать разницу между интерпретируемым и компилируемым кодом.

И помнить, что такое инлайн, и где он есть, а где его нет.

 

P.S. Идея копировать строки при передаче в функцию - явно не гуманности ради была реализована.

Ссылка на комментарий

p = t[k] or def[k]

 

Если нет ни того, ни другого, у p сохраняется старое значение.

1.006 "Международный" с "макронопатчем".

  • Спасибо 1
  • Полезно 1
Ссылка на комментарий

@Dennis_Chikin, Ещё с момента публикации хотел спросить, - "И зачем это нужно в принципе?"
Я к чему. Все уже давно привыкли, что если нет ни того ни другого, то будет nil.

И когда я так напишу, то и буду ожидать что 'p' станет 'nil'-ом. А оно не станет.

Такое многим не понравиться.

Lua stalker-а и без этого сильно не предсказуема.

Хотя-я-я. В этом же стиле. Так что можно. :)

 

А-а-а. Чего пишу-то. Пишу любителям SciTE.

Замутил тут одну штуку. Давно хотел, да плевал, а тут вот ""з`явилася нагода".

В общем добавил в меню 'Tools" выбор разных версий lua и быстрое переключение на эти версии с изменением подсветки синтаксиса и т.д.

Дело в том, что все актуальные версии для платформ x86 и x64 у меня есть, а вот для luajit 1.1.5 есть только одна. На x86 у меня работает, значит нет для x64 (я имею в виду бинарники).

Может у кого-то завалялась?

Другие версии JIT (1,1,6-1,1,8) не интересуют.

 

Да, если кому-то это нужно в SciTE, то милости прошу. Доделаем как это будет нужно и в конце концов правильно.

А то леплю тут как придется :)
 

Изменено пользователем Nazgool
Ссылка на комментарий

И когда я так напишу, то и буду ожидать что 'p' станет 'nil'-ом. А оно не станет. Такое многим не понравиться.

А уж как я удивился, когда 5 лет работавший скрипт начал то чудеса выдавать, то вообще вылеты от сравнения таблицы с намбером...

Ссылка на комментарий

И чем дальше будут продвигаться успехи двиглоправов, тем больше там будет таких подводных камней сюрпризов, надо полагать?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

А уж как я удивился, когда 5 лет работавший скрипт начал то чудеса выдавать, то вообще вылеты от сравнения таблицы с намбером...

Я точно помню, что тебе про это говорил еще когда ты со скриптом динамической погоды возился, у меня тогда он летал как фанера вот как-раз поэтому :). У меня такое всегда дает nil, поэтому такие твои конструкции я тогда переписал на горячо тобою любимые cfg_get_string.

 

Впрочем да, @Nazgool совершенно верно подметил про сталкерский луа, конкретно у нас есть абсолютно такой, наверное, пример который можно в учебники писать. Патерн есть один не нормальный, приведя его к нормальному виду луа радуется, а обычный сталкерский луа ругается. Опытным путем, установкой нового luajit (2.1.0), получена эта народная забава, патерн не работающий на каноничном luajit прекрасно заработал на новом, да еще как! То есть я веду к тому, что не стоит пытаться кого-то чем-то зацепить, но вот так вот есть и с этим ничего не поделать, логика работы действительно разная, причем как в явных моментах (исходя из официальной документации), так и в неявных., такой вот да, шарм сталкерского луа.

Ссылка на комментарий

Добрый день. Есть переменная и таблица заполненная значениями. Размер таблицы 26 элементов.
Мне нужно проверить равно ли значение переменной значению элементов таблицы. Проверить с помощью конструкции if. Элементов аж 26, мне нужно все элементы перебирать или есть какой-то более простой способ?
На ум приходит только это:
 

for i=1, #tbl_name do
  if (tbl_name[i] == variable_name) then
    -- Наши действия...
    -- Остановили цикл:
    break
  end
end
Изменено пользователем Kober(BRUC)
Ссылка на комментарий

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

Например:

local tbl = {}
tbl["text_1"] = true
tbl["text_2"] = true
if tbl.text_1 then
   -- Наши действия...
end

Плюс такой конструкции в отсутствии цикла, но это не всегда применимо, требуется изначально затачивать таблицу под такие действия.

  • Спасибо 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

 

 

Элементов аж 26, мне нужно все элементы перебирать или есть какой-то более простой способ?
Вот статейка, в которой рассказано об аналоге оператора switch в ЯП по типу C\C++\C#\etc. Возможно найдёшь в ней что-то полезное для себя
  • Спасибо 1
Ссылка на комментарий

Помнится, когда-то давно была рубка по поводу string.*( s, ... ) vs. s:*( ... )
Сегодня внезапно обнаружил, что for ss in s:*() пытается скорее получить что-то из s, чем из s:*()

{2.0}Удивился.

  • Сомнительно 1
Ссылка на комментарий

@Dennis_Chikin,

local s = "test"
for ss in s:gmatch("s") do
  print(ss)
end

ожидаемо возвращает "s". В чём подвох? Или не это имелось в виду?

Ссылка на комментарий

LUA какой ? Сталкеровский ?

Судя по работающему print(ss) - скорее нет.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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

AMK-Team.ru

×
×
  • Создать...