Validate ranged targets server-side
This commit is contained in:
@@ -2092,6 +2092,49 @@ int CInputMain::SyncPosition(LPCHARACTER ch, const char * c_pcData, size_t uiByt
|
||||
void CInputMain::FlyTarget(LPCHARACTER ch, const char * pcData, uint16_t wHeader)
|
||||
{
|
||||
TPacketCGFlyTargeting * p = (TPacketCGFlyTargeting *) pcData;
|
||||
|
||||
if (ch && ch->IsPC())
|
||||
{
|
||||
LPCHARACTER victim = CHARACTER_MANAGER::instance().Find(p->dwTargetVID);
|
||||
|
||||
if (!victim)
|
||||
{
|
||||
sys_log(1, "FLY_TARGET_INVALID: %s target=%u missing", ch->GetName(), p->dwTargetVID);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ch == victim)
|
||||
{
|
||||
char szDetail[128];
|
||||
snprintf(szDetail, sizeof(szDetail), "target=%u x=%ld y=%ld", p->dwTargetVID, static_cast<long>(p->x), static_cast<long>(p->y));
|
||||
ch->RecordAntiCheatViolation("FLY_TARGET_INVALID", 4, szDetail);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (victim->GetCharType())
|
||||
{
|
||||
case CHAR_TYPE_WARP:
|
||||
case CHAR_TYPE_GOTO:
|
||||
ch->RecordAntiCheatViolation("FLY_TARGET_INVALID", 6, victim->GetName(), true);
|
||||
return;
|
||||
}
|
||||
|
||||
int distance = 0;
|
||||
int maxDistance = 0;
|
||||
if (!battle_ranged_target_valid(ch, victim, 0, &distance, &maxDistance))
|
||||
{
|
||||
char szDetail[160];
|
||||
snprintf(szDetail,
|
||||
sizeof(szDetail),
|
||||
"target=%s distance=%d max=%d",
|
||||
victim->GetName(),
|
||||
distance,
|
||||
maxDistance);
|
||||
ch->RecordAntiCheatViolation("FLY_TARGET_RANGE", distance > maxDistance + 800 ? 12 : 4, szDetail, distance > maxDistance + 800);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ch->FlyTarget(p->dwTargetVID, p->x, p->y, wHeader);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user