diff --git a/pokerth.proto b/pokerth.proto index 04e4f2a1..bc880873 100644 --- a/pokerth.proto +++ b/pokerth.proto @@ -326,6 +326,7 @@ message JoinGameFailedMessage { invalidSettings = 9; ipAddressBlocked = 10; rejoinFailed = 11; + noSpectatorsAllowed = 12; } required JoinGameFailureReason joinGameFailureReason = 2; } diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 5a88f5b3..22d2b1a7 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -1370,25 +1370,32 @@ ServerLobbyThread::HandleNetPacketJoinGame(boost::shared_ptr sessio if (pos != m_gameMap.end()) { boost::shared_ptr 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 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; diff --git a/src/net/socket_msg.h b/src/net/socket_msg.h index 416f731d..d65fe604 100644 --- a/src/net/socket_msg.h +++ b/src/net/socket_msg.h @@ -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 diff --git a/src/third_party/protobuf/pokerth.pb.cc b/src/third_party/protobuf/pokerth.pb.cc index 50f6ea2a..7997ef06 100644 --- a/src/third_party/protobuf/pokerth.pb.cc +++ b/src/third_party/protobuf/pokerth.pb.cc @@ -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; diff --git a/src/third_party/protobuf/pokerth.pb.h b/src/third_party/protobuf/pokerth.pb.h index 326abd18..15b3ea66 100644 --- a/src/third_party/protobuf/pokerth.pb.h +++ b/src/third_party/protobuf/pokerth.pb.h @@ -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); } diff --git a/tests/src/de/pokerth/protocol/ProtoBuf.java b/tests/src/de/pokerth/protocol/ProtoBuf.java index 79c9946e..02a11a46 100644 --- a/tests/src/de/pokerth/protocol/ProtoBuf.java +++ b/tests/src/de/pokerth/protocol/ProtoBuf.java @@ -18994,6 +18994,10 @@ public final class ProtoBuf { * rejoinFailed = 11; */ rejoinFailed(10, 11), + /** + * noSpectatorsAllowed = 12; + */ + noSpectatorsAllowed(11, 12), ; /** @@ -19040,6 +19044,10 @@ public final class ProtoBuf { * rejoinFailed = 11; */ public static final int rejoinFailed_VALUE = 11; + /** + * noSpectatorsAllowed = 12; + */ + public static final int noSpectatorsAllowed_VALUE = 12; public final int getNumber() { return value; } @@ -19057,6 +19065,7 @@ public final class ProtoBuf { case 9: return invalidSettings; case 10: return ipAddressBlocked; case 11: return rejoinFailed; + case 12: return noSpectatorsAllowed; default: return null; } }