// ***************************************************************************
// Function: Target
// Description: Our '/target' command
// Selects the closest spawn
// Usage: /target [spawn|myself|mycorpse]
// ***************************************************************************
VOID Target(PSPAWNINFO pChar, PCHAR szLine)
{
if (!ppSpawnList) return;
if (!pSpawnList) return;
PSPAWNINFO pSpawnClosest = NULL;
SEARCHSPAWN SearchSpawn;
ClearSearchSpawn(&SearchSpawn);
CHAR szArg[MAX_STRING] = {0};
CHAR szMsg[MAX_STRING] = {0};
CHAR szLLine[MAX_STRING] = {0};
PCHAR szFilter = szLLine;
BOOL DidTarget = FALSE;
BOOL bArg = TRUE;
BOOL Force = FALSE;
int TargetDistance = 195;
bRunNextCommand = TRUE;
_strlwr(strncpy(szLLine,szLine,MAX_STRING));
while (bArg) {
GetArg(szArg,szFilter,1);
szFilter = GetNextArg(szFilter,1);
if (szArg[0]==0) {
bArg = FALSE;
} else if (!strcmp(szArg,"myself")) {
if (((PCHARINFO)pCharData)->pSpawn) {
pSpawnClosest = ((PCHARINFO)pCharData)->pSpawn;
DidTarget = TRUE;
}
} else if (!strcmp(szArg,"mycorpse")) {
if (((PCHARINFO)pCharData)->pSpawn) {
sprintf(szFilter,"%s's Corpse",((PCHARINFO)pCharData)->pSpawn->Name);
_strlwr(szFilter);
}
} else if (!strcmp(szArg,"force")) {
Force = TRUE;
} else if (!strcmp(szArg,"clear")) {
pTarget = NULL;
EnviroTarget.SpawnID = 0;
DoorEnviroTarget.SpawnID = 0;
DebugSpew("Target cleared.");
WriteChatColor("Target cleared.",USERCOLOR_WHO);
return;
} else {
szFilter = ParseSearchSpawnArgs(szArg,szFilter,&SearchSpawn);
}
}
if (pTarget) SearchSpawn.FromSpawnID = ((PSPAWNINFO)pTarget)->SpawnID;
if (!DidTarget) {
pSpawnClosest = SearchThroughSpawns(&SearchSpawn,pChar);
}
if (!pSpawnClosest) {
CHAR szTemp[MAX_STRING] = {0};
sprintf(szMsg,"There are no spawns matching: %s",FormatSearchSpawn(szTemp,&SearchSpawn));
} else {
PSPAWNINFO *psTarget = NULL;
if (ppTarget && DistanceToSpawn(pChar,pSpawnClosest) + (pChar->Z - pSpawnClosest->Z) < TargetDistance || ppTarget && Force == TRUE) {
psTarget = (PSPAWNINFO*)ppTarget;
*psTarget = pSpawnClosest;
DebugSpew("Target - %s selected",pSpawnClosest->Name);
szMsg[0]=0;
} else {
if ( !ppTarget ) {
sprintf(szMsg,"Unable to target, address = 0");
} else {
sprintf(szMsg,"%s is too far away for a regular client to access with /target (You can bypass this with /target force <syntax>)",pSpawnClosest->Name);
}
}
}
if (szMsg[0])
if (!gFilterTarget) WriteChatColor(szMsg,USERCOLOR_WHO);
return;
}