Welcome to U.A.C. [O.S.A.]
login / register 
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
ZChecker: обзор акторов, отладка, контроль; полезен для всех
   Список разделов - Проекты и идеи - ZChecker: обзор акторов, отладка, контроль; полезен для всехОтветить
АвторСообщение
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №1 Отправлено: 09.01.24 19:59:17
Доброго времени суток! “Полезный для всех” из названия темы значит, что данный проект будет полезен и простым игрокам, и создателям модификаций на Decorate, ZScript, ACS и DeHackEd, и мапперам.

Итак. ZChecker, внутриигровой инструментарий, исходные направления которого — удобная отладка акторов (игровых объектов), снятие с них данных в реальном времени и управление ими. Помимо того, инструментарий позволяет просматривать всех акторов со всех загруженных модификаций (по категориям), создавать акторов по их неполным названиям и даже частично контролировать игровой мир. Весь ZChecker, включая справку, доступен на русском и на английском языках.

Постулаты (гарантии) ZChecker:
1. Ни один внешний объект не может измениться без прямого на то указания пользователя.
2. Стабильность работы достаточна для его включения в постоянный список автозагрузки порта.
3. Загруженный инструментарий не может оказывать существенного влияния на скорость работы движка.

Минимальная версия движка: GZDoom 3.3.1+, LZDoom 3.60+, QZDoom 2.1+. Список остальных протестированных портов есть в разделе 4.

В этой теме также есть FAQ (ЧаВо) по инструментарию (зачем нужен, как пользоваться и так далее).


Ниже по тексту есть достаточное текстовое описание (а в самой игре — ещё и полноценный справочник). Но, как говорят, лучше один раз увидеть... Поэтому:

Презентация ZChecker



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




Обзор за авторством думера BANADZA:


(Англоязычные версии видео):
Скрытый текст:









ZChecker состоит из трёх основных частей:


=============== ─ ============================== ─ ===============
1. Информационные панели (инфопанели)




Главный инструмент наблюдения за свойствами акторов в реальном времени (фактически вывод пользователю телеметрии с акторов). Инфопанель привязана к одному актору, одновременно на экране может быть до трёх инфопанелей. Каждая панель делится на логические составляющие — притом настраивается и видимость, и их порядок, и опции, специфичные для конкретной составляющей, вроде количества строк при выводе инвентаря. В текущей версии, v0.87, есть 15 информационных частей:
- Различная служебная информация вроде названия класса;
- Позиция, углы, скорость, размеры;
- Инвентарь;
- Ближайшие стейты (состояния);
- Указатели на других акторов (к примеру, цель, AAPTR_TARGET);
- Связанные секторы;
- TID, TID to hate, аргументы;
- …и прочие свойства акторов.

Другие скриншоты:
Скрытый текст:










Команду добавления — “zcadd” — см. в разделе “2. Консольные команды (CCMDs)”.

Соответственное меню: “Information panels settings”/“Настройки инфопанелей”.
- Пробел, Enter, Влево, Вправо, ЛКМ — переключение отображения панели;
- “1”, “2”, “3” — переключение видимости пункта в конкретной панели;
- F3, F4, Tab, СКМ — зайти в подменю (если оно есть);
- “+”, “-", Колесо мыши — перемещение панелей выше/ниже;
- ПКМ — переместить курсор, не изменяя настроек.





=============== ─ ============================== ─ ===============
2. Консольные команды (CCMD)




Консольные команды ZChecker значительно расширяют встроенный в движок набор:
- Добавляют множество удобных возможностей для работы с акторами, вплоть до полной улучшенной замены некоторых из стандартных команд;
- Позволяют взаимодействовать с другими частями ZChecker (инфопанели и карта “Everything”);
- Предоставляют полезную информацию о некоторых статических данных, которые могут требоваться при разработке;
- Манипулируют экземплярами суперкласса Thinker (базовый класс для всех объектов, напрямую работающих с миром).

Все команды оригинального ZChecker начинаются на “zc”. Главная отправная точка по их изучению — команда “zchelp” (полная внутриигровая справка, первый скриншот под спойлером). Также подробный разбор аргументов команд здесь же, далее под спойлером… Хотя в “zchelp” есть больше наглядных примеров.
Скрытый текст:

 v v v 

"zchelp" на русском языке и с расцветкой:


Под спойлером примечание о применяемых далее обозначениях; они же используются и во внутриигровой справке:
Скрытый текст:


В [квадратных скобках] будут отмечаться необязательные, опциональные части. Такие части могут быть пропущены.

Пример 1: “zcadd [self]”. Может быть записано и как “zcadd”, и как “zcadd self”.


Символ “|” — вертикальная черта — называется “альтернативой” (можно вписать либо слово до вертикальной черты, либо слово после. Словом считается любая последовательность символов до первого пробела или до конца строки).

Пример 2: “zchelp all|verbose” может превратиться либо в “zchelp all”, либо в “zchelp verbose”.

Пример 3: “zcadd [self|weap]” следует читать как «“zcadd” ИЛИ “zcadd self” ИЛИ “zcadd weap”».


Конструкция вида <меньше-больше> — это задаваемый параметр. Вместо <всей конструкции> необходимо вписать нужное значение.

Пример 4: “zcadd <номер_панели>”. Вместо <номера_панели> должен стоять порядковый номер информационной панели — то есть, в нашем случае, “zcadd 1”, “zcadd 2” или “zcadd 3”.

Пример 5: “zcsetp [<кто>] x:<позиция>” может раскрываться в “zcsetp x:<позиция>” и в “zcsetp <кто> x:<позиция>”. На место <кто> и <позиция> нужно поставить какое-либо значение, к примеру, “zcsetp x:123” или “zcsetp self x:-14.5”.


Многоточие в квадратных скобках — “[...]” — служит для обозначения возможности любого количества использования той же конструкции, какая была до него. Просто многоточие показывает, что на этом месте что-то есть (но, вероятно, что-то сейчас не важное).

Пример 6: “zcsummon <класс> [<свойство1>[,<свойство2>[,...]]]”. Здесь свойств может и не быть, но по желанию пользователя их может оказаться и несколько десятков — и тогда они должны быть разделены запятыми. Формально верна как запись “zcsummon zombieman”, так и “zcsummon zombieman a,b,c,d,e,f” (в последнем будет шесть свойств).


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



Задаваемый параметр <кто> может быть либо номером инфопанели (“1”, “2” или “3”), либо указателем на самого игрока (ключевое слово “self” или “s”), либо целью под курсором (“lt” или “linetarget”), либо камерой (“cam[era]”). По умолчанию, если не указано иного, берётся цель под курсором.

Практически везде, где используется <класс>, его можно указать маской класса. “*” (звёздочка) будет соответствовать нулю или больше символов, “-” (дефис) — одному или больше. Например, маска класса “z*man” без сторонних модификаций будет однозначно распознана как “Zombieman”, а “a-a-a-a” — как “ArachnotronPlasma”. При неоднозначности нужно выбирать пункт из списка через двоеточие (вроде “*card:4” — выбрать четвёртый вариант из списка тех классов, что оканчиваются на “card”).


Все консольные команды можно поделить на:

Общего назначения:
zchelp”. Самая важная команда, вывод справки по инструментарию в консоль.
- “zchelp” — Краткая справка по самым часто используемым командам.
- “zchelp all|-a” — Краткая справка по всем командам.
- “zchelp <zc-команда>” — Полная справка по заданной команде с примерами её использования.

zcadd [self|weapon|camera|force] [<панель>]”. Добавляет цель под курсором в <панель> под указанным номером, или, если номер не указан, то в первую свободную.
- “zcadd self [<панель>]” добавляет в <панель> сам актор игрока.
- “zcadd weap [<панель>]” — актор текущего оружия.
- “zcadd force [<панель>]” — бесплотный актор под курсором.
- Можно вводить без пробела: “zcaddself”, “zcaddweap”, “zcaddforce”.

zcrem [<панель>]” убирает актора из указанной <панели>. Если аргумент не задан, очищает всё.

zcaddlistget <индекс> [<панель>]”. Позволяет взять произвольного актора на уровне по его <индексу> (см. скриншот) и поместить в <панель> под указанным номером (или в первую свободную, если номер не введён).

zcev …”. Работа с картой “Everything”. Подробнее см. раздел «3. Карта “Everything”».


Управление акторами:
zcsummon <класс> [<количество>] [<доп.параметр>,[...]]”. Мощное расширение встроенной команды “summon”. Создание <количества> акторов типа <класс> с <доп.параметрами>, список которых разделён запятыми.
- Можно ввести “zchelp summon” для списка возможных <доп.параметров>.

zcsetstate [<кому>] <метка стейта>”. Устанавливает <кому> стейт, соответствующий <метке стейта>.
- Если первый аргумент пропущен, установит стейт цели под курсором.
- Ни один стейт не может установиться мгновенно; до результата исполнения пройдёт один игровой такт.

zcsetflag [<кому>] <флаг> [<значение>]”. Устанавливает <кому> <флаг> в <значение>.
- Если первый аргумент пропущен, установит <флаг> цели под курсором.
- Если третий аргумент пропущен, переключит флаг.
- Далеко не все флаги устанавливаются сразу же. Список мгновенных можно получить через “zchelp setflag”.

zcsetprop [<кому>] [<способ>] <свойство>:<значение>[,<св-во>:<знач>[,...]]”. Устанавливает <кому> каждое указанное <свойство> в <значение>.
- <способ> может быть следующим: ничего или “raw” для перезаписи; “add” для добавления к текущим характеристикам; и “rel[:<к кому>]” для добавления относительно характеристик другого.
- Если первый аргумент пропущен, установит <свойства> цели под курсором.
- Список доступных <свойств> можно получить через “zchelp setprop”.

zcact [<кого>] <действие>”. Производит указанное <действие> над <кем>.
Если не указано, <кого>, производит действие над целью под курсором.
- “zcact [<кого>] kill” убивает <кого>.
- “zcact [<кого>] xkill” жестоко убивает <кого>.
- “zcact [<кого>] rm” удаляет <кого> из мира (как встроенная команда “remove”, но на одном акторе).
- “zcact [<кого>] rev[ive]|res[urrect]” воскрешает <кого>.
- “zcact [<кого>] statefreeze” устанавливает <кому> бесконечную задержку (замораживает).
- “zcact [<кого>] stateskip” пропускает <кому> его текущий стейт.
- “zcact [<кого>] staterevert” сбрасывает <кому> его текущий стейт.
- “zcact [<кого>] stop” останавливает движение <кого>.

И другие команды: “zcgive”, “zctake”, “zchate”, “zccopyclass”, “zccopysummon”.


Специальные, информационные и сервисные:

zcthinkers <тип> <действие> [<выбор>]”. Вывод списка или контроль любых объектов в памяти, наследованных от класса Thinker и принадлежащих StatNum-множеству <тип>. Синтаксис <выбора> зависит от <действия>.
- Напоминаю, что примеры всё так же можно увидеть через “zchelp zcthinkers”. Здесь они понадобятся.
- <тип> может быть как названием (“zcthinkers actors”), так и перечислимым (“zcthinkers 100”).
- “zcthinkers [list|types]” выводит список всех названий типов.
- “zcthinkers <тип> l[ist]” выведет нумерованный список всех существующих объектов указанного StatNum <тип>.
- “zcthinkers <тип> l[ist] [[#]<класс>]”. Тоже вывод списка. Если указан <класс> без “#” в начале — то только объектов этого <класса>. Если в начале стоит “#” — то объектов, наследованных от <класса>
- “zcthinkers <тип> rm [[#]<класс>:]<индекс>”. Удаляет Thinker с порядковым номером <индекс>. Фильтр “[[#]<класс>]” аналогичен такому же в подкоманде “list”.
- “zcthinkers <тип> rm:all[:raw] <класс>”. Уничтожает все объекты указанного <класса>, почти как встроенная ”remove <класс>” для акторов.
- “zcthinkers <тип> rm:everything”. Уничтожает все объекты, принадлежащие StatNum <тип>.
- “zcthinkers actors add[:<панель>] [[#]<класс>:]<индекс>”. Добавляет Actor с порядковым номером <индекс> в указанную <панель> (или в первую свободную, если <панель> не указана). Фильтр “[[#]<класс>]” аналогичен такому же в подкоманде “list”.
- Кстати, “zcaddlistget” на самом деле перенаправляется тоже на “zcthinkers”.

zcclassinfo <класс>”. Информация об указанном классе — его цепь наследования и, для акторов, цепь замен (replacements).

zcpanel …”. Управление панелями: перенос, копирование, информация об акторе. Синтаксис для всех групп подкоманд разный.
- “zcpanel <панель> copy|move <новая позиция>”. Копирует/перемещает <панель> на <новую позицию>.
- “zcpanel <панель> save|load <имя>”. Сохраняет/загружает указатель <имя> на актора в <панели>.
- “zcpanel [<панель>] info”. Выводит информацию о классе в указанной <панели>. На самом деле перенаправляет на команду “zcclassinfo”.

И другие: “zcvars”, “zcinterface”.

 ^ ^ ^ 







=============== ─ ============================== ─ ===============
3. Карта “Everything”




В первую очередь уровень “Everything” — это выставка, картотека всех загруженных акторов. Внимание: некоторые сторонние модификации могут не запуститься на этой карте, по недосмотру или намеренно — не столь важно. Об ошибке стоит писать автору такой модификации… ну или нам, команде LLDM Doom Modding, но с огромной вероятностью мы всё равно переадресуем Вас на автора :) .

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

Скриншоты, а также объяснение разноцветных информационных кружков, сопутствующих каждому актору:
Скрытый текст:

 v v v 

Рядом с каждым актором на карте находится связанный с ним инфоактор.

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

Своим цветом инфоактор кодирует текущее состояние связанного актора:
- Зелёный означает, что связанный актор существует и жив.
- Жёлтый – что связанный актор существует, но мёртв (имеет флаг +CORPSE или здоровье не выше нуля).
- Красный – что связанного актора нет.

Своей высотой инфоактор кодирует флаги связанного актора при его появлении:
- Верхняя позиция, выше уровня глаз, означает, что связанный актор имеет флаг +SPAWNCEILING и поэтому создаётся на потолке.
- Средняя позиция говорит, что актор не подвержен действию гравитации (есть флаги +NOGRAVITY или +NOINTERACTION).
- Во всех остальных случаях инфоактор находится в нижней позиции.







 ^ ^ ^ 



Список команд, меню настроек:
Скрытый текст:

 v v v 

В начале уровня все типы акторов появляются на карте автоматически. Однако при отладке часто требуется пересоздать уровень, не перезаходя на него; для этого существует команда “zcev re[create]”, или соответствующий пункт “Пересоздать акторов” (“Recreate actors”) в меню. Там же есть и настройки, что именно будет создаваться на уровне:



Также реализовано быстрое перемещение. Через меню карты “Everything” можно переместиться до любой категории; через команду “zcev goto <класс/категория>” – также и до любого актора. Подробнее см. в списке дополнителных команд для уровня “Everything”:

zcev re[create]” или “zcevre”. Уничтожает всех акторов на уровне и пересоздаёт их заново.

zcev g[oto] <класс/категория>” или “zcevg <класс/категория>”. Переходит к указанному классу или категории. Название категорий в этой команде – всегда слово на английском языке, без пробелов!
- Переход к акторам имеет более высокий приоритет, чем переход к категориям. Это значит, что если в мире будет актор с названием категории, то ZChecker перенесёт вас именно к нему. Для принудительного перехода к категории можно поставить символ “#” в начале аргумента: “zcevg #ammo”.
- В этой команде <класс> также может быть задан маской: “zcevg z-man” для перехода к "Zombieman".

zcev map”. Принудительно переносит игрока на карту “Everything_simple”.
zcev map2”. Принудительно переносит игрока на карту “Everything_alternative”.

zcev resec[tor]”. Сбрасывает свойства всех секторов до их исходных значений, не затрагивая акторов.

profilethinkers 7”. Сбор информации обо всех акторах за игровой такт, отсортированных по нагрузке на процессор. Команда встроенная и к ZChecker не относится, однако может очень сильно пригодиться при отладке модификаций.

 ^ ^ ^ 






═════════════ ─ ══════════════≡════════════ ─ ═════════════
Download & Credits


https://github.com/LLDM-Doom-Modding/ZChecker/releases/tag/v0.87_bugfix_gzdoom_4.12_compatibility — последняя релиз-версия, v0.87b (совместимость с GZDoom 4.12.x+).

https://github.com/LLDM-Doom-Modding/ZChecker — основной репозиторий проекта.

https://forum.zdoom.org/viewtopic.php?t=78688 — тема на ZDoom Forums.

Все причастные к разработке люди, а также люди, у которых брались ресурсы, указаны в разделе https://github.com/LLDM-Doom-Modding/ZChecker#credits.





=============== ─ ============================== ─ ===============
4. Продвинутое управление. Техническая часть и API создания собственных дополнений


Проект подобной сложности не может быть удовлетворительно реализован на Decorate/ACS; но! При разработке под Zandronum, DSDA-Doom и другие порты можно запускать GZDoom только в процессе отладки, верно?

Проект тестировался на GZDoom 3.3.1, QZDoom 2.0, GZDoom 3.4.0, QZDoom 2.1pre, GZDoom 3.6.0, LZDoom 3.87a, LZDoom 3.87c, LZDoom 3.88, QZDoom g4.5.0, GZDoom 4.8.0, GZDoom 4.8.1, GZDoom 4.9.1, GZDoom 4.10.0, GZDoom 4.11.0, GZDoom 4.11.3 и GZDoom 4.12.2. Мультиплеер проверялся на GZDoom 4.8.2 с 3.6-гигабайтовой модификацией, а также на LZDoom 3.87c.

Под спойлером лежит инструкция к добавлению проекта в список автозагрузки и несколько дополнительных команд. Также там начинается экскурс в ZChecker API — тоже много интересного, но, вероятно, не всем. Впоследствии вся эта информация будет перенесена в отдельное руководство по проекту.
Скрытый текст:


 v v v 

Для добавления проекта в автозагрузочный список:
- Найти и открыть конфигурационный файл *ZDoom.
- Найти раздел “[Global.Autoload]” (обычно находится в пределах первых пятидесяти строк файла).
- Под ней добавить строку без кавычек “Path=/путь/до/ZChecker.pk3” (например, “Path=C:\Games\GZDoom\Tools\ZChecker.pk3”).


Несколько полезных алиасов, не включённых в базовую поставку. Прописать в консоли их нужно только один раз:
// Удаление актора (по умолчанию — цель под курсором).
alias zcx "zcact %1 rm %2"

// Упрощение работы со StatNum-множеством акторов.
alias zcta "zcthinkers a %1 %2 %3"

// Перемещение актора к какому-то другому (по умолчанию — к себе цель под курсором):
alias zcwarp "zcsetprop %1 rel:%2 x:0,y:0 %3"



* * *

Отмечу сразу. Мне можно писать свободно практически по всем каналам связи, где я есть (хотя Discord и форум i.iddqd.ru всё же предпочтительнее). По возможности и с учётом свободного времени с кодом могу помочь.

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

Также при изменения ядра ZChecker вводятся ограничения по минимальной версии движка и языка (GZDoom 3.3.1+, ZScript version 3.3.0): за последние семь лет не добавилось буквально ни одной вещи, кардинально меняющей язык настолько, чтобы появлялся смысл рушить совместимость. Инфопанели и CCMD, использующие неэмулируемые новые функции, предлагаю выносить в качестве аддонов.


Файл локализации

Просмотреть (и прокомментировать) локализацию можно здесь: https://docs.google.com/spreadsheets/d/1ghszQ6T6InFgfWLfGq37Sgn4AHwYIoDYV3-iJzaPIP8/edit#gid=1195314451. Если требуется к ней доступ на запись — сообщите.

Обновление локализации производится посредством файла запуска файла “./SyncLocalization.py”. Он конвертирует содержимое “LANGUAGE.gzdoom400.csv” в два файла, “LANGUAGE.gzdoom330.enu” и “LANGUAGE.gzdoom330.rus”. Кодировка у gzdoom400 — Unicode, у gzdoom330.rus — CP-1251, у gzdoom400.enu — семибитный ASCII.


Создание собственной инфопанели

Будут затронуты: ZScript (минимум два переопределённых метода), CVARINFO (одна строка) и zchecker.cfg (одна строка).

1. Создать класс, наследованный от “ZCBaseInfoPanelPart” (в крайнем случае от “ZCBaseInfoPanelPart_PlayScope”, если UI-сферы не хватает. Но это небезопасно). Пусть будет называться “ZCInfopanel1”.
2. Создать в CVARINFO user-переменную типа int и установить ей двоичную маску видимости. Обычно ставится либо 0x00 (нигде), либо 0xFFFF (везде).
3. Переопределить “virtual void OnCreate()”. Там должны быть как минимум строковые переменные “optionCVarName” (с какой CVar связать инфопанель — нужно с той, которая из п. 2) и “optionLabel” (отображаемое название инфопанели). Остальные — по нужде.
4. В “zchecker.cfg” добавить “infopanel ZCInfopanel1” (естественно, файл конфигурации может быть не в ядре ZChecker, проект проверяет все совпадения).
5. Переопределить “virtual String GetInfo( Actor thing, ZCheckerField thingfield )” — этот метод будет возвращать выводимую на экран строку. “Actor thing” — с чем работаем (гарантированно не NULL), "ZCheckerField thingfield" — вспомогательный класс по передаче различной метаинформации (см. соответственный класс в “/ZScript/Core/ZCDataStructures.zsc”).
6. Должно заработать!


Создание новой команды консоли

Будут затронуты: ZScript (минимум три переопределённых метода), KEYCONF (одна строка на один алиас команды) и zchecker.cfg (одна строка).

1. Создать класс, наследованный от “ZCConsoleCommand”. Пусть названием будет “ZCNewCCMD”.
2. В “zchecker.cfg” добавить строчку “ccmd ZCNewCCMD”.
3. Переопределить “virtual void InitCCMD()”. Внутри должна вызываться «SetupCCMDInterface( String neteventname, String helpheader, String helpdesc, class tooltipClass = NULL, String helpaliases = "" )». Главное здесь — первое, “neteventname”, эта строка будет связывать пользовательский ввод и данный класс. Пусть у нас она будет “zc_newccmd”.
4. Добавить строку нового алиаса в KEYCONF. Должна выглядеть как «alias zcnewccmd "netevent zc_newccmd`%1`%2`%3"». Знаки обратного апострофа — разделитель, “%1”..”%3” — аргументы пользователя через пробел. Чтобы парсер не потерял последние аргументы пользователя, которые должны восприниматься как невалидные, советую их количество сделать на единицу или две больше нужного (также см. “Параметризуемые команды консоли”).
5. Переопределить “virtual bool HandleArguments()”. Он возвращает “true”, если предупреждение-справку “Usage” выводить не нужно, и “false”, если оно требуется. Именно в “HandleArguments()” должен проводится полный парсинг передаваемых аргументов — кстати, они будут храниться в уже распознанном виде в динамическом массиве “ccmd.args” (соответственно, их количество — “ccmd.args.Size()”).
6. Переопределить “virtual void DoCommand( void )”. Здесь будет исполняться сама команда.
7. Всё!

Примечание: в синтаксисе новой команды, для однозначности парсинга и отсутствию конфликтов с уже написанным кодом ядра, нежелательно использовать знак разделителя аргументов (“`”) и сдвоенные решётки (“##”, см. “Параметризуемые команды консоли” далее).


Параметризуемые команды консоли

Дополнительные параметры задаются первым аргументом, который должен начинаться на две решётки (“##”). Разделитель параметров — оно же. Если такой параметр обнаруживается, то удаляется в массиве “ccmd.args”, а все последующие сдвигаются на один ближе к его началу.

Доступные на v0.87 параметры:
“##nousage”. Отключает вывод справки при неправильно введённых параметрах (точнее, при возврате false из “ZCConsoleCommand::HandleArguments()”).
“##loglevel:<уровень>” или “##ll:<уровень>”. На время исполнения одной команды принудительно ставит другой LogLevel.
“##debug”. Алиас на “##loglevel:4”.

Пример из оригинального KEYCONF:
alias zcaddlistget "zcthinkers ##nousage actors add:%2 %1 %3"


Имейте в виду, что таким образом можно обмануть систему защиты от ввода слишком большого числа аргументов. Если команда должна принимать один аргумент, то для проверки на переполнение ей придётся принимать два. А значит, любой параметр может задвинуть последний введённый аргумент дальше того аргумента, который указан в KEYCONF: “zcsmth ##debug first second” → “zcsmth %1 %2” → [“zcsmth first” с параметром “LogLevel:4”, теряется аргумент “second”].


Создание собственной карты “Everything”

Стоит отметить, что карта “Everything” не единственна. Основным уровнем всё равно считается “Everything_simple”, дополнительным – “Everything_alternative”. На данный момент карты рода “Everything” — это все карты, идентификатор которых начинается на “EVERYTHING_”, а название содержит слово “ZChecker”. При загрузке такой карты запускается проверка специальных user-свойств по всем секторам.
- String/Text “user_zcsector_type”. Тип категории. На данный момент жёстко зашит. Может быть одним из (без кавычек):
"Monsters", "Large monsters", "Huge monsters",

"Weapons", "Ammo", "Health and armor", "Powerups", "Keys", "Other items",

"Decor impassable", "Decor impassable large", "Decor shootable",
"Decor shootable large", "Decor ethereal", "Decor ethereal large",
"Decor NOBLOCKMAP", "Decor NOINTERACTION", "Decor huge",

"Missiles", "Players", "Special actors"

- Integer “user_zcsector_typesegment”. Порядковый номер сегмента указанной категории. Желательно их делать без пропусков, так как код писался давно (в 2019-м) и как он работает – я уже не помню.
- Float “user_zcsector_jump_x”. На сколько маппикселей относительно предыдущего актора смещаться по оси X.
- Float “user_zcsector_jump_y”. На сколько маппикселей относительно предыдущего актора смещаться по оси Y.
- Integer “user_zcsector_jumpamount”. Сколько акторов можно породить в этом сегменте категории. При превышении лимита генератор переходит на следующий сегмент или, при его отсутствии, выводит предупреждающее сообщение в консоль.
- Float “user_zcsector_infoofs_x”. На сколько маппикселей относительно текущего актора смещать связанного инфоактора по оси X.
- Float “user_zcsector_infoofs_y”. На сколько маппикселей относительно текущего актора смещать связанного инфоактора по оси Y.
- String/Text “user_zcsector_categoryheader_name”. Название всей категории (локализуется автоматически).
- Float “user_zcsector_categoryheader_ofsx”. Смещение актора-заголовка всей категории относительно центра текущего сектора по оси X.
- Float “user_zcsector_categoryheader_ofsy”. Смещение актора-заголовка всей категории относительно центра текущего сектора по оси Y.

Если не будет найдено ни одной категории, будет выведено предупреждающее сообщение. Также при создании карты может быть полезен уровень журналирования “3. Разработка/API”.

В остальном на картах рода “Everything” ограничений нет.


 ^ ^ ^ 




* * *

Хороших Вам модификаций!

С Новым годом!

Рейтинг сообщения: +12, отметил(и): Dant3, theleo_ua, Ron_Dalas, RastaManGames, Mud, MyNameIs, Hizenfort, Endoomer, Dron12261, BKRItal, Ear1h, Track Federal
2 7 1
Ron_Dalas
Chief Petty Officer
Next rank: Chief Petty Officer after 28 points
912

Doom Rate: 1.98

Posts quality: +215
Ссылка на пост №2 Отправлено: 09.01.24 20:41:38
Ура! Думал что будешь держать до 1.0 версии)

Рейтинг сообщения: +1, отметил(и): JSO x
4 2
theleo_ua
= Colonel =
Next rank: - Commissar - after 90 points
4800

Doom Rate: 1.8

Posts quality: +1032
Ссылка на пост №3 Отправлено: 09.01.24 20:50:46
Нереально круто, большое спасибо за труды!

Рейтинг сообщения: +1, отметил(и): JSO x
3 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №4 Отправлено: 12.01.24 16:52:23
Обнаружил, что в файлах забыл поменять версию, с "v0.86" на "v0.87" — но в остальном всё в порядке, скачанная Вами ранее версия действительно является релизной и полной. В репозитории архив обновил, в любом случае.



Ron_Dalas пишет:
Ура! Думал что будешь держать до 1.0 версии)

Нет — считаю, что общеполезный проект не должен лежать просто так.


* * *

Появляются вопросы по использованию (что отлично) — а значит, скоро выложу FAQ. "Зачем ZChecker простым игрокам", "Можно ли пользоваться для Zandronum / DSDA-Doom / иных портов", "Как отлаживать свои проекты многим эффективнее" и другие...

Рейтинг сообщения: +3, отметил(и): theleo_ua, Ron_Dalas, Michael63
2 7 1
theleo_ua
= Colonel =
Next rank: - Commissar - after 90 points
4800

Doom Rate: 1.8

Posts quality: +1032
Ссылка на пост №5 Отправлено: 29.01.24 05:49:26
Я не планировал юзать зчекер в ближайшее время, но конкретно этот случай мне показался таким, что именно он поможет в отлове бага, так что я скорее всего попробую зчекер

Вопрос следующий: поможет ли тут зчекер? Если да, то какие его функции здесь надо применять? Кратко о баге - проджектайл при контакте с монстром иногда не навешивает на него скрипт, а иногда навешивает (надо чтобы навешивал всегда). Подробнее о баге (с кодом и видеороликами) здесь

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

Рейтинг сообщения: +2, отметил(и): Michael63, JSO x
3 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №6 Отправлено: 31.01.24 23:15:50
theleo_ua пишет:
Вопрос следующий: поможет ли тут зчекер? Если да, то какие его функции здесь надо применять?

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




Вместе с тем любопытно, что без этой задачи я бы в ближайшее время не нашёл вещи, которые можно доработать. Например, на месте параметров консольных команд сейчас ZChecker не понимает обычные CVar-переменные — скоро займусь ими.


theleo_ua пишет:

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

Использовал:
1) Инфопанели для отслеживания координат другого актора при перемещении;
3) Команду "zcthinkers a" для вывода всех акторов в порядке их появления на уровне;
3) Команду "zcthinkers a add:1 432" для добавления 432-го актора в первую инфопанель;
4) Команду "zcsummon ettin 20" для создания массы эттинов;
5) Команду "zcgive s callb* 999" для выдачи себе нужного предмета (так как было влом запоминать его полное название — это явно уже слегка вредная, но невероятно удобная привычка).
6) Меню вызова команд для создания линии из проверяемых акторов. Впрочем, над циклами ещё поработаю.

По поводу скрипта. Для проверки запуска можно использовать встроенное средство "acsprofile". Однако, вероятно, к следующей версии инструментария появятся и команды работы с ACS: оказывается, в базовой поставке движка таких есть всего три! Остальные — это "puke" и "pukename".

И, естественно, если проект большой и какие-то части предполагается использовать в разных местах — можно писать собственные расширения. В одном из проектов, к примеру, постоянно очень требовался вывод смещений по X/Y/Z относительно игрока и других инфопанелей (аддон на русский не переведён, и в нём есть пара забытых технических надписей). Загружать после основного ядра ZChecker.

Рейтинг сообщения: +2, отметил(и): theleo_ua, Ron_Dalas
2 7 1
theleo_ua
= Colonel =
Next rank: - Commissar - after 90 points
4800

Doom Rate: 1.8

Posts quality: +1032
Ссылка на пост №7 Отправлено: 01.02.24 01:21:03
JSO x пишет:
можно писать собственные расширения. В одном из проектов, к примеру, постоянно очень требовался вывод смещений по X/Y/Z относительно игрока и других инфопанелей (аддон на русский не переведён, и в нём есть пара забытых технических надписей). Загружать после основного ядра ZChecker.


всмысле ты сам постоянно себе пишешь расширения и выкладываешь их в основную сборку чтобы другие могли юзать? По остальному вроде понятно, как руки дойдут, попробую
3 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №8 Отправлено: 01.02.24 22:07:11
theleo_ua пишет:
всмысле ты сам постоянно себе пишешь расширения и выкладываешь их в основную сборку чтобы другие могли юзать?

Себе пока не писал, так как время есть либо на ZChecker, либо на другие свои проекты. И, так как инструментарий я считаю своим на данный момент лучшим и самым полезным произведением, вышедшим в люди, то и планку качества в нём стараюсь держать крайне высокую. А значит, времени на код автоматически начинает уходить куда больше.

Так что расширения — для других людей... По моему опыту, самые простые аддоны с нуля пишутся минут за пятнадцать. С шаблоном — за пять.

Рейтинг сообщения: +1, отметил(и): theleo_ua
2 7 1
theleo_ua
= Colonel =
Next rank: - Commissar - after 90 points
4800

Doom Rate: 1.8

Posts quality: +1032
Ссылка на пост №9 Отправлено: 02.02.24 06:52:50
JSO x, скинул тебе пример проекта, который имхо вполне мог бы юзать функции зчекера для своей работы: в этом сообщении - последний спойлер, в нем пункт 7 (второй абзац) и текст который после спойлера

Проект несуществующий, только на уровне идеи (ну у меня есть на Decorate/ACS его примитивная версия, но это не то, она точечная и многого не умеет, да еще и код неоптимальный)

Мне интересна как в принципе твоя оценка этой идеи (насколько такой проект мог бы быть полезным), так и оценка применимости кода зчекера как части этого проекта (насколько эффективно было бы сделать, чтобы "диалог моддера с этим проектом" происходил по аналогичным принципам, как происходит "диалог моддера с зчекером при дебаге")
3 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №10 Отправлено: 03.02.24 22:54:52
theleo_ua пишет:
Мне интересна как в принципе твоя оценка этой идеи (насколько такой проект мог бы быть полезным), так и оценка применимости кода зчекера как части этого проекта (насколько эффективно было бы сделать, чтобы "диалог моддера с этим проектом" происходил по аналогичным принципам, как происходит "диалог моддера с зчекером при дебаге")

Ну, мини-моды — вещь очень часто полезная. Тот же ZChecker я изначально таким и делал, для себя лично, чтобы с особенностями движка разбираться. Но явно на каком-то моменте не туда свернул...

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


P. S., отвечая на вопрос в "Теме для новичков": нет, нейросеть, по-моему, здесь не нужна. В данном случае она только мешаться будет — ведь мы ожидаем детерминированный результат?

Рейтинг сообщения: +1, отметил(и): theleo_ua
2 7 1
theleo_ua
= Colonel =
Next rank: - Commissar - after 90 points
4800

Doom Rate: 1.8

Posts quality: +1032
Ссылка на пост №11 Отправлено: 04.02.24 00:07:38
JSO x пишет:
если я насильно в разработку втянут не буду


Нет, я этого не предполагал. Просто было интересно мнение про саму идею, не более того

JSO x пишет:
нет, нейросеть, по-моему, здесь не нужна.


ну нейросеть я там в кавычках имел в виду, предполагая именно алгоритмы, но:

JSO x пишет:
нейросеть, по-моему, здесь не нужна. В данном случае она только мешаться будет — ведь мы ожидаем детерминированный результат?


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

потому как я пока слабо представляю, как в принципе подружить зскрипт с нейросетью, особенно если нейросеть сторонняя
3 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №12 Отправлено: 05.02.24 00:06:33
theleo_ua пишет:
и нейросеть здесь была бы интересна в первую очередь именно в контексте изучения движка, т.е. просто восхититься тем фактом, что в гздуме такое в принципе применимо и реализуемо (это два)

Нет, внешнюю нейросеть подключить на данный момент через ZScript не удастся. Но можно написать свою! Вот здесь лежит неплохая статья по созданию нейросети без соответственных библиотек. Если аккуратно подобрать входные-выходные воздействия и подумать над внутренними слоями, то особых препятствий нет и для написания эдакого глобального разума, подстраивающего действия противников в противовес поведению игрока. Главное тут не пытаться каждому монстру свой AI прикрепить, движку будет плохо.

Хотя, конечно, серьёзные нейросети на GZDoom писать нельзя... да и смысл вряд ли когда-нибудь появится, в общем-то.

* * *

=============== ─ ============= FAQ ============ ─ ===============



Насколько ZChecker совместим (с другими модификациями, со старыми версиями, ...)?
Скрытый текст:

Совместим настолько, насколько это возможно. За время разработки с проектом запускалось около пятидесяти различных модификаций для ZDoom, GZDoom и Zandronum. Найдены, учтены и нивелированы даже баги разных версий движков: GZDoom 3.3.1, QZDoom 2.1, GZDoom 4.6.0, GZDoom 4.9.1.



Зачем ZChecker простым игрокам/обзорщикам?
Скрытый текст:

Самая приятная часть — создание акторов по неполным названиям и в любых количествах (команда "zcsummon"), а также просмотр всех и вся на карте "Everything". Мне, как игроку, ещё пригождался для удаления заглючивших акторов ("zcact rm").



Зачем ZChecker мапперам (тестерам карт)?
Скрытый текст:

В инструментарии есть несколько инфопанелей, связанных с геометрией. При тестах различных карт я часто использую инфопанель игрока ("zcadd self") с информацией о секторах и порталах.



Зачем ZChecker моддерам?
Скрытый текст:


- Отладка и проверка отдельных акторов;
- Массированная отладка и массированная оптимизация на "Everything";
- Диагностика проблем;
- Понимание устройства акторов, устройства ZScript и игрового движка в целом (ZChecker включает в себя работу практически с каждой основной подсистемой, доступной из-под ZScript);
- Эксперименты с работой в реальном времени;
- И другие, менее важные и местами даже незаметные, но не менее полезные вещи...
Лично мне инструментарий пригождается практически в каждом проекте — как своём, так и командном.



Можно ли использовать для модов под Zandronum, DSDA-Doom, Eternity и так далее?
Скрытый текст:

Да, вполне: если модификация совместима с GZDoom, можно отлаживать её через ZChecker. То есть целевой порт проекта любой, но с дополнительной отладкой в GZDoom, LZDoom, VkDoom, QZDoom (или другом порте с поддержкой ZScript >3.3.0).



Мой мод стал тормозить. Как эффективнее его отладить?
Скрытый текст:

Карта "Everything". Она может показать очень многие недочёты и недоработки. На ней часто помогают команды "profilethinkers 7" для просмотра самых прожорливых акторов, "zcaddlistget" для получения списка акторов, отсортированных по времени появления в мире, и "zcaddlistget <номер>" для добавления в инфопанель. Прыжок к актору в инфопанели можно осуществлять через "zcsetprop s rel:<к кому> x:0,y:0". Удаление — либо через встроенную "remove <класс>", либо через "zcthinkers rm:all <класс>".
Также см. "Какие встроенные команды консоли хорошо сочетаются с командами ZChecker?" (следующий вопрос-ответ).



Какие есть хорошо сочетающиеся с ZChecker встроенные команды?
Скрытый текст:

Их много! Но вот основные:
- "profilethinkers 7". Сколько времени ЦП занимает обработка того или иного актора.
- "alias". Псевдоним для команды или нескольких команд — примеры использования есть в разделе 4.
- "freeze". Заморозка мира.
- "i_timescale <число>". Ускорение/замедление внутриигрового времени.



Мой [сложный актор с кучей стейтов] сломался и я не могу найти причину. ZChecker поможет?
Скрытый текст:

Да! В инфопанелях есть возможность включить трассировку (вывод) проигрываемых стейтов. Также имеет смысл после каждой метки стейта (вроде "Spawn:") добавить вывод его названия («"####" "#" 0 A_Log( "Spawn:" )»).



P. S.: для комплексных проектов такой метод показывает невероятную эффективность. В одном удалось сократить время отладки до двадцати минут (без него до этого было потрачено около восьми часов).



Карта "Everything" не запускается/зависает.
Скрытый текст:

ZChecker создаёт всех акторов из всех загруженных модов. Заранее предсказать, как поведёт себя тот или иной актор из сторонней модификации, невозможно...



Можно на "Everything" создать ещё одного актора, на которого я нацелился?
Скрытый текст:

Можно, и не только на "Everything": есть парная команда "zccopyclass" для копирования / "zccopysummon" для вставки. Изменённые свойства копируемого актора не переносятся.



Какие у тебя настройки?
Скрытый текст:







Рейтинг сообщения: +2, отметил(и): theleo_ua, Dron12261
2 7 1
theleo_ua
= Colonel =
Next rank: - Commissar - after 90 points
4800

Doom Rate: 1.8

Posts quality: +1032
Ссылка на пост №13 Отправлено: 05.02.24 08:08:56
JSO x, опечатки:

JSO x пишет:
На ней часто помогют команды "profilethinkers 7"


помогут

JSO x пишет:
На ней часто помогют команды "profilethinkers 7" для просмотра самых прожорливых акторов и "zcaddlistget"/"zcthinkers a" для .


"zcaddlistget"/"zcthinkers a" для чего?

Рейтинг сообщения: +1, отметил(и): JSO x
3 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №14 Отправлено: 07.04.24 12:48:47
На мой вкус краткий и слегка сумбурный, но, однако, обзор за авторством думера BANADZA (спасибо!):


Рейтинг сообщения: +4, отметил(и): theleo_ua, RastaManGames, Michael63, Endoomer
2 7 1
JSO x
- 2nd Lieutenant -
Next rank: = 2nd Lieutenant = after 106 points
1334

Doom Rate: 2.26

Posts quality: +726
Ссылка на пост №15 Отправлено: 15.06.24 20:52:43
ZChecker v0.87b_bugfix: совместимость и с GZDoom 4.12.x+.

Прямая ссылка на скачивание *.pk3.

Ссылка в первом сообщении темы обновлена.

Рейтинг сообщения: +4, отметил(и): theleo_ua, Michael63, Endoomer, Mickromash[RAISED]
2 7 1
Страница 1 из 1Перейти наверх
   Список разделов - Проекты и идеи - ZChecker: обзор акторов, отладка, контроль; полезен для всех