Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Artos 99 Опубликовано 7 Сентября 2012 Поделиться Опубликовано 7 Сентября 2012 (изменено) "Работает нормально" - не находишь подобное определение смахивающим на "лишь бы работало - а остальное не важно"? Цель замечания как раз в том, чтобы не просто "лишь бы работало", а все же как правильно писать скрипты/алгоритмы ... Привести тебе примеры ситуаций? Да возьми половину игроков, которые таскают в рюкзаках десятками-сотнями пачки патронов, аптечек, жратвы и т.п. И при подсчете веса для каждого из этой сотни предметов идет чтение конфигов и подсчет ... Это ты называешь нормально? Тогда уж давай в кодах исключим опереторы умножения и деления и бум "нормально" складывать и вычитать... На апдейтах то как раз многие и применяют подобное, посмотри в модах "ограничители" веса. Если же делать такие проверки "как бы разово", например на коллбэках "on_take", то представь какая катавасия будет, если взять из трупа/ящика "все разом". т.е. когда циклы перебора предметов инвентаря вызываются не один раз... ;-) Изменено 7 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726448
IQDDD 5 Опубликовано 7 Сентября 2012 Поделиться Опубликовано 7 Сентября 2012 Под "нормально" я имею ввиду что производительность страдает в пределах нормы (если вешать не на апдейт, а на коллбеки). Ну наблюдаем небольшую задержку при взятии бальшой-бальшой кучи предметов. Терпимо. Как при переходе нескольких сталкеров в онлайн. А чтобы пачек патронов слишком много не было, то надо перепаковщик. И никак не будет сотен пачек патронов. "Работает нормально" - не находишь подобное определение смахивающим на "лишь бы работало - а остальное не важно"? Нахожу. И чё дальше? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726530
Nazgool 251 Опубликовано 7 Сентября 2012 Поделиться Опубликовано 7 Сентября 2012 Ну наблюдаем небольшую задержку при взятии бальшой-бальшой кучи предметов Есть же coroutine. Можно растянуть по времени взятие такого количества единиц предметов. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726537
Artos 99 Опубликовано 7 Сентября 2012 Поделиться Опубликовано 7 Сентября 2012 (изменено) А дальше, раз уж назвался груздем, стОит довести предлагаемый код до "ненормального" состояния: а) добавить отсутствующую функцию find_symb, без которой и нормально то воспользоваться кодом невозможно ... б) учтя замечания, добавить кеширование ... в) несложными добавками снять лейбл "only CoP" - вот тогда определение "нормально" вполне подойдет для "школьного" примера и в качестве урока "Учимся определять вес инвентаря" для соотв.топика. ;-) Gun12, перепрочти затронутую тему ... Какое тут coroutine? Ты собираешься движку сказать ... подождика до следцующего цикла апдейта, мы еще эти взятые предметы не обработали ... ;-) А чтобы не наблюдать небольших задержек, алгоритм скрипта должен писаться не в отрыве (работает и ладно), а с учетом реальной игры и имеющихся возможностей оптимизиции. Тогда при создании глобального мода не придется перетряхивать и переписывать написанное ранее. Изменено 7 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726538
AndreySol 215 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 (изменено) чистая ТЧ 1.0004 Есть такой вот фрагмент кода, вызывается на апдейтах актора, отслеживает состояние активного оружия ...................local np = net_packet()sobj:UPDATE_Write(np) if np == nil then return nilendlocal table_param = {}local clsid_sobj = sobj:clsid()np:r_seek(0)if clsid_sobj == clsid.wpn_ak74_s or clsid_sobj == clsid.wpn_groza_s then np:r_seek(2)elseif clsid_sobj == clsid.wpn_shotgun_s or clsid_sobj == clsid.wpn_bm16_s or clsid_sobj == clsid.wpn_rg6_s then np:r_seek(?????)else np:r_seek(1)endtable_param = {["upd_condition"] = np:r_u8(),["upd_weapon_flags"] = np:r_u8(),["upd_ammo_elapsed"] = np:r_u16(),["upd_addon_flags"] = np:r_u8(),["upd_ammo_type"] = np:r_u8(),["upd_weapon_state"] = np:r_u8(),["upd_weapon_zoom"] = np:r_u8()}if table_param["upd_weapon_state"] == 3 then local msg = "Перезаряжаем" news_manager.send_tip(db.actor, msg, nil, nil, 30000)end................. Для всего оружия кроме дробовиков работает вроде нормально, а вот для дробовиков нет - не могу понять какое значение смещения в np:r_seek(?????) надо выставить. Подскажите, кто знает ? Изменено 8 Сентября 2012 пользователем ColR_iT Про спойлер так же не забываем. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726748
KD87 720 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 (изменено) AndreySol, если начинаешь читать с upd:condition, тогда ставь нуль. Изменено 8 Сентября 2012 пользователем KD87 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726769
AndreySol 215 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 Да пробовал, с 0 и выше, до 15 дошел - без толку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726775
Artos 99 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 (изменено) Все же уточню, дабы и другие не наступали на те же грабли .. Для всех оружейных классов, кроме "с подствольниками" ( "cse_alife_item_weapon_magazined_w_gl") оружейные параметры в нет-пакете начинаются с параметра 'condition'. Для классов с подствольниками - впереди имеется параметр 'grenade_mode' (u8) . В примере кода AndreySol, все ошибочно. 1. Читать "оружейные" байты следует не от самого начала нет-пакета, а после секции параметров 'cse_alife_inventory_item'. Учитывая, что довольно затруднительно навскидку определить их кол-во - гораздо легче брать байты не сначала, а с конца прочитанного пакета. 2. Для подствольников после параметров от 'cse_alife_inventory_item' требуется смешение +1 (u8), а не +2, для остальных - 0. Ничем в этом случае "дробовики" (класс 'cse_alife_item_weapon_shotgun') не отличаются от остальных, просто у них есть свой заключительный параметр 'ammo_ids', который в данном примере кода не читается и не влияет на результат. 'cse_alife_inventory_item'. 'cse_alife_inventory_item'. P.S. Для чего изобретать свой велосипед? ... и не имея навыков по теме, даже не смотреть на уже готовые примеры... Изменено 8 Сентября 2012 пользователем Artos 2 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726785
Zander_driver 10 348 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 P.S. Для чего изобретать свой велосипед? ... и не имея навыков по теме, даже не смотреть на уже готовые примеры... Не соглашусь Если бы никто не занимался изобретением велосипедов, то в моддинге давным-давно остались бы единицы, для пересчета которых хватило бы пальцев одной руки. Не приходило ли вам в голову, что многим может быть процесс самостоятельного познания и поиска интереснее, чем получение конечного результата? 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726949
AndreySol 215 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 Подправил код, все нормально работает. local clsid_sobj = sobj:clsid() np = net_packet() sobj:UPDATE_Write(np) if np == nil then return nil end np:r_seek(0) -- уст. позицию чтения данных в начало нет-пакета -- if clsid_sobj == clsid.wpn_ak74_s or clsid_sobj == clsid.wpn_groza_s then -- для 'cse_alife_item_weapon_magazined_w_gl' -- table_param = {["upd_grenade_mode"] = np:r_u8()} end -- для остальных серверных классов -- table_param = {["upd_current_fire_mode"] = np:r_u8(), ["upd_condition"] = np:r_u8(), ["upd_weapon_flags"] = np:r_u8(), ["upd_ammo_elapsed"] = np:r_u16(), ["upd_addon_flags"] = np:r_u8(), ["upd_ammo_type"] = np:r_u8(), ["upd_weapon_state"] = np:r_u8(), ["upd_weapon_zoom"] = np:r_u8(), ["upd_ammo_current"] = np:r_u16()} С дробовиками то-же вроде нормально. Просто проверял из всех параметров только интересовавший меня на тот момент "upd_weapon_state" на значение 3 - это перезарядка, а оно для дробовиков почему-то не выставляется. Хотя другие значения вроде норм. Artos'у Не очень понял, отчего-же "все ошибочно" если работает нормально ? "читать байты следует не от самого начала нет-пакета, а после секции параметров 'cse_alife_inventory_item'" - Вы наверное не обратили внимания, что используется UPDATE_Write, для заполнения нет-пакета, а он похоже не читает 'cse_alife_inventory_item'. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726958
KD87 720 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 (изменено) AndreySol, читает-читает. Если скрипт выдает похожие на правду значения - это случайность. Учитывать cse_alife_inventory_item - обязательно. оно для дробовиков почему-то не выставляетсяНу вот и подтверждение. Изменено 8 Сентября 2012 пользователем KD87 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726962
Artos 99 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 (изменено) Zander_driver Не приходило ли вам в голову, что многим может быть процесс самостоятельного познания и поиска интереснее, чем получение конечного результата? Как раз и не приходит, т.к. самостоятельно изобрестать велосипед - глупость и не более того. Собственно и фраза эта имеет подтекстом не прямое толкование, а аллегорию о: «Изобретать велосипед» — пытаться изобрести заново конструкцию, которая уже давно всем известна, отлично отработана, и совершенна в том смысле, что не содержит практически ничего лишнего и полностью соответствует своим задачам. Иногда вместо слова «велосипед» употребляется слово «колесо». Познание - это совершенно иное и в-первую очередь как раз и подразумевает изучение/постижение уже доступных знаний и на их базе (если годятся) - продвижение вперед. В данном случае, как раз обратное ... игнорирование уже имеющихся знаний/наработок, игнорирование необходимости изучить/понять основы и суть темы (формат нет-пакета и правила работы с ним) и попытка перескочить сразу к некоему конечному результату. Смахивает все это на неуклюжую попытку сделать даже не самостоятельно, а по-своему, не утруждая себя рутиной познания ... что и приводит автора вопроса к постоянным переспрашиваниям чуть ли не факовых вопросов. О каком познании и самостоятельности тут можно вести речь? Уже десяток раз тут повторялось именно в адрес автора вопроса - читаем статьи и изучаем ФАК, дабы не спрашивать в 'дцатый раз одно и то же ... AndreySol, у нас с тобою диаметрально противоположные понятия к слову "нормально" ... Когда ты все же поймешь что-такое нет-пакет, его формат и правила его чтения/записи - тогда поймешь, что в твоем случае была нормальная ошибка наступившего в очередной раз на грабли. Расписывать тут статью про нет-пакеты не вижу необходимости и смысла, все есть на вики-сайтах. Вы наверное не обратили внимания, что используется UPDATE_Write, для заполнения нет-пакета, а он похоже не читает 'cse_alife_inventory_item'. В отличии от Вас, обратил внимание не только на это... и оперирую не предполагалками, а знаниями, доступными и Вам (нужно их только прочесть и понять), и практикой. Изменено 8 Сентября 2012 пользователем Artos 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726963
Artos 99 Опубликовано 8 Сентября 2012 Поделиться Опубликовано 8 Сентября 2012 (изменено) ... отчего-же "все ошибочно" ...? раз раздел "Школа" - устроим небольшой разбор "полетов": - про нет--пакеты выше уже сказано и, если такая "нормальность" устраивает - далее можно не читать. - на какой ляд эти строки(?): if np == nil then return nil end Неужели полученный нет-пакет может быть неопределен? Это даже не подстраховка, а неумелый копипаст ... - далее: table_param = {["upd_grenade_mode"] = np:r_u8()} - поздравляю, все параметры нет пакета пакет уместились в один ... - еще далее - эта же таблица затирается новыми "нормальными" значениями ... ну что тут можно сказать ... как вообще у Вас это "работает" и не вылетает, разве только то, что читаете абы какие байты и в результате все одно не важно - заряжает/перезаряжает иль вообще ничего не делает. Можно только констатировать, что фатальных ошибок в коде нет, как и толку никакого от такого кода, ни в плане получения результата, ни в плане получения познаний. Изменено 8 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-726968
AndreySol 215 Опубликовано 9 Сентября 2012 Поделиться Опубликовано 9 Сентября 2012 - далее: table_param= {["upd_grenade_mode"] = np:r_u8()} - поздравляю, все параметры нет пакета пакет уместились в один ... почему в один ? Цитата из "Справочника ..." : "Значение читается из буфера начиная с текущей позиции чтения, а позиция чтения увеличивается на размер читаемого значения. ..... 8, 16, 24, 32, 64 - один, два, три, четыре, восемь байт соответственно Устанавливаем позицию чтения в 0: np:r_seek(0), затем читаем один байт, указатель смещается на этот 1 байт. Что-ж тут неправильного ? - еще далее - эта же таблица затирается новыми "нормальными" значениями Очепятался, бывает. Поздно было, не доглядел. Исправил уже. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-727087
Struck 61 Опубликовано 9 Сентября 2012 Поделиться Опубликовано 9 Сентября 2012 (изменено) Первый вопрос: Как отследить class id оружия из которого было произведено убийство? Просто как не бился все равно вылетает "actor79", и кстати почему 79, а в lua_help.script указан индекс равный 78? Второй вопрос: Как можно перенести менеджер тайников из ЗП в ТЧ? Или написать что-то подобное? Третий вопрос: Есть ли 'hit callback' для актора, делал по аналогии - ничего не работало, его действительно нет, или я что-то не так делаю? Версия игры: ТЧ 1.0004 Изменено 9 Сентября 2012 пользователем Struck Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-727145
AndreySol 215 Опубликовано 9 Сентября 2012 Поделиться Опубликовано 9 Сентября 2012 (изменено) Все-же хочу разобраться с нет-пакетами. Сейчас код выглядит так: local table_param = {} local clsid_sobj = sobj:clsid() np = net_packet() sobj:UPDATE_Write(np) np:r_seek(0) -- уст. позицию чтения данных в начало нет-пакета -- if clsid_sobj == clsid.wpn_ak74_s or clsid_sobj == clsid.wpn_groza_s then -- для 'cse_alife_item_weapon_magazined_w_gl' -- table_param["upd_grenade_mode"] = np:r_u8() end -- для остальных серверных классов -- table_param["upd_current_fire_mode"] = np:r_u8() 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_ammo_current"] = np:r_u16() Делаю проверку для АК-74, в мегазине 25 простых патронов, навешен подствол (не заряженный), в инвентаре есть пачка на 15 БП к нему. Значения, полученные для него: upd_grenade_mode = 0, upd_ammo_elapsed = 25, upd_addon_flags = 2, upd_ammo_type = 0, upd_weapon_zoom = 0. Отстреливаю 5 патронов - upd_ammo_elapsed = 20, перехожу в режим прицеливания - upd_weapon_zoom = 1. Затем переключаюсь на подствол - upd_grenade_mode = 1, upd_ammo_elapsed = 0. Перезаряжаю подствол - upd_ammo_elapsed = 1. Далее возвращаюсь в режим обычной стрельбы и перезаряжаюсь со сменой типа патронов - upd_ammo_elapsed = 15, upd_ammo_type = 1. Для пистолета и СПАС-12 все параметры то-же соответствуют реальности. С upd_weapon_state пока досконально не разбирался, сложно все флаги отследить. Разве можно так случайно и неверно читать данные из нет-пакета, чтобы "ошибочно" получать такие адекватные значения ? Осталось пока несколько непоняток: одна глобальная - в чем разница между State и Update частями пакета - думаю что State используется для сохранения состояния объекта при сохранении самой игры, а Update для синхронизации клиентской и серверной частей обекта в процессе игры. ??? С upd_weapon_state. Проверял этот параметр просто по числовому значению, опытным путем выяснил, что 3 соответствует перезарядке для всех оружий, кроме дробовиков(cse_alife_item_weapon_shotgun). 0 - idle-состояние, 6 - оружие убрано(strapped). Понимаю что этот параметр - набор битовых флагов, знать-бы их раскладку в соответствии с состояниями оружия. С upd_current_fire_mode - по идее должен отражать в себе режим стрельбы ? Почему-то всегда 0. upd_ammo_current - что вообще означает ? Текущий патрон в стволе ? Имеет 2 байта - что в них ? Изменено 9 Сентября 2012 пользователем AndreySol Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-727152
Artos 99 Опубликовано 9 Сентября 2012 Поделиться Опубликовано 9 Сентября 2012 (изменено) Srtuck 1. убивает не оружие, а тот, кто его применяет. Т.о. если требуется отследить класс оружия из которого убит - отслеживай в момент смерти убивца и по активному оружию в его руках/лапах - определяй класс. Другого варианта движек игры не позволяет. Ну то, что class_id твоего актора сместился - говорит о том, что играешь не в оригинальную игру, а в модификацию игры, в которой добавлен некий доп.класс, идентификатор которого сместил в таблице идентификатор класса актора. 2. Можно, написав подобное. Дерзай. 3. Извини, но 'hit callback' - это нечто из твоих додумок и простому смертному аналогию провести сложно, тем более еще чтобы и работало. Проясни для нас дремучих, если ответ еще восстребован. AndreySol, хотеть не вредно, но разбираться в твоих гаданиях на кофейной гуще лучше делать не в топике по скриптам... Ничего общего с темой топика это не имеет. Указывать в очередной раз на то, что необходимо понимать сущность того, с чем захотелось разбираться (в данном случае нет-пакеты), очевидно бессмысленно, ты этого не понимаешь. Укажу только на то, что для других может иметь смысл и значение: 1. При получении чистого нет-пакета ( pk = net_packet() ) важно(!) точно знать где установлена позиция записи ( pk:w_tell() ), т.к. последующая запись параметров объекта (в данном случае оружия) будет записываться именно с этим смещением. Если для чистого ТЧ это значеник как правило равно 0, то для ЧН/ЗП они нередко совершенно иные. Да и ... для ТЧ ничто не гарантирует, что будет записываться именно с нулевой позиции. Т.о. нормальный программер/модмейкер сам установит позицию чтения (например pk:begin(0) ) и будет считывать именно от установленной позиции (в примере это будет +2 => pk:r_seek(2) ), а не полагаться на удачу ... 2. Как ранее тут говорилось, для оружия update-параметры начитаются с параметров класса 'cse_alife_inventory_item' и первым идет параметр 'num_items' (название условное). Этот параметр имеет размер в один байт (h8) и в общем случае как правило равен 0. В этом случае остальные параметры секции отсутствуют, но это частный(!) случай. Т.о. в примере потуг написать код AndreySol выходит следующее: 1. Учитывая, что он кодит для ТЧ, параметры в нет-пакет дефолтно записываются с нулевой позиции, что не гарантированно для вариаций других движков. 2. Допуская очередную ошибку в последовательности чтения байтов из пакета, т.е. считывая в самом начале некий однобайтовый 'upd_current_fire_mode' - тем самым считывается именно 'num_items' ... и при условии равенства его нулю, все дальнейшее уже идет по порядку. Если 'num_items' не будет равен 0, то все дальнейшее накрывается медным тазом... Полагаться ли на подобные извраты и условности - решать конечно самим модмейкерам, но ... не советовал бы гадат на кофейной гуще и в последствии выкидывать "наработанное", сожалея о потеряном времени. Вот так, совершая ошибки и глупости, можно получать вроде как "нормальные" результаты, а потом гадать и в очередной раз вопрошать в форумах, отчего все так забаговано ... Изменено 9 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-727204
AndreySol 215 Опубликовано 10 Сентября 2012 Поделиться Опубликовано 10 Сентября 2012 установит позицию чтения (например pk:begin(0) ) и будет считывать именно от установленной позиции (в примере это будет +2 => pk:r_seek(2) ), pk:begin(0) - видимо очепятка, а использование r_begin у меня приводит к подвисанию и вылету. Разве r_seek не устанавливает новую позицию чтения по любому с 0 ? Код исправил, теперь выглядит так: se_obj:UPDATE_Write(np) np:r_seek(2) 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() if clsid_sobj == clsid.wpn_ak74_s or clsid_sobj == clsid.wpn_groza_s then table_param["upd_grenade_mode"] = np:r_u8() end Для оружия с подстволами значения нормальные, кроме "upd_grenade_mode" - всегда 0. Опять что-то я не правильно понял ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-727404
Artos 99 Опубликовано 10 Сентября 2012 Поделиться Опубликовано 10 Сентября 2012 (изменено) Когда жы ты прежде чем делать руками будешь читать написанное и думать? :-) 1. pk:begin(0) - опИска, в реальном коде это должно быть pk:w_begin(0), что легко посмотреть и уточнить в lua_help.script. 2. pk:w_begin(0) - устанавливает позицию записи(!) в начало, записывая именно в начало (с 0-ой позиции) первые два байта, которые потом следует учитвать (отсекая pk:r_seek(2) ). Неужели тебе до сих пор не ясно, что строкою: se_obj:UPDATE_Write(pk) - движек записывает в нет-пакет параметры именно с установленной в нем позиции для записи, а уж твое дело при чтении установить позицию чтения на тот байт, с которого намерен считывать. 3. Твой "исправленный" код вновь полностью ошибочен, ты просто пытаешься методом бездумного тыка получить желаемое, но ... это не цифирьки конфига и пока ты не поймешь как нужно и не сделаешь все как дОлжно - будешь мыкаться и удивляться что мол "вот только с этим не так и в этой ситуации не эдак". И убирай, плз, портянки кодов под спойлер и соответствующий кодам тэг. Изменено 10 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-727412
Artos 99 Опубликовано 10 Сентября 2012 Поделиться Опубликовано 10 Сентября 2012 (изменено) P.S. Чтобы не мусолить далее эту тему, вот тебе заготовка, для частного случая, когда num_items == 0: local np = net_packet() --/ получаем 'чистый' нет-пакет np:w_begin(0) --/ писАть будем в самое начало (+2 байта) se_obj:UPDATE_Write(np) np:r_seek(2) --/ ставим чтение на 3-й байт, пропуская первые два table_param = {} --/ писать параметры будем сюда local num_items = np:r_u8() --/ первый параметр секции 'cse_alife_inventory_item' if num_items == 0 then --/ если 0 - то далее следуют 'оружейные' параметры --/ для 'с подствольниками' считываем их первый параметр if clsid_sobj == clsid.wpn_ak74_s or clsid_sobj == clsid.wpn_groza_s then table_param["upd_grenade_mode"] = np:r_u8() end --/ читаем общие для всего оружия параметры 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 Также, советую хорошенько полумать и понять разницу между параметрами из update-пакета и state- ... Читать без причины, например, кол-во патронов в стволе (ammo_elapsed) из update- и ошибочно и не правильно. Изменено 10 Сентября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/230/#findComment-727429
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти