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

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

А в чем смысл такого способа записи в нет-пакет с помощью UPDATE_Write ? Просто, сколько читаю разделы форума, ни разу не попадался такой вариант заполнения нет-пакета данными. Объясните плиз.

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

AndreySol, в ЗП позиция записи при создании пакета не обязательно автоматически установится в ноль. Поэтому приходится устанавливать ее вручную. Или тебя смущает применение метода update_write?

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

AndreySol, хм, и где ты увидел нечто такое, чего не встречал ранее? Ни разу не видел, что перед записью параметров объекта нет-пакету прописывается "писать от начала"? Прям почти как в басне: "Слона то я и не приметил"

В самой оригинальной игре и в 90% модов вообще нет записи/чтения UPDATE_Write/Read - поэтому тебя бы спросить на кой тебе он сдался и чего ты к нему прилип? ;-)

 

KD87, (уточно и дополню) не только в ЗП, но и в ЧН нет-пакеты далеко не всегда объявляются с началом от 0-го ... Да еще и в ТЧ вскорости предстоит нам такое же наблюдать, так что пора привыкать как "правильно", а не как легче.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
в ЗП позиция записи при создании пакета не обязательно автоматически установится в ноль. Поэтому приходится устанавливать ее вручную. Или тебя смущает применение метода update_write?

Ах вон оно что ! Такой финт - просто способ подстраховаться на случай неверной установки позиции самим движком. А я уж подумал что он имеет какой-то сакральный смысл, который я никак понять не могу из пояснений Artos'а.

 

Заготовка, предложенная Artos'ом - не полностью рабочая. При переключении на подствол, таблица не заполняется и все поля nil. Оказалось, из-за того что, num_items равно 1. Получилось, что это и есть флаг вкл\выкл подствола. Поменял считывание параметров местами - все заработало как надо.

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

AndreySol, твоя слепота и глухота удивляют ... Для кого было написано это:

1. При получении чистого нет-пакета ( pk = net_packet() ) важно(!) точно знать где установлена позиция записи ( pk:w_tell() ), т.к. последующая запись параметров объекта (в данном случае оружия) будет записываться именно с этим смещением. Если для чистого ТЧ это значеник как правило равно 0, то для ЧН/ЗП они нередко совершенно иные. Да и ... для ТЧ ничто не гарантирует, что будет записываться именно с нулевой позиции.

Т.о. нормальный программер/модмейкер сам установит позицию чтения (например pk:begin(0) ) и будет считывать именно от установленной позиции (в примере это будет +2 => pk:r_seek(2) ), а не полагаться на удачу ...

или ты отсюда только pk:begin(0) удосужился скопипастить, не утруждая чтением сути?

 

И неужели не доходит даже русским языком прописанное в комменте заготовки:

--/ читать пакет нужно более продвинутым способом!
? и, пытаясь в очередной раз "поменять считывание параметров" :dash2: ты получаешь видимость результата, а не сам результат.

 

На этом заканчиваем! Учитывая, что пока кураторские опции недоступны - буду просто минусовать подобные посты (может это заставит вначале читать и думать), а почищу позже ...

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Нашел в оригинальном ТЧ вот ткаую функцию, когда на блокпосте Долга в баре у главного спрашиваешь о местных достопримечательностях:

function locate_bar_bar(actor,npc)

 

local sim = alife()

 

if sim == nil then

 

return

 

end

 

local obj = sim:story_object(570)

 

if obj then

 

level.map_add_object_spot(obj.id, "crlc_small", "bar_bar_locator")

 

end

 

end

 

Скажите, ка использовать ее в своих целях? Я понимаю что через <action></action>, но я не понимаю какие условия нужно предоставить, что бы отметка появилась на нужной мне области?

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

Magnus1,

Во-первых, никто не знает о "твоих целях", поэтому про как использовать можно писать трактаты.

Во-вторых, при чем тут тэги <action>? function locate_bar_bar(actor,npc) - обычная в общем то функция и использовать ее можно откуда угодно, хоть из диалогов, хоть напрямую из скриптов. Условие же тоже обычное: раз функция ждет аргументы - то ты и обязан их дать.

По коду видно, что первый аргумент ('actor') - не используется, а вот вторым ('npc') ты должен давать клиентский объект непися.

Замечу, что функция работатет ТОЛЬКО для НПС, имеющего стори-ид 570, и если захотелось для своих целей использовать нечто иное - потребуется сдублировать функцию, проставив в нее свой story_id, или же видоизменить ее и задавать нужный аргументом на входе.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

AndreySol, да никакой это не флаг подствола. Когда num_items не нулевой, перед куском пакета cse_alife_item_weapon есть еще апдейт-параметры cse_alife_inventory_item. Верно тебе Artos говорит - читаешь не правильно и не хочешь разбираться. Смотри код acdc, там все это есть. Или пользуйся готовыми модулями разбора нет-пакета.

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

Artos, вообще я имел ввиду, как мне можно с помощью этой функции(ну или подобной этой) вывести такую же отметку на карту. Именно вот на определенный участок. Что мне нужно сделать помимо вызова такого скрипта?

 

Artos, вообще я имел ввиду, как мне можно с помощью этой функции(ну или подобной этой) вывести такую же отметку на карту. Именно вот на определенный участок. Что мне нужно сделать помимо вызова такой функции?

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

Magnus1, вообще эта функция ставит метку НЕ на карту/участок, а на НПС с заданным сидом (story_id).

Как уже выше пояснил, именно эту функцию ты не можешь использовать для других (отличных от 570) сидов и требуется написать свой аналог.

Например такой:


function locate_my_npc(story_id,npc)
local sim = alife()
if sim and type(story_id) == 'number' then
local obj = sim:story_object(story_id)
if obj then
level.map_add_object_spot(obj.id, "crlc_small", "my_NPC_locator")
end
end
end

- где 1-м аргументом идет требуемый сид, а за ним объект проверяемого НПС.

И более ничего не требуется, кроме вызова этой функции с заданными аргументами из требуемого места.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
да никакой это не флаг подствола. Когда num_items не нулевой, перед куском пакета cse_alife_item_weapon есть еще апдейт-параметры cse_alife_inventory_item.

Получается, что при переключении на подствол, меняется структура нет-пакета ?

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

AndreySol, структура пакета меняется в данном случае в зависимости от upd:num_items. Какие действия в игре меняют этот параметр объекта - сказать не могу.

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

Вынужден признать, что опять наступил на грабли, в которые почти год назад наступали в топике по Lua. Разработчики игры (GSC) именно для оружия с подствольниками учудили оружейный параметр вставить в самое начало, а не пристыковать к "оружейной секции". Т.о. именно его нужно считывать первым, а уже за ним остальное. Это единственное исключение из правил, когда секция параметров разорвана.

Правленый пример выглядит так:


local np = net_packet() --/ получаем 'чистый' нет-пакет
np:w_begin(0) --/ писАть будем в самое начало (+2 байта)
se_obj:UPDATE_Write(np)
np:r_seek(2) --/ ставим чтение на 3-й байт, пропуская первые два
table_param = {} --/ писать параметры будем сюда
--/ для 'с подствольниками' считываем их первый параметр
if clsid_sobj == clsid.wpn_ak74_s or clsid_sobj == clsid.wpn_groza_s then
table_param["upd_grenade_mode"] = np:r_u8()
end
local num_items = np:r_u8() --/ первый параметр секции 'cse_alife_inventory_item'
if num_items == 0 then --/ если 0 - то далее следуют 'оружейные' параметры
--/ читаем общие для всего оружия параметры
table_param["upd_condition"] = np:r_u8()
table_param["upd_weapon_flags"] = np:r_u8()
table_param["upd_ammo_elapsed"] = np:r_u16()
table_param["upd_addon_flags"] = np:r_u8()
table_param["upd_ammo_type"] = np:r_u8()
table_param["upd_weapon_state"] = np:r_u8()
table_param["upd_weapon_zoom"] = np:r_u8()
table_param["upd_current_fire_mode"] = np:r_u8()
else
--/ читать пакет нужно более продвинутым способом!
end

 

AndreySol, структура пакета НЕ меняется, а меняется ее наполнение, т.е. кол-во байт и их значения зависят и от считанного num_items, увеличиваясь в кол-ве при неравенстве этого параметра нулю.

 

