//用户起来 bool __cdecl CTableFrameSink::OnActionUserStandUp(WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser) { CountDownTime(wChairID , TRUE); /*OnActionUserReady(INVALID_CHAIR , NULL , NULL , INVALID_WORD);*/ //m_oLog.Log("玩家[%s]离开桌子。", pIServerUserItem->GetUserData()->szAccounts); m_pITableFrame->KillGameTimer(IDI_READY_START_GAME); if (CheckStartGame() != INVALID_BYTE) { //m_oLog.Log("游戏能开始"); m_pITableFrameControl->StartGame(); } else { //m_oLog.Log("游戏不能开始"); m_pITableFrame->KillGameTimer(IDI_READY_START_GAME); //m_bStartCountDown = false; m_pITableFrame->SetGameStatus(GS_FREE); CMD_S_GameFree GameFree; ZeroMemory(&GameFree , sizeof(GameFree)); GameFree.cbTimeLeave=-1; for(INT i=0 ; i<GAME_PLAYER ; i++) { if(i!=wChairID &&m_pITableFrame->GetServerUserItem(i) && !m_pITableFrame->GetServerUserItem(i)->IsAndroidUser()) { m_pITableFrame->SendTableData(i, SUB_S_GAME_FREE, &GameFree, sizeof(GameFree)); } } } return true; }
//定时器事件 bool __cdecl CTableFrameSink::OnTimerMessage(WORD wTimerID, WPARAM wBindParam) { switch(wTimerID) { case IDI_CLEAR_BUFFER_STATE: { m_bMeetConditions=false; return true; } case IDI_TIME_READCFG: { ReadIniCfg(); return true; } case IDI_READY_START_GAME: { BYTE cbTime = CheckStartGame(); if(cbTime != INVALID_BYTE) { m_pITableFrameControl->StartGame(); } return true; } case IDI_WRITESCORE: { if (m_pITableFrame->GetGameStatus() != GS_OX_ACCOUNTS) return true; WriteScore(); m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_GAME_FINISH,NULL, 0); return true; } case IDI_CONCLUDEGAME: { ConcludeGame(); return true; } } if(wTimerID>=IDI_COUNTDOWN && (wTimerID<(IDI_COUNTDOWN+GAME_PLAYER))) { WORD wChairID = wTimerID-IDI_COUNTDOWN; IServerUserItem *pServerUserItem = m_pITableFrame->GetServerUserItem(wChairID); if(pServerUserItem == NULL) return true; switch(m_pITableFrame->GetGameStatus()) { case GS_FREE: { m_pITableFrameManager->PerformStandUpAction(pServerUserItem); break; } case GS_OX_PLAY: { OnUserOpenCard(wChairID , 0); break; } } return true; } return false; }
void NET_SV_Run(void) { net_addr_t *addr; net_packet_t *packet; int i; if (!server_initialized) { return; } while (NET_RecvPacket(server_context, &addr, &packet)) { NET_SV_Packet(packet, addr); NET_FreePacket(packet); NET_ReleaseAddress(addr); } if (master_server != NULL) { UpdateMasterServer(); } // "Run" any clients that may have things to do, independent of responses // to received packets for (i=0; i<MAXNETNODES; ++i) { if (clients[i].active) { NET_SV_RunClient(&clients[i]); } } switch (server_state) { case SERVER_WAITING_LAUNCH: break; case SERVER_WAITING_START: CheckStartGame(); break; case SERVER_IN_GAME: NET_SV_AdvanceWindow(); for (i = 0; i < NET_MAXPLAYERS; ++i) { if (sv_players[i] != NULL && ClientConnected(sv_players[i])) { NET_SV_CheckResends(sv_players[i]); } } break; } }
static void NET_SV_ParseGameStart(net_packet_t *packet, net_client_t *client) { net_gamesettings_t settings; NET_Log("server: processing game start packet"); // Can only start a game if we are in the waiting start state. if (server_state != SERVER_WAITING_START) { NET_Log("server: error: not in waiting start state, server_state=%d", server_state); return; } if (client == NET_SV_Controller()) { if (!NET_ReadSettings(packet, &settings)) { // Malformed packet NET_Log("server: error: no settings from controller"); return; } // Check the game settings are valid if (!NET_ValidGameSettings(sv_gamemode, sv_gamemission, &settings)) { NET_Log("server: error: invalid game settings"); return; } sv_settings = settings; } client->ready = true; CheckStartGame(); // Update all ready clients with the current state (number of players // ready, etc.). This is used by games that show startup progress // (eg. Hexen's spinal loading) SendAllWaitingData(); }
//游戏准备开始 void CTableFrameSink::GameReady( WORD wChair ) { m_pITableFrame->KillGameTimer(IDI_READY_START_GAME); BYTE cbLevelTime = CheckStartGame(); if(cbLevelTime != INVALID_BYTE) { if(cbLevelTime == 0) { m_pITableFrameControl->StartGame(); } else { CMD_S_GameReady GameReady; ZeroMemory(&GameReady , sizeof(GameReady)); GameReady.cbTimeLeave=cbLevelTime; for(INT i=0; i<GAME_PLAYER; i++) { IServerUserItem *pIServerUserItem=m_pITableFrame->GetServerUserItem(i); if (pIServerUserItem!=NULL && !pIServerUserItem->IsAndroidUser()) { m_pITableFrame->SendTableData(i, SUB_S_GAME_READY, &GameReady, sizeof(GameReady)); } } m_pITableFrame->SetGameTimer(IDI_READY_START_GAME , cbLevelTime*1000 , 1 , 0); } } else { m_pITableFrame->KillGameTimer(IDI_READY_START_GAME); //m_bStartCountDown = false; m_pITableFrame->SetGameStatus(GS_FREE); CMD_S_GameFree GameFree; ZeroMemory(&GameFree , sizeof(GameFree)); GameFree.cbTimeLeave=-1; for(INT i=0 ; i<GAME_PLAYER ; i++) { if(i!= wChair&&m_pITableFrame->GetServerUserItem(i) && !m_pITableFrame->GetServerUserItem(i)->IsAndroidUser()) { m_pITableFrame->SendTableData(i, SUB_S_GAME_FREE, &GameFree, sizeof(GameFree)); } } } }