Consider new "allow spectators" game flag in server (#215)
This commit is contained in:
@@ -1370,25 +1370,32 @@ ServerLobbyThread::HandleNetPacketJoinGame(boost::shared_ptr<SessionData> sessio
|
||||
if (pos != m_gameMap.end()) {
|
||||
boost::shared_ptr<ServerGame> game = pos->second;
|
||||
const GameData &tmpData = game->GetGameData();
|
||||
// As guest, you are only allowed to join normal games or to join as spectator.
|
||||
if (session->GetPlayerData()->GetRights() == PLAYER_RIGHTS_GUEST
|
||||
&& tmpData.gameType != GAME_TYPE_NORMAL && !joinGame.spectateonly()) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_GUEST_FORBIDDEN);
|
||||
} else if (tmpData.gameType == GAME_TYPE_INVITE_ONLY
|
||||
&& !game->IsPlayerInvited(session->GetPlayerData()->GetUniqueId())
|
||||
&& !joinGame.spectateonly()) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_NOT_INVITED);
|
||||
} else if (!game->CheckPassword(password)) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_INVALID_PASSWORD);
|
||||
} else if (tmpData.gameType == GAME_TYPE_RANKING
|
||||
&& !joinGame.spectateonly()
|
||||
&& session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR
|
||||
&& session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4V6
|
||||
&& session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4
|
||||
&& game->IsClientAddressConnected(session->GetClientAddr())) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_IP_BLOCKED);
|
||||
if (joinGame.spectateonly()) {
|
||||
if (!tmpData.allowSpectators) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_NO_SPECTATORS);
|
||||
} else {
|
||||
MoveSessionToGame(game, session, joinGame.autoleave(), true);
|
||||
}
|
||||
} else {
|
||||
MoveSessionToGame(game, session, joinGame.autoleave(), joinGame.spectateonly());
|
||||
// As guest, you are only allowed to join normal games.
|
||||
if (session->GetPlayerData()->GetRights() == PLAYER_RIGHTS_GUEST
|
||||
&& tmpData.gameType != GAME_TYPE_NORMAL) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_GUEST_FORBIDDEN);
|
||||
} else if (tmpData.gameType == GAME_TYPE_INVITE_ONLY
|
||||
&& !game->IsPlayerInvited(session->GetPlayerData()->GetUniqueId())) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_NOT_INVITED);
|
||||
} else if (!game->CheckPassword(password)) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_INVALID_PASSWORD);
|
||||
} else if (tmpData.gameType == GAME_TYPE_RANKING
|
||||
&& !joinGame.spectateonly()
|
||||
&& session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR
|
||||
&& session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4V6
|
||||
&& session->GetClientAddr() != SERVER_ADDRESS_LOCALHOST_STR_V4
|
||||
&& game->IsClientAddressConnected(session->GetClientAddr())) {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_IP_BLOCKED);
|
||||
} else {
|
||||
MoveSessionToGame(game, session, joinGame.autoleave(), false);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SendJoinGameFailed(session, joinGame.gameid(), NTF_NET_JOIN_GAME_INVALID);
|
||||
@@ -2099,6 +2106,9 @@ ServerLobbyThread::SendJoinGameFailed(boost::shared_ptr<SessionData> s, unsigned
|
||||
case NTF_NET_JOIN_REJOIN_FAILED :
|
||||
netJoinFailed->set_joingamefailurereason(JoinGameFailedMessage::rejoinFailed);
|
||||
break;
|
||||
case NTF_NET_JOIN_NO_SPECTATORS :
|
||||
netJoinFailed->set_joingamefailurereason(JoinGameFailedMessage::noSpectatorsAllowed);
|
||||
break;
|
||||
default :
|
||||
netJoinFailed->set_joingamefailurereason(JoinGameFailedMessage::invalidGame);
|
||||
break;
|
||||
|
||||
@@ -130,10 +130,11 @@
|
||||
#define NTF_NET_JOIN_INVALID_SETTINGS 218
|
||||
#define NTF_NET_JOIN_IP_BLOCKED 219
|
||||
#define NTF_NET_JOIN_REJOIN_FAILED 220
|
||||
#define NTF_NET_JOIN_NO_SPECTATORS 221
|
||||
|
||||
// Notifications - version
|
||||
#define NTF_NET_NEW_RELEASE_AVAILABLE 221
|
||||
#define NTF_NET_OUTDATED_BETA 222
|
||||
#define NTF_NET_NEW_RELEASE_AVAILABLE 231
|
||||
#define NTF_NET_OUTDATED_BETA 232
|
||||
|
||||
// This is an internal message which is not reported.
|
||||
#define MSG_SOCK_INTERNAL_PENDING 0
|
||||
|
||||
+2
@@ -8386,6 +8386,7 @@ bool JoinGameFailedMessage_JoinGameFailureReason_IsValid(int value) {
|
||||
case 9:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@@ -8404,6 +8405,7 @@ const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage::badGame
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage::invalidSettings;
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage::ipAddressBlocked;
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage::rejoinFailed;
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage::noSpectatorsAllowed;
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage::JoinGameFailureReason_MIN;
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage::JoinGameFailureReason_MAX;
|
||||
const int JoinGameFailedMessage::JoinGameFailureReason_ARRAYSIZE;
|
||||
|
||||
+4
-2
@@ -201,11 +201,12 @@ enum JoinGameFailedMessage_JoinGameFailureReason {
|
||||
JoinGameFailedMessage_JoinGameFailureReason_badGameName = 8,
|
||||
JoinGameFailedMessage_JoinGameFailureReason_invalidSettings = 9,
|
||||
JoinGameFailedMessage_JoinGameFailureReason_ipAddressBlocked = 10,
|
||||
JoinGameFailedMessage_JoinGameFailureReason_rejoinFailed = 11
|
||||
JoinGameFailedMessage_JoinGameFailureReason_rejoinFailed = 11,
|
||||
JoinGameFailedMessage_JoinGameFailureReason_noSpectatorsAllowed = 12
|
||||
};
|
||||
bool JoinGameFailedMessage_JoinGameFailureReason_IsValid(int value);
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage_JoinGameFailureReason_JoinGameFailureReason_MIN = JoinGameFailedMessage_JoinGameFailureReason_invalidGame;
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage_JoinGameFailureReason_JoinGameFailureReason_MAX = JoinGameFailedMessage_JoinGameFailureReason_rejoinFailed;
|
||||
const JoinGameFailedMessage_JoinGameFailureReason JoinGameFailedMessage_JoinGameFailureReason_JoinGameFailureReason_MAX = JoinGameFailedMessage_JoinGameFailureReason_noSpectatorsAllowed;
|
||||
const int JoinGameFailedMessage_JoinGameFailureReason_JoinGameFailureReason_ARRAYSIZE = JoinGameFailedMessage_JoinGameFailureReason_JoinGameFailureReason_MAX + 1;
|
||||
|
||||
enum GamePlayerLeftMessage_GamePlayerLeftReason {
|
||||
@@ -4077,6 +4078,7 @@ class JoinGameFailedMessage : public ::google::protobuf::MessageLite {
|
||||
static const JoinGameFailureReason invalidSettings = JoinGameFailedMessage_JoinGameFailureReason_invalidSettings;
|
||||
static const JoinGameFailureReason ipAddressBlocked = JoinGameFailedMessage_JoinGameFailureReason_ipAddressBlocked;
|
||||
static const JoinGameFailureReason rejoinFailed = JoinGameFailedMessage_JoinGameFailureReason_rejoinFailed;
|
||||
static const JoinGameFailureReason noSpectatorsAllowed = JoinGameFailedMessage_JoinGameFailureReason_noSpectatorsAllowed;
|
||||
static inline bool JoinGameFailureReason_IsValid(int value) {
|
||||
return JoinGameFailedMessage_JoinGameFailureReason_IsValid(value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user