From a89d8d23a3194cc8f1900af904f03b12ace35e35 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sun, 11 Jul 2004 01:41:01 +0000 Subject: [PATCH] grievre's patch to enable fullbright skins, controlled rotation and server control of various features --- qw/include/client.h | 23 +++++++++++++++++++++++ qw/source/cl_ents.c | 18 ++++++++++++++++++ qw/source/cl_input.c | 31 ++++++++++++++++++++----------- qw/source/cl_main.c | 41 +++++++++++++++++++++++++++++++++++++++++ qw/source/cl_parse.c | 4 ++++ qw/source/teamplay.c | 14 +++++++++++--- 6 files changed, 117 insertions(+), 14 deletions(-) diff --git a/qw/include/client.h b/qw/include/client.h index 6e3ea49d6..43c2b6859 100644 --- a/qw/include/client.h +++ b/qw/include/client.h @@ -199,6 +199,26 @@ typedef struct extern client_static_t cls; +#define FPD_NO_MACROS 0x0001 // Many clients ignore this, and it isn't used, but let's honor it +#define FPD_NO_TIMERS 0x0002 // We never allow timers anyway +#define FPD_NO_STRIGGER 0x0004 // Don't have soundtrigger yet, but this disables it +#define FPD_HIDE_PERCENTE 0x0020 // Ditto +#define FPD_HIDE_POINT 0x0080 // Can ignore if we do visibility checking for point +#define FPD_NO_TEAMSKIN 0x0100 // Disable skin force +#define FPD_NO_TEAMCOLOR 0x0200 // Disable color force +#define FPD_HIDE_ITEM 0x0400 // No idea what this does +#define FPD_LIMIT_PITCH 0x4000 // Limit pitchspeed +#define FPD_LIMIT_YAW 0x8000 // Limit yawspeed + +#define FPD_DEFAULT (FPD_HIDE_PERCENTE | FPD_NO_TEAMSKIN) + +// These limits prevent a usable RJ script, requiring > 0.1 sec of turning time. +#define FPD_MAXPITCH 1000 +#define FPD_MAXYAW 2000 + +// Default fbskins value. This should really be different for different gamedirs, but eh +#define FBSKINS_DEFAULT 0.0 + /* the client_state_t structure is wiped completely at every server signon */ @@ -279,6 +299,8 @@ typedef struct int no_pogo_stick; int teamplay; int watervis; + int fpd; + int fbskins; // refresh related state struct model_s *worldmodel; // cl_entitites[0].model @@ -333,6 +355,7 @@ extern struct cvar_s *hud_pl; extern struct cvar_s *skin; +extern struct cvar_s *cl_fb_players; #define MAX_STATIC_ENTITIES 128 // torches, etc diff --git a/qw/source/cl_ents.c b/qw/source/cl_ents.c index 04e238c5e..aa1ccbf10 100644 --- a/qw/source/cl_ents.c +++ b/qw/source/cl_ents.c @@ -459,6 +459,15 @@ CL_LinkPacketEntities (void) (*ent)->model = model = cl.model_precache[s1->modelindex]; + (*ent)->min_light = 0; + (*ent)->fullbright = 0; + + if (s1->modelindex == cl_playerindex) { + (*ent)->min_light = min (cl.fbskins, cl_fb_players->value); + if ((*ent)->min_light >= 1.0) + (*ent)->fullbright = 1; + } + // set colormap if (s1->colormap && (s1->colormap <= MAX_CLIENTS) && cl.players[s1->colormap - 1].name[0] @@ -940,6 +949,10 @@ CL_LinkPlayers (void) ent->frame = state->frame; ent->colormap = info->translations; ent->skinnum = state->skinnum; + + ent->min_light = 0; + ent->fullbright = 0; + if (state->modelindex == cl_playerindex) { //XXX // use custom skin if (!info->skin) @@ -952,6 +965,11 @@ CL_LinkPlayers (void) } else { ent->skin = NULL; } + + ent->min_light = min (cl.fbskins, cl_fb_players->value); + + if (ent->min_light >= 1.0) + ent->fullbright = 1; } else { ent->skin = NULL; } diff --git a/qw/source/cl_input.c b/qw/source/cl_input.c index 1a2c45b96..509d8bf86 100644 --- a/qw/source/cl_input.c +++ b/qw/source/cl_input.c @@ -436,33 +436,42 @@ cvar_t *cl_yawspeed; static void CL_AdjustAngles (void) { - float down, up, speed; + float down, up; + float pitchspeed, yawspeed; - if (in_speed.state & 1) - speed = host_frametime * cl_anglespeedkey->value; - else - speed = host_frametime; + pitchspeed = cl_pitchspeed->value; + yawspeed = cl_yawspeed->value; + + if (in_speed.state & 1) { + pitchspeed *= cl_anglespeedkey->value; + yawspeed *= cl_anglespeedkey->value; + } + + if ((cl.fpd & FPD_LIMIT_PITCH) && pitchspeed > FPD_MAXPITCH) + pitchspeed = FPD_MAXPITCH; + if ((cl.fpd & FPD_LIMIT_YAW) && pitchspeed > FPD_MAXYAW) + pitchspeed = FPD_MAXYAW; if (!(in_strafe.state & 1)) { cl.viewangles[YAW] -= - speed * cl_yawspeed->value * CL_KeyState (&in_right); + host_frametime * yawspeed * CL_KeyState (&in_right); cl.viewangles[YAW] += - speed * cl_yawspeed->value * CL_KeyState (&in_left); + host_frametime * yawspeed * CL_KeyState (&in_left); cl.viewangles[YAW] = anglemod (cl.viewangles[YAW]); } if (in_klook.state & 1) { V_StopPitchDrift (); cl.viewangles[PITCH] -= - speed * cl_pitchspeed->value * CL_KeyState (&in_forward); + host_frametime * pitchspeed * CL_KeyState (&in_forward); cl.viewangles[PITCH] += - speed * cl_pitchspeed->value * CL_KeyState (&in_back); + host_frametime * pitchspeed * CL_KeyState (&in_back); } up = CL_KeyState (&in_lookup); down = CL_KeyState (&in_lookdown); - cl.viewangles[PITCH] -= speed * cl_pitchspeed->value * up; - cl.viewangles[PITCH] += speed * cl_pitchspeed->value * down; + cl.viewangles[PITCH] -= host_frametime * pitchspeed * up; + cl.viewangles[PITCH] += host_frametime * pitchspeed * down; if (up || down) V_StopPitchDrift (); diff --git a/qw/source/cl_main.c b/qw/source/cl_main.c index 76f8929a0..bc648817c 100644 --- a/qw/source/cl_main.c +++ b/qw/source/cl_main.c @@ -166,6 +166,8 @@ cvar_t *localid; cvar_t *cl_port; cvar_t *cl_autorecord; +cvar_t *cl_fb_players; + static qboolean allowremotecmd = true; /* info mirrors */ @@ -396,6 +398,11 @@ CL_ClearState (void) // wipe the entire cl structure Info_Destroy (cl.serverinfo); memset (&cl, 0, sizeof (cl)); + + // Note: we should probably hack around this and give diff values for diff gamedirs + cl.fpd = FPD_DEFAULT; + cl.fbskins = FBSKINS_DEFAULT; + for (i = 0; i < UPDATE_BACKUP; i++) cl.frames[i].packet_entities.entities = cl_entities[i]; memset (cl_entities, 0, sizeof (cl_entities)); @@ -625,6 +632,12 @@ CL_FullServerinfo_f (void) if ((p = Info_ValueForKey (cl.serverinfo, "watervis")) && *p) { cl.watervis = atoi (p); } + if ((p = Info_ValueForKey (cl.serverinfo, "fpd")) && *p) { + cl.fpd = atoi (p); + } + if ((p = Info_ValueForKey (cl.serverinfo, "fbskins")) && *p) { + cl.fbskins = atoi (p); + } if ((p = Info_ValueForKey (cl.serverinfo, "skybox")) && *p) { Cvar_Set (r_skyname, p); } @@ -1075,6 +1088,30 @@ Force_CenterView_f (void) cl.viewangles[PITCH] = 0; } +static void +CL_PRotate_f (void) +{ + if ((cl.fpd & FPD_LIMIT_PITCH) || Cmd_Argc() < 2) + return; + + cl.viewangles[PITCH] += atoi (Cmd_Argv (1)); + + if (cl.viewangles[PITCH] < -70) + cl.viewangles[PITCH] = -70; + else if (cl.viewangles[PITCH] > 80) + cl.viewangles[PITCH] = 80; +} + +static void +CL_Rotate_f (void) +{ + if ((cl.fpd & FPD_LIMIT_YAW) || Cmd_Argc() < 2) + return; + + cl.viewangles[YAW] += atoi (Cmd_Argv (1)); + cl.viewangles[YAW] = anglemod (cl.viewangles[YAW]); +} + void CL_SetState (cactive_t state) { @@ -1177,6 +1214,8 @@ CL_Init (void) "uploading"); Cmd_AddCommand ("force_centerview", Force_CenterView_f, "force the view " "to be level"); + Cmd_AddCommand ("rotate", CL_Rotate_f, "Look left or right a given amount. Usage: rotate "); + Cmd_AddCommand ("protate", CL_PRotate_f, "Look up or down a given amount. Usage: protate "); // forward to server commands Cmd_AddCommand ("kill", CL_Cmd_ForwardToServer, "Suicide :)"); Cmd_AddCommand ("pause", CL_Cmd_ForwardToServer, "Pause the game"); @@ -1239,6 +1278,8 @@ CL_Init_Cvars (void) "turn `run' speed multiplier"); cl_backspeed = Cvar_Get ("cl_backspeed", "200", CVAR_ARCHIVE, NULL, "backward speed"); + cl_fb_players = Cvar_Get ("cl_fb_players", "0", CVAR_ARCHIVE, NULL, "fullbrightness of player models. " + "server must allow (via fbskins serverinfo)."); cl_forwardspeed = Cvar_Get ("cl_forwardspeed", "200", CVAR_ARCHIVE, NULL, "forward speed"); cl_movespeedkey = Cvar_Get ("cl_movespeedkey", "2.0", CVAR_NONE, NULL, diff --git a/qw/source/cl_parse.c b/qw/source/cl_parse.c index 263ea77ea..0d9995270 100644 --- a/qw/source/cl_parse.c +++ b/qw/source/cl_parse.c @@ -1104,6 +1104,10 @@ CL_ServerInfo (void) Sbar_DMO_Init_f (hud_scoreboard_uid); // HUD setup, cl.teamplay changed } else if (strequal (key, "watervis")) { cl.watervis = atoi (value); + } else if (strequal (key, "fpd")) { + cl.fpd = atoi (value); + } else if (strequal (key, "fbskins")) { + cl.fbskins = atoi (value); // } else if (strequal (key, "*z_ext") { // cl.z_ext = atoi (value); // } else if (strequal (key, "pm_bunnyspeedcap") { diff --git a/qw/source/teamplay.c b/qw/source/teamplay.c index fe4ceaeac..dc158b7fd 100644 --- a/qw/source/teamplay.c +++ b/qw/source/teamplay.c @@ -131,7 +131,7 @@ Team_ParseSay (const char *s) size_t i, bracket; static location_t *location = NULL; - if (!cl_parsesay->int_val) + if (!cl_parsesay->int_val || (cl.fpd & FPD_NO_MACROS)) return s; i = 0; @@ -435,6 +435,13 @@ static const char * Team_F_Skins (char *args) { int totalfb, l; + float allfb = 0.0; + + allfb = min (cl.fbskins, cl_fb_players->value); + + if (allfb >= 1.0) { + return "say Player models fullbright"; + } while (isspace ((byte) *args)) args++; @@ -442,8 +449,9 @@ Team_F_Skins (char *args) if (l == 0) { totalfb = Skin_FbPercent (0); - return va ("say Average percent fullbright for all loaded skins is " - "%d.%d%%", totalfb / 10, totalfb % 10); + return va ("say Player models have %f%% brightness\n" + "say Average percent fullbright for all loaded skins is " + "%d.%d%%", allfb * 100, totalfb / 10, totalfb % 10); } totalfb = Skin_FbPercent (args);