Plugin: MQ2PiggyZone

Fry

Fry Guy
Joined
Jan 31, 2005
Messages
11,859
Reaction score
586
Points
113
Location
Australia
Website
www.mmobugs.com
Original Author: Cosmic

Code:
// MQ2PiggyZone.cpp : Defines the entry point for the DLL application.
//
// updated to work with VC6 (previously only worked in VS.NET)
//
//
//
//
// /zone qeynos2 - takes you to North Qeynos if it knows a path
// /zone force qeynos - takes you directly to North Qeynos and crashes if you aren't adjacent
// /findpath qeynos2 - displays the path to North Qeynos
// /findpath North - displays all of the zonenames whose long name contains "North"
// /fade - zones you to the zone you are already in (even if its instanced)
// /gate - Returns you to your bind point
//

#include "../MQ2Plugin.h"

PreSetup("MQ2PiggyZone");

// Comment this out to update the offsets/opcodes/structs manually
#define UseMMOBugs True

#ifdef UseMMOBugs
#include "../MQ2MMOBugs.h"
#else
#define LocalCEverQuest__DoTheZone 0x4C6650   // 06-13-06
#define PKT_UPDATE_POSITION 0x3813
#define PKT_CHANNEL_MESSAGE 0x2C2D
//Code borrowed directly from MQ2CSum
// setup move packet
struct _MOVEPKT {
/*0000*/ unsigned short SpawnID;
/*0002*/ unsigned short TimeStamp;
/*0004*/ int DeltaHeading:16;
/*0006*/ int padding0020:16;
/*0008*/ float DeltaZ;
/*0012*/ float Y;
/*0016*/ int Animation:16;
/*0018*/ int Heading:16;
/*0020*/ float X;
/*0024*/ float DeltaY;
/*0028*/ float DeltaX;
/*0032*/ float Z;
} P; // 36
struct _MSGPACKET {
/*0000*/ char target[64];
/*0064*/ char sender[64];
/*0128*/ unsigned int language;
/*0132*/ unsigned int channel;
/*0136*/ char padding136[8];
/*0144*/ unsigned int languageskill;
/*0148*/ char message[100];
} M;
#endif

#define INFINITY ((int) pow(2, sizeof(int)*8-2)-1)


typedef struct
{
	int connections[100]; // An array of edges which has this as the starting node
	int numconnect;
} FWVertice;

typedef struct
{
	int Zone;
	char Name[50];
	char Phrase[20][50];
	int Destination[20];
	float X,Y,Z;
	int DestCnt;
} NPCTeleporter;

FWVertice *V=NULL;
NPCTeleporter NPCs[100];
int NPCCnt;
int* distances=NULL;
int* predecessor=NULL;

class LocalCEverQuest;
class LocalCEverQuest
{
public:
	__declspec(dllexport) char * LocalCEverQuest::DoTheZone(int,char *,int,int,float,float,float,int);
};

#ifdef LocalCEverQuest__DoTheZone
FUNCTION_AT_ADDRESS(char * LocalCEverQuest::DoTheZone(int,char *,int,int,float,float,float,int),LocalCEverQuest__DoTheZone);
#endif

LocalCEverQuest **ppLEQ;
#define pLEQ (*ppLEQ)

void Setup();
bool UseNPC(PSPAWNINFO pChar, int dest);
PLUGIN_API VOID OnZoned(PSPAWNINFO pChar, PCHAR szLine);
PLUGIN_API VOID OnPulse(VOID);
DWORD ListSimilarZones(PCHAR ZoneShortName);
VOID ChangeZones(PSPAWNINFO pChar, PCHAR szLine); 
void FloydWarshall(FWVertice* vertices, int nodecount);
VOID FindPath(PSPAWNINFO pChar, PCHAR szLine); 
VOID SimFade(PSPAWNINFO pChar, PCHAR szLine); 
VOID SimGate(PSPAWNINFO pChar, PCHAR szLine); 

bool ZoneChange=false;  
float X,Y,Z;
int Heading;
int DestZone;
int ChainZone[100];
int ChainZoneCnt=0;
int DestType; // 0=use supplied coords 1=succorpoint
int ChainZoneType; // 0=use supplied coords 1=succorpoint
int ZoneReason;

int LastKnownZone=-1; //don't fire MyOnZoned when you first log in

void MyOnZoned(PSPAWNINFO pChar)
{
	if (ChainZoneCnt>0)
	{
		if (pChar->Zone != ChainZone[ChainZoneCnt])
		{
			ChainZoneCnt=0;
			return;
		}
		ChainZoneCnt--;
		DestZone=ChainZone[ChainZoneCnt];
		if (ChainZoneCnt==0) DestType=ChainZoneType;
		WriteChatColor("Attempting ChainZone...", USERCOLOR_DEFAULT); 
		if ( UseNPC(pChar,DestZone) == false)
		{
			ZoneChange=true;
		}
	}
	return;
}

PLUGIN_API VOID OnPulse(VOID)
{
	PSPAWNINFO pChar = NULL;
	if (ppCharSpawn && pCharSpawn) {
		pChar = (PSPAWNINFO)pCharSpawn;
		if ((pChar) && (!gZoning))
		{
			if (LastKnownZone == -1)	LastKnownZone=pChar->Zone;
			if (pChar->Zone != LastKnownZone)
			{
				LastKnownZone=pChar->Zone;
				MyOnZoned(pChar);
			}
		}
	}

	char aa[100]="test";
	if(ZoneChange)
	{
		ZoneChange=false;
		pLEQ->DoTheZone(DestZone,aa,DestType,ZoneReason,Y,X,Z,Heading);
	}
	return;
}

DWORD ListSimilarZones(PCHAR PartialName)
{
	CHAR szMsg[MAX_STRING] = "Bad Zone.ShortName. Suggest: ";
	CHAR szName[MAX_STRING] = {0};
	char *partial,*longname;

    PZONELIST pZone = NULL;

	partial=_strlwr(_strdup(PartialName));
    if (!ppWorldData | !pWorldData) return -1;
    for (int nIndex=0; nIndex < MAX_ZONES+1; nIndex++) {
      pZone = ((PWORLDDATA)pWorldData)->ZoneArray[nIndex];
        if(pZone )
		{
			longname=_strlwr(_strdup(pZone->LongName));
            if (strstr(longname,partial)) {
				sprintf(szName,"%s(%s) ",pZone->LongName,pZone->ShortName);
				if ((strlen(szMsg)+strlen(szName))>=300)
				{
					WriteChatColor(szMsg,USERCOLOR_DEFAULT);
					szMsg[0]=0;
				}
                strcat(szMsg,szName);
            }
			free(longname);
		}
    }
	WriteChatColor(szMsg,USERCOLOR_DEFAULT);
	free(partial);
    return -1; 
}

