Exemplo n.º 1
0
void Server_Game::getInfo(ServerInfo_Game &result) const
{
	QMutexLocker locker(&gameMutex);
	
	result.set_room_id(room->getId());
	result.set_game_id(gameId);
	if (gameClosed)
		result.set_closed(true);
	else {
		for (int i = 0; i < gameTypes.size(); ++i)
			result.add_game_types(gameTypes[i]);
		
		result.set_max_players(getMaxPlayers());
		result.set_description(getDescription().toStdString());
		result.set_with_password(!getPassword().isEmpty());
		result.set_player_count(getPlayerCount());
		result.set_started(gameStarted);
		result.mutable_creator_info()->CopyFrom(*getCreatorInfo());
		result.set_only_buddies(onlyBuddies);
		result.set_only_registered(onlyRegistered);
		result.set_spectators_allowed(getSpectatorsAllowed());
		result.set_spectators_need_password(getSpectatorsNeedPassword());
		result.set_spectators_can_chat(spectatorsCanTalk);
		result.set_spectators_omniscient(spectatorsSeeEverything);
		result.set_spectators_count(getSpectatorCount());
		result.set_start_time(startTime.toTime_t());
	}
}
 static void setAdmin(PlayerID player, bool flag)
 {
     if ( player < getMaxPlayers() )
     {
         player_lists[player].setAdmin(flag);
     }
 }
Exemplo n.º 3
0
Response::ResponseCode Server_Game::checkJoin(ServerInfo_User *user, const QString &_password, bool spectator, bool overrideRestrictions)
{
	Server_DatabaseInterface *databaseInterface = room->getServer()->getDatabaseInterface();
	{
		QMapIterator<int, Server_Player *> playerIterator(players);
		while (playerIterator.hasNext())
			if (playerIterator.next().value()->getUserInfo()->name() == user->name())
				return Response::RespContextError;
	}
	if (!(overrideRestrictions && (user->user_level() & ServerInfo_User::IsModerator))) {
		if ((_password != password) && !(spectator && !spectatorsNeedPassword))
			return Response::RespWrongPassword;
		if (!(user->user_level() & ServerInfo_User::IsRegistered) && onlyRegistered)
			return Response::RespUserLevelTooLow;
		if (onlyBuddies)
			if (!databaseInterface->isInBuddyList(QString::fromStdString(creatorInfo->name()), QString::fromStdString(user->name())))
				return Response::RespOnlyBuddies;
		if (databaseInterface->isInIgnoreList(QString::fromStdString(creatorInfo->name()), QString::fromStdString(user->name())))
			return Response::RespInIgnoreList;
		if (spectator) {
			if (!spectatorsAllowed)
				return Response::RespSpectatorsNotAllowed;
		}
	}
	if (!spectator && (gameStarted || (getPlayerCount() >= getMaxPlayers())))
		return Response::RespGameFull;
	
	return Response::RespOk;
}
 static void resetPlayerUnitConfig( PlayerID player_id )
 {
     if ( player_id < getMaxPlayers() )
     {
         player_lists[player_id].unit_config.initialize();
     }
 }
 static bool isAdmin(PlayerID player)
 {
     return (player < getMaxPlayers()) && player_lists[player].isAdmin();
 }
 static bool isValidPlayerID(const PlayerID player)
 {
     return player < getMaxPlayers()
         && player != INVALID_PLAYER_ID;
 }
 static bool isPlayerActive(PlayerID player)
 {
     return (player < getMaxPlayers()) && player_lists[player].isActive();
 }
Exemplo n.º 8
0
bool CTable::checkLogin(u_int32_t ipaddr, const char* username)
{
    if (shutdown_)
        return false; // shutting down!

    // XXX zombie
    if (findZombie(username))
        return true; // ok, will reanimate zombie!

    // Check that the same ip address is not logged in already!
    if (ipaddr != 0 && FindIPAddress(ipaddr))
    {
        char s[200];
        sprintf(s, "Rejecting login: ip address %ld (%s) already logged in.\n",
		        ipaddr, username);
        Sys_LogError(s);
        return false;
    }

    // Does the table have room?
    // Note: must take soon-to-log-in player into account here!
    // Otherwise logins could end up rejected later.
    bool rc = true;
    if (!CTournament::Inst()->isTournament())
        rc = (countPlayersRaw() + loginEntries_.size() < getMaxPlayers());

    if (!rc)
    {
        char s[200];
        sprintf(s, "Rejecting login for (%s): table is full.\n",
                username);
        Sys_LogError(s);
    }

    // Check name uniqueness
    if (rc)
    {
        // Check the player's name against existing players
        for (int i = 0; i < CTable::MaxPlayers; i++)
        {
            CPlayer* player = getPlayerRawSlot(i);
            if (player->getConnfd() != -1)
            {
#ifdef _WIN32
                if (strcmpi(username, player->getUsername()) == 0)
#else
                if (strcasecmp(username, player->getUsername()) == 0)
#endif
                {   // Found the same name!
                    char s[100];
                    sprintf(s, "checkLogin: Player %s already logged in\n",
                            username);
                    Sys_LogError(s);
                    rc = false;
                    break;
                }
            }
        }
    }

    return rc;
}