q2wf-portable/wf_friends.c

165 lines
4.1 KiB
C
Raw Normal View History

/*==============================================================================
The Weapons Factory -
Locate Friends
Original code by Gregg Reno
==============================================================================*/
#include "g_local.h"
void G_Spawn_DBTrail(int type, vec3_t start, vec3_t endpos );
void G_Spawn_Trails(int type, vec3_t start, vec3_t endpos, vec3_t origin );
extern int temp_ent_type;
/*
=================
Cmd_Friend_f
Set who is a friend
syntax is "friend name
where
number = player number (showplayers)
name = name of player to look up
=================
*/
void Cmd_Friend_f (edict_t *ent)
{
char *string;
edict_t *e;
edict_t *target;
int i;
if (!ent->client) return;
string=gi.args();
if (string[0] == 0)
{
ent->client->pers.friend_ent[0] = NULL;
safe_cprintf (ent, PRINT_HIGH, "Friend setting cleared\n");
return;
}
target = NULL;
for (i=1, e=g_edicts+i; i < globals.num_edicts; i++,e++)
{
if (!e->inuse)
continue;
if (!e->client)
continue;
//match on netname?
if (Q_stricmp(e->client->pers.netname, string) == 0)
{
if (!e->client->pers.hasfriends)
{
safe_cprintf (ent, PRINT_HIGH, "Sorry, %s has no friends\n",
e->client->pers.netname);
return;
}
else
{
target = e;
break;
}
}
}
if (!target)
{
safe_cprintf (ent, PRINT_HIGH, "Could not find player [%s]\n",string);
}
else
{
ent->client->pers.friend_ent[0] = target;
safe_cprintf (ent, PRINT_HIGH, "Friend set to %s\n", string);
}
}
void Cmd_ShowFriends_f (edict_t *ent)
{
edict_t *friend_ent;
if (!ent->client) return;
friend_ent = ent->client->pers.friend_ent[0];
if (!friend_ent)
{
safe_cprintf (ent, PRINT_HIGH, "No friend set. Use 'friend <name>' command.\n");
return;
}
if (!friend_ent->client->pers.hasfriends)
{
safe_cprintf (ent, PRINT_HIGH, "%s has no friends!.\n",
friend_ent->client->pers.netname);
return;
}
if (!friend_ent->client)
{
safe_cprintf (ent, PRINT_HIGH, "Friend is not an active player.\n");
return;
}
//Now do the blue light effect
if (temp_ent_type == 1)
G_Spawn_Trails(TE_BFG_LASER, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 2)
G_Spawn_Trails(TE_BUBBLETRAIL, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 3)
G_Spawn_Trails(TE_RAILTRAIL, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 4)
G_Spawn_Trails(TE_RAILTRAIL2, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 5)
G_Spawn_Trails(TE_BUBBLETRAIL2, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else
G_Spawn_DBTrail(TE_DEBUGTRAIL, ent->s.origin, friend_ent->s.origin );
}
//If the friend is close, trace a line to them
void ShowCloseFriend_f (edict_t *ent)
{
edict_t *friend_ent;
vec3_t distance;
int dist;
if (!ent->client) return;
//Skip if no friend defined
friend_ent = ent->client->pers.friend_ent[0];
if (!friend_ent)
return;
//Skip if the friend is not allowing it
if (!friend_ent->client->pers.hasfriends)
return;
//only do this every second or so
//(15 = low 4 bits. Which means all 3 bits will only be set
//every 16 times through.
if ((level.framenum & 31) != 31)
return;
//Calc distance to friend
distance[0] = ent->s.origin[0] - friend_ent->s.origin[0];
distance[1] = ent->s.origin[1] - friend_ent->s.origin[1];
distance[2] = ent->s.origin[2] - friend_ent->s.origin[2];
dist=VectorLength(distance);
if(dist <= 800)
{
if (temp_ent_type == 1)
G_Spawn_Trails(TE_BFG_LASER, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 2)
G_Spawn_Trails(TE_BUBBLETRAIL, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 3)
G_Spawn_Trails(TE_RAILTRAIL, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 4)
G_Spawn_Trails(TE_RAILTRAIL2, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else if (temp_ent_type == 5)
G_Spawn_Trails(TE_BUBBLETRAIL2, ent->s.origin, friend_ent->s.origin, ent->s.origin );
else
G_Spawn_DBTrail(TE_DEBUGTRAIL, ent->s.origin, friend_ent->s.origin );
}
}