Мой способ говнокодом и говнологикой:
(по другому не могу, извини)
Запись в пространство имён Globals::
Globals::MoveDesync;
Globals::DuckDesyncStatic;
Globals::DuckDesyncMove;
Globals::StandingDesyncMax;
Использую это на себе, потому что на других игроках оно почему-то не работает(или я это такой криворукий)
float desync = Globals::LocalPlayer->GetMaxDSC();
if (Moving) // Velocity().Length2D() > 1.1
{
InDuck ? Globals::DuckDesyncMove = desync : Globals::MoveDesync = desync;
}
else{
InDuck ? Globals::DuckDesyncStatic = desync : Globals::StandingDesyncMax = desync;
}
Собственно ресольвер реверс:
if (chockedTicks > 1 && current.EyeAngles == previous.EyeAngles && IsTickValid(curent.iTick))
{
int ResolveMode = 0;
if (IsMoving)
{
IsDucking ? ResolveMode = 1 : ResolveMode = 2;
}
else
{
IsDucking ? ResolveMode = 3 : ResolveMode = 4;
}
if (ResolveMode > 0)
Resolve(ResolveMode);
}
void Resolve(int res)
{
float maxDSC;
switch(res)
{
case 1: maxDSC = Globals::DuckDesyncMove; break;
case 2: maxDSC = Globals::MoveDesync; break;
case 3: maxDSC = Globals::DuckDesyncStatic; break;
case 4: maxDSC = Globals::StandingDesyncMax; break;
}
float deltaAng = current.EyeAng - previous.EyeAng;
if (deltaAng > 4)
{
if (abs(deltaAng) == maxDSC)
{
data[idx].desync = deltaAng;
}
else
{
if(deltaAng > 34)
{ data[idx].desync = (int)deltaAng/2; }
else
{
data[idx].desync = (int)-deltaAng/2;
}
}
}
currentEntity->SetAngles().y += data[idx].desync;
}
Надеюсь помог. Не знаю какие сейчас десинки, не проверял этот ресольвер недавно, но вроде должен что-то фиксить.
UPD: заметил логическую ошибку в своём же коде только сейчас. С углами очень надо играться, ибо нам нужно получить максимальную дельту EyeAng
Сделать это можно примерно так:
void getMaxEyeAngDelta()
{
float delta = current.EyeAng - previous.EyeAng;
if(resolver.maxDSC[idx] >= abs(delta) && resolver.lastMaxDSC[idx] < abs(delta))
data[idx].lastMaxDSC[idx] = delta;
if(resolver.maxDSC[idx] < data[idx].lastMaxDSC[idx])
data.lastMaxDSC[idx] = resolver.maxDSC[idx];
}
Фронттрекинг:
bool futurePrediction()
{
float maxdelta = data.lastMaxDSC[idx];
static int chocked[64] = { 0 };
static bool ready = false;
if (chockedTicks > 2)
prediction.start = true;
if (prediction.start)
{
prediction.start = false;
// faking
chocked[idx]++;
}
if(chockedTicks > 14)
{
data.ticksChocked[idx] = chocked[idx];
chocked[idx] = 0;
ready = true;
}
if (ready)
{
ready = false;
return true;
}
return false;
}
float predictedAngle()
{
if (futurePrediction())
{
for(int i = 1; data.ticksChocked[idx]; i++)
{
current.EyeAng += data.lastMaxDSC[idx];
}
return current.EyeAng;
}
else
return data.lastMaxDSC[idx];
}