| 
   | 
   | 
  
 
    | 
    | 
    | 
  
 
    | 
   | 
    | 
  
 
    | 
   | 
    | 
  
 
    | 
   | 
    | 
  
 
   | 
  
	
	
		
	
	
 
    | 
   | 
    | 
  
 
	
		
		
		
			
			 
			
				03-28-2008, 05:20 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Developer 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Oct 2004 
					Location: THE ATL (wut wut) 
					
					
						Posts: 325
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
				 
				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. 
 Add:
 
	Code: 
	RULE_INT ( Zone, MQWarpExemptStatus, 50 ) //Lieka:  Required status level to exempt the MQWarpDetector.  Set to -1 to disable this feature.
RULE_INT ( Zone, MQZoneExemptStatus, 50 ) //Lieka:  Required status level to exempt the MQWarpDetector.  Set to -1 to disable this feature.
RULE_INT ( Zone, MQGateExemptStatus, 50 ) //Lieka:  Required status level to exempt the MQWarpDetector.  Set to -1 to disable this feature.
RULE_INT ( Zone, MQGhostExemptStatus, 50 ) //Lieka:  Required status level to exempt the MQWarpDetector.  Set to -1 to disable this feature.
RULE_BOOL ( Zone, EnableMQWarpDetector, False ) //Lieka:  Enable the MQWarp Detector.  Set to False to disable this feature.
RULE_BOOL ( Zone, EnableMQZoneDetector, False ) //Lieka:  Enable the MQZone Detector.  Set to False to disable this feature.
RULE_BOOL ( Zone, EnableMQGateDetector, False ) //Lieka:  Enable the MQGate Detector.  Set to False to disable this feature.
RULE_BOOL ( Zone, EnableMQGhostDetector, False ) //Lieka:  Enable the MQGhost Detector.  Set to False to disable this feature.
RULE_REAL ( Zone, MQWarpDetectorDistance, 30 ) //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.
RULE_REAL ( Zone, MQWarpLagThreshold, 140 ) //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.
RULE_REAL ( Zone, MQWarpThresholdTimer, 90000 ) //Lieka:  Amount of time before the warp_threshold resets to the Zone:MQWarpLagThreshold value.  Default: 90000 (900 seconds/15 minutes).  Set to -1 to disable this feature.
RULE_INT ( Zone, MQWarpDetectionSpellID, 757 ) //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)
RULE_INT ( Zone, MQGateDetectionSpellID, 757 ) //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)
RULE_INT ( Zone, MQZoneDetectionSpellID, 757 ) //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)
RULE_INT ( Zone, MQGhostDetectionSpellID, 757 ) //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 resistable spell.  Default: 757 (Resurrection Effects) 
 
.\common\database.h
After:
 
	Code: 
	bool	SetHackerFlag(const char* accountname, const char* charactername, const char* hacked); 
 Add:
 
	Code: 
	bool	SetMQDetectionFlag(const char* accountname, const char* charactername, const char* hacked, const char* zone); 
 .\common\database.cpp
After:
 
	Code: 
	bool Database::SetHackerFlag(const char* accountname, const char* charactername, const char* hacked) {
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	int32	affected_rows = 0;
	if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO hackers(account,name,hacked) values('%s','%s','%s')", accountname, charactername, hacked), errbuf, 0,&affected_rows)) {
		cerr << "Error in SetHackerFlag query '" << query << "' " << errbuf << endl;
		return false;
	}
	safe_delete_array(query);
	
	if (affected_rows == 0)
	{
		return false;
	}
	
	return true;
}
 Add:
 
	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.
	char errbuf[MYSQL_ERRMSG_SIZE];
	char *query = 0;
	int32	affected_rows = 0;
	if (!RunQuery(query, MakeAnyLenString(&query, "INSERT INTO hackers(account,name,hacked,zone) values('%s','%s','%s','%s')", accountname, charactername, hacked, zone), errbuf, 0,&affected_rows)) {
		cerr << "Error in SetMQDetectionFlag query '" << query << "' " << errbuf << endl;
		return false;
	}
	safe_delete_array(query);
	
	if (affected_rows == 0)
	{
		return false;
	}
	
	return true;
}
 .\zone\client.h
After:
 
	Code: 
	typedef enum {
	ZoneToSafeCoords,		// Always send ZonePlayerToBind_Struct to client: Succor/Evac
	GMSummon,				// Always send ZonePlayerToBind_Struct to client: Only a GM Summon
	ZoneToBindPoint,		// Always send ZonePlayerToBind_Struct to client: Death Only
	ZoneSolicited,			// Always send ZonePlayerToBind_Struct to client: Portal, Translocate, Evac spells that have a x y z coord in the spell data
	ZoneUnsolicited,
	GateToBindPoint,		// Always send RequestClientZoneChange_Struct to client: Gate spell or Translocate To Bind Point spell
	SummonPC,				// In-zone GMMove() always: Call of the Hero spell or some other type of in zone only summons
	EvacToSafeCoords
} ZoneMode;
 Add:
 
	Code: 
	typedef enum {
	MQWarp,
	MQZone,
	MQGate,
	MQGhost
} CheatTypes;
 After:
 
	Code: 
		void	AI_Init();
	void	AI_Start(int32 iMoveDelay = 0);
	void	AI_Stop();
	void	Trader_ShowItems();
	void	Trader_EndTrader();
	void	Trader_StartTrader();
	int8	WithCustomer();
	bool	CheckCheat(); 
 Add:
 
	Code: 
		void	CheatDetected(CheatTypes Cheat);
	bool	WarpDetection(bool CTimer, float Distance); 
 
.\zone\client.cpp
Change (Insert Red Lines):
 
	Code: 
	bool Client::CheckCheat(){
	
		float dx=cheat_x-x_pos;
		float dy=cheat_y-y_pos;
		float result=sqrtf((dx*dx)+(dy*dy));
		return result>(RuleR(Zone, MQWarpDetectorDistance)); //Lieka:  Integrated into Rules System; default value is 30, this allows for beyond GM speed without lag.
  
		
	
		
		
		
		
		
		
			
				__________________ 
				Daxum
  
Former ServerOp - Vallon Zek / Tallon Zek Emu Server - Legit / Guild PvP - (2007 - 2011 RIP)
			  
		
		
		
		
		
		
		
						  
				
				Last edited by KLS; 07-26-2008 at 01:48 AM..
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
 
    | 
   | 
    | 
  
 
	 
	
		 
	 
 
	
	
		
	
	
 
    | 
   | 
    | 
  
 
	
		
		
		
			
			 
			
				03-28-2008, 05:24 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Developer 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Oct 2004 
					Location: THE ATL (wut wut) 
					
					
						Posts: 325
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
				 
				
			 
			 
			
		
		
		
		.\zone\client_packet.cpp
After:
 
	Code: 
	void Client::Handle_Connect_OP_UpdateAA(const EQApplicationPacket *app) {
	SendAATable();
}
 Add:
 
	Code: 
	bool Client::WarpDetection(bool CTimer, float distance)
{	
	float last_distance;
	if (threshold_timer.GetRemainingTime() < 1 && ((RuleR(Zone, MQWarpThresholdTimer)) != -1)) {   //Null:  If the timer is done, reset threshold, then reset timer //Lieka:  Integrated into Rules System.
		warp_threshold = (RuleR(Zone, MQWarpLagThreshold));  //Lieka:  Integrated warp_threshold value into Rules System.  Original Value was 140.
		threshold_timer.Start((RuleR(Zone, MQWarpThresholdTimer)), false); //Lieka:  Integrated timer duration value into the Rules System.  Original Value was 90000 (90 seconds).
	}
	if ((CTimer))
		return false;
	else
	{
		//Null Edit:  made warp detector fire only when the sum of all the warps in a period of time are greater than a threshold
		//this makes the warp detector more lax on small warps, but still drops the hammer on the big ones.
		if (distance>140.0f) {
			last_distance = (distance-140.0f);
			warp_threshold -= last_distance;
			last_warp_distance = last_distance;
		}
	   return (warp_threshold < 0); //Null:  If the threshold is met, hit them with the hammer
	}
}
void Client::CheatDetected(CheatTypes CheatType)
{ //[Paddy] ToDo: Break warp down for special zones. Some zones have special teleportation pads or bad .map files which can trigger the detector without a legit zone request.
	switch (CheatType)
	{
		case MQWarp://Some zones have serious issues, turning off warp flags for these zones.
			if(!((zone->GetZoneID()==2)/*qeynos2*/ || (zone->GetZoneID()==9)/*freportw*/|| (zone->GetZoneID()==10)/*freporte*/ || (zone->GetZoneID()==34)/*nro*/ || (zone->GetZoneID()==24)/*erudin*/ || (zone->GetZoneID()==75)/*Paineel*/ || (zone->GetZoneID()==62)/*Felwitheb*/) && (RuleB(Zone, EnableMQWarpDetector) && ((status < RuleI(Zone, MQWarpExemptStatus) || (RuleI(Zone, MQWarpExemptStatus)) == -1)))) //Lieka:  Exempt these zones from the MQWarp detector (This may be depricated now, but these zones were problems in the past)
			{
				Message(13, "Your account has been reported for hacking.");
				database.SetMQDetectionFlag(this->account_name,this->name, "/MQWarp", zone->GetShortName());
				SetMana(0);  //Lieka:  Remove all mana from player.
				SetHP(5);  //Lieka:  Set player's hitpoints to 5.
				BuffFadeAll();  //Lieka:  Wipe all of player's buffs.
				SpellFinished((RuleI(Zone, MQWarpDetectionSpellID)), this);  //Lieka:  Integrated into Rules System.  Spell to cast on players Default:  757 (Resurrection Effects).
				worldserver.SendEmoteMessage(0,0,0,13,"<MQWarp Detector>.  %s was just caught warping in %s.  Come get your free kill!",this->GetName(),zone->GetLongName());
				warp_threshold = 1;   //Null:  bringing the detector back up to one to avoid chain detections.
			}
			break;
		case MQZone:
			if(!( (zone->GetZoneID()==31)/*sola*/ || (zone->GetZoneID()==32)/*solb*/ || (zone->GetZoneID()==25)/*nek*/ || (zone->GetZoneID()==27)/*lava*/ ) && (RuleB(Zone, EnableMQZoneDetector))&& ((status < RuleI(Zone, MQZoneExemptStatus) || (RuleI(Zone, MQZoneExemptStatus)) == -1)))) //Lieka:  Exempt these zones from the MQZone detector (This may be depricated now, but were problems in the past)
			{
				Message(13, "Your account has been reported for hacking.");
				database.SetMQDetectionFlag(this->account_name,this->name, "/MQZone", zone->GetShortName());
				SetMana(0);  //Lieka:  Remove all mana from player.
				SetHP(5);  //Lieka:  Set player's hitpoints to 5.
				BuffFadeAll();  //Lieka:  Wipe all of player's buffs.
				AddBuff(this,(RuleI(Zone, MQZoneDetectionSpell)),30);   //Lieka:  Integrated into Rules System.  Add (de)buff on player for 30 ticks.  Default:  757 (Resurrection Effects).
				worldserver.SendEmoteMessage(0,0,0,13,"<MQZone Detector>.  %s as just caught using Macroquest to /Zone to %s.  Come get your free kill!",this->GetName(),zone->GetLongName()); //Lieka:  Broadcast to the server that the MQZone detector has caught a cheater.
			}
			break;
		case MQGate:
			if (RuleB(Zone, EnableMQGateDetector)&& ((status < RuleI(Zone, MQGateExemptStatus) || (RuleI(Zone, MQGateExemptStatus)) == -1))) {
				Message(13, "Your account has been reported for hacking.");
				database.SetMQDetectionFlag(this->account_name,this->name, "/MQGate", zone->GetShortName());
				this->SetZone(this->GetZoneID()); //Lieka:  Prevent the player from zoning, place him back in the zone where he tried to originally /gate.
				SetMana(0);  //Lieka:  Remove all mana from player.
				SetHP(5);  //Lieka:  Set player's hitpoints to 5.
				BuffFadeAll();  //Lieka:  Wipe all of player's buffs.
				AddBuff(this,(RuleI(Zone, MQGateDetectionSpell)),30);   //Lieka:  Integrated into Rules System.  Add (de)buff on player for 30 ticks.  Default:  757 (Resurrection Effects).
				worldserver.SendEmoteMessage(0,0,0,13,"<MQGate Detector>.  %s was just caught using Macroquest to /Gate to %s.  Come get your free kill!",this->GetName(),zone->GetLongName()); //Lieka:  Broadcast to the server that the MQGate Detector has caught a cheater.
			}
			break;
		case MQGhost: //Lieka:  Not currently implemented, but the framework is in place - just needs detection scenarios identified
			if (RuleB(Zone, EnableMQGhostDetector) && ((status < RuleI(Zone, MQGhostExemptStatus) || (RuleI(Zone, MQGhostExemptStatus)) == -1))) {
				Message(13, "Your account has been reported for hacking.");
				database.SetMQDetectionFlag(this->account_name,this->name, "/MQGhost", zone->GetShortName());
				SetMana(0);  //Lieka:  Remove all mana from player.
				SetHP(5);  //Lieka:  Set player's hitpoints to 5.
				BuffFadeAll();  //Lieka:  Wipe all of player's buffs.
				SpellFinished((RuleI(Zone, MQGhostDetectionSpellID)), this);  //Lieka:  Integrated into Rules System.  Spell to cast on players Default:  757 (Resurrection Effects).
				worldserver.SendEmoteMessage(0,0,0,13,"<MQGhost Detector>.  %s was just caught using Macroquest to /Ghost to %s.  Come get your free kill!",this->GetName(),zone->GetLongName()); //Lieka:  Broadcast to the server that the MQGate Detector has caught a cheater.			
			}
			break;
	}
}
 Change (Insert Red Lines):
 
	Code: 
		dist = sqrt(dist);
	/*[Paddy] Cutting out the Z-Axis check. Not necessary and prevents long falls from triggering */
	//tmp = z_pos - ppu->z_pos;
	//dist += tmp*tmp;
	
	/* Begin Cheat Detection*/
	if ((this->cheat_timer.GetRemainingTime())>1 && (this->cheat_timer.Enabled())) //Lieka:  Check to see if the cheat (exemption) timer is active - this is for debugging
	{
		//Spell timer is currently active
		//worldserver.SendEmoteMessage(0,0,0,13,"Timer is Active.  %d True: %s",this->cheat_timer.GetRemainingTime(), (this->cheat_timer.GetRemainingTime()>1)? "true" : "false"); //Leika Edit:  Enable this to get debug messages.
	}
	else //Timer has elapsed or hasn't started, let's do a Warp Check
	{
		if ((WarpDetection(false, dist)) && (((admin <= RuleI(Zone, MQWarpExemptStatus)) || (RuleI(Zone, MQWarpExemptStatus) == -1))) //Exempt from warp detection if admin level is >  Rule:Zone:MQWarpExemptStatus
		{
			printf("Warping Detected by %S Acct: %s Distance: %f.", GetName(), AccountName(), GetLWDistance());
			CheatDetected(MQWarp); //Lieka:  Execute MQWarp function on offending player
		}
	}
	//Lieka End Edit
 
Change (Insert Red Lines):
 
	Code: 
	void Client::Handle_OP_GMSummon(const EQApplicationPacket *app)
{
	if (app->size != sizeof(GMSummon_Struct)) {
		cout << "Wrong size on OP_GMSummon. Got: " << app->size << ", Expected: " << sizeof(GMSummon_Struct) << endl;
		return;
	}
	this->cheat_timer.Start(5000, false); //Lieka:  Exempt in-zone GM Summons from triggering MQWarp detector
	OPGMSummon(app);
	return;
}
 After:
 
	Code: 
		x_pos		= m_pp.x;
	y_pos		= m_pp.y;
	z_pos		= m_pp.z;
	heading		= m_pp.heading;
	race		= m_pp.race;
	base_race	= m_pp.race;
	gender		= m_pp.gender;
	base_gender	= m_pp.gender;
	deity		= m_pp.deity;//FYI: DEITY_AGNOSTIC = 396; still valid?
	haircolor	= m_pp.haircolor;
	beardcolor	= m_pp.beardcolor;
	eyecolor1	= m_pp.eyecolor1;
	eyecolor2	= m_pp.eyecolor2;
	hairstyle	= m_pp.hairstyle;
	luclinface	= m_pp.face;
// vesuvias - appearence fix
	beard		= m_pp.beard; 
 Add:
 
	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. 
 After:
 
	Code: 
					case SE_InvisVsUndead: 
					{
					invisible_undead = true;
					break;
					} 
				case SE_InvisVsAnimals: 
					{
					invisible_animals = true;
					break;
					}					
			}
		}
	}
 Add:
 
	Code: 
	this->cheat_timer.Start(2500,false); //Lieka:  Prevent tripping the MQWarp detector when arriving in a new zone. 
  
		
	
		
		
		
		
		
		
			
				__________________ 
				Daxum
  
