MQWarp/MQZone/MQGate Detector (Code Name: The VZTZ Hammer!)
May god have mercy on my soul for trying to diff this. I apologize that a lot of it will be redundant checks, but we've had to tweak it quite a bit to get it to the point where it is now. We only have false alarms when we hit a massive lag spike (which happens on occasion), but the only way around that would be to allow massive distance updates all the time - which defeats the purpose.
I know this won't fit into one post, and probably won't even fit into 3 or 4, but I'll do my best to get it all in. Ok, *gulp* here goes. Anti-MQ /Warp, Anti-MQ /Gate, Anti-MQ /zone, Anti-MQ /ghost code from the Vallon Zek/Tallon Zek Server: In addition to myself, contributions to this code came from Rancar and Null. .\common\ruletypes.h After: Code:
RULE_BOOL ( Zone, EnableShadowrest, 0 ) // enables or disables the shadowrest zone feature for player corpses. Default is turned off. Code:
RULE_INT ( Zone, MQWarpExemptStatus, 50 ) //Lieka: Required status level to exempt the MQWarpDetector. Set to -1 to disable this feature. .\common\database.h After: Code:
bool SetHackerFlag(const char* accountname, const char* charactername, const char* hacked); Code:
bool SetMQDetectionFlag(const char* accountname, const char* charactername, const char* hacked, const char* zone); After: Code:
bool Database::SetHackerFlag(const char* accountname, const char* charactername, const char* hacked) { Code:
bool Database::SetMQDetectionFlag(const char* accountname, const char* charactername, const char* hacked, const char* zone) { //Lieka: Utilize the "hacker" table, but also give zone information. After: Code:
typedef enum { Code:
typedef enum { Code:
void AI_Init(); Code:
void CheatDetected(CheatTypes Cheat); .\zone\client.cpp Change (Insert Red Lines): Code:
bool Client::CheckCheat(){ |
.\zone\client_packet.cpp
After: Code:
void Client::Handle_Connect_OP_UpdateAA(const EQApplicationPacket *app) { Code:
bool Client::WarpDetection(bool CTimer, float distance) Code:
dist = sqrt(dist); Change (Insert Red Lines): Code:
void Client::Handle_OP_GMSummon(const EQApplicationPacket *app) Code:
x_pos = m_pp.x; Code:
this->cheat_timer.Start(2500,false); //Lieka: Prevent tripping the MQWarp detector when logging in after LD - basically gives a grace period for large position changes. Code:
case SE_InvisVsUndead: Code:
this->cheat_timer.Start(2500,false); //Lieka: Prevent tripping the MQWarp detector when arriving in a new zone. |
.\zone\client_process.cpp
Change (Insert Red Lines): Code:
if (ra->action == 1) { Code:
void Client::OPGMSummon(const EQApplicationPacket *app) Change (Insert Red Lines): Code:
else if (t->IsClient()) Code:
if (sep->IsNumber(2) || sep->IsNumber(3) || sep->IsNumber(4)){ After: Code:
inline int16 GetRace() const { return race; } Code:
float GetLWDistance() { return last_warp_distance; } //Null: these are used to return the values to #showstats Code:
bool fix_pathing; .\zone\mob.cpp Change (Insert Red Lines): Code:
attack_timer(2000), Code:
logging_enabled = false; Code:
void Mob::ShowStats(Client* client) { Code:
if (target->IsClient()) { |
.\zone\spdat.h
After: Code:
int GetMinLevel(int16 spell_id); Code:
bool IsShadowStepSpell(int16 spell_id); After: Code:
bool IsRuneSpell(int16 spell_id) { Code:
bool IsShadowStepSpell(int16 spell_id) { .\zone\spell_effects.cpp Change (Insert Red Lines): Code:
case SE_SummonPC: Change (Insert Red Lines): Code:
if(bard_song_mode) Code:
else Code:
if ((IsGateSpell(spell_id)) ||//Lieka Edit Begin: Checking effects within the spell, rather than hardcoding Spell IDs. Code:
if // Bind Sight line of spells Code:
//Lieka start Edit: Fixing Warp Detector triggered by spells cast on the player. Change: Code:
ZonePoint* GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance = 40000.0f); Code:
ZonePoint* GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance = 40000.0f, Client* client = NULL); .\zone\zone.cpp Change: Code:
ZonePoint* Zone::GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance) { Code:
ZonePoint* Zone::GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance, Client* client) { Code:
if(closest_dist>(200.0f*200.0f) && closest_dist<max_distance2) |
.\zone\zoning.cpp
After: Code:
case ZoneToSafeCoords: Code:
cheat_timer.Start(35000,false); //Lieka: Allow Zone/Evac to Safe Coords without triggering MQWarp detector. Code:
case GMSummon: Code:
cheat_timer.Start(35000,false); //Lieka: Allow Inter-Zone GM Summons without triggering MQZone detectors. After: Code:
case ZoneSolicited: //we told the client to zone somewhere, so we know where they are going. Code:
cheat_timer.Start(3500,false); //Lieka: Allow Server Forced Zoning without triggering MQZone detector. Code:
case ZoneUnsolicited: //client came up with this on its own. Code:
cheat_timer.Start(3500,false); //Lieka: Allow Zone normal zoning without triggering MQZone detector. Code:
} else { Code:
this->CheatDetected(MQZone); //Lieka: Bring down the hammer, they are trying to zone without meeting any of the above criteria. Code:
if(zone_mode == ZoneUnsolicited) { Code:
if ((this->cheat_timer.GetRemainingTime())<1 || (!this->cheat_timer.Enabled())){ //Lieka: Disable MQGate Detector if timer is active. Code:
[color=red] //for now, there are no other cases... Change (Insert Red Lines): Code:
//enforce min status and level Code:
void Client::SendZoneCancel(ZoneChange_Struct *zc) { Code:
cheat_timer.Start(3500,false); //Lieka: Disable MQ Warp & MQ Gate Detector when zoning fails. (not high enough level, etc) Code:
void Client::SendZoneError(ZoneChange_Struct *zc, sint8 err) { Code:
cheat_timer.Start(3500,false);//Lieka: Disable /Warp & /Gate Detector when zoning fails. (not high enough level, etc) Code:
switch(zm) { |
REQUIRED SQL:
Code:
ALTER TABLE `hackers` Code:
insert into rule_values values (0, Zone:EnableMQWarpDetector, False); Zone:EnableMQWarpDetector //Lieka: Enable the MQWarp Detector. Set to False to disable this feature. Zone:EnableMQZoneDetector //Lieka: Enable the MQZone Detector. Set to False to disable this feature. Zone:EnableMQGateDetector //Lieka: Enable the MQGate Detector. Set to False to disable this feature. Zone:EnableMQGhostDetector //Lieka: Enable the MQGhost Detector. Set to False to disable this feature. Zone:MQWarpExemptStatus //Lieka: Required account status to exempt the MQWarpDetector. Set to -1 to disable this feature. Zone:MQZoneExemptStatus //Lieka: Required account status to exempt the MQWarpDetector. Set to -1 to disable this feature. Zone:MQGateExemptStatus //Lieka: Required account status to exempt the MQWarpDetector. Set to -1 to disable this feature. Zone:MQGhostExemptStatus //Lieka: Required account status to exempt the MQWarpDetector. Set to -1 to disable this feature. Zone:MQWarpDetectorDistance //Lieka: Distance a player must travel between client to server location updates before a warp is registered. 30 allows for beyond GM speed without lag. Zone:MQWarpLagThreshold //Lieka: Distance beyond the Zone:MQWarpDetectorDistance that a player must travel within the MQWarpThresholdTimer amount of time before tripping the MQWarp detector. Set to 0 to disable this feature. Zone:MQWarpThresholdTimer //Lieka: Amount of time before the warp_threshold resets to the Zone:MQWarpLagThreshold value. Default: 90000 (900 seconds Zone:MQWarpDetectionSpellID //Lieka: Which spell ID will be cast on players that incur the hammer of the MQ Detector. This spell will be actually cast don't pick a resistible spell. Default: 757 (Resurrection Effects) Zone:MQZoneDetectionSpellID //Lieka: Which spell ID debuff will be cast on players that incur the hammer of the MQGateDetector. This spell will be added as a debuff while zoning. Default: 757 (Resurrection Effects) Zone:MQGateDetectionSpellID //Lieka: Which spell ID debuff will be cast on players that incur the hammer of the MQGateDetector. This spell will be added as a debuff while zoning. Default: 757 (Resurrection Effects) Zone:MQGhostDetectionSpellID //Lieka: Which spell ID will be cast on players that incur the hammer of the MQGhostDetector. This spell will be actually cast don't pick a resistible spell. Default: 757 (Resurrection Effects) |
Updating your Zone_Points table for MQZoneDetector.
When an unsolicited zone request comes through (i.e. the client is requesting a zone change), the MQZoneDetector works with the source to determine if the player is within an acceptable distance of a zoneline. These zonelines must be set in your Zone_Points table in order for this feature to work correctly. The majority of the Zone_Points only specify the destination zone points, but have 0, 0, 0 for the source zone points. If it is a zone line (like literally a line), then you put 999999 for the appropriate value. Below is my list, list: I do not have a complete Zone_Points table, but I do have Old World, FearPlane, HatePlane, and AirPlane updated in my table. SQL Step 1: Wipe your old world zone lines (I'm assuming that we're all based off of PEQ originally (mine is based from Angelox, but originally still it was PEQ)). This is a list of zone_points IDs that I have written insert statements for. Code:
delete from zone_points where id = 1 || id = 3 || id = 7 || id = 10 || id = 11 || id = 14 || id = 17 || id = 18 || id = 19 || id = 20 || id = 21 || id = 23 || id = 24 || id = 25 || id = 27 || id = 31 || id = 38 || id = 40 || id = 41 || id = 45 || id = 47 || id = 49 || id = 51 || id = 52 || id = 53 || id = 67 || id = 68 || id = 69 || id = 71 || id = 75 || id = 77 || id = 94 || id = 97 || id = 99 || id = 101 || id = 108 || id = 121 || id = 126 || id = 148 || id = 181 || id = 182 || id = 186 || id = 187 || id = 197 || id = 214 || id = 336 || id = 337 || id = 338 || id = 339 || id = 340 || id = 341 || id = 342 || id = 343 || id = 345 || id = 370 || id = 371 || id = 372 || id = 373 || id = 374 || id = 375 || id = 376 || id = 377 || id = 378 || id = 379 || id = 380 || id = 381 || id = 382 || id = 383 || id = 384 || id = 385 || id = 386 || id = 387 || id = 388 || id = 389 || id = 390 || id = 391 || id = 392 || id = 393 || id = 394 || id = 395 || id = 396 || id = 397 || id = 398 || id = 399 || id = 400 || id = 401 || id = 402 || id = 413 || id = 414 || id = 415 || id = 416 || id = 417 || id = 418 || id = 419 || id = 420 || id = 440 || id = 472 || id = 473 || id = 474 || id = 475 || id = 476 || id = 477 || id = 478 || id = 479 || id = 480 || id = 481 || id = 482 || id = 483 || id = 484 || id = 485 || id = 486 || id = 487 || id = 488 || id = 489 || id = 490 || id = 491 || id = 492 || id = 493 || id = 537 || id = 538 || id = 549 || id = 550 || id = 551 || id = 552 || id = 557 || id = 558 || id = 559 || id = 575 || id = 590 || id = 591 || id = 592 || id = 594 || id = 640 || id = 641 || id = 642 || id = 643 || id = 644 || id = 647 || id = 648 || id = 649 || id = 657 || id = 658 || id = 659 || id = 660 || id = 663 || id = 664 || id = 665 || id = 666 || id = 675 || id = 676 || id = 677 || id = 685 || id = 686 || id = 687 || id = 688 || id = 689 || id = 690 || id = 691 || id = 692 || id = 693 || id = 700 || id = 701 || id = 703 || id = 704 || id = 725 || id = 726 || id = 738 || id = 739 || id = 740 || id = 741 || id = 742 || id = 743 || id = 752 || id = 769 || id = 770 || id = 771 || id = 772 || id = 773 || id = 774 || id = 775 || id = 799 || id = 800 || id = 801 || id = 802 || id = 803 || id = 804 || id = 806 || id = 807 || id = 808 || id = 851 || id = 852 || id = 853 || id = 854 || id = 855 || id = 857 || id = 858 || id = 860 || id = 861 || id = 862 || id = 888 || id = 889 || id = 905 || id = 910 || id = 911 || id = 912 || id = 914 || id = 915 || id = 916 || id = 917 || id = 918 || id = 920 || id = 921 || id = 970 || id = 971 || id = 977 || id = 978 || id = 1142 || id = 1145 || id = 1146 || id = 1147 || id = 1148 || id = 1149 || id = 1150 || id = 1151 || id = 1152 || id = 1153 || id = 1154 || id = 1155 || id = 1158 || id = 1159 || id = 1160 || id = 1161 || id = 1162 || id = 1174 || id = 1218 || id = 1268 || id = 1269 || id = 1270 || id = 1271 || id = 1272 || id = 1273 || id = 1274 || id = 1275 || id = 1276 || id = 1277 || id = 1278 || id = 1314 || id = 1315 || id = 1327 || id = 1328 || id = 1329 || id = 1333 || id = 1750 || id = 1751; Code:
insert into zone_points values (1, 'qeynos',1,464,-442,1.5,0,-151,-5,1.5,999,0,2); |
SQL Part 2: Continued
Code:
|
SQL Part 2: Concluded
Code:
insert into zone_points values (743, 'steamfont',77,0,0,0,0,-401,-76,-157,255,0,202); Thanks, Dax |
dammit, I missed AirPlane:
Code:
delete from zone_points where id = 1163 || id = 1164 || id = 1165 || id = 1166 || id = 1167 || id = 1168 || id = 1169 || id = 1170 || id = 1171 || id = 1172 || id = 1173; Code:
insert into zone_points values (1163, 'airplane', 1, 0, 0, 0, 0, -387, 415, 132, 0, 0, 37); |
Holy. Shit. Much appreciation Dax. I'll post results, may take me a few days :).
|
Quote:
Code:
|
I just have to say..
Thank you for sharing, this is big and will help the community. |
This is wonderful, and I can't wait to try it out! However...
Could you post a diff against working code? Linux isn't liking client_packet.cpp at all and I want to rule out copy/paste errors on my part. (Though, there are a couple of typos as well, for example): Code:
AddBuff(this,(RuleI(Zone, MQZoneDetectionSpell)),30); needs to be: Code:
AddBuff(this,(RuleI(Zone, MQZoneDetectionSpellID)),30); Thanks for sharing this, it certainly is brilliantly written besides the minor typos here and there. |
Sorry for the typos with the rules system (I put it together for the submission). I'll see if I can get you a diff, but we've deviated quite a bit from the standard build, so it will take me a bit. I'll see if I can get one together.
Dax |
I understand completely, getting a clean diff from TGC wouldn't be easy either so I sympathize.
|
Ok, sorry for the false start. Yeah there were a few typos, etc with the previous code, I went through it again, and got a diff from it and 0.7.0-1102
Code:
Index: common/database.cpp |
Code:
Index: zone/mob.h |
Code:
Index: zone/client_packet.cpp |
Code:
Index: zone/spell_effects.cpp |
Updated the SQL to address a couple of issues too.
Code:
ALTER TABLE `hackers` Code:
insert into rule_values values (0, Zone:EnableMQWarpDetector, false); Dax |
Compiled perfectly! I'm going to play around now, thank you!
|
:) Glad to hear it - there might be some issues from tying it into the rules system (I'm hoping not, but it was not tested nearly as thoroughly with the rules setup as it was prior to it), but other than that, it should be pretty much as it reads. Let me know if you have any questions or concerns.
Thanks, Dax |
Awsome man, thank you for the wonderful contribution to the emu community!
|
Yeah, thank you much. This is very much needed, I'm gonna let it sit on PEQ for a bit and see what CD thinks about it before moving it to official source. If there's a situation where false positives happen a lot I'd just like to resolve it before it gets put in is all.
|
Absolutely brilliant! Always such quality from you :)
|
I moved part of this to another forum (Development:: Development) as "MQWarp/MQZone/MQGate Detector Discussion".
This forum is intended for submissions only, so I tried to split up the thread as best I could - use the new thread for discussion. |
Yes, we merged back with the eqemu source and use Wildcard's updates to the zoning stuff (getting all the bugs worked out of it made for an interesting week on our server ;)).
Here are the source snippets involved in pulling the zonepoints, then checking them against a zone request. Here's the code that pulls and checks the zone points: SQL query that pulls the zone points into the code: from .\zone\zone.cpp Code:
bool ZoneDatabase::LoadStaticZonePoints(LinkedList<ZonePoint*>* zone_point_list,const char* zonename) Code:
ZonePoint* Zone::GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance, Client* client) { Code:
select * from zone_points where y = 0 && x = 0 && z = 0; Basically, when there's an unsolicited zone request from the client (i.e. the client requests a zone change): The function "ZonePoint* Zone::GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance, Client* client)" compares the x, y (not target_x and target_y) in the records that match the target_zone_id within your zone_points table against the client's current x, y. If the (zonepoint->x - client->x) * (zonepoint->y - client->y) > 4000 (200*200), then it assumes that the zone request is the result of a hack (which it most likely is). So, if you have 0, 0 for a value in your x, y in the zone_points table, then unless the client is attempting to use that zone_point from close to that x, y in the zone, it will detect a /MQZone attempt. If the zone that the client is using is a zone wall (like East Commons -> West Freeport), you'll put 999999 for the x or y (whichever is appropriate), and it will exempt it that (x or y) from the check (because it's too damn hard to draw a line in the database). Once you update these records in your zone_points table, you can #reloadzps from within that zone (the source zone, not the target zone), and retest them. I hope that helps, Dax |
Ax - the submission thread for this is locked, could you move this code over for me?
I don't have a ton of time to document this, but it's well documented in the code. Long story short -
That's pretty much it - the rest is the same as my original submission, but I think these updates should be what the code needed. Let me know what you think. :) Thanks, Dax This Diff was taken against 0.7.0-1102 Code:
diff c:/EQEmu_0.7.0_1102_source/zone/client.h c:/VZ-TZ-Diff/zone/client.h Code:
insert into rule_values values (0, 'Zone:MQWarpExemptStatus', 50); |
Just a couple of comments on the code.
Firstly, excellent work. I love to see fixes for cheats and MQ type hacks. One thing tho. might not even be yours, but they it was in yours posts: Quote:
Expensive: if (sqrtf((dx*dx)+(dy*dy)) > 30) Cheaper: if (((dx*dx)+(dy*dy)) > 900) Yet they accomplish the same result. Just some tips, otherwise looks good. |
I'll make that change, we've also been doing some more testing with it (I've been really bogged down at work for the past month-ish), and found a few other places to refine the warp detection. I'll post those changes as soon as we get them completely ironed out.
Dax |
Other things MQ does that I'm not seeing on this:
1) Let's you use a banker anywhere in the game. 2) Activate a door from anywhere in the zone (so if you have a teleport clicky zonepoint you can use it from anywhere for instance). 3) Equip things you can't use. 4) Loot corpses from anywhere in zone. 5) Bogus appearance packets (not just spawn packets) to change anyone's race / appearance etc. Not as trivial as it sounds, change a guy in a dungeon to size 50 and he's stuck. 6) Fake all sorts of things in the CastSpell packet - cast spells they don't have memorized, cast spells they have memorized as clicky spells (to prevent mana usage), cast clicky spells with a different slot (to prevent charges being used) and so on. If there's already sanity checks in place for these, nevermind me, just wanted to bring it up. Also remember that no warp detection will ever be perfect and can always be replicated by lag, so we've found that it's a bad idea to auto punish someone for warping - needs a human eye to determine if its authentic warping or just lag. Moving the person back to where they came from and freezing them for a few seconds might be a better idea than deathtouch. |
This is exactly the kind of stuff that makes me all stiff in the britches for EQEmu again. I love this code, this effort, and the team work to iron out the iffy's.
I do not see this in the changelog yet. Is this still being evaluated for the base code? Can't wait. |
Yeah, once I find a crash that I *somehow* introduced while testing this I'll submit it. It's being somewhat elusive and I dun wanna submit code that has a known crash.
|
I have added his diff from the 1102 code 2 times, but into 1108 and can't seem to get it to fully function, even though some of it does. I can't wait for this to get added into the main source! That and a few other additions will be nice.
Also, if you are doing a new update soon, KLS, I see that you don't have my fixmob post stickied. And, I think you guys sticky everything that is planned to go in at some point. The fixmob command change isn't huge, but without the changes I made, the command is only about half useful. With the changes it is fully functional and works flawlessly. They are very simple changes. I can always add them in manually before compiling, but it seems like something useful to have in the release source. |
Quote:
The reason I wanted to post here was to see if the latest updates on this code were under consideration for being added to the source. The last diff from TheLieka shows more features and probably better ways to detect warping and also catch more false positives. I could never get that diff to work properly with 1108. If TZ/VZ ever updates to 1110, I would love to see a diff from that with their latest anti-MQ code. I think it should be considerably less to change from 1102, since it now includes the MQ detection. Also, I wanted to note that if anyone updates to the 1110, they will also want to add the rules listed below (and NOT the latest ones posted by TheLieka): Code:
insert into rule_values values (0, Zone:EnableMQWarpDetector, true); Code:
RULE_CATEGORY( Zone ) Also, someone might want to stick the rules table updates into the log file along with the hacker table one that is already there. |
I didn't add that since I didn't see it I can look at that stuff too.
|
Quote:
I basically had to run diffs and modify a bunch of stuff to my already modified code and was able to get it to compile in 1108, but it didn't seem to function at all other than the zone loop issue with the zone_points problem stated previously. Finally, I started from scratch again with unmodified 1108 source and I pulled up a diff from 1102 to 1108 showing line numbers. I then used textpad to pull up 1108 so I could modify it and turned on Line Numbers there as well. Then, for each line in the diff, I looked at the 1102 source for each line mentioned and then lined that up with the 1108 code in my diff. Then, I added all of the lines 1 by 1 to my 1108 that I had opened in textpad. It was a quite involved processes lol. But, I thought I had it all in where it should be. I tried to compile and got some errors which appeared to be related to where I was adding the code to. The first time I compiled it errored on one of the first few lines and I just moved it down 1 to where it looked like it should go, but NOT the same line number mentioned in the diff and it got past that part the next time I compiled. But, the second compile failed later and I fixed it again by moving the line down 1 in the source. So, maybe I just didn't understand how the diff posted was supposed to work. I read it as the line number mentioned is where the code change was supposed to be added to the source, but maybe it is the line after it? I don't know. Either way, once I got the compile to work, it still did nothing other than cause the zone loops from the zone_points issue. So far, the 1110 source is functioning perfectly as far as I can tell. But, it seems like the latest update from TheLieka might make it even better, which would be quite amazing. Plus, the rules it includes in the latest update look really great. I am sure the additional options for this system would come in quite handy. I am sure you guys updating the source should have much better luck than me lol. I just follow directions, but you should be able to actually understand where things are supposed to go or not. This is some very important and useful code and I am very excited to finally free up my time watching for cheating (which I waste countless hours doing) to finally allow this feature to do it for me! Thanks again for all of the hard work you guys do. I am more than willing to put any new code updates through a good stress test on my server. My server gets quite a good load of players on it, so they should be good for testing for issues with anything released. |
I only have a moment, so I apologize for not being able to address these things in great depth.
We had issues with zoning into certain zones setting off the warp detector with the last iteration of changes that I posted. Unfortunately, I had to fall into a possibly permenant hiatus status shortly after that, so I never had a chance to chase down the root of that problem. Other than that, the code was working very well for us, but with limited dev resources (as every ServerOp has experienced) and conflicting goals - we had to stop working on it for the time being. We ended up reverting back to a previous version of the warp detector (the older version only judges warps based on movement distance, rather than the newer version which judges warps based on movement velocity). The older versions are quite inadequate for accounting for lag - which the new version does very well. I do not think it would take much time for someone to go through and finalize the code for the new version, but unforunately, I simply do not have the time to do it right now. I would love to see the few remaining glitches in this code resolved and committed to the official source - I think it would be a great asset to any ServerOp with the intention of running a legit server. Dax |
Ya, I am sure we all know very well how easy it is to get sidetracked and get pulled into working on other problems instead of just focusing on one project :P Seems like I am working on something different every day lol.
The current anti-MQ detection in the 1110 code works very well and seems to catch every case of actual warping. The only negative part to it atm is that it also catches some false positives. It seems like CotH and maybe some other legit character moving features are not accounted for in the current committed version. I know you put checks in for pretty much all of them in the newest anti-MQ detection release. Maybe if we could just get all of the false positive checks that are in the latest one added to the current committed version, that would finalize the detection to be quite complete for now anyway. Of course, it would also be great to have it run the checks against velocity instead of distance to help remove even more false positives. I will try to do a diff of your newest anti-MQ code against the one that is currently in the committed code and post it here. Then, maybe we can all work towards pulling out the important changes and see if we can get the new stuff working. I am no coder, but I am fairly good at adjusting things as long as I have examples to work with and can grasp what it is trying to do. I think it would be great to have some of the other rules working as well, but that isn't quite as important. I want to make it clear that I LOVE the current MQ detection that is in the 1110 release! This will save me countless hours of time from investigating cheating and already in just a couple of days has stopped almost every incident of MQ abuse on my server! So, THANKS! I currently have the MQZone rule turned off so that I don't have to worry about zone_points and I think that helps a lot at least until I can find time to add them all in. Even if nothing is changed in the code from here on out, I think it is a vital tool for the community and probably the best thing we have gotten in quite a while. That isn't to say that all of the other changes recently aren't great, but just that the MQ detection is simply amazing! |
All times are GMT -4. The time now is 12:17 PM. |
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.