VOID ChangeZones(PSPAWNINFO pChar, PCHAR szLine) 
{ 
	CHAR szMsg[MAX_STRING] = {0};
	CHAR szParam[MAX_STRING] = {0};
	CHAR sZoneName[MAX_STRING] ={0};
	CHAR sWPName[MAX_STRING] ={0};
	CHAR sKeyData[MAX_STRING]={0};
	DWORD ZoneToGoTo; 
	int rLen;
	int i,j,cnt=0;
	bool IgnoreChain=false;
	int Param=1;

	GetArg(szParam,szLine,Param);
	if (_stricmp(szParam,"setwp")==0)
	{
		Param++;
		GetArg(sWPName,szLine,Param);
		if (sWPName[0]==0)
		{
			WriteChatColor("Usage: /zone setwp <WayPointName>", CONCOLOR_RED); 
			return;
		}
		sprintf(sKeyData,"%.2f %.2f %2.f %d",pChar->Y,pChar->X,pChar->Z,(int)pChar->Heading);
		WritePrivateProfileString(GetShortZone(pChar->Zone), sWPName, sKeyData, INIFileName); 
		WriteChatColor("Waypoint recorded", USERCOLOR_DEFAULT); 
		return;
	}
	if (_stricmp(szParam,"clearwp")==0)
	{
		Param++;
		GetArg(sWPName,szLine,Param);
		if (sWPName[0]==0)
		{
			WriteChatColor("Usage: /zone clearwp <WayPointName>", CONCOLOR_RED); 
			return;
		}
		WritePrivateProfileString(GetShortZone(pChar->Zone), sWPName, NULL, INIFileName); 
		WriteChatColor("Waypoint cleared", USERCOLOR_DEFAULT); 
		return;
	}
	if (_stricmp(szParam,"force")==0)
	{
		IgnoreChain=true;
		Param++;
	}
	GetArg(sZoneName,szLine,Param++);

	ZoneToGoTo = GetZoneID(sZoneName);

	if (ZoneToGoTo == -1) {
		ListSimilarZones(sZoneName);
		return;
	}

	Setup();

	if (IgnoreChain==false)
	{
		i=pChar->Zone;
		j=ZoneToGoTo;

		if (distances[i*MAX_ZONES+j]==0)
		{
			WriteChatColor("Poof! You are already there.", CONCOLOR_RED); 
			return;
		}

		if (distances[i*MAX_ZONES+j]==INFINITY)
		{
			WriteChatColor("I don't know a route to that zone.", CONCOLOR_RED); 
			return;
		}
	}
	GetArg(sWPName,szLine,Param++);
	if (sWPName[0]!=0)
	{
		CHAR sDefault[MAX_STRING]="none";
		GetPrivateProfileString(sZoneName,sWPName, sDefault, sKeyData, MAX_STRING, INIFileName); 
		if (_stricmp(sKeyData,"none")==0)
		{
			rLen=GetPrivateProfileString(sZoneName,NULL, sDefault, sKeyData, MAX_STRING, INIFileName); 
			for (int i=0;i<rLen-1;i++) if (sKeyData[i]==0) sKeyData[i]=',';
			sprintf(szMsg,"Bad Waypoint. Suggest: %s",sKeyData); 
			WriteChatColor(szMsg,USERCOLOR_DEFAULT); 
			return;
		}
		sscanf(sKeyData,"%f %f %f %d",&Y,&X,&Z,&Heading);
		DestType=0;
	}
	else
	{
		sprintf(sWPName,"default");
		CHAR sDefault[MAX_STRING]="none";
		GetPrivateProfileString(sZoneName,sWPName, sDefault, sKeyData, MAX_STRING, INIFileName); 
		if (_stricmp(sKeyData,"none")!=0)
		{
			sscanf(sKeyData,"%f %f %f %d",&Y,&X,&Z,&Heading);
			DestType=0;
		}
		else
		{
			Y=pChar->Y;
			X=pChar->X;
			Z=pChar->Z;
			Heading = (int)pChar->Heading;
			DestType=1;
		}
	}

	ChainZoneCnt=0;	//reset in case we failed to finish previous chain-zone attempt
	if (IgnoreChain==false)
	{
		while (i!=j)
		{
			ChainZone[ChainZoneCnt++]=j;
			j=predecessor[i*MAX_ZONES+j];
		}

		if (ChainZoneCnt>1) 
		{
			ChainZoneType=DestType;
			DestType=1;
		}
		DestZone = ChainZone[--ChainZoneCnt];
	}
	else
	{
		DestZone=ZoneToGoTo;
	}

	sprintf(szMsg,"Zoneing..."); 
	WriteChatColor(szMsg,USERCOLOR_DEFAULT); 
	ZoneReason=0;
	if (UseNPC(pChar,DestZone) == false) ZoneChange=true;
	return;
} 

VOID FindPath(PSPAWNINFO pChar, PCHAR szLine)
{
	CHAR sDest[MAX_STRING]={0};
	int ZoneToGoTo;
	int i,j,cnt=0,stops[100];

	GetArg(sDest,szLine,1);
	if (sDest[0]==0)
	{
		WriteChatColor("Usage: /FindPath <ShortZoneName>", CONCOLOR_RED); 
		return;
	}
	ZoneToGoTo = GetZoneID(sDest);

	if (ZoneToGoTo == -1) {
		ListSimilarZones(sDest);
		return;
	}

	Setup();

	i=pChar->Zone;
	j=ZoneToGoTo;

	if (distances[i*MAX_ZONES+j]==0)
	{
		WriteChatColor("Poof! You are already there.", CONCOLOR_RED); 
		return;
	}
	if (distances[i*MAX_ZONES+j]==INFINITY)
	{
		WriteChatColor("I don't know a route to that zone.", CONCOLOR_RED); 
		return;
	}

	WriteChatColor("My path:", CONCOLOR_RED); 
	while (i!=j)
	{
		stops[cnt++]=j;
		j=predecessor[i*MAX_ZONES+j];
	}

	while (cnt>0)
	{
		cnt--;
		WriteChatf("%s (%i)",GetShortZone(stops[cnt]), stops[cnt]);
//		WriteChatColor(GetShortZone(stops[cnt]),USERCOLOR_DEFAULT);
	}

}

