mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-02-22 03:41:05 +00:00
Merge remote-tracking branch 'remotes/pub/master' into next
This commit is contained in:
commit
535b386f8e
11 changed files with 173 additions and 156 deletions
|
@ -539,10 +539,41 @@ static void COM_ExecuteString(char *ptext)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Alias recursion cycle detected!\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Alias recursion cycle detected!\n"));
|
||||||
recursion = 0;
|
recursion = 0;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
recursion++;
|
else
|
||||||
COM_BufInsertText(a->value);
|
{
|
||||||
|
char buf[1024];
|
||||||
|
char *write = buf, *read = a->value, *seek = read;
|
||||||
|
|
||||||
|
while ((seek = strchr(seek, '$')) != NULL)
|
||||||
|
{
|
||||||
|
memcpy(write, read, seek-read);
|
||||||
|
write += seek-read;
|
||||||
|
|
||||||
|
seek++;
|
||||||
|
|
||||||
|
if (*seek >= '1' && *seek <= '9')
|
||||||
|
{
|
||||||
|
if (com_argc > (size_t)(*seek - '0'))
|
||||||
|
{
|
||||||
|
memcpy(write, com_argv[*seek - '0'], strlen(com_argv[*seek - '0']));
|
||||||
|
write += strlen(com_argv[*seek - '0']);
|
||||||
|
}
|
||||||
|
seek++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*write = '$';
|
||||||
|
write++;
|
||||||
|
}
|
||||||
|
|
||||||
|
read = seek;
|
||||||
|
}
|
||||||
|
WRITESTRING(write, read);
|
||||||
|
|
||||||
|
recursion++;
|
||||||
|
COM_BufInsertText(buf);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -565,8 +596,6 @@ static void COM_ExecuteString(char *ptext)
|
||||||
static void COM_Alias_f(void)
|
static void COM_Alias_f(void)
|
||||||
{
|
{
|
||||||
cmdalias_t *a;
|
cmdalias_t *a;
|
||||||
char cmd[1024];
|
|
||||||
size_t i, c;
|
|
||||||
|
|
||||||
if (COM_Argc() < 3)
|
if (COM_Argc() < 3)
|
||||||
{
|
{
|
||||||
|
@ -579,19 +608,9 @@ static void COM_Alias_f(void)
|
||||||
com_alias = a;
|
com_alias = a;
|
||||||
|
|
||||||
a->name = Z_StrDup(COM_Argv(1));
|
a->name = Z_StrDup(COM_Argv(1));
|
||||||
|
// Just use arg 2 if it's the only other argument, in case the alias is wrapped in quotes (backward compat, or multiple commands in one string).
|
||||||
// copy the rest of the command line
|
// Otherwise pull the whole string and seek to the end of the alias name. The strctr is in case the alias is quoted.
|
||||||
cmd[0] = 0; // start out with a null string
|
a->value = Z_StrDup(COM_Argc() == 3 ? COM_Argv(2) : (strchr(COM_Args() + strlen(a->name), ' ') + 1));
|
||||||
c = COM_Argc();
|
|
||||||
for (i = 2; i < c; i++)
|
|
||||||
{
|
|
||||||
strcat(cmd, COM_Argv(i));
|
|
||||||
if (i != c)
|
|
||||||
strcat(cmd, " ");
|
|
||||||
}
|
|
||||||
strcat(cmd, "\n");
|
|
||||||
|
|
||||||
a->value = Z_StrDup(cmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Prints a line of text to the console.
|
/** Prints a line of text to the console.
|
||||||
|
|
|
@ -91,12 +91,10 @@ tic_t jointimeout = (3*TICRATE);
|
||||||
static boolean sendingsavegame[MAXNETNODES]; // Are we sending the savegame?
|
static boolean sendingsavegame[MAXNETNODES]; // Are we sending the savegame?
|
||||||
static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the server before getting a timeout?
|
static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the server before getting a timeout?
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
UINT16 pingmeasurecount = 1;
|
UINT16 pingmeasurecount = 1;
|
||||||
UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone.
|
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 playerpingtable[MAXPLAYERS]; //table of player latency values.
|
||||||
tic_t servermaxping = 800; // server's max ping. Defaults to 800
|
tic_t servermaxping = 800; // server's max ping. Defaults to 800
|
||||||
#endif
|
|
||||||
SINT8 nodetoplayer[MAXNETNODES];
|
SINT8 nodetoplayer[MAXNETNODES];
|
||||||
SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen)
|
SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen)
|
||||||
SINT8 nodetoplayer3[MAXNETNODES]; // say the numplayer for this node if any (splitscreen == 2)
|
SINT8 nodetoplayer3[MAXNETNODES]; // say the numplayer for this node if any (splitscreen == 2)
|
||||||
|
@ -3074,12 +3072,10 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
HU_AddChatText(va("\x82*%s has been kicked (Go away)", player_names[pnum]), false);
|
HU_AddChatText(va("\x82*%s has been kicked (Go away)", player_names[pnum]), false);
|
||||||
kickreason = KR_KICK;
|
kickreason = KR_KICK;
|
||||||
break;
|
break;
|
||||||
#ifdef NEWPING
|
|
||||||
case KICK_MSG_PING_HIGH:
|
case KICK_MSG_PING_HIGH:
|
||||||
HU_AddChatText(va("\x82*%s left the game (Broke ping limit)", player_names[pnum]), false);
|
HU_AddChatText(va("\x82*%s left the game (Broke ping limit)", player_names[pnum]), false);
|
||||||
kickreason = KR_PINGLIMIT;
|
kickreason = KR_PINGLIMIT;
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case KICK_MSG_CON_FAIL:
|
case KICK_MSG_CON_FAIL:
|
||||||
HU_AddChatText(va("\x82*%s left the game (Synch Failure)", player_names[pnum]), false);
|
HU_AddChatText(va("\x82*%s left the game (Synch Failure)", player_names[pnum]), false);
|
||||||
kickreason = KR_SYNCH;
|
kickreason = KR_SYNCH;
|
||||||
|
@ -3152,10 +3148,8 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
D_StartTitle();
|
D_StartTitle();
|
||||||
if (msg == KICK_MSG_CON_FAIL)
|
if (msg == KICK_MSG_CON_FAIL)
|
||||||
M_StartMessage(M_GetText("Server closed connection\n(Synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
|
M_StartMessage(M_GetText("Server closed connection\n(Synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
|
||||||
#ifdef NEWPING
|
|
||||||
else if (msg == KICK_MSG_PING_HIGH)
|
else if (msg == KICK_MSG_PING_HIGH)
|
||||||
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
|
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
|
||||||
#endif
|
|
||||||
else if (msg == KICK_MSG_BANNED)
|
else if (msg == KICK_MSG_BANNED)
|
||||||
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
|
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
|
||||||
else if (msg == KICK_MSG_CUSTOM_KICK)
|
else if (msg == KICK_MSG_CUSTOM_KICK)
|
||||||
|
@ -3199,15 +3193,15 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
static CV_PossibleValue_t netticbuffer_cons_t[] = {{0, "MIN"}, {3, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t netticbuffer_cons_t[] = {{0, "MIN"}, {3, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_netticbuffer = {"netticbuffer", "1", CV_SAVE, netticbuffer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_netticbuffer = {"netticbuffer", "1", CV_SAVE, netticbuffer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_allownewplayer = {"allowjoin", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
consvar_t cv_allownewplayer = {"allowjoin", "On", CV_SAVE|CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
||||||
#ifdef VANILLAJOINNEXTROUND
|
#ifdef VANILLAJOINNEXTROUND
|
||||||
consvar_t cv_joinnextround = {"joinnextround", "Off", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; /// \todo not done
|
consvar_t cv_joinnextround = {"joinnextround", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; /// \todo not done
|
||||||
#endif
|
#endif
|
||||||
static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_maxplayers = {"maxplayers", "8", CV_SAVE, maxplayers_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_maxplayers = {"maxplayers", "8", CV_SAVE, maxplayers_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
static CV_PossibleValue_t resynchattempts_cons_t[] = {{0, "MIN"}, {20, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t resynchattempts_cons_t[] = {{0, "MIN"}, {20, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_resynchattempts = {"resynchattempts", "5", CV_SAVE, resynchattempts_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL };
|
consvar_t cv_resynchattempts = {"resynchattempts", "5", CV_SAVE, resynchattempts_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL };
|
||||||
consvar_t cv_blamecfail = {"blamecfail", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
consvar_t cv_blamecfail = {"blamecfail", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
||||||
|
|
||||||
// max file size to send to a player (in kilobytes)
|
// max file size to send to a player (in kilobytes)
|
||||||
static CV_PossibleValue_t maxsend_cons_t[] = {{0, "MIN"}, {51200, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t maxsend_cons_t[] = {{0, "MIN"}, {51200, "MAX"}, {0, NULL}};
|
||||||
|
@ -3250,12 +3244,6 @@ void D_ClientServerInit(void)
|
||||||
RegisterNetXCmd(XD_ADDPLAYER, Got_AddPlayer);
|
RegisterNetXCmd(XD_ADDPLAYER, Got_AddPlayer);
|
||||||
RegisterNetXCmd(XD_REMOVEPLAYER, Got_RemovePlayer);
|
RegisterNetXCmd(XD_REMOVEPLAYER, Got_RemovePlayer);
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
CV_RegisterVar(&cv_allownewplayer);
|
|
||||||
#ifdef VANILLAJOINNEXTROUND
|
|
||||||
CV_RegisterVar(&cv_joinnextround);
|
|
||||||
#endif
|
|
||||||
CV_RegisterVar(&cv_showjoinaddress);
|
|
||||||
CV_RegisterVar(&cv_blamecfail);
|
|
||||||
#ifdef DUMPCONSISTENCY
|
#ifdef DUMPCONSISTENCY
|
||||||
CV_RegisterVar(&cv_dumpconsistency);
|
CV_RegisterVar(&cv_dumpconsistency);
|
||||||
#endif
|
#endif
|
||||||
|
@ -4610,7 +4598,6 @@ FILESTAMP
|
||||||
resynch_local_inprogress = true;
|
resynch_local_inprogress = true;
|
||||||
CL_AcknowledgeResynch(&netbuffer->u.resynchpak);
|
CL_AcknowledgeResynch(&netbuffer->u.resynchpak);
|
||||||
break;
|
break;
|
||||||
#ifdef NEWPING
|
|
||||||
case PT_PING:
|
case PT_PING:
|
||||||
// Only accept PT_PING from the server.
|
// Only accept PT_PING from the server.
|
||||||
if (node != servernode)
|
if (node != servernode)
|
||||||
|
@ -4640,7 +4627,6 @@ FILESTAMP
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case PT_SERVERCFG:
|
case PT_SERVERCFG:
|
||||||
break;
|
break;
|
||||||
case PT_FILEFRAGMENT:
|
case PT_FILEFRAGMENT:
|
||||||
|
@ -5278,7 +5264,6 @@ void TryRunTics(tic_t realtics)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
|
|
||||||
/* Ping Update except better:
|
/* Ping Update except better:
|
||||||
We call this once per second and check for people's pings. If their ping happens to be too high, we increment some timer and kick them out.
|
We call this once per second and check for people's pings. If their ping happens to be too high, we increment some timer and kick them out.
|
||||||
|
@ -5362,11 +5347,9 @@ static inline void PingUpdate(void)
|
||||||
|
|
||||||
pingmeasurecount = 1; //Reset count
|
pingmeasurecount = 1; //Reset count
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static tic_t gametime = 0;
|
static tic_t gametime = 0;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
static void UpdatePingTable(void)
|
static void UpdatePingTable(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
@ -5381,7 +5364,6 @@ static void UpdatePingTable(void)
|
||||||
pingmeasurecount++;
|
pingmeasurecount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Handle timeouts to prevent definitive freezes from happenning
|
// Handle timeouts to prevent definitive freezes from happenning
|
||||||
static void HandleNodeTimeouts(void)
|
static void HandleNodeTimeouts(void)
|
||||||
|
@ -5406,9 +5388,7 @@ void NetKeepAlive(void)
|
||||||
if (realtics <= 0) // nothing new to update
|
if (realtics <= 0) // nothing new to update
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
UpdatePingTable();
|
UpdatePingTable();
|
||||||
#endif
|
|
||||||
|
|
||||||
if (server)
|
if (server)
|
||||||
CL_SendClientKeepAlive();
|
CL_SendClientKeepAlive();
|
||||||
|
@ -5455,9 +5435,7 @@ void NetUpdate(void)
|
||||||
|
|
||||||
gametime = nowtime;
|
gametime = nowtime;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
UpdatePingTable();
|
UpdatePingTable();
|
||||||
#endif
|
|
||||||
|
|
||||||
if (client)
|
if (client)
|
||||||
maketic = neededtic;
|
maketic = neededtic;
|
||||||
|
|
|
@ -93,9 +93,7 @@ typedef enum
|
||||||
PT_NODETIMEOUT, // Packet sent to self if the connection times out.
|
PT_NODETIMEOUT, // Packet sent to self if the connection times out.
|
||||||
PT_RESYNCHING, // Packet sent to resync players.
|
PT_RESYNCHING, // Packet sent to resync players.
|
||||||
// Blocks game advance until synched.
|
// Blocks game advance until synched.
|
||||||
#ifdef NEWPING
|
|
||||||
PT_PING, // Packet sent to tell clients the other client's latency to server.
|
PT_PING, // Packet sent to tell clients the other client's latency to server.
|
||||||
#endif
|
|
||||||
NUMPACKETTYPE
|
NUMPACKETTYPE
|
||||||
} packettype_t;
|
} packettype_t;
|
||||||
|
|
||||||
|
@ -473,9 +471,7 @@ typedef struct
|
||||||
msaskinfo_pak msaskinfo; // 22 bytes
|
msaskinfo_pak msaskinfo; // 22 bytes
|
||||||
plrinfo playerinfo[MAXPLAYERS]; // 576 bytes(?)
|
plrinfo playerinfo[MAXPLAYERS]; // 576 bytes(?)
|
||||||
plrconfig playerconfig[MAXPLAYERS]; // (up to) 528 bytes(?)
|
plrconfig playerconfig[MAXPLAYERS]; // (up to) 528 bytes(?)
|
||||||
#ifdef NEWPING
|
|
||||||
UINT32 pingtable[MAXPLAYERS+1]; // 68 bytes
|
UINT32 pingtable[MAXPLAYERS+1]; // 68 bytes
|
||||||
#endif
|
|
||||||
} u; // This is needed to pack diff packet types data together
|
} u; // This is needed to pack diff packet types data together
|
||||||
} ATTRPACK doomdata_t;
|
} ATTRPACK doomdata_t;
|
||||||
|
|
||||||
|
@ -509,9 +505,7 @@ extern consvar_t cv_playbackspeed;
|
||||||
#define KICK_MSG_PLAYER_QUIT 3
|
#define KICK_MSG_PLAYER_QUIT 3
|
||||||
#define KICK_MSG_TIMEOUT 4
|
#define KICK_MSG_TIMEOUT 4
|
||||||
#define KICK_MSG_BANNED 5
|
#define KICK_MSG_BANNED 5
|
||||||
#ifdef NEWPING
|
|
||||||
#define KICK_MSG_PING_HIGH 6
|
#define KICK_MSG_PING_HIGH 6
|
||||||
#endif
|
|
||||||
#define KICK_MSG_CUSTOM_KICK 7
|
#define KICK_MSG_CUSTOM_KICK 7
|
||||||
#define KICK_MSG_CUSTOM_BAN 8
|
#define KICK_MSG_CUSTOM_BAN 8
|
||||||
|
|
||||||
|
@ -536,12 +530,10 @@ extern SINT8 servernode;
|
||||||
void Command_Ping_f(void);
|
void Command_Ping_f(void);
|
||||||
extern tic_t connectiontimeout;
|
extern tic_t connectiontimeout;
|
||||||
extern tic_t jointimeout;
|
extern tic_t jointimeout;
|
||||||
#ifdef NEWPING
|
|
||||||
extern UINT16 pingmeasurecount;
|
extern UINT16 pingmeasurecount;
|
||||||
extern UINT32 realpingtable[MAXPLAYERS];
|
extern UINT32 realpingtable[MAXPLAYERS];
|
||||||
extern UINT32 playerpingtable[MAXPLAYERS];
|
extern UINT32 playerpingtable[MAXPLAYERS];
|
||||||
extern tic_t servermaxping;
|
extern tic_t servermaxping;
|
||||||
#endif
|
|
||||||
|
|
||||||
extern consvar_t
|
extern consvar_t
|
||||||
#ifdef VANILLAJOINNEXTROUND
|
#ifdef VANILLAJOINNEXTROUND
|
||||||
|
|
125
src/d_net.c
125
src/d_net.c
|
@ -185,22 +185,10 @@ typedef struct
|
||||||
UINT8 nextacknum;
|
UINT8 nextacknum;
|
||||||
|
|
||||||
UINT8 flags;
|
UINT8 flags;
|
||||||
#ifndef NEWPING
|
|
||||||
// jacobson tcp timeout evaluation algorithm (Karn variation)
|
|
||||||
fixed_t ping;
|
|
||||||
fixed_t varping;
|
|
||||||
INT32 timeout; // computed with ping and varping
|
|
||||||
#endif
|
|
||||||
} node_t;
|
} node_t;
|
||||||
|
|
||||||
static node_t nodes[MAXNETNODES];
|
static node_t nodes[MAXNETNODES];
|
||||||
#ifndef NEWPING
|
#define NODETIMEOUT 14
|
||||||
#define PINGDEFAULT ((200*TICRATE*FRACUNIT)/1000)
|
|
||||||
#define VARPINGDEFAULT ((50*TICRATE*FRACUNIT)/1000)
|
|
||||||
#define TIMEOUT(p,v) (p+4*v+FRACUNIT/2)>>FRACBITS;
|
|
||||||
#else
|
|
||||||
#define NODETIMEOUT 14 //What the above boiled down to...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
// return <0 if a < b (mod 256)
|
// return <0 if a < b (mod 256)
|
||||||
|
@ -320,19 +308,7 @@ static UINT8 GetAcktosend(INT32 node)
|
||||||
static void RemoveAck(INT32 i)
|
static void RemoveAck(INT32 i)
|
||||||
{
|
{
|
||||||
INT32 node = ackpak[i].destinationnode;
|
INT32 node = ackpak[i].destinationnode;
|
||||||
#ifndef NEWPING
|
|
||||||
fixed_t trueping = (I_GetTime() - ackpak[i].senttime)<<FRACBITS;
|
|
||||||
if (ackpak[i].resentnum)
|
|
||||||
{
|
|
||||||
// +FRACUNIT/2 for round
|
|
||||||
nodes[node].ping = (nodes[node].ping*7 + trueping)/8;
|
|
||||||
nodes[node].varping = (nodes[node].varping*7 + abs(nodes[node].ping-trueping))/8;
|
|
||||||
nodes[node].timeout = TIMEOUT(nodes[node].ping,nodes[node].varping);
|
|
||||||
}
|
|
||||||
DEBFILE(va("Remove ack %d trueping %d ping %f var %f timeout %d\n",ackpak[i].acknum,trueping>>FRACBITS,(double)FIXED_TO_FLOAT(nodes[node].ping),(double)FIXED_TO_FLOAT(nodes[node].varping),nodes[node].timeout));
|
|
||||||
#else
|
|
||||||
DEBFILE(va("Remove ack %d\n",ackpak[i].acknum));
|
DEBFILE(va("Remove ack %d\n",ackpak[i].acknum));
|
||||||
#endif
|
|
||||||
ackpak[i].acknum = 0;
|
ackpak[i].acknum = 0;
|
||||||
if (nodes[node].flags & NF_CLOSE)
|
if (nodes[node].flags & NF_CLOSE)
|
||||||
Net_CloseConnection(node);
|
Net_CloseConnection(node);
|
||||||
|
@ -519,11 +495,7 @@ void Net_AckTicker(void)
|
||||||
{
|
{
|
||||||
const INT32 nodei = ackpak[i].destinationnode;
|
const INT32 nodei = ackpak[i].destinationnode;
|
||||||
node_t *node = &nodes[nodei];
|
node_t *node = &nodes[nodei];
|
||||||
#ifdef NEWPING
|
|
||||||
if (ackpak[i].acknum && ackpak[i].senttime + NODETIMEOUT < I_GetTime())
|
if (ackpak[i].acknum && ackpak[i].senttime + NODETIMEOUT < I_GetTime())
|
||||||
#else
|
|
||||||
if (ackpak[i].acknum && ackpak[i].senttime + node->timeout < I_GetTime())
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
if (ackpak[i].resentnum > 10 && (node->flags & NF_CLOSE))
|
if (ackpak[i].resentnum > 10 && (node->flags & NF_CLOSE))
|
||||||
{
|
{
|
||||||
|
@ -534,13 +506,8 @@ void Net_AckTicker(void)
|
||||||
ackpak[i].acknum = 0;
|
ackpak[i].acknum = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef NEWPING
|
|
||||||
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
||||||
NODETIMEOUT, I_GetTime()));
|
NODETIMEOUT, I_GetTime()));
|
||||||
#else
|
|
||||||
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
|
||||||
node->timeout, I_GetTime()));
|
|
||||||
#endif
|
|
||||||
M_Memcpy(netbuffer, ackpak[i].pak.raw, ackpak[i].length);
|
M_Memcpy(netbuffer, ackpak[i].pak.raw, ackpak[i].length);
|
||||||
ackpak[i].senttime = I_GetTime();
|
ackpak[i].senttime = I_GetTime();
|
||||||
ackpak[i].resentnum++;
|
ackpak[i].resentnum++;
|
||||||
|
@ -658,11 +625,6 @@ void Net_WaitAllAckReceived(UINT32 timeout)
|
||||||
static void InitNode(node_t *node)
|
static void InitNode(node_t *node)
|
||||||
{
|
{
|
||||||
node->acktosend_head = node->acktosend_tail = 0;
|
node->acktosend_head = node->acktosend_tail = 0;
|
||||||
#ifndef NEWPING
|
|
||||||
node->ping = PINGDEFAULT;
|
|
||||||
node->varping = VARPINGDEFAULT;
|
|
||||||
node->timeout = TIMEOUT(node->ping, node->varping);
|
|
||||||
#endif
|
|
||||||
node->firstacktosend = 0;
|
node->firstacktosend = 0;
|
||||||
node->nextacknum = 1;
|
node->nextacknum = 1;
|
||||||
node->remotefirstack = 0;
|
node->remotefirstack = 0;
|
||||||
|
@ -854,9 +816,7 @@ static const char *packettypename[NUMPACKETTYPE] =
|
||||||
"CLIENTJOIN",
|
"CLIENTJOIN",
|
||||||
"NODETIMEOUT",
|
"NODETIMEOUT",
|
||||||
"RESYNCHING",
|
"RESYNCHING",
|
||||||
#ifdef NEWPING
|
|
||||||
"PING"
|
"PING"
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void DebugPrintpacket(const char *header)
|
static void DebugPrintpacket(const char *header)
|
||||||
|
@ -1410,30 +1370,73 @@ boolean D_CheckNetGame(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct pingcell
|
||||||
|
{
|
||||||
|
INT32 num;
|
||||||
|
INT32 ms;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int pingcellcmp(const void *va, const void *vb)
|
||||||
|
{
|
||||||
|
const struct pingcell *a, *b;
|
||||||
|
a = va;
|
||||||
|
b = vb;
|
||||||
|
return ( a->ms - b->ms );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
New ping command formatted nicely to present ping in
|
||||||
|
ascending order. And with equally spaced columns.
|
||||||
|
The caller's ping is presented at the bottom too, for
|
||||||
|
convenience.
|
||||||
|
*/
|
||||||
|
|
||||||
void Command_Ping_f(void)
|
void Command_Ping_f(void)
|
||||||
{
|
{
|
||||||
#ifndef NEWPING
|
struct pingcell pingv[MAXPLAYERS];
|
||||||
if(server)
|
INT32 pingc;
|
||||||
|
|
||||||
|
int name_width = 0;
|
||||||
|
int ms_width = 0;
|
||||||
|
|
||||||
|
int n;
|
||||||
|
INT32 i;
|
||||||
|
|
||||||
|
pingc = 0;
|
||||||
|
for (i = 1; i < MAXPLAYERS; ++i)
|
||||||
|
if (playeringame[i])
|
||||||
{
|
{
|
||||||
#endif
|
n = strlen(player_names[i]);
|
||||||
INT32 i;
|
if (n > name_width)
|
||||||
for (i = 0; i < MAXPLAYERS;i++)
|
name_width = n;
|
||||||
{
|
|
||||||
#ifndef NEWPING
|
n = playerpingtable[i];
|
||||||
const INT32 node = playernode[i];
|
if (n > ms_width)
|
||||||
if (playeringame[i] && node != 0)
|
ms_width = n;
|
||||||
CONS_Printf(M_GetText("%.2d : %s\n %d tics, %d ms.\n"), i, player_names[i],
|
|
||||||
GetLag(node), G_TicsToMilliseconds(GetLag(node)));
|
pingv[pingc].num = i;
|
||||||
#else
|
pingv[pingc].ms = playerpingtable[i];
|
||||||
if (playeringame[i] && i != 0)
|
pingc++;
|
||||||
CONS_Printf(M_GetText("%.2d : %s\n %d ms\n"), i, player_names[i], playerpingtable[i]);
|
}
|
||||||
#endif
|
|
||||||
}
|
if (ms_width < 10) ms_width = 1;
|
||||||
#ifndef NEWPING
|
else if (ms_width < 100) ms_width = 2;
|
||||||
|
else ms_width = 3;
|
||||||
|
|
||||||
|
qsort(pingv, pingc, sizeof (struct pingcell), &pingcellcmp);
|
||||||
|
|
||||||
|
for (i = 0; i < pingc; ++i)
|
||||||
|
{
|
||||||
|
CONS_Printf("%02d : %-*s %*d ms\n",
|
||||||
|
pingv[i].num,
|
||||||
|
name_width, player_names[pingv[i].num],
|
||||||
|
ms_width, pingv[i].ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!server && playeringame[consoleplayer])
|
||||||
|
{
|
||||||
|
CONS_Printf("\nYour ping is %d ms\n", playerpingtable[consoleplayer]);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
CONS_Printf(M_GetText("Only the server can use this.\n"));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void D_CloseConnection(void)
|
void D_CloseConnection(void)
|
||||||
|
|
|
@ -434,7 +434,6 @@ static CV_PossibleValue_t nettimeout_cons_t[] = {{TICRATE/7, "MIN"}, {60*TICRATE
|
||||||
consvar_t cv_nettimeout = {"nettimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, NetTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_nettimeout = {"nettimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, NetTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
//static CV_PossibleValue_t jointimeout_cons_t[] = {{5*TICRATE, "MIN"}, {60*TICRATE, "MAX"}, {0, NULL}};
|
//static CV_PossibleValue_t jointimeout_cons_t[] = {{5*TICRATE, "MIN"}, {60*TICRATE, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_jointimeout = {"jointimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, JoinTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_jointimeout = {"jointimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, JoinTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
#ifdef NEWPING
|
|
||||||
static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
@ -445,7 +444,6 @@ consvar_t cv_pingtimeout = {"pingtimeout", "10", CV_SAVE, pingtimeout_cons_t, NU
|
||||||
static CV_PossibleValue_t showping_cons_t[] = {{0, "Off"}, {1, "Always"}, {2, "Warning"}, {0, NULL}};
|
static CV_PossibleValue_t showping_cons_t[] = {{0, "Off"}, {1, "Always"}, {2, "Warning"}, {0, NULL}};
|
||||||
consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
#endif
|
|
||||||
// Intermission time Tails 04-19-2002
|
// Intermission time Tails 04-19-2002
|
||||||
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_inttime = {"inttime", "20", CV_NETVAR, inttime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_inttime = {"inttime", "20", CV_NETVAR, inttime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
@ -678,6 +676,14 @@ void D_RegisterServerCommands(void)
|
||||||
CV_RegisterVar(&cv_maxsend);
|
CV_RegisterVar(&cv_maxsend);
|
||||||
CV_RegisterVar(&cv_noticedownload);
|
CV_RegisterVar(&cv_noticedownload);
|
||||||
CV_RegisterVar(&cv_downloadspeed);
|
CV_RegisterVar(&cv_downloadspeed);
|
||||||
|
#ifndef NONET
|
||||||
|
CV_RegisterVar(&cv_allownewplayer);
|
||||||
|
#ifdef VANILLAJOINNEXTROUND
|
||||||
|
CV_RegisterVar(&cv_joinnextround);
|
||||||
|
#endif
|
||||||
|
CV_RegisterVar(&cv_showjoinaddress);
|
||||||
|
CV_RegisterVar(&cv_blamecfail);
|
||||||
|
#endif
|
||||||
|
|
||||||
COM_AddCommand("ping", Command_Ping_f);
|
COM_AddCommand("ping", Command_Ping_f);
|
||||||
CV_RegisterVar(&cv_nettimeout);
|
CV_RegisterVar(&cv_nettimeout);
|
||||||
|
@ -685,11 +691,9 @@ void D_RegisterServerCommands(void)
|
||||||
|
|
||||||
CV_RegisterVar(&cv_skipmapcheck);
|
CV_RegisterVar(&cv_skipmapcheck);
|
||||||
CV_RegisterVar(&cv_sleep);
|
CV_RegisterVar(&cv_sleep);
|
||||||
#ifdef NEWPING
|
|
||||||
CV_RegisterVar(&cv_maxping);
|
CV_RegisterVar(&cv_maxping);
|
||||||
CV_RegisterVar(&cv_pingtimeout);
|
CV_RegisterVar(&cv_pingtimeout);
|
||||||
CV_RegisterVar(&cv_showping);
|
CV_RegisterVar(&cv_showping);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
CV_RegisterVar(&cv_allowseenames);
|
CV_RegisterVar(&cv_allowseenames);
|
||||||
|
@ -2215,12 +2219,14 @@ static void Command_Map_f(void)
|
||||||
const char *mapname;
|
const char *mapname;
|
||||||
size_t i;
|
size_t i;
|
||||||
INT32 j, newmapnum;
|
INT32 j, newmapnum;
|
||||||
boolean newresetplayers;
|
boolean newresetplayers, newencoremode;
|
||||||
INT32 newgametype = gametype;
|
INT32 newgametype = gametype;
|
||||||
|
|
||||||
// max length of command: map map03 -gametype coop -noresetplayers -force
|
// max length of command: map map03 -gametype race -noresetplayers -force -encore
|
||||||
// 1 2 3 4 5 6
|
// 1 2 3 4 5 6 7
|
||||||
// = 8 arg max
|
// = 8 arg max
|
||||||
|
// i don't know whether this is intrinsic to the system or just someone being weird but
|
||||||
|
// "noresetplayers" is pretty useless for kart if it turns out this is too close to the limit
|
||||||
if (COM_Argc() < 2 || COM_Argc() > 8)
|
if (COM_Argc() < 2 || COM_Argc() > 8)
|
||||||
{
|
{
|
||||||
CONS_Printf(M_GetText("map <mapname> [-gametype <type> [-force]: warp to map\n"));
|
CONS_Printf(M_GetText("map <mapname> [-gametype <type> [-force]: warp to map\n"));
|
||||||
|
@ -2303,6 +2309,21 @@ static void Command_Map_f(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// new encoremode value
|
||||||
|
// use cvar by default
|
||||||
|
|
||||||
|
newencoremode = (boolean)cv_kartencore.value;
|
||||||
|
|
||||||
|
if (COM_CheckParm("-encore"))
|
||||||
|
{
|
||||||
|
if (!M_SecretUnlocked(SECRET_ENCORE) && !newencoremode)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("You haven't unlocked Encore Mode yet!\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newencoremode = !newencoremode;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(i = COM_CheckParm("-force")) && newgametype == gametype) // SRB2Kart
|
if (!(i = COM_CheckParm("-force")) && newgametype == gametype) // SRB2Kart
|
||||||
newresetplayers = false; // if not forcing and gametypes is the same
|
newresetplayers = false; // if not forcing and gametypes is the same
|
||||||
|
|
||||||
|
@ -2333,7 +2354,7 @@ static void Command_Map_f(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
fromlevelselect = false;
|
fromlevelselect = false;
|
||||||
D_MapChange(newmapnum, newgametype, (boolean)cv_kartencore.value, newresetplayers, 0, false, false);
|
D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Receives a map command and changes the map.
|
/** Receives a map command and changes the map.
|
||||||
|
|
|
@ -143,11 +143,9 @@ extern consvar_t cv_ringslinger, cv_soundtest;
|
||||||
|
|
||||||
extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionboxes;
|
extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionboxes;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
extern consvar_t cv_maxping;
|
extern consvar_t cv_maxping;
|
||||||
extern consvar_t cv_pingtimeout;
|
extern consvar_t cv_pingtimeout;
|
||||||
extern consvar_t cv_showping;
|
extern consvar_t cv_showping;
|
||||||
#endif
|
|
||||||
|
|
||||||
extern consvar_t cv_skipmapcheck;
|
extern consvar_t cv_skipmapcheck;
|
||||||
|
|
||||||
|
|
|
@ -601,9 +601,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||||
/// Polyobject fake flat code
|
/// Polyobject fake flat code
|
||||||
#define POLYOBJECTS_PLANES
|
#define POLYOBJECTS_PLANES
|
||||||
|
|
||||||
/// Improved way of dealing with ping values and a ping limit.
|
|
||||||
#define NEWPING
|
|
||||||
|
|
||||||
/// See name of player in your crosshair
|
/// See name of player in your crosshair
|
||||||
#define SEENAMES
|
#define SEENAMES
|
||||||
|
|
||||||
|
|
|
@ -543,9 +543,7 @@ extern consvar_t cv_forceskin; // force clients to use the server's skin
|
||||||
extern consvar_t cv_downloading; // allow clients to downloading WADs.
|
extern consvar_t cv_downloading; // allow clients to downloading WADs.
|
||||||
extern consvar_t cv_nettimeout; // SRB2Kart: Advanced server options menu
|
extern consvar_t cv_nettimeout; // SRB2Kart: Advanced server options menu
|
||||||
extern consvar_t cv_jointimeout;
|
extern consvar_t cv_jointimeout;
|
||||||
#ifdef NEWPING
|
|
||||||
extern consvar_t cv_maxping;
|
extern consvar_t cv_maxping;
|
||||||
#endif
|
|
||||||
extern ticcmd_t netcmds[BACKUPTICS][MAXPLAYERS];
|
extern ticcmd_t netcmds[BACKUPTICS][MAXPLAYERS];
|
||||||
extern INT32 serverplayer;
|
extern INT32 serverplayer;
|
||||||
extern INT32 adminplayers[MAXPLAYERS];
|
extern INT32 adminplayers[MAXPLAYERS];
|
||||||
|
|
|
@ -2331,10 +2331,8 @@ static void M_ChangeCvar(INT32 choice)
|
||||||
choice *= (TICRATE/7);
|
choice *= (TICRATE/7);
|
||||||
else if (cv == &cv_maxsend)
|
else if (cv == &cv_maxsend)
|
||||||
choice *= 512;
|
choice *= 512;
|
||||||
#ifdef NEWPING
|
|
||||||
else if (cv == &cv_maxping)
|
else if (cv == &cv_maxping)
|
||||||
choice *= 50;
|
choice *= 50;
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
CV_AddValue(cv,choice);
|
CV_AddValue(cv,choice);
|
||||||
}
|
}
|
||||||
|
|
50
src/mserv.c
50
src/mserv.c
|
@ -661,11 +661,19 @@ FUNCMATH static const char *int2str(INT32 n)
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
static INT32 ConnectionFailed(void)
|
static INT32 ConnectionFailed(void)
|
||||||
{
|
{
|
||||||
|
time(&MSLastPing);
|
||||||
con_state = MSCS_FAILED;
|
con_state = MSCS_FAILED;
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Connection to Master Server failed\n"));
|
CONS_Alert(CONS_ERROR, M_GetText("Connection to Master Server failed\n"));
|
||||||
CloseConnection();
|
CloseConnection();
|
||||||
return MS_CONNECT_ERROR;
|
return MS_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INT32 ConnectionFailedwerrno(int no)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error: %s\n"),
|
||||||
|
strerror(no));
|
||||||
|
return ConnectionFailed();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Tries to register the local game server on the master server.
|
/** Tries to register the local game server on the master server.
|
||||||
|
@ -682,44 +690,43 @@ static INT32 AddToMasterServer(boolean firstadd)
|
||||||
msg_server_t *info = (msg_server_t *)msg.buffer;
|
msg_server_t *info = (msg_server_t *)msg.buffer;
|
||||||
INT32 room = -1;
|
INT32 room = -1;
|
||||||
fd_set tset;
|
fd_set tset;
|
||||||
time_t timestamp = time(NULL);
|
|
||||||
UINT32 signature, tmp;
|
UINT32 signature, tmp;
|
||||||
const char *insname;
|
const char *insname;
|
||||||
|
|
||||||
|
if (socket_fd == (SOCKET_TYPE)ERRSOCKET)/* Woah, our socket was closed! */
|
||||||
|
{
|
||||||
|
if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0))
|
||||||
|
return ConnectionFailedwerrno(errno);
|
||||||
|
}
|
||||||
|
|
||||||
M_Memcpy(&tset, &wset, sizeof (tset));
|
M_Memcpy(&tset, &wset, sizeof (tset));
|
||||||
res = select(255, NULL, &tset, NULL, &select_timeout);
|
res = select(255, NULL, &tset, NULL, &select_timeout);
|
||||||
if (res != ERRSOCKET && !res)
|
if (res == ERRSOCKET)
|
||||||
|
return ConnectionFailedwerrno(errno);
|
||||||
|
if (res == 0)/* nothing selected */
|
||||||
{
|
{
|
||||||
if (retry++ > 30) // an about 30 second timeout
|
/*
|
||||||
|
Timeout next call because SendPingToMasterServer
|
||||||
|
(our calling function) already calls this once
|
||||||
|
every two minutes.
|
||||||
|
*/
|
||||||
|
if (retry++ == 1)
|
||||||
{
|
{
|
||||||
retry = 0;
|
retry = 0;
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Master Server timed out\n"));
|
CONS_Alert(CONS_ERROR, M_GetText("Master Server timed out\n"));
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
return ConnectionFailed();
|
||||||
}
|
}
|
||||||
return MS_CONNECT_ERROR;
|
return MS_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
retry = 0;
|
retry = 0;
|
||||||
if (res == ERRSOCKET)
|
|
||||||
{
|
|
||||||
if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0))
|
|
||||||
{
|
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error #%u: %s\n"), errno, strerror(errno));
|
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// so, the socket is writable, but what does that mean, that the connection is
|
// so, the socket is writable, but what does that mean, that the connection is
|
||||||
// ok, or bad... let see that!
|
// ok, or bad... let see that!
|
||||||
j = (socklen_t)sizeof (i);
|
j = (socklen_t)sizeof (i);
|
||||||
getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, (char *)&i, &j);
|
if (getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, (char *)&i, &j) == ERRSOCKET)
|
||||||
|
return ConnectionFailedwerrno(errno);
|
||||||
if (i) // it was bad
|
if (i) // it was bad
|
||||||
{
|
return ConnectionFailedwerrno(i);
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error #%u: %s\n"), errno, strerror(errno));
|
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
if (ms_RoomId <= 0)
|
if (ms_RoomId <= 0)
|
||||||
|
@ -752,15 +759,12 @@ static INT32 AddToMasterServer(boolean firstadd)
|
||||||
msg.length = (UINT32)sizeof (msg_server_t);
|
msg.length = (UINT32)sizeof (msg_server_t);
|
||||||
msg.room = 0;
|
msg.room = 0;
|
||||||
if (MS_Write(&msg) < 0)
|
if (MS_Write(&msg) < 0)
|
||||||
{
|
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
return ConnectionFailed();
|
||||||
}
|
|
||||||
|
|
||||||
if(con_state != MSCS_REGISTERED)
|
if(con_state != MSCS_REGISTERED)
|
||||||
CONS_Printf(M_GetText("Master Server update successful.\n"));
|
CONS_Printf(M_GetText("Master Server update successful.\n"));
|
||||||
|
|
||||||
MSLastPing = timestamp;
|
time(&MSLastPing);
|
||||||
con_state = MSCS_REGISTERED;
|
con_state = MSCS_REGISTERED;
|
||||||
CloseConnection();
|
CloseConnection();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -359,6 +359,14 @@ static INT32 Impl_SDL_Scancode_To_Keycode(SDL_Scancode code)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void SDLdoGrabMouse(void)
|
||||||
|
{
|
||||||
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
|
SDL_SetWindowGrab(window, SDL_TRUE);
|
||||||
|
if (SDL_SetRelativeMouseMode(SDL_TRUE) == 0) // already warps mouse if successful
|
||||||
|
wrapmouseok = SDL_TRUE; // TODO: is wrapmouseok or HalfWarpMouse needed anymore?
|
||||||
|
}
|
||||||
|
|
||||||
static void SDLdoUngrabMouse(void)
|
static void SDLdoUngrabMouse(void)
|
||||||
{
|
{
|
||||||
SDL_ShowCursor(SDL_ENABLE);
|
SDL_ShowCursor(SDL_ENABLE);
|
||||||
|
@ -629,6 +637,9 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
||||||
//else firsttimeonmouse = SDL_FALSE;
|
//else firsttimeonmouse = SDL_FALSE;
|
||||||
|
|
||||||
capslock = !!( SDL_GetModState() & KMOD_CAPS );// in case CL changes
|
capslock = !!( SDL_GetModState() & KMOD_CAPS );// in case CL changes
|
||||||
|
|
||||||
|
if (USE_MOUSEINPUT)
|
||||||
|
SDLdoGrabMouse();
|
||||||
}
|
}
|
||||||
else if (!mousefocus && !kbfocus)
|
else if (!mousefocus && !kbfocus)
|
||||||
{
|
{
|
||||||
|
@ -708,9 +719,7 @@ static void Impl_HandleMouseMotionEvent(SDL_MouseMotionEvent evt)
|
||||||
// -- Monster Iestyn
|
// -- Monster Iestyn
|
||||||
if (SDL_GetMouseFocus() == window && SDL_GetKeyboardFocus() == window)
|
if (SDL_GetMouseFocus() == window && SDL_GetKeyboardFocus() == window)
|
||||||
{
|
{
|
||||||
SDL_SetWindowGrab(window, SDL_TRUE);
|
SDLdoGrabMouse();
|
||||||
if (SDL_SetRelativeMouseMode(SDL_TRUE) == 0) // already warps mouse if successful
|
|
||||||
wrapmouseok = SDL_TRUE; // TODO: is wrapmouseok or HalfWarpMouse needed anymore?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1277,7 +1286,7 @@ void I_StartupMouse(void)
|
||||||
else
|
else
|
||||||
firsttimeonmouse = SDL_FALSE;
|
firsttimeonmouse = SDL_FALSE;
|
||||||
if (cv_usemouse.value)
|
if (cv_usemouse.value)
|
||||||
return;
|
SDLdoGrabMouse();
|
||||||
else
|
else
|
||||||
SDLdoUngrabMouse();
|
SDLdoUngrabMouse();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue