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

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


Svoboда

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

@abramcumner Нет – я проверял, что во временный нетпакет успешно переносятся данные из UPDATE-пакета исходного объекта; проблема возникает на следующей стадии – при переносе данных из временного пакета в новый объект.

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

Шпаргалка

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


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

@abramcumner В UPDATE-пакете нового оружия будут дефолтные данные класса + то, что совпадает со STATE-пакетом: например, будет один патрон, если была заряжена граната.

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

Шпаргалка

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


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

Здрасьте.

 

1. В X-Ray Extensions есть функции get/set_inventory_item_int16, которые позволяют менять флаги состояния предметов. Судя по комментарию "-- extra flags added in x-ray extensions" в списке ii_flags, флаги до 11-го бита (is_quest_item = 2048) существуют у объектов и в оригинальной игре.

2. Есть класс flags16, работа с которым вроде как похожа на работу с нетпакетом:

• создать контейнер x = flags16();

• заполнить контейнер флагами объекта через ?:get();

• изменить отдельные флаги через x:set(#, true/false);

• назначить новые флаги объекту через ?:assign(x).

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

 

Конечный вопрос: можно ли, используя только функции класса flags16, повторить работу функций get/set_inventory_item_int16? Другими словами, являются ли эти функции более удобным представлением того, что уже есть в движке, или делают что-то полностью новое?

 

Нашел в файлах XRE код, но как он работает, я без знания языка понять не могу.

Spoiler

CScriptGameObject__SetInventoryItemInt16 proc
pos   = dword ptr  8
value = dword ptr  0Ch

	push    ebp
	mov     ebp, esp
	push    edx
	;---
	call    CScriptGameObject__CInventoryItem
	mov     ecx, [ebp + pos]
	mov     edx, [ebp + value]
	mov    [eax+ecx], dx
	;---
	pop     edx
	mov     esp, ebp
	pop     ebp
	retn    08h
CScriptGameObject__SetInventoryItemInt16 endp

CScriptGameObject__GetInventoryItemInt16 proc
stub  = dword ptr  8
pos   = dword ptr  0Ch
	push    ebp
	mov     ebp, esp
	and     esp, 0FFFFFFF8h
	
	push    [ebp + pos]
	push    [ebp + pos]
	call    CScriptGameObject__GetInventoryItemInt
	and     eax, 0FFFFh
	
	mov     esp, ebp
	pop     ebp
	retn    8
CScriptGameObject__GetInventoryItemInt16 endp

 

 

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

Шпаргалка

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


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

@naxac Я имел в виду примеры применения функций именно базового класса flags16. Но, раз без правок XRE получить флаги для последующей обработки нельзя, примеры ничего не дадут.

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

Шпаргалка

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


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

Здрасьте.

 

[m_netpk.script]
Функция r_chunk, насколько можно судить по коду, читает простую таблицу, в которой len записей типа u8, даже если значение len указано как 3*4 или 4*4 (то есть, матрица все равно читается как вектор).
Что читает эта функция в варианте _r_l8u16v, когда вместо числового размера таблицы указано pk:r_u8(), а тип значения – u16? Таблицу размером 1 байт, в которой хранится 2-байтовое значение?

Еще один непонятный вариант – _r_l32szv, где размер указан как pk:r_s32(), а тип – stringZ. Это должна быть одна строка с длиной строго 4 байта, или это таблица из таких строк?

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

Шпаргалка

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


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

Здрасьте.

 

Вывод таблицы данных нетпакета через table.concat(k .. v, "\\n"): назначаю для определенной строки цвет – пропадает перенос в конце строки. Пока в строке только переменные и текст, перенос есть. В чем причина?

https://drive.google.com/open?id=1XU6jeaOI_HrNxm90ZiR6M6L3UTPXm0cC

Spoiler

	local pk_dump = {}

	for k, v in pairs(data) do
		if type(v) ~= "table" then
			table.insert(pk_dump, k .. " = " .. v)
		else
			if next(v) == nil then
				table.insert(pk_dump, k .. "%c[gray]" .. " = empty" .. "%c[default]")
				-- table.insert(pk_dump, k .. " = empty")
			else
				for i = 1, #v do
					table.insert(pk_dump, k .. "_" .. i .. " = " .. v[i])
				end
			end
		end
	end

	news_manager.send_tip(act, table.concat(pk_dump, "\\n"))

 

 

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

Шпаргалка

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


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

@Kirgudu Точно не то – один слеш в скриптовых текстах "съедается" как спецсимвол. По поводу повтора – хочется разобрать, а не открывать один черный ящик другим.

@naxac Да, так работает.

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

Шпаргалка

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


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

@nasar75 Скобки и дефис считаются модификаторами поиска – добавить к ним % для перевода в обычный текст: string.gsub(v, "%{\%-aes_arrive_to%}", "true")

  • Нравится 1

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

Шпаргалка

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


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

Делаю уведомление об открытом проходе под мостом на Кордоне: https://drive.google.com/open?id=1Ef-NJFJJ81tLlasRHkCOgLiK_VE0Lxoo

Проблема: уведомление скрывается при переходе на другую локацию, хотя инфо-поршень "esc_bridge_pass_on" и значения в pstor точно остаются. В чем может быть причина?

Spoiler

-- // actor_binder:info_callback(npc, info_id) // --
function set(info_id)
	if info_id == "esc_bridge_pass_on" then
		local time_hr = level.get_time_hours() + 1
			if time_hr == 24 then time_hr = 0 end
		local time_min = level.get_time_minutes()

		xr_logic.pstor_store(db.actor, "time_hr", time_hr)
		xr_logic.pstor_store(db.actor, "time_min", time_min)

		show()
	end
end

-- // actor_binder:info_callback(npc, info_id) // --
function clear(info_id)
	if info_id == "esc_bridge_pass_off" then
		local st = get_hud():GetCustomStatic("bridge_pass")
		if st then
			get_hud():RemoveCustomStatic("bridge_pass")
		end

		xr_logic.pstor_store(db.actor, "time_hr", false)
		xr_logic.pstor_store(db.actor, "time_min", false)
	end
end


-- // actor_binder:net_spawn(data) // --
function show()
	local t_hr = xr_logic.pstor_retrieve(db.actor, "time_hr")
	local t_min = xr_logic.pstor_retrieve(db.actor, "time_min")

	if t_hr and t_min then
		local st = get_hud():GetCustomStatic("bridge_pass")
		if not st then
			get_hud():AddCustomStatic("bridge_pass")
			caption()
		end
	end
end

function caption()
	local st = get_hud():GetCustomStatic("bridge_pass")

	local t_hr = xr_logic.pstor_retrieve(db.actor, "time_hr")
	local t_min = xr_logic.pstor_retrieve(db.actor, "time_min")

	local time_end = string.format("%02d:%02d", t_hr, t_min)
	local text = "Проход до " .. time_end
	st:wnd():SetText(text)
end

 

 

На всякий случай, файлы для чистой ТЧ: https://drive.google.com/open?id=1nJ7BeQSSaLx6EFGwWKhU2NYnOqvQShdg

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

Шпаргалка

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


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

Потестил еще: на Кордоне уведомление отображается всегда после 1-й загрузки, на Свалке или после перехода Кордон > Свалка > Кордон всегда после 2-й загрузки. В обоих случаях тестил с выходом из игры и с обычной перезагрузкой. Сделал add_call на прогрузку ГГ – уведомление отображается каждый раз.

(Инфо-поршень "esc_bridge_pass_off", как выяснилось, вообще не выдается до возврата на Кордон, но это уже другой вопрос).

 

@naxac "Первый апдейт" – привязаться к actor_binder:update(delta) и остановить выполнение после однократного выведения статика, или речь о чем-то другом?

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

Шпаргалка

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


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

Здрасьте.

 

Попадалась информация о старой версии мода "Худ рук", в которой текстура рук подменялась за счет классов то ли оружия, то ли брони. Кто-нибудь помнит, как этот мод работал? Хочется назначить 3–4 вида перчаток без полной замены моделей рук и перехода на правозатворное оружие.

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

Шпаргалка

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


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

Здрасьте.

 

ТЧ 1.0006, Армейские склады: сообщение "Сталкер, ты подходишь к барьеру" выдается дважды. В описании рестриктора только одно сообщение, в [xr_effects] такого сообщения нет. Где искать лишнюю копию?

 

Spoiler

[alife_l07_military.ltx]
name = mil_actor_blockpost					-- текст сообщения
type = tips							-- тип сообщения: "send_tip"
on_info = {=mil_actor_enemy_freedom} nil			-- проверка друг/враг
on_actor_inside = %+mil_blockpost_free_task%			-- инфо "mil_blockpost_free_task" (+ задание "mil_blockpost_job")
on_info2 = {+mil_blockpost_free_task} sr_sound_act		-- звуковое сообщение при получении инфо-поршня
sender = freedom						-- отправитель текстового сообщения
on_signal = tip_sended | sr_idle				-- ? (деактивация рестриктора)

 

 

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

Шпаргалка

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


Ссылка на сообщение
On 3/28/2020 at 9:37 PM, WinCap said:

@Norman Eisenherz, забыли добавить single = true, наверное.

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

  [sr_tip1] (Reveal hidden contents)

[sr_tip1]
name = mil_actor_blockpost
type = tips
sender = freedom
on_info = {=mil_actor_enemy_freedom} nil
on_actor_inside = sr_sound_act %+mil_blockpost_free_task%

 

Добрался, наконец, попробовать: просто "single = true" в имеющейся логике убирает второй текст, но затыкает и звук, и задачу. Без "single = true" сообщений, как ни крути, выдается два. В итоге, вот такой порядок дает нужный результат:

Spoiler

[alife_l07_military.ltx]
name = mil_before_blockpost_restriktor
…
[logic]
active = sr_idle

[sr_idle]
on_info = {=mil_actor_enemy_freedom} nil
on_actor_inside = %+mil_blockpost_free_task%
on_info2 = {+mil_blockpost_free_task} sr_tip

[sr_tip]
name = mil_actor_blockpost
type = tips
sender = freedom
single = true
on_signal = tip_sended | sr_sound_act

[sr_sound_act]
snd = characters_voice\scenario\military\pda\mil_pda_7
on_signal = sound_end | nil

 

 

  • Нравится 1

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

Шпаргалка

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


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

Здрасьте.

 

Есть ли какой-то фикс для меток, которые остаются после сюжетных заданий (АТП, X-16, РГ-6)? Пробовал удалять метки по инфо-поршням завершения заданий – удаление срабатывает через раз, как будто инфо-поршни не выдаются, хотя сами задания засчитываются стабильно.

ТЧ 1.0006

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

Шпаргалка

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


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

Здрасьте.

 

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

 

[scripts\xr_box.script]
position.y = obj:position().y + math.random(30,50)/100
Пробовал задавать вместо исходных 0,3–0,5 метров 1–2 метра над ящиком – все равно лут проваливается, особенно если ящик лежит на крыше (Г-образное здание на Кордоне, около ж/д моста).

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

Шпаргалка

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


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

Здрасьте.

 

[ТЧ 1.0006] Задача: добавить в инвентарь кнопку. Проблема на стадии вывода нового окна.

Ориентируюсь на следующие инструкции:

On 11/14/2010 at 11:31 PM, Kolmogor said:

Алгоритм простой:

- ждешь пока откроется инвентарь, ловишь ui_inventory в info_callback

- получаешь его окно через level.main_input_receiver()

- аттачишь свое окно AttachChild

и

 

On 2/3/2019 at 1:54 PM, Graff46 said:

запускаем диалог

level.start_stop_menu(dlg, true/false)

или так

dlg:GetHolder():start_stop_menu(dlg, true/false)

разницы никакой, это фактически одна и та же функция

 

Добавляю окно (+ статик с текстурой для заметности), приклеиваю к инвентарю: никакой реакции.

Вывожу то же окно отдельно через level.start_stop_menu() – условная кнопка отображается при открытом инвентаре, но игра вылетает через пару секунд.

Вывожу окно через GetHolder() – вылет уже при обращении к инвентарю, ошибка "attempt to index a nil value".

Spoiler

[bind_stalker.script]
function actor_binder:info_callback(npc, info_id)

	if info_id == "ui_inventory" then
		local w = CUIScriptWnd()
		w:Init(0, 0, 70, 25)

		local b = CUIStatic()
		b:Init(0, 0, 70, 25)
		b:InitTexture("ui_button_ordinary_d")
		b:SetStretchTexture(true)
		w:AttachChild(b)

		-- local inv = level.main_input_receiver()
		-- inv:AttachChild(w)

		level.start_stop_menu(w, true)
		-- w:GetHolder():start_stop_menu(w, true)
	end

 

 

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

Шпаргалка

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


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

1. Значит, не только CUIStatic() от этого страдает…

2. Осталась проблема с инвентарем: как приклеить новое окно именно к нему?

Строки

        local inv = level.main_input_receiver()
        inv:AttachChild(w)

никакого эффекта не дают.

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

Шпаргалка

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


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

@Zander_driver Видел расширенное описание оконных классов из lua_help и обсуждение с Garry_Geller по поводу удаления дочерних окон. Это то, что понимается под "подробно" или еще какая-то информация есть? Может, где-то есть уроки уровня "окно с одной кнопкой", а не просто ссылка "смотри numpad"?

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

Шпаргалка

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


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

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