void Setup()
{
	char sKey[300];
	char sKeyData[300];
	char *p;
	int i;
	if (distances!=NULL) free(distances);
    if (predecessor!=NULL) free(predecessor);
	if (V!=NULL) free(V);
	V = (FWVertice *)malloc(MAX_ZONES*sizeof(FWVertice));
	int tmp[100],cnt;
	for (i=0;i<MAX_ZONES;i++)
	{
		sprintf(sKey,"%d",i);
		V[i].numconnect=0;
		GetPrivateProfileString("ZoneConnections",sKey,"none",sKeyData,300,INIFileName);
		if (_stricmp(sKeyData,"none")!=0)
		{
			strtok(sKeyData,"\"");
			strtok(NULL,"\"");
			cnt=0;
			while ( (p=strtok(NULL,",")) != NULL)
			{
				tmp[cnt++]=atoi(p);
			}
			V[i].numconnect=cnt+1;
			for (int j=0;j<cnt;j++) V[i].connections[j]=tmp[j];
		}
		V[i].connections[V[i].numconnect++]=GetCharInfo2()->ZoneBoundID; //always connected to my bind point
	}

	//NPCTeleporter support
	NPCCnt=0;
	for (i=0;i<100;i++)
	{
		sprintf(sKey,"%d",(i+1));
		GetPrivateProfileString("NPCTeleporters",sKey,"none",sKeyData,300,INIFileName);
		if (_stricmp(sKeyData,"none")==0) break;
		NPCCnt++;
		NPCs[i].Zone=atoi(strtok(sKeyData," \""));
		strcpy(NPCs[i].Name,strtok(NULL,"\""));
		NPCs[i].Y=(float)atof(strtok(NULL," "));
		NPCs[i].X=(float)atof(strtok(NULL," "));
		NPCs[i].Z=(float)atof(strtok(NULL," "));
		NPCs[i].DestCnt=0;
		p=strtok(NULL," \"");
		while (p!=NULL)
		{
			NPCs[i].Destination[NPCs[i].DestCnt]=atoi(p);
			strcpy(NPCs[i].Phrase[NPCs[i].DestCnt],strtok(NULL,"\""));
			V[NPCs[i].Zone].connections[V[NPCs[i].Zone].numconnect++]=NPCs[i].Destination[NPCs[i].DestCnt];
			NPCs[i].DestCnt++;
			p=strtok(NULL," \"");
		}
	}

	FloydWarshall(V,MAX_ZONES);
}

bool UseNPC(PSPAWNINFO pChar,int dest)
{
	for (int i=0;i<NPCCnt;i++)
	{
		if (NPCs[i].Zone != pChar->Zone) continue;
		for (int j=0;j<NPCs[i].DestCnt;j++)
		{
			if (NPCs[i].Destination[j]==dest)
			{
				// init packets
				ZeroMemory(&P, sizeof(P));
				ZeroMemory(&M, sizeof(M));
				P.SpawnID = (unsigned short)pChar->SpawnID;
				P.Heading = (unsigned int)(pChar->Heading * 4);

				PSPAWNINFO psTarget = NULL; 
				Target(pChar,NPCs[i].Name);
				if (ppTarget && pTarget) { 
					psTarget = (PSPAWNINFO)pTarget; 
				} 
				if (psTarget) 
				{
					strcpy(M.target,psTarget->Name);
				}
				strcpy(M.sender,pChar->Name);
				M.channel=8;
				M.languageskill=100;

				// jump to
				P.Z = NPCs[i].Z;
				P.Y = NPCs[i].Y;
				P.X = NPCs[i].X;
				SendEQMessage(PKT_UPDATE_POSITION, &P, sizeof(P));

				sprintf(M.message,"%s",NPCs[i].Phrase[j]);
				SendEQMessage(PKT_CHANNEL_MESSAGE,&M,sizeof(M));
				return true;
			}
		}
	}
	return false;
}

void FloydWarshall(FWVertice* vertices, int nodecount) // Vertices numbered from 0 to nodecount-1
{
    distances = (int*) malloc(nodecount*nodecount*sizeof(int)*8);
    predecessor = (int*) malloc(nodecount*nodecount*sizeof(int)*8);
	int i,j,k;

    for(i = 0; i < nodecount; i++)
    {
        for(j = 0; j < nodecount; j++)
        {
            distances[i*nodecount+j] = 0;
            predecessor[i*nodecount+j] = i;
        }
    }
    for(i = 0; i < nodecount; i++)
    {
        for(j = 0; j < vertices[i].numconnect; j++)
        {
            distances[i*nodecount + vertices[i].connections[j]] =1; 
//                            vertices[i].connections[j].weight;
        }
        for(j = 0; j < nodecount; j++)
        {
            if(!distances[i*nodecount+j] && (i^j)) 
                // i ^ j returns 0 if they are equal
            {
				distances[i*nodecount+j] = INFINITY;
            }
        }
    }
    for(k = 0; k < nodecount; k++)
    {
        for(i = 0; i < nodecount; i++)
        {
            for(j = 0; j < nodecount; j++)
            {
                if(distances[i*nodecount+j] > distances[i*nodecount+k] + distances[k*nodecount+j])
                {
                    distances[i*nodecount+j] = distances[i*nodecount+k] + distances[k*nodecount+j];
                    predecessor[i*nodecount+j] = predecessor[k*nodecount+j];
                }
            }
        }
    }
}

 VOID SimGate(PSPAWNINFO pChar, PCHAR szLine)
{
   CHAR szMsg[MAX_STRING] = {0};
   PCHARINFO2 pChar2 = GetCharInfo2();

   sprintf(szMsg,"Gating...");
   WriteChatColor(szMsg,USERCOLOR_DEFAULT);
   DestZone=pChar2->ZoneBoundID;
   DestType=0;
   ZoneReason=11;
   Y=pChar2->ZoneBoundY;
   X=pChar2->ZoneBoundX;
   Z=pChar2->ZoneBoundZ;
   Heading=0;
   ZoneChange=true;
   return;
}

VOID SimFade(PSPAWNINFO pChar, PCHAR szLine) 
{ 
	CHAR szMsg[MAX_STRING] = {0};
	if (pChar->Instance != 0)
	{
		DestZone = *((int *)(&(pChar->Instance)-1));
	}
	else
	{
		DestZone = pChar->Zone;
	}
	sprintf(szMsg,"Fading..."); 
	WriteChatColor(szMsg,USERCOLOR_DEFAULT); 
	DestType=0;
	ZoneReason=0;
	Y=pChar->Y;
	X=pChar->X;
	Z=pChar->Z;
	Heading =(int)pChar->Heading;
	ZoneChange=true;
	return;
}

// Called once, when the plugin is to initialize
PLUGIN_API VOID InitializePlugin(VOID)
{
	DebugSpewAlways("Initializing MQ2PiggyZone");

	ppLEQ=(LocalCEverQuest**)pinstCEverQuest;
	AddCommand("/zone",ChangeZones); 
	AddCommand("/gate",SimGate); 
	AddCommand("/fade",SimFade); 
	AddCommand("/findpath",FindPath); 
}

// Called once, when the plugin is to shutdown
PLUGIN_API VOID ShutdownPlugin(VOID)
{
	DebugSpewAlways("Shutting down MQ2PiggyZone");

	RemoveCommand("/zone");
	RemoveCommand("/gate");
	RemoveCommand("/fade");
	RemoveCommand("/findpath");
}
 
Last edited:
Cosmic was the original author, though it has been passed around and maintained since by various authors.
 
I don't understand the utility of /zone force. Anyone able to explain it to me? :confused:
 
It forces zoning to an adjacent zone without quering the INI file.. You won't get the message "I can't find a route to that zone".. It's useful if the INI file isn't updated so /zone won't let you get there, but you know it's connected.
 
I was compiling with 0 errors with VC6
now I try to use VS 2005 express
compile almost every plugins ok with minor changes
but on piggyzone I got

Code:
------ Build started: Project: MQ2PiggyZone, Configuration: Release Win32 ------
Compiling...
MQ2PiggyZone.cpp
EQLIB_IMPORTS
.\MQ2PiggyZone.cpp(264) : error C2668: 'pow' : ambiguous call to overloaded function
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(575): could be 'long double pow(long double,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(573): or 'long double pow(long double,long double)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(527): or 'float pow(float,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(525): or 'float pow(float,float)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(489): or 'double pow(double,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(123): or 'double pow(double,double)'
        while trying to match the argument list '(int, unsigned int)'
.\MQ2PiggyZone.cpp(363) : error C2668: 'pow' : ambiguous call to overloaded function
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(575): could be 'long double pow(long double,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(573): or 'long double pow(long double,long double)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(527): or 'float pow(float,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(525): or 'float pow(float,float)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(489): or 'double pow(double,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(123): or 'double pow(double,double)'
        while trying to match the argument list '(int, unsigned int)'
.\MQ2PiggyZone.cpp(513) : error C2668: 'pow' : ambiguous call to overloaded function
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(575): could be 'long double pow(long double,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(573): or 'long double pow(long double,long double)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(527): or 'float pow(float,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(525): or 'float pow(float,float)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(489): or 'double pow(double,int)'
        D:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(123): or 'double pow(double,double)'
        while trying to match the argument list '(int, unsigned int)'
Build log was saved at "file://h:\MQ2 update\MQ2-20060805\MQ2PiggyZone\Intermediate\BuildLog.htm"
MQ2PiggyZone - 3 error(s), 0 warning(s)

I dont know how to fix this
need help please :D
 
change the define for infinity to be this

Code:
#define INFINITY ((int) pow(2.0, signed(sizeof(int)*8-2))-1)
 
New zones?

I think if we add these to piggyzone.ini and also changes MAX_Zones=196 this should work.

Code:
394=crescent "Crescent Reach",395
395=moors "Blightfire Moors",394
396=
397=mesa "Goru'kar Mesa",395
398
399
400
401
402
403=sunderock "Sunderock Springs",397

If someone wants to test this. I saw how these zones connected and thought I would give it a shot.

Need to get the other #'s and names etc and connections
 
as of last night i still couldnt zone into or outta any of the freeports without crashing....just a heads up
 
question

When I /zone from place to place 98% of the time it zone me thrue the pok. How can I change this so It won't zone thrue the pok? i dont like doing any thing active in the POK and this pops me in and right back outa there. (kinda suspecious if a gm hapenes to notice that a warrior is zoneing/gating:rolleyes: ) thanks :D
 
In your MQ2PiggyZone.ini, scroll down the big list until you see:

Code:
202=poknowledge "Plane of Knowledge",54,68,30,414,152....

And change that to:
Code:
202=poknowledge "Plane of Knowledge"

Now scroll back up to the top and use search or find to look for "202". anywhere else you see it, remove it, except the line you edited. Will be a lot of editing as most every zone in the game connects to 202, but that will do the job.
 
In your MQ2PiggyZone.ini, scroll down the big list until you see:

Code:
202=poknowledge "Plane of Knowledge",54,68,30,414,152....

And change that to:
Code:
202=poknowledge "Plane of Knowledge"

Now scroll back up to the top and use search or find to look for "202". anywhere else you see it, remove it, except the line you edited. Will be a lot of editing as most every zone in the game connects to 202, but that will do the job.

Find ",202"

Replace all "" (nothing)

Done :p
 
I suspect once you get going you're stuck until you're done or shut down eq, but just in case I'll ask the question anyway...

once you /zone is there any way to stop it? I've /zoned a few times by accident (I never use /zone), and I have to hit the power button on my computer because I KNOW inevitably its going to go through the guild lobby and/or PoK, and that's asking for a ban.
 
It is easier to just end task on eq, or close your WinEQ window than turn the whole pc off. Once you execute the command there is no real way to input ways to stop it. Any tricks would be cool, otherwise would probably have to code in a delay between chain zones.
 
Zone

As I have zoned through pok a few times I have now started to /Gate to pok and then run and hide in a building to use /zone to any zone. If I know its gonna go through magus in GL I just use her first then zone. I also used bind affiny to put my toons in GL out of regular flow of traffic to minimize teh risk.
 
Would it be better to change the zone in points? Was just looking at the ini and just scared that a gm will be waiting at that point to see who is goin to be there?:p
 
I've been doing an ongoing cleanup of the zone in points. A bug was discovered in the way piggyzone was handling the z axis in the recording process and htw quickly fixed that up, so now i am having to rework the thing a lot more, but will make the results public very soon here.

As for changing the zone in locs, thats actually more dangerous in some cases as you are telling the server you wish to enter a location that there is no other way to zone into legitmately, unless we were always gating or faking death. Any of these methods would likely be trackable as they've been known to ban for /zone before, though to what extent no one has been able to fully deduce yet.

Some zones have 3-4 zone in points though, it may be an idea to alter where we are zoning into some places such as PoK instead of guild lobby move it next to some other stone or somewhere, we should get some ideas flowing here...