public static bool RemoveUserFromRoom(Session Session, bool SendKick = true) { uint CurrentRoomId = Session.AbsoluteRoomId; bool Ok = false; if (CurrentRoomId > 0) { if (Session.RoomJoined) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(CurrentRoomId); if (Instance != null) { Instance.RemoveCharacterFromRoom(Session.CharacterId); } } Session.AbsoluteRoomId = 0; Session.RoomAuthed = false; Session.RoomJoined = false; MessengerHandler.MarkUpdateNeeded(Session, 0, false); Ok = true; } if (SendKick) { Session.SendData(RoomKickedComposer.Compose()); } return(Ok); }
public void Unload() { if (mUnloaded) { return; } mUnloaded = true; if (mActorCountSyncNeeded) { DoActorCountSync(); } BroadcastMessage(RoomKickedComposer.Compose()); lock (mActorSyncRoot) { mActors.Clear(); } mUnloadedTimestamp = UnixTimestamp.GetCurrent(); }
public static void PrepareRoom(Session Session, uint RoomId, string Password = "", bool BypassAuthentication = false) { // Remove user from any previous room RoomManager.RemoveUserFromRoom(Session, false); // Try to retrieve room information RoomInfo Info = RoomInfoLoader.GetRoomInfo(RoomId); // Room not found, send kick notif and stop if (Info == null) { Session.SendData(RoomKickedComposer.Compose()); return; } // Try to retrieve room model information RoomModel Model = Info.TryGetModel(); // Model information not found, send kick notif and stop if (Model == null) { Session.SendData(RoomKickedComposer.Compose()); return; } // Load room instance into the server memory if needed if (!RoomManager.InstanceIsLoadedForRoom(Info.Id)) { RoomManager.TryLoadRoomInstance(Info.Id); } // Attempt to retrieve the instance from the server memory RoomInstance Instance = RoomManager.GetInstanceByRoomId(Info.Id); // If the instance was not created or is unavailable, send kick notif and stop if (Instance == null) { Session.SendData(RoomKickedComposer.Compose()); return; } // Check if the room capacity has been reached if (Info.CurrentUsers >= Info.MaxUsers && !Session.HasRight("enter_full_rooms")) { Session.SendData(RoomJoinErrorComposer.Compose(1)); Session.SendData(RoomKickedComposer.Compose()); return; } // Check if the user has been banned from this room if (Instance.IsUserBanned(Session.CharacterId)) { Session.SendData(RoomJoinErrorComposer.Compose(4)); Session.SendData(RoomKickedComposer.Compose()); return; } // Mark room as loading and check for initial authorization Session.AbsoluteRoomId = Info.Id; Session.RoomAuthed = (BypassAuthentication || Info.OwnerId == Session.CharacterId || Session.HasRight("enter_locked_rooms")); Session.RoomJoined = false; // Send confirmation that the initial checks have been passed (if this is a flat) if (Info.Type == RoomType.Flat) { Session.SendData(RoomOpenFlatComposer.Compose()); } // Try to accomplish authorization (if not already initially authorized by character rights) if (!Session.RoomAuthed) { // Check for valid password, if needed if (Info.AccessType == RoomAccessType.PasswordProtected) { if (Info.Password != Password) { Session.SendData(GenericErrorComposer.Compose(-100002)); RoomManager.RemoveUserFromRoom(Session); return; } } // Send doorbell, if any users are in this room. else if (Info.AccessType == RoomAccessType.Locked) { if (Instance.HumanActorCount > 0) { Session.SendData(RoomDoorbellComposer.Compose()); Instance.BroadcastMessage(RoomDoorbellComposer.Compose(Session.CharacterInfo.Username), true); return; } else { Session.SendData(RoomDoorbellNoResponseComposer.Compose()); RoomManager.RemoveUserFromRoom(Session); return; } } } // If all these stages have been passed, mark auth as OK and continue loading Session.RoomAuthed = true; EnterRoom(Session, Instance); }