EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Development::Server Code Submissions (https://www.eqemulator.org/forums/forumdisplay.php?f=669)
-   -   MQWarp/MQZone/MQGate Detector (Code Name: The VZTZ Hammer!) (https://www.eqemulator.org/forums/showthread.php?t=24761)

TheLieka 03-28-2008 05:20 PM

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.


TheLieka 03-28-2008 05:24 PM

.\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.

TheLieka 03-28-2008 05:27 PM

.\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;
}


TheLieka 03-28-2008 05:30 PM

.\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;
}


TheLieka 03-28-2008 05:32 PM

.\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:

Code:

                case GMSummon:
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;
        }


TheLieka 03-28-2008 05:36 PM

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)

TheLieka 03-28-2008 05:38 PM

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;
SQL Step 2: Batch the updated zonefiles back in.

Code:

insert into zone_points values (1, 'qeynos',1,464,-442,1.5,0,-151,-5,1.5,999,0,2);
insert into zone_points values (3, 'qeynos',2,586,-80,1.5,0,-26,356,1.5,999,0,2);
insert into zone_points values (7, 'qeynos2',9,1395,999999,999999,0,-304.6,999999,999999,999,0,4);
insert into zone_points values (10, 'feerrott',5,-2380,2601,26,0,-766,1034.5,107.2,0,0,72);
insert into zone_points values (11, 'feerrott',77,870.59,-160.11,-6.37,0,-901.31,444.21,-152.87,999,0,202);
insert into zone_points values (14, 'commons',0,0,0,0,0,0,0,-32,128,0,152);
insert into zone_points values (17, 'qey2hh1',2,999999,-15998,0,0,999999,3194,4,999,0,13);
insert into zone_points values (18, 'northkarana',1,999999,3275,-1.4,0,999999,-15844,0,999,0,12);
insert into zone_points values (19, 'northkarana',2,999999,-3100,999999,0,999999,1143.7,999999,999,0,15);
insert into zone_points values (20, 'eastkarana',1,999999,1143.7,999999,0,999999,-3100,999999,999,0,13);
insert into zone_points values (21, 'northkarana',3,-4508.36,999999,-31.27,0,2700,895,-30.03,128,0,14);
insert into zone_points values (23, 'eastkarana',2,3602,-2074,11.22,0,-1187,-443,32,999,0,16);
insert into zone_points values (24, 'beholder',1,-1184.86,-452.33,37.5,0,3371,-2284,51,999,0,15);
insert into zone_points values (25, 'eastkarana',3,-3088,-8339,693,0,835,109,3.13,999,0,5);
insert into zone_points values (27, 'southkarana',2,-3143,931,-9,0,-79.3,-7.9,4,999,0,18);
insert into zone_points values (31, 'beholder',2,907,-1846,4.75,0,-116.69,-23.31,4,999,0,11);
insert into zone_points values (38, 'highkeep',1,56.81,96.21,3.13,0,63.33,-106.07,3.13,999,0,5);
insert into zone_points values (40, 'commons',1,900,4180,-48,0,1464.44,-1088.05,-48,999,0,20);
insert into zone_points values (41, 'kithicor',3,1464,-1089,-48,0,904.3,4216,-48.97,999,0,21);
insert into zone_points values (45, 'commons',2,999999,-1621,999999,0,999999,5045,999999,999,0,22);
insert into zone_points values (47, 'commons',3,-1146,597,-39,0,-75.27,35.22,3.13,999,0,36);
insert into zone_points values (49, 'ecommons',2,999999,5050,999999,0,10.3,-1475,-51,65,0,21);
insert into zone_points values (51, 'ecommons',3,999999,-1600,999999,0,-28,775,-24,191,0,9);
insert into zone_points values (52, 'nektulos',1,2250.9,-1110.4,1.8,0,12,158,31,999,0,40);
insert into zone_points values (53, 'ecommons',4,1552,649,-17,0,-2698,-653,999999,999,0,25);
insert into zone_points values (67, 'nektulos',2,41,156,32,0,1529,614,-18,999,0,22);
insert into zone_points values (68, 'nektulos',5,-2702.2,-660.4,-18,0,1529,614,-18,999,0,22);
insert into zone_points values (69, 'nektulos',3,3107,289,-17,0,-2091,-205,-14,0,0,27);
insert into zone_points values (71, 'gukbottom',7,0,0,0,0,1630,359,-88,999,0,65);
insert into zone_points values (75, 'lavastorm',2,1349,330,3,0,268.8,7.5,3,0,0,80);
insert into zone_points values (77, 'guktop',7,0,0,0,0,1667,-136,-98,360,0,66);
insert into zone_points values (94, 'feerrott',1,-1132,-3124.12,-9.22,0,-1132.7,1888.8,-9,226.9,0,46);
insert into zone_points values (97, 'feerrott',2,364.44,3415.17,3.13,0,1007.7,-2864.3,17,59.1,0,50);
insert into zone_points values (99, 'feerrott',4,1667,808,60,0,-385.27,-96.32,3.5,2.5,0,49);
insert into zone_points values (101, 'feerrott',3,-1451.82,-111.83,51,0,70.4,-65.1,3.1,64,0,48);
insert into zone_points values (108, 'southkarana',4,2900,999999,-31,0,-4472,1206,-30.03,0,0,13);
insert into zone_points values (121, 'erudsxing',1,0,0,3,0,115,325,23.75,360,0,24);
insert into zone_points values (126, 'felwithea',1,-1943,-2595,25,0,6,255,3,0,0,54);
insert into zone_points values (148, 'akanon',1000,54,-76,2,0,-2062,528,-110,999,0,56);
insert into zone_points values (181, 'erudnint',1,0,0,0,0,712,806,22,999,0,23);
insert into zone_points values (182, 'erudnint',2,711.4,793,5.8,63.6,-770,-182,54,0,0,24);
insert into zone_points values (186, 'butcher',4,1355,3239,11.75,0,410.05,-9171.42,10,999,0,69);
insert into zone_points values (187, 'oasis',3,0,0,3,0,0,0,3,0,0,93);
insert into zone_points values (197, 'highkeep',2,-91.98,91.48,3.13,0,-88.57,-107.04,3.13,999,0,5);
insert into zone_points values (214, 'qeynos',5,276,-552,-52,0,339,-175,-67,999,0,45);
insert into zone_points values (336, 'felwithea',2,350,-720,-10,0,244,-834,-10,0,0,62);
insert into zone_points values (337, 'felwithea',3,43,210,3,0,-1931,-2632,21,0,128,54);
insert into zone_points values (338, 'gfaydark',1,-1934,-2597,23,0,40,200,4,999,0,61);
insert into zone_points values (339, 'gfaydark',2,-2612,-1112,3.13,0,2175,-1202,3.13,999,0,57);
insert into zone_points values (340, 'gfaydark',3,-1641,2665,3.13,0,-1320,-3082,3.13,999,0,68);
insert into zone_points values (341, 'gfaydark',4,2600,-55,19,0,-660,162,4,999,0,58);
insert into zone_points values (342, 'gfaydark',177,-182,-744,-1.3,0,838,882,-157,999,0,202);
insert into zone_points values (343, 'gfaydark',178,-2245,-1820,0.4,0,812,97,-157,999,0,202);
insert into zone_points values (345, 'crushbone',1,-632,163,3.13,0,2608,-55,18.5,999,0,54);
insert into zone_points values (370, 'felwitheb',1,244,-834,-10,0,344,-720,-10,0,0,61);
insert into zone_points values (371, 'felwitheb',2,0,0,0,0,524,-497,-2,0,0,62);
insert into zone_points values (372, 'felwitheb',3,0,0,0,0,583,-602,-5,0,0,62);
insert into zone_points values (373, 'felwitheb',4,0,0,0,0,484,-717,-4,0,0,62);
insert into zone_points values (374, 'felwitheb',5,0,0,0,0,301,-587,-10,0,0,62);
insert into zone_points values (375, 'felwitheb',6,0,0,0,0,301,-587,-10,0,0,62);
insert into zone_points values (376, 'felwitheb',7,0,0,0,0,301,-587,-10,0,0,62);


