Match cl_parse.c with dquakeplus

This commit is contained in:
cypress 2024-09-05 17:01:20 -07:00
parent 648170fd26
commit 44600071d6
1 changed files with 208 additions and 131 deletions

View File

@ -24,6 +24,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
extern qboolean domaxammo; extern qboolean domaxammo;
qboolean crosshair_pulse_grenade; qboolean crosshair_pulse_grenade;
extern int EN_Find(int num,char *string);
char *svc_strings[] = char *svc_strings[] =
{ {
"svc_bad", "svc_bad",
@ -75,9 +77,8 @@ char *svc_strings[] =
"svc_fog", // 41 // [byte] start [byte] end [byte] red [byte] green [byte] blue [float] time "svc_fog", // 41 // [byte] start [byte] end [byte] red [byte] green [byte] blue [float] time
"svc_bspdecal", //42 // [string] name [byte] decal_size [coords] pos "svc_bspdecal", //42 // [string] name [byte] decal_size [coords] pos
"svc_achievement", //43 "svc_achievement", //43
"svc_songegg", //44 [string] track name "svc_maxammo" //44
"svc_maxammo", //45 //"svc_pulse" //45
"svc_pulse" //46
}; };
//============================================================================= //=============================================================================
@ -148,6 +149,36 @@ void CL_ParseStartSoundPacket(void)
S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation); S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation);
} }
/*
==================
CL_ParseBSPDecal
Spawn decals on map
Crow_bar.
==================
*/
void CL_ParseBSPDecal (void)
{
#ifdef __PSP__
vec3_t pos;
int decal_size;
char *texname;
texname = MSG_ReadString ();
decal_size = MSG_ReadByte ();
pos[0] = MSG_ReadCoord ();
pos[1] = MSG_ReadCoord ();
pos[2] = MSG_ReadCoord ();
if(!texname)
return;
Con_Printf("BSPDECAL[tex: %s size: %i pos: %f %f %f]\n", texname, decal_size, pos[0], pos[1], pos[2]);
R_SpawnDecalBSP(pos, texname, decal_size);
#endif // __PSP__
}
/* /*
================== ==================
CL_KeepaliveMessage CL_KeepaliveMessage
@ -158,20 +189,30 @@ so the server doesn't disconnect.
*/ */
void CL_KeepaliveMessage (void) void CL_KeepaliveMessage (void)
{ {
float time; double time;
static float lastmsg; static double lastmsg;//BLUBSFIX, this was a float
int ret; int ret;
sizebuf_t old; sizebuf_t old;
byte olddata[8192]; byte olddata[8192];
if (sv.active) if (sv.active)
{
//Con_Printf("Active Server...exit keepalive\n");
return; // no need if server is local return; // no need if server is local
}
if (cls.demoplayback) if (cls.demoplayback)
{
//Con_Printf("Demo Playback...exit keepalive\n");
return; return;
}
// read messages from server, should just be nops // read messages from server, should just be nops
old = net_message; old = net_message;
#ifdef PSP_VFPU
memcpy_vfpu(olddata, net_message.data, net_message.cursize);
#else
memcpy(olddata, net_message.data, net_message.cursize); memcpy(olddata, net_message.data, net_message.cursize);
#endif // PSP_VFPU
do do
{ {
@ -193,12 +234,18 @@ void CL_KeepaliveMessage (void)
} while (ret); } while (ret);
net_message = old; net_message = old;
#ifdef PSP_VFPU
memcpy_vfpu(net_message.data, olddata, net_message.cursize);
#else
memcpy(net_message.data, olddata, net_message.cursize); memcpy(net_message.data, olddata, net_message.cursize);
#endif // PSP_VFPU
// check time // check time
time = Sys_FloatTime (); time = Sys_FloatTime ();
if (time - lastmsg < 5) if (time - lastmsg < 5)
return; return;
//Con_Printf("Time since last keepAlive msg = %f\n",time - lastmsg);
lastmsg = time; lastmsg = time;
// write out a nop // write out a nop
@ -214,15 +261,29 @@ void CL_KeepaliveMessage (void)
CL_ParseServerInfo CL_ParseServerInfo
================== ==================
*/ */
int has_pap;
int has_perk_revive;
int has_perk_juggernog;
int has_perk_speedcola;
int has_perk_doubletap;
int has_perk_staminup;
int has_perk_flopper;
int has_perk_deadshot;
int has_perk_mulekick;
void CL_ParseServerInfo (void) void CL_ParseServerInfo (void)
{ {
char *str; char *str, tempname[MAX_QPATH];;
int i; int i;
int nummodels, numsounds; int nummodels, numsounds;
char model_precache[MAX_MODELS][MAX_QPATH]; char model_precache[MAX_MODELS][MAX_QPATH];
char sound_precache[MAX_SOUNDS][MAX_QPATH]; char sound_precache[MAX_SOUNDS][MAX_QPATH];
//void R_PreMapLoad (char *);
//char mapname[MAX_QPATH];
Con_DPrintf ("Serverinfo packet received.\n"); Con_DPrintf ("Serverinfo packet received.\n");
//Con_Printf ("Serverinfo packet received.\n");
// //
// wipe the client_state_t struct // wipe the client_state_t struct
// //
@ -266,19 +327,36 @@ void CL_ParseServerInfo (void)
for (i=0 ; i<NUM_MODELINDEX ; i++) for (i=0 ; i<NUM_MODELINDEX ; i++)
cl_modelindex[i] = -1; cl_modelindex[i] = -1;
has_pap = EN_Find(0,"perk_pap");
has_perk_revive = EN_Find(0, "perk_revive");
has_perk_juggernog = EN_Find(0, "perk_juggernog");
has_perk_speedcola = EN_Find(0, "perk_speed");
has_perk_doubletap = EN_Find(0, "perk_double");
has_perk_staminup = EN_Find(0, "perk_staminup");
has_perk_flopper = EN_Find(0, "perk_flopper");
has_perk_deadshot = EN_Find(0, "perk_deadshot");
has_perk_mulekick = EN_Find(0, "perk_mule");
// precache models // precache models
memset (cl.model_precache, 0, sizeof(cl.model_precache)); memset (cl.model_precache, 0, sizeof(cl.model_precache));
//Con_Printf("GotModelsToLoad: ");
for (nummodels=1 ; ; nummodels++) for (nummodels=1 ; ; nummodels++)
{ {
str = MSG_ReadString (); str = MSG_ReadString ();
if (!str[0]) if (!str[0])
break; break;
if (nummodels==MAX_MODELS) if (nummodels==MAX_MODELS)
{ {
Con_Printf ("Server sent too many model precaches\n"); Con_Printf ("Server sent too many model precaches\n");
return; return;
} }
strcpy (model_precache[nummodels], str);
Q_strncpyz (model_precache[nummodels], str, sizeof(model_precache[nummodels]));
//Con_Printf("%i,",nummodels);
Mod_TouchModel (str); Mod_TouchModel (str);
if (!strcmp(model_precache[nummodels], "models/player.mdl")) if (!strcmp(model_precache[nummodels], "models/player.mdl"))
@ -290,9 +368,11 @@ void CL_ParseServerInfo (void)
} }
// precache sounds // precache sounds
//Con_Printf("Got Sounds to load: ");
memset (cl.sound_precache, 0, sizeof(cl.sound_precache)); memset (cl.sound_precache, 0, sizeof(cl.sound_precache));
for (numsounds=1 ; ; numsounds++) for (numsounds=1 ; ; numsounds++)
{ {
str = MSG_ReadString (); str = MSG_ReadString ();
if (!str[0]) if (!str[0])
break; break;
@ -303,7 +383,11 @@ void CL_ParseServerInfo (void)
} }
strcpy (sound_precache[numsounds], str); strcpy (sound_precache[numsounds], str);
S_TouchSound (str); S_TouchSound (str);
//Con_Printf("%i,",numsounds);
} }
//Con_Printf("\n");
//COM_StripExtension (COM_SkipPath(model_precache[1]), mapname);
//R_PreMapLoad (mapname);
// //
// now we try to load everything else until a cache allocation fails // now we try to load everything else until a cache allocation fails
@ -312,6 +396,8 @@ void CL_ParseServerInfo (void)
loading_num_step = loading_num_step +nummodels + numsounds; loading_num_step = loading_num_step +nummodels + numsounds;
loading_step = 1; loading_step = 1;
//Con_Printf("Loaded Model: ");
for (i=1 ; i<nummodels ; i++) for (i=1 ; i<nummodels ; i++)
{ {
cl.model_precache[i] = Mod_ForName (model_precache[i], false); cl.model_precache[i] = Mod_ForName (model_precache[i], false);
@ -319,28 +405,40 @@ void CL_ParseServerInfo (void)
{ {
Con_Printf("Model %s not found\n", model_precache[i]); Con_Printf("Model %s not found\n", model_precache[i]);
loading_cur_step++; loading_cur_step++;
//return; return;
} }
CL_KeepaliveMessage (); CL_KeepaliveMessage ();
loading_cur_step++; loading_cur_step++;
strcpy(loading_name, model_precache[i]); strcpy(loading_name, model_precache[i]);
//Con_Printf("%i,",i);
SCR_UpdateScreen (); SCR_UpdateScreen ();
} }
//Con_Printf("\n");
//Con_Printf("Total Models loaded: %i\n",nummodels);
SCR_UpdateScreen (); SCR_UpdateScreen ();
// load the extra "no-flamed-torch" model
//cl.model_precache[nummodels] = Mod_ForName ("progs/flame0.mdl", false);
//cl_modelindex[mi_flame0] = nummodels++;
loading_step = 4; loading_step = 4;
S_BeginPrecaching (); S_BeginPrecaching ();
//Con_Printf("Loaded Sounds: ");
for (i=1 ; i<numsounds ; i++) for (i=1 ; i<numsounds ; i++)
{ {
cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]); cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]);
CL_KeepaliveMessage (); CL_KeepaliveMessage ();
loading_cur_step++; loading_cur_step++;
//Con_Printf("%i,",i);
strcpy(loading_name, sound_precache[i]); strcpy(loading_name, sound_precache[i]);
SCR_UpdateScreen (); SCR_UpdateScreen ();
} }
S_EndPrecaching (); S_EndPrecaching ();
//Con_Printf("...\n");
//Con_Printf("Total Sounds Loaded: %i\n",numsounds);
SCR_UpdateScreen (); SCR_UpdateScreen ();
Clear_LoadingFill (); Clear_LoadingFill ();
@ -376,13 +474,16 @@ void CL_ParseUpdate (int bits)
qboolean forcelink; qboolean forcelink;
entity_t *ent; entity_t *ent;
int num; int num;
int skin; //int skin;
if (cls.signon == SIGNONS - 1) if (cls.signon == SIGNONS - 1)
{ // first update is the final signon stage { // first update is the final signon stage
Con_DPrintf("First Update\n");
cls.signon = SIGNONS; cls.signon = SIGNONS;
CL_SignonReply (); CL_SignonReply (); //disabling this temp-mortem
} }
//Con_Printf("2\n");
if (bits & U_MOREBITS) if (bits & U_MOREBITS)
{ {
@ -444,10 +545,6 @@ if (bits&(1<<i))
} }
else else
forcelink = true; // hack to make null model players work forcelink = true; // hack to make null model players work
#ifdef GLQUAKE
if (num > 0 && num <= cl.maxclients)
R_TranslatePlayerSkin (num - 1);
#endif
} }
if (bits & U_FRAME) if (bits & U_FRAME)
@ -480,7 +577,6 @@ if (bits&(1<<i))
// shift the known values for interpolation // shift the known values for interpolation
VectorCopy (ent->msg_origins[0], ent->msg_origins[1]); VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
VectorCopy (ent->msg_angles[0], ent->msg_angles[1]); VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
if (bits & U_ORIGIN1) if (bits & U_ORIGIN1)
ent->msg_origins[0][0] = MSG_ReadCoord (); ent->msg_origins[0][0] = MSG_ReadCoord ();
else else
@ -507,7 +603,6 @@ if (bits&(1<<i))
ent->msg_angles[0][2] = MSG_ReadAngle(); ent->msg_angles[0][2] = MSG_ReadAngle();
else else
ent->msg_angles[0][2] = ent->baseline.angles[2]; ent->msg_angles[0][2] = ent->baseline.angles[2];
// Tomaz - QC Alpha Scale Glow Begin // Tomaz - QC Alpha Scale Glow Begin
if (bits & U_RENDERAMT) if (bits & U_RENDERAMT)
ent->renderamt = MSG_ReadFloat(); ent->renderamt = MSG_ReadFloat();
@ -540,7 +635,7 @@ if (bits&(1<<i))
else else
ent->scale = ENTSCALE_DEFAULT; ent->scale = ENTSCALE_DEFAULT;
if ( bits & U_NOLERP ) if ( bits & U_NOLERP )//there's no data for nolerp, it is the value itself
ent->forcelink = true; ent->forcelink = true;
if ( forcelink ) if ( forcelink )
@ -573,7 +668,6 @@ void CL_ParseBaseline (entity_t *ent)
} }
} }
/* /*
================== ==================
CL_ParseClientdata CL_ParseClientdata
@ -957,7 +1051,6 @@ void CL_ParseStaticSound (void)
S_StaticSound (cl.sound_precache[sound_num], org, vol, atten); S_StaticSound (cl.sound_precache[sound_num], org, vol, atten);
} }
extern double Hitmark_Time; extern double Hitmark_Time;
extern int crosshair_spread; extern int crosshair_spread;
extern double crosshair_spread_time; extern double crosshair_spread_time;
@ -980,8 +1073,8 @@ void CL_ParseWeaponFire (void)
cl.gun_kick[0] += kick[0]; cl.gun_kick[0] += kick[0];
cl.gun_kick[1] += kick[1]; cl.gun_kick[1] += kick[1];
cl.gun_kick[2] += kick[2]; cl.gun_kick[2] += kick[2];
}
}
/* /*
=================== ===================
CL_ParseLimbUpdate CL_ParseLimbUpdate
@ -1007,15 +1100,20 @@ void CL_ParseLimbUpdate (void)
} }
} }
#define SHOWNET(x) if(cl_shownet.value==2)Con_Printf ("%3i:%s\n", msg_readcount-1, x); #define SHOWNET(x) if(cl_shownet.value==2)Con_Printf ("%3i:%s\n", msg_readcount-1, x);
/*
=====================
CL_ParseServerMessage
=====================
*/
extern double bettyprompt_time; extern double bettyprompt_time;
extern qboolean doubletap_has_damage_buff; extern qboolean doubletap_has_damage_buff;
void CL_ParseServerMessage (void) void CL_ParseServerMessage (void)
{ {
int cmd; int cmd;
int i; int i;
int total, j, lastcmd; //johnfitz
// //
// if recording demos, copy the message out // if recording demos, copy the message out
@ -1045,10 +1143,10 @@ void CL_ParseServerMessage (void)
} }
// if the high bit of the command byte is set, it is a fast update // if the high bit of the command byte is set, it is a fast update
if (cmd & 128) if (cmd & 128)//checking if it's an entity update, if it is the 7th bit will be on, this is checking for that
{ {
SHOWNET("fast update"); SHOWNET("fast update");
CL_ParseUpdate (cmd&127); CL_ParseUpdate (cmd&127);//here we strip the cmd from the value of the 7th (128) bit, to only give the rest of the commands
continue; continue;
} }
@ -1058,11 +1156,10 @@ void CL_ParseServerMessage (void)
switch (cmd) switch (cmd)
{ {
default: default:
Host_Error ("CL_ParseServerMessage: Illegible server message: cmd = %d\n", cmd); Host_Error ("CL_ParseServerMessage: Illegible server message (%i)\n", cmd);
break; break;
case svc_nop: case svc_nop:
// Con_Printf ("svc_nop\n");
break; break;
case svc_time: case svc_time:
@ -1095,7 +1192,6 @@ void CL_ParseServerMessage (void)
case svc_useprint: case svc_useprint:
SCR_UsePrint (MSG_ReadByte (),MSG_ReadShort (),MSG_ReadByte ()); SCR_UsePrint (MSG_ReadByte (),MSG_ReadShort (),MSG_ReadByte ());
break; break;
case svc_maxammo: case svc_maxammo:
domaxammo = true; domaxammo = true;
break; break;
@ -1140,11 +1236,6 @@ void CL_ParseServerMessage (void)
case svc_stufftext: case svc_stufftext:
Cbuf_AddText (MSG_ReadString ()); Cbuf_AddText (MSG_ReadString ());
break; break;
case svc_damage:
V_ParseDamage ();
break;
case svc_serverinfo: case svc_serverinfo:
CL_ParseServerInfo (); CL_ParseServerInfo ();
vid.recalc_refdef = true; // leave intermission full screen vid.recalc_refdef = true; // leave intermission full screen
@ -1163,23 +1254,8 @@ void CL_ParseServerMessage (void)
i = MSG_ReadByte (); i = MSG_ReadByte ();
if (i >= MAX_LIGHTSTYLES) if (i >= MAX_LIGHTSTYLES)
Sys_Error ("svc_lightstyle > MAX_LIGHTSTYLES"); Sys_Error ("svc_lightstyle > MAX_LIGHTSTYLES");
q_strlcpy (cl_lightstyle[i].map, MSG_ReadString(), MAX_STYLESTRING); Q_strcpy (cl_lightstyle[i].map, MSG_ReadString());
cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map); cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
//johnfitz -- save extra info
if (cl_lightstyle[i].length)
{
total = 0;
cl_lightstyle[i].peak = 'a';
for (j=0; j<cl_lightstyle[i].length; j++)
{
total += cl_lightstyle[i].map[j] - 'a';
cl_lightstyle[i].peak = fmax(cl_lightstyle[i].peak, cl_lightstyle[i].map[j]);
}
cl_lightstyle[i].average = total / cl_lightstyle[i].length + 'a';
}
else
cl_lightstyle[i].average = cl_lightstyle[i].peak = 'm';
//johnfitz
break; break;
case svc_sound: case svc_sound:
@ -1192,13 +1268,27 @@ void CL_ParseServerMessage (void)
break; break;
case svc_updatename: case svc_updatename:
Sbar_Changed ();
i = MSG_ReadByte (); i = MSG_ReadByte ();
if (i >= cl.maxclients) if (i >= cl.maxclients)
Host_Error ("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD"); Host_Error ("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD");
strcpy (cl.scores[i].name, MSG_ReadString ()); strcpy (cl.scores[i].name, MSG_ReadString ());
break; break;
case svc_updatepoints:
i = MSG_ReadByte ();
if (i >= cl.maxclients)
Host_Error ("CL_ParseServerMessage: svc_updatepoints > MAX_SCOREBOARD");
cl.scores[i].points = MSG_ReadLong ();
break;
case svc_updatekills:
i = MSG_ReadByte ();
if (i >= cl.maxclients)
Host_Error ("CL_ParseServerMessage: svc_updatepoints > MAX_SCOREBOARD");
cl.scores[i].kills = MSG_ReadShort ();
break;
case svc_particle: case svc_particle:
R_ParseParticleEffect (); R_ParseParticleEffect ();
break; break;
@ -1222,16 +1312,10 @@ void CL_ParseServerMessage (void)
if (cl.paused) if (cl.paused)
{ {
CDAudio_Pause (); CDAudio_Pause ();
#ifdef _WIN32
VID_HandlePause (true);
#endif
} }
else else
{ {
CDAudio_Resume (); CDAudio_Resume ();
#ifdef _WIN32
VID_HandlePause (false);
#endif
} }
} }
break; break;
@ -1241,6 +1325,7 @@ void CL_ParseServerMessage (void)
if (i <= cls.signon) if (i <= cls.signon)
Host_Error ("Received signon %i when at %i", i, cls.signon); Host_Error ("Received signon %i when at %i", i, cls.signon);
cls.signon = i; cls.signon = i;
Con_DPrintf("Signon: %i \n",i);
CL_SignonReply (); CL_SignonReply ();
break; break;
@ -1248,7 +1333,7 @@ void CL_ParseServerMessage (void)
i = MSG_ReadByte (); i = MSG_ReadByte ();
if (i < 0 || i >= MAX_CL_STATS) if (i < 0 || i >= MAX_CL_STATS)
Sys_Error ("svc_updatestat: %i is invalid", i); Sys_Error ("svc_updatestat: %i is invalid", i);
cl.stats[i] = MSG_ReadLong ();; cl.stats[i] = MSG_ReadLong ();
break; break;
case svc_spawnstaticsound: case svc_spawnstaticsound:
@ -1258,10 +1343,6 @@ void CL_ParseServerMessage (void)
case svc_cdtrack: case svc_cdtrack:
cl.cdtrack = MSG_ReadByte (); cl.cdtrack = MSG_ReadByte ();
cl.looptrack = MSG_ReadByte (); cl.looptrack = MSG_ReadByte ();
if ( (cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1) )
CDAudio_Play ((byte)cls.forcetrack, true);
else
CDAudio_Play ((byte)cl.cdtrack, true);
break; break;
case svc_intermission: case svc_intermission:
@ -1288,6 +1369,13 @@ void CL_ParseServerMessage (void)
Cmd_ExecuteString ("help", src_command); Cmd_ExecuteString ("help", src_command);
break; break;
case svc_skybox:
Sky_LoadSkyBox(MSG_ReadString());
break;
case svc_fog:
Fog_ParseServerMessage ();
break;
case svc_achievement: case svc_achievement:
HUD_Parse_Achievement (MSG_ReadByte()); HUD_Parse_Achievement (MSG_ReadByte());
break; break;
@ -1304,19 +1392,8 @@ void CL_ParseServerMessage (void)
CL_ParseLimbUpdate(); CL_ParseLimbUpdate();
break; break;
case svc_updatepoints: case svc_bspdecal:
i = MSG_ReadByte (); CL_ParseBSPDecal ();
if (i >= cl.maxclients)
Host_Error ("CL_ParseServerMessage: svc_updatepoints > MAX_SCOREBOARD");
cl.scores[i].points = MSG_ReadLong ();
break;
case svc_updatekills:
i = MSG_ReadByte ();
if (i >= cl.maxclients)
Host_Error ("CL_ParseServerMessage: svc_updatekills > MAX_SCOREBOARD");
cl.scores[i].kills = MSG_ReadShort ();
break; break;
} }
} }