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

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

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

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