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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

  Информация (Показать)

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

  Читать рекомендуется. (Показать)

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

"Работает нормально" - не находишь подобное определение смахивающим на "лишь бы работало - а остальное не важно"?

Цель замечания как раз в том, чтобы не просто "лишь бы работало", а все же как правильно писать скрипты/алгоритмы ...

Привести тебе примеры ситуаций? Да возьми половину игроков, которые таскают в рюкзаках десятками-сотнями пачки патронов, аптечек, жратвы и т.п. И при подсчете веса для каждого из этой сотни предметов идет чтение конфигов и подсчет ... Это ты называешь нормально? Тогда уж давай в кодах исключим опереторы умножения и деления и бум "нормально" складывать и вычитать... :crazy:

На апдейтах то как раз многие и применяют подобное, посмотри в модах "ограничители" веса. Если же делать такие проверки "как бы разово", например на коллбэках "on_take", то представь какая катавасия будет, если взять из трупа/ящика "все разом". т.е. когда циклы перебора предметов инвентаря вызываются не один раз... ;-)

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

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

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

Под "нормально" я имею ввиду что производительность страдает в пределах нормы (если вешать не на апдейт, а на коллбеки). Ну наблюдаем небольшую задержку при взятии бальшой-бальшой кучи предметов. Терпимо. Как при переходе нескольких сталкеров в онлайн. А чтобы пачек патронов слишком много не было, то надо перепаковщик. И никак не будет сотен пачек патронов.

 

  Цитата
"Работает нормально" - не находишь подобное определение смахивающим на "лишь бы работало - а остальное не важно"?

Нахожу. И чё дальше?

Ссылка на комментарий
  Цитата
Ну наблюдаем небольшую задержку при взятии бальшой-бальшой кучи предметов

Есть же coroutine.

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

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

А дальше, раз уж назвался груздем, стОит довести предлагаемый код до "ненормального" состояния:

а) добавить отсутствующую функцию find_symb, без которой и нормально то воспользоваться кодом невозможно ...

б) учтя замечания, добавить кеширование ...

в) несложными добавками снять лейбл "only CoP"

- вот тогда определение "нормально" вполне подойдет для "школьного" примера и в качестве урока "Учимся определять вес инвентаря" для соотв.топика. ;-)

 

Gun12, перепрочти затронутую тему ... Какое тут coroutine? Ты собираешься движку сказать ... подождика до следцующего цикла апдейта, мы еще эти взятые предметы не обработали ... ;-)

 

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

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

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

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

чистая ТЧ 1.0004

Есть такой вот фрагмент кода, вызывается на апдейтах актора, отслеживает состояние активного оружия

  Code (Показать)
Изменено пользователем ColR_iT
Про спойлер так же не забываем.
Ссылка на комментарий

Все же уточню, дабы и другие не наступали на те же грабли ..

Для всех оружейных классов, кроме "с подствольниками" ( "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. Для чего изобретать свой велосипед? ... и не имея навыков по теме, даже не смотреть на уже готовые примеры...

Изменено пользователем Artos
  • Нравится 2

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

Ссылка на комментарий
  Artos, offtop (Показать)
  • Нравится 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.

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

Подправил код, все нормально работает.

 

  Показать

 

С дробовиками то-же вроде нормально. Просто проверял из всех параметров только интересовавший меня на тот момент "upd_weapon_state" на значение 3 - это перезарядка, а оно для дробовиков почему-то не выставляется. Хотя другие значения вроде норм.

 

Artos'у

Не очень понял, отчего-же "все ошибочно" если работает нормально ?

 

"читать байты следует не от самого начала нет-пакета, а после секции параметров 'cse_alife_inventory_item'" - Вы наверное не обратили внимания, что используется UPDATE_Write, для заполнения нет-пакета, а он похоже не читает 'cse_alife_inventory_item'.

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

AndreySol, читает-читает. Если скрипт выдает похожие на правду значения - это случайность. Учитывать cse_alife_inventory_item - обязательно.

  Цитата
оно для дробовиков почему-то не выставляется
Ну вот и подтверждение. Изменено пользователем KD87
Ссылка на комментарий

Zander_driver

  оффтопик (Показать)
Изменено пользователем Artos
  • Нравится 1

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

Ссылка на комментарий
  08.09.2012 в 21:32, AndreySol сказал:
... отчего-же "все ошибочно" ...?

раз раздел "Школа" - устроим небольшой разбор "полетов":

- про нет--пакеты выше уже сказано и, если такая "нормальность" устраивает - далее можно не читать.

- на какой ляд эти строки(?):

if np == nil then	
return nil	
end

Неужели полученный нет-пакет может быть неопределен? Это даже не подстраховка, а неумелый копипаст ...

- далее:

table_param = {["upd_grenade_mode"] = np:r_u8()}

- поздравляю, все параметры нет пакета пакет уместились в один ... :wacko2:

- еще далее - эта же таблица затирается новыми "нормальными" значениями ...

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

Можно только констатировать, что фатальных ошибок в коде нет, как и толку никакого от такого кода, ни в плане получения результата, ни в плане получения познаний.

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

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

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

- далее:

table_param= {["upd_grenade_mode"] = np:r_u8()}

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

 

почему в один ?

Цитата из "Справочника ..." : "Значение читается из буфера начиная с текущей позиции чтения, а позиция чтения увеличивается на размер читаемого значения.

.....

8, 16, 24, 32, 64 - один, два, три, четыре, восемь байт соответственно

Устанавливаем позицию чтения в 0: np:r_seek(0), затем читаем один байт, указатель смещается на этот 1 байт.

Что-ж тут неправильного ?

 

- еще далее - эта же таблица затирается новыми "нормальными" значениями

Очепятался, бывает. Поздно было, не доглядел. Исправил уже.

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

Первый вопрос: Как отследить class id оружия из которого было произведено убийство? Просто как не бился все равно вылетает "actor79", и кстати почему 79, а в lua_help.script указан индекс равный 78?

 

Второй вопрос: Как можно перенести менеджер тайников из ЗП в ТЧ? Или написать что-то подобное?

 

Третий вопрос: Есть ли 'hit callback' для актора, делал по аналогии - ничего не работало, его действительно нет, или я что-то не так делаю?

 

Версия игры: ТЧ 1.0004

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

Все-же хочу разобраться с нет-пакетами.

 

  Показать

 

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

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, то все дальнейшее накрывается медным тазом...

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

 

Вот так, совершая ошибки и глупости, можно получать вроде как "нормальные" результаты, а потом гадать и в очередной раз вопрошать в форумах, отчего все так забаговано ... :crazy:

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

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

Ссылка на комментарий
  Цитата
установит позицию чтения (например 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.

Опять что-то я не правильно понял ?

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

Когда жы ты прежде чем делать руками будешь читать написанное и думать? :-)

 

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. Твой "исправленный" код вновь полностью ошибочен, ты просто пытаешься методом бездумного тыка получить желаемое, но ... это не цифирьки конфига и пока ты не поймешь как нужно и не сделаешь все как дОлжно - будешь мыкаться и удивляться что мол "вот только с этим не так и в этой ситуации не эдак".

 

И убирай, плз, портянки кодов под спойлер и соответствующий кодам тэг.

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

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

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

P.S. Чтобы не мусолить далее эту тему, вот тебе заготовка, для частного случая, когда num_items == 0:

  код (Показать)
Изменено пользователем Artos

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

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

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

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

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

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

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

Войти

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

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

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