Как запретить пользователю выходить из текущей комнаты и присоединяться к вновь созданной комнате?
Я столкнулся с проблемой при работе с 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 для отправки запроса на присоединение к комнате, только если игрок еще не находится в комнате.