Как запретить пользователю выходить из текущей комнаты и присоединяться к вновь созданной комнате?

Я столкнулся с проблемой при работе с SmartFoxServer 2X, которой хочу поделиться, обращаясь за помощью или советом к сообществу. Это может быть поведение SFS по умолчанию, но я хочу сделать это другим способом для моего проекта. Вот сценарий:

Версия сервера: 2.0.0-RC1, и я использую AS3 для кодирования на стороне клиента. Я ничего не делаю на стороне сервера и использую основные / стандартные методы SFS в AS3.

Пользователь входит в определенную зону и получает список доступных комнат. Все комнаты должны иметь максимум 2 пользователей. Если нет места, пользователь создает комнату (с settings.maxUsers = 2;) и присоединяется к этой комнате. Если есть какая-либо комната, пользователь проверяет комнату с room.userCount<2 и присоединяется к этой комнате.

Если все комнаты заполнены, пользователь создает новую комнату и присоединяется к ней, чтобы другой пользователь мог войти в нее и присоединиться к ней. Теперь, когда первый пользователь входит в систему, создается комната, и пользователь ждет, когда следующий пользователь войдет в эту комнату и присоединится к ней.

Второй пользователь входит в систему и присоединяется к комнате, созданной первым пользователем. Теперь, когда третий пользователь входит в систему, второй пользователь присоединяется к вновь созданной комнате, оставаясь в комнате, созданной первым пользователем. (ПРИМЕЧАНИЕ: только второй пользователь ведет себя так; первый пользователь остается в одной комнате. Аналогично, когда в игре 4, 5 и 6 пользователей, 5-й делит комнаты с 4-м и 6-м пользователями таким же образом как второй пользователь).

Сейчас есть две комнаты. Первая комната используется первым и вторым пользователями, а вторая комната - вторым и третьим пользователями. Это может быть способ SFS по умолчанию для обработки комнат и присоединения пользователей к ним. Но я хочу оставить первого и второго игроков в первой комнате, даже при создании новой комнаты в зоне, а затем создать новую комнату для третьего пользователя, чтобы четвертый пользователь мог присоединиться к комнате с третьим пользователем и скоро.

Спасибо, что заглянули в это. Пожалуйста помоги.


private function onLogin(event:SFSEvent):void {
  SFSVar.removeEventListener(SFSEvent.LOGIN, onLogin);
  var count:int = 0;
  var roomList:Array = event.currentTarget.roomList;
  if(roomList.length==0) {
    var my_date:Date = new Date();
    var settings:RoomSettings = new RoomSettings("PoolGame"+my_date.fullYear+my_date.month+my_date.date+my_date.hours+my_date.minutes+my_date.seconds);
    settings.maxUsers = 2;
    settings.groupId = "default";
    settings.isGame = true;
    SFSVar.send(new CreateRoomRequest(settings, false));
  } else if(roomList.length>0) {
    for each(var room:Room in roomList) {
      count++;
      if(room.userCount==2) {
        if(count==roomList.length) {
          var my_date:Date = new Date();
          var settings:RoomSettings = new RoomSettings("PoolGame"+my_date.fullYear+my_date.month+my_date.date+my_date.hours+my_date.minutes+my_date.seconds);
          settings.maxUsers = 2;
          settings.groupId = "default";
          settings.isGame = true;
          SFSVar.send(new CreateRoomRequest(settings,false));
          break;
        }
      } else if(room.userCount==1) {
        var roomRequest:JoinRoomRequest = new JoinRoomRequest(room.id,null,-1);
        SFSVar.send(roomRequest);
        break;
      }
    }
  }
}

private function onRoomCreation(event:SFSEvent):void {
  SFSVar.removeEventListener(SFSEvent.ROOM_ADD, onRoomCreation);
  var room:Room = event.params.room;
  var roomRequest:JoinRoomRequest = new JoinRoomRequest(room.id,null,-1);
  SFSVar.send(roomRequest);
}

private function onRoomJoin(event:SFSEvent):void {
  SFSVar.removeEventListener(SFSEvent.ROOM_JOIN, onRoomJoin);
  trace("room joined!!!");
}

1 ответ

Решение

Я уверен, что оригинальный постер уже понял это, но для других людей, читающих это, проблема в том, что у второго пользователя все еще есть слушатель события room_add. Когда третий пользователь присоединяется, создается новая комната, и поскольку у 2-го и 3-го пользователей все еще подключены прослушиватели событий room_add, они оба присоединяются к новой комнате.

Чтобы это исправить, либо добавьте строку для удаления прослушивателя событий room_add к обработчику событий room_join, либо добавьте некоторую проверку в обработчик событий room_add для отправки запроса на присоединение к комнате, только если игрок еще не находится в комнате.

Другие вопросы по тегам