gzdoom/code/d_netinf.c

220 lines
4.9 KiB
C
Raw Normal View History

1998-07-14 00:00:00 +00:00
#include <math.h>
#include <stdlib.h>
1998-12-22 00:00:00 +00:00
#include <string.h>
1998-07-14 00:00:00 +00:00
#include "doomtype.h"
#include "doomdef.h"
#include "doomstat.h"
#include "d_netinf.h"
#include "d_net.h"
#include "d_proto.h"
#include "v_palett.h"
#include "v_video.h"
#include "i_system.h"
#include "r_draw.h"
1998-12-22 00:00:00 +00:00
#include "r_state.h"
#include "st_stuff.h"
1998-07-14 00:00:00 +00:00
extern BOOL st_firsttime;
cvar_t *autoaim;
cvar_t *name;
cvar_t *color;
1998-12-22 00:00:00 +00:00
cvar_t *skin;
cvar_t *team;
cvar_t *gender;
1998-07-14 00:00:00 +00:00
1998-12-22 00:00:00 +00:00
int D_GenderToInt (const char *gender)
{
if (!stricmp (gender, "female"))
return GENDER_FEMALE;
else if (!stricmp (gender, "neuter"))
return GENDER_NEUTER;
else
return GENDER_MALE;
}
1998-07-14 00:00:00 +00:00
void D_SetupUserInfo (void)
{
int i;
1998-12-22 00:00:00 +00:00
userinfo_t *coninfo = &players[consoleplayer].userinfo;
for (i = 0; i < MAXPLAYERS; i++)
memset (&players[i].userinfo, 0, sizeof(userinfo_t));
strncpy (coninfo->netname, name->string, MAXPLAYERNAME);
strncpy (coninfo->team, team->string, MAXPLAYERNAME);
coninfo->aimdist = (fixed_t)(autoaim->value * 16384.0);
coninfo->color = V_GetColorFromString (NULL, color->string);
coninfo->skin = R_FindSkin (skin->string);
coninfo->gender = D_GenderToInt (gender->string);
R_BuildPlayerTranslation (consoleplayer, coninfo->color);
1998-07-14 00:00:00 +00:00
}
void D_UserInfoChanged (cvar_t *cvar)
{
byte foo[256];
if (cvar == autoaim) {
if (cvar->value < 0.0f) {
SetCVarFloat (cvar, 0.0f);
return;
} else if (cvar->value > 5000.0f) {
SetCVarFloat (cvar, 5000.0f);
return;
}
}
if (4 + strlen (cvar->name) + strlen (cvar->string) > 256)
I_Error ("User info descriptor too big");
sprintf (foo, "\\%s\\%s", cvar->name, cvar->string);
Net_WriteByte (DEM_UINFCHANGED);
Net_WriteString (foo);
}
static BOOL SetServerVar (char *name, char *value)
{
cvar_t *dummy;
cvar_t *var = FindCVar (name, &dummy);
if (var) {
unsigned oldflags = var->flags;
var->flags &= ~(CVAR_SERVERINFO|CVAR_LATCH);
SetCVar (var, value);
var->flags = oldflags;
return true;
}
return false;
}
void D_SendServerInfoChange (const cvar_t *cvar, const char *value)
{
byte foo[256];
if (4 + strlen (cvar->name) + strlen (value) > 256)
I_Error ("Server info descriptor too big");
sprintf (foo, "\\%s\\%s", cvar->name, value);
Net_WriteByte (DEM_SINFCHANGED);
Net_WriteString (foo);
}
void D_DoServerInfoChange (byte **stream)
{
byte *ptr = *stream;
byte *breakpt;
byte *value;
if (*ptr++ != '\\')
return;
while ( (breakpt = strchr (ptr, '\\')) ) {
*breakpt = 0;
value = breakpt + 1;
if ( (breakpt = strchr (value, '\\')) )
*breakpt = 0;
1998-07-26 00:00:00 +00:00
if (SetServerVar (ptr, value) && netgame)
1998-07-14 00:00:00 +00:00
Printf ("%s changed to %s\n", ptr, value);
*(value - 1) = '\\';
if (breakpt) {
*breakpt = '\\';
ptr = breakpt + 1;
} else {
break;
}
}
*stream += strlen (*stream) + 1;
}
void D_WriteUserInfoStrings (int i, byte **stream)
{
if (i >= MAXPLAYERS) {
WriteByte (0, stream);
} else {
1998-12-22 00:00:00 +00:00
userinfo_t *info = &players[i].userinfo;
1998-07-14 00:00:00 +00:00
1998-12-22 00:00:00 +00:00
sprintf (*stream, "\\name\\%s\\autoaim\\%g\\color\\%x %x %x\\skin\\%s\\team\\%s\\gender\\%s",
1998-07-14 00:00:00 +00:00
info->netname,
(double)info->aimdist / 16384.0,
1998-12-22 00:00:00 +00:00
RPART(info->color), GPART(info->color), BPART(info->color),
skins[info->skin].name, info->team,
info->gender == GENDER_FEMALE ? "female" :
info->gender == GENDER_NEUTER ? "neuter" : "male"
1998-07-14 00:00:00 +00:00
);
}
*stream += strlen (*stream) + 1;
}
void D_ReadUserInfoStrings (int i, byte **stream, BOOL update)
{
1998-12-22 00:00:00 +00:00
userinfo_t *info = &players[i].userinfo;
1998-07-14 00:00:00 +00:00
byte *ptr = *stream;
byte *breakpt;
byte *value;
if (*ptr++ != '\\')
return;
if (i < MAXPLAYERS) {
while ( (breakpt = strchr (ptr, '\\')) ) {
*breakpt = 0;
value = breakpt + 1;
if ( (breakpt = strchr (value, '\\')) )
*breakpt = 0;
if (!stricmp (ptr, "autoaim")) {
info->aimdist = (fixed_t)(atof (value) * 16384.0);
} else if (!stricmp (ptr, "name")) {
char oldname[MAXPLAYERNAME+1];
strncpy (oldname, info->netname, MAXPLAYERNAME);
oldname[MAXPLAYERNAME] = 0;
strncpy (info->netname, value, MAXPLAYERNAME);
info->netname[MAXPLAYERNAME] = 0;
if (update)
Printf ("%s is now known as %s\n", oldname, info->netname);
1998-12-22 00:00:00 +00:00
} else if (!stricmp (ptr, "team")) {
strncpy (info->team, value, MAXPLAYERNAME);
info->team[MAXPLAYERNAME] = 0;
if (update) {
if (info->team[0])
Printf ("%s joined the %s team\n", info->netname, info->team);
else
Printf ("%s is not on a team\n", info->netname);
}
1998-07-14 00:00:00 +00:00
} else if (!stricmp (ptr, "color")) {
info->color = V_GetColorFromString (NULL, value);
R_BuildPlayerTranslation (i, info->color);
st_firsttime = true;
1998-12-22 00:00:00 +00:00
} else if (!stricmp (ptr, "skin")) {
info->skin = R_FindSkin (value);
if (players[i].mo)
players[i].mo->sprite = skins[info->skin].sprite;
ST_loadGraphics ();
st_firsttime = true;
} else if (!stricmp (ptr, "gender")) {
info->gender = D_GenderToInt (value);
1998-07-14 00:00:00 +00:00
}
*(value - 1) = '\\';
if (breakpt) {
*breakpt = '\\';
ptr = breakpt + 1;
} else {
break;
}
}
}
*stream += strlen (*stream) + 1;
}