BOOL SFLogicEntry::OnDisconnectPlayer(int serial) { PlayerMap::iterator iter = m_PlayerMap.find(serial); if(iter == m_PlayerMap.end()) { SFASSERT(0); return FALSE; } SFPlayer* pPlayer = iter->second; m_pPlayerManager->DelPlayer(pPlayer); /////////////////////////////////////////////////////////// //20120619 이런식으로 짜면 실수할 여지가 크다.... 나중에 수정할 수 있도록 한다. /////////////////////////////////////////////////////////// if (pPlayer->GetPlayerState() == PLAYER_STATE_LOADING || pPlayer->GetPlayerState() == PLAYER_STATE_ROOM || pPlayer->GetPlayerState() == PLAYER_STATE_PLAY || pPlayer->GetPlayerState() == PLAYER_STATE_PLAYEND || pPlayer->GetPlayerState() == PLAYER_STATE_PLAYREADY) { SFRoomManager* pManager = GetRoomManager(); SFRoom* pRoom = pManager->GetRoom(pPlayer->GetRoomIndex()); pRoom->GetRoomFSM()->OnLeaveRoom(pPlayer); } pPlayer->ChangeState(PLAYER_STATE_NONE); m_pPlayerPool->Release(pPlayer); m_PlayerMap.erase(iter); return TRUE; }
BOOL SFPlayer::OnMessage( SFObject* pSender, SFMessage* pMessage ) { switch(pMessage->GetCommand()) { case CGSF::EnterTeamMember: { int PlayerIndex = -1; pMessage->ReadStart(); *pMessage >> PlayerIndex; pMessage->ReadEnd(); SendEnterTeamMember(this, PlayerIndex); } break; case CGSF::LeaveTeamMember: { int PlayerIndex = -1; pMessage->ReadStart(); *pMessage >> PlayerIndex; pMessage->ReadEnd(); SendLeaveTeamMember(this, PlayerIndex); } break; case CGSF::MSG_DESTROY_PLAYER: { int PlayerIndex = -1; pMessage->ReadStart(); *pMessage >> PlayerIndex; pMessage->ReadEnd(); SendDestroyPlayer(this, PlayerIndex); } break; case CGSF::PeerList: { SFRoomManager* pManager = SFLogicEntry::GetLogicEntry()->GetRoomManager(); SFRoom* pRoom = pManager->GetRoom(GetRoomIndex()); SendPeerInfo(this, pRoom); } break; case CGSF::DeletePeer: { int PlayerIndex = -1; pMessage->ReadStart(); *pMessage >> PlayerIndex; pMessage->ReadEnd(); SendDeletePeer(this, PlayerIndex); } break; } return TRUE; }
BOOL SFLogicEntry::OnTimer(BasePacket* pPacket) { SFRoomManager* pManager = GetRoomManager(); return pManager->Update(); }