/// <summary> /// Tries to remove this session's user from it's current room instance. /// </summary> public void leaveRoom(bool cleanupReactors) { this.abortTrade(); if (this.waitingFlat > 0) { if (Engine.Game.Rooms.roomInstanceRunning(this.waitingFlat)) { Engine.Game.Rooms.getRoomInstance(this.waitingFlat).unRegisterSession(this.ID); } } else { if (this.inRoom) { this.roomInstance.unRegisterSession(this.ID); } } if (cleanupReactors) // Cleanup! { gameConnection.reactorHandler.unRegister(new flatReactor().GetType()); gameConnection.reactorHandler.unRegister(new roomReactor().GetType()); } this.roomInstance = null; this.roomID = 0; if (this.authenticatedTeleporter == 0) { this.authenticatedFlat = 0; } this.waitingFlat = 0; }
/// <summary> /// Tries to add this user to the room instance with a given ID. /// </summary> /// <param name="roomID">The database ID of the room to try to enter.</param> private void goToRoom(int roomID) { try { roomInstance Instance = Engine.Game.Rooms.getRoomInstance(roomID); if (Instance.Information == null || !Instance.userRoleHasAccess(Session.User.Role)) // Instance not OK for user { return; } if (Instance.isFull) // Room is full { if (!Session.User.hasFuseRight("fuse_enter_full_rooms") && Session.User.ID != Instance.Information.ownerID) // User has no FUSE right to enter full rooms and user is not the room owner { Response.Initialize(224); // "C`" Response.appendWired(1); // 'User flat full' sendResponse(); return; } } Instance.registerSession(this.Session.ID); Session.roomInstance = Instance; Response.Initialize(166); // "Bf" Response.Append("interstitial advertisement goes here"); sendResponse(); Response.Initialize(69); // "AE" Response.Append(Instance.Information.modelType); Response.Append(" "); Response.Append(Instance.roomID); sendResponse(); if (Instance.Information.isUserFlat) { Response.Initialize(46); // "@n" Response.Append("wallpaper/"); Response.Append(Instance.Information.Wallpaper); sendResponse(); Response.Initialize(46); // "@n" Response.Append("floor/"); Response.Append(Instance.Information.Floor); sendResponse(); Session.gameConnection.reactorHandler.Register(new flatReactor()); } else { Session.gameConnection.reactorHandler.Register(new roomReactor()); } } catch { } }
/// <summary> /// 54 - "@v" /// </summary> public void GOVIADOOR() { string[] Data = Request.Content.Split('/'); int roomID = int.Parse(Data[0]); int itemID = int.Parse(Data[1]); if (Session.authenticatedFlat == roomID && Session.authenticatedTeleporter == itemID) // Authenticated for flat and teleporter item { roomInstance pInstance = Engine.Game.Rooms.getRoomInstance(roomID); if (pInstance != null) { pInstance.registerSession(Session.ID); Response.Initialize(19); // "@S" sendResponse(); } } }
/// <summary> /// 2 - "@B" /// </summary> public void ROOM_DIRECTORY() { if (Session.inRoom) { Session.leaveRoom(true); } bool publicSpace = (Request.Content[0] == 'A'); // Base64 A = 1, @ = 0 int roomID = wireEncoding.Decode(Request.Content.Substring(1)); Response.Initialize(19); // "@S" sendResponse(); if (publicSpace)// No flat checks { roomInstance pInstance = ObjectTree.Game.Rooms.getRoomInstance(roomID); if (pInstance != null && !pInstance.Information.isUserFlat) { goToRoom(roomID); } } }
/// <summary> /// 57 - "@y" /// </summary> public void TRYFLAT() { int roomID = 0; string givenPassword = null; if (Request.Content.Contains("/")) { string[] Details = Request.Content.Split('/'); roomID = int.Parse(Details[0]); givenPassword = Details[1]; } else { roomID = int.Parse(Request.Content); } roomInformation Room = Engine.Game.Rooms.getRoomInformation(roomID); if (Room == null) { return; } if (Session.authenticatedTeleporter > 0) { if (roomID != Session.authenticatedFlat) { return; // Attempting to enter different flat via authenticated teleporter } } else { if (Room.accessType != roomAccessType.open && Room.ownerID != Session.User.ID && !Session.User.hasFuseRight("fuse_enter_locked_rooms")) // Can't override checks { if (Room.accessType == roomAccessType.password) // Passworded room { if (givenPassword != Room.Password) // Incorrect password given { Session.gameConnection.sendLocalizedError("Incorrect flat password"); return; } } else // Doorbell { int messageID = 131; // "BC" (no answer) if (Engine.Game.Rooms.roomInstanceRunning(roomID)) { roomInstance Instance = Engine.Game.Rooms.getRoomInstance(roomID); if (Instance.castDoorbellUser(Session.User.Username)) { messageID = 91; // "A[" Instance.registerSession(Session.ID); Session.waitingFlat = roomID; } } Response.Initialize(messageID); sendResponse(); return; // Wait for the eventual response } } Session.authenticatedFlat = roomID; } Response.Initialize(41); // "@i" sendResponse(); }