コード例 #1
0
ファイル: RoomManager.cs プロジェクト: ImNotSatan/Yupi
        /// <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);
        }
コード例 #2
0
ファイル: Rooms.cs プロジェクト: AngelRmz/Yupi
        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);
                }
            }
        }