As an experiment I've thrown together a dumbed down version of /face. It won't face loc, heading, etc. Will accept "look" as a parameter, or a spawn name. Always does a /face fast.
This is just to test the math behavior, and no, I haven't tried compiling it or using it (at work without a compiler or EQ).
Code: Select all
VOID Face(PSPAWNINFO pChar, PCHAR szLine)
{
if (!EQADDR_SPAWNLIST && !*EQADDR_SPAWNLIST) return;
PSPAWNINFO pSpawnClosest = NULL;
PSPAWNINFO pTarget = NULL;
SPAWNINFO LocSpawn = {0};
SEARCHSPAWN SearchSpawn;
ClearSearchSpawn(&SearchSpawn);
CHAR szMsg[MAX_STRING] = {0};
CHAR szName[MAX_STRING] = {0};
CHAR szArg[MAX_STRING] = {0};
CHAR szLLine[MAX_STRING] = {0};
PCHAR szFilter = szLLine;
BOOL bArg = TRUE;
BOOL bOtherArgs = FALSE;
BOOL Look = FALSE;
DOUBLE Distance;
_strlwr(strcpy(szLLine,szLine));
while (bArg) {
GetArg(szArg,szFilter,1);
szFilter = GetNextArg(szFilter,1);
if (szArg[0]==0) {
bArg = FALSE;
} else if (!strcmp(szArg,"look")) {
Look = TRUE;
} else {
bOtherArgs = TRUE;
szFilter = ParseSearchSpawnArgs(szArg,szFilter,&SearchSpawn);
}
}
if (!pSpawnClosest) {
if (!bOtherArgs) {
if (EQADDR_TARGET && *EQADDR_TARGET) {
pSpawnClosest = *EQADDR_TARGET;
}
} else {
pSpawnClosest = SearchThroughSpawns(&SearchSpawn,pChar);
}
}
if (!pSpawnClosest) {
sprintf(szMsg,"There were no matches for: %s",FormatSearchSpawn(szArg,&SearchSpawn));
strcpy(gLastError,"FACE_NOTFOUND");
}
gFaceAngle = (atan2(pSpawnClosest->X - pChar->X, pSpawnClosest->Y - pChar->Y) * 256.0f / PI);
if (gFaceAngle=512.0f) gFaceAngle = 0.0f;
if (Look) {
Distance = DistanceToSpawn(pChar, pSpawnClosest);
gLookAngle = (atan2(pSpawnClosest->Z - pChar->Z, (FLOAT)Distance) * 256.0f / PI);
pChar->CameraAngle = (FLOAT)gLookAngle;
gLookAngle=10000.0f;
}
pChar->Heading = (FLOAT)gFaceAngle;
gFaceAngle=10000.0f;
bRunNextCommand = TRUE;
sprintf(szMsg,"Facing %s'%s'...",(Away)?"away from ":"", CleanupName(strcpy(szName,pSpawnClosest->Name),FALSE));
gLastError[0]=0;
if (EQADDR_TARGET && *EQADDR_TARGET) pTarget = *EQADDR_TARGET;
if ((pSpawnClosest != &LocSpawn) && ((Away) || (pSpawnClosest != pTarget))) WriteChatBuffer(szMsg,USERCOLOR_WHO);
DebugSpew("Face - %s",szMsg);
return;
}