From e7458c4824938bee5f751c974c0b5f785bb395af Mon Sep 17 00:00:00 2001 From: cypress Date: Tue, 5 Dec 2023 13:00:57 -0500 Subject: [PATCH] NX/VITA: Considerable protocol bandwidth optimizations --- source/cl_parse.c | 75 ++++++++++++++++++++++-------------------- source/progs.h | 1 + source/protocol.h | 7 ++-- source/qconsole.log | 2 ++ source/sv_main.c | 80 ++++++++++++++++++++++++++------------------- 5 files changed, 93 insertions(+), 72 deletions(-) create mode 100644 source/qconsole.log diff --git a/source/cl_parse.c b/source/cl_parse.c index 7b7da35..8dc8d13 100644 --- a/source/cl_parse.c +++ b/source/cl_parse.c @@ -779,15 +779,12 @@ void CL_ParseClientdata (void) } //johnfitz - for(i = 0; i < 3; i++) - cl.ads_offset[i] = MSG_ReadFloat(); - for(i = 0; i < 3; i++) - cl.flash_offset[i] = MSG_ReadFloat(); - - cl.flash_size = MSG_ReadByte(); + // Flash_Offset + for(i = 0; i < 3; i++) + cl.flash_offset[i] = MSG_ReadFloat(); if (bits & SU_PERKS) - i = MSG_ReadLong (); + i = MSG_ReadByte (); else i = 0; if (cl.perks != i) @@ -981,18 +978,6 @@ void CL_ParseClientdata (void) else cl.facingenemy = 0; - if (bits & SU_WEAPONNAME) { - size_t len = MSG_ReadByte(); - - for(i = 0; i < 32; i++) { - cl.weaponname[i] = 0; - } - - for(i = 0; i < len; i++) { - cl.weaponname[i] = MSG_ReadChar(); - } - } - if (bits & SU_TOUCHNAME) { size_t len = MSG_ReadByte(); @@ -1006,7 +991,7 @@ void CL_ParseClientdata (void) } cl.onground = (bits & SU_ONGROUND) != 0; - cl.inwater = (bits & SU_INWATER) != 0; + // cl.inwater = (bits & SU_INWATER) != 0; if (bits & SU_WEAPONFRAME) cl.stats[STAT_WEAPONFRAME] = MSG_ReadByte (); @@ -1018,18 +1003,45 @@ void CL_ParseClientdata (void) else cl.stats[STAT_WEAPONSKIN] = 0; - if (bits & SU_WEAPON) - i = MSG_ReadByte (); - else - i = 0; + // Active Weapon + i = MSG_ReadByte (); + if (cl.stats[STAT_ACTIVEWEAPON] != i) + { + cl.stats[STAT_ACTIVEWEAPON] = i; + HUD_Change_time = Sys_DoubleTime() + 5; + } + + // Weapon model index + i = MSG_ReadByte(); if (cl.stats[STAT_WEAPON] != i) { cl.stats[STAT_WEAPON] = i; Sbar_Changed (); } + // Other weapon stats + if (bits & SU_WEAPON) { + // Weapon Name + size_t len = MSG_ReadByte(); + + for(i = 0; i < 32; i++) { + cl.weaponname[i] = 0; + } + + for(i = 0; i < len; i++) { + cl.weaponname[i] = MSG_ReadChar(); + } + + // Weapon ADS Offset + for(i = 0; i < 3; i++) + cl.ads_offset[i] = MSG_ReadFloat(); + + // Muzzle flash size + cl.flash_size = MSG_ReadByte(); + } + if (bits & SU_GRENADES) - i = MSG_ReadLong (); + i = MSG_ReadByte(); else i = 0; @@ -1039,7 +1051,7 @@ void CL_ParseClientdata (void) cl.stats[STAT_GRENADES] = i; } - i = MSG_ReadShort (); + i = MSG_ReadByte(); if (cl.stats[STAT_PRIGRENADES] != i) { HUD_Change_time = Sys_DoubleTime() + 5; @@ -1047,14 +1059,14 @@ void CL_ParseClientdata (void) } - i = MSG_ReadShort (); + i = MSG_ReadByte(); if (cl.stats[STAT_SECGRENADES] != i) { HUD_Change_time = Sys_DoubleTime() + 5; cl.stats[STAT_SECGRENADES] = i; } - i = MSG_ReadShort (); + i = MSG_ReadByte(); if (cl.stats[STAT_HEALTH] != i) { cl.stats[STAT_HEALTH] = i; @@ -1079,13 +1091,6 @@ void CL_ParseClientdata (void) if (cl.stats[STAT_ZOOM] != i) cl.stats[STAT_ZOOM] = i; - i = MSG_ReadByte (); - if (cl.stats[STAT_ACTIVEWEAPON] != i) - { - cl.stats[STAT_ACTIVEWEAPON] = i; - HUD_Change_time = Sys_DoubleTime() + 5; - } - // This corresponds to SV_WriteClientdataToMessage i = MSG_ReadByte (); if (cl.stats[STAT_ROUNDS] != i) diff --git a/source/progs.h b/source/progs.h index c0e8066..43fbe37 100644 --- a/source/progs.h +++ b/source/progs.h @@ -46,6 +46,7 @@ typedef struct edict_s int leafnums[MAX_ENT_LEAFS]; entity_state_t baseline; + int last_weapon; /* cypress -- hack to avoid spamming a bunch of data, and only send on wep change */ unsigned char alpha; /* johnfitz -- hack to support alpha since it's not part of entvars_t */ qboolean sendinterval; /* johnfitz -- send time until nextthink to client for better lerp timing */ diff --git a/source/protocol.h b/source/protocol.h index 060cb6b..47a6d62 100644 --- a/source/protocol.h +++ b/source/protocol.h @@ -105,10 +105,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define SU_WEAPONALPHA (1<<25) // 1 byte, this is alpha for weaponmodel, uses ENTALPHA_ENCODE, not sent if ENTALPHA_DEFAULT #define SU_MAXSPEED (1<<26) #define SU_FACINGENEMY (1<<27) -#define SU_WEAPONNAME (1<<28) -#define SU_TOUCHNAME (1<<29) -#define SU_UNUSED30 (1<<30) -#define SU_EXTEND3 (1<<31) // another byte to follow, future expansion +#define SU_TOUCHNAME (1<<28) +#define SU_UNUSED30 (1<<29) +#define SU_EXTEND3 (1<<30) // another byte to follow, future expansion //johnfitz // a sound with no channel is a local only sound diff --git a/source/qconsole.log b/source/qconsole.log new file mode 100644 index 0000000..6059f8b --- /dev/null +++ b/source/qconsole.log @@ -0,0 +1,2 @@ +LOG started on: 12/02/2023 14:54:40 +Playing registered version. diff --git a/source/sv_main.c b/source/sv_main.c index 533e73f..3b4d502 100644 --- a/source/sv_main.c +++ b/source/sv_main.c @@ -838,20 +838,15 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) if (ent->v.facingenemy) bits |= SU_FACINGENEMY; - if (ent->v.Weapon_Name) - bits |= SU_WEAPONNAME; - if (ent->v.Weapon_Name_Touch) bits |= SU_TOUCHNAME; - //if (ent->v.ADS_Offset[0]) - // bits |= SU_ADSOFS; - if ( (int)ent->v.flags & FL_ONGROUND) bits |= SU_ONGROUND; - if ( ent->v.waterlevel >= 2) - bits |= SU_INWATER; + // cypress - Water stuff is useless. + // if ( ent->v.waterlevel >= 2) + // bits |= SU_INWATER; for (i=0 ; i<3 ; i++) { @@ -867,8 +862,10 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) if (ent->v.weaponskin) bits |= SU_WEAPONSKIN; -// if (ent->v.weapon) + if ((int)ent->v.weapon != ent->last_weapon) { bits |= SU_WEAPON; + ent->last_weapon = (int)ent->v.weapon; // cypress -- don't network a bunch of weapon shit. also, why is this a float? + } if (ent->v.grenades) bits |= SU_GRENADES; @@ -909,16 +906,15 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) MSG_WriteChar (msg, ent->v.velocity[i]/16); } - for(i = 0; i < 3; i++) - MSG_WriteFloat(msg, ent->v.ADS_Offset[i]); - + // FIXME: We allow QC to change Flash_Offset on-the-fly + // for left-handed weapons. May want to make this it's + // own field, but until then it's float spam! for(i = 0; i < 3; i++) MSG_WriteFloat(msg, ent->v.Flash_Offset[i]); - MSG_WriteByte(msg, ent->v.Flash_Size); - + // WHY WAS THIS A LONG???? if (bits & SU_PERKS) - MSG_WriteLong (msg, ent->v.perks); + MSG_WriteByte (msg, ent->v.perks); if (bits & SU_MAXSPEED) MSG_WriteFloat (msg, ent->v.maxspeed); @@ -926,17 +922,8 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) if (bits & SU_FACINGENEMY) MSG_WriteByte (msg, ent->v.facingenemy); - if (bits & SU_WEAPONNAME) { - size_t len = 32; - if (strlen(pr_strings+ent->v.Weapon_Name) < 32) - len = strlen(pr_strings+ent->v.Weapon_Name); - - MSG_WriteByte(msg, len); - for(i = 0; i < len; i++) { - MSG_WriteChar(msg, (pr_strings+ent->v.Weapon_Name)[i]); - } - } - + // FIXME: I don't really like forcing a pass of 32 bytes per frame whenever + // we touch a weapon or something. Kinda lame. if (bits & SU_TOUCHNAME) { size_t len = 32; if (strlen(pr_strings+ent->v.Weapon_Name_Touch) < 32) @@ -952,20 +939,47 @@ void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg) MSG_WriteByte (msg, ent->v.weaponframe); if (bits & SU_WEAPONSKIN) MSG_WriteByte (msg, ent->v.weaponskin); - if (bits & SU_WEAPON) - MSG_WriteByte (msg, SV_ModelIndex(PR_GetString(ent->v.weaponmodel))); + // Active Weapon + MSG_WriteByte (msg, ent->v.weapon); + + // Weapon model index + MSG_WriteByte (msg, SV_ModelIndex(PR_GetString(ent->v.weaponmodel))); + + // Cypress -- SU_WEAPON exchanges are now a lot more involved, so they only + // happen if absolutely necessary. + if (bits & SU_WEAPON) { + // Weapon Name + size_t len = 32; // hard-coded 32 character limit, deal with it. + if (strlen(pr_strings+ent->v.Weapon_Name) < 32) + len = strlen(pr_strings+ent->v.Weapon_Name); + + MSG_WriteByte(msg, len); + for(i = 0; i < len; i++) { + MSG_WriteChar(msg, (pr_strings+ent->v.Weapon_Name)[i]); + } + + // Weapon ADS Offset + for(i = 0; i < 3; i++) + MSG_WriteFloat(msg, ent->v.ADS_Offset[i]); + + // Muzzle flash size + MSG_WriteByte(msg, ent->v.Flash_Size); + } + + // Why the fuck was this a long? if (bits & SU_GRENADES) - MSG_WriteLong (msg, ent->v.grenades); + MSG_WriteByte(msg, ent->v.grenades); + + // Why the FUCK were these shorts?!?!? + MSG_WriteByte (msg, ent->v.primary_grenades); + MSG_WriteByte (msg, ent->v.secondary_grenades); + MSG_WriteByte (msg, ent->v.health); // this one was id's 'fault' - MSG_WriteShort (msg, ent->v.primary_grenades); - MSG_WriteShort (msg, ent->v.secondary_grenades); - MSG_WriteShort (msg, ent->v.health); MSG_WriteByte (msg, ent->v.currentammo); MSG_WriteByte (msg, ent->v.currentmag); MSG_WriteByte (msg, ent->v.zoom); - MSG_WriteByte (msg, ent->v.weapon); MSG_WriteByte (msg, pr_global_struct->rounds); // This cooresponds to CL_ParseClientdata MSG_WriteByte (msg, pr_global_struct->rounds_change); MSG_WriteByte (msg, ent->v.x2_icon);