Ну штож, новый механизм уже вполне себе вырисовывается. Для простоты и удобства я сделал его частью механизма сейв-рестора. Точнее говоря от сейв-рестора там только табличка глобальных деклараций, ну которая DECLARE_DATA_DESC(); Но дело в том, что эта табличка сама-по себе не обязывает хранить в ней непременно данные для сериализации. Это просто такая универсальная табличка, где можно хранить всё что угодно, а различать по выставленным флагам.
Сейчас, для примера, чтобы передать на клиент оригин и углы, не надо больше ничего копировать в AddToFullPack, не надо сортировать строчки в delta.lst и не надо писать ответный код на клиенте (для entity_state_t разумеется, а для кастомной дельты, как в Сорсе - надо). Достаточно просто добавить в DATADESC вот такие штуки:
и всё. Не надо по особому помечать переменные, создавать новые таблицы, подключать какие-то каллбэки для прокси и прочую чертовщинку. Я полагаю это самый оптимальный вариант. Разумеется это автоматически учитывает наследие классов и посылает для каждого класса всё объявленное, ну собсно, как и с сейвами.
Добавлено 09-09-2019 в 19:41:
Больше скажу. Этот механизм позволяет даже передавать указатели на функции по сети.
Вот вам для примера как тот же оригин посылается в сорсе:
Сперва он объявляется хитрым образом:
C++ Source Code:
CNetworkVector( m_vecOrigin );
Причём для разных типов данных - свои названия. Для углов к примеру CNetworkQAngle, есть еще какие-то CNetworkVectorForDerived, CNetworkVar, CNetworkHandle (для EHANDLE). Затем нам надо создать новую таблицу, специально для передаваемых переменных.
Вот это вот DT_BaseEntity тоже надо объявить, чёб движок мог его к себе утянуть и проанализировать. Дальше тут как видите еще и куча флажков-подсказок, типа меняется часто, не скейлить. Как будет всего этого мало, есть еще каллбэк SendProxy_Origin. Ну впрочем можно и без него.
Дальше интереснее. На клиенте m_vecOrigin объявлен как самый обычный Vector. А рядом -
C++ Source Code:
CInterpolatedVar< Vector > m_iv_vecOrigin;
Но не всё так просто. Вот на клиенте ответная табличка:
То есть еще и интерполяцией надо вручную заниматься. Это всё хорошо, пока большинство переменных уже заранее прописано и голова вроде не болит. Вообщем на порядок сложнее чем в голдсорсе.
А кто сказал, что я буду посылать по сети именно указатель? Это вы сами придумали. Указатель сперва превращается в уникальное имя Class::Function, потом это имя добавляется в общий пул строк, который автоматически синхронизируется по сети, потом я посылаю идентификатор этой строки два байта, принимаю на клиенте, превращаю обратно в строку и по строке ищу указатель на функцию.
Сейв-рестор вынесу целиком в игровую часть, движку он не нужен.
Собсно, смысл в том, чтобы движок не знал ни о каких эдиктах, это вообще не его дело. Не тот уровень абстракции.
Я так понимаю, Дядя Миша из Ксаша решил сделать первый квейк.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!