Former ServerOp - Vallon Zek / Tallon Zek Emu Server - Legit / Guild PvP - (2007 - 2011 RIP)
			  
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
 
    | 
   | 
    | 
  
 
	 
	
		 
	 
 
	
	
		
	
	
 
    | 
   | 
    | 
  
 
	
		
		
		
			
			 
			
				03-28-2008, 05:27 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Developer 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Oct 2004 
					Location: THE ATL (wut wut) 
					
					
						Posts: 325
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
				 
				
			 
			 
			
		
		
		
		.\zone\client_process.cpp
Change (Insert Red Lines):
 
	Code: 
		if (ra->action == 1) {
		this->cheat_timer.Start(3500, false); //[Paddy] Allow getting rezzed without triggering 
		cout << "Player " << this->name << " got a " << (int16)spells[ra->spellid].base[0] << "% Rezz" << endl;
		this->BuffFadeAll();
		SetMana(0);
		SetHP(GetMaxHP()/5);
		EQApplicationPacket* outapp = app->Copy();
		outapp->SetOpcode(OP_RezzComplete);
 Change (Insert Red Lines):
 
	Code: 
	void Client::OPGMSummon(const EQApplicationPacket *app)
{
	GMSummon_Struct* gms = (GMSummon_Struct*) app->pBuffer;
	Mob* st = entity_list.GetMob(gms->charname);
	if(st && st->IsCorpse())
	{
		st->CastToCorpse()->Summon(this, false);
	}
	else
	{
		if(admin < 80)
		{
			return;
		}
		if(st)
		{
			this->cheat_timer.Start(3500, false);//[Paddy] Allow PC's to be summoned without triggering Warp Detection
			Message(0, "Local: Summoning %s to %i, %i, %i", gms->charname, gms->x, gms->y, gms->z);
			if (st->IsClient() && (st->CastToClient()->GetAnon() != 1 || this->Admin() >= st->CastToClient()->Admin()))
				st->CastToClient()->MovePC((float)gms->x, (float)gms->y, (float)gms->z, this->GetHeading(), 2, true);
			else
				st->GMMove(this->GetX(), this->GetY(), this->GetZ(),this->GetHeading());
		}
		else
		{
			int8 tmp = gms->charname[strlen(gms->charname)-1];
			if (!worldserver.Connected())
			{
				Message(0, "Error: World server disconnected");
			}
			else if (tmp < '0' || tmp > '9') // dont send to world if it's not a player's name
			{
				ServerPacket* pack = new ServerPacket(ServerOP_ZonePlayer, sizeof(ServerZonePlayer_Struct));
				ServerZonePlayer_Struct* szp = (ServerZonePlayer_Struct*) pack->pBuffer;
				strcpy(szp->adminname, this->GetName());
				szp->adminrank = this->Admin();
				strcpy(szp->name, gms->charname);
				strcpy(szp->zone, zone->GetShortName());
				szp->x_pos = (float)gms->x;
				szp->y_pos = (float)gms->y;
				szp->z_pos = (float)gms->z;
				szp->ignorerestrictions = 2;
				worldserver.SendPacket(pack);
				safe_delete(pack);
			}
			else {
				//all options have been exhausted
				//summon our target...
				this->cheat_timer.Start(3500, false); //Lieka:  Don't want to trip the MQWarp detector here either.
				if(GetTarget() && GetTarget()->IsCorpse()){
					GetTarget()->CastToCorpse()->Summon(this, false);
				}
			}
		}
	}
}
 .\zone\command.cpp
 
Change (Insert Red Lines):
 
	Code: 
		else if (t->IsClient())
	{
		if(c->Admin() < 150)
		{
			c->Message(0, "You may not summon a player.");
			return;
		}
		t->CastToClient()->cheat_timer.Start(3500,false); //Lieka:  Prevent Zone-to-Zone GM Summons from triggering the MQZone and MQWarp detectors.
		c->Message(0, "Summoning player %s to %1.1f, %1.1f, %1.1f", t->GetName(), c->GetX(), c->GetY(), c->GetZ());
		t->CastToClient()->MovePC(zone->GetZoneID(), c->GetX(), c->GetY(), c->GetZ(), c->GetHeading(), 2, GMSummon);
	}
}
 Change (Insert Red Lines):
 
	Code: 
		if (sep->IsNumber(2) || sep->IsNumber(3) || sep->IsNumber(4)){
		//zone to specific coords
		c->CastToClient()->cheat_timer.Start(3500,false);  //Lieka:  Not sure why we put this here... should be an admin if you are zoning to special coordinates by this point.
		c->MovePC(zoneid, atof(sep->arg[2]), atof(sep->arg[3]), atof(sep->arg[4]), 0.0f, 0);
	}
	else {
		//zone to safe coords
		c->cheat_timer.Start(3500,false); //Lieka:  Should only hit this spot if your status is high enough to #zone, but prevent it from triggering the detector anyway.
		c->MovePC(zoneid, 0.0f, 0.0f, 0.0f, 0.0f, 0, ZoneToSafeCoords);
	}
}
 .\zone.mob.h
After:
 
	Code: 
		inline int16	GetRace()				const { return race; }
	inline int8	GetGender()					const { return gender; }
	inline int8	GetTexture()				const { return texture; }
	inline int8	GetHelmTexture()			const { return helmtexture; }
	inline int8	GetClass()					const { return class_; }
	inline uint8	GetLevel()				const { return level; }
	inline const char*	GetName()			const { return name; }
 Add:
 
	Code: 
		float GetLWDistance()					{ return last_warp_distance; }    //Null:  these are used to return the values to #showstats
	float GetWarpThreshold()				{ return warp_threshold; }		  //this one too
 Change (Insert Red Lines):
 
	Code: 
		bool fix_pathing;
	Timer cheat_timer; //Lieka:  Timer used to check for movement exemptions/client-based, unsolicited zone exemptions
	Timer threshold_timer;  //Null:  threshold timer
	float warp_threshold;   //Null:  threshold for warp detector
	float last_warp_distance;  //Null:  last distance logged as a warp, used for logs and #showstats
	inline float GetCWPX() const { return(cur_wp_x); }
	inline float GetCWPY() const { return(cur_wp_y); }
	inline float GetCWPZ() const { return(cur_wp_z); }
 
.\zone\mob.cpp
Change (Insert Red Lines):
 
	Code: 
			attack_timer(2000),
		attack_dw_timer(2000),
		ranged_timer(2000),
		tic_timer(6000),
		mana_timer(2000),
		spellend_timer(0),
		cheat_timer(0), //Lieka:  Timer for MQ Detector exemptions
		stunned_timer(0),
		bardsong_timer(6000),
		threshold_timer(0), //Lieka:  Timer to allow exemptions MQWarp related to lag
#ifdef FLEE_HP_RATIO
		flee_timer(FLEE_CHECK_TIMER),
#endif
		bindwound_timer(10000)
	//	mezzed_timer(0)
		{
	targeted = false;
	logpos = false;
	tar_ndx=0;
	tar_vector=0;
	tar_vx=0;
	tar_vy=0;
	tar_vz=0;
	tarx=0;
	tary=0;
	tarz=0;
	AI_Init();
	SetMoving(false);
	moved=false;
	warp_threshold = 140;            //Null:  set the threshold on creation of mob instance
	last_warp_distance = 0;			 //Null: set this one to zero also just because.
	_egnode = NULL;
	adverrorinfo = 0;
	name[0]=0;
	clean_name[0]=0;
	lastname[0]=0;
 Change (Insert Red Lines):
 
	Code: 
		logging_enabled = false;
	isgrouped = false;
	_appearance = eaStanding;
	pRunAnimSpeed = 0;
//	guildeqid = GUILD_NONE;
	
    spellend_timer.Disable();
	cheat_timer.Disable();
	bardsong_timer.Disable();
	bardsong = 0;
	bardsong_target_id = 0;
	casting_spell_id = 0;
	target = 0;
 Change (Insert Red Lines):
 
	Code: 
	void Mob::ShowStats(Client* client) {
	client->Message(0, "Name: %s %s", GetName(), lastname);
	client->Message(0, "  Level: %i  MaxHP: %i  CurHP: %i  AC: %i  Class: %i", GetLevel(), GetMaxHP(), GetHP(), GetAC(), GetClass());
	client->Message(0, "  MaxMana: %i  CurMana: %i  ATK: %i  Size: %1.1f", GetMaxMana(), GetMana(), GetATK(), GetSize());
	client->Message(0, "  STR: %i  STA: %i  DEX: %i  AGI: %i  INT: %i  WIS: %i  CHA: %i", GetSTR(), GetSTA(), GetDEX(), GetAGI(), GetINT(), GetWIS(), GetCHA());
	client->Message(0, "  MR: %i  PR: %i  FR: %i  CR: %i  DR: %i", GetMR(), GetPR(), GetFR(), GetCR(), GetDR());
	client->Message(0, "  Race: %i  BaseRace: %i  Texture: %i  HelmTexture: %i  Gender: %i  BaseGender: %i", GetRace(), GetBaseRace(), GetTexture(), GetHelmTexture(), GetGender(), GetBaseGender());
	client->Message(0, "  Last Warp Distance: %f Threshold Remaining: %f", GetLWDistance(), GetWarpThreshold());   //Null:  added this to check players last warp distance for debuging.
	if (client->Admin() >= 100) {
		client->Message(0, "  EntityID: %i  PetID: %i  OwnerID: %i  AIControlled: %i", this->GetID(), this->GetPetID(), this->GetOwnerID(), this->IsAIControlled());
		if (this->IsClient()) {
			client->Message(0, "  CharID: %i  PetID: %i", this->CastToClient()->CharacterID(), this->GetPetID());
			client->Message(0, "  Endurance: %i, Max Endurance %i",client->GetEndurance(), client->GetMaxEndurance());
		}
 Change (Insert Red Lines):
 
	Code: 
			if (target->IsClient()) {
			target->CastToClient()->cheat_timer.Start(3500,false); //Lieka:  Prevent Mob Summons from tripping hack detector.
			target->CastToClient()->MovePC(zone->GetZoneID(), x_pos, y_pos, z_pos, target->GetHeading(), 0, SummonPC);
		}
		else
			GetHateTop()->GMMove(x_pos, y_pos, z_pos, target->GetHeading());
        return true;
	}
	return false;
}
  
		
	
		
		
		
		
		
		
			
				__________________ 
				Daxum
  
Former ServerOp - Vallon Zek / Tallon Zek Emu Server - Legit / Guild PvP - (2007 - 2011 RIP)
			  
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
 
    | 
   | 
    | 
  
 
	 
	
		 
	 
 
	
	
		
	
	
 
    | 
   | 
    | 
  
 
	
		
		
		
			
			 
			
				03-28-2008, 05:30 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Developer 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Oct 2004 
					Location: THE ATL (wut wut) 
					
					
						Posts: 325
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
				 
				
			 
			 
			
		
		
		
		.\zone\spdat.h
After:
 
	Code: 
	int GetMinLevel(int16 spell_id);
int CalcBuffDuration_formula(int level, int formula, int duration);
sint32 CalculatePoisonCounters(int16 spell_id);
sint32 CalculateDiseaseCounters(int16 spell_id);
sint32 CalculateCurseCounters(int16 spell_id);
bool IsDiscipline(int16 spell_id);
bool IsResurrectionEffects(int16 spell_id);
bool IsRuneSpell(int16 spell_id);
bool IsMagicRuneSpell(int16 spell_id); 
 Add:
 
	Code: 
	bool IsShadowStepSpell(int16 spell_id);
bool IsSuccorSpell(int16 spell_id);
bool IsTeleportSpell(int16 spell_id);
bool IsGateSpell(int16 spell_id); 
 .\zone\spdat.cpp
After:
 
	Code: 
	bool IsRuneSpell(int16 spell_id) {
	bool Result = false;
	if(IsValidSpell(spell_id)) {
		for(int i = 0; i < EFFECT_COUNT; i++) {
			if(spells[spell_id].effectid[i] == SE_Rune) {
				Result = true;
				break;
			}
		}
	}
	return Result;
}
 Add:
 
	Code: 
	bool IsShadowStepSpell(int16 spell_id) {
	if (IsEffectInSpell(spell_id, SE_ShadowStep)){
		return true;
	}
	else {
		return false;
	}
}
bool IsSuccorSpell(int16 spell_id) {
	if (IsEffectInSpell(spell_id, SE_Succor)){
		return true;
	}
	else {
		return false;
	}
}
bool IsTeleportSpell(int16 spell_id) {
	if (IsEffectInSpell(spell_id, SE_Teleport)){
		return true;
	}
	else {
		return false;
	}
}
bool IsGateSpell(int16 spell_id) {
	if (IsEffectInSpell(spell_id, SE_Gate)){
		return true;
	}
	else {
		return false;
	}
}
 
.\zone\spell_effects.cpp
Change (Insert Red Lines):
 
	Code: 
				case SE_SummonPC:
			{
				if(IsClient()){
					CastToClient()->cheat_timer.Start(3500, false);  //Lieka:  Exempt spells the "SummonPC" effect from triggering the MQWarp detector.
					CastToClient()->MovePC(zone->GetZoneID(), caster->GetX(), caster->GetY(), caster->GetZ(), caster->GetHeading(), 2, SummonPC);
					Message(15, "You have been summoned!");
				} else {
					caster->Message(13, "This spell can only be cast on players.");
				}
				break;
			}
 .\zone\spells.cpp
Change (Insert Red Lines):
 
	Code: 
		if(bard_song_mode)
	{
		if(IsClient())
		{
			this->CastToClient()->CheckSongSkillIncrease(spell_id);
			//Lieka start Edit:  Fixing Warp Detector triggered for Bard Songs
			if ((IsGateSpell(spell_id)) ||//Lieka Edit Begin:  Checking effects within the spell, rather than hardcoding Spell IDs.
				(IsTeleportSpell(spell_id)) ||
				(IsSuccorSpell(spell_id)) ||
				(IsShadowStepSpell(spell_id)) ||
				(IsGateSpell(spell_id)))
				{
						this->cheat_timer.Start(2000,false);  //Lieka:  Exempt above effects from setting off MQWarp detector due to intrazone movement generated from the bard song effects
				}
				//Lieka end edit.
		}
		// go again in 6 seconds
//this is handled with bardsong_timer
//		DoCastSpell(casting_spell_id, casting_spell_targetid, casting_spell_slot, 6000, casting_spell_mana);
		mlog(SPELLS__CASTING, "Bard song %d should be started", spell_id);
	}
	else
 After:
 
	Code: 
		else
	{
		if(IsClient())
		{
			Client *c = CastToClient();
			SendSpellBarEnable(spell_id);
			// this causes the delayed refresh of the spell bar gems
			c->MemorizeSpell(slot, spell_id, memSpellSpellbar);
			// this tells the client that casting may happen again
			SetMana(GetMana());
			// skills
			if(slot < MAX_PP_MEMSPELL)
			{
				c->CheckIncreaseSkill(spells[spell_id].skill);
				
				// increased chance of gaining channel skill if you regained concentration
				c->CheckIncreaseSkill(CHANNELING, regain_conc ? 5 : 0);
				
				c->CheckSpecializeIncrease(spell_id);
			}
 Add:
 
	Code: 
				if ((IsGateSpell(spell_id)) ||//Lieka Edit Begin:  Checking effects within the spell, rather than hardcoding Spell IDs.
				(IsTeleportSpell(spell_id)) ||
				(IsSuccorSpell(spell_id)) ||
				(IsShadowStepSpell(spell_id)) ||
				(IsGateSpell(spell_id)))
				{
				c->cheat_timer.Start(2000,false); //Lieka:  Exempt above effects from setting off MQWarp detector due to intrazone movement generated from the spell effects
				}
 After:
 
	Code: 
		if	// Bind Sight line of spells 
	(
		spell_id == 500 || 	// bind sight
		spell_id == 407 		// cast sight
	)
	{ 
		action->target = GetID(); 
	} 
	else
	{ 
		action->target = spelltar->GetID(); 
	} 
	action->level = caster_level;	// caster level, for animation only
	action->type = 231;	// 231 means a spell
	action->spell = spell_id;
	action->sequence = (int32) (GetHeading() * 2);	// just some random number
	action->instrument_mod = GetInstrumentMod(spell_id);
	action->buff_unknown = 0;
 Add:
 
	Code: 
			//Lieka start Edit:  Fixing Warp Detector triggered by spells cast on the player.
	if ((IsGateSpell(spell_id)) ||//Lieka Edit Begin:  Checking effects within the spell, rather than hardcoding Spell IDs.
		(IsTeleportSpell(spell_id)) ||
		(IsSuccorSpell(spell_id)) ||
		(IsShadowStepSpell(spell_id)) ||
		(IsGateSpell(spell_id)))
		{
				spelltar->cheat_timer.Start(2000,false); //Lieka:  Exempt above effects from setting off MQWarp detector due to intrazone movement generated from the spell effects
		}
		//Lieka end edit.
 .\zone\zone.h
Change:
 
	Code: 
		ZonePoint* GetClosestZonePoint(float x, float y, float z, int32	to, float max_distance = 40000.0f); 
 To:
 
	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) {
 To:
 
	Code: 
	ZonePoint* Zone::GetClosestZonePoint(float x, float y, float z, int32 to, float max_distance, Client* client) {
 Change (Insert Red Lines):
 
	Code: 
		if(closest_dist>(200.0f*200.0f) && closest_dist<max_distance2)
	{
		client->CheatDetected(MQZone); //[Paddy] Someone is trying to use /zone
		LogFile->write(EQEMuLog::Status, "WARNING: Closest zone point for zone id %d is %f, you might need to update your zone_points table if you dont arrive at the right spot.",to,closest_dist);
		LogFile->write(EQEMuLog::Status, "<Real Zone Points>.  %f x %f y %fz ",x,y,z);
		//worldserver.SendEmoteMessage(0,0,0,13,"<Real Zone Points>.  %f x %f y %fz ",x,y,z);
		closest_zp = NULL; //Lieka:  Prevent the zone request from happening.
	}
	if(closest_dist > max_distance2)
		closest_zp = NULL;
	
	if(!closest_zp)
		closest_zp = GetClosestZonePointWithoutZone(x,y,z);
	return closest_zp;
}
  
		
	
		
		
		
		
		
		
			
				__________________ 
				Daxum
  
Former ServerOp - Vallon Zek / Tallon Zek Emu Server - Legit / Guild PvP - (2007 - 2011 RIP)
			  
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
 
    | 
   | 
    | 
  
 
	 
	
		 
	 
 
	
	
		
	
	
 
    | 
   | 
    | 
  
 
	
		
		
		
			
			 
			
				03-28-2008, 05:32 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Developer 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Oct 2004 
					Location: THE ATL (wut wut) 
					
					
						Posts: 325
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
				 
				
			 
			 
			
		
		
		
		.\zone\zoning.cpp
After:
 
	Code: 
			case ZoneToSafeCoords:
			//going to safe coords, but client dosent know where?
			//assume it is this zone for now. 
 Add:
 
	Code: 
	cheat_timer.Start(35000,false); //Lieka:  Allow Zone/Evac to Safe Coords without triggering MQWarp detector. 
 After:
 Add:
 
	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. 
 Add:
 
	Code: 
	cheat_timer.Start(3500,false); //Lieka:  Allow Server Forced Zoning without triggering MQZone detector. 
 After:
 
	Code: 
			case ZoneUnsolicited:   //client came up with this on its own.
			zone_point = zone->GetClosestZonePointWithoutZone(GetX(), GetY(), GetZ(), ZONEPOINT_NOZONE_RANGE);
			if(zone_point) {
				//we found a zone point, which is a reasonable distance away
				//assume that is the one were going with.
 Add:
 
	Code: 
	cheat_timer.Start(3500,false); //Lieka:  Allow Zone normal zoning without triggering MQZone detector. 
 After:
 
	Code: 
				} else {
				//unable to find a zone point... is there anything else
				//that can be a valid un-zolicited zone request?
 Add:
 
	Code: 
	this->CheatDetected(MQZone); //Lieka:  Bring down the hammer, they are trying to zone without meeting any of the above criteria. 
 After:
 
	Code: 
			if(zone_mode == ZoneUnsolicited) {
			zone_point = zone->GetClosestZonePoint(GetX(), GetY(), GetZ(), target_zone_id, ZONEPOINT_ZONE_RANGE);
			//if we didnt get a zone point, or its to a different zone,
			//then we assume this is invalid.
			if(!zone_point || zone_point->target_zone_id != target_zone_id) {
				Message(13, "Invalid unsolicited zone request.");
				LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%d'.", GetName(), target_zone_id);
 Add:
 
	Code: 
			if ((this->cheat_timer.GetRemainingTime())<1 || (!this->cheat_timer.Enabled())){ //Lieka:  Disable MQGate Detector if timer is active.
				this->CheatDetected(MQGate);
				}
 Change (Insert Red Lines):
 
	Code: 
	[color=red]		//for now, there are no other cases...
		
		//could not find a valid reason for them to be zoning, stop it.
		this->CheatDetected(MQZone);  //Lieka:  Bring down the hammer, we don't let hackers off that easily...
		Message(13, "Invalid unsolicited zone request.");
		LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%s'. Not near a zone point.", GetName(), target_zone_name);
		SendZoneCancel(zc);
		return; 
 
Change (Insert Red Lines):
 
	Code: 
		//enforce min status and level
	if (!ignorerestrictions && (Admin() < minstatus || GetLevel() < minlevel)) {
		this->cheat_timer.Start(3500,false); //Lieka:  Don't set off warp detector for when a player is moved to the safe-spot for trying to access a zone without the appropriate level or status requirements (i.e. zoning into FearPlane at level 30, etc)
		myerror = ZONE_ERROR_NOEXPERIENCE;
	}
	
	if(!ignorerestrictions && flag_needed[0] != '\0') {
		//the flag needed string is not empty, meaning a flag is required.
		if(Admin() < minStatusToIgnoreZoneFlags && !HasZoneFlag(target_zone_id)) {
			this->cheat_timer.Start(3500,false); //Lieka:  Don't set off warp detector for when a player is moved to the safe-spot for trying to access a zone without the appropriate flag.
			Message(13, "You must have the flag %s to enter this zone.");
			myerror = ZONE_ERROR_NOEXPERIENCE;
		}
	}
 After:
 
	Code: 
	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.
	EQApplicationPacket *outapp;
 Add:
 
	Code: 
	cheat_timer.Start(3500,false); //Lieka:  Disable MQ Warp & MQ Gate Detector when zoning fails. (not high enough level, etc) 
 After:
 
	Code: 
	void Client::SendZoneError(ZoneChange_Struct *zc, sint8 err) {
	LogFile->write(EQEMuLog::Error, "Zone %i is not available because target wasn't found or character insufficent level", zc->zoneID);
 Add:
 
	Code: 
		cheat_timer.Start(3500,false);//Lieka:  Disable /Warp & /Gate Detector when zoning fails. (not high enough level, etc) 
 Change (insert red lines):
 
	Code: 
		switch(zm) {
		case EvacToSafeCoords:
			this->cheat_timer.Start(2500,false);// Null: added a timers to this location because sometimes the ones in the other locations of code were not doing the job
		case ZoneToSafeCoords:
			this->cheat_timer.Start(2500,false);
			x = zone->safe_x();
			y = zone->safe_y();
			z = zone->safe_z();
			heading = heading;
			break;
		case GMSummon:
			this->cheat_timer.Start(2500,false);
			zonesummon_x = x_pos = x;
			zonesummon_y = y_pos = y;
			zonesummon_z = z_pos = z;
			heading = heading;
			
			zonesummon_id = zoneID;
			zonesummon_ignorerestrictions = 1;
			break;
		case ZoneSolicited:
			this->cheat_timer.Start(2500,false);
			zonesummon_x = x;
			zonesummon_y = y;
			zonesummon_z = z;
			heading = heading;
			
			zonesummon_id = zoneID;
			zonesummon_ignorerestrictions = ignorerestrictions;
			break;
		case GateToBindPoint:
			this->cheat_timer.Start(2500,false);
			x = x_pos = m_pp.binds[0].x;
			y = y_pos = m_pp.binds[0].y;
			z = z_pos = m_pp.binds[0].z;
			heading = m_pp.binds[0].heading;
			break;
		case ZoneToBindPoint:
			this->cheat_timer.Start(2500,false);
			x = x_pos = m_pp.binds[0].x;
			y = y_pos = m_pp.binds[0].y;
			z = z_pos = m_pp.binds[0].z;
			heading = m_pp.binds[0].heading;
			
			zonesummon_ignorerestrictions = 1;
			LogFile->write(EQEMuLog::Debug, "Player %s has died and will be zoned to bind point in zone: %s at LOC x=%f, y=%f, z=%f, heading=%f", GetName(), pZoneName, m_pp.binds[0].x, m_pp.binds[0].y, m_pp.binds[0].z, m_pp.binds[0].heading);
			break;
		case SummonPC:
			this->cheat_timer.Start(2500,false);
			zonesummon_x = x_pos = x;
			zonesummon_y = y_pos = y;
			zonesummon_z = z_pos = z;
			heading = heading;
			break;
		default:
			LogFile->write(EQEMuLog::Error, "Client::ZonePC() received a reguest to perform an unsupported client zone operation.");
			ReadyToZone = false;
			break;
	}
  
		
	
		
		
		
		
		
		
			
				__________________ 
				Daxum
  
Former ServerOp - Vallon Zek / Tallon Zek Emu Server - Legit / Guild PvP - (2007 - 2011 RIP)
			  
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
 
    | 
   | 
    | 
  
 
	 
	
		 
	 
 
	
	
		
	
	
 
    | 
   | 
    | 
  
 
	
		
		
		
			
			 
			
				03-28-2008, 05:36 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Developer 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Oct 2004 
					Location: THE ATL (wut wut) 
					
					
						Posts: 325
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
				 
				
			 
			 
			
		
		
		
		REQUIRED SQL: 
	Code: 
	ALTER TABLE `hackers` 
ADD COLUMN `zone` TEXT AFTER `hacked`;
ADD COLUMN `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `zone`; 
 
	Code: 
	insert into rule_values values (0, Zone:EnableMQWarpDetector, False);
insert into rule_values values (0, Zone:EnableMQZoneDetector, False);
insert into rule_values values (0, Zone:EnableMQGateDetector, False);
insert into rule_values values (0, Zone:EnableMQGhostDetector, False);
insert into rule_values values (0, Zone:MQWarpExemptStatus, 50);
insert into rule_values values (0, Zone:MQGateExemptStatus, 50);
insert into rule_values values (0, Zone:MQZoneExemptStatus, 50);
insert into rule_values values (0, Zone:MQGateExemptStatus, 50);
insert into rule_values values (0, Zone:MQWarpDetectorDistance, 30);
insert into rule_values values (0, Zone:MQWarpLagThreshold, 140);
insert into rule_values values (0, Zone:MQWarpThresholdTimer, 90000);
insert into rule_values values (0, Zone:MQWarpDetectionSpellID, 757);
insert into rule_values values (0, Zone:MQGateDetectionSpellID, 757);
insert into rule_values values (0, Zone:MQZoneDetectionSpellID, 757);
insert into rule_values values (0, Zone:MQGhostDetectionSpellID, 757); 
 There are 15 new rules created as a result of this addition.  Here is a breakdown of each:
 
 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)  
		
	
		
		
		
		
		
		
			
				__________________ 
				Daxum
  
Former ServerOp - Vallon Zek / Tallon Zek Emu Server - Legit / Guild PvP - (2007 - 2011 RIP)
			  
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
 
    | 
   | 
    | 
  
 
	 
	
		 
	 
 
	
	
		
	
	
	
		
		
		
			
			 
			
				03-29-2008, 12:42 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Sarnak 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Dec 2006 
					
					
					
						Posts: 68
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
			 
			
		
		
		
		Awsome man, thank you for the wonderful contribution to the emu community! 
		
	
		
		
		
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
	
		 
	 
 
	
	
		
	
	
	
		
		
		
			
			 
			
				03-29-2008, 02:51 PM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Administrator 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Sep 2006 
					
					
					
						Posts: 1,348
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
			 
			
		
		
		
		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. 
		
	
		
		
		
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
	
		 
	 
 
	
	
		
	
	
	
		
		
		
			
			 
			
				03-31-2008, 01:54 AM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Dragon 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: May 2006 
					Location: Cincinnati, OH 
					
					
						Posts: 689
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
			 
			
		
		
		
		Absolutely brilliant! Always such quality from you    
		
	
		
		
		
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
	
		 
	 
 
	
	
		
	
	
	
		
		
		
			
			 
			
				04-02-2008, 06:51 AM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 AX Classic Developer 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: May 2006 
					Location: filler 
					
					
						Posts: 2,049
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
			 
			
		
		
		
		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. 
		
	
		
		
		
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
	
		 
	 
 
	
	
		
	
	
	
		
		
		
			
			 
			
				11-24-2011, 12:50 AM
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Sarnak 
				
				
				
			 | 
			  | 
			
				
				
					Join Date: Dec 2007 
					
					
					
						Posts: 60
					 
					
					
					
					     
				 
				
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
			
			
			 
			
		
		
		
		Thread necroing, sorry -- Wondering if there was a way to implement punishment via perl script, or debuff ? 
		
	
		
		
		
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
	
		 
	 
 
 
	
		
	
	
	
	
	
		
	
		 
		Posting Rules
	 | 
 
	
		
		You may not post new threads 
		You may not post replies 
		You may not post attachments 
		You may not edit your posts 
		 
		
		
		
		
		HTML code is Off 
		 
		
	  | 
 
 
	 | 
	
		
	 | 
 
 
All times are GMT -4. The time now is 02:46 AM. 
 
		 
	 
 
 
     | 
     | 
    
   
      | 
     | 
      | 
    
   
     | 
      | 
     | 
    
   
       | 
      | 
       | 
     
    
    
  | 
   |