mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-04-25 20:20:57 +00:00
230 lines
5.3 KiB
C
230 lines
5.3 KiB
C
#include <math.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#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"
|
|
#include "r_state.h"
|
|
#include "st_stuff.h"
|
|
|
|
extern BOOL st_firsttime;
|
|
|
|
cvar_t *autoaim;
|
|
cvar_t *name;
|
|
cvar_t *color;
|
|
cvar_t *skin;
|
|
cvar_t *team;
|
|
cvar_t *gender;
|
|
cvar_t *neverswitchonpickup;
|
|
|
|
int D_GenderToInt (const char *gender)
|
|
{
|
|
if (!stricmp (gender, "female"))
|
|
return GENDER_FEMALE;
|
|
else if (!stricmp (gender, "cyborg"))
|
|
return GENDER_NEUTER;
|
|
else
|
|
return GENDER_MALE;
|
|
}
|
|
|
|
void D_SetupUserInfo (void)
|
|
{
|
|
int i;
|
|
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);
|
|
coninfo->neverswitch = (int)neverswitchonpickup->value;
|
|
R_BuildPlayerTranslation (consoleplayer, coninfo->color);
|
|
}
|
|
|
|
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;
|
|
|
|
if (SetServerVar (ptr, value) && netgame)
|
|
Printf (PRINT_HIGH, "%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 {
|
|
userinfo_t *info = &players[i].userinfo;
|
|
|
|
sprintf (*stream, "\\name\\%s"
|
|
"\\autoaim\\%g"
|
|
"\\color\\%x %x %x"
|
|
"\\skin\\%s"
|
|
"\\team\\%s"
|
|
"\\gender\\%s"
|
|
"\\neverswitchonpickup\\%d",
|
|
info->netname,
|
|
(double)info->aimdist / 16384.0,
|
|
RPART(info->color), GPART(info->color), BPART(info->color),
|
|
skins[info->skin].name, info->team,
|
|
info->gender == GENDER_FEMALE ? "female" :
|
|
info->gender == GENDER_NEUTER ? "cyborg" : "male",
|
|
info->neverswitch
|
|
);
|
|
}
|
|
|
|
*stream += strlen (*stream) + 1;
|
|
}
|
|
|
|
void D_ReadUserInfoStrings (int i, byte **stream, BOOL update)
|
|
{
|
|
userinfo_t *info = &players[i].userinfo;
|
|
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 (PRINT_HIGH, "%s is now known as %s\n", oldname, info->netname);
|
|
} else if (!stricmp (ptr, "team")) {
|
|
strncpy (info->team, value, MAXPLAYERNAME);
|
|
info->team[MAXPLAYERNAME] = 0;
|
|
if (update) {
|
|
if (info->team[0])
|
|
Printf (PRINT_HIGH, "%s joined the %s team\n", info->netname, info->team);
|
|
else
|
|
Printf (PRINT_HIGH, "%s is not on a team\n", info->netname);
|
|
}
|
|
} else if (!stricmp (ptr, "color")) {
|
|
info->color = V_GetColorFromString (NULL, value);
|
|
R_BuildPlayerTranslation (i, info->color);
|
|
st_firsttime = true;
|
|
} 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);
|
|
} else if (!stricmp (ptr, "neverswitchonpickup")) {
|
|
info->neverswitch = atoi (value);
|
|
}
|
|
|
|
*(value - 1) = '\\';
|
|
if (breakpt) {
|
|
*breakpt = '\\';
|
|
ptr = breakpt + 1;
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
*stream += strlen (*stream) + 1;
|
|
}
|