Цитата(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. Возможно ещё при некоторых условиях.