Jump to content

Recommended Posts

naxac    1,399

@Norman Eisenherz

2. https://github.com/naxac/CP2_AddOn/commit/f34310407a98f13d24c5b36d3c1008b058b96f65

Можно через нужные промежутки времени прибавлять значение, передаваемое в SetProgressPos.

3. Всегда думал, что *.seq проигрывается с самой первой (верхней) текстуры. Интересно... Управлять первым кадром точно нельзя.


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

naxac.gif

Share this post


Link to post
Share on other sites
gam    65

Подскажите плиз с какой частотой апдейтится функция function set_fastcall(const function<boolean>&, object) в милисекундах.

Share this post


Link to post
Share on other sites
Malandrinus    596

gam,

Вроде как с частотой кадров, т.е. точной частоты нет.

  • Полезно 1

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Share this post


Link to post
Share on other sites

Здрасьте.

 

Начал ковырять нетпакеты… По файлу [weap_data.script] из старого мода "Ночные прицелы" восстановил порядок и тип переменных, потом прочитал по одной с начала и с конца со сдвигом (lvid и condition) – результат сходится с тем, что выдают обычные функции.

https://drive.google.com/open?id=1LvustUkaKFNZWCMUUsZ0V-7Rms8RwfoF

 

Насколько я могу судить по записям на форуме, полученная таблица подходит только для типа предметов "огнестрельное оружие без гранатомета". Где можно найти аналогичную информацию (порядок и тип переменных) для нетпакетов NPC, брони, оружия с гранатометом и других типов игровых объектов? Можно ли эту информацию как-то получить из самого нетпакета, или в нем хранятся только значения, которые невозможно прочитать без знания их типов?

Share this post


Link to post
Share on other sites
Zander_driver    4,144
1 час назад, Norman Eisenherz сказал:

Где можно найти аналогичную информацию

В модулях Артоса, вроде как, параметры с названиями а не просто набором байт. Уж 10 лет как.

Или нужно нечто другое? Тогда я не понял, что именно.

  • Согласен 1

Тестеры о "Судьбе Зоны": Все это бегает, орет, гоняется друг за другом, попадает в аномалии. Я не знаю что там можно делать и в какой экипировке туда можно идти...

Имею мнение, что >90% модов на сталкер неиграбельны. Делаю свое, играбельное. Внимание: Если вы считаете что с модами на сталкер все ок, то в мое творение вам будет очень тяжко играть.

Share this post


Link to post
Share on other sites
dsh    2,640
6 hours ago, Norman Eisenherz said:

хранятся только значения, которые невозможно прочитать без знания их типов?

Именно так.

 

Уже все изобретено до вас. Найди m_netpk  и не изобретай велосипедов.

 

Вообще совет и не только тебе. Прочитайте эту и соседнии темы с самого начала.

  • Согласен 1

Share this post


Link to post
Share on other sites
Zander_driver    4,144
2 часа назад, dsh сказал:

Прочитайте эту и соседнии темы с самого начала.

Ох и добрый ты :)

 

Я бы другой совет дал бы. Не засиживаться на ванильном ТЧ, каким бы новичком и вообще не-программистом вы ни были. Устарел он, для 2020 года. И соотв-но, не тратить слишком уж время на прочтение того, что только для него актуально.


Тестеры о "Судьбе Зоны": Все это бегает, орет, гоняется друг за другом, попадает в аномалии. Я не знаю что там можно делать и в какой экипировке туда можно идти...

Имею мнение, что >90% модов на сталкер неиграбельны. Делаю свое, играбельное. Внимание: Если вы считаете что с модами на сталкер все ок, то в мое творение вам будет очень тяжко играть.

Share this post


Link to post
Share on other sites

@Zander_driver 

1. В OGSE есть обработчик [m_net_utils.script] – это те самые "модули Артоса"?

2. Я ни в коем случае не пытаюсь освоить современное программирование ковырянием игры 2007 года – я пытаюсь уменьшить количество "кочек" в игре, в которой приятно убивать время, для чего перебираю существующие моды и пытаюсь их повторить в той мере, в которой это подходит для моих целей. Готовые решения уровня "электросамокат с гироскопом, GPS и подсветкой дороги" не годятся, если мне нужна просто табуретка. Опять же, даже чужие функции надо изучить, чтобы понять причину ошибок и вылетов.

@dsh

1. Ссылка на [m_netpk.script] на GitHub у меня есть, но так как из этих черных ящиков под названием "нетпакеты" я пока докопался до начинки только одного, 3,5к строк кода я буду изучать долго.

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

 

Теперь практика: проверка состояния фонарика и ПНВ

Spoiler

function net_cse_alife_item_torch:__init(obj,mode)

self.st_props = {}
self.up_props = {
        { name = 'torch_flags',   type = 'u8',  default = -1 },


    _G.torch_flags = { --/ torch
        Active            = 1,
        NightVisionActive = 2,
        Attached          = 4

 

Вывод: переменная состояния фонарика имеет тип u8 и находится в начале раздела UPDATE.

 

Spoiler

    local item = db.actor:item_in_slot(9)
    if item then
        local sobj = alife():object(item:id())
        local pk = net_packet()
        sobj:UPDATE_Write(pk)
        pk:r_seek(0)
        local v = pk:r_u8()
        news_manager.send_tip(db.actor, v)
    end

 

Результат: 0 в любом состоянии.

 

Эксперимент: читаю аналогичное значение от конца раздела UPDATE через сдвиг pk:r_seek(pk:w_tell() -1). Результат: все выключено – 4, фонарик – 5, ПНВ – 6, все вместе – 7. Я не знаю, что именно я прочитал, но это точно переменная размером 1 байт, которая меняется при переключении режима фонарика и остается на указанном значении до следующего переключения. Ну и как сие понимать?

Share this post


Link to post
Share on other sites
abramcumner    879
8 минут назад, Norman Eisenherz сказал:

Ну и как сие понимать?

Прекратить заниматься ерундой и использовать таки m_netpk.script :)

 

Вывод: переменная состояния фонарика имеет тип

u8 и находится в начале раздела UPDATE.

Вывод неверный. Перед блоком переменных фонарика идут блоки переменных классов родителей.

  • Согласен 1
  • Полезно 1

Share this post


Link to post
Share on other sites
Zander_driver    4,144
2 часа назад, Norman Eisenherz сказал:

3,5к строк кода я буду изучать долго.

Ну, на здоровье.

Кто то берет готовый инструмент, и пробежав глазами инструкцию, сразу начинает пользоваться. А кто-то ковыряет месяцами то, что ему нигде и ни для чего не пригодится. Личное дело каждого.

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

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

Похоже, для вас совет dsh подойдет. Читайте темы в этом разделе, от корки до корки. На этот вопрос, ответы найдете.

 

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

Да, зачастую так оно и делалось. Хотите все это повторить - удачи и упорства вам.

 

  • Согласен 1

Тестеры о "Судьбе Зоны": Все это бегает, орет, гоняется друг за другом, попадает в аномалии. Я не знаю что там можно делать и в какой экипировке туда можно идти...

Имею мнение, что >90% модов на сталкер неиграбельны. Делаю свое, играбельное. Внимание: Если вы считаете что с модами на сталкер все ок, то в мое творение вам будет очень тяжко играть.

Share this post


Link to post
Share on other sites
Kirgudu    646

@Norman Eisenherz,

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

function get_torch_state()
	local torch = db.actor:object("device_torch")
	local s_obj = alife():object(torch:id())
	local pk = get_netpk(s_obj, 2)
	if pk:isOk() then
		local data = pk:get()
		return bit_and(data.upd.torch_flags, torch_flags.Active) ~= 0
	end
end

 

Что я сделал? Взял готовый модуль из https://www.amk-team.ru/forum/topic/13216-sborochnyy-ceh/?do=findComment&comment=971137, пробежал глазами скрипт на предмет того, где именно в нет-пакете лежат флаги фонарика согласно его классу - up_props, значит в update части нет-пакета, вспомнил по приложенной инструкции, как именно читать только update часть, и как в результатах она будет называться, накидал базовый скрипт для чтения текущего флага и сравнения его с флагом включения.

Естественно, ещё и модуль подключить надо, но на это есть исчерпывающие сведения в посте по вышеприведённой ссылке, как инструкция Артоса, так и дополнения к ней.

На всё потребовалось не больше 10 минут. Куда меньше, чем глубокое изучение трёх с половиной килострок кода.

Не изобретай велосипед - его уже вылизали со всех сторон за эти годы.

Edited by Kirgudu
  • Согласен 1

Share this post


Link to post
Share on other sites

Здрасьте.

 

Задача: записать текущее состояние STATE/UPDATE-пакетов оружия в слоте, удалить оружие, через несколько секунд (по инфо-поршню) отспавнить его снова и прочитать состояние. STATE-пакет успешно читается, пока объект переходит в онлайн, UPDATE-пакет не читается, поэтому режим стрельбы и все, что связано с гранатометом, грузится в состоянии по умолчанию.

Spoiler

		if item then
			local sect = item:section()
			local sobj = alife():object(item:id())
	-- запись данных в STATE- и UPDATE-пакеты
			local pk = net_packet()
			sobj:STATE_Write(pk)
			local pku = net_packet()
			sobj:UPDATE_Write(pku)
	-- переспавн
			alife():release(sobj)
			local act = db.actor
			local pos = act:position()
			pos.x = pos.x + 1
			local nobj = alife():create(sect, pos, act:level_vertex_id(), act:game_vertex_id())
			local id = nobj.id
	-- чтение данных из STATE-пакета
			local size = pk:w_tell()
			pk:r_seek(0)
			nobj:STATE_Read(pk, size)
				-- news_manager.send_tip(db.actor, "pk: " .. size)
	-- чтение данных из UPDATE-пакета
			local size = pku:w_tell()
			pku:r_seek(0)
			nobj:UPDATE_Read(pku)
				-- news_manager.send_tip(db.actor, "pku: " .. size)

	-- отслеживание ввода в онлайн и перенос
			local function online()
				return level.object_by_id(id)
			end

			local function pick()
				local item = level.object_by_id(id)
				db.actor:transfer_item(item, db.actor)
			end

			level.add_call(online, pick)
		end

 

 

Попадалось упоминание о том, что данные из обоих пакетов пишутся в объект при выходе последнего в онлайн, то есть и UPDATE-пакет надо писать в серверный объект, а клиентский объект получит данные из него. Ставил функцию UPDATE_Read и до, и после выхода объекта в онлайн – никакого эффекта. Проверял содержимое исходного UPDATE-пакета – данные записываются правильно: например, grenade_mode = 1 (r_u8 от позиции 0), если был выбран подствольник.

 

Как правильно переносить данные UPDATE-пакета?

Share this post


Link to post
Share on other sites
abramcumner    879

Для начала попробуй после строк:

            local nobj = alife():create(sect, pos, act:level_vertex_id(), act:game_vertex_id())
            local id = nobj.id

вставить строку:

nobj = alife():object(id)

alife():create возвращает объект типа чуть ли не cse_abstract, и методы State_Read/Update_Read вызываются для этого типа.

alife():object возвращает реальный тип, какой-нибудь cse_alife_weapon_magazined_wgl. Соответственно State_Read/Update_Read вызовутся от него и заполнят grenade_mode.

Edited by abramcumner
  • Полезно 2

Share this post


Link to post
Share on other sites

@abramcumner Проверил clsid с указанными изменениями и без: определяется как "127", то есть "wpn_groza_s" – гранатомет уже должен быть. На чтении UPDATE-пакета изменения не сказались.

 

Еще вопрос: если требуется изменить одну переменную в конце нетпакета, обязательно ли читать его весь или можно как-то сдвигать позицию записи не только от начала через w_begin(), но и от конца пакета?

Share this post


Link to post
Share on other sites
naxac    1,399

 

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

можно как-то сдвигать позицию записи не только от начала через w_begin(), но и от конца пакета?

Нет. Сдвигать только через r/w_seek() от текущей позиции чтения/записи. w_begin() - это поставить позицию записи в начало пакета и записать два байта.


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

naxac.gif

Share this post


Link to post
Share on other sites
WinCap    134
В 25.02.2020 в 18:19, Norman Eisenherz сказал:

все, что связано с гранатометом, грузится в состоянии по умолчанию

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

В серверном, есть только переменная grenade_mode и в клиентский она передается, но её применение к оружию происходит, если я не ошибаюсь, только когда оно в руках.

В приведенном примере section объекта одинаковая, может его не release/create, а transfer'ить в какой-нибудь секретный ящик и обратно?

Share this post


Link to post
Share on other sites

@WinCap

1. Это как раз текущая реализация мода: на время торговли/обыска оружие как оно есть улетает во временный ящик. С правильно расставленными отсрочками предметы не теряются на полпути, даже если окно обыска было случайно закрыто через долю секунды, но переспавн, если верить форуму, занимает всего около 20 циклов, тогда как с ящиком и переносом требуется не меньше 100, иначе вылет с потерянным родителем в логе.

2. Есть все-таки в игре рабочий метод переноса данных из UPDATE-пакета в объект или нет?

Share this post


Link to post
Share on other sites

По прошлой теме: посмотрел OGSE 0.6.9.3. с патчами от февраля 2018 года – при замене прицела на оружии с гранатометом режим стрельбы сбрасывается на "авто", режим гранатомета отключается, гранаты и патроны в качестве "костыля" переспавниваются в инвентарь. Видимо, ответ на вопрос № 2 отрицательный…

 

Другая задача: есть способ создания виртуального LTX-файла через create_ini_file(string). Сам файл создать получается, прочитать из него выбранные строки – тоже, но при попытке создать предмет на основе указанной в файле секции случается вылет с ошибкой "секция не найдена". Идея в том, чтобы временно получить броню со статусом quest_item = true, не прописывая новую секцию для каждого вида брони вручную. Как правильно сослаться на виртуальный LTX-файл и возможен ли такой спавн в принципе?

Spoiler

		local item = db.actor:item_in_slot(6)
		if item then
			local sect = item:section()

			local strings = {
				"#include \"misc\\outfit.ltx\"",
				"[" .. sect .. "_q]:" .. sect,
				"description = test",
				"quest_item = true"
					}

			local text = table.concat(strings, "\n")
			local ini = create_ini_file(text)

			local act = db.actor
			local pos = act:position()
			pos.x = pos.x + 1
			local spawn = alife():create(sect .. "_q", pos, act:level_vertex_id(), act:game_vertex_id())
		end

 

 

Edited by Norman Eisenherz
  • Haha 1

Share this post


Link to post
Share on other sites
Zander_driver    4,144
только что, Norman Eisenherz сказал:

от февраля 2018 года

Даже стесняюсь спросить, а какой же год у нас на дворе...


Тестеры о "Судьбе Зоны": Все это бегает, орет, гоняется друг за другом, попадает в аномалии. Я не знаю что там можно делать и в какой экипировке туда можно идти...

Имею мнение, что >90% модов на сталкер неиграбельны. Делаю свое, играбельное. Внимание: Если вы считаете что с модами на сталкер все ок, то в мое творение вам будет очень тяжко играть.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

AMK-Team.ru

×
×
  • Create New...