IMPLEMENT_RMI(CGameRules, ClEnteredGame) { if(!gEnv->bServer && m_pGameFramework->GetClientActor()) { CActor* pActor = GetActorByChannelId(m_pGameFramework->GetClientActor()->GetChannelId()); if(pActor) { int status[2]; status[0] = GetTeam(pActor->GetEntityId()); status[1] = pActor->GetSpectatorMode(); m_pGameplayRecorder->Event(pActor->GetEntity(), GameplayEvent(eGE_Connected, 0, 0, (void*)status)); NOTIFY_UI_MP( EnteredGame() ); } } return true; }
IMPLEMENT_RMI(CGameRules, ClEnteredGame) { CPlayer *pClientActor = static_cast<CPlayer*>(m_pGameFramework->GetClientActor()); if (pClientActor) { IEntity *pClientEntity = pClientActor->GetEntity(); const EntityId clientEntityId = pClientEntity->GetId(); if(!gEnv->bServer) { int status[2]; status[0] = GetTeam(clientEntityId); status[1] = pClientActor->GetSpectatorMode(); m_pGameplayRecorder->Event(pClientEntity, GameplayEvent(eGE_Connected, 0, 0, (void*)status)); } if (g_pGame->GetHostMigrationState() != CGame::eHMS_NotMigrating) { eHostMigrationState hostMigrationState = g_pGame->GetGameLobby()->GetMatchMakingHostMigrationState(); if (hostMigrationState < eHMS_ReconnectClient) { CryLog("CGameRules::ClEnteredGame() received a left over message from previous server, ignoring it"); return true; } CryLog("CGameRules::ClEnteredGame() We have our client actor ('%s'), send migration params", pClientEntity->GetName()); // Request various bits GetGameObject()->InvokeRMI(SvHostMigrationRequestSetup(), *m_pHostMigrationParams, eRMI_ToServer); SAFE_DELETE(m_pHostMigrationParams); pClientActor->GetEntity()->SetPos(m_pHostMigrationClientParams->m_position); pClientActor->SetViewRotation(m_pHostMigrationClientParams->m_viewQuat); if (m_pHostMigrationClientParams->m_hasValidVelocity) { pe_action_set_velocity actionVel; actionVel.v = m_pHostMigrationClientParams->m_velocity; actionVel.w.zero(); IPhysicalEntity *pPhysicalEntity = pClientEntity->GetPhysics(); if (pPhysicalEntity) { pPhysicalEntity->Action(&actionVel); } } CPlayerMovementController *pPMC = static_cast<CPlayerMovementController *>(pClientActor->GetMovementController()); if (pPMC) { // Force an update through so that the aim direction gets set correctly pPMC->PostUpdate(0.f); } if (m_pHostMigrationClientParams->m_pSelectedItemClass) { CItem *pItem = pClientActor->GetItemByClass(m_pHostMigrationClientParams->m_pSelectedItemClass); if (pItem) { EntityId itemId = pItem->GetEntityId(); if (pClientActor->GetCurrentItemId() != itemId) { pClientActor->SelectItem(itemId, false); } } } m_pHostMigrationClientParams->m_doneEnteredGame = true; if (m_pHostMigrationClientParams->IsDone()) { SAFE_DELETE(m_pHostMigrationClientParams); } if (!gEnv->bServer) { // todo: ui } m_hostMigrationClientHasRejoined = true; } else { NOTIFY_UI_MP( EnteredGame() ); } } return true; }
void HWNewNet::ParseCmd(const QStringList & lst) { qDebug() << "Server: " << lst; if(!lst.size()) { qWarning("Net client: Bad message"); return; } if (lst[0] == "NICK") { mynick = lst[1]; m_playersModel->setNickname(mynick); m_nick_registered = false; return ; } if (lst[0] == "PROTO") return ; if (lst[0] == "ERROR") { if (lst.size() == 2) emit Error(HWApplication::translate("server", lst[1].toAscii().constData())); else emit Error("Unknown error"); return; } if (lst[0] == "WARNING") { if (lst.size() == 2) emit Warning(HWApplication::translate("server", lst[1].toAscii().constData())); else emit Warning("Unknown warning"); return; } if (lst[0] == "CONNECTED") { if(lst.size() < 3 || lst[2].toInt() < cMinServerVersion) { // TODO: Warn user, disconnect qWarning() << "Server too old"; RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("Server too old")); Disconnect(); emit disconnected(tr("The server is too old. Disconnecting now.")); return; } RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick)); RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer)); netClientState = Connected; m_game_connected = true; emit adminAccess(false); return; } if (lst[0] == "SERVER_AUTH") { if(lst.size() < 2) { qWarning("Net: Malformed SERVER_AUTH message"); return; } if(lst[1] != m_serverHash) { Error("Server authentication error"); Disconnect(); } else { // empty m_serverHash variable means no authentication was performed // or server passed authentication m_serverHash.clear(); } return; } if (lst[0] == "PING") { if (lst.size() > 1) RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1])); else RawSendNet(QString("PONG")); return; } if (lst[0] == "ROOMS") { if(lst.size() % 9 != 1) { qWarning("Net: Malformed ROOMS message"); return; } m_roomsListModel->setRoomsList(lst.mid(1)); if (m_private_game == false && m_nick_registered == false) { emit NickNotRegistered(mynick); } return; } if (lst[0] == "SERVER_MESSAGE") { if(lst.size() < 2) { qWarning("Net: Empty SERVERMESSAGE message"); return; } emit serverMessage(lst[1]); return; } if (lst[0] == "CHAT") { if(lst.size() < 3) { qWarning("Net: Empty CHAT message"); return; } QString action = HWProto::chatStringToAction(lst[2]); if (netClientState == InLobby) { if (action != NULL) emit lobbyChatAction(lst[1], action); else emit lobbyChatMessage(lst[1], lst[2]); } else { emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2])); if (action != NULL) emit roomChatAction(lst[1], action); else emit roomChatMessage(lst[1], lst[2]); } return; } if (lst[0] == "INFO") { if(lst.size() < 5) { qWarning("Net: Malformed INFO message"); return; } emit playerInfo(lst[1], lst[2], lst[3], lst[4]); if (netClientState != InLobby) { QStringList tmp = lst; tmp.removeFirst(); emit chatStringFromNet(tmp.join(" ").prepend('\x01')); } return; } if (lst[0] == "SERVER_VARS") { QStringList tmp = lst; tmp.removeFirst(); while (tmp.size() >= 2) { if(tmp[0] == "MOTD_NEW") emit serverMessageNew(tmp[1]); else if(tmp[0] == "MOTD_OLD") emit serverMessageOld(tmp[1]); else if(tmp[0] == "LATEST_PROTO") emit latestProtocolVar(tmp[1].toInt()); tmp.removeFirst(); tmp.removeFirst(); } return; } if (lst[0] == "BANLIST") { QStringList tmp = lst; tmp.removeFirst(); emit bansList(tmp); return; } if (lst[0] == "CLIENT_FLAGS" || lst[0] == "CF") { if(lst.size() < 3 || lst[1].size() < 2) { qWarning("Net: Malformed CLIENT_FLAGS message"); return; } QString flags = lst[1]; bool setFlag = flags[0] == '+'; const QStringList nicks = lst.mid(2); while(flags.size() > 1) { flags.remove(0, 1); char c = flags[0].toAscii(); bool inRoom = (netClientState == InRoom || netClientState == InGame); switch(c) { // flag indicating if a player is ready to start a game case 'r': if(inRoom) foreach (const QString & nick, nicks) { if (nick == mynick) { emit setMyReadyStatus(setFlag); } m_playersModel->setFlag(nick, PlayersListModel::Ready, setFlag); } break; // flag indicating if a player is a registered user case 'u': foreach(const QString & nick, nicks) m_playersModel->setFlag(nick, PlayersListModel::Registered, setFlag); break; // flag indicating if a player is in room case 'i': foreach(const QString & nick, nicks) m_playersModel->setFlag(nick, PlayersListModel::InRoom, setFlag); break; // flag indicating if a player is contributor case 'c': foreach(const QString & nick, nicks) m_playersModel->setFlag(nick, PlayersListModel::Contributor, setFlag); break; // flag indicating if a player has engine running case 'g': if(inRoom) foreach(const QString & nick, nicks) m_playersModel->setFlag(nick, PlayersListModel::InGame, setFlag); break; // flag indicating if a player is the host/master of the room case 'h': if(inRoom) foreach (const QString & nick, nicks) { if (nick == mynick) { isChief = setFlag; emit roomMaster(isChief); } m_playersModel->setFlag(nick, PlayersListModel::RoomAdmin, setFlag); } break; // flag indicating if a player is admin (if so -> worship them!) case 'a': foreach (const QString & nick, nicks) { if (nick == mynick) emit adminAccess(setFlag); m_playersModel->setFlag(nick, PlayersListModel::ServerAdmin, setFlag); } break; default: qWarning() << "Net: Unknown client-flag: " << c; } } return; } if(lst[0] == "KICKED") { netClientState = InLobby; askRoomsList(); emit LeftRoom(tr("You got kicked")); m_playersModel->resetRoomFlags(); return; } if(lst[0] == "LOBBY:JOINED") { if(lst.size() < 2) { qWarning("Net: Bad JOINED message"); return; } for(int i = 1; i < lst.size(); ++i) { if (lst[i] == mynick) { // check if server is authenticated or no authentication was performed at all if(!m_serverHash.isEmpty()) { Error(tr("Server authentication error")); Disconnect(); } netClientState = InLobby; RawSendNet(QString("LIST")); emit connected(); } m_playersModel->addPlayer(lst[i], false); } return; } if(lst[0] == "ROOM" && lst.size() == 11 && lst[1] == "ADD") { QStringList tmp = lst; tmp.removeFirst(); tmp.removeFirst(); m_roomsListModel->addRoom(tmp); return; } if(lst[0] == "ROOM" && lst.size() == 12 && lst[1] == "UPD") { QStringList tmp = lst; tmp.removeFirst(); tmp.removeFirst(); QString roomName = tmp.takeFirst(); m_roomsListModel->updateRoom(roomName, tmp); // keep track of room name so correct name is displayed if(myroom == roomName && myroom != tmp[1]) { myroom = tmp[1]; emit roomNameUpdated(myroom); } return; } if(lst[0] == "ROOM" && lst.size() == 3 && lst[1] == "DEL") { m_roomsListModel->removeRoom(lst[2]); return; } if(lst[0] == "LOBBY:LEFT") { if(lst.size() < 2) { qWarning("Net: Bad LOBBY:LEFT message"); return; } if (lst.size() < 3) m_playersModel->removePlayer(lst[1]); else m_playersModel->removePlayer(lst[1], lst[2]); return; } if (lst[0] == "ASKPASSWORD") { // server should send us salt of at least 16 characters if(lst.size() < 2 || lst[1].size() < 16) { qWarning("Net: Bad ASKPASSWORD message"); return; } emit NickRegistered(mynick); m_nick_registered = true; // store server salt // when this variable is set, it is assumed that server asked us for a password m_serverSalt = lst[1]; m_clientSalt = QUuid::createUuid().toString(); maybeSendPassword(); return; } if (lst[0] == "NOTICE") { if(lst.size() < 2) { qWarning("Net: Bad NOTICE message"); return; } bool ok; int n = lst[1].toInt(&ok); if(!ok) { qWarning("Net: Bad NOTICE message"); return; } handleNotice(n); return; } if (lst[0] == "BYE") { if (lst.size() < 2) { qWarning("Net: Bad BYE message"); return; } if (lst[1] == "Authentication failed") { emit AuthFailed(); m_game_connected = false; Disconnect(); //omitted 'emit disconnected()', we don't want the error message return; } m_game_connected = false; Disconnect(); emit disconnected(HWApplication::translate("server", lst[1].toAscii().constData())); return; } if(lst[0] == "JOINING") { if(lst.size() != 2) { qWarning("Net: Bad JOINING message"); return; } myroom = lst[1]; emit roomNameUpdated(myroom); return; } if(netClientState == InLobby && lst[0] == "JOINED") { if(lst.size() < 2 || lst[1] != mynick) { qWarning("Net: Bad JOINED message"); return; } for(int i = 1; i < lst.size(); ++i) { if (lst[i] == mynick) { netClientState = InRoom; emit EnteredGame(); emit roomMaster(isChief); if (isChief) emit configAsked(); } m_playersModel->playerJoinedRoom(lst[i], isChief && (lst[i] != mynick)); emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i])); } return; } if(netClientState == InRoom || netClientState == InGame) { if (lst[0] == "EM") { if(lst.size() < 2) { qWarning("Net: Bad EM message"); return; } for(int i = 1; i < lst.size(); ++i) { QByteArray em = QByteArray::fromBase64(lst[i].toAscii()); emit FromNet(em); } return; } if (lst[0] == "ROUND_FINISHED") { emit FromNet(QByteArray("\x01o")); return; } if (lst[0] == "ADD_TEAM") { if(lst.size() != 24) { qWarning("Net: Bad ADDTEAM message"); return; } QStringList tmp = lst; tmp.removeFirst(); emit AddNetTeam(tmp); return; } if (lst[0] == "REMOVE_TEAM") { if(lst.size() != 2) { qWarning("Net: Bad REMOVETEAM message"); return; } emit RemoveNetTeam(HWTeam(lst[1])); return; } if(lst[0] == "ROOMABANDONED") { netClientState = InLobby; m_playersModel->resetRoomFlags(); emit LeftRoom(tr("Room destroyed")); return; } if (lst[0] == "RUN_GAME") { netClientState = InGame; emit AskForRunGame(); return; } if (lst[0] == "TEAM_ACCEPTED") { if (lst.size() != 2) { qWarning("Net: Bad TEAM_ACCEPTED message"); return; } emit TeamAccepted(lst[1]); return; } if (lst[0] == "CFG") { if(lst.size() < 3) { qWarning("Net: Bad CFG message"); return; } QStringList tmp = lst; tmp.removeFirst(); tmp.removeFirst(); if (lst[1] == "SCHEME") emit netSchemeConfig(tmp); else emit paramChanged(lst[1], tmp); return; } if (lst[0] == "HH_NUM") { if (lst.size() != 3) { qWarning("Net: Bad TEAM_ACCEPTED message"); return; } HWTeam tmptm(lst[1]); tmptm.setNumHedgehogs(lst[2].toUInt()); emit hhnumChanged(tmptm); return; } if (lst[0] == "TEAM_COLOR") { if (lst.size() != 3) { qWarning("Net: Bad TEAM_COLOR message"); return; } HWTeam tmptm(lst[1]); tmptm.setColor(lst[2].toInt()); emit teamColorChanged(tmptm); return; } if(lst[0] == "JOINED") { if(lst.size() < 2) { qWarning("Net: Bad JOINED message"); return; } for(int i = 1; i < lst.size(); ++i) { emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i])); m_playersModel->playerJoinedRoom(lst[i], isChief && (lst[i] != mynick)); } return; } if(lst[0] == "LEFT") { if(lst.size() < 2) { qWarning("Net: Bad LEFT message"); return; } if (lst.size() < 3) emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); else emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); m_playersModel->playerLeftRoom(lst[1]); return; } } qWarning() << "Net: Unknown message or wrong state:" << lst; }