diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 35ddd750b..7e10180b2 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -114,11 +114,10 @@ UINT16 pingmeasurecount = 1; UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone. UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values. UINT32 playerpacketlosstable[MAXPLAYERS]; +UINT32 playerdelaytable[MAXPLAYERS]; // mindelay values. static tic_t lowest_lag; boolean server_lagless; -static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; -consvar_t cv_mindelay = CVAR_INIT ("mindelay", "0", CV_SAVE, mindelay_cons_t, NULL); SINT8 nodetoplayer[MAXNETNODES]; SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen) @@ -3494,6 +3493,8 @@ void SV_ResetServer(void) pingmeasurecount = 1; memset(realpingtable, 0, sizeof realpingtable); memset(playerpingtable, 0, sizeof playerpingtable); + memset(playerpacketlosstable, 0, sizeof playerpacketlosstable); + memset(playerdelaytable, 0, sizeof playerdelaytable); ClearAdminPlayers(); Schedule_Clear(); @@ -5024,6 +5025,7 @@ static void HandlePacketFromPlayer(SINT8 node) { playerpingtable[i] = (tic_t)netbuffer->u.netinfo.pingtable[i]; playerpacketlosstable[i] = netbuffer->u.netinfo.packetloss[i]; + playerdelaytable[i] = netbuffer->u.netinfo.delay[i]; } } @@ -5794,6 +5796,7 @@ static inline void PingUpdate(void) } netbuffer->u.netinfo.packetloss[i] = lost; + netbuffer->u.netinfo.delay[i] = playerdelaytable[i]; } // send the server's maxping as last element of our ping table. This is useful to let us know when we're about to get kicked. diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 8f07a71ee..e2c9da955 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -347,6 +347,7 @@ struct netinfo_pak { UINT32 pingtable[MAXPLAYERS+1]; UINT32 packetloss[MAXPLAYERS+1]; + UINT32 delay[MAXPLAYERS+1]; } ATTRPACK; // @@ -458,6 +459,7 @@ extern UINT16 pingmeasurecount; extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern UINT32 playerpacketlosstable[MAXPLAYERS]; +extern UINT32 playerdelaytable[MAXPLAYERS]; extern tic_t servermaxping; extern boolean server_lagless; diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 8453b8ea1..02d9f2d84 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1919,7 +1919,11 @@ void WeaponPref_Send(UINT8 ssplayer) if (cv_flipcam[ssplayer].value) prefs |= WP_FLIPCAM; - SendNetXCmdForPlayer(ssplayer, XD_WEAPONPREF, &prefs, 1); + UINT8 buf[2]; + buf[0] = prefs; + buf[1] = cv_mindelay.value; + + SendNetXCmdForPlayer(ssplayer, XD_WEAPONPREF, buf, sizeof buf); } void WeaponPref_Save(UINT8 **cp, INT32 playernum) @@ -1970,6 +1974,13 @@ static void Got_WeaponPref(UINT8 **cp,INT32 playernum) { WeaponPref_Parse(cp, playernum); + UINT8 mindelay = READUINT8(*cp); + if (server) + { + for (UINT8 i = 0; i < G_LocalSplitscreenPartySize(playernum); ++i) + playerdelaytable[G_LocalSplitscreenPartyMember(playernum, i)] = mindelay; + } + // SEE ALSO g_demo.c demo_extradata[playernum] |= DXD_WEAPONPREF; } diff --git a/src/g_game.c b/src/g_game.c index 92b776c5d..f192318a9 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -424,6 +424,9 @@ consvar_t cv_resetspecialmusic = CVAR_INIT ("resetspecialmusic", "Yes", CV_SAVE, consvar_t cv_resume = CVAR_INIT ("resume", "Yes", CV_SAVE, CV_YesNo, NULL); +static CV_PossibleValue_t mindelay_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}}; +consvar_t cv_mindelay = CVAR_INIT ("mindelay", "0", CV_SAVE|CV_CALL, mindelay_cons_t, weaponPrefChange); + consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("kickstartaccel", "Off", CV_SAVE|CV_CALL, CV_OnOff, weaponPrefChange), CVAR_INIT ("kickstartaccel2", "Off", CV_SAVE|CV_CALL, CV_OnOff, weaponPrefChange2),