TheLieka 03-28-2008 05:45 PM

SQL Part 2: Continued
Code:


insert into zone_points values (377, 'freporte',9,100,-64,-24,0,-84,-926,-28,999,0,9);
insert into zone_points values (378, 'freporte',10,448,-360,-28,0,-418,-622,-28,999,0,9);
insert into zone_points values (379, 'freporte',11,-1306,999999,-52.21,0,4131,332,-24.28,999,0,34);
insert into zone_points values (380, 'freporte',53,-155,344,-94,0,-740,-1632,-94,999,0,9);
insert into zone_points values (381, 'freportw',5,149,-716,-11,0,12,-656,-55,999,0,9);
insert into zone_points values (382, 'freportw',6,96,-652,-39,0,147,-682,-13,999,0,9);
insert into zone_points values (383, 'freportw',7,270,-699,-25,0,-376,-83,999999,999,0,8);
insert into zone_points values (384, 'freportw',8,225,-126,-10,0,-415,491,999999,999,0,8);
insert into zone_points values (385, 'freportw',9,-84,-926,-28,0,100,-64,-24,999,0,10);
insert into zone_points values (386, 'freportw',10,-418,-622,-28,0,448,-360,-28,999,0,10);
insert into zone_points values (387, 'freportw',12,999999,775,-24,0,999999,-1592,-54,999,0,22);
insert into zone_points values (388, 'freportw',51,1585,-272,2,0,372,722,-8,999,0,8);
insert into zone_points values (389, 'freportw',52,719,-586,-20,0,-2,-441,-18,999,0,8);
insert into zone_points values (390, 'freportw',53,-740,-1632,-94,0,-155,344,-94,999,0,10);
insert into zone_points values (391, 'freportw',177,0,0,0,0,-406,-234,-157,258,0,202);
insert into zone_points values (392, 'freportn',7,-379,-83,-25,0,267,-700,999999,0,0,9);
insert into zone_points values (393, 'freportn',8,-415,491,-11,0,227,-124,999999,0,0,9);
insert into zone_points values (394, 'freportn',51,372,722,-11,0,1590,-275,4,0,0,9);
insert into zone_points values (395, 'freportn',52,-6,-436,-20,0,730,-581,-18,0,0,9);
insert into zone_points values (396, 'grobb',1,-133,50,3.13,0,-2827,-665.3,-30,127.5,0,46);
insert into zone_points values (397, 'halas',1,-692.79,-77.88,3.13,0,3684,380,5,999,0,30);
insert into zone_points values (398, 'kaladima',1,-64.45,42.17,3.13,0,3131,-179,3.13,999,0,68);
insert into zone_points values (399, 'kaladima',2,419.97,333.59,-18.15,0,416,340,-22,999,0,67);
insert into zone_points values (400, 'kaladima',3,390,-264,3.13,0,354,-224,4,999,0,67);
insert into zone_points values (401, 'kaladimb',1,416,340,-22,0,419.97,333.59,-18.15,999,0,60);
insert into zone_points values (402, 'kaladimb',2,354,-224,4,0,390,-264,4,999,0,60);
insert into zone_points values (413, 'neriaka',1,0,0,0,0,-242,999999,999999,999,0,41);
insert into zone_points values (414, 'neriaka',2,86,-354,-11,0,999999,-367,999999,999,0,41);
insert into zone_points values (415, 'neriaka',3,29,155,30,0,2252,-1105,1,999,0,25);
insert into zone_points values (416, 'neriakb',1,0,0,0,0,-247,999999,999999,999,0,40);
insert into zone_points values (417, 'neriakb',2,86,-401,-11,0,999999,-361,999999,999,0,40);
insert into zone_points values (418, 'neriakb',3,200,-852,-39,0,206,999999,999999,999,0,42);
insert into zone_points values (419, 'neriakc',1,205,-852,-39,0,200,999999,999999,999,0,41);
insert into zone_points values (420, 'neriakc',2,0,0,0,0,-876,1146,-1,252,0,57);
insert into zone_points values (440, 'oggok',1,-396,-90,4,0,1609,901.4,58,126,0,47);
insert into zone_points values (472, 'qeynos',3,0,0,0,0,230,-64,-80,129,0,45);
insert into zone_points values (473, 'qeynos',4,177,-477,-16,0,307,-184,-38,250,0,45);
insert into zone_points values (474, 'qeynos',22,-185,149,-64,0,-175,147,-77,999,0,45);
insert into zone_points values (475, 'qeynos',33,-151,-596,-25,0,217,-301,-38,999,0,45);
insert into zone_points values (476, 'qeynos2',1,0,0,0,0,-168,-714,-10,999,0,2);
insert into zone_points values (477, 'qeynos2',2,0,0,0,0,-30,-153,9,250,0,2);
insert into zone_points values (478, 'qeynos2',4,0,0,0,0,-175,141,-80,384,0,45);
insert into zone_points values (479, 'qeynos2',5,175,90,-39,0,637,105,-38,999,0,45);
insert into zone_points values (480, 'qeynos2',6,194,348,-27,0,889,217,-50,999,0,45);
insert into zone_points values (481, 'qeynos2',14,0,0,0,0,893,756,-82,0,0,2);
insert into zone_points values (482, 'qeynos2',77,0,0,0,0,147,-289,-157,383,0,202);
insert into zone_points values (483, 'qeynos2',99,308,-161,4,0,1057,-49,-43,999,0,45);
insert into zone_points values (484, 'qcat',1,-175,147,-77,0,-189,127,-90,999,0,1);
insert into zone_points values (485, 'qcat',2,217,-301,-38,0,-147,-608,-24,999,0,1);
insert into zone_points values (486, 'qcat',3,307,-184,-38,0,175,-483,-27,999,0,1);
insert into zone_points values (487, 'qcat',4,339,-175,-67,0,273,-553,-62,999,0,1);
insert into zone_points values (488, 'qcat',5,637,105,-40,0,175,90,-38,999,0,2);
insert into zone_points values (489, 'qcat',6,889,217,-50,0,190,340,-30,999,0,2);
insert into zone_points values (490, 'qcat',7,0,0,0,0,1122,-852,-50,275,0,38);
insert into zone_points values (491, 'qcat',99,1051,-49,-58,0,302,-161,-13,999,0,2);
insert into zone_points values (492, 'rivervale',98,-371,-278,4,0,2022,3825,463,999,0,20);
insert into zone_points values (493, 'rivervale',99,0,0,0,0,410,-2552,-4,999,0,33);
insert into zone_points values (537, 'qrg',5,-594.8,211.9,2.8,0,5100.9,196.7,-1,128,0,4);
insert into zone_points values (538, 'qrg',7,47.4,-512.2,42.8,129.6,47.4,-512.2,42.8,0,0,3);
insert into zone_points values (549, 'butcher',1,-1312,-3070,3.75,0,-1650,2673,1,999,0,54);
insert into zone_points values (550, 'butcher',2,3114.75,-186.57,3.75,0,-64,42,4,999,0,60);
insert into zone_points values (551, 'butcher',3,-2929,-344,3.75,0,2856,262,473,999,0,70);
insert into zone_points values (552, 'butcher',77,1752,-502,1,0,829,474,-157,999,0,202);
insert into zone_points values (557, 'cauldron',1,2856,262,472.47,0,-2935,-337,3.13,999,0,68);
insert into zone_points values (558, 'cauldron',2,-1167,-1013,-330,0,100,30,326,999,0,64);
insert into zone_points values (559, 'cauldron',3,-2002.06,-627.76,93.15,0,64,330,3.13,999,0,63);
insert into zone_points values (575, 'ecommons',1,-2462,-105,3.13,0,2604,2903,3.13,999,0,34);
insert into zone_points values (590, 'everfrost',1,3700,370,3,0,-676,-76.46,3.13,999,0,29);
insert into zone_points values (591, 'everfrost',2,-3061,-530,-109,0,95,-340,4,999,0,17);
insert into zone_points values (592, 'everfrost',3,2020,-7048,-60,0,-60,100,4,999,0,73);
insert into zone_points values (594, 'everfrost',77,2884.4,-75,-60,0,846,131,-157,999,0,202);
insert into zone_points values (640, 'innothule',1,2569.11,1140.77,-24.78,0,-3203,1098,-21,192.2,0,35);
insert into zone_points values (641, 'innothule',2,-1131.29,1893.76,-9.22,0,-1102,-3100.5,-9,8,0,47);
insert into zone_points values (642, 'innothule',3,-2763.64,-615.55,-31.44,0,-95.1,-2.3,3.1,9.1,0,52);
insert into zone_points values (643, 'innothule',4,140.98,-827.97,-8.37,0,-36,7.4,3,255.5,0,65);
insert into zone_points values (644, 'innothule',77,-731.99,-30.93,-25.78,0,-812,95,-157,999,0,202);
insert into zone_points values (647, 'kerraridge',1,467.9,-915.7,23,60.3,-512,2653,-34.5,194.8,0,38);
insert into zone_points values (648, 'kithicor',1,644,4890,693,0,-979,91,4,999,0,5);
insert into zone_points values (649, 'kithicor',2,2007,3825,465,0,-369,-282,4,999,0,19);
insert into zone_points values (657, 'lavastorm',1,-937.4,-1063,16,0,-15,856,5,999,0,44);
insert into zone_points values (658, 'lavastorm',25,-2117.83,-194.11,-16.45,0,3107,289,-17,999,0,25);
insert into zone_points values (659, 'lavastorm',31,798,223,129,0,-476.07,-485.77,73.72,999,0,31);
insert into zone_points values (660, 'lavastorm',32,915,483,54,0,-413,-265,-112,999,0,32);
insert into zone_points values (663, 'lfaydark',1,925,-2185,0,0,579,2205,-112,999,0,56);
insert into zone_points values (664, 'lfaydark',2,2179,-1213,0,0,-2624,-1113,1,999,0,54);
insert into zone_points values (665, 'lfaydark',3,-1111,3360,4,0,-347,126,-182,999,0,59);
insert into zone_points values (666, 'lfaydark',9,0,0,0,0,910,-1775,-75,226,0,42);
insert into zone_points values (675, 'misty',1,-834,1432,-7,0,228,152,6,999,0,11);
insert into zone_points values (676, 'misty',2,410,-2588,-7,0,-79,78,5,1470,0,19);
insert into zone_points values (677, 'misty',77,0,0,0,0,830,1227,-157,511,0,202);
insert into zone_points values (685, 'nektulos',77,0,0,0,0,-841,132,-157,257,0,202);
insert into zone_points values (686, 'nro',1,4175,999999,-24.27,0,-1097,999999,-52.22,999,0,10);
insert into zone_points values (687, 'nro',2,-1889,999999,3,0,2501.1,999999,999999,999,0,37);
insert into zone_points values (688, 'nro',3,2626,2908,4,0,-2461,-152,4,999,0,22);
insert into zone_points values (689, 'nro',4,0,0,0,0,5330,390,-15,322,0,110);
insert into zone_points values (690, 'northkarana',0,0,0,0,0,0,0,-32,128,0,152);
insert into zone_points values (691, 'northkarana',6,0,0,0,0,0,0,-25,0,0,152);
insert into zone_points values (692, 'oasis',1,2545,999999,999999,0,-1876,999999,999999,999,0,34);
insert into zone_points values (693, 'oasis',2,-1876,255,5,0,1530,95.6,7,104.9,0,35);
insert into zone_points values (700, 'qeytoqrg',1,-304.6,999999,999999,0,1395,999999,999999,999,0,2);
insert into zone_points values (701, 'qeytoqrg',2,1222,-2468,-1,0,36,45,999999,999,0,12);
insert into zone_points values (703, 'qeytoqrg',3,3436,-1135,3,0,-162.1,16.05,3.8009,999,0,17);
insert into zone_points values (704, 'qeytoqrg',4,5199,69,-3,0,-65.9,136.9,4,241,0,3);
insert into zone_points values (725, 'rathemtn',1,3411,3036,-1.4,0,2518,-2282,4,999,0,51);
insert into zone_points values (726, 'rathemtn',2,416,-3108,3,0,377,3424,2,999,0,47);
insert into zone_points values (738, 'sro',1,1535,196,5,0,-1899,95.6,7,11.2,0,37);
insert into zone_points values (739, 'sro',2,-3207,1137,-23,0,2563,1153,-23,117.1,0,46);
insert into zone_points values (740, 'southkarana',1,-8554,1144,3,0,4374,1151,1,999,0,51);
insert into zone_points values (741, 'steamfont',1,-2056,526,-107,0,54,-77,4,999,0,55);
insert into zone_points values (742, 'steamfont',2,590,2212,-110,0,918,-2177,-4,999,0,57);


TheLieka 03-28-2008 05:47 PM

SQL Part 2: Concluded

Code:

insert into zone_points values (743, 'steamfont',77,0,0,0,0,-401,-76,-157,255,0,202);
insert into zone_points values (752, 'soltemple',1,243,56,2,0,1322.4,280.9,149,128,0,27);
insert into zone_points values (769, 'tox',0,-1518.6,-919.3,-37.4,0,0,0,-32,128,0,152);
insert into zone_points values (770, 'tox',1,2515.4,222.29,-44.72,0,-1556,-184,-45,999,0,24);
insert into zone_points values (771, 'tox',2,-2627,-431,-41,0,878.4,101.5,3.8,92.5,0,75);
insert into zone_points values (772, 'tox',3,-512,2653,-34.5,62,467.9,-915.7,24,60.3,0,74);
insert into zone_points values (773, 'tox',4,0,0,0,0,266,203,-38,0,0,45);
insert into zone_points values (774, 'tox',77,2326,-580,-45,0,662,36,-157,256,0,202);
insert into zone_points values (775, 'tox',177,-2339,284,-47,0,-840,1227,-157,257,0,202);
insert into zone_points values (799, 'qey2hh1',1,0,0,0,0,1238,-2449,-2,999,0,4);
insert into zone_points values (800, 'arena',1,-57.43,-844.61,12.02,0,2346.56,2676.59,97,999,0,51);
insert into zone_points values (801, 'befallen',1,-75.27,35.22,3.75,0,-1150,596,-38,999,0,21);
insert into zone_points values (802, 'blackburrow',1,-158.97,38.92,3.75,0,3431,-1155,3.75,999,0,4);
insert into zone_points values (803, 'blackburrow',2,94.53,-345.21,3.75,0,-3058,-530,-109,999,0,30);
insert into zone_points values (804, 'blackburrow',7,163.07,148.64,-155.19,0,270,2730,-2,999,0,181);
insert into zone_points values (806, 'lakerathe',1,2513,-2280,5,0,3411,3036,-2,999,0,50);
insert into zone_points values (807, 'lakerathe',2,2347.52,2704.3,95,0,-59,-841,9,999,0,77);
insert into zone_points values (808, 'lakerathe',3,4376.63,1155.48,3.13,0,-8563,1156,4,999,0,14);
insert into zone_points values (851, 'guktop',1,1632,353,-87,0,1667,-136,-98,0,0,66);
insert into zone_points values (852, 'guktop',2,1535,-71,-98,0,1498,-13,-94,0,0,66);
insert into zone_points values (853, 'guktop',4,1134,608,-81,0,1127,650,-85,999,0,66);
insert into zone_points values (854, 'guktop',5,1196,-192,-78,0,1196,-212,-78,0,0,66);
insert into zone_points values (855, 'guktop',6,-63.68,41.72,3.13,0,172.2,-811.6,-7,65.1,0,46);
insert into zone_points values (857, 'gukbottom',1,1667,-136,-98,0,1630,359,-88,0,0,65);
insert into zone_points values (858, 'gukbottom',2,1498,-13,-94,0,1527,-59,-94,0,0,65);
insert into zone_points values (860, 'gukbottom',4,1127,650.56,-88,0,1134,608,-81,999,0,65);
insert into zone_points values (861, 'gukbottom',5,1196,-212,-81,0,1196,-192,-78,0,0,65);
insert into zone_points values (862, 'gukbottom',3,0,0,0,0,170,-818,-9,0,0,46);
insert into zone_points values (888, 'mistmoore',1,-350,123,-178,0,-1115,3359,4,999,0,57);
insert into zone_points values (889, 'najena',1,-19,869,4,0,-936,-1058,13,999,0,27);
insert into zone_points values (905, 'permafrost',1,0,0,0,0,2022,-7073,-55,999,0,30);
insert into zone_points values (910, 'soldunga',1,-443,-525,70,0,783.95,227.54,127.36,999,0,27);
insert into zone_points values (911, 'soldunga',2,-303,-507,25,0,-273,-506,25,999,0,32);
insert into zone_points values (912, 'soldunga',3,-1080,-541,-0.9,0,-1081,-518,-0.9,999,0,32);
insert into zone_points values (914, 'soldunga',5,-361,-384,13,0,-364,-413,11,999,0,32);
insert into zone_points values (915, 'soldunga',6,-705,-450,-12,128,-706,-434,-29,52,0,32);
insert into zone_points values (916, 'soldunga',7,-286,-506,25,0,-278,999999,999999,999,0,32);
insert into zone_points values (917, 'soldunga',8,-165,-551,26,0,-166,-582,17,999,0,32);
insert into zone_points values (918, 'soldunga',9,-986,-566,2,0,-977,-475,-28,128,0,32);
insert into zone_points values (920, 'soldunga',11,0,0,0,0,-371,999999,999999,999,0,32);
insert into zone_points values (921, 'soldunga',12,-872,-391,11,0,-907,-381,10,128,0,31);
insert into zone_points values (970, 'paw',1,0,0,0,0,-3143,931,-11,999,0,14);
insert into zone_points values (971, 'unrest',1,81,335,3,0,-2032,-626,91,999,0,70);
insert into zone_points values (977, 'qeynos2',7,-151,-5,1.5,0,464,-442,1.5,999,0,1);
insert into zone_points values (978, 'qeynos2',8,-26,356,1.5,0,586,-80,1.5,999,0,1);
insert into zone_points values (1142, 'kedge',1,0,0,0,0,-1182,-1009,-334,999,0,70);
insert into zone_points values (1145, 'highpass',1,844.8,105.4,4.1,0,-3097,-8338,690,999,0,15);
insert into zone_points values (1146, 'highpass',2,-981,92,431,0,557,4892,691,999,0,20);
insert into zone_points values (1147, 'soldungb',1,-413,-265,-112,0,911.18,484.37,57.44,999,0,27);
insert into zone_points values (1148, 'soldungb',2,-281,-506,25,0,-295,-505,26,144,0,31);
insert into zone_points values (1149, 'soldungb',3,-1084,-536,0,0,-1084,-538,0,999,0,31);
insert into zone_points values (1150, 'soldungb',4,0,0,0,0,999999,-454,999999,999,0,31);
insert into zone_points values (1151, 'soldungb',5,-365,-400,11,0,-372,-381,13,122,0,31);
insert into zone_points values (1152, 'soldungb',6,-361,-400,11,0,999999,-398,999999,999,0,31);
insert into zone_points values (1153, 'soldungb',7,-281,-506,25,0,-176,-537,29,157,0,31);
insert into zone_points values (1154, 'soldungb',8,0,0,0,0,999999,-570,21,999,0,31);
insert into zone_points values (1155, 'soldungb',9,-996,-489,-24,0,-972,-504,-22,128,0,31);
insert into zone_points values (1158, 'runnyeye',1,0,0,0,0,903,-1844,4,999,0,16);
insert into zone_points values (1159, 'runnyeye',2,248,141,4,0,-830,1431,-9,999,0,33);
insert into zone_points values (1160, 'erudnext',1,-1398.23,-256.76,-40.28,128,-1410.7,-184.5,38,999,0,24);
insert into zone_points values (1161, 'erudnext',2,-1408.01,-308.03,40.7,0,-1410.7,-310.3,-42,128,0,24);
insert into zone_points values (1162, 'erudnext',3,-1556,-184,-45,999,2550,296,-48,999,0,38);
insert into zone_points values (1174, 'cazicthule',1,70.4,-65.1,3.1,64,-1464,-107,52,5,0,47);
insert into zone_points values (1218, 'fearplane',1,844,482,142,0,-2288,2605,1,999,0,47);
insert into zone_points values (1268, 'paineel',1,891,105,4,0,-2607,-429,-42,40,0,38);
insert into zone_points values (1269, 'paineel',2,0,0,0,0,669.6,300,-69.4,148.6,0,39);
insert into zone_points values (1270, 'paineel',3,735,-884,-33,0,746,-900,-34,192,0,101);
insert into zone_points values (1271, 'paineel',4,601.3,-940.8,-94.2,0,800,200,0,0,0,75);
insert into zone_points values (1272, 'paineel',5,0,0,0,0,725,999999,999999,999,0,75);
insert into zone_points values (1273, 'paineel',10,910.9,523.3,-118.2,0,959,557.3,-79,64,0,75);
insert into zone_points values (1274, 'paineel',11,959,557.3,-79,192,906,525,-121,128,0,75);
insert into zone_points values (1275, 'paineel',12,881.6,755.9,-77.2,124.9,1068.7,658.2,-36.2,128,0,75);
insert into zone_points values (1276, 'paineel',13,1085.8,657.7,-35.3,128,464,217,41,0,0,75);
insert into zone_points values (1277, 'paineel',14,1068.7,658.2,-35.2,0,886,755,-77,0,0,75);
insert into zone_points values (1278, 'paineel',15,476,217,43.7,0,1091,658,-41,0,0,75);
insert into zone_points values (1314, 'warrens',2,-92.4,1142,-107.2,59.8,712,-876,-33,107,0,75);
insert into zone_points values (1315, 'warrens',3,750,-887,-33,0,712,-876,-33,107,0,75);
insert into zone_points values (1327, 'erudnext',4,-645,-193.6,77.7,65,712,807,22,192,0,23);
insert into zone_points values (1328, 'highpass',3,-91.5,-112.6,4.1,0,-16,88,4.1,192.2,0,6);
insert into zone_points values (1329, 'highpass',4,62.8,-112.6,4.1,0,-16,88,4.1,192.2,0,6);
insert into zone_points values (1333, 'soldungb',12,-705,-450,-12,0,-681,-463,-20,34,0,31);
insert into zone_points values (1750, 'erudnext',5,-645.1,-271.1,-70.7,192.4,-394.1,-6.6,41.8,0,0,24);
insert into zone_points values (1751, 'erudnext',6,-344.1,-10,39.8,0,-770,-183,54.7,0,0,24);