KD87, в игре update-параметры оружия и в частности upd:num_items меняются в динамических ситуациях, когда оружие перемещается 'само-по-себе' (не имея владельца или независимо от него, в моменты хитов/смерти) или при смене аддонов/стрельбе/перезарядке/... и укладывается в пару текущих апдейтов игры. Т.о. наполнение пакета зависит от времени/ситуации...

Изменено пользователем Artos
  • Спасибо 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Свет в конце туннеля начинает усиливаться :ny_ph34r_1:

Еще несколько вопросов по нет-пекетам и не только:

 

 

- к примеру в скрипте se_item.script можно для класса se_weapon_magazined добавить метод:

 
function se_weapon_magazined:STATE_Write(packet)
cse_alife_item_weapon_magazined.STATE_Write(self, packet)
................
end

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

 

Экспериментировал с установкой параметров объектам через нет-пакет с переключением он-офф-он лайн, использовал модуль Artos'а.

Выяснил, что обект, выложенный в какой-нить ящик переключить в офф-лайн не возможно. А если сам ящик переключить он-офф-он лайн ? Его содержимое, имеющее "разрешение" на переход в офф-он то-же переключится ?

 

Еще обнаружил, что чем ближе предмет, который пытаемся переключить он-офф-он лайн, к актору(ГГ) тем хуже это получается - иногда параметры которые пытаюсь менять для теста не изменяются, или предмет не отрабатывает переключение с первого раза. Это особенность движка или же нужно смотреть в сторону object_flags ?

 

Извиняюсь если уже достал, но как говорится "пока масть пошла..."

 

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

AndreySol, можно, почему же нельзя. C секцией M_SPAWN можно работать с помощью STATE_Read/STATE_Write, с M_UPDATE - UPDATE_Read/UPDATE_Write.

Барахло в ящике может переходить в оффлайн только с ящиком. А ящики в сталкере (в модах, точнее) не переключаются в оффлайн (из-за acdc). В свое время bardak боролся с тормозами при переводе в онлайн ящиков с барахлом путем модифицирования object_flags этих ящиков при перепаковке спавна. С тех пор во всех версиях acdc это модифицирование и осталось.

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

Отвечу иначе чем KD87:

И добавить НЕЛЬЗЯ, т.к. метод se_weapon_magazined:STATE_Write(packet) изначально существует (унаследован) конструктором класса, а значит можно только ЗАМЕНИТЬ на свой.

И читать с помощью вытащенного наружу метода можно, но ... осторожно. ;-)

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

Да и, еще немало удивлялок ждет "читателя", обнаружив что время (не)читать тоже нужно как-то определять. ;-)

И, AndreySol, не нужно "нас/нами" о своих потугах писать. И не Николай II, вроде как ты, и нам не ведомо, что и как ты там "пытаемся переключить". да еще с какого-то "первого" раза.

Переключения он-офф-лайн синхронизированы с апдейтами игры и конечно же периоды для каждого предмета зависят от расстояния до актора. О каком-то "с первого раза" мне вообще неясно ... да и не стОит пояснять, т.к. у меня уже "масть пропала", а чревато еще на пару-тройку страниц растолковываний. Так что я - "пас"... домучивай далее по крайней мере без меня.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Всем привет! Подскажите, пожалуйста, можно ли как то отследить открытие инвентаря мёртвого npc главным героем? ЗП

Реклама любых модов бесплатно на моём

сайте писать в личку

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

serega-gamer, вопрос для топиков по ковырянию, куда и следует его адресовать.

Отследить можно:

- при обыске тела срабатывает коллбэк 'use_callback' и соответственно работает схема "use" (xr_use.script);

- при открытии окна при обыске тела выдается инфопоршень "ui_car_body", а при его закрытии - "ui_car_body_hide".

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos В ЗП эти поршни не работают, их даже нет в xrGame.dll и так же нету скрипта xr_use :( . Извеняюсь что не туда написал.

Реклама любых модов бесплатно на моём

сайте писать в личку

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

Artos, (по первому) а как тогда в симбионе работают подобного рода проверки?(н-р isGrenade)

 

Просто как ты говоришь - я так и делал,

Но работает не так как мне надо.

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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