Validate ranged targets server-side
Some checks failed
build / Linux asan (push) Has been cancelled
build / Linux release (push) Has been cancelled
build / FreeBSD build (push) Has been cancelled

This commit is contained in:
server
2026-04-16 11:59:26 +02:00
parent eea1875d62
commit 2e6140abce
4 changed files with 113 additions and 3 deletions

View File

@@ -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);
}