📄 d_clisrv.c
字号:
if(server) { numnodes=0; for(i=0;i<MAXNETNODES;i++) if(nodeingame[i]) numnodes++; } } while (!( (cl_mode == cl_connected) && ( (!server) || (server && (nodewaited<=numnodes)) ))); DEBFILE(va("Synchronisation Finished\n")); consoleplayer&= ~DRONE; displayplayer = consoleplayer;}void Command_connect(void){ if( COM_Argc()<2 ) { CONS_Printf ("connect <serveraddress> : connect to a server\n" "connect ANY : connect to the first lan server found\n" "connect SELF: connect to self server\n"); return; } server = false; if( stricmp(COM_Argv(1),"self")==0 ) { servernode = 0; server = true; // should be but... //SV_SpawnServer(); } else { // used in menu to connect to a server in the list if( netgame && stricmp(COM_Argv(1),"node")==0 ) servernode = atoi(COM_Argv(2)); else if( netgame ) { CONS_Printf("You cannot connect while in netgame\n" "Leave this game first\n"); return; } else { I_NetOpenSocket(); netgame = true; multiplayer = true; if( stricmp(COM_Argv(1),"any")==0 ) servernode = BROADCASTADDR; else if( I_NetMakeNode ) servernode = I_NetMakeNode(COM_Argv(1)); else { CONS_Printf("There is no server identification with this network driver\n"); D_CloseConnection(); return; } } } CL_ConnectToServer();}static void ResetNode(int node);static void CL_RemovePlayer(int playernum){ int i; if( server && !demoplayback ) { int node = playernode[playernum]; playerpernode[node]--; if( playerpernode[node]<=0 ) { nodeingame[playernode[playernum]] = false; Net_CloseConnection(playernode[playernum]); ResetNode(node); } } // we should use a reset player but there is not such function for(i=0;i<MAXPLAYERS;i++) { players[i].addfrags += players[i].frags[playernum]; players[i].frags[playernum] = 0; players[playernum].frags[i] = 0; } players[playernum].addfrags = 0; // remove avatar of player if( players[playernum].mo ) { players[playernum].mo->player = NULL; P_RemoveMobj (players[playernum].mo); } players[playernum].mo = NULL; playeringame[playernum] = false; playernode[playernum] = -1; while(playeringame[doomcom->numplayers-1]==0 && doomcom->numplayers>1) doomcom->numplayers--;}void CL_Reset (void){ if (demorecording) G_CheckDemoStatus (); // reset client/server code DEBFILE(va("\n-=-=-=-=-=-=-= Client reset =-=-=-=-=-=-=-\n\n")); if( servernode>0 && servernode<MAXNETNODES) { nodeingame[(byte)servernode]=false; Net_CloseConnection(servernode); } D_CloseConnection(); // netgame=false multiplayer = false; servernode=0; server=true; doomcom->numnodes=1; doomcom->numplayers=1; SV_StopServer(); SV_ResetServer(); // reset game engine //D_StartTitle ();}void Command_GetPlayerNum(void){ int i; for(i=0;i<MAXPLAYERS;i++) if(playeringame[i]) { if(serverplayer==i) CONS_Printf("\2num:%2d node:%2d %s\n",i,playernode[i],player_names[i]); else CONS_Printf("num:%2d node:%2d %s\n",i,playernode[i],player_names[i]); }}int nametonum(char *name){ int playernum,i; if( strcmp(name,"0")==0 ) return 0; playernum=atoi(name); if(playernum) { if(playeringame[playernum]) return playernum; else return -1; } for(i=0;i<MAXPLAYERS;i++) if(playeringame[i] && stricmp(player_names[i],name)==0) return i; CONS_Printf("there is no player named\"%s\"\n",name); return -1;}#define KICK_MSG_GO_AWAY 1#define KICK_MSG_CON_FAIL 2#define KICK_MSG_PLAYER_QUIT 3#define KICK_MSG_TIMEOUT 4void Command_Kick(void){ char buf[3]; if (COM_Argc() != 2) { CONS_Printf ("kick <playername> or <playernum> : kick a player\n"); return; } if(server) { buf[0]=nametonum(COM_Argv(1)); if(buf[0]==-1) return; buf[1]=KICK_MSG_GO_AWAY; SendNetXCmd(XD_KICK,&buf,2); } else CONS_Printf("You are not the server\n");}void Got_KickCmd(char **p,int playernum){ int pnum=READBYTE(*p); int msg =READBYTE(*p); CONS_Printf("\2%s ",player_names[pnum]); switch(msg) { case KICK_MSG_GO_AWAY: CONS_Printf("have been kicked (Go away)\n"); break; case KICK_MSG_CON_FAIL: CONS_Printf("have been kicked (Consistancy failure)\n"); break; case KICK_MSG_TIMEOUT: CONS_Printf("left the game (Connection timeout)\n"); break; case KICK_MSG_PLAYER_QUIT: CONS_Printf("left the game\n"); break; } if( pnum==consoleplayer ) { CL_Reset(); D_StartTitle(); M_StartMessage("You have been kicked by the server\n\nPress ESC\n",NULL,MM_NOTHING); } else CL_RemovePlayer(pnum);}CV_PossibleValue_t maxplayers_cons_t[]={{1,"MIN"},{32,"MAX"},{0,NULL}};consvar_t cv_allownewplayer = {"sv_allownewplayers","1",0,CV_OnOff};consvar_t cv_maxplayers = {"sv_maxplayers","32",CV_NETVAR,maxplayers_cons_t,NULL,32};void Got_AddPlayer(char **p,int playernum);// called one time at initvoid D_ClientServerInit (void){ DEBFILE(va("- - -== Doom LEGACY v%i.%i.%i"VERSIONSTRING" debugfile ==- - -\n",VERSION/100,VERSION%100,SUBVERSION)); notimecheck = M_CheckParm("-notime"); drone = false; if(M_CheckParm("-left")) { drone = true; viewangleoffset = ANG90; } if(M_CheckParm("-right")) { drone = true; viewangleoffset = -ANG90; } dedicated=M_CheckParm("-dedicated")!=0; COM_AddCommand("getplayernum",Command_GetPlayerNum); COM_AddCommand("kick",Command_Kick); COM_AddCommand("connect",Command_connect); RegisterNetXCmd(XD_KICK,Got_KickCmd); RegisterNetXCmd(XD_ADDPLAYER,Got_AddPlayer); CV_RegisterVar (&cv_allownewplayer); CV_RegisterVar (&cv_maxplayers); gametic = 0; localgametic = 0; // do not send anything before the real begin SV_StopServer(); SV_ResetServer();}static void ResetNode(int node){ nodeingame[node] = false; nodetoplayer[node]=-1; nodetoplayer2[node]=-1; nettics[node]=gametic; supposedtics[node]=gametic; cl_maketic[node]=maketic; nodewaiting[node]=0; playerpernode[node]=0;}void SV_ResetServer( void ){ int i; // +1 because this command will be executed in com_executebuffer in // tryruntic so gametic will be incremented, anyway maketic > gametic // is not a issue maketic=gametic+1; neededtic=maketic;#ifdef CLIENTPREDICTION2 localgametic = gametic;#endif tictoclear=maketic; for (i=0 ; i<MAXNETNODES ; i++) ResetNode(i); for (i=0 ; i<MAXPLAYERS ; i++) { playeringame[i]=false; playernode[i]=-1; } mynode=0; cl_packetmissed=false; viewangleoffset=0; if( dedicated ) { nodeingame[0]=true; serverplayer=-1; } else serverplayer=consoleplayer; if(server) servernode=0; doomcom->numplayers=0; DEBFILE(va("\n-=-=-=-=-=-=-= Server Reset =-=-=-=-=-=-=-\n\n"));}//// D_QuitNetGame// Called before quitting to leave a net game// without hanging the other players//void D_QuitNetGame (void){ if (!netgame) return; DEBFILE("===========================================================================\n" " Quiting Game, closing connection\n" "===========================================================================\n"); // abort send/receive of files CloseNetFile(); if( server ) { int i; netbuffer->packettype=PT_SERVERSHUTDOWN; for(i=0;i<MAXNETNODES;i++) if( nodeingame[i] ) HSendPacket(i,true,0,0); if ( serverrunning && cv_internetserver.value ) UnregisterServer(); } else if(servernode>0 && servernode<MAXNETNODES && nodeingame[(byte)servernode]!=0) { netbuffer->packettype=PT_CLIENTQUIT; HSendPacket(servernode,true,0,0); } D_CloseConnection(); DEBFILE("===========================================================================\n" " Log finish\n" "===========================================================================\n");#ifdef DEBUGFILE if (debugfile) { fclose (debugfile); debugfile = NULL; }#endif}// add a node to the game (player will follow at map change or at savegame....)void SV_AddNode(int node){ nettics[node] = gametic; supposedtics[node] = gametic; cl_maketic[node] = maketic; // little hack because the server connect to itself and put // nodeingame when connected not here if(node) nodeingame[node]=true;}// Xcmd XD_ADDPLAYERvoid Got_AddPlayer(char **p,int playernum){ int node=READBYTE(*p); int newplayernum=READBYTE(*p); boolean splitscreenplayer = newplayernum&0x80; static ULONG sendconfigtic=0xffffffff; newplayernum&=~0x80; playeringame[newplayernum]=true; G_AddPlayer(newplayernum); if( newplayernum+1>doomcom->numplayers ) doomcom->numplayers=newplayernum+1; CONS_Printf("Player %d is in the game (node %d)\n",newplayernum,node); // the server is creating my player if(node==mynode) { playernode[newplayernum]=0; // for information only if(!splitscreenplayer) { consoleplayer=newplayernum; displayplayer=newplayernum; secondarydisplayplayer=newplayernum; DEBFILE("spawning my\n"); } else { secondarydisplayplayer=newplayernum; DEBFILE("spawning my brother\n"); } } // the new player send there config // and the old player send there config to the new one // WARNING : this can cause a bottleneck in the txtcmd // this can also produse consistancy failure if packet get lost // because everibody know the actualconfig except the joiner
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -