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

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

11 часов назад, Norman Eisenherz сказал:

Какая функция [lua_helper] или [m_netpk] должна помочь в изменении квестового статуса надетой брони?

Нет такой. В X-Ray Extensions есть функции для чтения/записи данных в клиентских объектах. Они-то тебе и нужны.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Изменение статуса через get/set_inventory_item_int16 с другой библиотекой xrGame.dll работает, только там слишком много правок, суть которых мне неизвестна (хотя вполне допускаю, что они все полезные).

 

В данный момент хотелось бы все-таки получить прямой ответ: возможно ли с помощью [m_netpk] или обычных скриптов изменить данные UPDATE-пакета оружия класса "автомат с гранатометом"? (Если возможно, то как именно?)

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

Шпаргалка

Ссылка на комментарий
3 часа назад, Norman Eisenherz сказал:

возможно ... изменить данные UPDATE-пакета оружия класса "автомат с гранатометом"?

Нет, невозможно.

Функционал и данные гранатомета присутствуют только в онлайн-объекте! И сохраняются, соответственно, только там. Поэтому и нужны функции для работы с данными онлайн-объектов, которых в оригинальном движке нет.

Скрытый текст

Эксперимент-доказательство.

Берем в руки автомат с гранатометом.

Заряжаем полный магазин патронов и меняем режим стрельбы на "одиночными".

Переключаемся на подствольник и заряжаем гранату.

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

Отходим от него подальше, что бы автомат вышел в оффлайн и возвращаемся.

Поднимаем автомат и проверяем количество патронов и режим стрельбы.

Результат будет такой-же, как и у функций с нет-пакетами.

 

S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)

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

Вероятно, это действительно так. Я поэкспериментировал по-своему - с разными частями нет-пакета (включая абстрактную), со спавном и без, с выбрасыванием из инвентаря и без, с переключениями онлайн-оффлайн и без - тот же результат.

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

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

Был вопрос на эту тему:

On 10/13/2011 at 11:37 PM, Kirag said:

Кстати, об update-пакете. Считать данные оттуда - без вопросов, а вот получалось ли у кого-нибудь данные туда результативно записать?

И был такой ответ:

On 10/13/2011 at 11:57 PM, Artos said:

А вот на вопрос: " а вот получалось ли у кого-нибудь данные туда результативно записать?" - могу ответить утвердительно.

Тот же параметр здоровья (health + upd:health) для неписей (хоть в он-лайне, хоть в офлайне) очень помогает и убивать и ранить и оживлять.

Получается, UPDATE-пакет можно переписывать, но только для некоторых объектов.

  • Согласен 1

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

Шпаргалка

Ссылка на комментарий
1 час назад, WinCap сказал:

Эксперимент-доказательство.

А если переключиться на подствольник, сохранить игру и загрузить?

 

Скорей всего можно задать, через клиент_дату в секретной(или как ее принято называть) части нет-пакета.

 

Получается, UPDATE-пакет можно переписывать, но только для некоторых объектов.

Да для всех объектов он переписывается. Просто ты столкнулся с особенностью класса оружия, что состояние подствольника берется не из апдейт-пакета. Ты же вроде сам писал, что вычитывал нет-пакет обратно и там было все, как нужно.

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

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

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

Шпаргалка

Ссылка на комментарий
11 минут назад, Norman Eisenherz сказал:

проблема возникает на следующей стадии – при переносе данных из временного пакета в новый объект.

То есть, если после этого перенести данные из нового объекта в еще один нет-пакет, то там уже кривые данные будут?

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

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

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

Шпаргалка

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

@Norman Eisenherz, попробуй через абстрактную часть нет-пакета. Смотри в доке у Артоса про net_abstract.

Тогда станет доступно свойство co_props.grenade_mode.

 

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

@abramcumner, я пробовал сегодня - см. выше. Не сработало. Делал, ессно, как надо: с добавкой в биндере и колбэком.

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

Здрасьте.

 

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

 

 

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

Шпаргалка

Ссылка на комментарий
2 часа назад, Norman Eisenherz сказал:

можно ли, используя только функции класса flags16, повторить работу функций get/set_inventory_item_int16?

Нет.

Класс flags16 служит для удобства работы с флагами (отдельными битами числа). Он ни как не связан с объектами.

А функции get/set_inventory_item_int16 как раз и добавляют в движок необходимый функционал.

Скрытый текст

x = flags16()

x:assign(get_inventory_item_int16)

x:set(11, true)

set_inventory_item_int16(x:get())

 

  • Полезно 1

S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)

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

@Norman Eisenherzпример использования функций ХЕ, половина взята из ОГСЕ.

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

@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 байта, или это таблица из таких строк?

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

Шпаргалка

Ссылка на комментарий
2 часа назад, Norman Eisenherz сказал:

Что читает эта функция в варианте _r_l8u16v

Функция читает 1 байт (u8) в котором хранится количество элементов, а затем сами элементы по 2 байта (u16). На выходе таблица 2 байтных чисел.

 

2 часа назад, Norman Eisenherz сказал:

Еще один непонятный вариант – _r_l32szv

Все тоже самое - сначала читается количество строк (4 байта s32), а затем уже сами строки (sz).

  • Нравится 1

S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)

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

@Norman Eisenherz, Вы таки задались целью, переделать с нуля труд Артоса?

Иначе - зачем это все, для каких тайных целей...

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

Здрасьте.

 

Вывод таблицы данных нетпакета через 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"))

 

 

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

Шпаргалка

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

@Norman Eisenherz,

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

И кстати, это опять изобретение велосипеда повторение уже имеющегося инструмента. В m_netpk есть функция pk:dumpDesc(), как раз предназначенная для вывода всех свойств нет-пакета. Почему бы не использовать её?

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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