⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d_clisrv.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -