void CInputMain::Move(LPCHARACTER ch, const char * data)
{
if (!ch->CanMove())
return;
struct command_move * pinfo = (struct command_move *) data;
if (pinfo->bFunc >= FUNC_MAX_NUM && !(pinfo->bFunc & 0x80))
{
sys_err("invalid move type: %s", ch->GetName());
return;
}
//enum EMoveFuncType
//{
// FUNC_WAIT,
// FUNC_MOVE,
// FUNC_ATTACK,
// FUNC_COMBO,
// FUNC_MOB_SKILL,
// _FUNC_SKILL,
// FUNC_MAX_NUM,
// FUNC_SKILL = 0x80,
//};
// 텔레포트 핵 체크
// if (!test_server) //2012.05.15 김용욱 : 테섭에서 (무적상태로) 다수 몬스터 상대로 다운되면서 공격시 콤보핵으로 죽는 문제가 있었다.
{
#ifdef ENABLE_CHECK_GHOSTMODE_HACK
if (ch->IsPC() && ch->IsDead())
{
sys_log(0, "MOVE: %s trying to move as dead", ch->GetName());
ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
ch->Stop();
return;
}
#endif
const float fDist = DISTANCE_SQRT((ch->GetX() - pinfo->lX) / 100, (ch->GetY() - pinfo->lY) / 100);
if (((false == ch->IsRiding() && fDist > 25) || fDist > 40) && OXEVENT_MAP_INDEX != ch->GetMapIndex())
{
if( false == LC_IsEurope() )
{
const PIXEL_POSITION & warpPos = ch->GetWarpPosition();
if (warpPos.x == 0 && warpPos.y == 0)
LogManager::instance().HackLog("Teleport", ch); // 부정확할 수 있음
}
sys_log(0, "MOVE: %s trying to move too far (dist: %.1fm) Riding(%d)", ch->GetName(), fDist, ch->IsRiding());
ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY(), ch->GetZ());
ch->Stop();
return;
}
//
// 스피드핵(SPEEDHACK) Check
//
DWORD dwCurTime = get_dword_time();
// 시간을 Sync하고 7초 후 부터 검사한다. (20090702 이전엔 5초였음)
bool CheckSpeedHack = (false == ch->GetDesc()->IsHandshaking() && dwCurTime - ch->GetDesc()->GetClientTime() > 7000);
if (CheckSpeedHack)
{
int iDelta = (int) (pinfo->dwTime - ch->GetDesc()->GetClientTime());
int iServerDelta = (int) (dwCurTime - ch->GetDesc()->GetClientTime());
iDelta = (int) (dwCurTime - pinfo->dwTime);
// 시간이 늦게간다. 일단 로그만 해둔다. 진짜 이런 사람들이 많은지 체크해야함. TODO
if (iDelta >= 30000)
{
sys_log(0, "SPEEDHACK: slow timer name %s delta %d", ch->GetName(), iDelta);
ch->GetDesc()->DelayedDisconnect(3);
}
// 1초에 20msec 빨리 가는거 까지는 이해한다.
else if (iDelta < -(iServerDelta / 50))
{
sys_log(0, "SPEEDHACK: DETECTED! %s (delta %d %d)", ch->GetName(), iDelta, iServerDelta);
ch->GetDesc()->DelayedDisconnect(3);
}
}
//
// 콤보핵 및 스피드핵 체크
//
if (pinfo->bFunc == FUNC_COMBO && g_bCheckMultiHack)
{
CheckComboHack(ch, pinfo->bArg, pinfo->dwTime, CheckSpeedHack); // 콤보 체크
}
}
if (pinfo->bFunc == FUNC_MOVE)
{
if (ch->GetLimitPoint(POINT_MOV_SPEED) == 0)
return;
ch->SetRotation(pinfo->bRot * 5); // 중복 코드
ch->ResetStopTime(); // ""
ch->Goto(pinfo->lX, pinfo->lY);
}
else
{
if (pinfo->bFunc == FUNC_ATTACK || pinfo->bFunc == FUNC_COMBO)
ch->OnMove(true);
else if (pinfo->bFunc & FUNC_SKILL)
{
const int MASK_SKILL_MOTION = 0x7F;
unsigned int motion = pinfo->bFunc & MASK_SKILL_MOTION;
if (!ch->IsUsableSkillMotion(motion))
{
const char* name = ch->GetName();
unsigned int job = ch->GetJob();
unsigned int group = ch->GetSkillGroup();
char szBuf[256];
snprintf(szBuf, sizeof(szBuf), "SKILL_HACK: name=%s, job=%d, group=%d, motion=%d", name, job, group, motion);
LogManager::instance().HackLog(szBuf, ch->GetDesc()->GetAccountTable().login, ch->GetName(), ch->GetDesc()->GetHostName());
sys_log(0, "%s", szBuf);
if (test_server)
{
ch->GetDesc()->DelayedDisconnect(number(2, 8));
ch->ChatPacket(CHAT_TYPE_INFO, szBuf);
}
else
{
ch->GetDesc()->DelayedDisconnect(number(150, 500));
}
}
ch->OnMove();
}
ch->SetRotation(pinfo->bRot * 5); // 중복 코드
ch->ResetStopTime(); // ""
ch->Move(pinfo->lX, pinfo->lY);
ch->Stop();
ch->StopStaminaConsume();
}
TPacketGCMove pack;
pack.bHeader = HEADER_GC_MOVE;
pack.bFunc = pinfo->bFunc;
pack.bArg = pinfo->bArg;
pack.bRot = pinfo->bRot;
pack.dwVID = ch->GetVID();
pack.lX = pinfo->lX;
pack.lY = pinfo->lY;
pack.dwTime = pinfo->dwTime;
pack.dwDuration = (pinfo->bFunc == FUNC_MOVE) ? ch->GetCurrentMoveDuration() : 0;
ch->PacketAround(&pack, sizeof(TPacketGCMove), ch);
/*
if (pinfo->dwTime == 10653691) // 디버거 발견
{
if (ch->GetDesc()->DelayedDisconnect(number(15, 30)))
LogManager::instance().HackLog("Debugger", ch);
}
else if (pinfo->dwTime == 10653971) // Softice 발견
{
if (ch->GetDesc()->DelayedDisconnect(number(15, 30)))
LogManager::instance().HackLog("Softice", ch);
}
*/
/*
sys_log(0,
"MOVE: %s Func:%u Arg:%u Pos:%dx%d Time:%u Dist:%.1f",
ch->GetName(),
pinfo->bFunc,
pinfo->bArg,
pinfo->lX / 100,
pinfo->lY / 100,
pinfo->dwTime,
fDist);
*/
}