Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

PacketEntitiesFix

Статус пользователя [WPMG]PRoSToTeM@
сообщение 10.4.2014, 2:38
Сообщение #21
Стаж: 13 лет

Сообщений: 1514
Благодарностей: 1025
Полезность: 725

Цитата(kritik @ 9.4.2014, 19:26) *
Так в чем косяк-то? Старые поля не сохраняются, если дельта не шлется?

GameDLL принудительно отменяет посылку некоторых свойств через DeltaUnsetFieldByIndex. Потом в Svc_PacketEntities для посылки некоторых следующих энтити берётся за основу та, в которой не послались некоторые свойства (например координаты). Сервер думает что у нас координаты (этой базы) такие-то, а на клиенте реально другие и если координаты этой энтити совпадают с той которую мы выбрали за базу, то выходит баг.

Entity1 - энтити у которой не послались координаты
Entity2 - некоторая энтити, у которой база Entity1

Реальные данные:
Энтити Координаты
Baseline {0.0, 0.0, 0.0}
Entity1 {36.0, 45.0, 226.0}
Entity2 {36.0, 45.0, 226.0}

Как посылает сервер:
Entity1: from=Baseline, to=Entity1
Сравниваем свойства: отличаются origin[0], origin[1], origin[2] -> посылаем их все.
Вызываем callback в gamedll, Entity1 является текущим игроком:
Код
    entity_state_t *f = (entity_state_t *)from;
    entity_state_t *t = (entity_state_t *)to;
    int localplayer = (t->number - 1) == ENGINE_CURRENT_PLAYER();

    if (localplayer)
    {
        DELTA_UNSETBYINDEX(pFields, entity_field_alias[FIELD_ORIGIN0].field);
        DELTA_UNSETBYINDEX(pFields, entity_field_alias[FIELD_ORIGIN1].field);
        DELTA_UNSETBYINDEX(pFields, entity_field_alias[FIELD_ORIGIN2].field);
    }

Отменяем посылку origin[0], origin[1], origin[2].
Entity2: from=Entity1, to=Entity2
Сравниваем свойства: не отличаются origin[0], origin[1], origin[2] -> не посылаем ничего.
Callback не рассматриваем.

Как получает клиент:
Entity1: from=Baseline
Берём свойства Baseline, изменяем те, которые пришли -> не пришло ничего -> {0.0, 0.0, 0.0} координаты Entity1.
Entity2: from=Entity1
Берём свойства Entity1, изменяем те, которые пришли -> не пришло ничего -> {0.0, 0.0, 0.0} координаты Entity2.

Почему GameDLL отменяет посылку координат?
Потому что более точные придут в clientdata_t.

Обычно посылается Svc_DeltaPacketEntities, там свойства берутся из предыдущего фрейма для этой же энтити.
Svc_PacketEntities посылается когда от клиента не приходит Clc_Delta (передаётся DeltaSequence), это происходит при коннекте на сервер, т.е. когда у клиента ещё нет энтити, при начале записи демки, при большой потере пакетов, а также при CL_FlushEntityPacket. Возможно ещё при некоторых условиях.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 6 раз
   + Цитировать сообщение
kritik
сообщение 10.4.2014, 7:34
Сообщение #22
Стаж: 12 лет

Сообщений: 511
Благодарностей: 708
Полезность: 0

Упустил я сброс флага из геймдлл.
От бейслайна посылается когда нет состояния за предыдущий фрейм. Это может случиться и если энтити просто была не видна. CL_FlushEntityPacket это следствие невалидного фрейма на клиенте.
Clc_delta шлется при наличии cl.validsequence, сохраняемого при получении svc_packetentities. Обнуляется при коннекте, создании листен сервера, записи демо, потере фрейма и таймауте.

Отредактировал: kritik, - 10.4.2014, 8:01
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
exec1337
сообщение 10.4.2014, 21:44
Сообщение #23
Стаж: 13 лет

Сообщений: 6490
Благодарностей: 2558
Полезность: 491

Компильните кто-нибудь по win!
хочухочу
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: