• You've discovered RedGuides 📕 an EverQuest multi-boxing community 🛡️🧙🗡️. We want you to play several EQ characters at once, come join us and say hello! 👋
  • IS THIS SITE UGLY? Change the look. To dismiss this notice, click the X --->

Classic Source::Mq2piggyzone :: /zone & /gate commands (1 Viewer)

Status
Not open for further replies.
MQ2RWarp is basically the same thing as MQ2AllWarp except it just has the functions changed like "warp" to "wrap" so that one less speedbump to worry about for those who don't like changing the source.
 
Did /zone to East Freeport from West Freeport took me too East Commonlands and then tried to take the Magus???
 
Does anyone have a working copy of MQ2piggyzone.dll and the .ini I can't seem to compile it no matter what I try.

Thanks in advance
Drizzt1
 
Try posting your errors. We'll help you out compiling. I'd much rather see someone learning to compile for themself than grabbing from precompilers.
 
Ok, simple question. Is there a way we can change chainzone so that it uses whatever you set as the default waypoint in each zone rather than the succor point? This way people can put different entry points in each zone and won't have to worry about gm's and others sitting at the succor point waiting to catch people.
 
All untested but should work for that.

Add to function prototypes
Rich (BB code):
void SetupNextZone(int dest);

New MyOnZoned Function
Rich (BB code):
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)
      {
		  SetupNextZone(DestZone);
		  ZoneChange=true;
      }
   }
   return;
}

Add where ever you want - SetupNextZone function
Rich (BB code):
void SetupNextZone(int dest)
{
	CHAR sKeyData[MAX_STRING]={0};
	CHAR sDefault[MAX_STRING]="none";
	GetPrivateProfileString(GetShortZone(dest),"default", 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;
	}
}
 
ok, got it to compile with the following :)
Rich (BB code):
void SetupNextZone(PSPAWNINFO pChar, int dest);

Rich (BB code):
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)
      {
		  SetupNextZone(pChar,DestZone);
		  ZoneChange=true;
      }
   }
   return;
}

Rich (BB code):
void SetupNextZone(PSPAWNINFO pChar, int dest)
{
	CHAR sKeyData[MAX_STRING]={0};
	CHAR sDefault[MAX_STRING]="none";
	GetPrivateProfileString(GetShortZone(dest),"default", 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;
	}
}
haven't tried it yet though
 
Working!
Rich (BB code):
// MQ2PiggyZone.cpp : Defines the entry point for the DLL application.
//
// updated to work with VC6 and VS2k5 (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)
// /succor - transports you to the zone succor point
// /gate - teleports you to your bind point
//
//
// updated 07/09/06 to include /succor - modified 
// coding to correspond with little editing eqdata.h file
// Added n00b instructions
// - TurkReno, thanks to Siddin for help
//
/////////////////////////////////////////////////////////////////////////////////
//
// Comment this out from MQ2Commands.cpp due to anti-warp coding 
//
// VOID PluginCmdSort(VOID)
// {
//  /*
//    PMQCOMMAND pCmd=pCommands;
//    int i;
//    while(pCmd) {
//        if (pCmd->EQ==0) {
//            //
//            for(i=0;i<sizeof(keyarray)/4;i+=4) {
//                if (!stricmp(pCmd->Command, (char *)&keyarray)) {
//	            pCmd->Function=CmdCmd;
//                }
//            }
//        }
//        pCmd=pCmd->pNext;
//    }
//  */
// }
//
////////////////////////////////////////////////////////////////////////////////
//
// 
// Change this line in your EQData.h file to the following:
// 
// #define   MAX_ZONES                                    0x189   
//
//
////////////////////////////////////////////////////////////////////////////////

#include "../MQ2Plugin.h"

PreSetup("MQ2PiggyZone");

#undef ZoneToGoTo
#define LocalCEverQuest__DoTheZone         0x4C6750 // 07/18/06
#define CDisplay__MoveLocalPlayerToSafeCoords 0x4582D0 // 07/18/06
// IF you have Infinity set to anything other than this, Visual Studio 2k5
// will freak out.  I managed to find this tidbit through a google search and
// have had no problems in any version of Visual Studio.
#define INFINITY ((1 << (8*sizeof (int) - 6)) - 4)
													

#ifdef PKT_UPDATE_POSITION
#undef PKT_UPDATE_POSITION
#endif
#define PKT_UPDATE_POSITION 0x178A // 06-16-06
#ifdef PKT_CHANNEL_MESSAGE
#undef PKT_CHANNEL_MESSAGE
#endif
#define PKT_CHANNEL_MESSAGE 0xB5A // 06-16-06

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);
VOID SimSuccor(PSPAWNINFO pChar, PCHAR szLine);
VOID SetupNextZone(PSPAWNINFO pChar, int dest);
VOID MyOnZoned(PSPAWNINFO pChar);

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)
      {
		 SetupNextZone(pChar,DestZone);
         ZoneChange=true;
      }
   }
   return;
}

VOID SetupNextZone(PSPAWNINFO pChar, int dest)
{
	CHAR sKeyData[MAX_STRING]={0};
	CHAR sDefault[MAX_STRING]="none";
	GetPrivateProfileString(GetShortZone(dest),"default", 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;
	}
	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==0) sKeyData=',';
         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--;
      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.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.numconnect=cnt+1;
         for (int j=0;j<cnt;j++) V.connections[j]=tmp[j];
      }
      V.connections[V.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.Zone=atoi(strtok(sKeyData," \""));
      strcpy(NPCs.Name,strtok(NULL,"\""));
      NPCs.Y=(float)atof(strtok(NULL," "));
      NPCs.X=(float)atof(strtok(NULL," "));
      NPCs.Z=(float)atof(strtok(NULL," "));
      NPCs.DestCnt=0;
      p=strtok(NULL," \"");
      while (p!=NULL)
      {
         NPCs.Destination[NPCs.DestCnt]=atoi(p);
         strcpy(NPCs.Phrase[NPCs.DestCnt],strtok(NULL,"\""));
         V[NPCs.Zone].connections[V[NPCs.Zone].numconnect++]=NPCs.Destination[NPCs.DestCnt];
         NPCs.DestCnt++;
         p=strtok(NULL," \"");
      }
   }

   FloydWarshall(V,MAX_ZONES);
}

bool UseNPC(PSPAWNINFO pChar,int dest)
{
   for (int i=0;i<NPCCnt;i++)
   {
      if (NPCs.Zone != pChar->Zone) continue;
      for (int j=0;j<NPCs.DestCnt;j++)
      {
         if (NPCs.Destination[j]==dest)
         {
            //Code borrowed directly from MQ2CSum
            // setup move packet
			struct _MOVEPKT {
			/*0000*/ unsigned short SpawnID;
			/*0002*/ unsigned short TimeStamp;
			/*0004*/ int Heading:16;
			/*0006*/ int unknown1:16;     //??
			/*0008*/ float DeltaZ;        // ?? not sure
			/*0012*/ int Animation:16;
			/*0014*/ int padding014:16;   //??
			/*0016*/ int DeltaHeading:16; //?? not sure
			/*0018*/ int unknown2:16;     //??
			/*0020*/ float Y;
			/*0024*/ float DeltaY;        //?? not sure
			/*0028*/ float DeltaX;        //?? not sure
			/*0032*/ float Z;
			/*0036*/ float X;
			} P;
            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;

            // 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.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.Z;
            P.Y = NPCs.Y;
            P.X = NPCs.X;
            SendEQMessage(PKT_UPDATE_POSITION, &P, sizeof(P));

            sprintf(M.message,"%s",NPCs.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.numconnect; j++)
        {
            distances[i*nodecount + vertices.connections[j]] =1;
//                            vertices.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;
}

// Modified to correspond with as little editing as possible to the eqdata.h file
// thx TheZ
VOID SimSuccor(PSPAWNINFO pChar, PCHAR szLine)
{
    PZONEINFO TheZone = (PZONEINFO) pZoneInfo;
	CHAR szMsg[MAX_STRING] = {0};
	if (pChar->Instance != 0)
	{
		DestZone = *((int *)(&(pChar->Instance)-1));
	}
	else
	{
		DestZone = pChar->Zone;
	}
	sprintf(szMsg,"Succoring...");
	WriteChatColor(szMsg,USERCOLOR_DEFAULT);
	DestType=0;
	ZoneReason=0;
	Y=TheZone->Unknown0x24c[0];
	X=TheZone->Unknown0x24c[1];
	Z=TheZone->Unknown0x24c[2];
	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);
   AddCommand("/succor",SimSuccor);
}

// 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");
   RemoveCommand("/succor");
} 
 
i'm more then likely wrong here, but from what i'm seeing, yes yer correct thez. (kind of) as long as there is a "defualt" point in the .ini file. if there is no "defualt=# # #" then it places you to the succor point in the zone. if you look at the piggyzone.ini file there is "defualt=#### #### ####" it will put you into the defualt as long as you ....

"/zone (shortzonename here)"

now, if in your .ini file you have say ......

Rich (BB code):
[chardok]
upwardmobility=-535.09 639.32 -137 88
stirring=-574.40 1313.50 -157.44 107
learninghornet=-788 984 -213.63 107
rubble=178.82 436.19 53 23
meteor=0.10 30.56  3 377
default=-520.16 702.98 -137 126

and you type ...

/zone chardock meteor

it will place you at 0 30 3
in the zone chardock, when you zone in.

like i said, i may be wrong here, and you more then likely knew that info. but in case you didn't or anyone else didnt know that info, it is useful.

quick example.......

if i'm just bouncing round killing named, instead of me /zone veksar and then warping to a spot to start killing, i add a line to my .ini with

Rich (BB code):
[veksar]
poortree=113.79 586.20 -26.25 135
kill=233 332 232

and i type /zone veksar kill, it will take me directly to my spot and i can staert killing.

saves a fraction of time :P and keeps from people thinking i just succored to save my ass and wondering how 4 rangers succored in the first place. ;)
 
thez said:
So that source will zone you wherever the default is set to for a zone?
The idea is that chainzone will instead chainzone you through you're default waypoint rather than the succor point!
 
i stared at your avatar for 5 minutes cosmic where is that from hahaha.

ps : can someone update the stickied post with the 2 fixes (i had to come here to find them) would be nice for new people so they dont have to poke around (albeit its easy to do)
 
After messing with Trek and finally getting it to compile with no errors I realize that /zone does not work and gives out no error when I try it ingame. I gave up on Trek to give a go at Piggy

Ran into a snag. Got the following errors compiling.

--------------------Configuration: MQ2PiggyZone - Win32 Release--------------------
Compiling...
MQ2PiggyZone.cpp
EQLIB_IMPORTS
C:\MQ2_Project\MQ2PiggyZone\MQ2PiggyZone.cpp(105) : error C2400: inline assembler syntax error in 'second operand'; found 'newline'
C:\MQ2_Project\MQ2PiggyZone\MQ2PiggyZone.cpp(198) : error C2065: 'He' : undeclared identifier
C:\MQ2_Project\MQ2PiggyZone\MQ2PiggyZone.cpp(198) : error C2146: syntax error : missing ')' before identifier 'ading'
C:\MQ2_Project\MQ2PiggyZone\MQ2PiggyZone.cpp(198) : error C2059: syntax error : ')'
C:\MQ2_Project\MQ2PiggyZone\MQ2PiggyZone.cpp(690) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

MQ2PiggyZone.dll - 5 error(s), 0 warning(s)

If someone could either supply me with a working trek or piggy dll I would be forever grateful....but helping with these errors would be a good start. :)
 
Classic Source::Mq2piggyzone :: /zone & /gate commands
Status
Not open for further replies.

Users who are viewing this thread

Back
Top