Holy shit - ok, I wonder if anyone else will actually make it through all that. ;) Nonetheless, that's the pride and joy of VZ/TZ - enjoy it and keep those hackers at bay. :)

Thanks,
Dax

TheLieka 03-28-2008 06:22 PM

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);
insert into zone_points values (1164, 'airplane', 3, 0, 0, 0, 0, 516, 1108, -8, 999, 0, 71);
insert into zone_points values (1165, 'airplane', 4, 0, 0, 0, 0, -103, -434, -359, 999, 0, 71);
insert into zone_points values (1166, 'airplane', 5, 0, 0, 0, 0, 564, 320, -55, 0, 0, 71);
insert into zone_points values (1167, 'airplane', 6, 0, 0, 0, 0, 1185, -781, 130, 999, 0, 71);
insert into zone_points values (1168, 'airplane', 7, 0, 0, 0, 0, -884, 1089, 412, 999, 0, 71);
insert into zone_points values (1169, 'airplane', 8, 0, 0, 0, 0, -750, 306, 772, 999, 0, 71);
insert into zone_points values (1170, 'airplane', 9, 0, 0, 0, 0, -984, -471, 1013, 999, 0, 71);
insert into zone_points values (1171, 'airplane', 10, 0, 0, 0, 0, -262, -1294, 1221, 999, 0, 71);
insert into zone_points values (1172, 'airplane', 11, 999999, 999999, -2000, 999, -41.52, -1552.49, -70.81, 999, 0, 10);
insert into zone_points values (1173, 'airplane', 12, 0, 0, 0, 0, 1463, 574, -765, 250, 0, 71);

Dax

moydock 03-28-2008 07:42 PM

Holy. Shit. Much appreciation Dax. I'll post results, may take me a few days :).

Aramid 03-29-2008 12:45 AM

Quote:

Originally Posted by TheLieka (Post 145527)
REQUIRED SQL:
Code:


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


You have a duplicate Zone:MQGateExemptStatus rule in your sql. Should the last one have been :

Code:


insert into rule_values values (0, Zone:MQGhostExemptStatus, 50); ?


mattmeck 03-29-2008 04:44 AM

I just have to say..


Thank you for sharing, this is big and will help the community.

cavedude 03-29-2008 05:09 AM

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);
under Client::CheatDetected

needs to be:

Code:

AddBuff(this,(RuleI(Zone, MQZoneDetectionSpellID)),30);
Also, "False" in ruletypes.h needs to be "false", for Linux anyway.

Thanks for sharing this, it certainly is brilliantly written besides the minor typos here and there.

TheLieka 03-29-2008 06:56 AM

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


All times are GMT -4. The time now is 01:25 PM.

Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.