/// <summary> /// Destroys this instance. /// </summary> internal void Destroy() { _userMap.Clear(); Model.Destroy(); CoordinatedItems.Clear(); Array.Clear(GameMap, 0, GameMap.Length); Array.Clear(EffectMap, 0, EffectMap.Length); Array.Clear(ItemHeightMap, 0, ItemHeightMap.Length); _userMap = null; GameMap = null; EffectMap = null; ItemHeightMap = null; CoordinatedItems = null; Model = null; UserRoom = null; StaticModel = null; }
/// <summary> /// Destroys this instance. /// </summary> internal void Destroy() { Array.Clear(SqState, 0, SqState.Length); Array.Clear(SqFloorHeight, 0, SqFloorHeight.Length); Array.Clear(SqSeatRot, 0, SqSeatRot.Length); _staticModel = null; Heightmap = null; SqState = null; SqFloorHeight = null; SqSeatRot = null; }
/// <summary> /// Update the existent model. /// </summary> /// <param name="model">The model.</param> internal void UpdateCustomModel(uint roomId, RoomModel modelData) { var modelId = $"custom_{roomId}"; if (_roomModels.Contains(modelId)) { _roomModels[modelId] = modelData; } else { _roomModels.Add(modelId, modelData); } }
/// <summary> /// Initializes a new instance of the <see cref="DynamicRoomModel"/> class. /// </summary> /// <param name="pModel">The p model.</param> /// <param name="room">The room.</param> internal DynamicRoomModel(RoomModel pModel, Room room) { _staticModel = pModel; DoorX = _staticModel.DoorX; DoorY = _staticModel.DoorY; DoorZ = _staticModel.DoorZ; DoorOrientation = _staticModel.DoorOrientation; Heightmap = _staticModel.Heightmap; MapSizeX = _staticModel.MapSizeX; MapSizeY = _staticModel.MapSizeY; ClubOnly = _staticModel.ClubOnly; _mRoom = room; Generate(); }
internal void SaveHeightmap() { if (Session != null && Session.GetHabbo() != null) { var room = Session.GetHabbo().CurrentRoom; if (room == null) { Session.SendNotif(Azure.GetLanguage().GetVar("user_is_not_in_room")); return; } if (!room.CheckRights(Session, true)) { Session.SendNotif(Azure.GetLanguage().GetVar("user_is_not_his_room")); return; } var heightMap = Request.GetString(); var doorX = Request.GetInteger(); var doorY = Request.GetInteger(); var doorOrientation = Request.GetInteger(); var wallThickness = Request.GetInteger(); var floorThickness = Request.GetInteger(); var wallHeight = Request.GetInteger(); if (heightMap.Length < 2) { Session.SendNotif(Azure.GetLanguage().GetVar("invalid_room_length")); return; } if (wallThickness < -2 || wallThickness > 1) wallThickness = 0; if (floorThickness < -2 || floorThickness > 1) floorThickness = 0; if (doorOrientation < 0 || doorOrientation > 8) doorOrientation = 2; if (wallHeight < -1 || wallHeight > 16) wallHeight = -1; char[] validLetters = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', '\r' }; if (heightMap.Any(letter => !validLetters.Contains(letter))) { Session.SendNotif(Azure.GetLanguage().GetVar("user_floor_editor_error")); return; } if (heightMap.Last() == Convert.ToChar(13)) heightMap = heightMap.Remove(heightMap.Length - 1); if (heightMap.Length > 1800) { var message = new ServerMessage(LibraryParser.OutgoingRequest("SuperNotificationMessageComposer")); message.AppendString("floorplan_editor.error"); message.AppendInteger(1); message.AppendString("errors"); message.AppendString( "(general): too large height (max 64 tiles)\r(general): too large area (max 1800 tiles)"); Session.SendMessage(message); return; } if (heightMap.Split((char)13).Length - 1 < doorY) { var message = new ServerMessage(LibraryParser.OutgoingRequest("SuperNotificationMessageComposer")); message.AppendString("floorplan_editor.error"); message.AppendInteger(1); message.AppendString("errors"); message.AppendString("Y: Door is in invalid place."); Session.SendMessage(message); return; } var lines = heightMap.Split((char)13); var lineWidth = lines[0].Length; for (var i = 1; i < lines.Length; i++) if (lines[i].Length != lineWidth) { var message = new ServerMessage(LibraryParser.OutgoingRequest("SuperNotificationMessageComposer")); message.AppendString("floorplan_editor.error"); message.AppendInteger(1); message.AppendString("errors"); message.AppendString("(general): Line " + (i + 1) + " is of different length than line 1"); Session.SendMessage(message); return; } var doorZ = 0.0; var charDoor = lines[doorY][doorX]; if (charDoor >= (char)97 && charDoor <= 119) // a-w { doorZ = charDoor - 87; } else { double.TryParse(charDoor.ToString(), out doorZ); } using (var queryReactor = Azure.GetDatabaseManager().GetQueryReactor()) { queryReactor.SetQuery("REPLACE INTO rooms_models_customs (roomid,door_x,door_y,door_z,door_dir,heightmap,poolmap) VALUES ('" + room.RoomId + "', '" + doorX + "','" + doorY + "','" + doorZ.ToString(CultureInfo.InvariantCulture).Replace(',', '.') + "','" + doorOrientation + "',@newmodel,'')"); queryReactor.AddParameter("newmodel", heightMap); queryReactor.RunQuery(); room.RoomData.WallHeight = wallHeight; room.RoomData.WallThickness = wallThickness; room.RoomData.FloorThickness = floorThickness; room.RoomData.Model.DoorZ = doorZ; Azure.GetGame().GetAchievementManager().ProgressUserAchievement(Session, "ACH_RoomDecoHoleFurniCount", 1); queryReactor.RunFastQuery( string.Format( "UPDATE rooms_data SET model_name = 'custom', wallthick = '{0}', floorthick = '{1}', walls_height = '{2}' WHERE id = {3};", wallThickness, floorThickness, wallHeight, room.RoomId)); RoomModel roomModel = new RoomModel(doorX, doorY, doorZ, doorOrientation, heightMap, "", false, ""); Azure.GetGame().GetRoomManager().UpdateCustomModel(room.RoomId, roomModel); room.ResetGameMap("custom", wallHeight, wallThickness, floorThickness); Azure.GetGame().GetRoomManager().UnloadRoom(room, "Reload floor"); var forwardToRoom = new ServerMessage(LibraryParser.OutgoingRequest("RoomForwardMessageComposer")); forwardToRoom.AppendInteger(room.RoomId); Session.SendMessage(forwardToRoom); } } }
/// <summary> /// Resets the model. /// </summary> internal void ResetModel() { _model = AzureEmulator.GetGame().GetRoomManager().GetModel(ModelName, Id); }
/// <summary> /// Fills the null. /// </summary> /// <param name="id">The identifier.</param> internal void FillNull(uint id) { Id = id; Name = "Unknown Room"; Description = "-"; Type = "private"; Owner = "-"; Category = 0; UsersNow = 0; UsersMax = 0; ModelName = "NO_MODEL"; CCTs = string.Empty; Score = 0; Tags = new List<string>(); AllowPets = true; AllowPetsEating = false; AllowWalkThrough = true; HideWall = false; PassWord = string.Empty; WallPaper = "0.0"; Floor = "0.0"; LandScape = "0.0"; WallThickness = 0; FloorThickness = 0; Group = null; AllowRightsOverride = false; Event = null; GameId = 0; WhoCanBan = 0; WhoCanKick = 0; WhoCanMute = 0; TradeState = 2; State = 0; RoomChat = new ConcurrentStack<Chatlog>(); WordFilter = new List<string>(); WallHeight = -1; _model = AzureEmulator.GetGame().GetRoomManager().GetModel(ModelName, Id); CompetitionStatus = 0; }
/// <summary> /// Fills the specified row. /// </summary> /// <param name="row">The row.</param> internal void Fill(DataRow row) { try { Id = Convert.ToUInt32(row["id"]); Name = (string)row["caption"]; PassWord = (string)row["password"]; Description = (string)row["description"]; Type = (string)row["roomtype"]; Owner = (string)row["owner"]; OwnerId = 0; RoomChat = new ConcurrentStack<Chatlog>(); WordFilter = new List<string>(); using (var queryReactor = AzureEmulator.GetDatabaseManager().GetQueryReactor()) { queryReactor.SetQuery("SELECT id FROM users WHERE username = @name"); queryReactor.AddParameter("name", Owner); uint integer = Convert.ToUInt32(queryReactor.GetInteger()); OwnerId = integer != uint.MinValue ? Convert.ToInt32(integer) : 0; queryReactor.SetQuery(string.Format("SELECT user_id, message, timestamp FROM users_chatlogs WHERE room_id= '{0}' ORDER BY timestamp ASC LIMIT 150", Id)); var table = queryReactor.GetTable(); foreach (DataRow dataRow in table.Rows) { RoomChat.Push(new Chatlog((uint)dataRow[0], (string)dataRow[1], AzureEmulator.UnixToDateTime(int.Parse(dataRow[2].ToString())), true, Id)); } queryReactor.SetQuery(string.Format("SELECT word FROM rooms_wordfilter WHERE room_id = '{0}'", Id)); DataTable tableFilter = queryReactor.GetTable(); foreach (DataRow dataRow in tableFilter.Rows) { WordFilter.Add(dataRow["word"].ToString()); } } var roomState = row["state"].ToString().ToLower(); switch (roomState) { case "locked": State = 1; break; case "password": State = 2; break; case "open": default: State = 0; break; } ModelName = (string)row["model_name"]; WallPaper = (string)row["wallpaper"]; Floor = (string)row["floor"]; LandScape = (string)row["landscape"]; CCTs = (string)row["public_ccts"]; int.TryParse(row["trade_state"].ToString(), out TradeState); int.TryParse(row["category"].ToString(), out Category); int.TryParse(row["walls_height"].ToString(), out WallHeight); int.TryParse(row["score"].ToString(), out Score); int.TryParse(row["floorthick"].ToString(), out FloorThickness); int.TryParse(row["wallthick"].ToString(), out WallThickness); int.TryParse(row["chat_type"].ToString(), out ChatType); int.TryParse(row["game_id"].ToString(), out GameId); int.TryParse(row["mute_settings"].ToString(), out WhoCanMute); int.TryParse(row["kick_settings"].ToString(), out WhoCanKick); int.TryParse(row["ban_settings"].ToString(), out WhoCanBan); uint.TryParse(row["users_now"].ToString(), out UsersNow); uint.TryParse(row["users_max"].ToString(), out UsersMax); int.TryParse(row["group_id"].ToString(), out GroupId); uint.TryParse(row["chat_balloon"].ToString(), out ChatBalloon); uint.TryParse(row["chat_speed"].ToString(), out ChatSpeed); uint.TryParse(row["chat_max_distance"].ToString(), out ChatMaxDistance); uint.TryParse(row["chat_flood_protection"].ToString(), out ChatFloodProtection); AllowPets = AzureEmulator.EnumToBool(row["allow_pets"].ToString()); AllowPetsEating = AzureEmulator.EnumToBool(row["allow_pets_eat"].ToString()); AllowWalkThrough = AzureEmulator.EnumToBool(row["allow_walkthrough"].ToString()); HideWall = AzureEmulator.EnumToBool(row["hidewall"].ToString()); AllowRightsOverride = false; Group = AzureEmulator.GetGame().GetGroupManager().GetGroup(GroupId); Event = AzureEmulator.GetGame().GetRoomEvents().GetEvent(Id); _model = AzureEmulator.GetGame().GetRoomManager().GetModel(ModelName, Id); CompetitionStatus = 0; /* var dictionary = new Dictionary<int, int>(); if (!string.IsNullOrEmpty(row["icon_items"].ToString())) { string[] array = row["icon_items"].ToString().Split('|'); foreach (string text in array) { if (string.IsNullOrEmpty(text)) { continue; } string[] array2 = text.Replace('.', ',').Split(','); int key = 0; int value = 0; int.TryParse(array2[0], out key); if (array2.Length > 1) { int.TryParse(array2[1], out value); } try { if (!dictionary.ContainsKey(key)) { dictionary.Add(key, value); } } catch (Exception ex) { Logging.LogException("Exception: " + ex + "[" + text + "]"); } } } */ Tags = new List<string>(); if (row.IsNull("tags") || !string.IsNullOrEmpty(row["tags"].ToString())) return; foreach (var item in row["tags"].ToString().Split(',')) Tags.Add(item); } catch (Exception ex) { Logging.LogException("Exception on RoomData Loading (Fill Void): " + ex); } }