q2wf-portable/wf_scanner.c

129 lines
2.8 KiB
C

/*==============================================================================
The Weapons Factory -
Scanner Functions
Original code by ??
Modified by Gregg Reno
==============================================================================*/
#include "g_local.h"
void ClearScanner(gclient_t *client)
{
client->pers.scanner_active=0;
}
void ShowScanner(edict_t *ent,char *layout)
{
// int i;
edict_t *player = g_edicts;
edict_t *target;
char stats[64];
// float len;
int hd;
// int sx, sy;
vec3_t v;
vec3_t dp;
vec3_t normal = {0,0,-1};
// Main scanner graphic draw
Com_sprintf (stats, sizeof(stats),"xv 80 yv 40 picn %s ", PIC_SCANNER_TAG);
SAFE_STRCAT(layout,stats,LAYOUT_MAX_LENGTH);
target = ent->client->tracker_target;
if (!target) return;
//See if target is in front
if (!infront(ent, target)) return;
// calc player to decoy vector
VectorSubtract (ent->s.origin, target->s.origin, v);
//gi.dprintf("v 0=%f, 1=%f, 2=%f\n",v[0], v[1], v[2]);
// save height differential
hd = v[2];
// remove height component
// v[2] = 0;
// normal vector to enemy
VectorNormalize(v);
// rotate round player view angle (yaw)
RotatePointAroundVector( dp, normal, v, ent->s.angles[1]);
// setup arrows
if (dp[1] < -.1)
{
Com_sprintf (stats, sizeof(stats),"xv %i yv %i picn %s ",
118, 108, PIC_LEFT_TAG);
}
else if (dp[1] > .1)
{
Com_sprintf (stats, sizeof(stats),"xv %i yv %i picn %s ",
178, 108, PIC_RIGHT_TAG);
}
SAFE_STRCAT(layout,stats,LAYOUT_MAX_LENGTH);
// clear stats
*stats = 0;
// set up/down arrow
if (dp[2] < -.03)
{
Com_sprintf (stats, sizeof(stats),"xv %i yv %i picn %s ",
148, 88,PIC_UP_TAG);
}
else if (dp[2] > .03)
{
Com_sprintf (stats, sizeof(stats),"xv %i yv %i picn %s ",
148, 128,PIC_DOWN_TAG);
}
//gi.dprintf("dp 0=%f, 1=%f, 2=%f, hd=%f\n",dp[0], dp[1], dp[2], hd);
// any up/down ?
if (*stats)
SAFE_STRCAT(layout,stats,LAYOUT_MAX_LENGTH);
}
void Toggle_Scanner(edict_t *ent)
{
char string[1040];
if ((!ent->client) || (ent->health <=0))
return;
ent->client->showinventory = 0;
ent->client->showscores = 0;
//toggle low on/off bit (and clear scores/inventory display if required)
if (ent->client->pers.scanner_active)
{
ent->client->pers.scanner_active = 0;
}
else
{
//What do we want to track?
//ent->client->tracker_target = ent->decoy;
if (ent->wf_team == 1)
ent->client->tracker_target = G_Find(NULL, FOFS(classname), "item_flag_team2");
else if (ent->wf_team == 2)
ent->client->tracker_target = G_Find(NULL, FOFS(classname), "item_flag_team1");
else
ent->client->tracker_target = NULL;
string[0] = 0;
ent->client->pers.scanner_active = 1;
ShowScanner(ent,string);
gi.WriteByte (svc_layout);
gi.WriteString (string);
}
}