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

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


Svoboда

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

@Kirgudu Движок пересобирать – уровень для меня недостижимый. Создать рестриктор на месте ГГ и каким-то образом его двигать (или переспавнивать с интервалом в пару секунд) – еще можно попробовать.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Здрасьте.

 

[ЧН 1.5.10] Отсортировал список переходов в диалоге проводников по сюжетному порядку обхода локаций: у одних проводников список выводится в прямом порядке (Болота, Кордон, …), у других – в обратном (Военные склады, Рыжий лес, …). Чем можно объяснить такую разницу?

 

Spoiler

[scripts\guiders.script]
(–)
-- point_name
	for k,v in pairs(guiders_table.teleport_points) do
        phrase = dialog:AddPhrase("NO TEXT", k, "2", -10000)
        script = phrase:GetPhraseScript()
        script:AddPrecondition("guiders.precondition_teleport_to_point_available")
        script:SetScriptText("guiders.set_phrase_text")
        script:AddAction("guiders.select_point")
-- ready?
        phrase = dialog:AddPhrase("st_tm_guide_21", "21", k, -10000)
	end

(+)
-- point_name
	local names = {}
	local gtp = guiders_table.teleport_points
	local levels = { "marsh", "escape", "garbage", "darkvalley", "agroprom", "yantar", "red_forest", "military" }

	for i = 1, #levels do
		for name, v in pairs(gtp) do
			if v.level == levels[i] then
				names[#names +1] = name
			end
		end
	end

	for k, name in ipairs(names) do
        phrase = dialog:AddPhrase("NO TEXT", name, "2", -10000)
        script = phrase:GetPhraseScript()
        script:AddPrecondition("guiders.precondition_teleport_to_point_available")
        script:SetScriptText("guiders.set_phrase_text")
        script:AddAction("guiders.select_point")
-- ready?
        phrase = dialog:AddPhrase("st_tm_guide_21", "21", name, -10000)
	end

 

 

Изменено пользователем Norman Eisenherz
  • Сочувствую 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@_Sk8_AsTeR_ Если функция относится к состоянию инвентаря или HUD и не требует вызова в бою, можно добавить привязку в главное меню [scripts\ui_main_menu.script] – см. описание выхода из игры на [Q].

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Здрасьте.

 

Проблема при определении ячейки карты для спавна предмета. Читаю текущие координаты и позицию ячейки вот таким скриптом:

Spoiler

function sms(text)
	news_manager.send_tip(db.actor, text)
end

function coords(cell)
	local act = db.actor

	local pos = act:position()
	pos.x = math.modf(pos.x)
	pos.y = math.modf(pos.y)
	pos.z = math.modf(pos.z)

	sms("xyz = " .. pos.x .. ", " .. pos.y .. ", " .. pos.z)

	if cell then
		local lvid = act:level_vertex_id()
		local gvid = act:game_vertex_id()
		sms("lvid, gvid = " .. lvid .. ", " .. gvid)
	end
end

 

 

ТЧ, Кордон, крыша вагона над Кузнецовым: lvid = 359827, gvid = 97. Объект с такими параметрами ячейки спавнится в указанном месте.

ЧН, Кордон, крыша элеватора: lvid = 310050, gvid = 571. Объект с такими параметрами ячейки обнаруживается на сервере, но остается невидимым. Если задать lvid = 25 и gvid = 472, как в секции [all.spawn] для Кордона, объект отспавнится правильно.

Что изменилось в расчете позиций ячеек в ЧН и как получить действующие значения lvid и gvid?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Здрасьте.

 

Можно ли прочитать параметры из секции конфига в том порядке, в котором они указаны, или результат перебора for i = 0, ini:line_count(section) -1 всегда выдается в случайном порядке?

Задача в том, чтобы вывести полную специализацию механика в заданном порядке (оружие общее, оружие частное, броня): https://drive.google.com/file/d/15OmIOK-H2J2ryp60PAOSUT77FR9fxBmd/view?usp=sharing

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@AndreySol ЧН 1.5.10, [configs\misc\technics_specialization.ltx].

В оригинале так:

[mar_csky_tech]
wpn_mp5
novice_outfit

В моде так:

Spoiler

[mar_csky_tech]
wpn_mp5
novice_outfit

st_tech_pistols_ussr
st_wpn_hpsa
st_tech_shotguns
st_tech_assault_all
st_wpn_fn2000
st_wpn_groza
st_wpn_rp

tech_outfit_jackets
stalker_outfit_name
tech_outfit_csky

 

Обработка измененной функцией из [scripts\inventory_upgrades.script]:

Spoiler

local gts = game.translate_string

function get_technic_specialization(section)
	local ini = ini_file("misc\\technics_specialization.ltx")
	local sys_ini = system_ini()
	if ini:section_exist(section) then
        local str = game.translate_string("st_technic_specialization")
		local n = ini:line_count(section)

		local main = {}
		local other_wp = {}
		local other_am = {}

		for i = 0, n -1 do
			local temp1, id, temp2 = ini:r_line(section, i, "", "")

			if string.find(id, "^st_") then
				other_wp[#other_wp +1] = id
			elseif string.find(id, "_outfit_") then
				other_am[#other_am +1] = id
			else
				main[#main +1] = id
			end
		end

		if #main == 0 then			-- только обычная прокачка
			str = str .. "\\n%c[default]" .. gts("st_technic_specialization_none")
		else
			table.sort(main)
			for i = 1, #main do
				str = str.."%c[default] \\n• "..gts(sys_ini:r_string(main[i], "inv_name"))
			end
		end

		table.sort(other_wp)		-- сортировка, потом перевод
		table.sort(other_am)

		local other_st = {}

		for i = 1, #other_wp do
			other_st[i] = "• " .. gts(other_wp[i])
		end

		for i = 1, #other_am do
			other_st[#other_wp + i] = "• " .. gts(other_am[i])
		end

		local str_other = table.concat(other_st, "\\n")
		return str .. "\\n \\n%c[ui_4]" .. gts("st_technic_spec_other") .. "\\n%c[default]" .. str_other
	else
		return gts("st_technic_specialization") .. "\\n%c[default]" .. gts("st_technic_specialization_none")
	end
end

 

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@AndreySol Ну ведь не это я спрашивал. Хочу сделать так, чтобы оружие было перечислено в порядке возрастания "полезности": пистолеты, ПП, дробовики, автоматы, снайперки. При этом не хочу вручную задавать алфавитный порядок через имена string_id.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@AndreySol Подозреваю, что как раз правками движка можно добиться нужного порядка чтения, а вот в обычных скриптах возможности ограничены… Разве что список с числовыми ключами в отдельном файле создавать, чтобы читать его по порядку.

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


Ссылка на сообщение
6 hours ago, Zander_driver said:

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

Не к номеру – к порядку. Пять строк, десять – главное, чтобы они были выведены в подсказку в том же порядке, в котором перечислены. Про вариант со списком и я сам упоминал.

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@AndreySol Объяснить как моддер моддеру, почему у каждого свой набор доработок и изменений относительно оригинальной версии игры? :pardon:

Изменено пользователем Norman Eisenherz
  • Смешно 3

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

@aromatizer Судя по количеству вопросов, оставшихся без ответа, сделано далеко не все. Например, во время адаптации мода "Медикаменты на худе" под ТЧ 1.0006 я спрашивал, как правильно скрывать счетчик при отображении диалоговых окон, при запуске катсцен и снов – хоть бы кто сказал, что можно сделать один пустой статик на худе и всю начинку добавить к нему, а не мудрить с инфо-поршнями для каждого типа окна отдельно.

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

  • Смешно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Здрасьте.

 

Беру количество денег у ГГ (с виду целое – ни одной цены с копейками нет), делю на 10: исходное число 18'639, после деления 1'863.9000244141.

Читаю радиацию из конфига через system_ini():r_float(sect, "radiation_restore_speed"): в конфиге 0.002, в результате 0.002000000949949.

Округляю координату до одного знака через math.floor(x*10 + 0.5) / 10: исходное число 269.583…, после округления 269.6000610352.

 

Такие странности с вычислениями наблюдаются, как минимум, в ТЧ и ЧН. Откуда берутся эти дробные части и как с этим бороться?

Изменено пользователем Norman Eisenherz
  • Согласен 1
  • Смешно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


Ссылка на сообщение
On 9/6/2020 at 7:13 PM, abramcumner said:

string.format("%.1f", x)

Любое следующее вычисление (даже + 0) опять приводит к появлению той же дробной части, и при последовательных вычислениях с выводом промежуточных результатов приходится форматировать строку каждый раз. С трудом верится, что настолько неоптимальный подход – норма для языка Lua.

 

@AndreySol Цитирую: "исходное число 18'639". Может, я что-то упускаю, но в конфигах хранится только начальное количество денег ГГ, а текущая сумма на счету читается через db.actor:money() без опций "float/integer"

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Здрасьте.

 

Работает ли метод iterate_inventory_box(func, obj) в ЧН?

Метод указан в [lua_help.script], упоминается в справочнике на gameru.net как полностью аналогичный методу iterate_inventory(func, obj), но при вызове для существующего и находящегося в онлайне контейнера с несколькими предметами случается вылет с ошибкой "нет такого метода".

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Здрасьте.

 

Равнозначны ли указанные ниже способы удаления переменной из pstor?

xr_logic.pstor_store(db.actor, name, nil)

db.storage[db.actor:id()].pstor[name] = nil

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

Здрасьте.

 

ЧН 1.5.10, расстановка меток NPC в [sim_squad_generic.script].

 

Задача: скрыть метки отрядов противника при переключении статуса нейтрал/враг.

Решение: добавить проверку по имени метки – if not string.find(spot, "enemy") …

Результат: метка обстрелянного отряда скрывается, но метки соседних отрядов остаются видимыми (и желтыми), хотя участники этих отрядов уже активно стреляют по ГГ.

В указанном скрипте есть проверка "при наличии лидера отряда проверять отношение ГГ к нему". Отряд не был обстрелян, лидер у него точно есть и, судя по метке, остался нейтральным, но атакует как свидетель нападения.

 

Как принудительно сделать такой отряд враждебным, чтобы скрыть метку?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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


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

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