HLFX.Ru Forum Страницы (255): « Первая ... « 5 6 7 8 [9] 10 11 12 13 » ... Последняя »
Показать все 3825 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Наши проекты (https://hlfx.ru/forum/forumdisplay.php?forumid=1)
-- XashNT: блог разработчика (https://hlfx.ru/forum/showthread.php?threadid=5297)


Отправлено Дядя Миша 09-09-2019 в 16:41:

Ну штож, новый механизм уже вполне себе вырисовывается. Для простоты и удобства я сделал его частью механизма сейв-рестора. Точнее говоря от сейв-рестора там только табличка глобальных деклараций, ну которая DECLARE_DATA_DESC(); Но дело в том, что эта табличка сама-по себе не обязывает хранить в ней непременно данные для сериализации. Это просто такая универсальная табличка, где можно хранить всё что угодно, а различать по выставленным флагам.

Сейчас, для примера, чтобы передать на клиент оригин и углы, не надо больше ничего копировать в AddToFullPack, не надо сортировать строчки в delta.lst и не надо писать ответный код на клиенте (для entity_state_t разумеется, а для кастомной дельты, как в Сорсе - надо). Достаточно просто добавить в DATADESC вот такие штуки:

DEFINE_DELTA( m_vecAbsOrigin, FIELD_POSITION_VECTOR ),
DEFINE_DELTA( m_vecAbsAngles, FIELD_ANGLES ),

и всё. Не надо по особому помечать переменные, создавать новые таблицы, подключать какие-то каллбэки для прокси и прочую чертовщинку. Я полагаю это самый оптимальный вариант. Разумеется это автоматически учитывает наследие классов и посылает для каждого класса всё объявленное, ну собсно, как и с сейвами.

Добавлено 09-09-2019 в 19:41:

Больше скажу. Этот механизм позволяет даже передавать указатели на функции по сети.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 09-09-2019 в 16:43:

Цитата:
Дядя Миша писал:
Этот механизм позволяет даже передавать указатели на функции по сети.

Ну што ж, несмотря на утрату delta.lst и возможности сортировать в ней строчки, нашему Мастеру будет чем заняться!

__________________

xaerox on Vivino


Отправлено Дядя Миша 09-09-2019 в 17:00:

Вот вам для примера как тот же оригин посылается в сорсе:

Сперва он объявляется хитрым образом:

C++ Source Code:
CNetworkVector( m_vecOrigin );

Причём для разных типов данных - свои названия. Для углов к примеру CNetworkQAngle, есть еще какие-то CNetworkVectorForDerived, CNetworkVar, CNetworkHandle (для EHANDLE). Затем нам надо создать новую таблицу, специально для передаваемых переменных.
C++ Source Code:
1
// This table encodes the CBaseEntity data.
2
IMPLEMENT_SERVERCLASS_ST_NOBASE( CBaseEntity, DT_BaseEntity )
3
SendPropDataTable( "AnimTimeMustBeFirst", 0, &REFERENCE_SEND_TABLE(DT_AnimTimeMustBeFirst), SendProxy_ClientSideAnimation ),
4
SendPropInt			(SENDINFO(m_flSimulationTime),	SIMULATION_TIME_WINDOW_BITS, SPROP_UNSIGNED|SPROP_CHANGES_OFTEN|SPROP_ENCODED_AGAINST_TICKCOUNT, SendProxy_SimulationTime),
5
 
6
SendPropVector	(SENDINFO(m_vecOrigin), -1,  SPROP_NOSCALE|SPROP_CHANGES_OFTEN, 0.0f, HIGH_DEFAULT, SendProxy_Origin ),

Вот это вот DT_BaseEntity тоже надо объявить, чёб движок мог его к себе утянуть и проанализировать. Дальше тут как видите еще и куча флажков-подсказок, типа меняется часто, не скейлить. Как будет всего этого мало, есть еще каллбэк SendProxy_Origin. Ну впрочем можно и без него.
Дальше интереснее. На клиенте m_vecOrigin объявлен как самый обычный Vector. А рядом -
C++ Source Code:
CInterpolatedVar< Vector >		m_iv_vecOrigin;

Но не всё так просто. Вот на клиенте ответная табличка:
C++ Source Code:
1
BEGIN_RECV_TABLE_NOBASE(C_BaseEntity, DT_BaseEntity)
2
RecvPropDataTable( "AnimTimeMustBeFirst", 0, 0, &REFERENCE_RECV_TABLE(DT_AnimTimeMustBeFirst) ),
3
RecvPropInt( RECVINFO(m_flSimulationTime), 0, RecvProxy_SimulationTime ),
4
 
5
RecvPropVector( RECVINFO_NAME( m_vecNetworkOrigin, m_vecOrigin ) ),

Дальше нам надо в конструкторе связать интерполятор с переменной:
C++ Source Code:
AddVar( &m_vecOrigin, &m_iv_vecOrigin, LATCH_SIMULATION_VAR );

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено nemyax 09-09-2019 в 19:09:

Зачем кому-то в сети указатель на функцию в чужой памяти?


Отправлено Дядя Миша 09-09-2019 в 19:51:

Для предихтинга жеж. Хотя хз. Может и не понадобится.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено thambs 09-09-2019 в 22:14:

Дядя Миша

Цитата:
указатель на функцию в чужой памяти

Это вообще законно? Вплане, не потенциальное UB?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено nemyax 10-09-2019 в 05:00:

thambs
Разыменуешь — бида. Но сравнивать-то с адресами из той же памяти можно без последствий.


Отправлено Дядя Миша 10-09-2019 в 06:03:

А кто сказал, что я буду посылать по сети именно указатель? Это вы сами придумали. Указатель сперва превращается в уникальное имя Class::Function, потом это имя добавляется в общий пул строк, который автоматически синхронизируется по сети, потом я посылаю идентификатор этой строки два байта, принимаю на клиенте, превращаю обратно в строку и по строке ищу указатель на функцию.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 10-09-2019 в 06:05:

Цитата:
Дядя Миша писал:
А кто сказал, что я буду посылать по сети именно указатель?

Потому что это очень свежая и оригинальная идея. До такого никто в мире не додумался, а ты бы реализовал!

__________________

xaerox on Vivino


Отправлено SNMetamorph 10-09-2019 в 08:20:

Цитата:
Дядя Миша писал:
Больше скажу. Этот механизм позволяет даже передавать указатели на функции по сети.


Отправлено Дядя Миша 10-09-2019 в 08:44:

Сейв-рестор вынесу целиком в игровую часть, движку он не нужен.
Собсно, смысл в том, чтобы движок не знал ни о каких эдиктах, это вообще не его дело. Не тот уровень абстракции.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 10-09-2019 в 08:47:

Цитата:
Дядя Миша писал:
движку он не нужен.

Клиентская часть? Всякие хардкодед-мессаги для восстановления всяких разных скринфейдов?

__________________

xaerox on Vivino


Отправлено nemyax 10-09-2019 в 08:57:

Дядя Миша
Ну прям микродвижок, навроде микроядра ОС.


Отправлено FiEctro 10-09-2019 в 08:59:

nemyax
При том не кроссплатформенный

Я так понимаю, Дядя Миша из Ксаша решил сделать первый квейк.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!


Отправлено nemyax 10-09-2019 в 09:02:

FiEctro
Первый квейк кокрастоке клиент-серверный монолитный.


Временная зона GMT. Текущее время 05:12. Страницы (255): « Первая ... « 5 6 7 8 [9] 10 11 12 13 » ... Последняя »
Показать все 3825 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024