SpinHack |
Что это такое:
Спинхак - в переводе - вертолёт, вертушка. Чит в Counter-Strike , при котором читер вертится, постоянно делая обороты на 360? или как-то по другому, но необычно, в то время, как его управление и «вид из глаз» остаются такими же, как у нормально играющих игрокоов. Так же, как вертящийся игрок может играть нормально, так и используемые им другие читы тоже будут функционировать как положено, включая обычные эймботы. Чит по своей сути бессмысленнен, разве что когда он только появлся (Май 2004 года, автор - (c) tabris ) он произвёл фурор - игроки отзывались о читерах со спинхаком так - Игрок с бешеной сенсой и аимботом заодно!! Как он только может играть... Итак спинхак воздействует чисто психологически. Довольно интерестная вещь, поэтому мы её и рассмотрим поближе.
Вариант 1:
1) Очень важная вещь - получить старую командную систему, лишь затем задать процедуры спинхака и затем просчитать разницу углов, затем чтобы не ходить по кругу :) Для хака нужен ClientHook на CL_CreateMove и EngineFunctions.
// Скорость вращения в секунду, можно задать как cvar
#define SPIN_REVS_PER_SECOND 6.0f
void FixupAngleDifference(usercmd_t *cmd)
{
cl_entity_t *pLocal;
Vector viewforward, viewright, viewup, aimforward, aimright, aimup, vTemp;
float newforward, newright, newup, fTime;
float forward = cmd->forwardmove;
float right = cmd->sidemove;
float up = cmd->upmove;
pLocal = oEngfuncs.GetLocalPlayer();
if(!pLocal)
return;
if(pLocal->curstate.movetype == MOVETYPE_WALK)
{
oEngfuncs.pfnAngleVectors(Vector(0.0f, cmd->viewangles.y, 0.0f), viewforward, viewright, viewup);
}
else
{
oEngfuncs.pfnAngleVectors(cmd->viewangles, viewforward, viewright, viewup);
}
int iHasShiftHeld = GetAsyncKeyState(VK_LSHIFT); // Отключение, при медленной ходьбе.
if(pLocal->curstate.movetype == MOVETYPE_WALK && !iHasShiftHeld && !(cmd->buttons & IN_ATTACK) && !(cmd->buttons & IN_USE)) //При атаке и использовании
{
fTime = oEngfuncs.GetClientTime();
cmd -> viewangles . y = fmod ( fTime * SPIN_REVS_PER_SECOND * 360.0f , 360.0f );
}
if( pLocal -> curstate . movetype == MOVETYPE_WALK )
{
oEngfuncs.pfnAngleVectors ( Vector ( 0.0f , cmd -> viewangles . y , 0.0f ), aimforward , aimright , aimup );
}
else
{
oEngfuncs.pfnAngleVectors ( cmd -> viewangles , aimforward , aimright , aimup );
}
newforward = DotProduct ( forward * viewforward . Normalize (), aimforward ) + DotProduct ( right * viewright . Normalize (), aimforward ) + DotProduct ( up * viewup . Normalize (), aimforward );
newright = DotProduct ( forward * viewforward . Normalize (), aimright ) + DotProduct ( right * viewright . Normalize (), aimright ) + DotProduct ( up * viewup . Normalize (), aimright );
newup = DotProduct ( forward * viewforward . Normalize (), aimup ) + DotProduct ( right * viewright . Normalize (), aimup ) + DotProduct ( up * viewup . Normalize (), aimup );
cmd -> forwardmove = newforward ;
cmd -> sidemove = newright ;
cmd -> upmove = newup ;
}
// В CL_CreateMove
if (cvar.spinhack)
{
FixupAngleDifference(usercmd);
}
Вариант 2:
alias spinhack_on "cl_yawspeed 1000;+left"
alias spinhack_off "cl_yawspeed &yaw;-left"
bind o spinhack_on
bind p spinhack_off
:D
Copyright (c) Troll