/// <summary> /// Update the existent model. /// </summary> /// <param name="roomId"></param> /// <param name="modelData"></param> internal void UpdateCustomModel(uint roomId, RoomModel modelData) { string modelId = $"custom_{roomId}"; if (_roomModels.Contains(modelId)) _roomModels[modelId] = modelData; else _roomModels.Add(modelId, modelData); }
internal void SaveHeightmap() { if (Session?.GetHabbo() != null) { Room room = Session.GetHabbo().CurrentRoom; if (room == null) { Session.SendNotif(Yupi.GetLanguage().GetVar("user_is_not_in_room")); return; } if (!room.CheckRights(Session, true)) { Session.SendNotif(Yupi.GetLanguage().GetVar("user_is_not_his_room")); return; } string heightMap = Request.GetString(); int doorX = Request.GetInteger(); int doorY = Request.GetInteger(); int doorOrientation = Request.GetInteger(); int wallThickness = Request.GetInteger(); int floorThickness = Request.GetInteger(); int wallHeight = Request.GetInteger(); if (heightMap.Length < 2) { Session.SendNotif(Yupi.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(Yupi.GetLanguage().GetVar("user_floor_editor_error")); return; } if (heightMap.Last() == Convert.ToChar(13)) heightMap = heightMap.Remove(heightMap.Length - 1); if (heightMap.Length > 1800) { ServerMessage 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) { ServerMessage 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; } string[] lines = heightMap.Split((char) 13); int lineWidth = lines[0].Length; for (int i = 1; i < lines.Length; i++) { if (lines[i].Length != lineWidth) { ServerMessage 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; } } char charDoor = lines[doorY][doorX]; double doorZ; if (charDoor >= (char) 97 && charDoor <= 119) // a-w doorZ = charDoor - 87; else double.TryParse(charDoor.ToString(), out doorZ); using (IQueryAdapter queryReactor = Yupi.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; Yupi.GetGame().GetAchievementManager().ProgressUserAchievement(Session, "ACH_RoomDecoHoleFurniCount", 1); queryReactor.RunFastQuery($"UPDATE rooms_data SET model_name = 'custom', wallthick = '{wallThickness}', floorthick = '{floorThickness}', walls_height = '{wallHeight}' WHERE id = {room.RoomId};"); RoomModel roomModel = new RoomModel(doorX, doorY, doorZ, doorOrientation, heightMap, string.Empty, false, string.Empty); Yupi.GetGame().GetRoomManager().UpdateCustomModel(room.RoomId, roomModel); room.ResetGameMap("custom", wallHeight, wallThickness, floorThickness); Yupi.GetGame().GetRoomManager().UnloadRoom(room, "Reload floor"); ServerMessage forwardToRoom = new ServerMessage(LibraryParser.OutgoingRequest("RoomForwardMessageComposer")); forwardToRoom.AppendInteger(room.RoomId); Session.SendMessage(forwardToRoom); } } }