mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-02 00:06:36 +00:00
[Cheat Detection] Anti-Cheat reimplementation (#1434)
* [Cheat Detection] Anti-Cheat reimplementation * minor patch fixes * ceiling to server side runspeed Warp(LT) was picking up a bunch of expected 6.2 but it was reported back as 6.5, this should help reduce the amount of false positives we get * use ceil instead of std::ceilf for linux * boat false positive fix * stopping the double detection * fixes and cleanup * auto merge tricked me... * dummy divide by 0 checks this should prevent anyone from setting Zone:MQWarpDetectionDistanceFactor to 0 and causing a crash. * Formatting * encapsulation to its own class and clean up * more detections * typo * OP_UnderWorld implmentation * Update client_packet.h * Syntax changes, formatting, cleanup * preventing crashes due to invalid packet size * typos and clearer logic * seperated the catagory for cheats * Updated MQGhost for more detail Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
+22
-4
@@ -99,9 +99,14 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
|
||||
//unable to find a zone point... is there anything else
|
||||
//that can be a valid un-zolicited zone request?
|
||||
|
||||
//Todo cheat detection
|
||||
Message(Chat::Red, "Invalid unsolicited zone request.");
|
||||
LogError("Zoning [{}]: Invalid unsolicited zone request to zone id [{}]", GetName(), target_zone_id);
|
||||
if (GetBindZoneID() == target_zone_id) {
|
||||
cheat_manager.CheatDetected(MQGate, glm::vec3(zc->x, zc->y, zc->z));
|
||||
}
|
||||
else {
|
||||
cheat_manager.CheatDetected(MQZone, glm::vec3(zc->x, zc->y, zc->z));
|
||||
}
|
||||
SendZoneCancel(zc);
|
||||
return;
|
||||
}
|
||||
@@ -134,7 +139,12 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
|
||||
//then we assume this is invalid.
|
||||
if(!zone_point || zone_point->target_zone_id != target_zone_id) {
|
||||
LogError("Zoning [{}]: Invalid unsolicited zone request to zone id [{}]", GetName(), target_zone_id);
|
||||
//todo cheat detection
|
||||
if (GetBindZoneID() == target_zone_id) {
|
||||
cheat_manager.CheatDetected(MQGate, glm::vec3(zc->x, zc->y, zc->z));
|
||||
}
|
||||
else {
|
||||
cheat_manager.CheatDetected(MQZone, glm::vec3(zc->x, zc->y, zc->z));
|
||||
}
|
||||
SendZoneCancel(zc);
|
||||
return;
|
||||
}
|
||||
@@ -282,7 +292,12 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
|
||||
//for now, there are no other cases...
|
||||
|
||||
//could not find a valid reason for them to be zoning, stop it.
|
||||
//todo cheat detection
|
||||
if (GetBindZoneID() == target_zone_id) {
|
||||
cheat_manager.CheatDetected(MQGate, glm::vec3(zc->x, zc->y, zc->z));
|
||||
}
|
||||
else {
|
||||
cheat_manager.CheatDetected(MQZone, glm::vec3(zc->x, zc->y, zc->z));
|
||||
}
|
||||
LogError("Zoning [{}]: Invalid unsolicited zone request to zone id [{}]. Not near a zone point", GetName(), target_zone_name);
|
||||
SendZoneCancel(zc);
|
||||
return;
|
||||
@@ -379,6 +394,7 @@ void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {
|
||||
void Client::SendZoneCancel(ZoneChange_Struct *zc) {
|
||||
//effectively zone them right back to where they were
|
||||
//unless we find a better way to stop the zoning process.
|
||||
cheat_manager.SetExemptStatus(Port, true);
|
||||
EQApplicationPacket *outapp = nullptr;
|
||||
outapp = new EQApplicationPacket(OP_ZoneChange, sizeof(ZoneChange_Struct));
|
||||
ZoneChange_Struct *zc2 = (ZoneChange_Struct*)outapp->pBuffer;
|
||||
@@ -397,7 +413,7 @@ void Client::SendZoneCancel(ZoneChange_Struct *zc) {
|
||||
void Client::SendZoneError(ZoneChange_Struct *zc, int8 err)
|
||||
{
|
||||
LogError("Zone [{}] is not available because target wasn't found or character insufficent level", zc->zoneID);
|
||||
|
||||
cheat_manager.SetExemptStatus(Port, true);
|
||||
EQApplicationPacket *outapp = nullptr;
|
||||
outapp = new EQApplicationPacket(OP_ZoneChange, sizeof(ZoneChange_Struct));
|
||||
ZoneChange_Struct *zc2 = (ZoneChange_Struct*)outapp->pBuffer;
|
||||
@@ -667,6 +683,8 @@ void Client::ZonePC(uint32 zoneID, uint32 instance_id, float x, float y, float z
|
||||
pShortZoneName = ZoneName(zoneID);
|
||||
content_db.GetZoneLongName(pShortZoneName, &pZoneName);
|
||||
|
||||
cheat_manager.SetExemptStatus(Port, true);
|
||||
|
||||
if(!pZoneName) {
|
||||
Message(Chat::Red, "Invalid zone number specified");
|
||||
safe_delete_array(pZoneName);
|
||||
|
||||
Reference in New Issue
Block a user