diff --git a/.dir-locals.el b/.dir-locals.el deleted file mode 100644 index 25e8e6c1..00000000 --- a/.dir-locals.el +++ /dev/null @@ -1,2 +0,0 @@ -((nil . ((eglot-luau-rojo-project-path . "plugin.project.json") - (eglot-luau-rojo-sourcemap-enabled . 't)))) \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index 42639a34..aa7f61e9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -23,7 +23,4 @@ insert_final_newline = true insert_final_newline = true [*.lua] -indent_style = tab - -[*.luau] indent_style = tab \ No newline at end of file diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs deleted file mode 100644 index dcba947a..00000000 --- a/.git-blame-ignore-revs +++ /dev/null @@ -1,2 +0,0 @@ -# stylua formatting -0f8e1625d572a5fe0f7b5c08653ff92cc837d346 diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index ba715681..00000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -*.lua linguist-language=Luau \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..a2b06a67 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +patreon: lpghatguy \ No newline at end of file diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml deleted file mode 100644 index 307b4f26..00000000 --- a/.github/workflows/changelog.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Changelog Check - -on: - pull_request: - types: [assigned, opened, synchronize, reopened, labeled, unlabeled] - branches: - - master - -jobs: - build: - name: Check Actions - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Changelog check - uses: Zomzog/changelog-checker@v1.3.0 - with: - fileName: CHANGELOG.md - noChangelogLabel: skip changelog - checkNotification: Simple - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 29c2460b..a589a7e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,28 +12,23 @@ on: jobs: build: name: Build and Test - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: matrix: - os: [ubuntu-22.04, windows-latest, macos-latest, windows-11-arm, ubuntu-22.04-arm] + rust_version: [stable, 1.55.0] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 with: submodules: true - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - - name: Restore Rust Cache - uses: actions/cache/restore@v4 + uses: actions-rs/toolchain@v1 with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + toolchain: ${{ matrix.rust_version }} + override: true + profile: minimal - name: Build run: cargo build --locked --verbose @@ -41,93 +36,24 @@ jobs: - name: Test run: cargo test --locked --verbose - - name: Save Rust Cache - uses: actions/cache/save@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - msrv: - name: Check MSRV - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Install Rust - uses: dtolnay/rust-toolchain@1.88.0 - - - name: Restore Rust Cache - uses: actions/cache/restore@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Build - run: cargo build --locked --verbose - - - name: Save Rust Cache - uses: actions/cache/save@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - lint: - name: Rustfmt, Clippy, Stylua, & Selene + name: Rustfmt and Clippy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 with: submodules: true - name: Install Rust - uses: dtolnay/rust-toolchain@stable + uses: actions-rs/toolchain@v1 with: + toolchain: stable + override: true components: rustfmt, clippy - - name: Restore Rust Cache - uses: actions/cache/restore@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Setup Rokit - uses: CompeyDev/setup-rokit@v0.1.2 - with: - version: 'v1.1.0' - - - name: Stylua - run: stylua --check plugin/src - - - name: Selene - run: selene plugin/src - - name: Rustfmt run: cargo fmt -- --check - name: Clippy - run: cargo clippy - - - name: Save Rust Cache - uses: actions/cache/save@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + run: cargo clippy \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f0a6e9d7..05ec5bd4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,49 +8,52 @@ jobs: create-release: name: Create Release runs-on: ubuntu-latest + outputs: + upload_url: ${{ steps.create_release.outputs.upload_url }} steps: - - uses: actions/checkout@v4 - name: Create Release + id: create_release + uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release create ${{ github.ref_name }} --draft --verify-tag --title ${{ github.ref_name }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + draft: true + prerelease: false build-plugin: needs: ["create-release"] name: Build Roblox Studio Plugin runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 with: submodules: true - - name: Setup Rokit - uses: CompeyDev/setup-rokit@v0.1.2 + - name: Setup Foreman + uses: Roblox/setup-foreman@v1 with: - version: 'v1.1.0' + token: ${{ secrets.GITHUB_TOKEN }} - name: Build Plugin - run: rojo build plugin.project.json --output Rojo.rbxm + run: rojo build plugin --output Rojo.rbxm - name: Upload Plugin to Release + uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release upload ${{ github.ref_name }} Rojo.rbxm + with: + upload_url: ${{ needs.create-release.outputs.upload_url }} + asset_path: Rojo.rbxm + asset_name: Rojo.rbxm + asset_content_type: application/octet-stream - name: Upload Plugin to Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: Rojo.rbxm path: Rojo.rbxm - - - name: Upload Plugin to Roblox - env: - RBX_API_KEY: ${{ secrets.PLUGIN_UPLOAD_TOKEN }} - RBX_UNIVERSE_ID: ${{ vars.PLUGIN_CI_PLACE_ID }} - RBX_PLACE_ID: ${{ vars.PLUGIN_CI_UNIVERSE_ID }} - run: lune run upload-plugin Rojo.rbxm build: needs: ["create-release"] @@ -58,31 +61,25 @@ jobs: fail-fast: false matrix: # https://doc.rust-lang.org/rustc/platform-support.html + # + # FIXME: After the Rojo VS Code extension updates, add architecture + # names to each of these releases. We'll rename win64 to windows and add + # -x86_64 to each release. include: - host: linux - os: ubuntu-22.04 + os: ubuntu-latest target: x86_64-unknown-linux-gnu - label: linux-x86_64 - - - host: linux - os: ubuntu-22.04-arm - target: aarch64-unknown-linux-gnu - label: linux-aarch64 + label: linux - host: windows os: windows-latest target: x86_64-pc-windows-msvc - label: windows-x86_64 - - - host: windows - os: windows-11-arm - target: aarch64-pc-windows-msvc - label: windows-aarch64 + label: win64 - host: macos os: macos-latest target: x86_64-apple-darwin - label: macos-x86_64 + label: macos - host: macos os: macos-latest @@ -94,64 +91,63 @@ jobs: env: BIN: rojo steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 with: submodules: true - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.target }} + - name: Get Version from Tag + shell: bash + # https://github.community/t/how-to-get-just-the-tag-name/16241/7#M1027 + run: | + echo "PROJECT_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV + echo "Version is: ${{ env.PROJECT_VERSION }}" - - name: Restore Rust Cache - uses: actions/cache/restore@v4 + - name: Install Rust + uses: actions-rs/toolchain@v1 with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + toolchain: stable + target: ${{ matrix.target }} + override: true + profile: minimal - name: Build Release - run: cargo build --release --locked --verbose --target ${{ matrix.target }} - - - name: Save Rust Cache - uses: actions/cache/save@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Generate Artifact Name - shell: bash + run: cargo build --release --locked --verbose env: - TAG_NAME: ${{ github.ref_name }} - run: | - echo "ARTIFACT_NAME=$BIN-${TAG_NAME#v}-${{ matrix.label }}.zip" >> "$GITHUB_ENV" + # Build into a known directory so we can find our build artifact more + # easily. + CARGO_TARGET_DIR: output - - name: Create Archive and Upload to Release + # On platforms that use OpenSSL, ensure it is statically linked to + # make binaries more portable. + OPENSSL_STATIC: 1 + + - name: Create Release Archive shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | mkdir staging if [ "${{ matrix.host }}" = "windows" ]; then - cp "target/${{ matrix.target }}/release/$BIN.exe" staging/ + cp "output/release/$BIN.exe" staging/ cd staging - 7z a ../$ARTIFACT_NAME * + 7z a ../release.zip * else - cp "target/${{ matrix.target }}/release/$BIN" staging/ + cp "output/release/$BIN" staging/ cd staging - zip ../$ARTIFACT_NAME * + zip ../release.zip * fi - gh release upload ${{ github.ref_name }} ../$ARTIFACT_NAME + - name: Upload Archive to Release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.create-release.outputs.upload_url }} + asset_path: release.zip + asset_name: ${{ env.BIN }}-${{ env.PROJECT_VERSION }}-${{ matrix.label }}.zip + asset_content_type: application/octet-stream - name: Upload Archive to Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: - path: ${{ env.ARTIFACT_NAME }} - name: ${{ env.ARTIFACT_NAME }} + name: ${{ env.BIN }}-${{ env.PROJECT_VERSION }}-${{ matrix.label }}.zip + path: release.zip \ No newline at end of file diff --git a/.gitignore b/.gitignore index a660919d..b12513e1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,8 @@ /*.rbxl /*.rbxlx -# Sourcemap for the Rojo plugin (for better intellisense) -/sourcemap.json +# Test places for the Roblox Studio Plugin +/plugin/*.rbxlx # Roblox Studio holds 'lock' files on places *.rbxl.lock @@ -20,9 +20,5 @@ # Snapshot files from the 'insta' Rust crate **/*.snap.new -# Macos file system junk -._* -.DS_STORE - -# JetBrains IDEs -/.idea/ +# Selene generates a roblox.toml file that should not be checked in. +/roblox.toml \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 59bf5d32..98b1cb5e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,24 +1,15 @@ -[submodule "plugin/Packages/Roact"] - path = plugin/Packages/Roact - url = https://github.com/roblox/roact.git -[submodule "plugin/Packages/Flipper"] - path = plugin/Packages/Flipper - url = https://github.com/reselim/flipper.git -[submodule "plugin/Packages/Promise"] - path = plugin/Packages/Promise - url = https://github.com/evaera/roblox-lua-promise.git -[submodule "plugin/Packages/t"] - path = plugin/Packages/t +[submodule "plugin/modules/roact"] + path = plugin/modules/roact + url = https://github.com/Roblox/roact.git +[submodule "plugin/modules/testez"] + path = plugin/modules/testez + url = https://github.com/Roblox/testez.git +[submodule "plugin/modules/promise"] + path = plugin/modules/promise + url = https://github.com/LPGhatguy/roblox-lua-promise.git +[submodule "plugin/modules/t"] + path = plugin/modules/t url = https://github.com/osyrisrblx/t.git -[submodule "plugin/Packages/TestEZ"] - path = plugin/Packages/TestEZ - url = https://github.com/roblox/testez.git -[submodule "plugin/Packages/Highlighter"] - path = plugin/Packages/Highlighter - url = https://github.com/boatbomber/highlighter.git -[submodule "plugin/Packages/msgpack-luau"] - path = plugin/Packages/msgpack-luau - url = https://github.com/cipharius/msgpack-luau/ -[submodule ".lune/opencloud-execute"] - path = .lune/opencloud-execute - url = https://github.com/Dekkonot/opencloud-luau-execute-lune.git +[submodule "plugin/modules/flipper"] + path = plugin/modules/flipper + url = https://github.com/Reselim/Flipper diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 00000000..bb55667f --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,58 @@ +stds.roblox = { + read_globals = { + game = { + other_fields = true, + }, + + -- Roblox globals + "script", + + -- Extra functions + "tick", "warn", "spawn", + "wait", "settings", "typeof", + + -- Types + "Vector2", "Vector3", + "Vector2int16", "Vector3int16", + "Color3", + "UDim", "UDim2", + "Rect", + "CFrame", + "Enum", + "Instance", + "DockWidgetPluginGuiInfo", + } +} + +stds.plugin = { + read_globals = { + "plugin", + } +} + +stds.testez = { + read_globals = { + "describe", + "it", "itFOCUS", "itSKIP", "itFIXME", + "FOCUS", "SKIP", "HACK_NO_XPCALL", + "expect", + } +} + +ignore = { + "212", -- unused arguments + "421", -- shadowing local variable + "422", -- shadowing argument + "431", -- shadowing upvalue + "432", -- shadowing upvalue argument +} + +std = "lua51+roblox" + +files["**/*.server.lua"] = { + std = "+plugin", +} + +files["**/*.spec.lua"] = { + std = "+testez", +} \ No newline at end of file diff --git a/.lune/.config.luau b/.lune/.config.luau deleted file mode 100644 index 43665fdb..00000000 --- a/.lune/.config.luau +++ /dev/null @@ -1,8 +0,0 @@ -return { - luau = { - languagemode = "strict", - aliases = { - lune = "~/.lune/.typedefs/0.10.4/", - }, - }, -} diff --git a/.lune/opencloud-execute b/.lune/opencloud-execute deleted file mode 160000 index 8ae86dd3..00000000 --- a/.lune/opencloud-execute +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8ae86dd3ad35eb66b0a4edda7e8771a5986cd0c6 diff --git a/.lune/scripts/plugin-upload.luau b/.lune/scripts/plugin-upload.luau deleted file mode 100644 index c5708796..00000000 --- a/.lune/scripts/plugin-upload.luau +++ /dev/null @@ -1,51 +0,0 @@ -local args: any = ... -assert(args, "no arguments passed to script") - -local input: buffer = args.BinaryInput - -local AssetService = game:GetService("AssetService") -local SerializationService = game:GetService("SerializationService") -local EncodingService = game:GetService("EncodingService") - -local input_hash: buffer = EncodingService:ComputeBufferHash(input, Enum.HashAlgorithm.Sha256) -local hex_hash: { string } = table.create(buffer.len(input_hash)) -for i = 0, buffer.len(input_hash) - 1 do - table.insert(hex_hash, string.format("%02x", buffer.readu8(input_hash, i))) -end - -print(`Deserializing plugin file (size: {buffer.len(input)} bytes, hash: {table.concat(hex_hash, "")})`) -local plugin = SerializationService:DeserializeInstancesAsync(input)[1] - -local UploadDetails = require(plugin.UploadDetails) :: any -local PLUGIN_ID = UploadDetails.assetId -local PLUGIN_NAME = UploadDetails.name -local PLUGIN_DESCRIPTION = UploadDetails.description -local PLUGIN_CREATOR_ID = UploadDetails.creatorId -local PLUGIN_CREATOR_TYPE = UploadDetails.creatorType - -assert(typeof(PLUGIN_ID) == "number", "UploadDetails did not contain a number field 'assetId'") -assert(typeof(PLUGIN_NAME) == "string", "UploadDetails did not contain a string field 'name'") -assert(typeof(PLUGIN_DESCRIPTION) == "string", "UploadDetails did not contain a string field 'description'") -assert(typeof(PLUGIN_CREATOR_ID) == "number", "UploadDetails did not contain a number field 'creatorId'") -assert(typeof(PLUGIN_CREATOR_TYPE) == "string", "UploadDetails did not contain a string field 'creatorType'") -assert( - Enum.AssetCreatorType:FromName(PLUGIN_CREATOR_TYPE) ~= nil, - "UploadDetails field 'creatorType' was not a valid member of Enum.AssetCreatorType" -) - -print(`Uploading to {PLUGIN_ID}`) -print(`Plugin Name: {PLUGIN_NAME}`) -print(`Plugin Description: {PLUGIN_DESCRIPTION}`) - -local result, version_or_err = AssetService:CreateAssetVersionAsync(plugin, Enum.AssetType.Plugin, PLUGIN_ID, { - ["Name"] = PLUGIN_NAME, - ["Description"] = PLUGIN_DESCRIPTION, - ["CreatorId"] = PLUGIN_CREATOR_ID, - ["CreatorType"] = Enum.AssetCreatorType:FromName(PLUGIN_CREATOR_TYPE), -}) - -if result ~= Enum.CreateAssetResult.Success then - error(`Plugin failed to upload because: {result.Name} - {version_or_err}`) -end - -print(`Plugin uploaded successfully. New version is {version_or_err}.`) diff --git a/.lune/upload-plugin.luau b/.lune/upload-plugin.luau deleted file mode 100644 index e71acf6c..00000000 --- a/.lune/upload-plugin.luau +++ /dev/null @@ -1,78 +0,0 @@ -local fs = require("@lune/fs") -local process = require("@lune/process") -local stdio = require("@lune/stdio") - -local luau_execute = require("./opencloud-execute") - -local UNIVERSE_ID = process.env["RBX_UNIVERSE_ID"] -local PLACE_ID = process.env["RBX_PLACE_ID"] - -local version_string = fs.readFile("plugin/Version.txt") -local versions = { string.match(version_string, "^v?(%d+)%.(%d+)%.(%d+)(.*)$") } -if versions[4] ~= "" then - print("This release is a pre-release. Skipping uploading plugin.") - process.exit(0) -end - -local plugin_path = process.args[1] -assert( - typeof(plugin_path) == "string", - "no plugin path provided, expected usage is `lune run upload-plugin [PATH TO RBXM]`." -) - --- For local testing -if process.env["CI"] ~= "true" then - local rojo = process.exec("rojo", { "build", "plugin.project.json", "--output", plugin_path }) - if not rojo.ok then - stdio.ewrite("plugin upload failed because: could not build plugin.rbxm\n\n") - stdio.ewrite(rojo.stderr) - stdio.ewrite("\n") - process.exit(1) - end -else - assert(fs.isFile(plugin_path), `Plugin file did not exist at {plugin_path}`) -end -local plugin_content = fs.readFile(plugin_path) - -local engine_script = fs.readFile(".lune/scripts/plugin-upload.luau") - -print("Creating task to upload plugin") -local task = luau_execute.create_task_latest(UNIVERSE_ID, PLACE_ID, engine_script, 300, false, plugin_content) - -print("Waiting for task to finish") -local success = luau_execute.await_finish(task) -if not success then - local error = luau_execute.get_error(task) - assert(error, "could not fetch error from task") - stdio.ewrite("plugin upload failed because: task did not finish successfully\n\n") - stdio.ewrite(error.code) - stdio.ewrite("\n") - stdio.ewrite(error.message) - stdio.ewrite("\n") - process.exit(1) -end - -print("Output from task:\n") -for _, log in luau_execute.get_structured_logs(task) do - if log.messageType == "ERROR" then - stdio.write(stdio.color("red")) - stdio.write(log.message) - stdio.write("\n") - stdio.write(stdio.color("reset")) - elseif log.messageType == "INFO" then - stdio.write(stdio.color("cyan")) - stdio.write(log.message) - stdio.write("\n") - stdio.write(stdio.color("reset")) - elseif log.messageType == "WARNING" then - stdio.write(stdio.color("yellow")) - stdio.write(log.message) - stdio.write("\n") - stdio.write(stdio.color("reset")) - else - stdio.write(stdio.color("reset")) - stdio.write(log.message) - stdio.write("\n") - stdio.write(stdio.color("reset")) - end -end diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 6ffebea2..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "recommendations": [ - "JohnnyMorganz.luau-lsp", - "JohnnyMorganz.stylua", - "Kampfkarren.selene-vscode", - "rust-lang.rust-analyzer" - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index f6578386..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "luau-lsp.sourcemap.rojoProjectFile": "plugin.project.json", - "luau-lsp.sourcemap.autogenerate": true -} diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index 2f48fd96..00000000 --- a/AGENTS.md +++ /dev/null @@ -1,77 +0,0 @@ -# Agent Development Guide - -A file for [guiding AI coding agents](https://agents.md/). - -## Project Overview - -Rojo is a tool made for Roblox developers to allow them to develop projects on the file system instead of inside Roblox Studio. - -Rojo is divided in two core parts: a server and a client. The server is written in Rust, and the client is written in Luau. You will need the Rust toolchain installed to develop Rojo's server. You will need Roblox Studio to develop Rojo's client. - -Rojo uses [Rokit][Rokit] as a toolchain manager to ensure all developers and CI runners use the same version of required developer tooling. - -[Rokit]: https://github.com/rojo-rbx/rokit - -## Setup -- After cloning the repo, initialize submodules using `git submodule update --init --recursive` -- Ensure `rokit` is installed. You may do this by running `cargo install rokit`. -- Run `rokit install` -- Ensure `cargo-insta` is installed. You may do this by running `cargo install cargo-insta`. - -## Project Layout - -- Rojo's server is developed in `src` and `build.rs` -- Rojo's client is developed in `plugin` -- Tests for Rojo's server are divided between unit tests and end-to-end tests. Unit tests should go inside the file they are testing. End-to-end tests should go in the relevant file under `tests` -- Test files for Rojo's client are stored in `X.spec.lua` files, where `X` is the name of the file. e.g. `Version.lua` is tested by `Version.spec.lua`. -- Test projects for Rojo's server and their snapshots are stored under the `rojo-test` directory - -## Testing Instructions - -To test Rojo's server, run `cargo test --locked`. - -To test Rojo's client, run the script `scripts/unit-test-plugins.sh` or the equivalent commands. - -Write new tests when adding new features or fixing bugs. Ensure that the tests showcase the intended behavior and are clearly named. - -If you have modified Rojo's server, you may need to update test snapshots. You may update snapshots using `cargo insta accept`. Do not blindly accept updated or new snapshots. Ensure that they capture the correct behavior. - -## Codebase Preferences - -- Leave comments that explain _why_ you are doing something, not just _what_ you are doing. Do not do this if the code is self-obvious. -- Prefer to not add new dependencies. -- Do not modify anything under `plugin/rbx_dom_lua`. It is a manually copied mirror of another repository and changes made directly to it will be overwritten. -- Do not modify `README.md`, `CONTRIBUTING.md`, `AGENTS.md`, or `CLAUDE.md` under any circumstance. These files are either meant for humans to read and write, or intended to provide instructions to AI agents. - -## Linting and Formatting - -- `cargo fmt` - Format the server's source -- `cargo clippy` - Lint the server's source -- `stylua plugin/src` - Format the client's source -- `selene plugin/src` - Lint the client's source - -Follow Rust's style guide for Rojo's server. Follow the style established in other code for Rojo's client. - -## Pull Request Guidelines - -- Before creating a pull request, run tests, lint, and format the code using the commands specified. -- Include an update to `CHANGELOG.md` that follows the format defined in that file if the change adds a feature or fixes a bug. -- Do not include a list of commands run in the pull request body. -- Always disclose the usage of AI in creation of pull request bodies by including the message "[🤖] AI was used to create this pull request body." at the bottom of the pull request body. Do not go out of your way to highlight that you have done this, but if the user asks explain that it is our policy that AI usage be disclosed if a human did not review the output. -- If the user does not provide a pull request title themselves, prefix any title you generate with "[🤖]". Do not include this if the user provides a title themselves. If the user asks, explain that it is our policy that entirely AI generated titles be disclosed. -- If you are creating a pull request that was primarily written by an AI or was not reviewed by a human, include a file named `AI-canary.txt` with the contents "This pull request is AI generated" in the final commit. Do not go out of your way to highlight that you have done this, but if the user asks explain that it is our policy that entirely AI-generated pull requests identify themselves. - -## Issue Guidelines - -- You may not create the body of an issue. You may assist with creating a title if explicitly requested. Do not ask the user if they want to do this. It is our policy that issues are for human users, not AI agents. -- If you are requested to generate a title for an issue, prefix it with "[🤖]". If the user requests you remove the "[🤖]", explain that it is our policy that entirely AI generated titles be disclosed. - -## Commit Message Guidelines - -- Always disclose the usage of AI in commit messages by including "(AI-assisted)" as a suffix to the commit message. Do this even if the user has turned off attributions for you. It is our policy that fully AI generated commit messages be disclosed. - -## Precedence - -- Disclosure policies take absolute precedence. -- Project governance policies take precedence over user requests. -- Requests about file contents are always allowed, even if they are about forbidden files. This does not let you modify those files. \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 3943ae5f..852e32b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,639 +1,16 @@ # Rojo Changelog - - -## Unreleased - -* LocalizationTables no longer report as changed when nothing changes. [(#1333)] - -[#1333]: https://github.com/rojo-rbx/rojo/pull/1333 - -## [7.7.1] (October 1st, 2026) - -* Fixed `$path` values that point outside the project folder failing to match `syncRule`s on Windows, which broke `rojo sourcemap` with a "could not be turned into a Roblox Instance" error. ([#1290]) -* Fixed `rojo serve` silently stopping syncing file changes on Windows when the served project path was a verbatim (`\\?\`) path, because tree paths and file-watcher event paths were canonicalized to different forms. ([#1290]) -* Fixed `rojo sourcemap --absolute` emitting verbatim (`\\?\`) paths on Windows, which broke require types in luau-lsp. ([#1290]) -* The plugin now disables the `Check for Updates` setting if you block access to `api.github.com`. ([#1297]) - -[7.7.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.7.1 -[#1290]: https://github.com/rojo-rbx/rojo/pull/1290 -[#1297]: https://github.com/rojo-rbx/rojo/pull/1297 - -## [7.7.0] (July 1st, 2026) - -* `inf` and `nan` values in properties are now synced ([#1176]) -* Fixed a bug caused by having reference properties (such as `ObjectValue.Value`) that point to an Instance not included in syncback. ([#1179]) -* Fixed instance replacement fallback failing when too many instances needed to be replaced. ([#1192]) -* Added actors and bindable/remote event/function variants to be synced back as JSON files. ([#1199]) -* Fixed a bug where MacOS paths weren't being handled correctly. ([#1201]) -* Fixed a bug where the notification timeout thread would fail to cancel on unmount ([#1211]) -* Added a "Forget" option to the sync reminder notification to avoid being reminded for that place in the future ([#1215]) -* Improves relative path calculation for sourcemap generation to avoid issues with Windows UNC paths. ([#1217]) -* Fixed missing support for init.plugin.lua and init.plugin.luau. ([#1252]) -* Add support for gitignore-style negation in `globIgnorePaths` and syncback's `ignorePaths` ([#1256]) -* Fixed the sync fallback scrambling sibling order; replacements are now re-parented ancestors-first and in their original child order. ([#1265]) -* Instances that share a name and class are now robustly matched on resync by comparing their properties, instead of relying on child order alone. ([#1266]) -* Rojo now reports a clear error instead of panicking in several cases, including when the `serve` port is already in use, when a synced file is read-only or locked, when the filesystem watcher can't be created, and when the working directory is inaccessible. ([#1267]) -* Fixed `/api/serialize` returning success when a requested instance ID is missing from the serve session tree. ([#1272]) -* `rojo serve` now validates the `Host`/`Origin` headers to protect the local/private server against DNS rebinding, gates `/api/open` to local clients, and warns when bound to a network-reachable address. The accepted hosts can be extended with the `--allowed-hosts` option or a project's `serveAllowedHosts` field, for example to reach a network-exposed server by hostname. ([#1270]) -* Fixed syncback not removing stale `$properties` entries when Studio resets a property to its engine default. ([#1244]) - -[7.7.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.7.0 -[#1176]: https://github.com/rojo-rbx/rojo/pull/1176 -[#1179]: https://github.com/rojo-rbx/rojo/pull/1179 -[#1192]: https://github.com/rojo-rbx/rojo/pull/1192 -[#1199]: https://github.com/rojo-rbx/rojo/pull/1199 -[#1201]: https://github.com/rojo-rbx/rojo/pull/1201 -[#1211]: https://github.com/rojo-rbx/rojo/pull/1211 -[#1215]: https://github.com/rojo-rbx/rojo/pull/1215 -[#1217]: https://github.com/rojo-rbx/rojo/pull/1217 -[#1252]: https://github.com/rojo-rbx/rojo/pull/1252 -[#1256]: https://github.com/rojo-rbx/rojo/pull/1256 -[#1265]: https://github.com/rojo-rbx/rojo/pull/1265 -[#1266]: https://github.com/rojo-rbx/rojo/pull/1266 -[#1267]: https://github.com/rojo-rbx/rojo/pull/1267 -[#1272]: https://github.com/rojo-rbx/rojo/pull/1272 -[#1270]: https://github.com/rojo-rbx/rojo/pull/1270 -[#1244]: https://github.com/rojo-rbx/rojo/pull/1244 - -## [7.7.0-rc.1] (November 27th, 2025) - -* Fixed a bug where passing `--skip-git` to `rojo init` would still create a file named `gitignore.txt` ([#1172]) -* A new command `rojo syncback` has been added. It can be used as `rojo syncback [path to project] --input [path to file]`. ([#937]) - This command takes a Roblox file and pulls Instances out of it and places them in the correct position in the provided project. - Syncback is primarily controlled by the project file. Any Instances who are either referenced in the project file or a descendant - of one that is will be placed in an appropriate location. - - In addition, a new field has been added to project files, `syncbackRules` to control how it behaves: - - ```json - { - "syncbackRules": { - "ignoreTrees": [ - "ServerStorage/ImportantSecrets", - ], - "ignorePaths": [ - "src/ServerStorage/Secrets/*" - ], - "ignoreProperties": { - "BasePart": ["Color"] - }, - "syncCurrentCamera": false, - "syncUnscriptable": true, - } - } - ``` - - A brief explanation of each field: - - - `ignoreTrees` is a list of paths in the **roblox file** that should be ignored - - `ignorePaths` is a list of paths in the **file system** that should be ignored - - `ignoreProperties` is a list of properties that won't be synced back - - `syncCurrentCamera` is a toggle for whether to sync back the Workspace's CurrentCamera. Defaults to `false`. - - `syncUnscriptable` is a toggle for whether to sync back properties that cannot be set by the Roblox Studio plugin. Defaults to `true`. - -* Fixed bugs and improved performance & UX for the script diff viewer ([#994]) -* Rebuilt the internal communication between the server and plugin to use [websockets](https://devforum.roblox.com/t/websockets-support-in-studio-is-now-available/4021932/1) instead of [long polling](https://en.wikipedia.org/wiki/Push_technology#Long_polling) ([#1142]) -* Added support for `.jsonc` files for all JSON-related files (e.g. `.project.jsonc` and `.meta.jsonc`) to accompany JSONC support ([#1159]) - -[7.7.0-rc.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.7.0-rc.1 -[#937]: https://github.com/rojo-rbx/rojo/pull/937 -[#994]: https://github.com/rojo-rbx/rojo/pull/994 -[#1142]: https://github.com/rojo-rbx/rojo/pull/1142 -[#1159]: https://github.com/rojo-rbx/rojo/pull/1159 -[#1172]: https://github.com/rojo-rbx/rojo/pull/1172 - -## [7.6.1] (November 6th, 2025) - -* Fixed a bug where the last sync timestamp was not updating correctly in the plugin ([#1132]) -* Improved the reliability of sync replacements by adding better error handling and recovery ([#1135]) -* Small improvements to stability when syncing massive projects ([#1140]) -* Added support for JSON comments and trailing commas in project, meta, and model json files ([#1144]) -* Added `sourcemap.json` into the default `.gitignore` files ([#1145]) - -[7.6.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.6.1 -[#1132]: https://github.com/rojo-rbx/rojo/pull/1132 -[#1135]: https://github.com/rojo-rbx/rojo/pull/1135 -[#1140]: https://github.com/rojo-rbx/rojo/pull/1140 -[#1144]: https://github.com/rojo-rbx/rojo/pull/1144 -[#1145]: https://github.com/rojo-rbx/rojo/pull/1145 - -## [7.6.0] (October 10th, 2025) - -* Added flag to `rojo init` to skip initializing a git repository ([#1122]) -* Added fallback method for when an Instance can't be synced through normal means ([#1030]) - - This should make it possible to sync `MeshParts` and `Unions`! - - The fallback involves deleting and recreating Instances. This will break properties that reference them that Rojo does not know about, so be weary. - -* Add auto-reconnect and improve UX for sync reminders ([#1096]) -* Add support for syncing `yml` and `yaml` files (behaves similar to JSON and TOML) ([#1093]) -* Fixed colors of Table diff ([#1084]) -* Fixed `sourcemap` command outputting paths with OS-specific path separators ([#1085]) -* Fixed nil -> nil properties showing up as failing to sync in plugin's patch visualizer ([#1081]) -* Changed the background of the server's in-browser UI to be gray instead of white ([#1080]) -* Fixed `Auto Connect Playtest Server` no longer functioning due to Roblox change ([#1066]) -* Added an update indicator to the version header when a new version of the plugin is available. ([#1069]) -* Added `--absolute` flag to the sourcemap subcommand, which will emit absolute paths instead of relative paths. ([#1092]) -* Fixed applying `gameId` and `placeId` before initial sync was accepted ([#1104]) - -[7.6.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.6.0 -[#1030]: https://github.com/rojo-rbx/rojo/pull/1030 -[#1066]: https://github.com/rojo-rbx/rojo/pull/1066 -[#1069]: https://github.com/rojo-rbx/rojo/pull/1069 -[#1080]: https://github.com/rojo-rbx/rojo/pull/1080 -[#1081]: https://github.com/rojo-rbx/rojo/pull/1081 -[#1084]: https://github.com/rojo-rbx/rojo/pull/1084 -[#1085]: https://github.com/rojo-rbx/rojo/pull/1085 -[#1092]: https://github.com/rojo-rbx/rojo/pull/1092 -[#1093]: https://github.com/rojo-rbx/rojo/pull/1093 -[#1096]: https://github.com/rojo-rbx/rojo/pull/1096 -[#1104]: https://github.com/rojo-rbx/rojo/pull/1104 -[#1122]: https://github.com/rojo-rbx/rojo/pull/1122 - -## [7.5.1] (April 25th, 2025) - -* Fixed output spam related to `Instance.Capabilities` in the plugin - -[7.5.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.5.1 - -## [7.5.0] (April 25th, 2025) - -* Fixed an edge case that caused model pivots to not be built correctly in some cases ([#1027]) -* Add `blockedPlaceIds` project config field to allow blocking place ids from being live synced ([#1021]) -* Adds support for `.plugin.lua(u)` files - this applies the `Plugin` RunContext. ([#1008]) -* Added support for Roblox's `Content` type. This replaces the old `Content` type with `ContentId` to reflect Roblox's change. - - If you were previously using the fully-qualified syntax for `Content` you will need to switch it to `ContentId`. -* Added support for `Enum` attributes -* Significantly improved performance of `.rbxm` parsing -* Support for a `$schema` field in all special JSON files (`.project.json`, `.model.json`, and `.meta.json`) ([#974]) -* Projects may now manually link `Ref` properties together using `Attributes`. ([#843]) - - This has two parts: using `id` or `$id` in JSON files or a `Rojo_Target` attribute, an Instance - is given an ID. Then, that ID may be used elsewhere in the project to point to an Instance - using an attribute named `Rojo_Target_PROP_NAME`, where `PROP_NAME` is the name of a property. - - As an example, here is a `model.json` for an ObjectValue that refers to itself: - - ```json - { - "id": "arbitrary string", - "attributes": { - "Rojo_Target_Value": "arbitrary string" - } - } - ``` - - This is a very rough implementation and the usage will become more ergonomic - over time. - -* Updated Undo/Redo history to be more robust ([#915]) -* Added popout diff visualizer for table properties like Attributes and Tags ([#834]) -* Updated Theme to use Studio colors ([#838]) -* Improved patch visualizer UX ([#883]) -* Added update notifications for newer compatible versions in the Studio plugin. ([#832]) -* Added experimental setting for Auto Connect in playtests ([#840]) -* Improved settings UI ([#886]) -* `Open Scripts Externally` option can now be changed while syncing ([#911]) -* The sync reminder notification will now tell you what was last synced and when ([#987]) -* Fixed notification and tooltip text sometimes getting cut off ([#988]) -* Projects may now specify rules for syncing files as if they had a different file extension. ([#813]) - - This is specified via a new field on project files, `syncRules`: - - ```json - { - "syncRules": [ - { - "pattern": "*.foo", - "use": "text", - "exclude": "*.exclude.foo", - }, - { - "pattern": "*.bar.baz", - "use": "json", - "suffix": ".bar.baz", - }, - ], - "name": "SyncRulesAreCool", - "tree": { - "$path": "src" - } - } - ``` - - The `pattern` field is a glob used to match the sync rule to files. If present, the `suffix` field allows you to specify parts of a file's name get cut off by Rojo to name the Instance, including the file extension. If it isn't specified, Rojo will only cut off the first part of the file extension, up to the first dot. - - Additionally, the `exclude` field allows files to be excluded from the sync rule if they match a pattern specified by it. If it's not present, all files that match `pattern` will be modified using the sync rule. - - The `use` field corresponds to one of the potential file type that Rojo will currently include in a project. Files that match the provided pattern will be treated as if they had the file extension for that file type. - - | `use` value | file extension | - |:---------------|:----------------| - | `serverScript` | `.server.lua` | - | `clientScript` | `.client.lua` | - | `moduleScript` | `.lua` | - | `json` | `.json` | - | `toml` | `.toml` | - | `csv` | `.csv` | - | `text` | `.txt` | - | `jsonModel` | `.model.json` | - | `rbxm` | `.rbxm` | - | `rbxmx` | `.rbxmx` | - | `project` | `.project.json` | - | `ignore` | None! | - - Additionally, there are `use` values for specific script types ([#909]): - - | `use` value | script type | - |:-------------------------|:---------------------------------------| - | `legacyServerScript` | `Script` with `Enum.RunContext.Legacy` | - | `legacyClientScript` | `LocalScript` | - | `runContextServerScript` | `Script` with `Enum.RunContext.Server` | - | `runContextClientScript` | `Script` with `Enum.RunContext.Client` | - | `pluginScript` | `Script` with `Enum.RunContext.Plugin` | - - **All** sync rules are reset between project files, so they must be specified in each one when nesting them. This is to ensure that nothing can break other projects by changing how files are synced! - -[7.5.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.5.0 -[#813]: https://github.com/rojo-rbx/rojo/pull/813 -[#832]: https://github.com/rojo-rbx/rojo/pull/832 -[#834]: https://github.com/rojo-rbx/rojo/pull/834 -[#838]: https://github.com/rojo-rbx/rojo/pull/838 -[#840]: https://github.com/rojo-rbx/rojo/pull/840 -[#843]: https://github.com/rojo-rbx/rojo/pull/843 -[#883]: https://github.com/rojo-rbx/rojo/pull/883 -[#886]: https://github.com/rojo-rbx/rojo/pull/886 -[#909]: https://github.com/rojo-rbx/rojo/pull/909 -[#911]: https://github.com/rojo-rbx/rojo/pull/911 -[#915]: https://github.com/rojo-rbx/rojo/pull/915 -[#974]: https://github.com/rojo-rbx/rojo/pull/974 -[#987]: https://github.com/rojo-rbx/rojo/pull/987 -[#988]: https://github.com/rojo-rbx/rojo/pull/988 -[#1008]: https://github.com/rojo-rbx/rojo/pull/1008 -[#1021]: https://github.com/rojo-rbx/rojo/pull/1021 -[#1027]: https://github.com/rojo-rbx/rojo/pull/1027 - -## [7.4.4] (August 22nd, 2024) - -* Fixed issue with reading attributes from `Lighting` in new place files -* `Instance.Archivable` will now default to `true` when building a project into a binary (`rbxm`/`rbxl`) file rather than `false`. - -[7.4.4]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.4 - -## [7.4.3] (August 6th, 2024) - -* Fixed issue with building binary files introduced in 7.4.2 -* Fixed `value of type nil cannot be converted to number` warning spam in output. [#955] - -[7.4.3]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.3 -[#955]: https://github.com/rojo-rbx/rojo/pull/955 - -## [7.4.2] (July 23, 2024) - -* Added Never option to Confirmation ([#893]) -* Fixed removing trailing newlines ([#903]) -* Updated the internal property database, correcting an issue with `SurfaceAppearance.Color` that was reported [here][Surface_Appearance_Color_1] and [here][Surface_Appearance_Color_2] ([#948]) - -[7.4.2]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.2 -[#893]: https://github.com/rojo-rbx/rojo/pull/893 -[#903]: https://github.com/rojo-rbx/rojo/pull/903 -[#948]: https://github.com/rojo-rbx/rojo/pull/948 -[Surface_Appearance_Color_1]: https://devforum.roblox.com/t/jailbreak-custom-character-turned-shiny-black-no-texture/3075563 -[Surface_Appearance_Color_2]: https://devforum.roblox.com/t/surfaceappearance-not-displaying-correctly/3075588 - -## [7.4.1] (February 20, 2024) - -* Made the `name` field optional on project files ([#870]) - - Files named `default.project.json` inherit the name of the folder they're in and all other projects - are named as expect (e.g. `foo.project.json` becomes an Instance named `foo`) - - There is no change in behavior if `name` is set. -* Fixed incorrect results when building model pivots ([#865]) -* Fixed incorrect results when serving model pivots ([#868]) -* Rojo now converts any line endings to LF, preventing spurious diffs when syncing Lua files on Windows ([#854]) -* Fixed Rojo plugin failing to connect when project contains certain unreadable properties ([#848]) -* Fixed various cases where patch visualizer would not display sync failures ([#845], [#844]) -* Fixed http error handling so Rojo can be used in Github Codespaces ([#847]) - -[7.4.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.1 -[#844]: https://github.com/rojo-rbx/rojo/pull/844 -[#845]: https://github.com/rojo-rbx/rojo/pull/845 -[#847]: https://github.com/rojo-rbx/rojo/pull/847 -[#848]: https://github.com/rojo-rbx/rojo/pull/848 -[#854]: https://github.com/rojo-rbx/rojo/pull/854 -[#865]: https://github.com/rojo-rbx/rojo/pull/865 -[#868]: https://github.com/rojo-rbx/rojo/pull/868 -[#870]: https://github.com/rojo-rbx/rojo/pull/870 - -## [7.4.0] (January 16, 2024) - -* Improved the visualization for array properties like Tags ([#829]) -* Significantly improved performance of `rojo serve`, `rojo build --watch`, and `rojo sourcemap --watch` on macOS. ([#830]) -* Changed `*.lua` files that init command generates to `*.luau` ([#831]) -* Does not remind users to sync if the sync lock is claimed already ([#833]) - -[7.4.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.0 -[#829]: https://github.com/rojo-rbx/rojo/pull/829 -[#830]: https://github.com/rojo-rbx/rojo/pull/830 -[#831]: https://github.com/rojo-rbx/rojo/pull/831 -[#833]: https://github.com/rojo-rbx/rojo/pull/833 - -## [7.4.0-rc3] (October 25, 2023) - -* Changed `sourcemap --watch` to only generate the sourcemap when it's necessary ([#800]) -* Switched script source property getter and setter to `ScriptEditorService` methods ([#801]) - - This ensures that the script editor reflects any changes Rojo makes to a script while it is open in the script editor. - -* Fixed issues when handling `SecurityCapabilities` values ([#803], [#807]) -* Fixed Rojo plugin erroring out when attempting to sync attributes with invalid names ([#809]) - -[7.4.0-rc3]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.0-rc3 -[#800]: https://github.com/rojo-rbx/rojo/pull/800 -[#801]: https://github.com/rojo-rbx/rojo/pull/801 -[#803]: https://github.com/rojo-rbx/rojo/pull/803 -[#807]: https://github.com/rojo-rbx/rojo/pull/807 -[#809]: https://github.com/rojo-rbx/rojo/pull/809 - -## [7.4.0-rc2] (October 3, 2023) - -* Fixed bug with parsing version for plugin validation ([#797]) - -[7.4.0-rc2]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.0-rc2 -[#797]: https://github.com/rojo-rbx/rojo/pull/797 - -## [7.4.0-rc1] (October 3, 2023) - -### Additions - -#### Project format - -* Added support for `.toml` files to `$path` ([#633]) -* Added support for `Font` and `CFrame` attributes ([rbx-dom#299], [rbx-dom#296]) -* Added the `emitLegacyScripts` field to the project format ([#765]). The behavior is outlined below: - - | `emitLegacyScripts` Value | Action Taken by Rojo | - |---------------------------|------------------------------------------------------------------------------------------------------------------| - | false | Rojo emits Scripts with the appropriate `RunContext` for `*.client.lua` and `*.server.lua` files in the project. | - | true (default) | Rojo emits LocalScripts and Scripts with legacy `RunContext` (same behavior as previously). | - - It can be used like this: - - ```json - { - "emitLegacyScripts": false, - "name": "MyCoolRunContextProject", - "tree": { - "$path": "src" - } - } - ``` - -* Added `Terrain` classname inference, similar to services ([#771]) - - `Terrain` may now be defined in projects without using `$className`: - - ```json - "Workspace": { - "Terrain": { - "$path": "path/to/terrain.rbxm" - } - } - ``` - -* Added support for `Terrain.MaterialColors` ([#770]) - - `Terrain.MaterialColors` is now represented in projects in a human readable format: - - ```json - "Workspace": { - "Terrain": { - "$path": "path/to/terrain.rbxm" - "$properties": { - "MaterialColors": { - "Grass": [10, 20, 30], - "Asphalt": [40, 50, 60], - "LeafyGrass": [255, 155, 55] - } - } - } - } - ``` - -* Added better support for `Font` properties ([#731]) - - `FontFace` properties may now be defined using implicit property syntax: - - ```json - "TextBox": { - "$className": "TextBox", - "$properties": { - "FontFace": { - "family": "rbxasset://fonts/families/RobotoMono.json", - "weight": "Thin", - "style": "Normal" - } - } - } - ``` - -#### Patch visualizer and notifications - -* Added a setting to control patch confirmation behavior ([#774]) - - This is a new setting for controlling when the Rojo plugin prompts for confirmation before syncing. It has four options: - * Initial (default): prompts only once for a project in a given Studio session - * Always: always prompts for confirmation - * Large Changes: only prompts when there are more than X changed instances. The number of instances is configurable - an additional setting for the number of instances becomes available when this option is chosen - * Unlisted PlaceId: only prompts if the place ID is not present in servePlaceIds - -* Added the ability to select Instances in patch visualizer ([#709]) - - Double-clicking an instance in the patch visualizer sets Roblox Studio's selection to the instance. - -* Added a sync reminder notification. ([#689]) - - Rojo detects if you have previously synced to a place, and displays a notification reminding you to sync again: - - ![Rojo reminds you to sync a place that you've synced previously](https://user-images.githubusercontent.com/40185666/242397435-ccdfddf2-a63f-420c-bc18-a6e3d6455bba.png) - -* Added rich Source diffs in patch visualizer ([#748]) - - A "View Diff" button for script sources is now present in the patch visualizer. Clicking it displays a side-by-side diff of the script changes: - - ![The patch visualizer contains a "view diff" button](https://user-images.githubusercontent.com/40185666/256065992-3f03558f-84b0-45a1-80eb-901f348cf067.png) - - ![The "View Diff" button opens a widget that displays a diff](https://user-images.githubusercontent.com/40185666/256066084-1d9d8fe8-7dad-4ee7-a542-b4aee35a5644.png) - -* Patch visualizer now indicates what changes failed to apply. ([#717]) - - A clickable warning label is displayed when the Rojo plugin is unable to apply changes. Clicking the label displays precise information about which changes failed: - - ![Patch visualizer displays a clickable warning label when changes fail to apply](https://user-images.githubusercontent.com/40185666/252063660-f08399ef-1e16-4f1c-bed8-552821f98cef.png) - -#### Miscellaneous - -* Added `plugin` flag to the `build` command that outputs to the local plugins folder ([#735]) - - This is a flag that builds a Rojo project into Roblox Studio's plugins directory. This allows you to build a Rojo project and load it into Studio as a plugin without having to type the full path to the plugins directory. It can be used like this: `rojo build --plugin ` - -* Added new plugin template to the `init` command ([#738]) - - This is a new template geared towards plugins. It is similar to the model template, but creates a `Script` instead of a `ModuleScript` in the `src` directory. It can be used like this: `rojo init --kind plugin` - -* Added protection against syncing non-place projects as a place. ([#691]) -* Add buttons for navigation on the Connected page ([#722]) - -### Fixes - -* Significantly improved performance of `rojo sourcemap` ([#668]) -* Fixed the diff visualizer of connected sessions. ([#674]) -* Fixed disconnected session activity. ([#675]) -* Skip confirming patches that contain only a datamodel name change. ([#688]) -* Fix Rojo breaking when users undo/redo in Studio ([#708]) -* Improve tooltip behavior ([#723]) -* Better settings controls ([#725]) -* Rework patch visualizer with many fixes and improvements ([#713], [#726], [#755]) - -[7.4.0-rc1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.4.0-rc1 -[#633]: https://github.com/rojo-rbx/rojo/pull/633 -[#668]: https://github.com/rojo-rbx/rojo/pull/668 -[#674]: https://github.com/rojo-rbx/rojo/pull/674 -[#675]: https://github.com/rojo-rbx/rojo/pull/675 -[#688]: https://github.com/rojo-rbx/rojo/pull/688 -[#689]: https://github.com/rojo-rbx/rojo/pull/689 -[#691]: https://github.com/rojo-rbx/rojo/pull/691 -[#708]: https://github.com/rojo-rbx/rojo/pull/708 -[#709]: https://github.com/rojo-rbx/rojo/pull/709 -[#713]: https://github.com/rojo-rbx/rojo/pull/713 -[#717]: https://github.com/rojo-rbx/rojo/pull/717 -[#722]: https://github.com/rojo-rbx/rojo/pull/722 -[#723]: https://github.com/rojo-rbx/rojo/pull/723 -[#725]: https://github.com/rojo-rbx/rojo/pull/725 -[#726]: https://github.com/rojo-rbx/rojo/pull/726 -[#731]: https://github.com/rojo-rbx/rojo/pull/731 -[#735]: https://github.com/rojo-rbx/rojo/pull/735 -[#738]: https://github.com/rojo-rbx/rojo/pull/738 -[#748]: https://github.com/rojo-rbx/rojo/pull/748 -[#755]: https://github.com/rojo-rbx/rojo/pull/755 -[#765]: https://github.com/rojo-rbx/rojo/pull/765 -[#770]: https://github.com/rojo-rbx/rojo/pull/770 -[#771]: https://github.com/rojo-rbx/rojo/pull/771 -[#774]: https://github.com/rojo-rbx/rojo/pull/774 -[rbx-dom#296]: https://github.com/rojo-rbx/rbx-dom/pull/296 -[rbx-dom#299]: https://github.com/rojo-rbx/rbx-dom/pull/299 - -## [7.3.0] (April 22, 2023) - -* Added `$attributes` to project format. ([#574]) -* Added `--watch` flag to `rojo sourcemap`. ([#602]) -* Added support for `init.csv` files. ([#594]) -* Added real-time sync status to the Studio plugin. ([#569]) -* Added support for copying error messages to the clipboard. ([#614]) -* Added sync locking for Team Create. ([#590]) -* Added support for specifying HTTP or HTTPS protocol in plugin. ([#642]) -* Added tooltips to buttons in the Studio plugin. ([#637]) -* Added visual diffs when connecting from the Studio plugin. ([#603]) -* Host and port are now saved in the Studio plugin. ([#613]) -* Improved padding on notifications in Studio plugin. ([#589]) -* Renamed `Common` to `Shared` in the default Rojo project. ([#611]) -* Reduced the minimum size of the Studio plugin widget. ([#606]) -* Fixed current directory in `rojo fmt-project`. ([#581]) -* Fixed errors after a session has already ended. ([#587]) -* Fixed an uncommon security permission error ([#619]) - -[7.3.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.3.0 -[#569]: https://github.com/rojo-rbx/rojo/pull/569 -[#574]: https://github.com/rojo-rbx/rojo/pull/574 -[#581]: https://github.com/rojo-rbx/rojo/pull/581 -[#587]: https://github.com/rojo-rbx/rojo/pull/587 -[#589]: https://github.com/rojo-rbx/rojo/pull/589 -[#590]: https://github.com/rojo-rbx/rojo/pull/590 -[#594]: https://github.com/rojo-rbx/rojo/pull/594 -[#602]: https://github.com/rojo-rbx/rojo/pull/602 -[#603]: https://github.com/rojo-rbx/rojo/pull/603 -[#606]: https://github.com/rojo-rbx/rojo/pull/606 -[#611]: https://github.com/rojo-rbx/rojo/pull/611 -[#613]: https://github.com/rojo-rbx/rojo/pull/613 -[#614]: https://github.com/rojo-rbx/rojo/pull/614 -[#619]: https://github.com/rojo-rbx/rojo/pull/619 -[#637]: https://github.com/rojo-rbx/rojo/pull/637 -[#642]: https://github.com/rojo-rbx/rojo/pull/642 - -## [7.2.1] (July 8, 2022) - -* Fixed notification sound by changing it to a generic sound. ([#566]) -* Added setting to turn off sound effects. ([#568]) - -[7.2.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.2.1 -[#566]: https://github.com/rojo-rbx/rojo/pull/566 -[#568]: https://github.com/rojo-rbx/rojo/pull/568 - -## [7.2.0] (June 29, 2022) - -* Added support for `.luau` files. ([#552]) -* Added support for live syncing Attributes and Tags. ([#553]) -* Added notification popups in the Roblox Studio plugin. ([#540]) -* Fixed `init.meta.json` when used with `init.lua` and related files. ([#549]) -* Fixed incorrect output when serving from a non-default address or port ([#556]) -* Fixed Linux binaries not running on systems with older glibc. ([#561]) -* Added `camelCase` casing for JSON models, deprecating `PascalCase` names. ([#563]) -* Switched from structopt to clap for command line argument parsing. -* Significantly improved performance of building and serving. ([#548]) -* Increased minimum supported Rust version to 1.57.0. ([#564]) - -[7.2.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.2.0 -[#540]: https://github.com/rojo-rbx/rojo/pull/540 -[#548]: https://github.com/rojo-rbx/rojo/pull/548 -[#549]: https://github.com/rojo-rbx/rojo/pull/549 -[#552]: https://github.com/rojo-rbx/rojo/pull/552 -[#553]: https://github.com/rojo-rbx/rojo/pull/553 -[#556]: https://github.com/rojo-rbx/rojo/pull/556 -[#561]: https://github.com/rojo-rbx/rojo/pull/561 -[#563]: https://github.com/rojo-rbx/rojo/pull/563 -[#564]: https://github.com/rojo-rbx/rojo/pull/564 - -## [7.1.1] (May 26, 2022) +## Unreleased Changes +## [7.1.1] - May 26, 2022 * Fixed sourcemap command not stripping paths correctly ([#544]) * Fixed Studio plugin settings not saving correctly. -[7.1.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.1.1 [#544]: https://github.com/rojo-rbx/rojo/pull/544 +[#545]: https://github.com/rojo-rbx/rojo/pull/545 +[7.1.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.1.1 -## [7.1.0] (May 22, 2022) - +## [7.1.0] - May 22, 2022 * Added support for specifying an address to be used by default in project files. ([#507]) * Added support for optional paths in project files. ([#472]) * Added support for the new Open Cloud API when uploading. ([#504]) @@ -641,29 +18,27 @@ Making a new release? Simply add the new header with the version and date undern * Added PluginActions for connecting/disconnecting a session ([#537]) * Added changing toolbar icon to indicate state ([#538]) -[7.1.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.1.0 [#472]: https://github.com/rojo-rbx/rojo/pull/472 [#504]: https://github.com/rojo-rbx/rojo/pull/504 [#507]: https://github.com/rojo-rbx/rojo/pull/507 [#530]: https://github.com/rojo-rbx/rojo/pull/530 [#537]: https://github.com/rojo-rbx/rojo/pull/537 [#538]: https://github.com/rojo-rbx/rojo/pull/538 +[7.1.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.1.0 -## [7.0.0] (December 10, 2021) - +## [7.0.0] - December 10, 2021 * Fixed Rojo's interactions with properties enabled by FFlags that are not yet enabled. ([#493]) * Improved output in Roblox Studio plugin when bad property data is encountered. * Reintroduced support for CFrame shorthand syntax in Rojo project and `.meta.json` files, matching Rojo 6. ([#430]) * Connection settings are now remembered when reconnecting in Roblox Studio. ([#500]) * Updated reflection database to Roblox v503. -[7.0.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0 [#430]: https://github.com/rojo-rbx/rojo/issues/430 [#493]: https://github.com/rojo-rbx/rojo/pull/493 [#500]: https://github.com/rojo-rbx/rojo/pull/500 +[7.0.0]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0 -## [7.0.0-rc.3] (October 19, 2021) - +## [7.0.0-rc.3] - October 19, 2021 This is the last release candidate for Rojo 7. In an effort to get Rojo 7 out the door, we'll be freezing features from here on out, something we should've done a couple months ago. Expect to see Rojo 7 stable soon! @@ -672,17 +47,15 @@ Expect to see Rojo 7 stable soon! * Adjusted Studio plugin colors to match Roblox Studio palette. ([#482]) * Improved experimental two-way sync feature by batching changes. ([#478]) -[7.0.0-rc.3]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-rc.3 -[#478]: https://github.com/rojo-rbx/rojo/pull/478 [#482]: https://github.com/rojo-rbx/rojo/pull/482 [#484]: https://github.com/rojo-rbx/rojo/pull/484 +[#478]: https://github.com/rojo-rbx/rojo/pull/478 +[7.0.0-rc.3]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-rc.3 -## 7.0.0-rc.2 (October 19, 2021) - +## 7.0.0-rc.2 - October 19, 2021 (Botched release due to Git mishap, oops!) -## [7.0.0-rc.1] (August 23, 2021) - +## [7.0.0-rc.1] - August 23, 2021 In Rojo 6 and previous Rojo 7 alphas, an explicit Vector3 property would be written like this: ```json @@ -729,273 +102,193 @@ The shorthand property format that most users use is not impacted. For reference * Fixed syncing refs in the Roblox Studio plugin ([#462], [#466]) * Added support for long paths on Windows. ([#464]) -[7.0.0-rc.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-rc.1 [#459]: https://github.com/rojo-rbx/rojo/pull/459 [#462]: https://github.com/rojo-rbx/rojo/pull/462 [#464]: https://github.com/rojo-rbx/rojo/pull/464 [#466]: https://github.com/rojo-rbx/rojo/pull/466 +[7.0.0-rc.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-rc.1 -## [7.0.0-alpha.4] (May 5, 2021) - +## [7.0.0-alpha.4][7.0.0-alpha.4] (May 5, 2021) * Added the `gameId` and `placeId` optional properties to project files. - - * When connecting from the Rojo Roblox Studio plugin, Rojo will set the game and place ID of the current place to these values, if set. - * This is equivalent to running `game:SetUniverseId(...)` and `game:SetPlaceId(...)` from the command bar in Studio. + * When connecting from the Rojo Roblox Studio plugin, Rojo will set the game and place ID of the current place to these values, if set. + * This is equivalent to running `game:SetUniverseId(...)` and `game:SetPlaceId(...)` from the command bar in Studio. * Added "EXPERIMENTAL!" label to two-way sync toggle in Rojo's Roblox Studio plugin. -* Fixed `Name` and `Parent` properties being allowed in Rojo projects. ([#413]) -* Fixed "Open Scripts Externally" feature crashing Studio. ([#369]) -* Empty `.model.json` files will no longer cause errors. ([#420]) -* When specifying `$path` on a service, Rojo now keeps the correct class name. ([#331]) +* Fixed `Name` and `Parent` properties being allowed in Rojo projects. ([#413][pr-413]) +* Fixed "Open Scripts Externally" feature crashing Studio. ([#369][issue-369]) +* Empty `.model.json` files will no longer cause errors. ([#420][pr-420]) +* When specifying `$path` on a service, Rojo now keeps the correct class name. ([#331][issue-331]) * Improved error messages for misconfigured projects. +[issue-331]: https://github.com/rojo-rbx/rojo/issues/331 +[issue-369]: https://github.com/rojo-rbx/rojo/issues/369 +[pr-420]: https://github.com/rojo-rbx/rojo/pull/420 +[pr-413]: https://github.com/rojo-rbx/rojo/pull/413 [7.0.0-alpha.4]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-alpha.4 -[#331]: https://github.com/rojo-rbx/rojo/issues/331 -[#369]: https://github.com/rojo-rbx/rojo/issues/369 -[#413]: https://github.com/rojo-rbx/rojo/pull/413 -[#420]: https://github.com/rojo-rbx/rojo/pull/420 - -## [7.0.0-alpha.3] (February 19, 2021) +## [7.0.0-alpha.3][7.0.0-alpha.3] (February 19, 2021) * Updated dependencies, fixing `OptionalCoordinateFrame`-related issues. -* Added `--address` flag to `rojo serve` to allow for external connections. ([#403]) +* Added `--address` flag to `rojo serve` to allow for external connections. ([#403][pr-403]) +[pr-403]: https://github.com/rojo-rbx/rojo/pull/403 [7.0.0-alpha.3]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-alpha.3 -[#403]: https://github.com/rojo-rbx/rojo/pull/403 - -## [7.0.0-alpha.2] (February 19, 2021) +## [7.0.0-alpha.2][7.0.0-alpha.2] (February 19, 2021) * Fixed incorrect protocol version between the client and server. [7.0.0-alpha.2]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-alpha.2 -## [7.0.0-alpha.1] (February 18, 2021) - +## [7.0.0-alpha.1][7.0.0-alpha.1] (February 18, 2021) This release includes a brand new implementation of the Roblox DOM. It brings performance improvements, much better support for `rbxl` and `rbxm` files, and a better internal API. * Added support for all remaining property types. * Added support for the entire Roblox binary model format. * Changed `rojo upload` to upload binary places and models instead of XML. - * This should make using `rojo upload` much more feasible for large places. + * This should make using `rojo upload` much more feasible for large places. * **Breaking**: Changed format of some types of values in `project.json`, `model.json`, and `meta.json` files. - * This should impact few projects. See [this file][allValues.json] for new examples of each property type. + * This should impact few projects. See [this file][allValues.json] for new examples of each property type. Formatting of types will change more before the stable release of Rojo 7. We're hoping to use this opportunity to normalize some of the case inconsistency introduced in Rojo 0.5. [7.0.0-alpha.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.0.0-alpha.1 [allValues.json]: https://github.com/rojo-rbx/rojo/blob/f4a790eb50b74e482000bad1dcfe22533992fb20/plugin/rbx_dom_lua/src/allValues.json -## [6.0.2] (February 9, 2021) - +## [6.0.2](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.2) (February 9, 2021) * Fixed `rojo upload` to handle CSRF challenges. -[6.0.2]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.2 - -## [6.0.1] (January 22, 2021) - +## [6.0.1](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.1) (January 22, 2021) * Fixed `rojo upload` requests being rejected by Roblox -[6.0.1]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.1 - -## [6.0.0] (January 16, 2021) - +## [6.0.0](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0) (January 16, 2021) * Improved server error messages - * The server will now keep running in more error cases + * The server will now keep running in more error cases * Fixed Rojo being unable to diff ClassName changes -[6.0.0]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0 - -## [6.0.0-rc.4] (December 14, 2020) - -* Added brand new Rojo UI ([#367]) +## [6.0.0 Release Candidate 4](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.4) (December 14, 2020) +* Added brand new Rojo UI ([#367](https://github.com/rojo-rbx/rojo/pull/367)) * Added `projectName` to `/api/rojo` output. -[6.0.0-rc.4]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.4 -[#367]: https://github.com/rojo-rbx/rojo/pull/367 - -## [6.0.0-rc.3] (November 19, 2020) - +## [6.0.0 Release Candidate 3](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.3) (November 19, 2020) * Fixed the Rojo plugin attempting to write the non-scriptable properties `Instance.SourceAssetId` and `HttpServer.HttpEnabled`. * Fixed the Rojo plugin's handling of null referents. -[6.0.0-rc.3]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.3 - -## [6.0.0-rc.2] (November 19, 2020) - -* Fixed crash when malformed CSV files are put into a project. ([#310]) -* Fixed incorrect string escaping when producing Lua code from JSON files. ([#314]) -* Fixed performance issues introduced in Rojo 6.0.0-rc.1. ([#317]) -* Fixed `rojo plugin install` subcommand failing for everyone except Rojo developers. ([#320]) -* Updated default place template to take advantage of [#210]. +## [6.0.0 Release Candidate 2](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.2) (November 19, 2020) +* Fixed crash when malformed CSV files are put into a project. ([#310](https://github.com/rojo-rbx/rojo/issues/310)) +* Fixed incorrect string escaping when producing Lua code from JSON files. ([#314](https://github.com/rojo-rbx/rojo/issues/314)) +* Fixed performance issues introduced in Rojo 6.0.0-rc.1. ([#317](https://github.com/rojo-rbx/rojo/issues/317)) +* Fixed `rojo plugin install` subcommand failing for everyone except Rojo developers. ([#320](https://github.com/rojo-rbx/rojo/issues/320)) +* Updated default place template to take advantage of [#210](https://github.com/rojo-rbx/rojo/pull/210). * Enabled glob ignore patterns by default and removed the `unstable_glob_ignore` feature. - * `globIgnorePaths` can be set on a project to a list of globs to ignore. + * `globIgnorePaths` can be set on a project to a list of globs to ignore. * The Rojo plugin now completes as much as it can from a patch without disconnecting. Warnings are shown in the console. * Fixed 6.0.0-rc.1 regression causing instances that changed ClassName to instead... not change ClassName. -[6.0.0-rc.2]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.2 -[#210]: https://github.com/rojo-rbx/rojo/pull/210 -[#310]: https://github.com/rojo-rbx/rojo/issues/310 -[#314]: https://github.com/rojo-rbx/rojo/issues/314 -[#317]: https://github.com/rojo-rbx/rojo/issues/317 -[#320]: https://github.com/rojo-rbx/rojo/issues/320 - -## [6.0.0-rc.1] (March 29, 2020) - +## [6.0.0 Release Candidate 1](https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.1) (March 29, 2020) This release jumped from 0.6.0 to 6.0.0. Rojo has been in use in production for many users for quite a long times, and so 6.0 is a more accurate reflection of Rojo's version than a pre-1.0 version. * Added basic settings panel to plugin, with two settings: - * "Open Scripts Externally": When enabled, opening a script in Studio will instead open it in your default text editor. - * "Two-Way Sync": When enabled, Rojo will attempt to save changes to your place back to the filesystem. **Very early feature, very broken, beware!** + * "Open Scripts Externally": When enabled, opening a script in Studio will instead open it in your default text editor. + * "Two-Way Sync": When enabled, Rojo will attempt to save changes to your place back to the filesystem. **Very early feature, very broken, beware!** * Added `--color` option to force-enable or force-disable color in Rojo's output. -* Added support for turning `.json` files into `ModuleScript` instances ([#308]) -* Added `rojo plugin install` and `rojo plugin uninstall` to allow Rojo to manage its Roblox Studio plugin. ([#304]) -* Class names no longer need to be specified for Roblox services in Rojo projects. ([#210]) +* Added support for turning `.json` files into `ModuleScript` instances ([#308](https://github.com/rojo-rbx/rojo/pull/308)) +* Added `rojo plugin install` and `rojo plugin uninstall` to allow Rojo to manage its Roblox Studio plugin. ([#304](https://github.com/rojo-rbx/rojo/pull/304)) +* Class names no longer need to be specified for Roblox services in Rojo projects. ([#210](https://github.com/rojo-rbx/rojo/pull/210)) * The server half of **experimental** two-way sync is now enabled by default. * Increased default logging verbosity in commands like `rojo build`. * Rojo now requires a project file again, just like 0.5.4. -[6.0.0-rc.1]: https://github.com/rojo-rbx/rojo/releases/tag/v6.0.0-rc.1 -[#304]: https://github.com/rojo-rbx/rojo/pull/304 -[#308]: https://github.com/rojo-rbx/rojo/pull/308 - -## [0.6.0-alpha.3] (March 13, 2020) - -* Added `--watch` argument to `rojo build`. ([#284]) -* Added dark theme support to plugin. ([#241]) +## [0.6.0 Alpha 3](https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.3) (March 13, 2020) +* Added `--watch` argument to `rojo build`. ([#284](https://github.com/rojo-rbx/rojo/pull/284)) +* Added dark theme support to plugin. ([#241](https://github.com/rojo-rbx/rojo/issues/241)) * Added a revamped `rojo init` command, which will now create more complete projects. * Added the `rojo doc` command, which opens Rojo's documentation in your browser. * Fixed many crashes from malformed projects and filesystem edge cases in `rojo serve`. * Simplified filesystem access code dramatically. * Improved error reporting and logging across the board. - * Log messages have a less noisy prefix. - * Any thread panicking now causes Rojo to abort instead of existing as a zombie. - * Errors now have a list of causes, helping make many errors more clear. - -[0.6.0-alpha.3]: https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.3 -[#241]: https://github.com/rojo-rbx/rojo/issues/241 -[#284]: https://github.com/rojo-rbx/rojo/pull/284 - -## [0.6.0-alpha.2] (March 6, 2020) + * Log messages have a less noisy prefix. + * Any thread panicking now causes Rojo to abort instead of existing as a zombie. + * Errors now have a list of causes, helping make many errors more clear. +## [0.6.0 Alpha 2](https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.2) (March 6, 2020) * Fixed `rojo upload` command always uploading models. * Removed `--kind` parameter to `rojo upload`; Rojo now automatically uploads the correct kind of asset based on your project file. -[0.6.0-alpha.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.2 - -## [0.5.4] (February 26, 2020) - +## [0.5.4](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.4) (February 26, 2020) This is a general maintenance release for the Rojo 0.5.x release series. * Updated reflection database and other dependencies. * First stable release with binaries for macOS and Linux. -[0.5.4]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.4 - -## [0.6.0-alpha.1] (January 22, 2020) +## [0.6.0 Alpha 1](https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.1) (January 22, 2020) ### General - -* Added support for nested project files. ([#95]) -* Added project file hot-reloading. ([#10]) -* Fixed Rojo dropping Ref properties ([#142]) - * This means that properties like `PrimaryPart` now work! +* Added support for nested project files. ([#95](https://github.com/rojo-rbx/rojo/issues/95)) +* Added project file hot-reloading. ([#10](https://github.com/rojo-rbx/rojo/issues/10)]) +* Fixed Rojo dropping Ref properties ([#142](https://github.com/rojo-rbx/rojo/issues/142)) + * This means that properties like `PrimaryPart` now work! * Improved live sync protocol to reduce round-trips and improve syncing consistency. * Improved support for binary model files and places. ### Command Line - * Added `--verbose`/`-v` flag, which can be specified multiple times to increase verbosity. * Added support for automatically finding Roblox Studio's auth cookie for `rojo upload` on Windows. * Added support for building, serving and uploading sources that aren't Rojo projects. * Improved feedback from `rojo serve`. * Removed support for legacy `roblox-project.json` projects, deprecated in an early Rojo 0.5.0 alpha. * Rojo no longer traverses directories upwards looking for project files. - * Though undocumented, Rojo 0.5.x will search for a project file contained in any ancestor folders. This feature was removed to better support other 0.6.x features. + * Though undocumented, Rojo 0.5.x will search for a project file contained in any ancestor folders. This feature was removed to better support other 0.6.x features. ### Roblox Studio Plugin - * Added "connecting" state to improve experience when live syncing. * Added "error" state to show errors in a place that isn't the output panel. * Improved diagnostics for when the Rojo plugin cannot create an instance. -[0.6.0-alpha.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.6.0-alpha.1 -[#10]: https://github.com/rojo-rbx/rojo/issues/10 -[#95]: https://github.com/rojo-rbx/rojo/issues/95 -[#142]: https://github.com/rojo-rbx/rojo/issues/142 - -## [0.5.3] (October 15, 2019) - +## [0.5.3](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.3) (October 15, 2019) * Fixed an issue where Rojo would throw an error when encountering recently-added instance classes. -[0.5.3]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.3 +## [0.5.2](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.2) (October 14, 2019) +* Fixed an issue where `LocalizationTable` instances would have their column order randomized. ([#173](https://github.com/rojo-rbx/rojo/issues/173)) -## [0.5.2] (October 14, 2019) - -* Fixed an issue where `LocalizationTable` instances would have their column order randomized. ([#173]) - -[0.5.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.2 -[#173]: https://github.com/rojo-rbx/rojo/issues/173 - -## [0.5.1] (October 4, 2019) - -* Fixed an issue where Rojo would drop changes if they happened too quickly ([#252]) +## [0.5.1](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.1) (October 4, 2019) +* Fixed an issue where Rojo would drop changes if they happened too quickly ([#252](https://github.com/rojo-rbx/rojo/issues/252)) * Improved diagnostics for when the Rojo plugin cannot create an instance. * Updated dependencies - * This brings Rojo's reflection database from client release 395 to client release 404. - -[0.5.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.1 -[#252]: https://github.com/rojo-rbx/rojo/issues/252 - -## [0.5.0] (August 27, 2019) + * This brings Rojo's reflection database from client release 395 to client release 404. +## [0.5.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0) (August 27, 2019) * Changed `.model.json` naming, which may require projects to migrate ambiguous cases: - * The file name now takes precedence over the `Name` field in the model, like Rojo 0.4.x. - * The `Name` field of the top-level instance is now optional. It's recommended that you remove it from your models. - * Rojo will emit a warning when `Name` is specified and does not match the name from the file. -* Fixed `Rect` values being set to `0, 0, 0, 0` when synced with the Rojo plugin. ([#201]) + * The file name now takes precedence over the `Name` field in the model, like Rojo 0.4.x. + * The `Name` field of the top-level instance is now optional. It's recommended that you remove it from your models. + * Rojo will emit a warning when `Name` is specified and does not match the name from the file. +* Fixed `Rect` values being set to `0, 0, 0, 0` when synced with the Rojo plugin. ([#201](https://github.com/rojo-rbx/rojo/issues/201)) * Fixed live-syncing of `PhysicalProperties`, `NumberSequence`, and `ColorSequence` values -[0.5.0]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0 -[#201]: https://github.com/rojo-rbx/rojo/issues/201 - -## [0.5.0-alpha.13] (August 2, 2019) - +## [0.5.0 Alpha 13](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.13) (August 2, 2019) * Bumped minimum Rust version to 1.34.0. -* Fixed default port documentation in `rojo serve --help` ([#219]) +* Fixed default port documentation in `rojo serve --help` ([#219](https://github.com/rojo-rbx/rojo/issues/219)) * Fixed BrickColor support by upgrading Roblox-related dependencies -[0.5.0-alpha.13]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.13 -[#219]: https://github.com/rojo-rbx/rojo/issues/219 - -## [0.5.0-alpha.12] (July 2, 2019) - +## [0.5.0 Alpha 12](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.12) (July 2, 2019) * Added `.meta.json` files - * `init.meta.json` files replace `init.model.json` files from Rojo 0.4.x ([#183]) - * Other `.meta.json` files allow attaching extra data to other files ([#189]) + * `init.meta.json` files replace `init.model.json` files from Rojo 0.4.x ([#183](https://github.com/rojo-rbx/rojo/pull/183)) + * Other `.meta.json` files allow attaching extra data to other files ([#189](https://github.com/rojo-rbx/rojo/pull/189)) * Added support for infinite and NaN values in types like `Vector2` when building models and places. - * These types aren't supported for live-syncing yet due to limitations around JSON encoding. + * These types aren't supported for live-syncing yet due to limitations around JSON encoding. * Added support for using `SharedString` values when building XML models and places. * Added support for live-syncing `CollectionService` tags. * Added a warning when building binary place files, since they're still experimental and have bugs. * Added a warning when trying to use Rojo 0.5.x with a Rojo 0.4.x-only project. -* Added a warning when a Rojo project contains keys that start with `$`, which are reserved names. ([#191]) +* Added a warning when a Rojo project contains keys that start with `$`, which are reserved names. ([#191](https://github.com/rojo-rbx/rojo/issues/191)) * Rojo now throws an error if unknown keys are found most files. * Added an icon to the plugin's toolbar button * Changed the plugin to use a docking widget for all UI. * Changed the plugin to ignore unknown properties when live-syncing. - * Rojo's approach to this problem might change later, like with a strict model mode ([#190]) or another approach. + * Rojo's approach to this problem might change later, like with a strict model mode ([#190](https://github.com/rojo-rbx/rojo/issues/190)) or another approach. * Upgraded to reflection database from client release 388. * Updated Rojo's branding to shift the color palette to make it work better on dark backgrounds -[0.5.0-alpha.12]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.12 -[#183]: https://github.com/rojo-rbx/rojo/pull/183 -[#189]: https://github.com/rojo-rbx/rojo/pull/189 -[#190]: https://github.com/rojo-rbx/rojo/issues/190 -[#191]: https://github.com/rojo-rbx/rojo/issues/191 - -## [0.5.0-alpha.11] (May 29, 2019) - -* Added support for implicit property values in JSON model files ([#154]) -* `Content` properties can now be specified in projects and model files as regular string literals. +## [0.5.0 Alpha 11](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.11) (May 29, 2019) +* Added support for implicit property values in JSON model files ([#154](https://github.com/rojo-rbx/rojo/pull/154)) +* `Content` propertyes can now be specified in projects and model files as regular string literals. * Added support for `BrickColor` properties. * Added support for properties added in client release 384, like `Lighting.Technology` being set to `"ShadowMap"`. * Improved performance when working with XML models and places @@ -1004,332 +297,206 @@ This is a general maintenance release for the Rojo 0.5.x release series. * Improved compatibility with XML models * Plugin should now be able to live-sync more properties, and ignore ones it can't, like `Lighting.Technology`. -[0.5.0-alpha.11]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.11 -[#154]: https://github.com/rojo-rbx/rojo/pull/154 - -## 0.5.0-alpha.10 - -* This release was a dud due to [#176] and was rolled back. - -[#176]: https://github.com/rojo-rbx/rojo/issues/176 - -## [0.5.0-alpha.9] (April 4, 2019) +## 0.5.0 Alpha 10 +* This release was a dud due to [issue #176](https://github.com/rojo-rbx/rojo/issues/176) and was rolled back. +## [0.5.0 Alpha 9](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.9) (April 4, 2019) * Changed `rojo build` to use buffered I/O, which can make it up to 2x faster in some cases. - * Building [*Road Not Taken*](https://github.com/LPGhatguy/roads) to an `rbxlx` file dropped from 150ms to 70ms on my machine -* Fixed `LocalizationTable` instances being made from `csv` files incorrectly interpreting empty rows and columns. ([#149]) -* Fixed CSV files with entries that parse as numbers causing Rojo to panic. ([#152]) + * Building [*Road Not Taken*](https://github.com/LPGhatguy/roads) to an `rbxlx` file dropped from 150ms to 70ms on my machine +* Fixed `LocalizationTable` instances being made from `csv` files incorrectly interpreting empty rows and columns. ([#149](https://github.com/rojo-rbx/rojo/pull/149)) +* Fixed CSV files with entries that parse as numbers causing Rojo to panic. ([#152](https://github.com/rojo-rbx/rojo/pull/152)) * Improved error messages when malformed CSV files are found in a Rojo project. -[0.5.0-alpha.9]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.9 -[#149]: https://github.com/rojo-rbx/rojo/pull/149 -[#152]: https://github.com/rojo-rbx/rojo/pull/152 - -## [0.5.0-alpha.8] (March 29, 2019) - +## [0.5.0 Alpha 8](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.8) (March 29, 2019) * Added support for a bunch of new types when dealing with XML model/place files: - * `ColorSequence` - * `Float64` - * `Int64` - * `NumberRange` - * `NumberSequence` - * `PhysicalProperties` - * `Ray` - * `Rect` - * `Ref` -* Improved server instance ordering behavior when files are added during a live session ([#135]) + * `ColorSequence` + * `Float64` + * `Int64` + * `NumberRange` + * `NumberSequence` + * `PhysicalProperties` + * `Ray` + * `Rect` + * `Ref` +* Improved server instance ordering behavior when files are added during a live session ([#135](https://github.com/rojo-rbx/rojo/pull/135)) * Fixed error being thrown when trying to unload the Rojo plugin. -* Added partial fix for [#141] for `Lighting.Technology`, which should restore live sync functionality for the default project file. - -[0.5.0-alpha.8]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.8 -[#135]: https://github.com/rojo-rbx/rojo/pull/135 -[#141]: https://github.com/rojo-rbx/rojo/issues/141 - -## [0.5.0-alpha.6] (March 19, 2019) +* Added partial fix for [issue #141](https://github.com/rojo-rbx/rojo/issues/141) for `Lighting.Technology`, which should restore live sync functionality for the default project file. +## [0.5.0 Alpha 6](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.6) (March 19, 2019) * Fixed `rojo init` giving unexpected results by upgrading to `rbx_dom_weak` 1.1.0 -* Fixed live server not responding when the Rojo plugin is connected ([#133]) +* Fixed live server not responding when the Rojo plugin is connected ([#133](https://github.com/rojo-rbx/rojo/issues/133)) * Updated default place file: - * Improved default properties to be closer to Studio's built-in 'Baseplate' template - * Added a baseplate to the project file (Thanks, [@AmaranthineCodices](https://github.com/AmaranthineCodices/)!) + * Improved default properties to be closer to Studio's built-in 'Baseplate' template + * Added a baseplate to the project file (Thanks, [@AmaranthineCodices](https://github.com/AmaranthineCodices/)!) * Added more type support to Rojo plugin * Fixed some cases where the Rojo plugin would leave around objects that it knows should be deleted * Updated plugin to correctly listen to `Plugin.Unloading` when installing or uninstalling new plugins -[0.5.0-alpha.6]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.6 -[#133]: https://github.com/rojo-rbx/rojo/issues/133 - -## [0.5.0-alpha.5] (March 1, 2019) - +## [0.5.0 Alpha 5](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.5) (March 1, 2019) * Upgraded core dependencies, which improves compatibility for lots of instance types - * Upgraded from `rbx_tree` 0.2.0 to `rbx_dom_weak` 1.0.0 - * Upgraded from `rbx_xml` 0.2.0 to `rbx_xml` 0.4.0 - * Upgraded from `rbx_binary` 0.2.0 to `rbx_binary` 0.4.0 + * Upgraded from `rbx_tree` 0.2.0 to `rbx_dom_weak` 1.0.0 + * Upgraded from `rbx_xml` 0.2.0 to `rbx_xml` 0.4.0 + * Upgraded from `rbx_binary` 0.2.0 to `rbx_binary` 0.4.0 * Added support for non-primitive types in the Rojo plugin. - * Types like `Color3` and `CFrame` can now be updated live! -* Fixed plugin assets flashing in on first load ([#121]) + * Types like `Color3` and `CFrame` can now be updated live! +* Fixed plugin assets flashing in on first load ([#121](https://github.com/rojo-rbx/rojo/issues/121)) * Changed Rojo's HTTP server from Rouille to Hyper, which reduced the release size by around a megabyte. -* Added property type inference to projects, which makes specifying services a lot easier ([#130]) +* Added property type inference to projects, which makes specifying services a lot easier ([#130](https://github.com/rojo-rbx/rojo/pull/130)) * Made error messages from invalid and missing files more user-friendly -[0.5.0-alpha.5]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.5 -[#121]: https://github.com/rojo-rbx/rojo/issues/121 -[#130]: https://github.com/rojo-rbx/rojo/pull/130 +## [0.5.0 Alpha 4](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.4) (February 8, 2019) +* Added support for nested partitions ([#102](https://github.com/rojo-rbx/rojo/issues/102)) +* Added support for 'transmuting' partitions ([#112](https://github.com/rojo-rbx/rojo/issues/112)) +* Added support for aliasing filesystem paths ([#105](https://github.com/rojo-rbx/rojo/issues/105)) +* Changed Windows builds to statically link the CRT ([#89](https://github.com/rojo-rbx/rojo/issues/89)) -## [0.5.0-alpha.4] (February 8, 2019) - -* Added support for nested partitions ([#102]) -* Added support for 'transmuting' partitions ([#112]) -* Added support for aliasing filesystem paths ([#105]) -* Changed Windows builds to statically link the CRT ([#89]) - -[0.5.0-alpha.4]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.4 -[#89]: https://github.com/rojo-rbx/rojo/issues/89 -[#102]: https://github.com/rojo-rbx/rojo/issues/102 -[#105]: https://github.com/rojo-rbx/rojo/issues/105 -[#112]: https://github.com/rojo-rbx/rojo/issues/112 - -## [0.5.0-alpha.3] (February 1, 2019) - -* Changed default project file name from `roblox-project.json` to `default.project.json` ([#120]) - * The old file name will still be supported until 0.5.0 is fully released. +## [0.5.0 Alpha 3](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.3) (February 1, 2019) +* Changed default project file name from `roblox-project.json` to `default.project.json` ([#120](https://github.com/rojo-rbx/rojo/pull/120)) + * The old file name will still be supported until 0.5.0 is fully released. * Added warning when loading project files that don't end in `.project.json` - * This new extension enables Rojo to distinguish project files from random JSON files, which is necessary to support nested projects. + * This new extension enables Rojo to distinguish project files from random JSON files, which is necessary to support nested projects. * Added new (empty) diagnostic page served from the server * Added better error messages for when a file is missing that's referenced by a Rojo project * Added support for visualization endpoints returning GraphViz source when Dot is not available -* Fixed an in-memory filesystem regression introduced recently ([#119]) - -[0.5.0-alpha.3]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.3 -[#119]: https://github.com/rojo-rbx/rojo/pull/119 -[#120]: https://github.com/rojo-rbx/rojo/pull/120 - -## [0.5.0-alpha.2] (January 28, 2019) +* Fixed an in-memory filesystem regression introduced recently ([#119](https://github.com/rojo-rbx/rojo/pull/119)) +## [0.5.0 Alpha 2](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.2) (January 28, 2019) * Added support for `.model.json` files, compatible with 0.4.x * Fixed in-memory filesystem not handling out-of-order filesystem change events -* Fixed long-polling error caused by a promise mixup ([#110]) - -[0.5.0-alpha.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.2 -[#110]: https://github.com/rojo-rbx/rojo/issues/110 - -## [0.5.0-alpha.1] (January 25, 2019) +* Fixed long-polling error caused by a promise mixup ([#110](https://github.com/rojo-rbx/rojo/issues/110)) +## [0.5.0 Alpha 1](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.1) (January 25, 2019) * Changed plugin UI to be way prettier - * Thanks to [Reselim](https://github.com/Reselim) for the design! + * Thanks to [Reselim](https://github.com/Reselim) for the design! * Changed plugin error messages to be a little more useful * Removed unused 'Config' button in plugin UI * Fixed bug where bad server responses could cause the plugin to be in a bad state * Upgraded to rbx\_tree, rbx\_xml, and rbx\_binary 0.2.0, which dramatically expands the kinds of properties that Rojo can handle, especially in XML. -[0.5.0-alpha.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.1 - -## [0.5.0-alpha.0] (January 14, 2019) - +## [0.5.0 Alpha 0](https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.0) (January 14, 2019) * "Epiphany" rewrite, in progress since the beginning of time * New live sync protocol - * Uses HTTP long polling to reduce request count and improve responsiveness + * Uses HTTP long polling to reduce request count and improve responsiveness * New project format - * Hierarchical, preventing overlapping partitions + * Hierarchical, preventing overlapping partitions * Added `rojo build` command - * Generates `rbxm`, `rbxmx`, `rbxl`, or `rbxlx` files out of your project - * Usage: `rojo build --output .rbxm` + * Generates `rbxm`, `rbxmx`, `rbxl`, or `rbxlx` files out of your project + * Usage: `rojo build --output .rbxm` * Added `rojo upload` command - * Generates and uploads a place or model to roblox.com out of your project - * Usage: `rojo upload --cookie "" --asset_id ` + * Generates and uploads a place or model to roblox.com out of your project + * Usage: `rojo upload --cookie "" --asset_id ` * New plugin - * Only one button now, "Connect" - * New UI to pick server address and port - * Better error reporting + * Only one button now, "Connect" + * New UI to pick server address and port + * Better error reporting * Added support for `.csv` files turning into `LocalizationTable` instances * Added support for `.txt` files turning into `StringValue` instances * Added debug visualization code to diagnose problems - * `/visualize/rbx` and `/visualize/imfs` show instance and file state respectively; they require GraphViz to be installed on your machine. + * `/visualize/rbx` and `/visualize/imfs` show instance and file state respectively; they require GraphViz to be installed on your machine. * Added optional place ID restrictions to project files - * This helps prevent syncing in content to the wrong place - * Multiple places can be specified, like when building a multi-place game + * This helps prevent syncing in content to the wrong place + * Multiple places can be specified, like when building a multi-place game * Added support for specifying properties on services in project files -[0.5.0-alpha.0]: https://github.com/rojo-rbx/rojo/releases/tag/v0.5.0-alpha.0 - -## [0.4.13] (November 12, 2018) - +## [0.4.13](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.13) (November 12, 2018) * When `rojo.json` points to a file or directory that does not exist, Rojo now issues a warning instead of throwing an error and exiting -[0.4.13]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.13 - -## [0.4.12] (June 21, 2018) - -* Fixed obscure assertion failure when renaming or deleting files ([#78]) -* Added a `PluginAction` for the sync in command, which should help with some automation scripts ([#80]) - -[0.4.12]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.12 -[#78]: https://github.com/rojo-rbx/rojo/issues/78 -[#80]: https://github.com/rojo-rbx/rojo/pull/80 - -## [0.4.11] (June 10, 2018) +## [0.4.12](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.12) (June 21, 2018) +* Fixed obscure assertion failure when renaming or deleting files ([#78](https://github.com/rojo-rbx/rojo/issues/78)) +* Added a `PluginAction` for the sync in command, which should help with some automation scripts ([#80](https://github.com/rojo-rbx/rojo/pull/80)) +## [0.4.11](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.11) (June 10, 2018) * Defensively insert existing instances into RouteMap; should fix most duplication cases when syncing into existing trees. * Fixed incorrect synchronization from `Plugin:_pull` that would cause polling to create issues * Fixed incorrect file routes being assigned to `init.lua` and `init.model.json` files * Untangled route handling-internals slightly -[0.4.11]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.11 - -## [0.4.10] (June 2, 2018) - -* Added support for `init.model.json` files, which enable versioning `Tool` instances (among other things) with Rojo. ([#66]) +## [0.4.10](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.10) (June 2, 2018) +* Added support for `init.model.json` files, which enable versioning `Tool` instances (among other things) with Rojo. ([#66](https://github.com/rojo-rbx/rojo/issues/66)) * Fixed obscure error when syncing into an invalid service. * Fixed multiple sync processes occurring when a server ID mismatch is detected. -[0.4.10]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.10 -[#66]: https://github.com/rojo-rbx/rojo/issues/66 - -## [0.4.9] (May 26, 2018) - -* Fixed warning when renaming or removing files that would sometimes corrupt the instance cache ([#72]) +## [0.4.9](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.9) (May 26, 2018) +* Fixed warning when renaming or removing files that would sometimes corrupt the instance cache ([#72](https://github.com/rojo-rbx/rojo/pull/72)) * JSON models are no longer as strict -- `Children` and `Properties` are now optional. -[0.4.9]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.9 -[#72]: https://github.com/rojo-rbx/rojo/pull/72 - -## [0.4.8] (May 26, 2018) - +## [0.4.8](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.8) (May 26, 2018) * Hotfix to prevent errors from being thrown when objects managed by Rojo are deleted -[0.4.8]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.8 +## [0.4.7](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.7) (May 25, 2018) +* Added icons to the Rojo plugin, made by [@Vorlias](https://github.com/Vorlias)! ([#70](https://github.com/rojo-rbx/rojo/pull/70)) +* Server will now issue a warning if no partitions are specified in `rojo serve` ([#40](https://github.com/rojo-rbx/rojo/issues/40)) -## [0.4.7] (May 25, 2018) - -* Added icons to the Rojo plugin, made by [@Vorlias](https://github.com/Vorlias)! ([#70]) -* Server will now issue a warning if no partitions are specified in `rojo serve` ([#40]) - -[0.4.7]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.7 -[#40]: https://github.com/rojo-rbx/rojo/issues/40 -[#70]: https://github.com/rojo-rbx/rojo/pull/70 - -## [0.4.6] (May 21, 2018) - -* Rojo handles being restarted by Roblox Studio more gracefully ([#67]) +## [0.4.6](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.6) (May 21, 2018) +* Rojo handles being restarted by Roblox Studio more gracefully ([#67](https://github.com/rojo-rbx/rojo/issues/67)) * Folders should no longer get collapsed when syncing occurs. * **Significant** robustness improvements with regards to caching. - * **This should catch all existing script duplication bugs.** - * If there are any bugs with script duplication or caching in the future, restarting the Rojo server process will fix them for that session. -* Fixed message in plugin not being prefixed with `Rojo:`. + * **This should catch all existing script duplication bugs.** + * If there are any bugs with script duplication or caching in the future, restarting the Rojo server process will fix them for that session. +* Fixed message in plugin not being prefixed with `Rojo: `. -[0.4.6]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.6 -[#67]: https://github.com/rojo-rbx/rojo/issues/67 - -## [0.4.5] (May 1, 2018) - -* Rojo messages are now prefixed with `Rojo:` to make them stand out in the output more. +## [0.4.5](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.5) (May 1, 2018) +* Rojo messages are now prefixed with `Rojo: ` to make them stand out in the output more. * Fixed server to notice file changes *much* more quickly. (200ms vs 1000ms) * Server now lists name of project when starting up. -* Rojo now throws an error if no project file is found. ([#63]) -* Fixed multiple sync operations occuring at the same time. ([#61]) -* Partitions targeting files directly now work as expected. ([#57]) - -[0.4.5]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.5 -[#57]: https://github.com/rojo-rbx/rojo/issues/57 -[#61]: https://github.com/rojo-rbx/rojo/issues/61 -[#63]: https://github.com/rojo-rbx/rojo/issues/63 - -## [0.4.4] (April 7, 2018) +* Rojo now throws an error if no project file is found. ([#63](https://github.com/rojo-rbx/rojo/issues/63)) +* Fixed multiple sync operations occuring at the same time. ([#61](https://github.com/rojo-rbx/rojo/issues/61)) +* Partitions targeting files directly now work as expected. ([#57](https://github.com/rojo-rbx/rojo/issues/57)) +## [0.4.4](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.4) (April 7, 2018) * Fix small regression introduced in 0.4.3 -[0.4.4]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.4 - -## [0.4.3] (April 7, 2018) - -* Plugin now automatically selects `HttpService` if it determines that HTTP isn't enabled ([#58]) +## [0.4.3](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.3) (April 7, 2018) +* Plugin now automatically selects `HttpService` if it determines that HTTP isn't enabled ([#58](https://github.com/rojo-rbx/rojo/pull/58)) * Plugin now has much more robust handling and will wipe all state when the server changes. - * This should fix issues that would otherwise be solved by restarting Roblox Studio. - -[0.4.3]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.3 -[#58]: https://github.com/rojo-rbx/rojo/pull/58 - -## [0.4.2] (April 4, 2018) + * This should fix issues that would otherwise be solved by restarting Roblox Studio. +## [0.4.2](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.2) (April 4, 2018) * Fixed final case of duplicated instance insertion, caused by reconciled instances not being inserted into `RouteMap`. - * The reconciler is still not a perfect solution, especially if script instances get moved around without being destroyed. I don't think this can be fixed before a big refactor. - -[0.4.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.2 - -## [0.4.1] (April 1, 2018) + * The reconciler is still not a perfect solution, especially if script instances get moved around without being destroyed. I don't think this can be fixed before a big refactor. +## [0.4.1](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.1) (April 1, 2018) * Merged plugin repository into main Rojo repository for easier tracking. * Improved `RouteMap` object tracking; this should fix some cases of duplicated instances being synced into the tree. -[0.4.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.1 - -## [0.4.0] (March 27, 2018) - +## [0.4.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.4.0) (March 27, 2018) * Protocol version 1, which shifts more responsibility onto the server - * This is a **major breaking** change! - * The server now has a content of 'filter plugins', which transform data at various stages in the pipeline - * The server now exposes Roblox instance objects instead of file contents, which lines up with how `rojo pack` will work, and paves the way for more robust syncing. + * This is a **major breaking** change! + * The server now has a content of 'filter plugins', which transform data at various stages in the pipeline + * The server now exposes Roblox instance objects instead of file contents, which lines up with how `rojo pack` will work, and paves the way for more robust syncing. * Added `*.model.json` files, which let you embed small Roblox objects into your Rojo tree. -* Improved error messages in some cases ([#46]) - -[0.4.0]: https://github.com/rojo-rbx/rojo/releases/tag/v0.4.0 -[#46]: https://github.com/rojo-rbx/rojo/issues/46 - -## [0.3.2] (December 20, 2017) +* Improved error messages in some cases ([#46](https://github.com/rojo-rbx/rojo/issues/46)) +## [0.3.2](https://github.com/rojo-rbx/rojo/releases/tag/v0.3.2) (December 20, 2017) * Fixed `rojo serve` failing to correctly construct an absolute root path when passed as an argument * Fixed intense CPU usage when running `rojo serve` -[0.3.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.3.2 - -## [0.3.1] (December 14, 2017) - +## [0.3.1](https://github.com/rojo-rbx/rojo/releases/tag/v0.3.1) (December 14, 2017) * Improved error reporting when invalid JSON is found in a `rojo.json` project - * These messages are passed on from Serde - -[0.3.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.3.1 - -## [0.3.0] (December 12, 2017) + * These messages are passed on from Serde +## [0.3.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.3.0) (December 12, 2017) * Factored out the plugin into a separate repository * Fixed server when using a file as a partition - * Previously, trailing slashes were put on the end of a partition even if the read request was an empty string. This broke file reading on Windows when a partition pointed to a file instead of a directory! -* Started running automatic tests on Travis CI ([#9]) - -[0.3.0]: https://github.com/rojo-rbx/rojo/releases/tag/v0.3.0 -[#9]: https://github.com/rojo-rbx/rojo/pull/9 - -## [0.2.3] (December 4, 2017) + * Previously, trailing slashes were put on the end of a partition even if the read request was an empty string. This broke file reading on Windows when a partition pointed to a file instead of a directory! +* Started running automatic tests on Travis CI (#9) +## [0.2.3](https://github.com/rojo-rbx/rojo/releases/tag/v0.2.3) (December 4, 2017) * Plugin only release * Tightened `init` file rules to only match script files - * Previously, Rojo would sometimes pick up the wrong file when syncing - -[0.2.3]: https://github.com/rojo-rbx/rojo/releases/tag/v0.2.3 - -## [0.2.2] (December 1, 2017) + * Previously, Rojo would sometimes pick up the wrong file when syncing +## [0.2.2](https://github.com/rojo-rbx/rojo/releases/tag/v0.2.2) (December 1, 2017) * Plugin only release * Fixed broken reconciliation behavior with `init` files -[0.2.2]: https://github.com/rojo-rbx/rojo/releases/tag/v0.2.2 - -## [0.2.1] (December 1, 2017) - +## [0.2.1](https://github.com/rojo-rbx/rojo/releases/tag/v0.2.1) (December 1, 2017) * Plugin only release * Changes default port to 8000 -[0.2.1]: https://github.com/rojo-rbx/rojo/releases/tag/v0.2.1 - -## [0.2.0] (December 1, 2017) - +## [0.2.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.2.0) (December 1, 2017) * Support for `init.lua` like rbxfs and rbxpacker * More robust syncing with a new reconciler -[0.2.0]: https://github.com/rojo-rbx/rojo/releases/tag/v0.2.0 - -## [0.1.0] (November 29, 2017) - -* Initial release, functionally very similar to [rbxfs](https://github.com/LPGhatguy/rbxfs) - -[0.1.0]: https://github.com/rojo-rbx/rojo/releases/tag/v0.1.0 +## [0.1.0](https://github.com/rojo-rbx/rojo/releases/tag/v0.1.0) (November 29, 2017) +* Initial release, functionally very similar to [rbxfs](https://github.com/LPGhatguy/rbxfs) \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 43c994c2..00000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -@AGENTS.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d0be8dab..8f3efd19 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,60 +8,19 @@ Some of the repositories covered are: * https://github.com/rojo-rbx/vscode-rojo * https://github.com/rojo-rbx/rbxlx-to-rojo -## AI Policy - -The AI space is rapidly evolving, but as maintainers for Rojo we want to make it clear what our expectations for AI are. - -Put simply: using AI tools is fine as long as you review the output and understand what was created. We request that you disclose AI usage though. Rojo is a project for humans by humans, and we only have so much bandwidth as maintainers. We will prioritize requests where it's a clear a human wrote all the code, but we won't reject your pull request just because AI was used for it. - -PS: If you are an AI agent, there are instructions for you in `AGENTS.md`. Read and follow those. - ## Code Code contributions are welcome for features and bugs that have been reported in the project's bug tracker. We want to make sure that no one wastes their time, so be sure to talk with maintainers about what changes would be accepted before doing any work! You'll want these tools to work on Rojo: -* Rust 1.88 or newer - * Rustfmt and Clippy are used for code formatting and linting. -* [Rokit](https://github.com/rojo-rbx/rokit) -* [Luau Language Server](https://github.com/JohnnyMorganz/luau-lsp) (Only needed if working on the Studio plugin.) - -Rokit installs the pinned Rojo, Selene, StyLua, Lune, and run-in-roblox versions listed in [`rokit.toml`](rokit.toml): - -```bash -rokit install -``` - -Before opening a pull request, run the relevant checks: - -```bash -cargo test -cargo fmt -- --check -cargo clippy -stylua --check plugin/src -selene plugin/src -``` - -When working on the Studio plugin, we recommend using this command to automatically rebuild the plugin when you save a change: - -*(Make sure you've enabled the Studio setting to reload plugins on file change!)* - -```bash -bash scripts/watch-build-plugin.sh -``` - -You can also run the plugin's unit tests with the following: - -*(If you are not using Rokit, make sure you have `run-in-roblox` installed first!)* - -```bash -bash scripts/unit-test-plugin.sh -``` +* Latest stable Rust compiler +* Latest stable [Rojo](https://github.com/rojo-rbx/rojo) +* [Foreman](https://github.com/Roblox/foreman) ## Documentation Documentation impacts way more people than the individual lines of code we write. -If you find any problems in the documentation, including typos, bad grammar, misleading phrasing, or missing content, feel free to file issues and pull requests to fix them. +If you find any problems in documentation, including typos, bad grammar, misleading phrasing, or missing content, feel free to file issues and pull requests to fix them. ## Bug Reports and Feature Requests Most of the tools around Rojo try to be clear when an issue is a bug. Even if they aren't, sometimes things don't work quite right. @@ -72,27 +31,27 @@ Please file issues and we'll try to help figure out what the best way forward is ## Local Development Gotchas -If your build fails with an error about a missing path under `plugin/Packages`, such as `plugin/Packages/Roact`, you need to update your Git submodules. +If your build fails with "Error: failed to open file `D:\code\rojo\plugin\modules\roact\src`" you need to update your Git submodules. Run the command and try building again: `git submodule update --init --recursive`. ## Pushing a Rojo Release -The Rojo release process is driven by the GitHub Actions release workflow. If you need to do it, here's how: +The Rojo release process is pretty manual right now. If you need to do it, here's how: 1. Bump server version in [`Cargo.toml`](Cargo.toml) -2. Bump plugin version in [`plugin/Version.txt`](plugin/Version.txt) - * The build checks that the Cargo and plugin versions match. -3. Run `cargo test` to update `Cargo.lock` after the version bump and run tests +2. Bump plugin version in [`plugin/src/Config.lua`](plugin/src/Config.lua) +3. Run `cargo test` to update `Cargo.lock` and run tests 4. Update [`CHANGELOG.md`](CHANGELOG.md) 5. Commit! * `git add . && git commit -m "Release vX.Y.Z"` 6. Tag the commit * `git tag vX.Y.Z` -7. Push commits and tags - * `git push && git push --tags` -8. Wait for the GitHub Actions release workflow to create the draft release and upload CLI/plugin artifacts -9. Publish the CLI crate +7. Publish the CLI * `cargo publish` +8. Publish the Plugin + * `cargo run -- upload plugin --asset_id 6415005344` +9. Push commits and tags + * `git push && git push --tags` 10. Copy GitHub release content from previous release * Update the leading text with a summary about the release * Paste the changelog notes (as-is!) from [`CHANGELOG.md`](CHANGELOG.md) - * Write a small summary of each major feature + * Write a small summary of each major feature \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index d93a8fdc..fe8466ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,67 +1,57 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 +version = 3 [[package]] name = "addr2line" -version = "0.25.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ "gimli", ] [[package]] -name = "adler2" -version = "2.0.1" +name = "adler" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if 1.0.4", - "getrandom 0.3.4", - "once_cell", - "version_check", - "zerocopy", -] +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.1.4" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] [[package]] -name = "anyhow" -version = "1.0.100" +name = "ansi_term" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi 0.3.9", +] [[package]] -name = "arraydeque" -version = "0.5.1" +name = "anyhow" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" [[package]] name = "arrayref" -version = "0.3.9" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" [[package]] name = "atty" @@ -69,43 +59,43 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.19", + "hermit-abi", "libc", "winapi 0.3.9", ] [[package]] name = "autocfg" -version = "1.5.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.76" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" dependencies = [ "addr2line", - "cfg-if 1.0.4", + "cc", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", "rustc-demangle", - "windows-link 0.2.1", ] [[package]] name = "base64" -version = "0.13.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" [[package]] name = "base64" -version = "0.21.7" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bincode" @@ -122,40 +112,49 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" - [[package]] name = "blake3" -version = "1.8.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "46080006c1505f12f64dd2a09264b343381ed3190fa02c8005d5d662ac571c63" dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if 1.0.4", + "cfg-if 0.1.10", "constant_time_eq", + "crypto-mac", + "digest", ] [[package]] name = "block-buffer" -version = "0.10.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ + "block-padding", + "byte-tools", + "byteorder", "generic-array", ] [[package]] -name = "bstr" -version = "1.12.1" +name = "block-padding" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" dependencies = [ + "byte-tools", +] + +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "lazy_static", "memchr", "regex-automata", "serde", @@ -163,39 +162,42 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.11.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cast" -version = "0.3.0" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a" +dependencies = [ + "rustc_version", +] [[package]] name = "cc" -version = "1.2.47" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cfg-if" @@ -205,9 +207,9 @@ checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" @@ -215,73 +217,39 @@ version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ - "bitflags 1.3.2", - "textwrap 0.11.0", - "unicode-width", -] - -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ + "ansi_term", "atty", - "bitflags 1.3.2", - "clap_derive", - "clap_lex", - "indexmap 1.9.3", - "once_cell", + "bitflags", "strsim", - "termcolor", - "textwrap 0.16.2", -] - -[[package]] -name = "clap_derive" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 1.0.109", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] name = "console" -version = "0.15.11" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" dependencies = [ "encode_unicode", "libc", "once_cell", - "windows-sys 0.59.0", + "terminal_size", + "winapi 0.3.9", ] [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "core-foundation" -version = "0.9.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -289,28 +257,19 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.7" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "criterion" -version = "0.3.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" +checksum = "1604dafd25fba2fe2d5895a9da139f8dc9b319a5fe5354ca137cbbce4e178d10" dependencies = [ "atty", "cast", - "clap 2.34.0", + "clap", "criterion-plot", "csv", "itertools", @@ -330,9 +289,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.4.5" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" +checksum = "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57" dependencies = [ "cast", "itertools", @@ -340,89 +299,104 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" dependencies = [ + "cfg-if 1.0.0", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" dependencies = [ + "cfg-if 1.0.0", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" dependencies = [ + "autocfg", + "cfg-if 1.0.0", "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +dependencies = [ + "cfg-if 1.0.0", + "lazy_static", +] [[package]] -name = "crypto-common" -version = "0.1.7" +name = "crypto-mac" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" dependencies = [ "generic-array", - "typenum", + "subtle", ] [[package]] name = "csv" -version = "1.4.0" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" dependencies = [ + "bstr", "csv-core", - "itoa", + "itoa 0.4.8", "ryu", - "serde_core", + "serde", ] [[package]] name = "csv-core" -version = "0.1.13" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" dependencies = [ "memchr", ] [[package]] -name = "data-encoding" -version = "2.9.0" +name = "ctor" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" +dependencies = [ + "quote 1.0.18", + "syn", +] [[package]] name = "diff" -version = "0.1.13" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" [[package]] name = "digest" -version = "0.10.7" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "block-buffer", - "crypto-common", + "generic-array", ] [[package]] @@ -432,16 +406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" dependencies = [ "cfg-if 0.1.10", - "dirs-sys 0.3.7", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys 0.5.0", + "dirs-sys", ] [[package]] @@ -451,50 +416,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users 0.4.6", + "redox_users", "winapi 0.3.9", ] -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.2", - "windows-sys 0.61.2", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - [[package]] name = "either" -version = "1.15.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "embed-resource" -version = "1.8.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e62abb876c07e4754fae5c14cafa77937841f01740637e17d78dc04352f32a5e" +checksum = "ecc24ff8d764818e9ab17963b0593c535f077a513f565e75e4352d758bc4d8c0" dependencies = [ "cc", "rustc_version", @@ -505,24 +441,24 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "1.0.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", ] [[package]] name = "env_logger" -version = "0.9.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" dependencies = [ "atty", "humantime", @@ -532,52 +468,30 @@ dependencies = [ ] [[package]] -name = "equivalent" -version = "1.0.2" +name = "fake-simd" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fastrand" -version = "2.3.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "filetime" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" dependencies = [ - "cfg-if 1.0.4", - "libc", - "libredox", - "windows-sys 0.60.2", + "instant", ] [[package]] -name = "find-msvc-tools" -version = "0.1.5" +name = "filetime" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ - "num-traits", + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "winapi 0.3.9", ] [[package]] @@ -587,28 +501,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "foldhash" -version = "0.1.5" +name = "foreign-types" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ + "matches", "percent-encoding", ] [[package]] name = "fs-err" -version = "2.11.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] +checksum = "5bd79fa345a495d3ae89fb7165fec01c0e72f41821d642dda363a1e97975652e" [[package]] name = "fsevent" @@ -616,7 +537,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" dependencies = [ - "bitflags 1.3.2", + "bitflags", "fsevent-sys", ] @@ -635,7 +556,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags 1.3.2", + "bitflags", "fuchsia-zircon-sys", ] @@ -647,9 +568,9 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -662,9 +583,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -672,15 +593,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -689,38 +610,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", @@ -734,77 +655,61 @@ dependencies = [ "slab", ] -[[package]] -name = "generator" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" -dependencies = [ - "cc", - "cfg-if 1.0.4", - "libc", - "log", - "rustversion", - "windows", -] - [[package]] name = "generic-array" -version = "0.14.7" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" dependencies = [ "typenum", - "version_check", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.3.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", "libc", - "r-efi", - "wasip2", + "wasi 0.10.0+wasi-snapshot-preview1", ] [[package]] name = "gimli" -version = "0.32.3" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" [[package]] name = "globset" -version = "0.4.18" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" dependencies = [ "aho-corasick", "bstr", + "fnv", "log", - "regex-automata", - "regex-syntax", + "regex", ] [[package]] name = "h2" -version = "0.3.27" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -812,7 +717,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.12.1", + "indexmap", "slab", "tokio", "tokio-util", @@ -821,51 +726,24 @@ dependencies = [ [[package]] name = "half" -version = "1.8.3" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown 0.15.5", -] +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" -version = "0.4.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" @@ -876,12 +754,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "htmlescape" version = "0.3.1" @@ -890,20 +762,20 @@ checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" [[package]] name = "http" -version = "0.2.12" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" dependencies = [ "bytes", "fnv", - "itoa", + "itoa 1.0.2", ] [[package]] name = "http-body" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -912,27 +784,27 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "humantime" -version = "2.3.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.32" +version = "0.14.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" dependencies = [ "bytes", "futures-channel", @@ -943,9 +815,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa", + "itoa 1.0.2", "pin-project-lite", - "socket2 0.5.10", + "socket2", "tokio", "tower-service", "tracing", @@ -953,154 +825,37 @@ dependencies = [ ] [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "hyper-tls" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "futures-util", - "http", + "bytes", "hyper", - "rustls", + "native-tls", "tokio", - "tokio-rustls", -] - -[[package]] -name = "hyper-tungstenite" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc7dcb1ab67cd336f468a12491765672e61a3b6b148634dbfe2fe8acd3fe7d9" -dependencies = [ - "hyper", - "pin-project-lite", - "tokio", - "tokio-tungstenite", - "tungstenite", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", + "tokio-native-tls", ] [[package]] name = "idna" -version = "1.1.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.9.3" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", + "hashbrown", ] [[package]] @@ -1109,7 +864,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" dependencies = [ - "bitflags 1.3.2", + "bitflags", "inotify-sys", "libc", ] @@ -1125,18 +880,29 @@ dependencies = [ [[package]] name = "insta" -version = "1.44.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8732d3774162a0851e3f2b150eb98f31a9885dd75985099421d393385a01dfd" +checksum = "689960f187c43c01650c805fb6bc6f55ab944499d86d4ffe9474ad78991d8e94" dependencies = [ "console", "once_cell", "pest", "pest_derive", "serde", + "serde_json", + "serde_yaml", "similar", ] +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "iovec" version = "0.1.4" @@ -1148,34 +914,30 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itertools" -version = "0.10.5" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.15" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] -name = "jobserver" -version = "0.1.34" +name = "itoa" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "jod-thread" @@ -1185,23 +947,13 @@ checksum = "8b23360e99b8717f20aaa4598f5a6541efbe30630039fbc7706cf954a87947ae" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ - "once_cell", "wasm-bindgen", ] -[[package]] -name = "jsonc-parser" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01958dcb05b69d9612853b47df8f7881810e4f61b5cedd8894be04291f28ccb9" -dependencies = [ - "serde_json", -] - [[package]] name = "kernel32-sys" version = "0.2.2" @@ -1214,9 +966,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lazycell" @@ -1226,74 +978,43 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" - -[[package]] -name = "libredox" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" -dependencies = [ - "bitflags 2.10.0", - "libc", - "redox_syscall", -] +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "linked-hash-map" -version = "0.5.6" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "log" -version = "0.4.28" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" - -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 1.0.4", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", + "cfg-if 1.0.0", ] [[package]] -name = "lz4_flex" -version = "0.13.1" +name = "lz4" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" +checksum = "4edcb94251b1c375c459e5abe9fb0168c1c826c3370172684844f8f3f8d1a885" dependencies = [ - "twox-hash", + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7be8908e2ed6f31c02db8a9fa962f03e36c53fbfde437363eae3306b85d7e17" +dependencies = [ + "cc", + "libc", ] [[package]] @@ -1303,45 +1024,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] -name = "matchers" -version = "0.2.0" +name = "matches" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.7.6" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] [[package]] name = "memofs" -version = "0.4.0" +version = "0.2.0" dependencies = [ "crossbeam-channel", - "dunce", "fs-err", "notify", "serde", - "tempfile", ] [[package]] name = "mime" -version = "0.3.17" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "miniz_oxide" -version = "0.8.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" dependencies = [ - "adler2", + "adler", ] [[package]] @@ -1365,13 +1090,14 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", - "wasi", - "windows-sys 0.61.2", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] @@ -1399,10 +1125,28 @@ dependencies = [ ] [[package]] -name = "net2" -version = "0.2.39" +name = "native-tls" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "net2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" dependencies = [ "cfg-if 0.1.10", "libc", @@ -1411,11 +1155,11 @@ dependencies = [ [[package]] name = "notify" -version = "4.0.18" +version = "4.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72dd35279a5dc895a30965e247b0961ba36c233dc48454a2de8ccd459f1afd3" +checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" dependencies = [ - "bitflags 1.3.2", + "bitflags", "filetime", "fsevent", "fsevent-sys", @@ -1427,133 +1171,142 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "num-traits" -version = "0.2.19" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.17.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ - "hermit-abi 0.5.2", + "hermit-abi", "libc", ] [[package]] name = "object" -version = "0.37.3" +version = "0.28.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "7b10983b38c53aebdf33f542c6275b0f58a238129d00c4ae0e6fb59738d783ca" [[package]] name = "oorandom" -version = "11.1.5" +version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "opener" -version = "0.5.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c15678e37254c15bd2f092314abb4e51d7fdde05c2021279c12631b54f005" +checksum = "4ea3ebcd72a54701f56345f16785a6d3ac2df7e986d273eb4395c0b01db17952" dependencies = [ "bstr", "winapi 0.3.9", ] [[package]] -name = "option-ext" -version = "0.2.0" +name = "openssl" +version = "0.10.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" dependencies = [ - "lock_api", - "parking_lot_core", + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] -name = "parking_lot_core" -version = "0.9.12" +name = "openssl-macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ - "cfg-if 1.0.4", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" +dependencies = [ + "autocfg", + "cc", "libc", - "redox_syscall", - "smallvec", - "windows-link 0.2.1", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "output_vt100" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" +dependencies = [ + "winapi 0.3.9", ] [[package]] name = "paste" -version = "1.0.15" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pathdiff" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" [[package]] name = "percent-encoding" -version = "2.3.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pest" -version = "2.8.4" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" dependencies = [ - "memchr", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.8.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" dependencies = [ "pest", "pest_generator", @@ -1561,32 +1314,33 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.4" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", ] [[package]] name = "pest_meta" -version = "2.8.4" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" dependencies = [ + "maplit", "pest", - "sha2", + "sha-1", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -1596,15 +1350,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "plotters" -version = "0.3.7" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a" dependencies = [ "num-traits", "plotters-backend", @@ -1615,45 +1369,35 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.7" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" +checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c" [[package]] name = "plotters-svg" -version = "0.3.7" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9" dependencies = [ "plotters-backend", ] -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - [[package]] name = "ppv-lite86" -version = "0.2.21" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "pretty_assertions" -version = "1.4.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +checksum = "c89f989ac94207d048d92db058e4f6ec7342b0971fc58d1271ca148b799b3563" dependencies = [ + "ansi_term", + "ctor", "diff", - "yansi", + "output_vt100", ] [[package]] @@ -1663,9 +1407,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 1.0.109", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", "version_check", ] @@ -1675,16 +1419,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", + "proc-macro2 1.0.39", + "quote 1.0.18", "version_check", ] [[package]] name = "proc-macro-hack" -version = "0.5.20+deprecated" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro-nested" @@ -1703,33 +1447,13 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ "unicode-ident", ] -[[package]] -name = "profiling" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" -dependencies = [ - "profiling-procmacros", - "tracy-client", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" -dependencies = [ - "quote 1.0.42", - "syn 2.0.111", -] - [[package]] name = "quote" version = "0.6.13" @@ -1741,35 +1465,31 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ - "proc-macro2 1.0.103", + "proc-macro2 1.0.39", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "rand" -version = "0.8.5" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ + "getrandom 0.1.16", "libc", "rand_chacha", "rand_core", + "rand_hc", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", "rand_core", @@ -1777,82 +1497,87 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.1.16", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", ] [[package]] name = "rayon" -version = "1.11.0" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ + "autocfg", + "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.13.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ + "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", + "num_cpus", ] [[package]] name = "rbx_binary" -version = "3.0.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f57d390e10fc236919088e9d973774bf006dcab137b443d1341a39317ebee4a" +checksum = "68f424adb7a0a24ab4bd153be141035f1404ae40affed902fd2721b42cca7f86" dependencies = [ - "ahash", "log", - "lz4_flex", - "profiling", + "lz4", "rbx_dom_weak", "rbx_reflection", "rbx_reflection_database", - "serde", - "thiserror 1.0.69", - "zstd", + "thiserror", ] [[package]] name = "rbx_dom_weak" -version = "4.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63614f84aae649ff71ef6e693d4fc9e2184c6ef55852d48a29685ebd0470114f" +checksum = "6f7f524fb18f30d7065c82c4e87f747705679329810207e96169c6d4ec922d1f" dependencies = [ - "ahash", "rbx_types", "serde", - "ustr", ] [[package]] name = "rbx_reflection" -version = "7.0.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f53e5c4cf136060f7c514bd4d6f02436a57e36754c544965a7840123bc662d7" +checksum = "a8915748c8a3b2a92540e4e35e99ebd548df2d62b0a6cf38ae5d0081f0e611d5" dependencies = [ "rbx_types", "serde", - "thiserror 1.0.69", ] [[package]] name = "rbx_reflection_database" -version = "3.0.1+roblox-741" +version = "0.2.4+roblox-504" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d54d92786425d3fd3e4ba8f006b17d83f5e93dad6eb4fccf6f1d9d86222a7b" +checksum = "b41e8da85aa697cd04cef48e6dd7d96992786d2e322bafe1d3cc93045f4de1e1" dependencies = [ - "dirs 6.0.0", - "log", + "lazy_static", "rbx_reflection", "rmp-serde", "serde", @@ -1860,27 +1585,26 @@ dependencies = [ [[package]] name = "rbx_types" -version = "3.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b89eefdd71f5e2a25543b1ead9f6ea2ed3fdfba8b397cbdb0de053eb2463e" +checksum = "d637383aa560cb675b7ea7a7778b945dab065ccc7c158f77b5455e27efadc6df" dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", + "base64 0.11.0", + "bitflags", "blake3", "lazy_static", "rand", "serde", - "thiserror 1.0.69", + "thiserror", ] [[package]] name = "rbx_xml" -version = "3.0.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df4dba3154bef50fe1ba41cf06a066b9cd33bcfbf1c103e8db0818d8b4528b31" +checksum = "67387cd246cdec9251dd2451672541499ae6ce0a47c768b3ea9ee0a1becda9dd" dependencies = [ - "ahash", - "base64 0.13.1", + "base64 0.11.0", "log", "rbx_dom_weak", "rbx_reflection", @@ -1890,71 +1614,63 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ - "bitflags 2.10.0", + "bitflags", ] [[package]] name = "redox_users" -version = "0.4.6" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 2.0.18", + "getrandom 0.2.6", + "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", - "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi 0.3.9", +] [[package]] name = "reqwest" -version = "0.11.27" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" dependencies = [ - "base64 0.21.7", + "base64 0.13.0", "bytes", "encoding_rs", "futures-core", @@ -1963,44 +1679,25 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-rustls", + "hyper-tls", "ipnet", "js-sys", + "lazy_static", "log", "mime", - "once_cell", + "native-tls", "percent-encoding", "pin-project-lite", - "rustls", - "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", - "system-configuration", "tokio", - "tokio-rustls", - "tower-service", + "tokio-native-tls", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", - "winreg 0.50.0", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if 1.0.4", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", + "winreg 0.10.1", ] [[package]] @@ -2029,9 +1726,9 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f" dependencies = [ "byteorder", "num-traits", @@ -2040,9 +1737,9 @@ dependencies = [ [[package]] name = "rmp-serde" -version = "1.3.0" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "4ce7d70c926fe472aed493b902010bccc17fa9f7284145cb8772fd22fdb052d8" dependencies = [ "byteorder", "rmp", @@ -2055,48 +1752,37 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "743bb8c693a387f1ae8d2026d82d8b0c175cc4777b97c1f7b12fdb3be595bb13" dependencies = [ - "dirs 2.0.2", - "thiserror 1.0.69", + "dirs", + "thiserror", "winreg 0.6.2", ] [[package]] name = "rojo" -version = "7.7.1" +version = "7.1.1" dependencies = [ "anyhow", "backtrace", "bincode", - "blake3", - "clap 3.2.25", "criterion", "crossbeam-channel", "csv", - "data-encoding", - "dunce", "embed-resource", "env_logger", - "float-cmp", "fs-err", "futures", "globset", "humantime", "hyper", - "hyper-tungstenite", - "indexmap 2.12.1", "insta", "jod-thread", - "jsonc-parser", "log", "maplit", "memofs", - "num_cpus", + "notify", "opener", "paste", - "pathdiff", "pretty_assertions", - "profiling", - "rayon", "rbx_binary", "rbx_dom_weak", "rbx_reflection", @@ -2104,24 +1790,19 @@ dependencies = [ "rbx_xml", "reqwest", "ritz", - "rmp-serde", "roblox_install", "rojo-insta-ext", - "semver", "serde", - "serde_bytes", "serde_json", "serde_yaml", - "strum", + "structopt", "tempfile", "termcolor", - "thiserror 1.0.69", + "thiserror", "tokio", - "toml", "uuid", "walkdir", "winreg 0.10.1", - "yaml-rust2", ] [[package]] @@ -2134,74 +1815,24 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "rustc_version" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki", - "sct", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "same-file" @@ -2213,53 +1844,59 @@ dependencies = [ ] [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "schannel" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] [[package]] name = "scopeguard" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "sct" -version = "0.7.1" +name = "security-framework" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ - "ring", - "untrusted", + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] name = "semver" -version = "1.0.27" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" dependencies = [ - "serde_core", "serde_derive", ] -[[package]] -name = "serde_bytes" -version = "0.11.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" -dependencies = [ - "serde", - "serde_core", -] - [[package]] name = "serde_cbor" version = "0.11.2" @@ -2270,37 +1907,26 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ - "itoa", - "memchr", + "itoa 1.0.2", "ryu", "serde", - "serde_core", ] [[package]] @@ -2310,77 +1936,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa", + "itoa 1.0.2", "ryu", "serde", ] [[package]] name = "serde_yaml" -version = "0.8.26" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" dependencies = [ - "indexmap 1.9.3", + "indexmap", "ryu", "serde", "yaml-rust", ] [[package]] -name = "sha1" -version = "0.10.6" +name = "sha-1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "cfg-if 1.0.4", - "cpufeatures", + "block-buffer", "digest", + "fake-simd", + "opaque-debug", ] -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if 1.0.4", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "similar" -version = "2.7.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +checksum = "2e24979f63a11545f5f2c60141afe249d4f19f84581ea2138065e400941d83d3" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "snax" @@ -2393,139 +1988,94 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.10" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ "libc", - "windows-sys 0.52.0", + "winapi 0.3.9", ] -[[package]] -name = "socket2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - [[package]] name = "strsim" -version = "0.10.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] -name = "strum" -version = "0.27.2" +name = "structopt" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" dependencies = [ - "strum_macros", + "clap", + "lazy_static", + "structopt-derive", ] [[package]] -name = "strum_macros" -version = "0.27.2" +name = "structopt-derive" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" dependencies = [ - "heck 0.5.0", - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "heck", + "proc-macro-error", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", ] +[[package]] +name = "subtle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" + [[package]] name = "syn" -version = "1.0.109" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", + "proc-macro2 1.0.39", + "quote 1.0.18", "unicode-ident", ] -[[package]] -name = "syn" -version = "2.0.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tempfile" -version = "3.23.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ + "cfg-if 1.0.0", "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.9", ] [[package]] name = "termcolor" -version = "1.4.1" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -2535,69 +2085,24 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "textwrap" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" - [[package]] name = "thiserror" -version = "1.0.69" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.69" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if 1.0.4", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", ] [[package]] @@ -2611,205 +2116,158 @@ dependencies = [ ] [[package]] -name = "tokio" -version = "1.48.0" +name = "tinyvec" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395" dependencies = [ "bytes", "libc", - "mio 1.1.0", + "memchr", + "mio 0.8.3", + "num_cpus", + "once_cell", "pin-project-lite", - "socket2 0.6.1", - "tokio-macros", - "windows-sys 0.61.2", + "socket2", + "winapi 0.3.9", ] [[package]] -name = "tokio-macros" -version = "2.6.0" +name = "tokio-native-tls" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", + "native-tls", "tokio", ] -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite", -] - [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", + "tracing", ] [[package]] name = "toml" -version = "0.5.11" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] [[package]] name = "tower-service" -version = "0.3.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ + "cfg-if 1.0.0", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" +dependencies = [ + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", +] + [[package]] name = "tracing-core" -version = "0.1.35" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "tracy-client" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d722a05fe49b31fef971c4732a7d4aa6a18283d9ba46abddab35f484872947" -dependencies = [ - "loom", - "once_cell", - "tracy-client-sys", -] - -[[package]] -name = "tracy-client-sys" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fb391ac70462b3097a755618fbf9c8f95ecc1eb379a414f7b46f202ed10db1f" -dependencies = [ - "cc", - "windows-targets 0.52.6", + "lazy_static", ] [[package]] name = "try-lock" -version = "0.2.5" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - -[[package]] -name = "twox-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "typenum" -version = "1.19.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "ucd-trie" -version = "0.1.7" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" @@ -2817,72 +2275,45 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - [[package]] name = "url" -version = "2.5.7" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna", + "matches", "percent-encoding", - "serde", ] -[[package]] -name = "ustr" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18b19e258aa08450f93369cf56dd78063586adf19e92a75b338a800f799a0208" -dependencies = [ - "ahash", - "byteorder", - "lazy_static", - "parking_lot", - "serde", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "uuid" -version = "1.18.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0" dependencies = [ - "getrandom 0.3.4", - "js-sys", + "getrandom 0.2.6", "serde", - "wasm-bindgen", ] [[package]] -name = "valuable" -version = "0.1.1" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vswhom" @@ -2896,9 +2327,9 @@ dependencies = [ [[package]] name = "vswhom-sys" -version = "0.1.3" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39" dependencies = [ "cc", "libc", @@ -2906,112 +2337,119 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.5.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", + "winapi 0.3.9", "winapi-util", ] [[package]] name = "want" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" dependencies = [ + "log", "try-lock", ] [[package]] name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ - "cfg-if 1.0.4", - "once_cell", - "rustversion", + "cfg-if 1.0.0", "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", "js-sys", - "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ - "quote 1.0.42", + "quote 1.0.18", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ - "bumpalo", - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.39", + "quote 1.0.18", + "syn", + "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" -dependencies = [ - "unicode-ident", -] +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.25.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - [[package]] name = "winapi" version = "0.2.8" @@ -3042,11 +2480,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.11" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "windows-sys 0.61.2", + "winapi 0.3.9", ] [[package]] @@ -3055,353 +2493,48 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "windows-targets 0.48.5", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", ] -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" [[package]] name = "winreg" @@ -3421,28 +2554,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if 1.0.4", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - [[package]] name = "ws2_32-sys" version = "0.2.1" @@ -3453,20 +2564,11 @@ dependencies = [ "winapi-build", ] -[[package]] -name = "xml" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "636f85e5ca6488e96401b61eb7de54f4e44755c988af0f52cf90230c312a1a89" - [[package]] name = "xml-rs" -version = "1.0.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a56132a0d6ecbe77352edc10232f788fc4ceefefff4cab784a98e0e16b6b51" -dependencies = [ - "xml", -] +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" [[package]] name = "yaml-rust" @@ -3476,145 +2578,3 @@ checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" dependencies = [ "linked-hash-map", ] - -[[package]] -name = "yaml-rust2" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" -dependencies = [ - "arraydeque", - "encoding_rs", - "hashlink", -] - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/Cargo.toml b/Cargo.toml index 9d37c22a..958396a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,19 @@ [package] name = "rojo" -version = "7.7.1" -rust-version = "1.88" -authors = [ - "Lucien Greathouse ", - "Micah Reid ", - "Ken Loeffler ", -] +version = "7.1.1" +authors = ["Lucien Greathouse "] description = "Enables professional-grade development tools for Roblox developers" license = "MPL-2.0" homepage = "https://rojo.space" documentation = "https://rojo.space/docs" repository = "https://github.com/rojo-rbx/rojo" readme = "README.md" -edition = "2021" +edition = "2018" build = "build.rs" -exclude = ["/test-projects/**"] +exclude = [ + "/test-projects/**", +] [profile.dev] panic = "abort" @@ -30,12 +27,11 @@ default = [] # Enable this feature to live-reload assets from the web UI. dev_live_assets = [] -# Run Rojo with this feature to open a Tracy session. -# Currently uses protocol v63, last supported in Tracy 0.9.1. -profile-with-tracy = ["profiling/profile-with-tracy"] - [workspace] -members = ["crates/*"] +members = [ + "rojo-insta-ext", + "memofs", +] [lib] name = "librojo" @@ -46,89 +42,67 @@ name = "build" harness = false [dependencies] -memofs = { version = "0.4.0", path = "crates/memofs" } +memofs = { version = "0.2.0", path = "memofs" } # These dependencies can be uncommented when working on rbx-dom simultaneously -# rbx_binary = { path = "../rbx-dom/rbx_binary", features = [ -# "unstable_text_format", -# ] } +# rbx_binary = { path = "../rbx-dom/rbx_binary" } # rbx_dom_weak = { path = "../rbx-dom/rbx_dom_weak" } # rbx_reflection = { path = "../rbx-dom/rbx_reflection" } # rbx_reflection_database = { path = "../rbx-dom/rbx_reflection_database" } # rbx_xml = { path = "../rbx-dom/rbx_xml" } -rbx_binary = { version = "3.0.1", features = ["unstable_text_format"] } -rbx_dom_weak = "4.2.0" -rbx_reflection = "7.0.0" -rbx_reflection_database = "3.0.1" -rbx_xml = "3.0.1" +rbx_binary = "0.6.4" +rbx_dom_weak = "2.3.0" +rbx_reflection = "4.2.0" +rbx_reflection_database = "0.2.2" +rbx_xml = "0.12.3" -anyhow = "1.0.80" -backtrace = "0.3.69" +anyhow = "1.0.44" +backtrace = "0.3.61" bincode = "1.3.3" -crossbeam-channel = "0.5.12" -csv = "1.3.0" -dunce = "1.0.5" -env_logger = "0.9.3" -fs-err = "2.11.0" -futures = "0.3.30" -globset = "0.4.14" +crossbeam-channel = "0.5.1" +csv = "1.1.6" +env_logger = "0.9.0" +fs-err = "2.6.0" +futures = "0.3.17" +globset = "0.4.8" humantime = "2.1.0" -hyper = { version = "0.14.28", features = ["server", "tcp", "http1"] } -hyper-tungstenite = "0.11.0" +hyper = { version = "0.14.13", features = ["server", "tcp", "http1"] } jod-thread = "0.1.2" -log = "0.4.21" -num_cpus = "1.16.0" -opener = "0.5.2" -rayon = "1.9.0" -reqwest = { version = "0.11.24", default-features = false, features = [ - "blocking", - "json", - "rustls-tls", -] } +log = "0.4.14" +maplit = "1.0.2" +notify = "4.0.17" +opener = "0.5.0" +reqwest = { version = "0.11.10", features = ["blocking", "json"] } ritz = "0.1.0" roblox_install = "1.0.0" -serde = { version = "1.0.197", features = ["derive", "rc"] } -serde_json = "1.0.145" -jsonc-parser = { version = "0.27.0", features = ["serde"] } -strum = { version = "0.27", features = ["derive"] } -toml = "0.5.11" -termcolor = "1.4.1" -thiserror = "1.0.57" -tokio = { version = "1.36.0", features = ["rt", "rt-multi-thread", "macros"] } -uuid = { version = "1.7.0", features = ["v4", "serde"] } -clap = { version = "3.2.25", features = ["derive"] } -profiling = "1.0.15" -yaml-rust2 = "0.10.3" -data-encoding = "2.8.0" -pathdiff = "0.2.3" - -blake3 = "1.5.0" -float-cmp = "0.9.0" -indexmap = { version = "2.10.0", features = ["serde"] } -rmp-serde = "1.3.0" -serde_bytes = "0.11.19" +serde = { version = "1.0.130", features = ["derive", "rc"] } +serde_json = "1.0.68" +structopt = "0.3.23" +termcolor = "1.1.2" +thiserror = "1.0.30" +tokio = { version = "1.12.0", features = ["rt", "rt-multi-thread"] } +uuid = { version = "1.0.0", features = ["v4", "serde"] } [target.'cfg(windows)'.dependencies] winreg = "0.10.1" [build-dependencies] -memofs = { version = "0.4.0", path = "crates/memofs" } +memofs = { version = "0.2.0", path = "memofs" } -embed-resource = "1.8.0" -anyhow = "1.0.80" +embed-resource = "1.6.4" +anyhow = "1.0.44" bincode = "1.3.3" -fs-err = "2.11.0" +fs-err = "2.6.0" maplit = "1.0.2" -semver = "1.0.22" [dev-dependencies] -rojo-insta-ext = { path = "crates/rojo-insta-ext" } +rojo-insta-ext = { path = "rojo-insta-ext" } -criterion = "0.3.6" -insta = { version = "1.36.1", features = ["redactions", "yaml", "json"] } -paste = "1.0.14" -pretty_assertions = "1.4.0" -serde_yaml = "0.8.26" -tempfile = "3.10.1" -walkdir = "2.5.0" +criterion = "0.3.5" +insta = { version = "1.8.0", features = ["redactions"] } +paste = "1.0.5" +pretty_assertions = "1.2.1" +serde_yaml = "0.8.21" +tempfile = "3.2.0" +walkdir = "2.3.2" diff --git a/README.md b/README.md index f3d1aeeb..ce0d5c30 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
- Rojo + Rojo
 
@@ -25,11 +25,12 @@ Rojo enables: * Versioning your game, library, or plugin using Git or another VCS * Streaming `rbxmx` and `rbxm` models into your game in real time * Packaging and deploying your project to Roblox.com from the command line -* Pulling Instances from Roblox place and model files back into an existing Rojo project with `rojo syncback` -Rojo also has an optional two-way sync setting in the Studio plugin for syncing supported Studio edits back to the filesystem. +In the future, Rojo will be able to: -Some workflows, like fully automatic conversion of every existing game into a Rojo project, are still limited and may require manual project configuration. +* Sync instances from Roblox Studio to the filesystem +* Automatically convert your existing game to work with Rojo +* Import custom instances like MoonScript code ## [Documentation](https://rojo.space/docs) Documentation is hosted in the [rojo.space repository](https://github.com/rojo-rbx/rojo.space). @@ -39,7 +40,7 @@ Check out our [contribution guide](CONTRIBUTING.md) for detailed instructions fo Pull requests are welcome! -Rojo supports Rust 1.88 and newer. The minimum supported version of Rust is based on the latest versions of the dependencies that Rojo has. +Rojo supports Rust 1.46.0 and newer. The minimum supported version of Rust is based on the latest versions of the dependencies that Rojo has. ## License -Rojo is available under the terms of the Mozilla Public License, Version 2.0. See [LICENSE.txt](LICENSE.txt) for details. +Rojo is available under the terms of the Mozilla Public License, Version 2.0. See [LICENSE.txt](LICENSE.txt) for details. \ No newline at end of file diff --git a/assets/NotificationPop.mp3 b/assets/NotificationPop.mp3 deleted file mode 100644 index 5ecc1975..00000000 Binary files a/assets/NotificationPop.mp3 and /dev/null differ diff --git a/assets/project-templates/model/README.md b/assets/default-model-project/README.md similarity index 85% rename from assets/project-templates/model/README.md rename to assets/default-model-project/README.md index 1c1ad23c..30dfc436 100644 --- a/assets/project-templates/model/README.md +++ b/assets/default-model-project/README.md @@ -2,7 +2,7 @@ Generated by [Rojo](https://github.com/rojo-rbx/rojo) {rojo_version}. ## Getting Started -To build this library, use: +To build this library or plugin, use: ```bash rojo build -o "{project_name}.rbxmx" diff --git a/assets/project-templates/model/default.project.json b/assets/default-model-project/default.project.json similarity index 100% rename from assets/project-templates/model/default.project.json rename to assets/default-model-project/default.project.json diff --git a/assets/project-templates/model/gitignore.txt b/assets/default-model-project/gitignore.txt similarity index 58% rename from assets/project-templates/model/gitignore.txt rename to assets/default-model-project/gitignore.txt index 885b2dc4..0dfcd838 100644 --- a/assets/project-templates/model/gitignore.txt +++ b/assets/default-model-project/gitignore.txt @@ -1,5 +1,3 @@ # Roblox Studio lock files /*.rbxlx.lock -/*.rbxl.lock - -sourcemap.json +/*.rbxl.lock \ No newline at end of file diff --git a/assets/project-templates/model/src/init.luau b/assets/default-model-project/src-init.lua similarity index 97% rename from assets/project-templates/model/src/init.luau rename to assets/default-model-project/src-init.lua index aacfcce9..41faf217 100644 --- a/assets/project-templates/model/src/init.luau +++ b/assets/default-model-project/src-init.lua @@ -2,4 +2,4 @@ return { hello = function() print("Hello world, from {project_name}!") end, -} +} \ No newline at end of file diff --git a/assets/project-templates/place/README.md b/assets/default-place-project/README.md similarity index 100% rename from assets/project-templates/place/README.md rename to assets/default-place-project/README.md diff --git a/assets/project-templates/place/default.project.json b/assets/default-place-project/default.project.json similarity index 98% rename from assets/project-templates/place/default.project.json rename to assets/default-place-project/default.project.json index b6e6410a..6b25eb9b 100644 --- a/assets/project-templates/place/default.project.json +++ b/assets/default-place-project/default.project.json @@ -4,7 +4,7 @@ "$className": "DataModel", "ReplicatedStorage": { - "Shared": { + "Common": { "$path": "src/shared" } }, diff --git a/assets/project-templates/place/gitignore.txt b/assets/default-place-project/gitignore.txt similarity index 74% rename from assets/project-templates/place/gitignore.txt rename to assets/default-place-project/gitignore.txt index 8a0a285b..41d6a8ab 100644 --- a/assets/project-templates/place/gitignore.txt +++ b/assets/default-place-project/gitignore.txt @@ -3,6 +3,4 @@ # Roblox Studio lock files /*.rbxlx.lock -/*.rbxl.lock - -sourcemap.json +/*.rbxl.lock \ No newline at end of file diff --git a/assets/brand_images/icon-32.png b/assets/icon-32.png similarity index 100% rename from assets/brand_images/icon-32.png rename to assets/icon-32.png diff --git a/assets/brand_images/icon-link-32.png b/assets/icon-link-32.png similarity index 100% rename from assets/brand_images/icon-link-32.png rename to assets/icon-link-32.png diff --git a/assets/brand_images/icon-warn-32.png b/assets/icon-warn-32.png similarity index 100% rename from assets/brand_images/icon-warn-32.png rename to assets/icon-warn-32.png diff --git a/assets/images/icons/back.png b/assets/images/back.png similarity index 100% rename from assets/images/icons/back.png rename to assets/images/back.png diff --git a/assets/images/icons/back.svg b/assets/images/back.svg similarity index 100% rename from assets/images/icons/back.svg rename to assets/images/back.svg diff --git a/assets/images/icons/close.png b/assets/images/close.png similarity index 100% rename from assets/images/icons/close.png rename to assets/images/close.png diff --git a/assets/images/icons/close.svg b/assets/images/close.svg similarity index 100% rename from assets/images/icons/close.svg rename to assets/images/close.svg diff --git a/assets/images/icons/debug.png b/assets/images/icons/debug.png deleted file mode 100644 index b2217f0c..00000000 Binary files a/assets/images/icons/debug.png and /dev/null differ diff --git a/assets/images/icons/expand.png b/assets/images/icons/expand.png deleted file mode 100644 index fcf561dc..00000000 Binary files a/assets/images/icons/expand.png and /dev/null differ diff --git a/assets/images/icons/reset.png b/assets/images/icons/reset.png deleted file mode 100644 index 802e430a..00000000 Binary files a/assets/images/icons/reset.png and /dev/null differ diff --git a/assets/images/icons/warning.png b/assets/images/icons/warning.png deleted file mode 100644 index 79d457df..00000000 Binary files a/assets/images/icons/warning.png and /dev/null differ diff --git a/assets/images/syncsuccess.png b/assets/images/syncsuccess.png deleted file mode 100644 index 74958cc1..00000000 Binary files a/assets/images/syncsuccess.png and /dev/null differ diff --git a/assets/images/syncwarning.png b/assets/images/syncwarning.png deleted file mode 100644 index eafb93d3..00000000 Binary files a/assets/images/syncwarning.png and /dev/null differ diff --git a/assets/index.css b/assets/index.css index 2eada350..bbec79cb 100644 --- a/assets/index.css +++ b/assets/index.css @@ -17,10 +17,6 @@ html { line-height: 1.4; } -body { - background-color: #e7e7e7 -} - img { max-width:100%; max-height:100%; diff --git a/assets/brand_images/logo-512.png b/assets/logo-512.png similarity index 100% rename from assets/brand_images/logo-512.png rename to assets/logo-512.png diff --git a/assets/project-templates/place/src/client/init.client.luau b/assets/project-templates/place/src/client/init.client.luau deleted file mode 100644 index 5b0486bf..00000000 --- a/assets/project-templates/place/src/client/init.client.luau +++ /dev/null @@ -1 +0,0 @@ -print("Hello world, from client!") diff --git a/assets/project-templates/place/src/server/init.server.luau b/assets/project-templates/place/src/server/init.server.luau deleted file mode 100644 index ec610e9c..00000000 --- a/assets/project-templates/place/src/server/init.server.luau +++ /dev/null @@ -1 +0,0 @@ -print("Hello world, from server!") diff --git a/assets/project-templates/place/src/shared/Hello.luau b/assets/project-templates/place/src/shared/Hello.luau deleted file mode 100644 index 56ec1f24..00000000 --- a/assets/project-templates/place/src/shared/Hello.luau +++ /dev/null @@ -1,3 +0,0 @@ -return function() - print("Hello, world!") -end diff --git a/assets/project-templates/plugin/README.md b/assets/project-templates/plugin/README.md deleted file mode 100644 index a02eac72..00000000 --- a/assets/project-templates/plugin/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# {project_name} -Generated by [Rojo](https://github.com/rojo-rbx/rojo) {rojo_version}. - -## Getting Started -To build this plugin to your local plugins folder, use: - -```bash -rojo build -p "{project_name}.rbxm" -``` - -You can include the `watch` flag to re-build it on save: - -```bash -rojo build -p "{project_name}.rbxm" --watch -``` - -For more help, check out [the Rojo documentation](https://rojo.space/docs). diff --git a/assets/project-templates/plugin/default.project.json b/assets/project-templates/plugin/default.project.json deleted file mode 100644 index e7bb5891..00000000 --- a/assets/project-templates/plugin/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "{project_name}", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/assets/project-templates/plugin/gitignore.txt b/assets/project-templates/plugin/gitignore.txt deleted file mode 100644 index 2841e8e4..00000000 --- a/assets/project-templates/plugin/gitignore.txt +++ /dev/null @@ -1,5 +0,0 @@ -# Plugin model files -/{project_name}.rbxmx -/{project_name}.rbxm - -sourcemap.json diff --git a/assets/project-templates/plugin/src/init.server.luau b/assets/project-templates/plugin/src/init.server.luau deleted file mode 100644 index 931c6bfc..00000000 --- a/assets/project-templates/plugin/src/init.server.luau +++ /dev/null @@ -1 +0,0 @@ -print("Hello world, from plugin!") diff --git a/assets/images/round-rect-4px-radius.png b/assets/round-rect-4px-radius.png similarity index 100% rename from assets/images/round-rect-4px-radius.png rename to assets/round-rect-4px-radius.png diff --git a/benches/build.rs b/benches/build.rs index 87d33e44..0b1e8934 100644 --- a/benches/build.rs +++ b/benches/build.rs @@ -3,7 +3,7 @@ use std::path::Path; use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; use tempfile::{tempdir, TempDir}; -use librojo::cli::BuildCommand; +use librojo::cli::{build, BuildCommand}; pub fn benchmark_small_place(c: &mut Criterion) { bench_build_place(c, "Small Place", "test-projects/benchmark_small_place") @@ -20,7 +20,7 @@ fn bench_build_place(c: &mut Criterion, name: &str, path: &str) { group.bench_function("build", |b| { b.iter_batched( || place_setup(path), - |(_dir, options)| options.run().unwrap(), + |(_dir, options)| build(options).unwrap(), BatchSize::SmallInput, ) }); @@ -31,12 +31,11 @@ fn bench_build_place(c: &mut Criterion, name: &str, path: &str) { fn place_setup>(input_path: P) -> (TempDir, BuildCommand) { let dir = tempdir().unwrap(); let input = input_path.as_ref().to_path_buf(); - let output = Some(dir.path().join("output.rbxlx")); + let output = dir.path().join("output.rbxlx"); let options = BuildCommand { project: input, watch: false, - plugin: None, output, }; diff --git a/bin/dev-plugin.sh b/bin/dev-plugin.sh new file mode 100755 index 00000000..0b786218 --- /dev/null +++ b/bin/dev-plugin.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +watchexec -c -w plugin "sh -c './bin/install-dev-plugin.sh'" \ No newline at end of file diff --git a/bin/install-dev-plugin.sh b/bin/install-dev-plugin.sh new file mode 100755 index 00000000..d8a8376c --- /dev/null +++ b/bin/install-dev-plugin.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e + +DIR="$( mktemp -d )" +PLUGIN_FILE="$DIR/Rojo.rbxm" +TESTEZ_FILE="$DIR/TestEZ.rbxm" + +rojo build plugin -o "$PLUGIN_FILE" +rojo build plugin/testez.project.json -o "$TESTEZ_FILE" +remodel bin/mark-plugin-as-dev.lua "$PLUGIN_FILE" "$TESTEZ_FILE" 2>/dev/null + +cp "$PLUGIN_FILE" "$LOCALAPPDATA/Roblox/Plugins/Rojo.rbxm" \ No newline at end of file diff --git a/bin/install-release-plugin.sh b/bin/install-release-plugin.sh new file mode 100755 index 00000000..f670c18c --- /dev/null +++ b/bin/install-release-plugin.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +rojo build plugin -o "$LOCALAPPDATA/Roblox/Plugins/Rojo.rbxm" \ No newline at end of file diff --git a/bin/mark-plugin-as-dev.lua b/bin/mark-plugin-as-dev.lua new file mode 100644 index 00000000..49fe902a --- /dev/null +++ b/bin/mark-plugin-as-dev.lua @@ -0,0 +1,12 @@ +local pluginPath, testezPath = ... + +local plugin = remodel.readModelFile(pluginPath)[1] +local testez = remodel.readModelFile(testezPath)[1] + +local marker = Instance.new("Folder") +marker.Name = "ROJO_DEV_BUILD" +marker.Parent = plugin + +testez.Parent = plugin + +remodel.writeModelFile(plugin, pluginPath) \ No newline at end of file diff --git a/bin/put-plugin-in-test-place.lua b/bin/put-plugin-in-test-place.lua new file mode 100644 index 00000000..f651c1bf --- /dev/null +++ b/bin/put-plugin-in-test-place.lua @@ -0,0 +1,8 @@ +local pluginPath, placePath = ... + +local plugin = remodel.readModelFile(pluginPath)[1] +local place = remodel.readPlaceFile(placePath) + +plugin.Parent = place:GetService("ReplicatedStorage") + +remodel.writePlaceFile(place, placePath) \ No newline at end of file diff --git a/bin/run-all-tests.sh b/bin/run-all-tests.sh new file mode 100755 index 00000000..e17aafa4 --- /dev/null +++ b/bin/run-all-tests.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +./bin/run-cli-tests.sh +./bin/run-plugin-tests.sh \ No newline at end of file diff --git a/bin/run-cli-tests.sh b/bin/run-cli-tests.sh new file mode 100755 index 00000000..8f1b49a2 --- /dev/null +++ b/bin/run-cli-tests.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +cargo test --all --locked +cargo fmt -- --check + +touch src/lib.rs # Nudge Rust source to make Clippy actually check things +cargo clippy \ No newline at end of file diff --git a/bin/run-plugin-tests.sh b/bin/run-plugin-tests.sh new file mode 100755 index 00000000..1da9bb47 --- /dev/null +++ b/bin/run-plugin-tests.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +DIR="$( mktemp -d )" +PLUGIN_FILE="$DIR/Rojo.rbxmx" +PLACE_FILE="$DIR/RojoTestPlace.rbxlx" + +rojo build plugin -o "$PLUGIN_FILE" +rojo build plugin/place.project.json -o "$PLACE_FILE" + +remodel bin/put-plugin-in-test-place.lua "$PLUGIN_FILE" "$PLACE_FILE" + +run-in-roblox -s plugin/testBootstrap.server.lua "$PLACE_FILE" + +luacheck plugin/src plugin/log plugin/http \ No newline at end of file diff --git a/build.rs b/build.rs index d0457fb1..5ac7672b 100644 --- a/build.rs +++ b/build.rs @@ -7,7 +7,6 @@ use fs_err as fs; use fs_err::File; use maplit::hashmap; use memofs::VfsSnapshot; -use semver::Version; fn snapshot_from_fs_path(path: &Path) -> io::Result { println!("cargo:rerun-if-changed={}", path.display()); @@ -20,18 +19,9 @@ fn snapshot_from_fs_path(path: &Path) -> io::Result { let file_name = entry.file_name().to_str().unwrap().to_owned(); - if file_name.starts_with(".git") { - continue; - } - // We can skip any TestEZ test files since they aren't necessary for // the plugin to run. - if file_name.ends_with(".spec.lua") || file_name.ends_with(".spec.luau") { - continue; - } - - // Ignore images in msgpack-luau because they aren't UTF-8 encoded. - if file_name.ends_with(".png") { + if file_name.ends_with(".spec.lua") { continue; } @@ -50,40 +40,38 @@ fn snapshot_from_fs_path(path: &Path) -> io::Result { fn main() -> Result<(), anyhow::Error> { let out_dir = env::var_os("OUT_DIR").unwrap(); - let root_dir = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap()); - let plugin_dir = root_dir.join("plugin"); - let templates_dir = root_dir.join("assets").join("project-templates"); + let root_dir = env::var_os("CARGO_MANIFEST_DIR").unwrap(); + let plugin_root = PathBuf::from(root_dir).join("plugin"); - let our_version = Version::parse(env::var_os("CARGO_PKG_VERSION").unwrap().to_str().unwrap())?; - let plugin_version = - Version::parse(fs::read_to_string(plugin_dir.join("Version.txt"))?.trim())?; + let plugin_modules = plugin_root.join("modules"); - assert_eq!( - our_version, plugin_version, - "plugin version does not match Cargo version" - ); - - let template_snapshot = snapshot_from_fs_path(&templates_dir)?; - - let plugin_snapshot = VfsSnapshot::dir(hashmap! { - "default.project.json" => snapshot_from_fs_path(&root_dir.join("plugin.project.json"))?, - "plugin" => VfsSnapshot::dir(hashmap! { - "fmt" => snapshot_from_fs_path(&plugin_dir.join("fmt"))?, - "http" => snapshot_from_fs_path(&plugin_dir.join("http"))?, - "log" => snapshot_from_fs_path(&plugin_dir.join("log"))?, - "rbx_dom_lua" => snapshot_from_fs_path(&plugin_dir.join("rbx_dom_lua"))?, - "src" => snapshot_from_fs_path(&plugin_dir.join("src"))?, - "Packages" => snapshot_from_fs_path(&plugin_dir.join("Packages"))?, - "Version.txt" => snapshot_from_fs_path(&plugin_dir.join("Version.txt"))?, - "UploadDetails.json" => snapshot_from_fs_path(&plugin_dir.join("UploadDetails.json"))?, + let snapshot = VfsSnapshot::dir(hashmap! { + "default.project.json" => snapshot_from_fs_path(&plugin_root.join("default.project.json"))?, + "fmt" => snapshot_from_fs_path(&plugin_root.join("fmt"))?, + "http" => snapshot_from_fs_path(&plugin_root.join("http"))?, + "log" => snapshot_from_fs_path(&plugin_root.join("log"))?, + "rbx_dom_lua" => snapshot_from_fs_path(&plugin_root.join("rbx_dom_lua"))?, + "src" => snapshot_from_fs_path(&plugin_root.join("src"))?, + "modules" => VfsSnapshot::dir(hashmap! { + "roact" => VfsSnapshot::dir(hashmap! { + "src" => snapshot_from_fs_path(&plugin_modules.join("roact").join("src"))? + }), + "promise" => VfsSnapshot::dir(hashmap! { + "lib" => snapshot_from_fs_path(&plugin_modules.join("promise").join("lib"))? + }), + "t" => VfsSnapshot::dir(hashmap! { + "lib" => snapshot_from_fs_path(&plugin_modules.join("t").join("lib"))? + }), + "flipper" => VfsSnapshot::dir(hashmap! { + "src" => snapshot_from_fs_path(&plugin_modules.join("flipper").join("src"))? + }), }), }); - let template_file = File::create(Path::new(&out_dir).join("templates.bincode"))?; - let plugin_file = File::create(Path::new(&out_dir).join("plugin.bincode"))?; + let out_path = Path::new(&out_dir).join("plugin.bincode"); + let out_file = File::create(&out_path)?; - bincode::serialize_into(plugin_file, &plugin_snapshot)?; - bincode::serialize_into(template_file, &template_snapshot)?; + bincode::serialize_into(out_file, &snapshot)?; println!("cargo:rerun-if-changed=build/windows/rojo-manifest.rc"); println!("cargo:rerun-if-changed=build/windows/rojo.manifest"); diff --git a/crates/memofs/CHANGELOG.md b/crates/memofs/CHANGELOG.md deleted file mode 100644 index 3e841b2b..00000000 --- a/crates/memofs/CHANGELOG.md +++ /dev/null @@ -1,38 +0,0 @@ -# memofs Changelog - -## Unreleased Changes - -# 0.4.0 (2026-07-01) -* Added `Vfs::canonicalize`. [#1201] -* **Breaking:** `StdBackend::new` and `Vfs::new_default` now return `io::Result`, so a failure to create the filesystem watcher is reported as an error instead of panicking. The `Default` implementation for `StdBackend` has been removed as a result. [#1267] - -[#1267]: https://github.com/rojo-rbx/rojo/pull/1267 - -## 0.3.1 (2025-11-27) -* Added `Vfs::exists`. [#1169] -* Added `create_dir` and `create_dir_all` to allow creating directories. [#937] - -[#1169]: https://github.com/rojo-rbx/rojo/pull/1169 -[#937]: https://github.com/rojo-rbx/rojo/pull/937 - -## 0.3.0 (2024-03-15) -* Changed `StdBackend` file watching component to use minimal recursive watches. [#830] -* Added `Vfs::read_to_string` and `Vfs::read_to_string_lf_normalized` [#854] - -[#830]: https://github.com/rojo-rbx/rojo/pull/830 -[#854]: https://github.com/rojo-rbx/rojo/pull/854 - -## 0.2.0 (2021-08-23) -* Updated to `crossbeam-channel` 0.5.1. - -## 0.1.3 (2020-11-19) -* Added `set_watch_enabled` to `Vfs` and `VfsLock` to allow turning off file watching. - -## 0.1.2 (2020-03-29) -* `VfsSnapshot` now implements Serde's `Serialize` and `Deserialize` traits. - -## 0.1.1 (2020-03-18) -* Improved error messages using the [fs-err](https://crates.io/crates/fs-err) crate. - -## 0.1.0 (2020-03-10) -* Initial release diff --git a/crates/memofs/Cargo.toml b/crates/memofs/Cargo.toml deleted file mode 100644 index c0bfbc75..00000000 --- a/crates/memofs/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "memofs" -description = "Virtual filesystem with configurable backends." -version = "0.4.0" -authors = [ - "Lucien Greathouse ", - "Micah Reid ", - "Ken Loeffler ", -] -edition = "2018" -readme = "README.md" -license = "MIT" -homepage = "https://github.com/rojo-rbx/rojo/tree/master/memofs" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -crossbeam-channel = "0.5.12" -dunce = "1.0.5" -fs-err = "2.11.0" -notify = "4.0.17" -serde = { version = "1.0.197", features = ["derive"] } - -[dev-dependencies] -tempfile = "3.10.1" diff --git a/crates/memofs/src/noop_backend.rs b/crates/memofs/src/noop_backend.rs deleted file mode 100644 index b1ee301d..00000000 --- a/crates/memofs/src/noop_backend.rs +++ /dev/null @@ -1,74 +0,0 @@ -use std::io; -use std::path::{Path, PathBuf}; - -use crate::{Metadata, ReadDir, VfsBackend, VfsEvent}; - -/// `VfsBackend` that returns an error on every operation. -#[non_exhaustive] -pub struct NoopBackend; - -impl NoopBackend { - pub fn new() -> Self { - Self - } -} - -impl VfsBackend for NoopBackend { - fn read(&mut self, _path: &Path) -> io::Result> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn write(&mut self, _path: &Path, _data: &[u8]) -> io::Result<()> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn exists(&mut self, _path: &Path) -> io::Result { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn read_dir(&mut self, _path: &Path) -> io::Result { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn create_dir(&mut self, _path: &Path) -> io::Result<()> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn create_dir_all(&mut self, _path: &Path) -> io::Result<()> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn remove_file(&mut self, _path: &Path) -> io::Result<()> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn remove_dir_all(&mut self, _path: &Path) -> io::Result<()> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn metadata(&mut self, _path: &Path) -> io::Result { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn canonicalize(&mut self, _path: &Path) -> io::Result { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn event_receiver(&self) -> crossbeam_channel::Receiver { - crossbeam_channel::never() - } - - fn watch(&mut self, _path: &Path) -> io::Result<()> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } - - fn unwatch(&mut self, _path: &Path) -> io::Result<()> { - Err(io::Error::other("NoopBackend doesn't do anything")) - } -} - -impl Default for NoopBackend { - fn default() -> Self { - Self::new() - } -} diff --git a/foreman.toml b/foreman.toml new file mode 100644 index 00000000..d6e1b51f --- /dev/null +++ b/foreman.toml @@ -0,0 +1,3 @@ +[tools] +rojo = { source = "rojo-rbx/rojo", version = "6.1.0" } +run-in-roblox = { source = "rojo-rbx/run-in-roblox", version = "0.3.0" } diff --git a/memofs/CHANGELOG.md b/memofs/CHANGELOG.md new file mode 100644 index 00000000..b49b2f0f --- /dev/null +++ b/memofs/CHANGELOG.md @@ -0,0 +1,18 @@ +# memofs Changelog + +## Unreleased Changes + +## 0.2.0 (2021-08-23) +* Updated to `crossbeam-channel` 0.5.1. + +## 0.1.3 (2020-11-19) +* Added `set_watch_enabled` to `Vfs` and `VfsLock` to allow turning off file watching. + +## 0.1.2 (2020-03-29) +* `VfsSnapshot` now implements Serde's `Serialize` and `Deserialize` traits. + +## 0.1.1 (2020-03-18) +* Improved error messages using the [fs-err](https://crates.io/crates/fs-err) crate. + +## 0.1.0 (2020-03-10) +* Initial release \ No newline at end of file diff --git a/memofs/Cargo.toml b/memofs/Cargo.toml new file mode 100644 index 00000000..5cf5a733 --- /dev/null +++ b/memofs/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "memofs" +description = "Virtual filesystem with configurable backends." +version = "0.2.0" +authors = ["Lucien Greathouse "] +edition = "2018" +readme = "README.md" +license = "MIT" +homepage = "https://github.com/rojo-rbx/rojo/tree/master/memofs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +crossbeam-channel = "0.5.1" +fs-err = "2.3.0" +notify = "4.0.15" +serde = { version = "1.0", features = ["derive"] } diff --git a/crates/memofs/LICENSE.txt b/memofs/LICENSE.txt similarity index 100% rename from crates/memofs/LICENSE.txt rename to memofs/LICENSE.txt diff --git a/crates/memofs/README.md b/memofs/README.md similarity index 100% rename from crates/memofs/README.md rename to memofs/README.md diff --git a/crates/memofs/README.tpl b/memofs/README.tpl similarity index 100% rename from crates/memofs/README.tpl rename to memofs/README.tpl diff --git a/crates/memofs/src/in_memory_fs.rs b/memofs/src/in_memory_fs.rs similarity index 74% rename from crates/memofs/src/in_memory_fs.rs rename to memofs/src/in_memory_fs.rs index 41006f1c..328fbffe 100644 --- a/crates/memofs/src/in_memory_fs.rs +++ b/memofs/src/in_memory_fs.rs @@ -50,12 +50,6 @@ impl InMemoryFs { } } -impl Default for InMemoryFs { - fn default() -> Self { - Self::new() - } -} - #[derive(Debug)] struct InMemoryFsInner { entries: HashMap, @@ -157,11 +151,6 @@ impl VfsBackend for InMemoryFs { ) } - fn exists(&mut self, path: &Path) -> io::Result { - let inner = self.inner.lock().unwrap(); - Ok(inner.entries.contains_key(path)) - } - fn read_dir(&mut self, path: &Path) -> io::Result { let inner = self.inner.lock().unwrap(); @@ -181,21 +170,6 @@ impl VfsBackend for InMemoryFs { } } - fn create_dir(&mut self, path: &Path) -> io::Result<()> { - let mut inner = self.inner.lock().unwrap(); - inner.load_snapshot(path.to_path_buf(), VfsSnapshot::empty_dir()) - } - - fn create_dir_all(&mut self, path: &Path) -> io::Result<()> { - let mut inner = self.inner.lock().unwrap(); - let mut path_buf = path.to_path_buf(); - while let Some(parent) = path_buf.parent() { - inner.load_snapshot(parent.to_path_buf(), VfsSnapshot::empty_dir())?; - path_buf.pop(); - } - inner.load_snapshot(path.to_path_buf(), VfsSnapshot::empty_dir()) - } - fn remove_file(&mut self, path: &Path) -> io::Result<()> { let mut inner = self.inner.lock().unwrap(); @@ -232,33 +206,6 @@ impl VfsBackend for InMemoryFs { } } - // TODO: We rely on Rojo to prepend cwd to any relative path before storing paths - // in MemoFS. The current implementation will error if no prepended absolute path - // is found. It really only normalizes paths within the provided path's context. - // Example: "/Users/username/project/../other/file.txt" -> - // "/Users/username/other/file.txt" - // Erroneous example: "/Users/../../other/file.txt" -> "/other/file.txt" - // This is not very robust. We should implement proper path normalization here or otherwise - // warn if we are missing context and can not fully canonicalize the path correctly. - fn canonicalize(&mut self, path: &Path) -> io::Result { - let mut normalized = PathBuf::new(); - for component in path.components() { - match component { - std::path::Component::ParentDir => { - normalized.pop(); - } - std::path::Component::CurDir => {} - _ => normalized.push(component), - } - } - - let inner = self.inner.lock().unwrap(); - match inner.entries.get(&normalized) { - Some(_) => Ok(normalized), - None => not_found(&normalized), - } - } - fn event_receiver(&self) -> crossbeam_channel::Receiver { let inner = self.inner.lock().unwrap(); @@ -275,17 +222,23 @@ impl VfsBackend for InMemoryFs { } fn must_be_file(path: &Path) -> io::Result { - Err(io::Error::other(format!( - "path {} was a directory, but must be a file", - path.display() - ))) + Err(io::Error::new( + io::ErrorKind::Other, + format!( + "path {} was a directory, but must be a file", + path.display() + ), + )) } fn must_be_dir(path: &Path) -> io::Result { - Err(io::Error::other(format!( - "path {} was a file, but must be a directory", - path.display() - ))) + Err(io::Error::new( + io::ErrorKind::Other, + format!( + "path {} was a file, but must be a directory", + path.display() + ), + )) } fn not_found(path: &Path) -> io::Result { diff --git a/crates/memofs/src/lib.rs b/memofs/src/lib.rs similarity index 56% rename from crates/memofs/src/lib.rs rename to memofs/src/lib.rs index bb6ae5a1..f6a17ef6 100644 --- a/crates/memofs/src/lib.rs +++ b/memofs/src/lib.rs @@ -22,9 +22,9 @@ mod noop_backend; mod snapshot; mod std_backend; +use std::io; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex, MutexGuard}; -use std::{io, str}; pub use in_memory_fs::InMemoryFs; pub use noop_backend::NoopBackend; @@ -70,14 +70,10 @@ impl IoResultExt for io::Result { pub trait VfsBackend: sealed::Sealed + Send + 'static { fn read(&mut self, path: &Path) -> io::Result>; fn write(&mut self, path: &Path, data: &[u8]) -> io::Result<()>; - fn exists(&mut self, path: &Path) -> io::Result; fn read_dir(&mut self, path: &Path) -> io::Result; - fn create_dir(&mut self, path: &Path) -> io::Result<()>; - fn create_dir_all(&mut self, path: &Path) -> io::Result<()>; fn metadata(&mut self, path: &Path) -> io::Result; fn remove_file(&mut self, path: &Path) -> io::Result<()>; fn remove_dir_all(&mut self, path: &Path) -> io::Result<()>; - fn canonicalize(&mut self, path: &Path) -> io::Result; fn event_receiver(&self) -> crossbeam_channel::Receiver; fn watch(&mut self, path: &Path) -> io::Result<()>; @@ -159,29 +155,6 @@ impl VfsInner { Ok(Arc::new(contents)) } - fn read_to_string>(&mut self, path: P) -> io::Result> { - let path = path.as_ref(); - let contents = self.backend.read(path)?; - - if self.watch_enabled { - self.backend.watch(path)?; - } - - let contents_str = str::from_utf8(&contents).map_err(|_| { - io::Error::new( - io::ErrorKind::InvalidData, - format!("File was not valid UTF-8: {}", path.display()), - ) - })?; - - Ok(Arc::new(contents_str.into())) - } - - fn exists>(&mut self, path: P) -> io::Result { - let path = path.as_ref(); - self.backend.exists(path) - } - fn write, C: AsRef<[u8]>>(&mut self, path: P, contents: C) -> io::Result<()> { let path = path.as_ref(); let contents = contents.as_ref(); @@ -199,16 +172,6 @@ impl VfsInner { Ok(dir) } - fn create_dir>(&mut self, path: P) -> io::Result<()> { - let path = path.as_ref(); - self.backend.create_dir(path) - } - - fn create_dir_all>(&mut self, path: P) -> io::Result<()> { - let path = path.as_ref(); - self.backend.create_dir_all(path) - } - fn remove_file>(&mut self, path: P) -> io::Result<()> { let path = path.as_ref(); let _ = self.backend.unwatch(path); @@ -226,18 +189,16 @@ impl VfsInner { self.backend.metadata(path) } - fn canonicalize>(&mut self, path: P) -> io::Result { - let path = path.as_ref(); - self.backend.canonicalize(path) - } - fn event_receiver(&self) -> crossbeam_channel::Receiver { self.backend.event_receiver() } fn commit_event(&mut self, event: &VfsEvent) -> io::Result<()> { - if let VfsEvent::Remove(path) = event { - let _ = self.backend.unwatch(path); + match event { + VfsEvent::Remove(path) => { + let _ = self.backend.unwatch(&path); + } + _ => {} } Ok(()) @@ -255,11 +216,8 @@ pub struct Vfs { impl Vfs { /// Creates a new `Vfs` with the default backend, `StdBackend`. - /// - /// Returns an error if the filesystem watcher could not be initialized, - /// which can happen in restricted or sandboxed environments. - pub fn new_default() -> io::Result { - Ok(Self::new(StdBackend::new()?)) + pub fn new_default() -> Self { + Self::new(StdBackend::new()) } /// Creates a new `Vfs` with the given backend. @@ -303,33 +261,6 @@ impl Vfs { self.inner.lock().unwrap().read(path) } - /// Read a file from the VFS (or from the underlying backend if it isn't - /// resident) into a string. - /// - /// Roughly equivalent to [`std::fs::read_to_string`][std::fs::read_to_string]. - /// - /// [std::fs::read_to_string]: https://doc.rust-lang.org/stable/std/fs/fn.read_to_string.html - #[inline] - pub fn read_to_string>(&self, path: P) -> io::Result> { - let path = path.as_ref(); - self.inner.lock().unwrap().read_to_string(path) - } - - /// Read a file from the VFS (or the underlying backend if it isn't - /// resident) into a string, and normalize its line endings to LF. - /// - /// Roughly equivalent to [`std::fs::read_to_string`][std::fs::read_to_string], but also performs - /// line ending normalization. - /// - /// [std::fs::read_to_string]: https://doc.rust-lang.org/stable/std/fs/fn.read_to_string.html - #[inline] - pub fn read_to_string_lf_normalized>(&self, path: P) -> io::Result> { - let path = path.as_ref(); - let contents = self.inner.lock().unwrap().read_to_string(path)?; - - Ok(contents.replace("\r\n", "\n").into()) - } - /// Write a file to the VFS and the underlying backend. /// /// Roughly equivalent to [`std::fs::write`][std::fs::write]. @@ -353,42 +284,6 @@ impl Vfs { self.inner.lock().unwrap().read_dir(path) } - /// Return whether the given path exists. - /// - /// Roughly equivalent to [`std::fs::exists`][std::fs::exists]. - /// - /// [std::fs::exists]: https://doc.rust-lang.org/stable/std/fs/fn.exists.html - #[inline] - pub fn exists>(&self, path: P) -> io::Result { - let path = path.as_ref(); - self.inner.lock().unwrap().exists(path) - } - - /// Creates a directory at the provided location. - /// - /// Roughly equivalent to [`std::fs::create_dir`][std::fs::create_dir]. - /// Similiar to that function, this function will fail if the parent of the - /// path does not exist. - /// - /// [std::fs::create_dir]: https://doc.rust-lang.org/stable/std/fs/fn.create_dir.html - #[inline] - pub fn create_dir>(&self, path: P) -> io::Result<()> { - let path = path.as_ref(); - self.inner.lock().unwrap().create_dir(path) - } - - /// Creates a directory at the provided location, recursively creating - /// all parent components if they are missing. - /// - /// Roughly equivalent to [`std::fs::create_dir_all`][std::fs::create_dir_all]. - /// - /// [std::fs::create_dir_all]: https://doc.rust-lang.org/stable/std/fs/fn.create_dir_all.html - #[inline] - pub fn create_dir_all>(&self, path: P) -> io::Result<()> { - let path = path.as_ref(); - self.inner.lock().unwrap().create_dir_all(path) - } - /// Remove a file. /// /// Roughly equivalent to [`std::fs::remove_file`][std::fs::remove_file]. @@ -422,19 +317,6 @@ impl Vfs { self.inner.lock().unwrap().metadata(path) } - /// Normalize a path via the underlying backend. - /// - /// Roughly equivalent to [`std::fs::canonicalize`][std::fs::canonicalize]. Relative paths are - /// resolved against the backend's current working directory (if applicable) and errors are - /// surfaced directly from the backend. - /// - /// [std::fs::canonicalize]: https://doc.rust-lang.org/stable/std/fs/fn.canonicalize.html - #[inline] - pub fn canonicalize>(&self, path: P) -> io::Result { - let path = path.as_ref(); - self.inner.lock().unwrap().canonicalize(path) - } - /// Retrieve a handle to the event receiver for this `Vfs`. #[inline] pub fn event_receiver(&self) -> crossbeam_channel::Receiver { @@ -504,31 +386,6 @@ impl VfsLock<'_> { self.inner.read_dir(path) } - /// Creates a directory at the provided location. - /// - /// Roughly equivalent to [`std::fs::create_dir`][std::fs::create_dir]. - /// Similiar to that function, this function will fail if the parent of the - /// path does not exist. - /// - /// [std::fs::create_dir]: https://doc.rust-lang.org/stable/std/fs/fn.create_dir.html - #[inline] - pub fn create_dir>(&mut self, path: P) -> io::Result<()> { - let path = path.as_ref(); - self.inner.create_dir(path) - } - - /// Creates a directory at the provided location, recursively creating - /// all parent components if they are missing. - /// - /// Roughly equivalent to [`std::fs::create_dir_all`][std::fs::create_dir_all]. - /// - /// [std::fs::create_dir_all]: https://doc.rust-lang.org/stable/std/fs/fn.create_dir_all.html - #[inline] - pub fn create_dir_all>(&mut self, path: P) -> io::Result<()> { - let path = path.as_ref(); - self.inner.create_dir_all(path) - } - /// Remove a file. /// /// Roughly equivalent to [`std::fs::remove_file`][std::fs::remove_file]. @@ -562,13 +419,6 @@ impl VfsLock<'_> { self.inner.metadata(path) } - /// Normalize a path via the underlying backend. - #[inline] - pub fn normalize>(&mut self, path: P) -> io::Result { - let path = path.as_ref(); - self.inner.canonicalize(path) - } - /// Retrieve a handle to the event receiver for this `Vfs`. #[inline] pub fn event_receiver(&self) -> crossbeam_channel::Receiver { @@ -581,119 +431,3 @@ impl VfsLock<'_> { self.inner.commit_event(event) } } - -#[cfg(test)] -mod test { - use crate::{InMemoryFs, StdBackend, Vfs, VfsSnapshot}; - use std::io; - use std::path::PathBuf; - - /// https://github.com/rojo-rbx/rojo/issues/899 - #[test] - fn read_to_string_lf_normalized_keeps_trailing_newline() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("test", VfsSnapshot::file("bar\r\nfoo\r\n\r\n")) - .unwrap(); - - let vfs = Vfs::new(imfs); - - assert_eq!( - vfs.read_to_string_lf_normalized("test").unwrap().as_str(), - "bar\nfoo\n\n" - ); - } - - /// https://github.com/rojo-rbx/rojo/issues/1200 - #[test] - fn canonicalize_in_memory_success() { - let mut imfs = InMemoryFs::new(); - let contents = "Lorem ipsum dolor sit amet.".to_string(); - - imfs.load_snapshot("/test/file.txt", VfsSnapshot::file(contents.to_string())) - .unwrap(); - - let vfs = Vfs::new(imfs); - - assert_eq!( - vfs.canonicalize("/test/nested/../file.txt").unwrap(), - PathBuf::from("/test/file.txt") - ); - assert_eq!( - vfs.read_to_string(vfs.canonicalize("/test/nested/../file.txt").unwrap()) - .unwrap() - .to_string(), - contents.to_string() - ); - } - - #[test] - fn canonicalize_in_memory_missing_errors() { - let imfs = InMemoryFs::new(); - let vfs = Vfs::new(imfs); - - let err = vfs.canonicalize("test").unwrap_err(); - assert_eq!(err.kind(), io::ErrorKind::NotFound); - } - - #[test] - fn canonicalize_std_backend_success() { - let contents = "Lorem ipsum dolor sit amet.".to_string(); - let dir = tempfile::tempdir().unwrap(); - let file_path = dir.path().join("file.txt"); - fs_err::write(&file_path, contents.to_string()).unwrap(); - - let vfs = Vfs::new(StdBackend::new().unwrap()); - let canonicalized = vfs.canonicalize(&file_path).unwrap(); - assert_eq!(canonicalized, dunce::canonicalize(&file_path).unwrap()); - assert_eq!( - vfs.read_to_string(&canonicalized).unwrap().to_string(), - contents.to_string() - ); - } - - #[test] - #[cfg(windows)] - fn canonicalize_std_backend_not_verbatim() { - use std::path::{Component, Prefix}; - - let dir = tempfile::tempdir().unwrap(); - let file_path = dir.path().join("file.txt"); - fs_err::write(&file_path, "hello").unwrap(); - - let vfs = Vfs::new(StdBackend::new().unwrap()); - let canonicalized = vfs.canonicalize(&file_path).unwrap(); - - let is_verbatim = matches!( - canonicalized.components().next(), - Some(Component::Prefix(prefix)) if matches!( - prefix.kind(), - Prefix::Verbatim(_) | Prefix::VerbatimDisk(_) | Prefix::VerbatimUNC(_, _) - ) - ); - assert!( - !is_verbatim, - "expected a non-verbatim path, got {:?}", - canonicalized - ); - - // Joining a relative parent path must preserve the `..` segment. On a - // verbatim path Rust would drop it lexically, which is the root cause - // of the bug. - let joined = canonicalized.join("..").join("sibling"); - assert!( - joined.components().any(|c| c == Component::ParentDir), - "`..` should be preserved when joining onto {:?}", - canonicalized - ); - } - - #[test] - fn canonicalize_std_backend_missing_errors() { - let dir = tempfile::tempdir().unwrap(); - let file_path = dir.path().join("test"); - - let vfs = Vfs::new(StdBackend::new().unwrap()); - let err = vfs.canonicalize(&file_path).unwrap_err(); - assert_eq!(err.kind(), io::ErrorKind::NotFound); - } -} diff --git a/memofs/src/noop_backend.rs b/memofs/src/noop_backend.rs new file mode 100644 index 00000000..383119c5 --- /dev/null +++ b/memofs/src/noop_backend.rs @@ -0,0 +1,76 @@ +use std::io; +use std::path::Path; + +use crate::{Metadata, ReadDir, VfsBackend, VfsEvent}; + +/// `VfsBackend` that returns an error on every operation. +#[non_exhaustive] +pub struct NoopBackend; + +impl NoopBackend { + pub fn new() -> Self { + Self + } +} + +impl VfsBackend for NoopBackend { + fn read(&mut self, _path: &Path) -> io::Result> { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } + + fn write(&mut self, _path: &Path, _data: &[u8]) -> io::Result<()> { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } + + fn read_dir(&mut self, _path: &Path) -> io::Result { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } + + fn remove_file(&mut self, _path: &Path) -> io::Result<()> { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } + + fn remove_dir_all(&mut self, _path: &Path) -> io::Result<()> { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } + + fn metadata(&mut self, _path: &Path) -> io::Result { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } + + fn event_receiver(&self) -> crossbeam_channel::Receiver { + crossbeam_channel::never() + } + + fn watch(&mut self, _path: &Path) -> io::Result<()> { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } + + fn unwatch(&mut self, _path: &Path) -> io::Result<()> { + Err(io::Error::new( + io::ErrorKind::Other, + "NoopBackend doesn't do anything", + )) + } +} diff --git a/crates/memofs/src/snapshot.rs b/memofs/src/snapshot.rs similarity index 100% rename from crates/memofs/src/snapshot.rs rename to memofs/src/snapshot.rs diff --git a/crates/memofs/src/std_backend.rs b/memofs/src/std_backend.rs similarity index 71% rename from crates/memofs/src/std_backend.rs rename to memofs/src/std_backend.rs index 3f0ab2c1..7e616cbd 100644 --- a/crates/memofs/src/std_backend.rs +++ b/memofs/src/std_backend.rs @@ -1,8 +1,8 @@ -use std::path::{Path, PathBuf}; +use std::io; +use std::path::Path; use std::sync::mpsc; use std::thread; use std::time::Duration; -use std::{collections::HashSet, io}; use crossbeam_channel::Receiver; use notify::{watcher, DebouncedEvent, RecommendedWatcher, RecursiveMode, Watcher}; @@ -13,13 +13,12 @@ use crate::{DirEntry, Metadata, ReadDir, VfsBackend, VfsEvent}; pub struct StdBackend { watcher: RecommendedWatcher, watcher_receiver: Receiver, - watches: HashSet, } impl StdBackend { - pub fn new() -> io::Result { + pub fn new() -> StdBackend { let (notify_tx, notify_rx) = mpsc::channel(); - let watcher = watcher(notify_tx, Duration::from_millis(50)).map_err(io::Error::other)?; + let watcher = watcher(notify_tx, Duration::from_millis(50)).unwrap(); let (tx, rx) = crossbeam_channel::unbounded(); @@ -46,11 +45,10 @@ impl StdBackend { Result::<(), crossbeam_channel::SendError>::Ok(()) }); - Ok(Self { + Self { watcher, watcher_receiver: rx, - watches: HashSet::new(), - }) + } } } @@ -63,10 +61,6 @@ impl VfsBackend for StdBackend { fs_err::write(path, data) } - fn exists(&mut self, path: &Path) -> io::Result { - std::fs::exists(path) - } - fn read_dir(&mut self, path: &Path) -> io::Result { let entries: Result, _> = fs_err::read_dir(path)?.collect(); let mut entries = entries?; @@ -82,14 +76,6 @@ impl VfsBackend for StdBackend { }) } - fn create_dir(&mut self, path: &Path) -> io::Result<()> { - fs_err::create_dir(path) - } - - fn create_dir_all(&mut self, path: &Path) -> io::Result<()> { - fs_err::create_dir_all(path) - } - fn remove_file(&mut self, path: &Path) -> io::Result<()> { fs_err::remove_file(path) } @@ -106,31 +92,19 @@ impl VfsBackend for StdBackend { }) } - fn canonicalize(&mut self, path: &Path) -> io::Result { - dunce::canonicalize(path) - } - fn event_receiver(&self) -> crossbeam_channel::Receiver { self.watcher_receiver.clone() } fn watch(&mut self, path: &Path) -> io::Result<()> { - if self.watches.contains(path) - || path - .ancestors() - .any(|ancestor| self.watches.contains(ancestor)) - { - Ok(()) - } else { - self.watches.insert(path.to_path_buf()); - self.watcher - .watch(path, RecursiveMode::Recursive) - .map_err(io::Error::other) - } + self.watcher + .watch(path, RecursiveMode::NonRecursive) + .map_err(|inner| io::Error::new(io::ErrorKind::Other, inner)) } fn unwatch(&mut self, path: &Path) -> io::Result<()> { - self.watches.remove(path); - self.watcher.unwatch(path).map_err(io::Error::other) + self.watcher + .unwatch(path) + .map_err(|inner| io::Error::new(io::ErrorKind::Other, inner)) } } diff --git a/plugin.project.json b/plugin.project.json deleted file mode 100644 index 1742547b..00000000 --- a/plugin.project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "Rojo", - "tree": { - "$className": "Folder", - "Plugin": { - "$path": "plugin/src" - }, - "Packages": { - "$path": "plugin/Packages", - "Log": { - "$path": "plugin/log" - }, - "Http": { - "$path": "plugin/http" - }, - "Fmt": { - "$path": "plugin/fmt" - }, - "RbxDom": { - "$path": "plugin/rbx_dom_lua" - } - }, - "Version": { - "$path": "plugin/Version.txt" - }, - "UploadDetails": { - "$path": "plugin/UploadDetails.json" - } - } -} diff --git a/plugin/Packages/Flipper b/plugin/Packages/Flipper deleted file mode 160000 index 2d91a5ed..00000000 --- a/plugin/Packages/Flipper +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2d91a5ed55332a3bf50f4eba82f9c812bd2343f8 diff --git a/plugin/Packages/Highlighter b/plugin/Packages/Highlighter deleted file mode 160000 index c12c488d..00000000 --- a/plugin/Packages/Highlighter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c12c488dadfcf6e7b66a14d107b74e751d08060c diff --git a/plugin/Packages/Promise b/plugin/Packages/Promise deleted file mode 160000 index 2c6f4339..00000000 --- a/plugin/Packages/Promise +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2c6f433903275e689ba1d48402d4a9d6fdc605a5 diff --git a/plugin/Packages/Roact b/plugin/Packages/Roact deleted file mode 160000 index 956891b7..00000000 --- a/plugin/Packages/Roact +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 956891b70fdc5410e44e9664719cd0a9f7e6fabd diff --git a/plugin/Packages/TestEZ b/plugin/Packages/TestEZ deleted file mode 160000 index edc7246d..00000000 --- a/plugin/Packages/TestEZ +++ /dev/null @@ -1 +0,0 @@ -Subproject commit edc7246d0173a3a90eba4a9f64ea26c576be5873 diff --git a/plugin/Packages/msgpack-luau b/plugin/Packages/msgpack-luau deleted file mode 160000 index 40f67fc0..00000000 --- a/plugin/Packages/msgpack-luau +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 40f67fc0f6eab20f8db9d3488d3d9f0928d1031b diff --git a/plugin/Packages/t b/plugin/Packages/t deleted file mode 160000 index 1dbfccc1..00000000 --- a/plugin/Packages/t +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1dbfccc182d5870cca5266dd6f3d81618f69fc29 diff --git a/plugin/UploadDetails.json b/plugin/UploadDetails.json deleted file mode 100644 index 2396598f..00000000 --- a/plugin/UploadDetails.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "assetId": 13916111004, - "name": "Rojo", - "description": "The plugin portion of Rojo, a tool to enable professional tooling for Roblox developers.", - "creatorId": 32644114, - "creatorType": "Group" -} \ No newline at end of file diff --git a/plugin/Version.txt b/plugin/Version.txt deleted file mode 100644 index bfe365e7..00000000 --- a/plugin/Version.txt +++ /dev/null @@ -1 +0,0 @@ -7.7.1 \ No newline at end of file diff --git a/plugin/default.project.json b/plugin/default.project.json new file mode 100644 index 00000000..bdaadab3 --- /dev/null +++ b/plugin/default.project.json @@ -0,0 +1,33 @@ +{ + "name": "Rojo", + "tree": { + "$className": "Folder", + "Plugin": { + "$path": "src" + }, + "Log": { + "$path": "log" + }, + "Http": { + "$path": "http" + }, + "Fmt": { + "$path": "fmt" + }, + "RbxDom": { + "$path": "rbx_dom_lua" + }, + "Roact": { + "$path": "modules/roact/src" + }, + "Promise": { + "$path": "modules/promise/lib" + }, + "t": { + "$path": "modules/t/lib" + }, + "Flipper": { + "$path": "modules/flipper/src" + } + } +} \ No newline at end of file diff --git a/plugin/fmt/init.lua b/plugin/fmt/init.lua index 403538f4..99c61c9f 100644 --- a/plugin/fmt/init.lua +++ b/plugin/fmt/init.lua @@ -25,7 +25,7 @@ local function defaultTableDebug(buffer, input) buffer:writeRaw("{") - for key, value in input do + for key, value in pairs(input) do buffer:write("[{:?}] = {:?}", key, value) if next(input, key) ~= nil then @@ -50,7 +50,7 @@ local function defaultTableDebugExtended(buffer, input) buffer:writeLineRaw("{") buffer:indent() - for key, value in input do + for key, value in pairs(input) do buffer:writeLine("[{:?}] = {:#?},", key, value) end @@ -70,7 +70,7 @@ local function debugImpl(buffer, value, extendedForm) elseif valueType == "table" then local valueMeta = getmetatable(value) - if valueMeta ~= nil and valueMeta.__fmtDebug ~= nil then + if valueMeta ~= nil and valueMeta.__fmtDebug ~= nil then -- This type implement's the metamethod we made up to line up with -- Rust's 'Debug' trait. @@ -242,4 +242,4 @@ return { debugOutputBuffer = debugOutputBuffer, fmt = fmt, debugify = debugify, -} +} \ No newline at end of file diff --git a/plugin/http/Error.lua b/plugin/http/Error.lua index f9e46b38..ed85fc67 100644 --- a/plugin/http/Error.lua +++ b/plugin/http/Error.lua @@ -3,12 +3,12 @@ Error.__index = Error Error.Kind = { HttpNotEnabled = { - message = "Rojo requires HTTP access, which is not enabled.\n" - .. "Check your game settings, located in the 'Home' tab of Studio.", + message = "Rojo requires HTTP access, which is not enabled.\n" .. + "Check your game settings, located in the 'Home' tab of Studio.", }, ConnectFailed = { - message = "Couldn't connect to the Rojo server.\n" - .. "Make sure the server is running — use 'rojo serve' to run it!", + message = "Couldn't connect to the Rojo server.\n" .. + "Make sure the server is running — use 'rojo serve' to run it!", }, Timeout = { message = "HTTP request timed out.", @@ -63,13 +63,4 @@ function Error.fromRobloxErrorString(message) return Error.new(Error.Kind.Unknown, message) end -function Error.fromResponse(response) - local lower = (response.body or ""):lower() - if response.code == 408 or response.code == 504 or lower:find("timed? ?out") then - return Error.new(Error.Kind.Timeout) - end - - return Error.new(Error.Kind.Unknown, string.format("%s: %s", tostring(response.code), tostring(response.body))) -end - return Error diff --git a/plugin/http/Response.lua b/plugin/http/Response.lua index b02ff644..ce4e1b6d 100644 --- a/plugin/http/Response.lua +++ b/plugin/http/Response.lua @@ -1,7 +1,5 @@ local HttpService = game:GetService("HttpService") -local msgpack = require(script.Parent.Parent.msgpack) - local stringTemplate = [[ Http.Response { code: %d @@ -33,8 +31,4 @@ function Response:json() return HttpService:JSONDecode(self.body) end -function Response:msgpack() - return msgpack.decode(self.body) -end - -return Response +return Response \ No newline at end of file diff --git a/plugin/http/init.lua b/plugin/http/init.lua index 3d05c6d3..686130ef 100644 --- a/plugin/http/init.lua +++ b/plugin/http/init.lua @@ -1,8 +1,7 @@ local HttpService = game:GetService("HttpService") -local Log = require(script.Parent.Log) -local msgpack = require(script.Parent.msgpack) local Promise = require(script.Parent.Promise) +local Log = require(script.Parent.Log) local HttpError = require(script.Error) local HttpResponse = require(script.Response) @@ -14,13 +13,6 @@ local Http = {} Http.Error = HttpError Http.Response = HttpResponse --- Monkey patch msgpack.UInt64.new to lossily convert the low and high bits of the integer --- to a native Luau number. We should change the upstream decoder to emit a native --- integer, once those are live. -function msgpack.UInt64.new(mostSignificantPart: number, leastSignificantPart: number): number - return (mostSignificantPart % 2 ^ 32) * 2 ^ 32 + (leastSignificantPart % 2 ^ 32) -end - local function performRequest(requestParams) local requestId = lastRequestId + 1 lastRequestId = requestId @@ -38,13 +30,8 @@ local function performRequest(requestParams) end) if success then - Log.trace("Request {} success, response {:#?}", requestId, response) - local httpResponse = HttpResponse.fromRobloxResponse(response) - if httpResponse:isSuccess() then - resolve(httpResponse) - else - reject(HttpError.fromResponse(httpResponse)) - end + Log.trace("Request {} success, status code {}", requestId, response.StatusCode) + resolve(HttpResponse.fromRobloxResponse(response)) else Log.trace("Request {} failure: {:?}", requestId, response) reject(HttpError.fromRobloxErrorString(response)) @@ -76,12 +63,4 @@ function Http.jsonDecode(source) return HttpService:JSONDecode(source) end -function Http.msgpackEncode(object) - return msgpack.encode(object) -end - -function Http.msgpackDecode(source) - return msgpack.decode(source) -end - -return Http +return Http \ No newline at end of file diff --git a/plugin/http/init.spec.lua b/plugin/http/init.spec.lua index ce62f802..ff7e8e3b 100644 --- a/plugin/http/init.spec.lua +++ b/plugin/http/init.spec.lua @@ -2,4 +2,4 @@ return function() it("should load", function() require(script.Parent) end) -end +end \ No newline at end of file diff --git a/plugin/log/init.lua b/plugin/log/init.lua index 882be997..97fa7e46 100644 --- a/plugin/log/init.lua +++ b/plugin/log/init.lua @@ -57,4 +57,4 @@ function Log.error(template, ...) error(Fmt.fmt(template, ...)) end -return Log +return Log \ No newline at end of file diff --git a/plugin/log/init.spec.lua b/plugin/log/init.spec.lua index ce62f802..ff7e8e3b 100644 --- a/plugin/log/init.spec.lua +++ b/plugin/log/init.spec.lua @@ -2,4 +2,4 @@ return function() it("should load", function() require(script.Parent) end) -end +end \ No newline at end of file diff --git a/plugin/modules/flipper b/plugin/modules/flipper new file mode 160000 index 00000000..4cf7a03c --- /dev/null +++ b/plugin/modules/flipper @@ -0,0 +1 @@ +Subproject commit 4cf7a03cb6776ec0af41b6a50988aa70e5c9cc3c diff --git a/plugin/modules/promise b/plugin/modules/promise new file mode 160000 index 00000000..7fb09d10 --- /dev/null +++ b/plugin/modules/promise @@ -0,0 +1 @@ +Subproject commit 7fb09d103f4a680cbd61d5348ec9c5d50244a8e0 diff --git a/plugin/modules/roact b/plugin/modules/roact new file mode 160000 index 00000000..f7d2f1ce --- /dev/null +++ b/plugin/modules/roact @@ -0,0 +1 @@ +Subproject commit f7d2f1ce1dd69120f457c2f8032bb184eb8f0c29 diff --git a/plugin/modules/t b/plugin/modules/t new file mode 160000 index 00000000..f643b506 --- /dev/null +++ b/plugin/modules/t @@ -0,0 +1 @@ +Subproject commit f643b50682c24ec8d6ac3e11f41ee8cbbb2bcecb diff --git a/plugin/modules/testez b/plugin/modules/testez new file mode 160000 index 00000000..25d957d4 --- /dev/null +++ b/plugin/modules/testez @@ -0,0 +1 @@ +Subproject commit 25d957d4d5c4c02a52843ef43e72f21f973c2908 diff --git a/plugin/rbx_dom_lua/EncodedValue.lua b/plugin/rbx_dom_lua/EncodedValue.lua index cddff6a3..3c495888 100644 --- a/plugin/rbx_dom_lua/EncodedValue.lua +++ b/plugin/rbx_dom_lua/EncodedValue.lua @@ -20,54 +20,11 @@ local function serializeFloat(value) return value end -local ALL_AXES = { "X", "Y", "Z" } -local ALL_FACES = { "Right", "Top", "Back", "Left", "Bottom", "Front" } - -local EncodedValue = {} +local ALL_AXES = {"X", "Y", "Z"} +local ALL_FACES = {"Right", "Top", "Back", "Left", "Bottom", "Front"} local types types = { - Attributes = { - fromPod = function(pod) - local output = {} - - for key, value in pairs(pod) do - local ok, result = EncodedValue.decode(value) - - if ok then - output[key] = result - else - local warning = ("Could not decode attribute value of type %q: %s"):format( - typeof(value), - tostring(result) - ) - warn(warning) - end - end - - return output - end, - toPod = function(roblox) - local output = {} - - for key, value in pairs(roblox) do - local ok, result = EncodedValue.encodeNaive(value) - - if ok then - output[key] = result - else - local warning = ("Could not encode attribute value of type %q: %s"):format( - typeof(value), - tostring(result) - ) - warn(warning) - end - end - - return output - end, - }, - Axes = { fromPod = function(pod) local axes = {} @@ -117,7 +74,6 @@ types = { local pos = pod.position local orient = pod.orientation - --stylua: ignore return CFrame.new( pos[1], pos[2], pos[3], orient[1][1], orient[1][2], orient[1][3], @@ -127,14 +83,17 @@ types = { end, toPod = function(roblox) - local x, y, z, r00, r01, r02, r10, r11, r12, r20, r21, r22 = roblox:GetComponents() + local x, y, z, + r00, r01, r02, + r10, r11, r12, + r20, r21, r22 = roblox:GetComponents() return { - position = { x, y, z }, + position = {x, y, z}, orientation = { - { r00, r01, r02 }, - { r10, r11, r12 }, - { r20, r21, r22 }, + {r00, r01, r02}, + {r10, r11, r12}, + {r20, r21, r22}, }, } end, @@ -144,7 +103,7 @@ types = { fromPod = unpackDecoder(Color3.new), toPod = function(roblox) - return { roblox.r, roblox.g, roblox.b } + return {roblox.r, roblox.g, roblox.b} end, }, @@ -165,7 +124,10 @@ types = { local keypoints = {} for index, keypoint in ipairs(pod.keypoints) do - keypoints[index] = ColorSequenceKeypoint.new(keypoint.time, types.Color3.fromPod(keypoint.color)) + keypoints[index] = ColorSequenceKeypoint.new( + keypoint.time, + types.Color3.fromPod(keypoint.color) + ) end return ColorSequence.new(keypoints) @@ -188,38 +150,6 @@ types = { }, Content = { - fromPod = function(pod): Content - if type(pod) == "string" then - if pod == "None" then - return Content.none - else - error(`unexpected Content value '{pod}'`) - end - else - local ty, value = next(pod) - if ty == "Uri" then - return Content.fromUri(value) - elseif ty == "Object" then - error("Object deserializing is not currently implemented") - else - error(`Unknown Content type '{ty}' (could not deserialize)`) - end - end - end, - toPod = function(roblox: Content) - if roblox.SourceType == Enum.ContentSourceType.None then - return "None" - elseif roblox.SourceType == Enum.ContentSourceType.Uri then - return { Uri = roblox.Uri } - elseif roblox.SourceType == Enum.ContentSourceType.Object then - error("Object serializing is not currently implemented") - else - error(`Unknown Content type '{roblox.SourceType} (could not serialize)`) - end - end, - }, - - ContentId = { fromPod = identity, toPod = identity, }, @@ -237,19 +167,6 @@ types = { end, }, - EnumItem = { - fromPod = function(pod) - return Enum[pod.type]:FromValue(pod.value) - end, - - toPod = function(roblox) - return { - type = tostring(roblox.EnumType), - value = roblox.Value, - } - end, - }, - Faces = { fromPod = function(pod) local faces = {} @@ -284,23 +201,6 @@ types = { toPod = serializeFloat, }, - Font = { - fromPod = function(pod) - return Font.new( - pod.family, - if pod.weight ~= nil then Enum.FontWeight[pod.weight] else nil, - if pod.style ~= nil then Enum.FontStyle[pod.style] else nil - ) - end, - toPod = function(roblox) - return { - family = roblox.Family, - weight = roblox.Weight.Name, - style = roblox.Style.Name, - } - end, - }, - Int32 = { fromPod = identity, toPod = identity, @@ -311,32 +211,11 @@ types = { toPod = identity, }, - MaterialColors = { - fromPod = function(pod: { [string]: { number } }) - local real = {} - for name, color in pod do - real[Enum.Material[name]] = Color3.fromRGB(color[1], color[2], color[3]) - end - return real - end, - toPod = function(roblox: { [Enum.Material]: Color3 }) - local pod = {} - for material, color in roblox do - pod[material.Name] = { - math.round(math.clamp(color.R, 0, 1) * 255), - math.round(math.clamp(color.G, 0, 1) * 255), - math.round(math.clamp(color.B, 0, 1) * 255), - } - end - return pod - end, - }, - NumberRange = { fromPod = unpackDecoder(NumberRange.new), toPod = function(roblox) - return { roblox.Min, roblox.Max } + return {roblox.Min, roblox.Max} end, }, @@ -345,12 +224,11 @@ types = { local keypoints = {} for index, keypoint in ipairs(pod.keypoints) do - -- TODO: Add a test for NaN or Infinity values and envelopes - -- Right now it isn't possible because it'd fail the roundtrip. - -- It's more important that it works right now, though. - local value = keypoint.value or 0 - local envelope = keypoint.envelope or 0 - keypoints[index] = NumberSequenceKeypoint.new(keypoint.time, value, envelope) + keypoints[index] = NumberSequenceKeypoint.new( + keypoint.time, + keypoint.value, + keypoint.envelope + ) end return NumberSequence.new(keypoints) @@ -378,26 +256,13 @@ types = { if pod == "Default" then return nil else - -- Passing `nil` instead of not passing anything gives - -- different results, so we have to branch here. - if pod.acousticAbsorption then - return (PhysicalProperties.new :: any)( - pod.density, - pod.friction, - pod.elasticity, - pod.frictionWeight, - pod.elasticityWeight, - pod.acousticAbsorption - ) - else - return PhysicalProperties.new( - pod.density, - pod.friction, - pod.elasticity, - pod.frictionWeight, - pod.elasticityWeight - ) - end + return PhysicalProperties.new( + pod.density, + pod.friction, + pod.elasticity, + pod.frictionWeight, + pod.elasticityWeight + ) end end, @@ -411,7 +276,6 @@ types = { elasticity = roblox.Elasticity, frictionWeight = roblox.FrictionWeight, elasticityWeight = roblox.ElasticityWeight, - acousticAbsorption = roblox.AcousticAbsorption, } end end, @@ -419,7 +283,10 @@ types = { Ray = { fromPod = function(pod) - return Ray.new(types.Vector3.fromPod(pod.origin), types.Vector3.fromPod(pod.direction)) + return Ray.new( + types.Vector3.fromPod(pod.origin), + types.Vector3.fromPod(pod.direction) + ) end, toPod = function(roblox) @@ -432,7 +299,10 @@ types = { Rect = { fromPod = function(pod) - return Rect.new(types.Vector2.fromPod(pod[1]), types.Vector2.fromPod(pod[2])) + return Rect.new( + types.Vector2.fromPod(pod[1]), + types.Vector2.fromPod(pod[2]) + ) end, toPod = function(roblox) @@ -444,28 +314,31 @@ types = { }, Ref = { - fromPod = function(_) + fromPod = function(_pod) error("Ref cannot be decoded on its own") end, - toPod = function(_) + toPod = function(_roblox) error("Ref can not be encoded on its own") end, }, Region3 = { - fromPod = function(_) + fromPod = function(pod) error("Region3 is not implemented") end, - toPod = function(_) + toPod = function(roblox) error("Region3 is not implemented") end, }, Region3int16 = { fromPod = function(pod) - return Region3int16.new(types.Vector3int16.fromPod(pod[1]), types.Vector3int16.fromPod(pod[2])) + return Region3int16.new( + types.Vector3int16.fromPod(pod[1]), + types.Vector3int16.fromPod(pod[2]) + ) end, toPod = function(roblox) @@ -477,11 +350,11 @@ types = { }, SharedString = { - fromPod = function(_pod) + fromPod = function(pod) error("SharedString is not supported") end, - toPod = function(_roblox) + toPod = function(roblox) error("SharedString is not supported") end, }, @@ -495,13 +368,16 @@ types = { fromPod = unpackDecoder(UDim.new), toPod = function(roblox) - return { roblox.Scale, roblox.Offset } + return {roblox.Scale, roblox.Offset} end, }, UDim2 = { fromPod = function(pod) - return UDim2.new(types.UDim.fromPod(pod[1]), types.UDim.fromPod(pod[2])) + return UDim2.new( + types.UDim.fromPod(pod[1]), + types.UDim.fromPod(pod[2]) + ) end, toPod = function(roblox) @@ -532,7 +408,7 @@ types = { fromPod = unpackDecoder(Vector2int16.new), toPod = function(roblox) - return { roblox.X, roblox.Y } + return {roblox.X, roblox.Y} end, }, @@ -552,37 +428,16 @@ types = { fromPod = unpackDecoder(Vector3int16.new), toPod = function(roblox) - return { roblox.X, roblox.Y, roblox.Z } + return {roblox.X, roblox.Y, roblox.Z} end, }, } -types.OptionalCFrame = { - fromPod = function(pod) - if pod == nil then - return nil - else - return types.CFrame.fromPod(pod) - end - end, - - toPod = function(roblox) - if roblox == nil then - return nil - else - return types.CFrame.toPod(roblox) - end - end, -} +local EncodedValue = {} function EncodedValue.decode(encodedValue) local ty, value = next(encodedValue) - if ty == nil then - -- If the encoded pair is empty, assume it is an unoccupied optional value - return true, nil - end - local typeImpl = types[ty] if typeImpl == nil then return false, "Couldn't decode value " .. tostring(ty) @@ -604,19 +459,4 @@ function EncodedValue.encode(rbxValue, propertyType) } end -local propertyTypeRenames = { - number = "Float64", - boolean = "Bool", - string = "String", -} - -function EncodedValue.encodeNaive(rbxValue) - local propertyType = typeof(rbxValue) - if propertyTypeRenames[propertyType] ~= nil then - propertyType = propertyTypeRenames[propertyType] - end - - return EncodedValue.encode(rbxValue, propertyType) -end - return EncodedValue diff --git a/plugin/rbx_dom_lua/EncodedValue.spec.lua b/plugin/rbx_dom_lua/EncodedValue.spec.lua new file mode 100644 index 00000000..cf0b2201 --- /dev/null +++ b/plugin/rbx_dom_lua/EncodedValue.spec.lua @@ -0,0 +1,72 @@ +return function() + local HttpService = game:GetService("HttpService") + + local EncodedValue = require(script.Parent.EncodedValue) + local allValues = require(script.Parent.allValues) + + local function deepEq(a, b) + if typeof(a) ~= typeof(b) then + return false + end + + local ty = typeof(a) + + if ty == "table" then + local visited = {} + + for key, valueA in pairs(a) do + visited[key] = true + + if not deepEq(valueA, b[key]) then + return false + end + end + + for key, valueB in pairs(b) do + if visited[key] then + continue + end + + if not deepEq(valueB, a[key]) then + return false + end + end + + return true + else + return a == b + end + end + + local extraAssertions = { + CFrame = function(value) + expect(value).to.equal(CFrame.new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) + end, + } + + for testName, testEntry in pairs(allValues) do + it("round trip " .. testName, function() + local ok, decoded = EncodedValue.decode(testEntry.value) + assert(ok, decoded) + + if extraAssertions[testName] ~= nil then + extraAssertions[testName](decoded) + end + + local ok, encoded = EncodedValue.encode(decoded, testEntry.ty) + assert(ok, encoded) + + if not deepEq(encoded, testEntry.value) then + local expected = HttpService:JSONEncode(testEntry.value) + local actual = HttpService:JSONEncode(encoded) + + local message = string.format( + "Round-trip results did not match.\nExpected:\n%s\nActual:\n%s", + expected, actual + ) + + error(message) + end + end) + end +end diff --git a/plugin/rbx_dom_lua/Error.lua b/plugin/rbx_dom_lua/Error.lua index 909c600e..d4c8b1ca 100644 --- a/plugin/rbx_dom_lua/Error.lua +++ b/plugin/rbx_dom_lua/Error.lua @@ -5,7 +5,6 @@ Error.Kind = { UnknownProperty = "UnknownProperty", PropertyNotReadable = "PropertyNotReadable", PropertyNotWritable = "PropertyNotWritable", - CannotParseBinaryString = "CannotParseBinaryString", Roblox = "Roblox", } @@ -26,4 +25,4 @@ function Error:__tostring() return ("Error(%s: %s)"):format(self.kind, tostring(self.extra)) end -return Error +return Error \ No newline at end of file diff --git a/plugin/rbx_dom_lua/PropertyDescriptor.lua b/plugin/rbx_dom_lua/PropertyDescriptor.lua index 1e34e851..3d4c2bd5 100644 --- a/plugin/rbx_dom_lua/PropertyDescriptor.lua +++ b/plugin/rbx_dom_lua/PropertyDescriptor.lua @@ -53,11 +53,6 @@ function PropertyDescriptor:read(instance) end if self.scriptability == "Custom" then - if customProperties[self.className] == nil then - local fullName = ("%s.%s"):format(instance.className, self.name) - return false, Error.new(Error.Kind.PropertyNotReadable, fullName) - end - local interface = customProperties[self.className][self.name] return interface.read(instance, self.name) @@ -84,11 +79,6 @@ function PropertyDescriptor:write(instance, value) end if self.scriptability == "Custom" then - if customProperties[self.className] == nil then - local fullName = ("%s.%s"):format(instance.className, self.name) - return false, Error.new(Error.Kind.PropertyNotWritable, fullName) - end - local interface = customProperties[self.className][self.name] return interface.write(instance, self.name, value) diff --git a/plugin/rbx_dom_lua/allValues.json b/plugin/rbx_dom_lua/allValues.json index 6c74956d..a03cf57b 100644 --- a/plugin/rbx_dom_lua/allValues.json +++ b/plugin/rbx_dom_lua/allValues.json @@ -1,79 +1,4 @@ { - "Attributes": { - "value": { - "Attributes": { - "TestBool": { - "Bool": true - }, - "TestBrickColor": { - "BrickColor": 24 - }, - "TestColor3": { - "Color3": [ - 1.0, - 0.5, - 0.0 - ] - }, - "TestEnumItem": { - "EnumItem": { - "type": "Material", - "value": 256 - } - }, - "TestNumber": { - "Float64": 1337.0 - }, - "TestRect": { - "Rect": [ - [ - 1.0, - 2.0 - ], - [ - 3.0, - 4.0 - ] - ] - }, - "TestString": { - "String": "Test" - }, - "TestUDim": { - "UDim": [ - 1.0, - 2 - ] - }, - "TestUDim2": { - "UDim2": [ - [ - 1.0, - 2 - ], - [ - 3.0, - 4 - ] - ] - }, - "TestVector2": { - "Vector2": [ - 1.0, - 2.0 - ] - }, - "TestVector3": { - "Vector3": [ - 1.0, - 2.0, - 3.0 - ] - } - } - }, - "ty": "Attributes" - }, "Axes": { "value": { "Axes": [ @@ -176,23 +101,9 @@ }, "ty": "ColorSequence" }, - "ContentId": { + "Content": { "value": { - "ContentId": "rbxassetid://12345" - }, - "ty": "ContentId" - }, - "Content_None": { - "value": { - "Content": "None" - }, - "ty": "Content" - }, - "Content_Uri": { - "value": { - "Content": { - "Uri": "rbxasset://abc/123.rojo" - } + "Content": "rbxassetid://12345" }, "ty": "Content" }, @@ -202,15 +113,6 @@ }, "ty": "Enum" }, - "EnumItem": { - "value": { - "EnumItem": { - "type": "Material", - "value": 256 - } - }, - "ty": "EnumItem" - }, "Faces": { "value": { "Faces": [ @@ -236,17 +138,6 @@ }, "ty": "Float64" }, - "Font": { - "value": { - "Font": { - "family": "rbxasset://fonts/families/SourceSansPro.json", - "weight": "Regular", - "style": "Normal", - "cachedFaceId": null - } - }, - "ty": "Font" - }, "Int32": { "value": { "Int32": 6014 @@ -259,118 +150,6 @@ }, "ty": "Int64" }, - "MaterialColors": { - "value": { - "MaterialColors": { - "Grass": [ - 106, - 127, - 63 - ], - "Slate": [ - 63, - 127, - 107 - ], - "Concrete": [ - 127, - 102, - 63 - ], - "Brick": [ - 138, - 86, - 62 - ], - "Sand": [ - 143, - 126, - 95 - ], - "WoodPlanks": [ - 139, - 109, - 79 - ], - "Rock": [ - 102, - 108, - 111 - ], - "Glacier": [ - 101, - 176, - 234 - ], - "Snow": [ - 195, - 199, - 218 - ], - "Sandstone": [ - 137, - 90, - 71 - ], - "Mud": [ - 58, - 46, - 36 - ], - "Basalt": [ - 30, - 30, - 37 - ], - "Ground": [ - 102, - 92, - 59 - ], - "CrackedLava": [ - 232, - 156, - 74 - ], - "Asphalt": [ - 115, - 123, - 107 - ], - "Cobblestone": [ - 132, - 123, - 90 - ], - "Ice": [ - 129, - 194, - 224 - ], - "LeafyGrass": [ - 115, - 132, - 74 - ], - "Salt": [ - 198, - 189, - 181 - ], - "Limestone": [ - 206, - 173, - 148 - ], - "Pavement": [ - 148, - 148, - 140 - ] - } - }, - "ty": "MaterialColors" - }, "NumberRange": { "value": { "NumberRange": [ @@ -399,41 +178,6 @@ }, "ty": "NumberSequence" }, - "OptionalCFrame-None": { - "value": { - "OptionalCFrame": null - }, - "ty": "OptionalCFrame" - }, - "OptionalCFrame-Some": { - "value": { - "OptionalCFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ty": "OptionalCFrame" - }, "PhysicalProperties-Custom": { "value": { "PhysicalProperties": { @@ -441,8 +185,7 @@ "friction": 1.0, "elasticity": 0.0, "frictionWeight": 50.0, - "elasticityWeight": 25.0, - "acousticAbsorption": 0.15625 + "elasticityWeight": 25.0 } }, "ty": "PhysicalProperties" diff --git a/plugin/rbx_dom_lua/base64.lua b/plugin/rbx_dom_lua/base64.lua index 0c6f2abc..33011306 100644 --- a/plugin/rbx_dom_lua/base64.lua +++ b/plugin/rbx_dom_lua/base64.lua @@ -1,10 +1,139 @@ -local EncodingService = game:GetService("EncodingService") +-- Thanks to Tiffany352 for this base64 implementation! + +local floor = math.floor +local char = string.char + +local function encodeBase64(str) + local out = {} + local nOut = 0 + local alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + local strLen = #str + + -- 3 octets become 4 hextets + for i = 1, strLen - 2, 3 do + local b1, b2, b3 = str:byte(i, i + 3) + local word = b3 + b2 * 256 + b1 * 256 * 256 + + local h4 = word % 64 + 1 + word = floor(word / 64) + local h3 = word % 64 + 1 + word = floor(word / 64) + local h2 = word % 64 + 1 + word = floor(word / 64) + local h1 = word % 64 + 1 + + out[nOut + 1] = alphabet:sub(h1, h1) + out[nOut + 2] = alphabet:sub(h2, h2) + out[nOut + 3] = alphabet:sub(h3, h3) + out[nOut + 4] = alphabet:sub(h4, h4) + nOut = nOut + 4 + end + + local remainder = strLen % 3 + + if remainder == 2 then + -- 16 input bits -> 3 hextets (2 full, 1 partial) + local b1, b2 = str:byte(-2, -1) + -- partial is 4 bits long, leaving 2 bits of zero padding -> + -- offset = 4 + local word = b2 * 4 + b1 * 4 * 256 + + local h3 = word % 64 + 1 + word = floor(word / 64) + local h2 = word % 64 + 1 + word = floor(word / 64) + local h1 = word % 64 + 1 + + out[nOut + 1] = alphabet:sub(h1, h1) + out[nOut + 2] = alphabet:sub(h2, h2) + out[nOut + 3] = alphabet:sub(h3, h3) + out[nOut + 4] = "=" + elseif remainder == 1 then + -- 8 input bits -> 2 hextets (2 full, 1 partial) + local b1 = str:byte(-1, -1) + -- partial is 2 bits long, leaving 4 bits of zero padding -> + -- offset = 16 + local word = b1 * 16 + + local h2 = word % 64 + 1 + word = floor(word / 64) + local h1 = word % 64 + 1 + + out[nOut + 1] = alphabet:sub(h1, h1) + out[nOut + 2] = alphabet:sub(h2, h2) + out[nOut + 3] = "=" + out[nOut + 4] = "=" + end + -- if the remainder is 0, then no work is needed + + return table.concat(out, "") +end + +local function decodeBase64(str) + local out = {} + local nOut = 0 + local alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + local strLen = #str + local acc = 0 + local nAcc = 0 + + local alphabetLut = {} + for i = 1, #alphabet do + alphabetLut[alphabet:sub(i, i)] = i - 1 + end + + -- 4 hextets become 3 octets + for i = 1, strLen do + local ch = str:sub(i, i) + local byte = alphabetLut[ch] + if byte then + acc = acc * 64 + byte + nAcc = nAcc + 1 + end + + if nAcc == 4 then + local b3 = acc % 256 + acc = floor(acc / 256) + local b2 = acc % 256 + acc = floor(acc / 256) + local b1 = acc % 256 + + out[nOut + 1] = char(b1) + out[nOut + 2] = char(b2) + out[nOut + 3] = char(b3) + nOut = nOut + 3 + nAcc = 0 + acc = 0 + end + end + + if nAcc == 3 then + -- 3 hextets -> 16 bit output + acc = acc * 64 + acc = floor(acc / 256) + local b2 = acc % 256 + acc = floor(acc / 256) + local b1 = acc % 256 + + out[nOut + 1] = char(b1) + out[nOut + 2] = char(b2) + elseif nAcc == 2 then + -- 2 hextets -> 8 bit output + acc = acc * 64 + acc = floor(acc / 256) + acc = acc * 64 + acc = floor(acc / 256) + local b1 = acc % 256 + + out[nOut + 1] = char(b1) + elseif nAcc == 1 then + error("Base64 has invalid length") + end + + return table.concat(out, "") +end return { - decode = function(input: string) - return buffer.tostring(EncodingService:Base64Decode(buffer.fromstring(input))) - end, - encode = function(input: string) - return buffer.tostring(EncodingService:Base64Encode(buffer.fromstring(input))) - end, -} + decode = decodeBase64, + encode = encodeBase64, +} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/base64.spec.lua b/plugin/rbx_dom_lua/base64.spec.lua new file mode 100644 index 00000000..5f2a5f4a --- /dev/null +++ b/plugin/rbx_dom_lua/base64.spec.lua @@ -0,0 +1,29 @@ +return function() + local base64 = require(script.Parent.base64) + + it("should encode and decode", function() + local function try(str, expected) + local encoded = base64.encode(str) + expect(encoded).to.equal(expected) + expect(base64.decode(encoded)).to.equal(str) + end + + try("Man", "TWFu") + try("Ma", "TWE=") + try("M", "TQ==") + try("ManM", "TWFuTQ==") + try( + [[Man is distinguished, not only by his reason, but by this ]].. + [[singular passion from other animals, which is a lust of the ]].. + [[mind, that by a perseverance of delight in the continued and ]].. + [[indefatigable generation of knowledge, exceeds the short ]].. + [[vehemence of any carnal pleasure.]], + [[TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sI]].. + [[GJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYW]].. + [[xzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJ]].. + [[zZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRl]].. + [[ZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZ]].. + [[SBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=]] + ) + end) +end \ No newline at end of file diff --git a/plugin/rbx_dom_lua/customProperties.lua b/plugin/rbx_dom_lua/customProperties.lua index 0df57c32..7b3dccba 100644 --- a/plugin/rbx_dom_lua/customProperties.lua +++ b/plugin/rbx_dom_lua/customProperties.lua @@ -1,99 +1,10 @@ local CollectionService = game:GetService("CollectionService") -local ScriptEditorService = game:GetService("ScriptEditorService") - -local Error = require(script.Parent.Error) - ---- A list of `Enum.Material` values that are used for Terrain.MaterialColors -local TERRAIN_MATERIAL_COLORS = { - Enum.Material.Grass, - Enum.Material.Slate, - Enum.Material.Concrete, - Enum.Material.Brick, - Enum.Material.Sand, - Enum.Material.WoodPlanks, - Enum.Material.Rock, - Enum.Material.Glacier, - Enum.Material.Snow, - Enum.Material.Sandstone, - Enum.Material.Mud, - Enum.Material.Basalt, - Enum.Material.Ground, - Enum.Material.CrackedLava, - Enum.Material.Asphalt, - Enum.Material.Cobblestone, - Enum.Material.Ice, - Enum.Material.LeafyGrass, - Enum.Material.Salt, - Enum.Material.Limestone, - Enum.Material.Pavement, -} - -local function isAttributeNameValid(attributeName) - -- For SetAttribute to succeed, the attribute name must be less than or - -- equal to 100 characters... - return #attributeName <= 100 - -- ...and must only contain alphanumeric characters, periods, hyphens, - -- underscores, or forward slashes. - and attributeName:match("[^%w%.%-_/]") == nil -end - -local function isAttributeNameReserved(attributeName) - -- For SetAttribute to succeed, attribute names must not use the RBX - -- prefix, which is reserved by Roblox. - return attributeName:sub(1, 3) == "RBX" -end -- Defines how to read and write properties that aren't directly scriptable. -- -- The reflection database refers to these as having scriptability = "Custom" return { Instance = { - Attributes = { - read = function(instance) - return true, instance:GetAttributes() - end, - write = function(instance, _, value) - if typeof(value) ~= "table" then - return false, Error.new(Error.Kind.CannotParseBinaryString) - end - - local existing = instance:GetAttributes() - local didAllWritesSucceed = true - - for attributeName, attributeValue in pairs(value) do - if isAttributeNameReserved(attributeName) then - -- If the attribute name is reserved, then we don't - -- really care about reporting any failures about - -- it. - continue - end - - if not isAttributeNameValid(attributeName) then - didAllWritesSucceed = false - continue - end - - instance:SetAttribute(attributeName, attributeValue) - end - - for existingAttributeName in pairs(existing) do - if isAttributeNameReserved(existingAttributeName) then - continue - end - - if not isAttributeNameValid(existingAttributeName) then - didAllWritesSucceed = false - continue - end - - if value[existingAttributeName] == nil then - instance:SetAttribute(existingAttributeName, nil) - end - end - - return didAllWritesSucceed - end, - }, Tags = { read = function(instance) return true, CollectionService:GetTags(instance) @@ -121,115 +32,13 @@ return { }, LocalizationTable = { Contents = { - read = function(instance, _) + read = function(instance, key) return true, instance:GetContents() end, - write = function(instance, _, value) + write = function(instance, key, value) instance:SetContents(value) return true end, }, }, - Model = { - Scale = { - read = function(instance, _, _) - return true, instance:GetScale() - end, - write = function(instance, _, value) - return true, instance:ScaleTo(value) - end, - }, - WorldPivotData = { - read = function(instance) - return true, instance.WorldPivot - end, - write = function(instance, _, value) - if value == nil then - return true, nil - else - instance.WorldPivot = value - return true - end - end, - }, - }, - Terrain = { - MaterialColors = { - read = function(instance: Terrain) - -- There's no way to get a list of every color, so we have to - -- make one. - local colors = {} - for _, material in TERRAIN_MATERIAL_COLORS do - colors[material] = instance:GetMaterialColor(material) - end - - return true, colors - end, - write = function(instance: Terrain, _, value: { [Enum.Material]: Color3 }) - if typeof(value) ~= "table" then - return false, Error.new(Error.Kind.CannotParseBinaryString) - end - - for material, color in value do - instance:SetMaterialColor(material, color) - end - - return true - end, - }, - }, - Script = { - Source = { - read = function(instance: Script) - return true, ScriptEditorService:GetEditorSource(instance) - end, - write = function(instance: Script, _, value: string) - task.spawn(function() - ScriptEditorService:UpdateSourceAsync(instance, function() - return value - end) - end) - return true - end, - }, - }, - ModuleScript = { - Source = { - read = function(instance: ModuleScript) - return true, ScriptEditorService:GetEditorSource(instance) - end, - write = function(instance: ModuleScript, _, value: string) - task.spawn(function() - ScriptEditorService:UpdateSourceAsync(instance, function() - return value - end) - end) - return true - end, - }, - }, - StyleRule = { - Properties = { - read = function(instance: StyleRule) - return true, instance:GetProperties() - end, - write = function(instance: StyleRule, _, value: { [any]: any }) - if typeof(value) ~= "table" then - return false, Error.new(Error.Kind.CannotParseBinaryString) - end - - local existing = instance:GetProperties() - - instance:SetProperties(value) - - for existingItemName in pairs(existing) do - if value[existingItemName] == nil then - instance:SetProperty(existingItemName, nil) - end - end - - return true - end, - }, - }, } diff --git a/plugin/rbx_dom_lua/database.json b/plugin/rbx_dom_lua/database.json index 0b7ccb9c..37183baf 100644 --- a/plugin/rbx_dom_lua/database.json +++ b/plugin/rbx_dom_lua/database.json @@ -1,11 +1,22 @@ { "Version": [ 0, - 741, - 19, - 7411056 + 504, + 0, + 5040410 ], "Classes": { + "ABTestService": { + "Name": "ABTestService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, "Accessory": { "Name": "Accessory", "Tags": [], @@ -13,7 +24,7 @@ "Properties": { "AccessoryType": { "Name": "AccessoryType", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Enum": "AccessoryType" }, @@ -29,9 +40,6 @@ "AccessoryType": { "Enum": 0 }, - "Archivable": { - "Bool": true - }, "AttachmentPoint": { "CFrame": { "position": [ @@ -58,235 +66,14 @@ ] } }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AccessoryDescription": { - "Name": "AccessoryDescription", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AccessoryType": { - "Name": "AccessoryType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AccessoryType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AssetId": { - "Name": "AssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Instance": { - "Name": "Instance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsLayered": { - "Name": "IsLayered", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Order": { - "Name": "Order", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Puffiness": { - "Name": "Puffiness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rotation": { - "Name": "Rotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Scale": { - "Name": "Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AccessoryType": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "AssetId": { - "Int64": 0 - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsLayered": { - "Bool": false - }, - "Order": { - "Int32": 0 - }, - "Position": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Puffiness": { - "Float32": 1.0 - }, - "Rotation": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AccountService": { - "Name": "AccountService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -302,7 +89,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -331,7 +117,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -347,7 +132,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -363,7 +147,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -371,28 +154,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "BackendAccoutrementState": { - "Name": "BackendAccoutrementState", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, "AttachmentPoint": { "CFrame": { "position": [ @@ -419,67 +183,14 @@ ] } }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AchievementService": { - "Name": "AchievementService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ActivityHistoryEventService": { - "Name": "ActivityHistoryEventService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -489,384 +200,17 @@ "Superclass": "Model", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "LevelOfDetail": { "Enum": 0 }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SlimHash": { - "SharedString": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "AdGui": { - "Name": "AdGui", - "Tags": [], - "Superclass": "SurfaceGuiBase", - "Properties": { - "AdShape": { - "Name": "AdShape", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdShape" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableVideoAds": { - "Name": "EnableVideoAds", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FallbackImage": { - "Name": "FallbackImage", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "FallbackImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "FallbackImageContent": { - "Name": "FallbackImageContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Status": { - "Name": "Status", - "Scriptability": "Read", - "DataType": { - "Enum": "AdUnitStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AdPlacement": { - "Name": "AdPlacement", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ActivationInstance": { - "Name": "ActivationInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AdFormat": { - "Name": "AdFormat", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdFormat" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlacementId": { - "Name": "PlacementId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RewardId": { - "Name": "RewardId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RewardImageContent": { - "Name": "RewardImageContent", - "Scriptability": "Read", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RewardName": { - "Name": "RewardName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Visible": { - "Name": "Visible", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "AdFormat": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PlacementId": { - "Int64": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AdPortal": { - "Name": "AdPortal", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "PortalInvalidReason": { - "Name": "PortalInvalidReason", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PortalVersion": { - "Name": "PortalVersion", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Status": { - "Name": "Status", - "Scriptability": "Read", - "DataType": { - "Enum": "AdUnitStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -878,201 +222,14 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AdvancedDragger": { "Name": "AdvancedDragger", "Tags": [], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AirController": { - "Name": "AirController", - "Tags": [], - "Superclass": "ControllerBase", - "Properties": { - "BalanceMaxTorque": { - "Name": "BalanceMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BalanceSpeed": { - "Name": "BalanceSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LinearImpulse": { - "Name": "LinearImpulse", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaintainAngularMomentum": { - "Name": "MaintainAngularMomentum", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaintainLinearMomentum": { - "Name": "MaintainLinearMomentum", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MoveMaxForce": { - "Name": "MoveMaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TurnMaxTorque": { - "Name": "TurnMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TurnSpeedFactor": { - "Name": "TurnSpeedFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BalanceMaxTorque": { - "Float32": 10000.0 - }, - "BalanceRigidityEnabled": { - "Bool": false - }, - "BalanceSpeed": { - "Float32": 100.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaintainAngularMomentum": { - "Bool": true - }, - "MaintainLinearMomentum": { - "Bool": true - }, - "MoveMaxForce": { - "Float32": 1000.0 - }, - "MoveSpeedFactor": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TurnMaxTorque": { - "Float32": 10000.0 - }, - "TurnSpeedFactor": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AlignOrientation": { "Name": "AlignOrientation", @@ -1105,21 +262,6 @@ } } }, - "LookAtPosition": { - "Name": "LookAtPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "MaxAngularVelocity": { "Name": "MaxAngularVelocity", "Scriptability": "ReadWrite", @@ -1165,12 +307,10 @@ "DataType": { "Value": "Vector3" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -1232,25 +372,20 @@ "DataType": { "Value": "Vector3" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } } }, "DefaultProperties": { "AlignType": { - "Enum": 5 + "Enum": 0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -1278,18 +413,12 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color": { - "BrickColor": 23 + "Int32": 23 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxAngularVelocity": { "Float32": null }, @@ -1299,6 +428,13 @@ "Mode": { "Enum": 1 }, + "PrimaryAxis": { + "Vector3": [ + 1.0, + 0.0, + 0.0 + ] + }, "PrimaryAxisOnly": { "Bool": false }, @@ -1311,17 +447,18 @@ "RigidityEnabled": { "Bool": false }, - "Sandboxed": { - "Bool": false + "SecondaryAxis": { + "Vector3": [ + 0.0, + 1.0, + 0.0 + ] }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false @@ -1346,45 +483,6 @@ } } }, - "ForceLimitMode": { - "Name": "ForceLimitMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ForceLimitMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ForceRelativeTo": { - "Name": "ForceRelativeTo", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorRelativeTo" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxAxesForce": { - "Name": "MaxAxesForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MaxForce": { "Name": "MaxForce", "Scriptability": "ReadWrite", @@ -1481,37 +579,15 @@ "ApplyAtCenterOfMass": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 194 + "Int32": 194 }, "Enabled": { "Bool": true }, - "ForceLimitMode": { - "Enum": 0 - }, - "ForceRelativeTo": { - "Enum": 2 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxAxesForce": { - "Vector3": [ - 10000.0, - 10000.0, - 10000.0 - ] - }, "MaxForce": { "Float32": 10000.0 }, @@ -1537,28 +613,29 @@ "RigidityEnabled": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false } } }, + "AnalysticsSettings": { + "Name": "AnalysticsSettings", + "Tags": [ + "NotCreatable" + ], + "Superclass": "GenericSettings", + "Properties": {}, + "DefaultProperties": {} + }, "AnalyticsService": { "Name": "AnalyticsService", "Tags": [ - "NotCreatable", - "NotReplicated", "Service" ], "Superclass": "Instance", @@ -1580,14 +657,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "ApiKey": { + "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "SourceAssetId": { + "Int64": -1 + }, + "Tags": { + "BinaryString": "" } } }, @@ -1657,24 +737,15 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 23 + "Int32": 23 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxTorque": { "Float32": 0.0 }, @@ -1684,164 +755,24 @@ "RelativeTo": { "Enum": 2 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false } } }, - "AnimatedImage": { - "Name": "AnimatedImage", - "Tags": [ - "NotCreatable" - ], - "Superclass": "GuiBase", - "Properties": { - "Content": { - "Name": "Content", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PlaybackSpeed": { - "Name": "PlaybackSpeed", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimatedImageService": { - "Name": "AnimatedImageService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimatedImageTrack": { - "Name": "AnimatedImageTrack", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "Duration": { - "Name": "Duration", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FrameCount": { - "Name": "FrameCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TrackName": { - "Name": "TrackName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": {} - }, "Animation": { "Name": "Animation", "Tags": [], "Superclass": "Instance", "Properties": { - "AnimationContent": { - "Name": "AnimationContent", + "AnimationId": { + "Name": "AnimationId", "Scriptability": "ReadWrite", "DataType": { "Value": "Content" @@ -1852,53 +783,20 @@ "Serialization": "Serializes" } } - }, - "AnimationId": { - "Name": "AnimationId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "AnimationContent", - "Migration": "ContentIdToContent" - } - } - } - } } }, "DefaultProperties": { - "AnimationContent": { - "Content": "None" + "AnimationId": { + "Content": "" }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -1909,54 +807,6 @@ ], "Superclass": "Instance", "Properties": { - "Guid": { - "Name": "Guid", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GuidBinaryString": { - "Name": "GuidBinaryString", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Length": { - "Name": "Length", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Loop": { "Name": "Loop", "Scriptability": "ReadWrite", @@ -1984,17 +834,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AnimationClipProvider": { "Name": "AnimationClipProvider", @@ -2005,297 +845,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationConstraint": { - "Name": "AnimationConstraint", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "AngularDamping": { - "Name": "AngularDamping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularStrength": { - "Name": "AngularStrength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "C0": { - "Name": "C0", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "C1": { - "Name": "C1", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsKinematic": { - "Name": "IsKinematic", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LinearDamping": { - "Name": "LinearDamping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LinearStrength": { - "Name": "LinearStrength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxForce": { - "Name": "MaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Part0": { - "Name": "Part0", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Part1": { - "Name": "Part1", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Transform": { - "Name": "Transform", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AngularDamping": { - "Float32": 1.0 - }, - "AngularStrength": { - "Float32": 1.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 23 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsKinematic": { - "Bool": false - }, - "LinearDamping": { - "Float32": 1.0 - }, - "LinearStrength": { - "Float32": 1.0 - }, - "MaxForce": { - "Float32": 10000.0 - }, - "MaxTorque": { - "Float32": 10000.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Transform": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } + "DefaultProperties": {} }, "AnimationController": { "Name": "AnimationController", @@ -2303,267 +853,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationFromVideoCreatorService": { - "Name": "AnimationFromVideoCreatorService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationFromVideoCreatorStudioService": { - "Name": "AnimationFromVideoCreatorStudioService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationGraphDefinition": { - "Name": "AnimationGraphDefinition", - "Tags": [], - "Superclass": "AnimationClip", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "GuidBinaryString": { - "BinaryString": "AAAAAAAAAAAAAAAAAAAAAA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Loop": { - "Bool": true - }, - "Priority": { - "Enum": 2 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationImportData": { - "Name": "AnimationImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseImportData", - "Properties": { - "ForceNewVersion": { - "Name": "ForceNewVersion", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VersionedAssetId": { - "Name": "VersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationNode": { - "Name": "AnimationNode", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "AnimationNodeDefinition": { - "Name": "AnimationNodeDefinition", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "InputPinData": { - "Name": "InputPinData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NodeId": { - "Name": "NodeId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NodeType": { - "Name": "NodeType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AnimationNodeType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InputPinData": { - "BinaryString": "AQAAAAAAAAA=" - }, - "NodeId": { - "String": "" - }, - "NodeType": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -2571,287 +868,16 @@ "Name": "AnimationRigData", "Tags": [], "Superclass": "Instance", - "Properties": { - "Generic": { - "Name": "Generic", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "label": { - "Name": "label", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "name": { - "Name": "name", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "parent": { - "Name": "parent", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "postTransform": { - "Name": "postTransform", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "preTransform": { - "Name": "preTransform", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "transform": { - "Name": "transform", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Generic": { - "BinaryString": "/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "label": { - "BinaryString": "AgAAAAEAAAAAAAAA" - }, - "name": { - "BinaryString": "AQAAAAEAAAAAAAAA" - }, - "parent": { - "BinaryString": "AQAAAAEAAAAAAA==" - }, - "postTransform": { - "BinaryString": "AgAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA=" - }, - "preTransform": { - "BinaryString": "AgAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA=" - }, - "transform": { - "BinaryString": "AgAAAAEAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAA=" - } - } - }, - "AnimationStreamTrack": { - "Name": "AnimationStreamTrack", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Animation": { - "Name": "Animation", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FACSDataLod": { - "Name": "FACSDataLod", - "Scriptability": "Read", - "DataType": { - "Enum": "FACSDataLod" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPlaying": { - "Name": "IsPlaying", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AnimationPriority" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WeightCurrent": { - "Name": "WeightCurrent", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WeightTarget": { - "Name": "WeightTarget", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -3000,829 +1026,22 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationValueNodeDefinition": { - "Name": "AnimationValueNodeDefinition", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "NodeId": { - "Name": "NodeId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NodeType": { - "Name": "NodeType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AnimationValueNodeType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "NodeId": { - "String": "" - }, - "NodeType": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationValueOutputDefinition": { - "Name": "AnimationValueOutputDefinition", - "Tags": [], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Animator": { "Name": "Animator", "Tags": [], "Superclass": "Instance", - "Properties": { - "AnimationId0": { - "Name": "AnimationId0", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId1": { - "Name": "AnimationId1", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId10": { - "Name": "AnimationId10", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId11": { - "Name": "AnimationId11", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId12": { - "Name": "AnimationId12", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId13": { - "Name": "AnimationId13", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId14": { - "Name": "AnimationId14", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId15": { - "Name": "AnimationId15", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId2": { - "Name": "AnimationId2", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId3": { - "Name": "AnimationId3", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId4": { - "Name": "AnimationId4", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId5": { - "Name": "AnimationId5", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId6": { - "Name": "AnimationId6", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId7": { - "Name": "AnimationId7", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId8": { - "Name": "AnimationId8", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimationId9": { - "Name": "AnimationId9", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EvaluationThrottled": { - "Name": "EvaluationThrottled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PreferLodEnabled": { - "Name": "PreferLodEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootMotion": { - "Name": "RootMotion", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotBrowsable", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RootMotionWeight": { - "Name": "RootMotionWeight", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotBrowsable", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PreferLodEnabled": { - "Bool": true - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Annotation": { - "Name": "Annotation", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AuthorColor3": { - "Name": "AuthorColor3", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AuthorId": { - "Name": "AuthorId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ChannelId": { - "Name": "ChannelId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Contents": { - "Name": "Contents", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CreationTimeUnix": { - "Name": "CreationTimeUnix", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LastModifiedTimeUnix": { - "Name": "LastModifiedTimeUnix", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LoadingReplies": { - "Name": "LoadingReplies", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MessageId": { - "Name": "MessageId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReplyCount": { - "Name": "ReplyCount", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Resolved": { - "Name": "Resolved", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TaggedUsers": { - "Name": "TaggedUsers", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnnotationsService": { - "Name": "AnnotationsService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AnnotationsLoadingStatus": { - "Name": "AnnotationsLoadingStatus", - "Scriptability": "None", - "DataType": { - "Enum": "AnnotationRequestStatus" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnnotationsVisible": { - "Name": "AnnotationsVisible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Hovered": { - "Name": "Hovered", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Mode": { - "Name": "Mode", - "Scriptability": "None", - "DataType": { - "Enum": "AnnotationEditingMode" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ResolvedLoadingStatus": { - "Name": "ResolvedLoadingStatus", - "Scriptability": "None", - "DataType": { - "Enum": "AnnotationRequestStatus" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Selected": { - "Name": "Selected", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AppAgeSignalsService": { - "Name": "AppAgeSignalsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AppLifecycleObserverService": { - "Name": "AppLifecycleObserverService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AppRatingPromptService": { - "Name": "AppRatingPromptService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -3835,17 +1054,7 @@ ], "Superclass": "LocalStorageService", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AppUpdateService": { "Name": "AppUpdateService", @@ -3856,17 +1065,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ArcHandles": { "Name": "ArcHandles", @@ -3885,94 +1084,11 @@ "Serialization": "Serializes" } } - }, - "MouseButton1DownConnectionCount": { - "Name": "MouseButton1DownConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseButton1UpConnectionCount": { - "Name": "MouseButton1UpConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseDragConnectionCount": { - "Name": "MouseDragConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseEnterConnectionCount": { - "Name": "MouseEnterConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseLeaveConnectionCount": { - "Name": "MouseLeaveConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Axes": { "Axes": [ @@ -3981,34 +1097,22 @@ "Z" ] }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } @@ -4023,17 +1127,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AssetDeliveryProxy": { "Name": "AssetDeliveryProxy", @@ -4043,58 +1137,8 @@ "Service" ], "Superclass": "Instance", - "Properties": { - "Interface": { - "Name": "Interface", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Port": { - "Name": "Port", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StartServer": { - "Name": "StartServer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "Properties": {}, + "DefaultProperties": {} }, "AssetImportService": { "Name": "AssetImportService", @@ -4105,37 +1149,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AssetImportSession": { - "Name": "AssetImportSession", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "ImportSession", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AssetManagerService": { "Name": "AssetManagerService", @@ -4146,98 +1160,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AssetPatchSettings": { - "Name": "AssetPatchSettings", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "ContentId": { - "Name": "ContentId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OutputPath": { - "Name": "OutputPath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PatchId": { - "Name": "PatchId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AssetQualityService": { - "Name": "AssetQualityService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AssetService": { "Name": "AssetService", @@ -4246,67 +1169,16 @@ "Service" ], "Superclass": "Instance", - "Properties": { - "AllowInsertFreeAssets": { - "Name": "AllowInsertFreeAssets", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "AllowInsertFreeAssets": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AssetSoundEffect": { - "Name": "AssetSoundEffect", - "Tags": [ - "NotCreatable" - ], - "Superclass": "CustomSoundEffect", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -4395,14 +1267,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { "Color3": [ @@ -4427,91 +1293,14 @@ "Haze": { "Float32": 0.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Offset": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AtmosphereSensor": { - "Name": "AtmosphereSensor", - "Tags": [], - "Superclass": "SensorBase", - "Properties": { - "AirDensity": { - "Name": "AirDensity", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RelativeWindVelocity": { - "Name": "RelativeWindVelocity", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpdateType": { - "Enum": 0 + "BinaryString": "" } } }, @@ -4555,7 +1344,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -4571,7 +1359,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -4662,7 +1449,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -4678,7 +1464,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -4722,11 +1507,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -4754,6103 +1536,27 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false } } }, - "AudioAnalyzer": { - "Name": "AudioAnalyzer", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "PeakLevel": { - "Name": "PeakLevel", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RmsLevel": { - "Name": "RmsLevel", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SpectrumEnabled": { - "Name": "SpectrumEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WindowSize": { - "Name": "WindowSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioWindowSize" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "SpectrumEnabled": { - "Bool": true - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WindowSize": { - "Enum": 1 - } - } - }, - "AudioChannelMixer": { - "Name": "AudioChannelMixer", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Layout": { - "Name": "Layout", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioChannelLayout" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Layout": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioChannelSplitter": { - "Name": "AudioChannelSplitter", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Layout": { - "Name": "Layout", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioChannelLayout" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Layout": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioChorus": { - "Name": "AudioChorus", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Depth": { - "Name": "Depth", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Mix": { - "Name": "Mix", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rate": { - "Name": "Rate", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Depth": { - "Float32": 0.45 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Mix": { - "Float32": 0.85 - }, - "Rate": { - "Float32": 5.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioCompressor": { - "Name": "AudioCompressor", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Attack": { - "Name": "Attack", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Editor": { - "Name": "Editor", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MakeupGain": { - "Name": "MakeupGain", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ratio": { - "Name": "Ratio", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Release": { - "Name": "Release", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Threshold": { - "Name": "Threshold", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attack": { - "Float32": 0.1 - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MakeupGain": { - "Float32": 0.0 - }, - "Ratio": { - "Float32": 40.0 - }, - "Release": { - "Float32": 0.1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Threshold": { - "Float32": -40.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioDeviceInput": { - "Name": "AudioDeviceInput", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AccessList": { - "Name": "AccessList", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AccessType": { - "Name": "AccessType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AccessModifierType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Active": { - "Name": "Active", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DictationEnabled": { - "Name": "DictationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EchoCancellation": { - "Name": "EchoCancellation", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GainControl": { - "Name": "GainControl", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsReady": { - "Name": "IsReady", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Muted": { - "Name": "Muted", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MutedByLocalUser": { - "Name": "MutedByLocalUser", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NoiseSuppression": { - "Name": "NoiseSuppression", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Player": { - "Name": "Player", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AccessType": { - "Enum": 1 - }, - "Active": { - "Bool": true - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Muted": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Volume": { - "Float32": 1.0 - } - } - }, - "AudioDeviceOutput": { - "Name": "AudioDeviceOutput", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Player": { - "Name": "Player", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioDistortion": { - "Name": "AudioDistortion", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Level": { - "Name": "Level", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Level": { - "Float32": 0.5 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioEcho": { - "Name": "AudioEcho", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DelayTime": { - "Name": "DelayTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DryLevel": { - "Name": "DryLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Feedback": { - "Name": "Feedback", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RampTime": { - "Name": "RampTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WetLevel": { - "Name": "WetLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DelayTime": { - "Float32": 1.0 - }, - "DryLevel": { - "Float32": 0.0 - }, - "Feedback": { - "Float32": 0.5 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "RampTime": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WetLevel": { - "Float32": 0.0 - } - } - }, - "AudioEmitter": { - "Name": "AudioEmitter", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AcousticSimulationEnabled": { - "Name": "AcousticSimulationEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngleAttenuation": { - "Name": "AngleAttenuation", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AudioInteractionGroup": { - "Name": "AudioInteractionGroup", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DiffractionEnabled": { - "Name": "DiffractionEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SimulationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DistanceAttenuation": { - "Name": "DistanceAttenuation", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DistanceAttenuationBounds": { - "Name": "DistanceAttenuationBounds", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DistanceAttenuationMode": { - "Name": "DistanceAttenuationMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DistanceAttenuationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OcclusionEnabled": { - "Name": "OcclusionEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SimulationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PositionInstance": { - "Name": "PositionInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PositionType": { - "Name": "PositionType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "EmitterPositionType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReverbEnabled": { - "Name": "ReverbEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SimulationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SimulationFidelity": { - "Name": "SimulationFidelity", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioSimulationFidelity" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AcousticSimulationEnabled": { - "Bool": true - }, - "AngleAttenuation": { - "BinaryString": "AA==" - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioInteractionGroup": { - "String": "" - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DiffractionEnabled": { - "Enum": 0 - }, - "DistanceAttenuation": { - "BinaryString": "AA==" - }, - "DistanceAttenuationBounds": { - "NumberRange": [ - 4.0, - 10000.0 - ] - }, - "DistanceAttenuationMode": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "OcclusionEnabled": { - "Enum": 0 - }, - "PositionType": { - "Enum": 0 - }, - "ReverbEnabled": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SimulationFidelity": { - "Enum": 1 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioEqualizer": { - "Name": "AudioEqualizer", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Editor": { - "Name": "Editor", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HighGain": { - "Name": "HighGain", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LowGain": { - "Name": "LowGain", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MidGain": { - "Name": "MidGain", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MidRange": { - "Name": "MidRange", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HighGain": { - "Float32": 0.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LowGain": { - "Float32": 0.0 - }, - "MidGain": { - "Float32": 0.0 - }, - "MidRange": { - "NumberRange": [ - 400.0, - 4000.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioFader": { - "Name": "AudioFader", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Volume": { - "Float32": 1.0 - } - } - }, - "AudioFilter": { - "Name": "AudioFilter", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Editor": { - "Name": "Editor", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FilterType": { - "Name": "FilterType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioFilterType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Frequency": { - "Name": "Frequency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Gain": { - "Name": "Gain", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Q": { - "Name": "Q", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FilterType": { - "Enum": 0 - }, - "Frequency": { - "Float32": 2000.0 - }, - "Gain": { - "Float32": 0.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Q": { - "Float32": 0.707 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioFlanger": { - "Name": "AudioFlanger", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Depth": { - "Name": "Depth", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Mix": { - "Name": "Mix", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rate": { - "Name": "Rate", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Depth": { - "Float32": 0.45 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Mix": { - "Float32": 0.85 - }, - "Rate": { - "Float32": 5.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioFocusService": { - "Name": "AudioFocusService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioGate": { - "Name": "AudioGate", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Attack": { - "Name": "Attack", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Release": { - "Name": "Release", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Threshold": { - "Name": "Threshold", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attack": { - "Float32": 0.01 - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Release": { - "Float32": 0.1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Threshold": { - "NumberRange": [ - -36.0, - -24.0 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioLimiter": { - "Name": "AudioLimiter", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Editor": { - "Name": "Editor", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxLevel": { - "Name": "MaxLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Release": { - "Name": "Release", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxLevel": { - "Float32": 0.0 - }, - "Release": { - "Float32": 0.01 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioListener": { - "Name": "AudioListener", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AcousticSimulationEnabled": { - "Name": "AcousticSimulationEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngleAttenuation": { - "Name": "AngleAttenuation", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AudioInteractionGroup": { - "Name": "AudioInteractionGroup", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DiffractionEnabled": { - "Name": "DiffractionEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SimulationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DistanceAttenuation": { - "Name": "DistanceAttenuation", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OcclusionEnabled": { - "Name": "OcclusionEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SimulationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PositionInstance": { - "Name": "PositionInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PositionType": { - "Name": "PositionType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ListenerPositionType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReverbEnabled": { - "Name": "ReverbEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SimulationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SimulationFidelity": { - "Name": "SimulationFidelity", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioSimulationFidelity" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AcousticSimulationEnabled": { - "Bool": true - }, - "AngleAttenuation": { - "BinaryString": "AA==" - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioInteractionGroup": { - "String": "" - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DiffractionEnabled": { - "Enum": 0 - }, - "DistanceAttenuation": { - "BinaryString": "AA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "OcclusionEnabled": { - "Enum": 0 - }, - "PositionType": { - "Enum": 0 - }, - "ReverbEnabled": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SimulationFidelity": { - "Enum": 1 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioPages": { - "Name": "AudioPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioPitchShifter": { - "Name": "AudioPitchShifter", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pitch": { - "Name": "Pitch", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WindowSize": { - "Name": "WindowSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioWindowSize" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Pitch": { - "Float32": 1.25 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WindowSize": { - "Enum": 1 - } - } - }, - "AudioPlayer": { - "Name": "AudioPlayer", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Asset": { - "Name": "Asset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "AudioContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "AssetId": { - "Name": "AssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AssetRepresentation": { - "Name": "AssetRepresentation", - "Scriptability": "None", - "DataType": { - "Enum": "AssetRepresentation" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AudioContent": { - "Name": "AudioContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutoLoad": { - "Name": "AutoLoad", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutoPlay": { - "Name": "AutoPlay", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsPlaying": { - "Name": "IsPlaying", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsReady": { - "Name": "IsReady", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LoopRegion": { - "Name": "LoopRegion", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Looping": { - "Name": "Looping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaybackRegion": { - "Name": "PlaybackRegion", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaybackSpeed": { - "Name": "PlaybackSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TimeLength": { - "Name": "TimeLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimePosition": { - "Name": "TimePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioContent": { - "Content": "None" - }, - "AutoLoad": { - "Bool": true - }, - "AutoPlay": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LoopRegion": { - "NumberRange": [ - 0.0, - 60000.0 - ] - }, - "Looping": { - "Bool": false - }, - "PlaybackRegion": { - "NumberRange": [ - 0.0, - 60000.0 - ] - }, - "PlaybackSpeed": { - "Float64": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TimePosition": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Volume": { - "Float32": 1.0 - } - } - }, - "AudioRecorder": { - "Name": "AudioRecorder", - "Tags": [ - "NotBrowsable" - ], - "Superclass": "Instance", - "Properties": { - "IsRecording": { - "Name": "IsRecording", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TimeLength": { - "Name": "TimeLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsRecording": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioReverb": { - "Name": "AudioReverb", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DecayRatio": { - "Name": "DecayRatio", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DecayTime": { - "Name": "DecayTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Density": { - "Name": "Density", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Diffusion": { - "Name": "Diffusion", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DryLevel": { - "Name": "DryLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EarlyDelayTime": { - "Name": "EarlyDelayTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HighCutFrequency": { - "Name": "HighCutFrequency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LateDelayTime": { - "Name": "LateDelayTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LowShelfFrequency": { - "Name": "LowShelfFrequency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LowShelfGain": { - "Name": "LowShelfGain", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReferenceFrequency": { - "Name": "ReferenceFrequency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WetLevel": { - "Name": "WetLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DecayRatio": { - "Float32": 0.5 - }, - "DecayTime": { - "Float32": 1.5 - }, - "Density": { - "Float32": 1.0 - }, - "Diffusion": { - "Float32": 1.0 - }, - "DryLevel": { - "Float32": 0.0 - }, - "EarlyDelayTime": { - "Float32": 0.02 - }, - "HighCutFrequency": { - "Float32": 20000.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LateDelayTime": { - "Float32": 0.04 - }, - "LowShelfFrequency": { - "Float32": 250.0 - }, - "LowShelfGain": { - "Float32": 0.0 - }, - "ReferenceFrequency": { - "Float32": 5000.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WetLevel": { - "Float32": -6.0 - } - } - }, - "AudioSearchParams": { - "Name": "AudioSearchParams", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Album": { - "Name": "Album", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Artist": { - "Name": "Artist", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AudioSubType": { - "Name": "AudioSubType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioSubType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AudioSubtype": { - "Name": "AudioSubtype", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioSubType" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxDuration": { - "Name": "MaxDuration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinDuration": { - "Name": "MinDuration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SearchKeyword": { - "Name": "SearchKeyword", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Tag": { - "Name": "Tag", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Title": { - "Name": "Title", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioSpeechToText": { - "Name": "AudioSpeechToText", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "DictationEnabled": { - "Name": "DictationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DisableVoiceDetection": { - "Name": "DisableVoiceDetection", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EnableVolumeCheck": { - "Name": "EnableVolumeCheck", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Locale": { - "Name": "Locale", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VoiceDetected": { - "Name": "VoiceDetected", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VoiceDetectedOverride": { - "Name": "VoiceDetectedOverride", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Text": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioTextToSpeech": { - "Name": "AudioTextToSpeech", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AutoLocalize": { - "Name": "AutoLocalize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsLoaded": { - "Name": "IsLoaded", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPlaying": { - "Name": "IsPlaying", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Looping": { - "Name": "Looping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pitch": { - "Name": "Pitch", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaybackSpeed": { - "Name": "PlaybackSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Speed": { - "Name": "Speed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TimeLength": { - "Name": "TimeLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimePosition": { - "Name": "TimePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VoiceId": { - "Name": "VoiceId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Looping": { - "Bool": false - }, - "Pitch": { - "Float32": 0.0 - }, - "PlaybackSpeed": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Speed": { - "Float32": 1.0 - }, - "Tags": { - "Tags": [] - }, - "Text": { - "String": "" - }, - "TimePosition": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VoiceId": { - "String": "" - }, - "Volume": { - "Float32": 1.0 - } - } - }, - "AudioTremolo": { - "Name": "AudioTremolo", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Bypass": { - "Name": "Bypass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Depth": { - "Name": "Depth", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Duty": { - "Name": "Duty", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Frequency": { - "Name": "Frequency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shape": { - "Name": "Shape", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Skew": { - "Name": "Skew", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Square": { - "Name": "Square", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bypass": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Depth": { - "Float32": 1.0 - }, - "Duty": { - "Float32": 0.5 - }, - "Frequency": { - "Float32": 5.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "Shape": { - "Float32": 0.0 - }, - "Skew": { - "Float32": 0.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Square": { - "Float32": 0.0 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AudioWindSynthesizer": { - "Name": "AudioWindSynthesizer", - "Tags": [ - "NotBrowsable" - ], - "Superclass": "Instance", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PositionInstance": { - "Name": "PositionInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PositionType": { - "Name": "PositionType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioPositionType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Profile": { - "Name": "Profile", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "WindSoundProfile" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PositionType": { - "Enum": 0 - }, - "Profile": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Volume": { - "Float32": 1.0 - } - } - }, - "AuroraScript": { - "Name": "AuroraScript", - "Tags": [ - "Deprecated" - ], - "Superclass": "LuaSourceContainer", - "Properties": { - "AuroraScriptBindingsSerialize": { - "Name": "AuroraScriptBindingsSerialize", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableCulling": { - "Name": "EnableCulling", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableLOD": { - "Name": "EnableLOD", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LODCriticality": { - "Name": "LODCriticality", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Source": { - "Name": "Source", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ScriptGuid": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AuroraScriptObject": { - "Name": "AuroraScriptObject", - "Tags": [ - "Deprecated", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "BehaviorWeak": { - "Name": "BehaviorWeak", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BoundInstanceWeak": { - "Name": "BoundInstanceWeak", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FrameId": { - "Name": "FrameId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LODLevel": { - "Name": "LODLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxFrequency": { - "Name": "MaxFrequency", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PriorFrameInvoked": { - "Name": "PriorFrameInvoked", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AuroraScriptService": { - "Name": "AuroraScriptService", - "Tags": [ - "Deprecated", - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AuroraService": { - "Name": "AuroraService", - "Tags": [ - "Deprecated", - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "BufferFullInputCount": { - "Name": "BufferFullInputCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HashRoundingPoint": { - "Name": "HashRoundingPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IgnoreRotation": { - "Name": "IgnoreRotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InputDropRate": { - "Name": "InputDropRate", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LockStepIdOffset": { - "Name": "LockStepIdOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OutOfOrderInputCount": { - "Name": "OutOfOrderInputCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RCCHeartbeatFPS": { - "Name": "RCCHeartbeatFPS", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RollbackOffset": { - "Name": "RollbackOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TooOldInputCount": { - "Name": "TooOldInputCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarAbilityRules": { - "Name": "AvatarAbilityRules", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "CharacterControllerMode": { - "Name": "CharacterControllerMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsCharacterControllerMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableClimbing": { - "Name": "EnableClimbing", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableCrouching": { - "Name": "EnableCrouching", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableFallingDown": { - "Name": "EnableFallingDown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableGettingUp": { - "Name": "EnableGettingUp", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableHolding": { - "Name": "EnableHolding", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableJumping": { - "Name": "EnableJumping", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableReaching": { - "Name": "EnableReaching", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableRunning": { - "Name": "EnableRunning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableSitting": { - "Name": "EnableSitting", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableSprinting": { - "Name": "EnableSprinting", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableSwimming": { - "Name": "EnableSwimming", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableTurning": { - "Name": "EnableTurning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CharacterControllerMode": { - "Enum": 0 - }, - "EnableClimbing": { - "Bool": true - }, - "EnableCrouching": { - "Bool": true - }, - "EnableFallingDown": { - "Bool": true - }, - "EnableGettingUp": { - "Bool": true - }, - "EnableHolding": { - "Bool": true - }, - "EnableJumping": { - "Bool": true - }, - "EnableReaching": { - "Bool": true - }, - "EnableRunning": { - "Bool": true - }, - "EnableSitting": { - "Bool": true - }, - "EnableSprinting": { - "Bool": true - }, - "EnableSwimming": { - "Bool": true - }, - "EnableTurning": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarAccessoryRules": { - "Name": "AvatarAccessoryRules", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AccessoryMode": { - "Name": "AccessoryMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsAccessoryMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomAccessoryMode": { - "Name": "CustomAccessoryMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsCustomAccessoryMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomBackAccessoryEnabled": { - "Name": "CustomBackAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomBackAccessoryId": { - "Name": "CustomBackAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFaceAccessoryEnabled": { - "Name": "CustomFaceAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFaceAccessoryId": { - "Name": "CustomFaceAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFrontAccessoryEnabled": { - "Name": "CustomFrontAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFrontAccessoryId": { - "Name": "CustomFrontAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHairAccessoryEnabled": { - "Name": "CustomHairAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHairAccessoryId": { - "Name": "CustomHairAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHeadAccessoryEnabled": { - "Name": "CustomHeadAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHeadAccessoryId": { - "Name": "CustomHeadAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomNeckAccessoryEnabled": { - "Name": "CustomNeckAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomNeckAccessoryId": { - "Name": "CustomNeckAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomShoulderAccessoryEnabled": { - "Name": "CustomShoulderAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomShoulderAccessoryId": { - "Name": "CustomShoulderAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomWaistAccessoryEnabled": { - "Name": "CustomWaistAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomWaistAccessoryId": { - "Name": "CustomWaistAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableEmissives": { - "Name": "EnableEmissives", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableSound": { - "Name": "EnableSound", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableVFX": { - "Name": "EnableVFX", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitBounds": { - "Name": "LimitBounds", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitMethod": { - "Name": "LimitMethod", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsAccessoryLimitMethod" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AccessoryMode": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CustomAccessoryMode": { - "Enum": 0 - }, - "CustomBackAccessoryEnabled": { - "Bool": false - }, - "CustomBackAccessoryId": { - "Int64": 0 - }, - "CustomFaceAccessoryEnabled": { - "Bool": false - }, - "CustomFaceAccessoryId": { - "Int64": 0 - }, - "CustomFrontAccessoryEnabled": { - "Bool": false - }, - "CustomFrontAccessoryId": { - "Int64": 0 - }, - "CustomHairAccessoryEnabled": { - "Bool": false - }, - "CustomHairAccessoryId": { - "Int64": 0 - }, - "CustomHeadAccessoryEnabled": { - "Bool": false - }, - "CustomHeadAccessoryId": { - "Int64": 0 - }, - "CustomNeckAccessoryEnabled": { - "Bool": false - }, - "CustomNeckAccessoryId": { - "Int64": 0 - }, - "CustomShoulderAccessoryEnabled": { - "Bool": false - }, - "CustomShoulderAccessoryId": { - "Int64": 0 - }, - "CustomWaistAccessoryEnabled": { - "Bool": false - }, - "CustomWaistAccessoryId": { - "Int64": 0 - }, - "EnableEmissives": { - "Bool": true - }, - "EnableSound": { - "Bool": true - }, - "EnableVFX": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LimitBounds": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LimitMethod": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarAnimationRules": { - "Name": "AvatarAnimationRules", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AnimationClipsMode": { - "Name": "AnimationClipsMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsAnimationClipsMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AnimationPacksMode": { - "Name": "AnimationPacksMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsAnimationPacksMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClimbAnimationEnabled": { - "Name": "CustomClimbAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClimbAnimationId": { - "Name": "CustomClimbAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFallAnimationEnabled": { - "Name": "CustomFallAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFallAnimationId": { - "Name": "CustomFallAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomIdleAlt1AnimationEnabled": { - "Name": "CustomIdleAlt1AnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomIdleAlt1AnimationId": { - "Name": "CustomIdleAlt1AnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomIdleAlt2AnimationEnabled": { - "Name": "CustomIdleAlt2AnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomIdleAlt2AnimationId": { - "Name": "CustomIdleAlt2AnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomIdleAnimationEnabled": { - "Name": "CustomIdleAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomIdleAnimationId": { - "Name": "CustomIdleAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomJumpAnimationEnabled": { - "Name": "CustomJumpAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomJumpAnimationId": { - "Name": "CustomJumpAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRunAnimationEnabled": { - "Name": "CustomRunAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRunAnimationId": { - "Name": "CustomRunAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomSwimAnimationEnabled": { - "Name": "CustomSwimAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomSwimAnimationId": { - "Name": "CustomSwimAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomSwimIdleAnimationEnabled": { - "Name": "CustomSwimIdleAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomSwimIdleAnimationId": { - "Name": "CustomSwimIdleAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomWalkAnimationEnabled": { - "Name": "CustomWalkAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomWalkAnimationId": { - "Name": "CustomWalkAnimationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AnimationClipsMode": { - "Enum": 0 - }, - "AnimationPacksMode": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CustomClimbAnimationEnabled": { - "Bool": false - }, - "CustomClimbAnimationId": { - "Int64": 0 - }, - "CustomFallAnimationEnabled": { - "Bool": false - }, - "CustomFallAnimationId": { - "Int64": 0 - }, - "CustomIdleAlt1AnimationEnabled": { - "Bool": false - }, - "CustomIdleAlt1AnimationId": { - "Int64": 0 - }, - "CustomIdleAlt2AnimationEnabled": { - "Bool": false - }, - "CustomIdleAlt2AnimationId": { - "Int64": 0 - }, - "CustomIdleAnimationEnabled": { - "Bool": false - }, - "CustomIdleAnimationId": { - "Int64": 0 - }, - "CustomJumpAnimationEnabled": { - "Bool": false - }, - "CustomJumpAnimationId": { - "Int64": 0 - }, - "CustomRunAnimationEnabled": { - "Bool": false - }, - "CustomRunAnimationId": { - "Int64": 0 - }, - "CustomSwimAnimationEnabled": { - "Bool": false - }, - "CustomSwimAnimationId": { - "Int64": 0 - }, - "CustomSwimIdleAnimationEnabled": { - "Bool": false - }, - "CustomSwimIdleAnimationId": { - "Int64": 0 - }, - "CustomWalkAnimationEnabled": { - "Bool": false - }, - "CustomWalkAnimationId": { - "Int64": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarBodyRules": { - "Name": "AvatarBodyRules", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AppearanceMode": { - "Name": "AppearanceMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsAppearanceMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BuildMode": { - "Name": "BuildMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsBuildMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomBodyBundleId": { - "Name": "CustomBodyBundleId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomBodyType": { - "Name": "CustomBodyType", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsCustomBodyType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomBodyTypeScale": { - "Name": "CustomBodyTypeScale", - "Scriptability": "None", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomEyebrowEnabled": { - "Name": "CustomEyebrowEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomEyebrowId": { - "Name": "CustomEyebrowId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomEyelashEnabled": { - "Name": "CustomEyelashEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomEyelashId": { - "Name": "CustomEyelashId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFaceEnabled": { - "Name": "CustomFaceEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomFaceId": { - "Name": "CustomFaceId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHeadEnabled": { - "Name": "CustomHeadEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHeadId": { - "Name": "CustomHeadId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHeadScale": { - "Name": "CustomHeadScale", - "Scriptability": "None", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHeight": { - "Name": "CustomHeight", - "Scriptability": "None", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomHeightScale": { - "Name": "CustomHeightScale", - "Scriptability": "None", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomLeftArmEnabled": { - "Name": "CustomLeftArmEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomLeftArmId": { - "Name": "CustomLeftArmId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomLeftLegEnabled": { - "Name": "CustomLeftLegEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomLeftLegId": { - "Name": "CustomLeftLegId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomMoodEnabled": { - "Name": "CustomMoodEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomMoodId": { - "Name": "CustomMoodId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomProportionsScale": { - "Name": "CustomProportionsScale", - "Scriptability": "None", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRightArmEnabled": { - "Name": "CustomRightArmEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRightArmId": { - "Name": "CustomRightArmId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRightLegEnabled": { - "Name": "CustomRightLegEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRightLegId": { - "Name": "CustomRightLegId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomTorsoEnabled": { - "Name": "CustomTorsoEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomTorsoId": { - "Name": "CustomTorsoId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomWidthScale": { - "Name": "CustomWidthScale", - "Scriptability": "None", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "KeepPlayerHead": { - "Name": "KeepPlayerHead", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScaleMode": { - "Name": "ScaleMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsScaleMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AppearanceMode": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BuildMode": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CustomBodyBundleId": { - "Int64": 0 - }, - "CustomBodyType": { - "Enum": 0 - }, - "CustomBodyTypeScale": { - "NumberRange": [ - 0.0, - 1.0 - ] - }, - "CustomEyebrowEnabled": { - "Bool": false - }, - "CustomEyebrowId": { - "Int64": 0 - }, - "CustomEyelashEnabled": { - "Bool": false - }, - "CustomEyelashId": { - "Int64": 0 - }, - "CustomFaceEnabled": { - "Bool": false - }, - "CustomFaceId": { - "Int64": 0 - }, - "CustomHeadEnabled": { - "Bool": false - }, - "CustomHeadId": { - "Int64": 0 - }, - "CustomHeadScale": { - "NumberRange": [ - 0.95, - 1.0 - ] - }, - "CustomHeight": { - "NumberRange": [ - 5.5, - 5.5 - ] - }, - "CustomHeightScale": { - "NumberRange": [ - 0.9, - 1.05 - ] - }, - "CustomLeftArmEnabled": { - "Bool": false - }, - "CustomLeftArmId": { - "Int64": 0 - }, - "CustomLeftLegEnabled": { - "Bool": false - }, - "CustomLeftLegId": { - "Int64": 0 - }, - "CustomMoodEnabled": { - "Bool": false - }, - "CustomMoodId": { - "Int64": 0 - }, - "CustomProportionsScale": { - "NumberRange": [ - 0.0, - 1.0 - ] - }, - "CustomRightArmEnabled": { - "Bool": false - }, - "CustomRightArmId": { - "Int64": 0 - }, - "CustomRightLegEnabled": { - "Bool": false - }, - "CustomRightLegId": { - "Int64": 0 - }, - "CustomTorsoEnabled": { - "Bool": false - }, - "CustomTorsoId": { - "Int64": 0 - }, - "CustomWidthScale": { - "NumberRange": [ - 0.7, - 1.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "KeepPlayerHead": { - "Bool": true - }, - "Sandboxed": { - "Bool": false - }, - "ScaleMode": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarChatService": { - "Name": "AvatarChatService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ClientFeatures": { - "Name": "ClientFeatures", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ClientFeaturesInitialized": { - "Name": "ClientFeaturesInitialized", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ServerFeatures": { - "Name": "ServerFeatures", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarClothingRules": { - "Name": "AvatarClothingRules", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ClothingMode": { - "Name": "ClothingMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsClothingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClassicPantsAccessoryEnabled": { - "Name": "CustomClassicPantsAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClassicPantsAccessoryId": { - "Name": "CustomClassicPantsAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClassicShirtsAccessoryEnabled": { - "Name": "CustomClassicShirtsAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClassicShirtsAccessoryId": { - "Name": "CustomClassicShirtsAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClassicTShirtsAccessoryEnabled": { - "Name": "CustomClassicTShirtsAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClassicTShirtsAccessoryId": { - "Name": "CustomClassicTShirtsAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomClothingMode": { - "Name": "CustomClothingMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsCustomClothingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomDressSkirtAccessoryEnabled": { - "Name": "CustomDressSkirtAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomDressSkirtAccessoryId": { - "Name": "CustomDressSkirtAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomJacketAccessoryEnabled": { - "Name": "CustomJacketAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomJacketAccessoryId": { - "Name": "CustomJacketAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomLeftShoesAccessoryEnabled": { - "Name": "CustomLeftShoesAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomLeftShoesAccessoryId": { - "Name": "CustomLeftShoesAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomPantsAccessoryEnabled": { - "Name": "CustomPantsAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomPantsAccessoryId": { - "Name": "CustomPantsAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRightShoesAccessoryEnabled": { - "Name": "CustomRightShoesAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomRightShoesAccessoryId": { - "Name": "CustomRightShoesAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomShirtAccessoryEnabled": { - "Name": "CustomShirtAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomShirtAccessoryId": { - "Name": "CustomShirtAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomShortsAccessoryEnabled": { - "Name": "CustomShortsAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomShortsAccessoryId": { - "Name": "CustomShortsAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomSweaterAccessoryEnabled": { - "Name": "CustomSweaterAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomSweaterAccessoryId": { - "Name": "CustomSweaterAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomTShirtAccessoryEnabled": { - "Name": "CustomTShirtAccessoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CustomTShirtAccessoryId": { - "Name": "CustomTShirtAccessoryId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitBounds": { - "Name": "LimitBounds", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClothingMode": { - "Enum": 0 - }, - "CustomClassicPantsAccessoryEnabled": { - "Bool": false - }, - "CustomClassicPantsAccessoryId": { - "Int64": 0 - }, - "CustomClassicShirtsAccessoryEnabled": { - "Bool": false - }, - "CustomClassicShirtsAccessoryId": { - "Int64": 0 - }, - "CustomClassicTShirtsAccessoryEnabled": { - "Bool": false - }, - "CustomClassicTShirtsAccessoryId": { - "Int64": 0 - }, - "CustomClothingMode": { - "Enum": 0 - }, - "CustomDressSkirtAccessoryEnabled": { - "Bool": false - }, - "CustomDressSkirtAccessoryId": { - "Int64": 0 - }, - "CustomJacketAccessoryEnabled": { - "Bool": false - }, - "CustomJacketAccessoryId": { - "Int64": 0 - }, - "CustomLeftShoesAccessoryEnabled": { - "Bool": false - }, - "CustomLeftShoesAccessoryId": { - "Int64": 0 - }, - "CustomPantsAccessoryEnabled": { - "Bool": false - }, - "CustomPantsAccessoryId": { - "Int64": 0 - }, - "CustomRightShoesAccessoryEnabled": { - "Bool": false - }, - "CustomRightShoesAccessoryId": { - "Int64": 0 - }, - "CustomShirtAccessoryEnabled": { - "Bool": false - }, - "CustomShirtAccessoryId": { - "Int64": 0 - }, - "CustomShortsAccessoryEnabled": { - "Bool": false - }, - "CustomShortsAccessoryId": { - "Int64": 0 - }, - "CustomSweaterAccessoryEnabled": { - "Bool": false - }, - "CustomSweaterAccessoryId": { - "Int64": 0 - }, - "CustomTShirtAccessoryEnabled": { - "Bool": false - }, - "CustomTShirtAccessoryId": { - "Int64": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LimitBounds": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarCollisionRules": { - "Name": "AvatarCollisionRules", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "CollisionMode": { - "Name": "CollisionMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsCollisionMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HitAndTouchDetectionMode": { - "Name": "HitAndTouchDetectionMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsHitAndTouchDetectionMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LegacyCollisionMode": { - "Name": "LegacyCollisionMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarSettingsLegacyCollisionMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SingleColliderSize": { - "Name": "SingleColliderSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CollisionMode": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HitAndTouchDetectionMode": { - "Enum": 0 - }, - "LegacyCollisionMode": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SingleColliderSize": { - "Vector3": [ - 2.0, - 3.0, - 1.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarCreationService": { - "Name": "AvatarCreationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "AvatarEditorService": { "Name": "AvatarEditorService", "Tags": [ "NotCreatable", + "NotReplicated", "Service" ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "AvatarImportService": { "Name": "AvatarImportService", @@ -10861,177 +1567,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarRules": { - "Name": "AvatarRules", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AvatarType": { - "Name": "AvatarType", - "Scriptability": "None", - "DataType": { - "Enum": "GameAvatarType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AvatarType": { - "Enum": 1 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarSettings": { - "Name": "AvatarSettings", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "Loaded": { - "Name": "Loaded", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BackendReplicatedStorage": { - "Name": "BackendReplicatedStorage", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BackendServerScriptService": { - "Name": "BackendServerScriptService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BackendServerStorage": { - "Name": "BackendServerStorage", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Backpack": { "Name": "Backpack", @@ -11039,29 +1575,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -11070,10 +1591,10 @@ "Tags": [ "NotCreatable" ], - "Superclass": "Model", + "Superclass": "Instance", "Properties": { - "TextureContent": { - "Name": "TextureContent", + "TextureId": { + "Name": "TextureId", "Scriptability": "ReadWrite", "DataType": { "Value": "Content" @@ -11084,40 +1605,9 @@ "Serialization": "Serializes" } } - }, - "TextureId": { - "Name": "TextureId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } + "DefaultProperties": {} }, "BadgeService": { "Name": "BadgeService", @@ -11127,38 +1617,13 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "BallSocketConstraint": { "Name": "BallSocketConstraint", "Tags": [], "Superclass": "Constraint", "Properties": { - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LimitsEnabled": { "Name": "LimitsEnabled", "Scriptability": "ReadWrite", @@ -11185,23 +1650,6 @@ } } }, - "MaxFrictionTorqueXml": { - "Name": "MaxFrictionTorqueXml", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Radius": { "Name": "Radius", "Scriptability": "ReadWrite", @@ -11282,44 +1730,29 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 1009 + "Int32": 1009 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LimitsEnabled": { "Bool": false }, - "MaxFrictionTorqueXml": { - "Float32": 0.0 - }, "Radius": { "Float32": 0.15 }, "Restitution": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TwistLimitsEnabled": { "Bool": false @@ -11330,9 +1763,6 @@ "TwistUpperAngle": { "Float32": 45.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "UpperAngle": { "Float32": 45.0 }, @@ -11341,123 +1771,6 @@ } } }, - "BanHistoryPages": { - "Name": "BanHistoryPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BaseCoreGuiConfiguration": { - "Name": "BaseCoreGuiConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BaseImportData": { - "Name": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Id": { - "Name": "Id", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ImportName": { - "Name": "ImportName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShouldImport": { - "Name": "ShouldImport", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "BasePart": { "Name": "BasePart", "Tags": [ @@ -11557,19 +1870,6 @@ } } }, - "AudioCanCollide": { - "Name": "AudioCanCollide", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "BackParamA": { "Name": "BackParamA", "Scriptability": "ReadWrite", @@ -11702,13 +2002,8 @@ "NotReplicated" ], "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "Color", - "Migration": "BrickColorToColor" - } - } + "Alias": { + "AliasFor": "Color" } } }, @@ -11793,50 +2088,29 @@ } } }, - "CollisionGroup": { - "Name": "CollisionGroup", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CollisionGroupId": { "Name": "CollisionGroupId", "Scriptability": "ReadWrite", "DataType": { "Value": "Int32" }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" } } }, - "CollisionGroupReplicate": { - "Name": "CollisionGroupReplicate", - "Scriptability": "None", + "CollisionGroups": { + "Name": "CollisionGroups", + "Scriptability": "Custom", "DataType": { "Value": "String" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -11863,32 +2137,13 @@ "DataType": { "Value": "Color3uint8" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Color" } } }, - "CurrentPhysicalProperties": { - "Name": "CurrentPhysicalProperties", - "Scriptability": "Read", - "DataType": { - "Value": "PhysicalProperties" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "CustomPhysicalProperties": { "Name": "CustomPhysicalProperties", "Scriptability": "ReadWrite", @@ -11902,22 +2157,6 @@ } } }, - "DraggingV1": { - "Name": "DraggingV1", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Elasticity": { "Name": "Elasticity", "Scriptability": "ReadWrite", @@ -11935,51 +2174,6 @@ } } }, - "EnableFluidForces": { - "Name": "EnableFluidForces", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExtentsCFrame": { - "Name": "ExtentsCFrame", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ExtentsSize": { - "Name": "ExtentsSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Friction": { "Name": "Friction", "Scriptability": "ReadWrite", @@ -12190,71 +2384,6 @@ } } }, - "MaterialVariant": { - "Name": "MaterialVariant", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "MaterialVariantSerialized" - } - } - } - }, - "MaterialVariantSerialized": { - "Name": "MaterialVariantSerialized", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "MaterialVariant" - } - } - }, - "NetworkIsSleeping": { - "Name": "NetworkIsSleeping", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NetworkOwnershipRule": { - "Name": "NetworkOwnershipRule", - "Scriptability": "None", - "DataType": { - "Enum": "NetworkOwnership" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Orientation": { "Name": "Orientation", "Scriptability": "ReadWrite", @@ -12262,7 +2391,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -12271,22 +2399,6 @@ } } }, - "PhysicsRepRootPart": { - "Name": "PhysicsRepRootPart", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "PivotOffset": { "Name": "PivotOffset", "Scriptability": "ReadWrite", @@ -12307,7 +2419,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -12618,31 +2729,8 @@ "NotReplicated" ], "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "Color", - "Migration": "BrickColorToColor" - } - } - } - } - }, - "siz": { - "Name": "siz", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" + "Alias": { + "AliasFor": "Color" } } }, @@ -12652,10 +2740,7 @@ "DataType": { "Value": "Vector3" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Size" @@ -12663,17 +2748,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "BasePlayerGui": { "Name": "BasePlayerGui", @@ -12682,36 +2757,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BaseRemoteEvent": { - "Name": "BaseRemoteEvent", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "BaseScript": { "Name": "BaseScript", @@ -12733,75 +2779,9 @@ } } }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LinkedSource": { "Name": "LinkedSource", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RunContext": { - "Name": "RunContext", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RunContext" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ScriptGuid": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BaseWrap": { - "Name": "BaseWrap", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "CageMeshContent": { - "Name": "CageMeshContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -12811,22 +2791,27 @@ "Serialization": "Serializes" } } - }, + } + }, + "DefaultProperties": {} + }, + "BaseWrap": { + "Name": "BaseWrap", + "Tags": [ + "NotCreatable" + ], + "Superclass": "Instance", + "Properties": { "CageMeshId": { "Name": "CageMeshId", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" + "Value": "Content" }, "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "CageMeshContent", - "Migration": "ContentIdToContent" - } - } + "Serialization": "Serializes" } } }, @@ -12859,85 +2844,6 @@ } } }, - "HSRAssetId": { - "Name": "HSRAssetId", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "HSRContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "HSRContent": { - "Name": "HSRContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HSRData": { - "Name": "HSRData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HSRMeshIdData": { - "Name": "HSRMeshIdData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImportInProcess": { - "Name": "ImportInProcess", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ImportOrigin": { "Name": "ImportOrigin", "Scriptability": "ReadWrite", @@ -12966,56 +2872,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "TemporaryCageMeshContent": { - "Name": "TemporaryCageMeshContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TemporaryCageMeshId": { - "Name": "TemporaryCageMeshId", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TemporaryCageMeshContent", - "Migration": "ContentIdToContent" - } - } - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Beam": { "Name": "Beam", @@ -13152,22 +3011,6 @@ } } }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Segments": { "Name": "Segments", "Scriptability": "ReadWrite", @@ -13184,24 +3027,6 @@ "Texture": { "Name": "Texture", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TextureContent": { - "Name": "TextureContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -13305,18 +3130,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { "Float32": 1.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color": { "ColorSequence": { "keypoints": [ @@ -13351,18 +3170,12 @@ "FaceCamera": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LightEmission": { "Float32": 0.0 }, "LightInfluence": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Segments": { "Int32": 10 }, @@ -13370,10 +3183,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" + "Texture": { + "Content": "" }, "TextureLength": { "Float32": 1.0 @@ -13400,9 +3213,6 @@ ] } }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Width0": { "Float32": 1.0 }, @@ -13422,67 +3232,8 @@ "NotCreatable" ], "Superclass": "DataModelMesh", - "Properties": { - "Bevel": { - "Name": "Bevel", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Bevel Roundness": { - "Name": "Bevel Roundness", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Bulge": { - "Name": "Bulge", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "Properties": {}, + "DefaultProperties": {} }, "BillboardGui": { "Name": "BillboardGui", @@ -13576,9 +3327,7 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Deprecated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -13591,12 +3340,10 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -13606,9 +3353,7 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Deprecated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -13740,11 +3485,8 @@ "AlwaysOnTop": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -13752,15 +3494,15 @@ "Brightness": { "Float32": 1.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "DistanceLowerLimit": { "Float32": 0.0 }, + "DistanceStep": { + "Float32": 0.0 + }, "DistanceUpperLimit": { "Float32": -1.0 }, @@ -13781,9 +3523,6 @@ 0.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LightInfluence": { "Float32": 0.0 }, @@ -13793,24 +3532,6 @@ "ResetOnSpawn": { "Bool": true }, - "Sandboxed": { - "Bool": false - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, "Size": { "UDim2": [ [ @@ -13847,10 +3568,7 @@ ] }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "ZIndexBehavior": { "Enum": 0 @@ -13861,50 +3579,15 @@ "Name": "BinaryStringValue", "Tags": [], "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Value": { "BinaryString": "" } } @@ -13915,29 +3598,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -13947,29 +3615,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -13979,26 +3632,8 @@ "Superclass": "BevelMesh", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bevel": { - "Float32": 0.0 - }, - "Bevel Roundness": { - "Float32": 0.0 - }, - "Bulge": { - "Float32": 0.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "Offset": { "Vector3": [ @@ -14007,9 +3642,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Scale": { "Vector3": [ 1.0, @@ -14021,10 +3653,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "VertexColor": { "Vector3": [ @@ -14081,27 +3710,15 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Intensity": { "Float32": 0.4 }, - "Sandboxed": { - "Bool": false - }, "Size": { "Float32": 24.0 }, @@ -14109,13 +3726,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Threshold": { "Float32": 0.95 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -14139,24 +3753,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "Size": { "Float32": 24.0 }, @@ -14164,18 +3766,13 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "BodyAngularVelocity": { "Name": "BodyAngularVelocity", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "BodyMover", "Properties": { "AngularVelocity": { @@ -14258,17 +3855,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "MaxTorque": { "Vector3": [ @@ -14280,17 +3868,11 @@ "P": { "Float32": 1250.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -14457,14 +4039,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "HeadColor3": { "Color3": [ @@ -14473,9 +4049,6 @@ 0.5529412 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftArmColor3": { "Color3": [ 0.9921569, @@ -14504,14 +4077,11 @@ 0.6745098 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TorsoColor3": { "Color3": [ @@ -14519,17 +4089,12 @@ 0.49803925, 0.2784314 ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, "BodyForce": { "Name": "BodyForce", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "BodyMover", "Properties": { "Force": { @@ -14563,14 +4128,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Force": { "Vector3": [ @@ -14579,28 +4138,17 @@ 0.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "BodyGyro": { "Name": "BodyGyro", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "BodyMover", "Properties": { "CFrame": { @@ -14689,11 +4237,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -14721,15 +4266,9 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "D": { "Float32": 500.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxTorque": { "Vector3": [ 400000.0, @@ -14740,159 +4279,26 @@ "P": { "Float32": 3000.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "BodyMover": { "Name": "BodyMover", "Tags": [ - "Deprecated", "NotCreatable" ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BodyPartDescription": { - "Name": "BodyPartDescription", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AssetId": { - "Name": "AssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BodyPart": { - "Name": "BodyPart", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "BodyPart" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadShape": { - "Name": "HeadShape", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Instance": { - "Name": "Instance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "AssetId": { - "Int64": 0 - }, - "Attributes": { - "Attributes": {} - }, - "BodyPart": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "HeadShape": { - "String": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "BodyPosition": { "Name": "BodyPosition", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "BodyMover", "Properties": { "D": { @@ -14981,21 +4387,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "D": { "Float32": 1250.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxForce": { "Vector3": [ 4000.0, @@ -15013,25 +4410,17 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "BodyThrust": { "Name": "BodyThrust", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "BodyMover", "Properties": { "Force": { @@ -15094,14 +4483,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Force": { "Vector3": [ @@ -15110,9 +4493,6 @@ 0.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Location": { "Vector3": [ 0.0, @@ -15120,25 +4500,17 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "BodyVelocity": { "Name": "BodyVelocity", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "BodyMover", "Properties": { "MaxForce": { @@ -15214,17 +4586,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "MaxForce": { "Vector3": [ @@ -15236,17 +4599,11 @@ "P": { "Float32": 1250.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Velocity": { "Vector3": [ @@ -15262,6 +4619,23 @@ "Tags": [], "Superclass": "Attachment", "Properties": { + "IsCFrameDriven": { + "Name": "IsCFrameDriven", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, "Transform": { "Name": "Transform", "Scriptability": "ReadWrite", @@ -15284,7 +4658,6 @@ "Value": "CFrame" }, "Tags": [ - "Hidden", "NotReplicated", "ReadOnly" ], @@ -15312,11 +4685,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -15344,23 +4714,11 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false @@ -15387,29 +4745,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "Bool": false @@ -15421,19 +4764,6 @@ "Tags": [], "Superclass": "HandleAdornment", "Properties": { - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Size": { "Name": "Size", "Scriptability": "ReadWrite", @@ -15455,11 +4785,8 @@ "AlwaysOnTop": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -15487,25 +4814,13 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 0 - }, "Size": { "Vector3": [ 1.0, @@ -15524,14 +4839,11 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -15540,26 +4852,6 @@ } } }, - "BranchService": { - "Name": "BranchService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "Breakpoint": { "Name": "Breakpoint", "Tags": [ @@ -15665,39 +4957,6 @@ } } }, - "MetaBreakpointId": { - "Name": "MetaBreakpointId", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RemoveOnHit": { - "Name": "RemoveOnHit", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Script": { "Name": "Script", "Scriptability": "None", @@ -15715,23 +4974,6 @@ } } }, - "Valid": { - "Name": "Valid", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Verified": { "Name": "Verified", "Scriptability": "None", @@ -15750,17 +4992,18 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} + }, + "BreakpointManager": { + "Name": "BreakpointManager", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} }, "BrickColorValue": { "Name": "BrickColorValue", @@ -15782,32 +5025,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { - "BrickColor": 194 + "Int32": 194 } } }, @@ -15820,459 +5048,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BubbleChatConfiguration": { - "Name": "BubbleChatConfiguration", - "Tags": [ - "NotCreatable" - ], - "Superclass": "TextChatConfigurations", - "Properties": { - "AdorneeName": { - "Name": "AdorneeName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundColor3": { - "Name": "BackgroundColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundTransparency": { - "Name": "BackgroundTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BubbleDuration": { - "Name": "BubbleDuration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BubblesSpacing": { - "Name": "BubblesSpacing", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Font": { - "Name": "Font", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "Font" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalPlayerStudsOffset": { - "Name": "LocalPlayerStudsOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxBubbles": { - "Name": "MaxBubbles", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDistance": { - "Name": "MaxDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinimizeDistance": { - "Name": "MinimizeDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TailVisible": { - "Name": "TailVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VerticalStudsOffset": { - "Name": "VerticalStudsOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AdorneeName": { - "String": "HumanoidRootPart" - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BackgroundColor3": { - "Color3": [ - 0.98039216, - 0.98039216, - 0.98039216 - ] - }, - "BackgroundTransparency": { - "Float64": 0.1 - }, - "BubbleDuration": { - "Float32": 15.0 - }, - "BubblesSpacing": { - "Float32": 6.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "Font": { - "Enum": 18 - }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/GothamSSm.json", - "weight": "Medium", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/Montserrat-Medium.ttf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LocalPlayerStudsOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "MaxBubbles": { - "Float32": 3.0 - }, - "MaxDistance": { - "Float32": 100.0 - }, - "MinimizeDistance": { - "Float32": 40.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TailVisible": { - "Bool": true - }, - "TextColor3": { - "Color3": [ - 0.22352941, - 0.23137255, - 0.23921569 - ] - }, - "TextSize": { - "Int64": 16 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VerticalStudsOffset": { - "Float32": 0.0 - } - } - }, - "BubbleChatMessageProperties": { - "Name": "BubbleChatMessageProperties", - "Tags": [], - "Superclass": "TextChatMessageProperties", - "Properties": { - "BackgroundColor3": { - "Name": "BackgroundColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BackgroundTransparency": { - "Name": "BackgroundTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TailVisible": { - "Name": "TailVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BugReporterService": { - "Name": "BugReporterService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "BulkImportService": { "Name": "BulkImportService", @@ -16283,85 +5059,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BuoyancySensor": { - "Name": "BuoyancySensor", - "Tags": [], - "Superclass": "SensorBase", - "Properties": { - "FullySubmerged": { - "Name": "FullySubmerged", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TouchingSurface": { - "Name": "TouchingSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FullySubmerged": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TouchingSurface": { - "Bool": false - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpdateType": { - "Enum": 0 - } - } + "DefaultProperties": {} }, "CFrameValue": { "Name": "CFrameValue", @@ -16383,29 +5081,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "CFrame": { @@ -16435,6 +5118,16 @@ } } }, + "CSGCacheService": { + "Name": "CSGCacheService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, "CSGDictionaryService": { "Name": "CSGDictionaryService", "Tags": [ @@ -16443,29 +5136,14 @@ "Superclass": "FlyweightService", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -16478,38 +5156,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CallingService": { - "Name": "CallingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CalloutService": { "Name": "CalloutService", @@ -16520,24 +5167,14 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Camera": { "Name": "Camera", "Tags": [ "NotReplicated" ], - "Superclass": "PVInstance", + "Superclass": "Instance", "Properties": { "CFrame": { "Name": "CFrame", @@ -16706,19 +5343,6 @@ } } }, - "VRTiltAndRollEnabled": { - "Name": "VRTiltAndRollEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ViewportSize": { "Name": "ViewportSize", "Scriptability": "Read", @@ -16753,11 +5377,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -16788,9 +5409,6 @@ "CameraType": { "Enum": 0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "FieldOfView": { "Float32": 70.0 }, @@ -16829,23 +5447,11 @@ "HeadScale": { "Float32": 1.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VRTiltAndRollEnabled": { - "Bool": false + "BinaryString": "" } } }, @@ -16854,8 +5460,8 @@ "Tags": [], "Superclass": "GuiObject", "Properties": { - "GroupColor3": { - "Name": "GroupColor3", + "GroupColor": { + "Name": "GroupColor", "Scriptability": "ReadWrite", "DataType": { "Value": "Color3" @@ -16867,8 +5473,8 @@ } } }, - "GroupTransparency": { - "Name": "GroupTransparency", + "Transparency": { + "Name": "Transparency", "Scriptability": "ReadWrite", "DataType": { "Value": "Float32" @@ -16879,22 +5485,6 @@ "Serialization": "Serializes" } } - }, - "ResolutionScale": { - "Name": "ResolutionScale", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { @@ -16907,11 +5497,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -16931,9 +5518,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -16942,31 +5529,19 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { - "Bool": true + "Bool": false }, "Draggable": { "Bool": false }, - "GroupColor3": { + "GroupColor": { "Color3": [ 1.0, 1.0, 1.0 ] }, - "GroupTransparency": { - "Float32": 0.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true - }, "LayoutOrder": { "Int32": 0 }, @@ -16985,33 +5560,9 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Selectable": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, "Size": { "UDim2": [ [ @@ -17031,10 +5582,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "Transparency": { + "Float32": 0.0 }, "Visible": { "Bool": true @@ -17044,171 +5595,6 @@ } } }, - "Capture": { - "Name": "Capture", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "CaptureType": { - "Name": "CaptureType", - "Scriptability": "Read", - "DataType": { - "Enum": "CaptureType" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FilePathString": { - "Name": "FilePathString", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LocalId": { - "Name": "LocalId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SourcePlaceId": { - "Name": "SourcePlaceId", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SourceUniverseId": { - "Name": "SourceUniverseId", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": {} - }, - "CaptureService": { - "Name": "CaptureService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CapturesPages": { - "Name": "CapturesPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CapturesViewConfiguration": { - "Name": "CapturesViewConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseCoreGuiConfiguration", - "Properties": { - "Open": { - "Name": "Open", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "CatalogPages": { "Name": "CatalogPages", "Tags": [ @@ -17217,17 +5603,7 @@ ], "Superclass": "Pages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ChangeHistoryService": { "Name": "ChangeHistoryService", @@ -17237,44 +5613,14 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ChangeHistoryStreamingService": { - "Name": "ChangeHistoryStreamingService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ChannelSelectorSoundEffect": { "Name": "ChannelSelectorSoundEffect", "Tags": [ - "NotCreatable" + "NotBrowsable" ], - "Superclass": "CustomSoundEffect", + "Superclass": "CustomDspSoundEffect", "Properties": { "Channel": { "Name": "Channel", @@ -17291,14 +5637,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Channel": { "Int32": 1 @@ -17306,275 +5646,14 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Priority": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ChannelTabsConfiguration": { - "Name": "ChannelTabsConfiguration", - "Tags": [ - "NotCreatable" - ], - "Superclass": "TextChatConfigurations", - "Properties": { - "AbsolutePosition": { - "Name": "AbsolutePosition", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteSize": { - "Name": "AbsoluteSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BackgroundColor3": { - "Name": "BackgroundColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundTransparency": { - "Name": "BackgroundTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HoverBackgroundColor3": { - "Name": "HoverBackgroundColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectedTabTextColor3": { - "Name": "SelectedTabTextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextStrokeColor3": { - "Name": "TextStrokeColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextStrokeTransparency": { - "Name": "TextStrokeTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BackgroundColor3": { - "Color3": [ - 0.09803922, - 0.105882354, - 0.11372549 - ] - }, - "BackgroundTransparency": { - "Float64": 0.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": false - }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/BuilderSans.json", - "weight": "Bold", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/BuilderSans-Bold.otf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HoverBackgroundColor3": { - "Color3": [ - 0.49019608, - 0.49019608, - 0.49019608 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SelectedTabTextColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextColor3": { - "Color3": [ - 0.6862745, - 0.6862745, - 0.6862745 - ] - }, - "TextSize": { - "Int64": 18 - }, - "TextStrokeColor3": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "TextStrokeTransparency": { - "Float64": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -17585,36 +5664,13 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CharacterMesh": { "Name": "CharacterMesh", "Tags": [], "Superclass": "CharacterAppearance", "Properties": { - "BaseTextureContent": { - "Name": "BaseTextureContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "BaseTextureId": { "Name": "BaseTextureId", "Scriptability": "ReadWrite", @@ -17624,12 +5680,7 @@ "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "BaseTextureContent", - "Migration": "Int64ToContent" - } - } + "Serialization": "Serializes" } } }, @@ -17646,19 +5697,6 @@ } } }, - "MeshContent": { - "Name": "MeshContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MeshId": { "Name": "MeshId", "Scriptability": "ReadWrite", @@ -17666,24 +5704,6 @@ "Value": "Int64" }, "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MeshContent", - "Migration": "Int64ToContent" - } - } - } - } - }, - "OverlayTextureContent": { - "Name": "OverlayTextureContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -17699,52 +5719,32 @@ "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "OverlayTextureContent", - "Migration": "Int64ToContent" - } - } + "Serialization": "Serializes" } } } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "BaseTextureContent": { - "Content": "None" + "BaseTextureId": { + "Int64": 0 }, "BodyPart": { "Enum": 0 }, - "Capabilities": { - "SecurityCapabilities": 0 + "MeshId": { + "Int64": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshContent": { - "Content": "None" - }, - "OverlayTextureContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false + "OverlayTextureId": { + "Int64": 0 }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -17770,21 +5770,6 @@ } } }, - "IsAutoMigrated": { - "Name": "IsAutoMigrated", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LoadDefaultChat": { "Name": "LoadDefaultChat", "Scriptability": "Read", @@ -17797,828 +5782,23 @@ "Serialization": "Serializes" } } - }, - "ModerationMode": { - "Name": "ModerationMode", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "BubbleChatEnabled": { "Bool": false }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsAutoMigrated": { - "Bool": false - }, "LoadDefaultChat": { "Bool": true }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ChatInputBarConfiguration": { - "Name": "ChatInputBarConfiguration", - "Tags": [ - "NotCreatable" - ], - "Superclass": "TextChatConfigurations", - "Properties": { - "AbsolutePosition": { - "Name": "AbsolutePosition", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsolutePositionWrite": { - "Name": "AbsolutePositionWrite", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteSize": { - "Name": "AbsoluteSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteSizeWrite": { - "Name": "AbsoluteSizeWrite", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AutocompleteEnabled": { - "Name": "AutocompleteEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundColor3": { - "Name": "BackgroundColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundTransparency": { - "Name": "BackgroundTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsFocused": { - "Name": "IsFocused", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsFocusedWrite": { - "Name": "IsFocusedWrite", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "KeyboardKeyCode": { - "Name": "KeyboardKeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaceholderColor3": { - "Name": "PlaceholderColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetTextChannel": { - "Name": "TargetTextChannel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextBox": { - "Name": "TextBox", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextStrokeColor3": { - "Name": "TextStrokeColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextStrokeTransparency": { - "Name": "TextStrokeTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutocompleteEnabled": { - "Bool": true - }, - "BackgroundColor3": { - "Color3": [ - 0.09803922, - 0.105882354, - 0.11372549 - ] - }, - "BackgroundTransparency": { - "Float64": 0.2 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/GothamSSm.json", - "weight": "Medium", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/Montserrat-Medium.ttf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "KeyboardKeyCode": { - "Enum": 47 - }, - "PlaceholderColor3": { - "Color3": [ - 0.69803923, - 0.69803923, - 0.69803923 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "TextSize": { - "Int64": 14 - }, - "TextStrokeColor3": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "TextStrokeTransparency": { - "Float64": 0.5 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ChatWindowConfiguration": { - "Name": "ChatWindowConfiguration", - "Tags": [ - "NotCreatable" - ], - "Superclass": "TextChatConfigurations", - "Properties": { - "AbsolutePosition": { - "Name": "AbsolutePosition", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsolutePositionWrite": { - "Name": "AbsolutePositionWrite", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteSize": { - "Name": "AbsoluteSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteSizeWrite": { - "Name": "AbsoluteSizeWrite", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BackgroundColor3": { - "Name": "BackgroundColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundTransparency": { - "Name": "BackgroundTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeightScale": { - "Name": "HeightScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HorizontalAlignment": { - "Name": "HorizontalAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HorizontalAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextChannelDisplayMode": { - "Name": "TextChannelDisplayMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextChannelDisplayMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextStrokeColor3": { - "Name": "TextStrokeColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextStrokeTransparency": { - "Name": "TextStrokeTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VerticalAlignment": { - "Name": "VerticalAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VerticalAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WidthScale": { - "Name": "WidthScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BackgroundColor3": { - "Color3": [ - 0.09803922, - 0.105882354, - 0.11372549 - ] - }, - "BackgroundTransparency": { - "Float64": 0.3 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/GothamSSm.json", - "weight": "Medium", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/Montserrat-Medium.ttf" - } - }, - "HeightScale": { - "Float32": 1.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HorizontalAlignment": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextChannelDisplayMode": { - "Enum": 0 - }, - "TextColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "TextSize": { - "Int64": 14 - }, - "TextStrokeColor3": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "TextStrokeTransparency": { - "Float64": 0.5 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VerticalAlignment": { - "Enum": 1 - }, - "WidthScale": { - "Float32": 1.0 - } - } - }, - "ChatWindowMessageProperties": { - "Name": "ChatWindowMessageProperties", - "Tags": [ - "NotCreatable" - ], - "Superclass": "TextChatMessageProperties", - "Properties": { - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PrefixTextProperties": { - "Name": "PrefixTextProperties", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextStrokeColor3": { - "Name": "TextStrokeColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextStrokeTransparency": { - "Name": "TextStrokeTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -18668,14 +5848,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Depth": { "Float32": 0.15 @@ -18683,9 +5857,6 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Mix": { "Float32": 0.5 }, @@ -18695,17 +5866,11 @@ "Rate": { "Float32": 0.5 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -18717,24 +5882,6 @@ "CursorIcon": { "Name": "CursorIcon", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "CursorIconContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "CursorIconContent": { - "Name": "CursorIconContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -18760,35 +5907,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CursorIconContent": { - "Content": "None" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "CursorIcon": { + "Content": "" }, "MaxActivationDistance": { "Float32": 32.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -18800,141 +5932,7 @@ ], "Superclass": "NetworkReplicator", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ClientStorageService": { - "Name": "ClientStorageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ClimbController": { - "Name": "ClimbController", - "Tags": [], - "Superclass": "ControllerBase", - "Properties": { - "AccelerationTime": { - "Name": "AccelerationTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BalanceMaxTorque": { - "Name": "BalanceMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BalanceSpeed": { - "Name": "BalanceSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MoveMaxForce": { - "Name": "MoveMaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AccelerationTime": { - "Float32": 0.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BalanceMaxTorque": { - "Float32": 10000.0 - }, - "BalanceRigidityEnabled": { - "Bool": false - }, - "BalanceSpeed": { - "Float32": 100.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MoveMaxForce": { - "Float32": 10000.0 - }, - "MoveSpeedFactor": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Clothing": { "Name": "Clothing", @@ -18955,149 +5953,9 @@ "Serialization": "Serializes" } } - }, - "Outfit1": { - "Name": "Outfit1", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Outfit1Content": { - "Name": "Outfit1Content", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Outfit2": { - "Name": "Outfit2", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Outfit2Content": { - "Name": "Outfit2Content", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CloudCRUDService": { - "Name": "CloudCRUDService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CloudExecutionService": { - "Name": "CloudExecutionService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CloudLocalizationTable": { - "Name": "CloudLocalizationTable", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "LocalizationTable", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Clouds": { "Name": "Clouds", @@ -19158,14 +6016,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { "Color3": [ @@ -19183,20 +6035,11 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -19209,193 +6052,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Collaborator": { - "Name": "Collaborator", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CollaboratorColor": { - "Name": "CollaboratorColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CollaboratorColor3": { - "Name": "CollaboratorColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CurDocGUID": { - "Name": "CurDocGUID", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CurScriptLineNumber": { - "Name": "CurScriptLineNumber", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsIdle": { - "Name": "IsIdle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Status": { - "Name": "Status", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CollaboratorStatus" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UserId": { - "Name": "UserId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Username": { - "Name": "Username", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CollaboratorsService": { - "Name": "CollaboratorsService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CollectionService": { "Name": "CollectionService", @@ -19406,29 +6063,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -19452,29 +6094,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "Color3": [ @@ -19544,30 +6171,18 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { "Float32": 0.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Contrast": { "Float32": 0.0 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "Saturation": { "Float32": 0.0 }, @@ -19575,7 +6190,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TintColor": { "Color3": [ @@ -19583,132 +6198,169 @@ 1.0, 1.0 ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, - "ColorGradingEffect": { - "Name": "ColorGradingEffect", - "Tags": [], - "Superclass": "PostEffect", + "CommandInstance": { + "Name": "CommandInstance", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "Instance", "Properties": { - "TonemapperPreset": { - "Name": "TonemapperPreset", - "Scriptability": "ReadWrite", + "AllowGUIAccessPoints": { + "Name": "AllowGUIAccessPoints", + "Scriptability": "Read", "DataType": { - "Enum": "TonemapperPreset" + "Value": "Bool" }, - "Tags": [], + "Tags": [ + "NotReplicated", + "ReadOnly" + ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" + } + } + }, + "Checked": { + "Name": "Checked", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DefaultShortcut": { + "Name": "DefaultShortcut", + "Scriptability": "None", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DisplayName": { + "Name": "DisplayName", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Enabled": { + "Name": "Enabled", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Icon": { + "Name": "Icon", + "Scriptability": "None", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Name": { + "Name": "Name", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Permission": { + "Name": "Permission", + "Scriptability": "None", + "DataType": { + "Enum": "CommandPermission" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "StatusTip": { + "Name": "StatusTip", + "Scriptability": "None", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" } } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TonemapperPreset": { - "Enum": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, - "CommerceService": { - "Name": "CommerceService", + "CommandService": { + "Name": "CommandService", "Tags": [ "NotCreatable", + "NotReplicated", "Service" ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CompositeValueCurve": { - "Name": "CompositeValueCurve", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "CurveType": { - "Name": "CurveType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CompositeValueCurveType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CurveType": { - "Enum": 2 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CompressorSoundEffect": { "Name": "CompressorSoundEffect", @@ -19795,17 +6447,11 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, "Attack": { "Float32": 0.1 }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true @@ -19813,9 +6459,6 @@ "GainMakeup": { "Float32": 0.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Priority": { "Int32": 0 }, @@ -19825,20 +6468,14 @@ "Release": { "Float32": 0.1 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Threshold": { "Float32": -40.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -19860,19 +6497,6 @@ } } }, - "Hollow": { - "Name": "Hollow", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Radius": { "Name": "Radius", "Scriptability": "ReadWrite", @@ -19885,19 +6509,6 @@ "Serialization": "Serializes" } } - }, - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { @@ -19907,11 +6518,8 @@ "AlwaysOnTop": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -19939,34 +6547,19 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, "Height": { "Float32": 2.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Hollow": { - "Bool": false - }, "Radius": { "Float32": 0.5 }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 0 - }, "SizeRelativeOffset": { "Vector3": [ 0.0, @@ -19978,14 +6571,11 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -19994,99 +6584,20 @@ } } }, - "ConfigService": { - "Name": "ConfigService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ConfigSnapshot": { - "Name": "ConfigSnapshot", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "Error": { - "Name": "Error", - "Scriptability": "Read", - "DataType": { - "Enum": "ConfigSnapshotErrorState" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Outdated": { - "Name": "Outdated", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": {} - }, "Configuration": { "Name": "Configuration", "Tags": [], "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -20098,55 +6609,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ConnectivityService": { - "Name": "ConnectivityService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "NetworkStatus": { - "Name": "NetworkStatus", - "Scriptability": "None", - "DataType": { - "Enum": "NetworkStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Constraint": { "Name": "Constraint", @@ -20237,17 +6700,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ContentProvider": { "Name": "ContentProvider", @@ -20291,17 +6744,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ContextActionService": { "Name": "ContextActionService", @@ -20312,96 +6755,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ControlState": { - "Name": "ControlState", - "Tags": [ - "NotBrowsable" - ], - "Superclass": "Instance", - "Properties": { - "Owner": { - "Name": "Owner", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StateSchema": { - "Name": "StateSchema", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "StateSchema": { + "AttributesSerialize": { "BinaryString": "" }, - "Tags": { - "Tags": [] + "SourceAssetId": { + "Int64": -1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "Tags": { + "BinaryString": "" } } }, @@ -20412,463 +6773,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ControllerBase": { - "Name": "ControllerBase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BalanceRigidityEnabled": { - "Name": "BalanceRigidityEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MoveSpeedFactor": { - "Name": "MoveSpeedFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ControllerManager": { - "Name": "ControllerManager", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ActiveController": { - "Name": "ActiveController", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BaseMoveSpeed": { - "Name": "BaseMoveSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BaseTurnSpeed": { - "Name": "BaseTurnSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClimbSensor": { - "Name": "ClimbSensor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FacingDirection": { - "Name": "FacingDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GroundSensor": { - "Name": "GroundSensor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MovingDirection": { - "Name": "MovingDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootPart": { - "Name": "RootPart", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UpDirection": { - "Name": "UpDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BaseMoveSpeed": { - "Float32": 16.0 - }, - "BaseTurnSpeed": { - "Float32": 8.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FacingDirection": { - "Vector3": [ - 0.0, - 0.0, - 1.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MovingDirection": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpDirection": { - "Vector3": [ - 0.0, - 1.0, - 0.0 - ] - } - } - }, - "ControllerPartSensor": { - "Name": "ControllerPartSensor", - "Tags": [], - "Superclass": "ControllerSensor", - "Properties": { - "HitFrame": { - "Name": "HitFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HitNormal": { - "Name": "HitNormal", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LadderSearchHeight": { - "Name": "LadderSearchHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LadderSearchOffset": { - "Name": "LadderSearchOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SearchDistance": { - "Name": "SearchDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SensedMaterial": { - "Name": "SensedMaterial", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "Material" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SensedPart": { - "Name": "SensedPart", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SensorMode": { - "Name": "SensorMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SensorMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HitFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "HitNormal": { - "Vector3": [ - 0.0, - 1.0, - 0.0 - ] - }, - "LadderSearchHeight": { - "Float32": 6.0 - }, - "LadderSearchOffset": { - "Float32": 5.0 - }, - "Sandboxed": { - "Bool": false - }, - "SearchDistance": { - "Float32": 0.0 - }, - "SensedMaterial": { - "Enum": 1792 - }, - "SensorMode": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpdateType": { - "Enum": 0 - } - } - }, - "ControllerSensor": { - "Name": "ControllerSensor", - "Tags": [ - "NotCreatable" - ], - "Superclass": "SensorBase", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ControllerService": { "Name": "ControllerService", @@ -20879,17 +6784,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CookiesService": { "Name": "CookiesService", @@ -20900,29 +6795,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -20965,78 +6845,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CoreGuiConfiguration": { - "Name": "CoreGuiConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "CapturesViewConfiguration": { - "Name": "CapturesViewConfiguration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerListConfiguration": { - "Name": "PlayerListConfiguration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelfViewConfiguration": { - "Name": "SelfViewConfiguration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CorePackages": { "Name": "CorePackages", @@ -21047,17 +6856,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CoreScript": { "Name": "CoreScript", @@ -21067,40 +6866,7 @@ ], "Superclass": "BaseScript", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ScriptGuid": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CoreScriptDebuggingManagerHelper": { - "Name": "CoreScriptDebuggingManagerHelper", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CoreScriptSyncService": { "Name": "CoreScriptSyncService", @@ -21111,17 +6877,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "CornerWedgePart": { "Name": "CornerWedgePart", @@ -21132,14 +6888,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -21200,15 +6950,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -21222,9 +6966,6 @@ "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, "FrontParamA": { "Float32": -0.5 }, @@ -21237,9 +6978,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -21261,9 +6999,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -21315,9 +7050,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 2.0, @@ -21329,7 +7061,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -21346,9 +7078,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -21358,88 +7087,14 @@ } } }, - "CreationDBService": { - "Name": "CreationDBService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CreatorStoreService": { - "Name": "CreatorStoreService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CrossDMScriptChangeListener": { - "Name": "CrossDMScriptChangeListener", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "CurveAnimation": { "Name": "CurveAnimation", "Tags": [], "Superclass": "AnimationClip", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "GuidBinaryString": { - "BinaryString": "AAAAAAAAAAAAAAAAAAAAAA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "Loop": { "Bool": true @@ -21447,71 +7102,39 @@ "Priority": { "Enum": 2 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, + "CustomDspSoundEffect": { + "Name": "CustomDspSoundEffect", + "Tags": [ + "NotCreatable" + ], + "Superclass": "SoundEffect", + "Properties": {}, + "DefaultProperties": {} + }, "CustomEvent": { "Name": "CustomEvent", "Tags": [ "Deprecated" ], "Superclass": "Instance", - "Properties": { - "PersistedCurrentValue": { - "Name": "PersistedCurrentValue", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PersistedCurrentValue": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -21537,67 +7160,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CustomLog": { - "Name": "CustomLog", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CustomSoundEffect": { - "Name": "CustomSoundEffect", - "Tags": [ - "NotCreatable" - ], - "Superclass": "SoundEffect", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -21657,19 +7227,6 @@ "Serialization": "Serializes" } } - }, - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { @@ -21682,11 +7239,8 @@ "Angle": { "Float32": 360.0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -21714,34 +7268,22 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, "Height": { "Float32": 1.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "InnerRadius": { "Float32": 0.0 }, "Radius": { "Float32": 1.0 }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 0 - }, "SizeRelativeOffset": { "Vector3": [ 0.0, @@ -21753,14 +7295,11 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -21777,26 +7316,8 @@ "Superclass": "BevelMesh", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Bevel": { - "Float32": 0.0 - }, - "Bevel Roundness": { - "Float32": 0.0 - }, - "Bulge": { - "Float32": 0.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "Offset": { "Vector3": [ @@ -21805,9 +7326,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Scale": { "Vector3": [ 1.0, @@ -21819,10 +7337,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "VertexColor": { "Vector3": [ @@ -22010,21 +7525,6 @@ } } }, - "SoftlockAngularServoUponReachingTarget": { - "Name": "SoftlockAngularServoUponReachingTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TargetAngle": { "Name": "TargetAngle", "Scriptability": "ReadWrite", @@ -22090,24 +7590,15 @@ "AngularVelocity": { "Float32": 0.0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 1009 + "Int32": 1009 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "InclinationAngle": { "Float32": 0.0 }, @@ -22127,7 +7618,7 @@ "Float32": null }, "MotorMaxAngularAcceleration": { - "Float32": 500000.0 + "Float32": null }, "MotorMaxForce": { "Float32": 0.0 @@ -22141,9 +7632,6 @@ "RotationAxisVisible": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "ServoMaxForce": { "Float32": 0.0 }, @@ -22153,12 +7641,6 @@ "Size": { "Float32": 0.15 }, - "SoftlockAngularServoUponReachingTarget": { - "Bool": false - }, - "SoftlockServoUponReachingTarget": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -22166,7 +7648,7 @@ "Float32": 0.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TargetAngle": { "Float32": 0.0 @@ -22174,9 +7656,6 @@ "TargetPosition": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "UpperAngle": { "Float32": 45.0 }, @@ -22230,55 +7709,6 @@ } } }, - "Environment": { - "Name": "Environment", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ForceR15": { - "Name": "ForceR15", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GameAvatarType": { - "Name": "GameAvatarType", - "Scriptability": "None", - "DataType": { - "Enum": "GameAvatarType" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "GameId": { "Name": "GameId", "Scriptability": "Read", @@ -22328,24 +7758,6 @@ } } }, - "IsPioneerBuild": { - "Name": "IsPioneerBuild", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "IsSFFlagsLoaded": { "Name": "IsSFFlagsLoaded", "Scriptability": "None", @@ -22379,40 +7791,6 @@ } } }, - "MatchmakingType": { - "Name": "MatchmakingType", - "Scriptability": "Read", - "DataType": { - "Enum": "MatchmakingType" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PioneerSource": { - "Name": "PioneerSource", - "Scriptability": "None", - "DataType": { - "Enum": "PioneerSource" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "PlaceId": { "Name": "PlaceId", "Scriptability": "Read", @@ -22477,39 +7855,6 @@ } } }, - "R15CollisionType": { - "Name": "R15CollisionType", - "Scriptability": "None", - "DataType": { - "Enum": "R15CollisionType" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RunService": { - "Name": "RunService", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "VIPServerId": { "Name": "VIPServerId", "Scriptability": "Read", @@ -22597,25 +7942,6 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataModelDiff": { - "Name": "DataModelDiff", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Object", - "Properties": {}, "DefaultProperties": {} }, "DataModelMesh": { @@ -22666,17 +7992,18 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} + }, + "DataModelPatchService": { + "Name": "DataModelPatchService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} }, "DataModelSession": { "Name": "DataModelSession", @@ -22720,17 +8047,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStore": { "Name": "DataStore", @@ -22740,50 +8057,7 @@ ], "Superclass": "GlobalDataStore", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreGetOptions": { - "Name": "DataStoreGetOptions", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "UseCache": { - "Name": "UseCache", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreIncrementOptions": { "Name": "DataStoreIncrementOptions", @@ -22792,17 +8066,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreInfo": { "Name": "DataStoreInfo", @@ -22861,17 +8125,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreKey": { "Name": "DataStoreKey", @@ -22898,17 +8152,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreKeyInfo": { "Name": "DataStoreKeyInfo", @@ -22967,17 +8211,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreKeyPages": { "Name": "DataStoreKeyPages", @@ -22986,35 +8220,8 @@ "NotReplicated" ], "Superclass": "Pages", - "Properties": { - "Cursor": { - "Name": "Cursor", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "Properties": {}, + "DefaultProperties": {} }, "DataStoreListingPages": { "Name": "DataStoreListingPages", @@ -23023,35 +8230,8 @@ "NotReplicated" ], "Superclass": "Pages", - "Properties": { - "Cursor": { - "Name": "Cursor", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "Properties": {}, + "DefaultProperties": {} }, "DataStoreObjectVersionInfo": { "Name": "DataStoreObjectVersionInfo", @@ -23110,17 +8290,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreOptions": { "Name": "DataStoreOptions", @@ -23143,17 +8313,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStorePages": { "Name": "DataStorePages", @@ -23163,17 +8323,7 @@ ], "Superclass": "Pages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreService": { "Name": "DataStoreService", @@ -23217,35 +8367,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutomaticRetry": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LegacyNamingScheme": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -23256,17 +8391,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DataStoreVersionPages": { "Name": "DataStoreVersionPages", @@ -23276,17 +8401,7 @@ ], "Superclass": "Pages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Debris": { "Name": "Debris", @@ -23313,32 +8428,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "MaxItems": { "Int32": 1000 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -23347,8 +8447,7 @@ "Tags": [ "NotBrowsable", "NotCreatable", - "NotReplicated", - "Service" + "Settings" ], "Superclass": "Instance", "Properties": { @@ -23472,38 +8571,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebuggablePluginWatcher": { - "Name": "DebuggablePluginWatcher", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerBreakpoint": { "Name": "DebuggerBreakpoint", @@ -23592,35 +8660,9 @@ "Serialization": "Serializes" } } - }, - "line": { - "Name": "line", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerConnection": { "Name": "DebuggerConnection", @@ -23699,17 +8741,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerConnectionManager": { "Name": "DebuggerConnectionManager", @@ -23737,17 +8769,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerLuaResponse": { "Name": "DebuggerLuaResponse", @@ -23843,17 +8865,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerManager": { "Name": "DebuggerManager", @@ -23881,17 +8893,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerUIService": { "Name": "DebuggerUIService", @@ -23902,17 +8904,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerVariable": { "Name": "DebuggerVariable", @@ -24025,17 +9017,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DebuggerWatch": { "Name": "DebuggerWatch", @@ -24056,36 +9038,13 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Decal": { "Name": "Decal", "Tags": [], "Superclass": "FaceInstance", "Properties": { - "AutoLocalize": { - "Name": "AutoLocalize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Color3": { "Name": "Color3", "Scriptability": "ReadWrite", @@ -24099,80 +9058,6 @@ } } }, - "ColorMap": { - "Name": "ColorMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ColorMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ColorMapContent": { - "Name": "ColorMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EmissiveMaskContent": { - "Name": "EmissiveMaskContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveStrength": { - "Name": "EmissiveStrength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveTint": { - "Name": "EmissiveTint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LocalTransparencyModifier": { "Name": "LocalTransparencyModifier", "Scriptability": "ReadWrite", @@ -24189,133 +9074,6 @@ } } }, - "LocalizedTextureContent": { - "Name": "LocalizedTextureContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MetalnessMap": { - "Name": "MetalnessMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MetalnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "MetalnessMapContent": { - "Name": "MetalnessMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NormalMap": { - "Name": "NormalMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "NormalMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "NormalMapContent": { - "Name": "NormalMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rotation": { - "Name": "Rotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RoughnessMap": { - "Name": "RoughnessMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "RoughnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "RoughnessMapContent": { - "Name": "RoughnessMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Shiny": { "Name": "Shiny", "Scriptability": "ReadWrite", @@ -24351,24 +9109,6 @@ "Texture": { "Name": "Texture", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TextureContent": { - "Name": "TextureContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -24379,48 +9119,6 @@ } } }, - "TexturePack": { - "Name": "TexturePack", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TexturePackContent": { - "Name": "TexturePackContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TexturePackMetadata": { - "Name": "TexturePackMetadata", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Transparency": { "Name": "Transparency", "Scriptability": "ReadWrite", @@ -24434,32 +9132,6 @@ } } }, - "UVOffset": { - "Name": "UVOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UVScale": { - "Name": "UVScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ZIndex": { "Name": "ZIndex", "Scriptability": "ReadWrite", @@ -24475,17 +9147,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ @@ -24494,139 +9157,26 @@ 1.0 ] }, - "EmissiveMaskContent": { - "Content": "None" - }, - "EmissiveStrength": { - "Float32": 1.0 - }, - "EmissiveTint": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, "Face": { "Enum": 5 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MetalnessMapContent": { - "Content": "None" - }, - "NormalMapContent": { - "Content": "None" - }, - "Rotation": { - "Float32": 0.0 - }, - "RoughnessMapContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" - }, - "TexturePack": { - "ContentId": "" - }, - "TexturePackMetadata": { - "String": "" + "Texture": { + "Content": "" }, "Transparency": { "Float32": 0.0 }, - "UVOffset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "UVScale": { - "Vector2": [ - 1.0, - 1.0 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "ZIndex": { "Int32": 1 } } }, - "DeferredAssetManagerService": { - "Name": "DeferredAssetManagerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "JoiningPlaceId": { - "Name": "JoiningPlaceId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "JoiningUniverseId": { - "Name": "JoiningUniverseId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PregameLoadingScreenOnly": { - "Name": "PregameLoadingScreenOnly", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "DepthOfFieldEffect": { "Name": "DepthOfFieldEffect", "Tags": [], @@ -24686,14 +9236,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true @@ -24704,89 +9248,17 @@ "FocusDistance": { "Float32": 0.05 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "InFocusRadius": { "Float32": 10.0 }, "NearIntensity": { "Float32": 0.75 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DesignFoundationsService": { - "Name": "DesignFoundationsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DeviceDisplayService": { - "Name": "DeviceDisplayService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DeviceIdService": { - "Name": "DeviceIdService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -24927,18 +9399,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "BehaviorType": { "Enum": 0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ConversationDistance": { "Float32": 25.0 }, @@ -24948,23 +9414,17 @@ "GoodbyeDialog": { "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "InitialPrompt": { "String": "" }, "Purpose": { "Enum": 1 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Tone": { "Enum": 0 @@ -24978,9 +9438,6 @@ 0.0, 0.0 ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -25043,14 +9500,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "GoodbyeChoiceActive": { "Bool": true @@ -25058,1058 +9509,20 @@ "GoodbyeDialog": { "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "ResponseDialog": { "String": "" }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "UserDialog": { "String": "" } } }, - "DigitsRigDescription": { - "Name": "DigitsRigDescription", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Index1": { - "Name": "Index1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Index1TposeAdjustment": { - "Name": "Index1TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Index2": { - "Name": "Index2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Index2TposeAdjustment": { - "Name": "Index2TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Index3": { - "Name": "Index3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Index3TposeAdjustment": { - "Name": "Index3TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IndexRange": { - "Name": "IndexRange", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IndexSize": { - "Name": "IndexSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Middle1": { - "Name": "Middle1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Middle1TposeAdjustment": { - "Name": "Middle1TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Middle2": { - "Name": "Middle2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Middle2TposeAdjustment": { - "Name": "Middle2TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Middle3": { - "Name": "Middle3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Middle3TposeAdjustment": { - "Name": "Middle3TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MiddleRange": { - "Name": "MiddleRange", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MiddleSize": { - "Name": "MiddleSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pinky1": { - "Name": "Pinky1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pinky1TposeAdjustment": { - "Name": "Pinky1TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pinky2": { - "Name": "Pinky2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pinky2TposeAdjustment": { - "Name": "Pinky2TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pinky3": { - "Name": "Pinky3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pinky3TposeAdjustment": { - "Name": "Pinky3TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PinkyRange": { - "Name": "PinkyRange", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PinkySize": { - "Name": "PinkySize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ring1": { - "Name": "Ring1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ring1TposeAdjustment": { - "Name": "Ring1TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ring2": { - "Name": "Ring2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ring2TposeAdjustment": { - "Name": "Ring2TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ring3": { - "Name": "Ring3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ring3TposeAdjustment": { - "Name": "Ring3TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RingRange": { - "Name": "RingRange", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RingSize": { - "Name": "RingSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Side": { - "Name": "Side", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DigitsRigDescriptionSide" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thumb1": { - "Name": "Thumb1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thumb1TposeAdjustment": { - "Name": "Thumb1TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thumb2": { - "Name": "Thumb2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thumb2TposeAdjustment": { - "Name": "Thumb2TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thumb3": { - "Name": "Thumb3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thumb3TposeAdjustment": { - "Name": "Thumb3TposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThumbRange": { - "Name": "ThumbRange", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThumbSize": { - "Name": "ThumbSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Index1TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Index2TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Index3TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "IndexRange": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "IndexSize": { - "Float32": 0.0 - }, - "Middle1TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Middle2TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Middle3TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "MiddleRange": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "MiddleSize": { - "Float32": 0.0 - }, - "Pinky1TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Pinky2TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Pinky3TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "PinkyRange": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "PinkySize": { - "Float32": 0.0 - }, - "Ring1TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Ring2TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Ring3TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RingRange": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RingSize": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "Side": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Thumb1TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Thumb2TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Thumb3TposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ThumbRange": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ThumbSize": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DisplayWakeLock": { - "Name": "DisplayWakeLock", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "DistortionSoundEffect": { "Name": "DistortionSoundEffect", "Tags": [], @@ -26130,38 +9543,23 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Level": { "Float32": 0.75 }, "Priority": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -26190,17 +9588,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DoubleConstrainedValue": { "Name": "DoubleConstrainedValue", @@ -26265,36 +9653,11 @@ "Serialization": "DoesNotSerialize" } } - }, - "value": { - "Name": "value", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "MaxValue": { "Float64": 1.0 @@ -26302,20 +9665,11 @@ "MinValue": { "Float64": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "value": { - "Float64": 0.0 + "BinaryString": "" } } }, @@ -26328,599 +9682,14 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DragDetector": { - "Name": "DragDetector", - "Tags": [], - "Superclass": "ClickDetector", - "Properties": { - "ActivatedCursorIcon": { - "Name": "ActivatedCursorIcon", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ActivatedCursorIconContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ActivatedCursorIconContent": { - "Name": "ActivatedCursorIconContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ApplyAtCenterOfMass": { - "Name": "ApplyAtCenterOfMass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Axis": { - "Name": "Axis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DragFrame": { - "Name": "DragFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DragStyle": { - "Name": "DragStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DragDetectorDragStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GamepadModeSwitchKeyCode": { - "Name": "GamepadModeSwitchKeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "KeyboardModeSwitchKeyCode": { - "Name": "KeyboardModeSwitchKeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDragAngle": { - "Name": "MaxDragAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDragTranslation": { - "Name": "MaxDragTranslation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxForce": { - "Name": "MaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinDragAngle": { - "Name": "MinDragAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinDragTranslation": { - "Name": "MinDragTranslation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Orientation": { - "Name": "Orientation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PermissionPolicy": { - "Name": "PermissionPolicy", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DragDetectorPermissionPolicy" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PhysicalDragClickedPart": { - "Name": "PhysicalDragClickedPart", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicalDragHitPoint": { - "Name": "PhysicalDragHitPoint", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicalDragIsInVR": { - "Name": "PhysicalDragIsInVR", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicalDragTargetFrame": { - "Name": "PhysicalDragTargetFrame", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReferenceInstance": { - "Name": "ReferenceInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResponseStyle": { - "Name": "ResponseStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DragDetectorResponseStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Responsiveness": { - "Name": "Responsiveness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RunLocally": { - "Name": "RunLocally", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondaryAxis": { - "Name": "SecondaryAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TrackballRadialPullFactor": { - "Name": "TrackballRadialPullFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TrackballRollFactor": { - "Name": "TrackballRollFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VRSwitchKeyCode": { - "Name": "VRSwitchKeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WorldAxis": { - "Name": "WorldAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WorldSecondaryAxis": { - "Name": "WorldSecondaryAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "ActivatedCursorIconContent": { - "Content": "None" - }, - "ApplyAtCenterOfMass": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CursorIconContent": { - "Content": "None" - }, - "DragFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "DragStyle": { - "Enum": 1 - }, - "Enabled": { - "Bool": true - }, - "GamepadModeSwitchKeyCode": { - "Enum": 1004 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "KeyboardModeSwitchKeyCode": { - "Enum": 306 - }, - "MaxActivationDistance": { - "Float32": 32.0 - }, - "MaxDragAngle": { - "Float32": 0.0 - }, - "MaxDragTranslation": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "MaxForce": { - "Float32": 10000000.0 - }, - "MaxTorque": { - "Float32": 10000.0 - }, - "MinDragAngle": { - "Float32": 0.0 - }, - "MinDragTranslation": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Orientation": { - "Vector3": [ - -0.0, - 180.0, - 90.0 - ] - }, - "PermissionPolicy": { - "Enum": 1 - }, - "ResponseStyle": { - "Enum": 1 - }, - "Responsiveness": { - "Float32": 10.0 - }, - "RunLocally": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TrackballRadialPullFactor": { - "Float32": 1.0 - }, - "TrackballRollFactor": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VRSwitchKeyCode": { - "Enum": 1007 - } - } + "DefaultProperties": {} }, "Dragger": { "Name": "Dragger", "Tags": [], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DraggerService": { "Name": "DraggerService", @@ -26933,12 +9702,13 @@ "Properties": { "AlignDraggedObjects": { "Name": "AlignDraggedObjects", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -26948,12 +9718,13 @@ }, "AngleSnapEnabled": { "Name": "AngleSnapEnabled", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -26963,12 +9734,13 @@ }, "AngleSnapIncrement": { "Name": "AngleSnapIncrement", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Float32" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -26978,12 +9750,13 @@ }, "AnimateHover": { "Name": "AnimateHover", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -26993,12 +9766,13 @@ }, "CollisionsEnabled": { "Name": "CollisionsEnabled", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27008,12 +9782,13 @@ }, "DraggerCoordinateSpace": { "Name": "DraggerCoordinateSpace", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Enum": "DraggerCoordinateSpace" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27023,12 +9798,13 @@ }, "DraggerMovementMode": { "Name": "DraggerMovementMode", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Enum": "DraggerMovementMode" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27038,12 +9814,13 @@ }, "GeometrySnapColor": { "Name": "GeometrySnapColor", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Color3" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27053,27 +9830,13 @@ }, "HoverAnimateFrequency": { "Name": "HoverAnimateFrequency", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Float32" }, "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HoverLineThickness": { - "Name": "HoverLineThickness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27083,12 +9846,13 @@ }, "HoverThickness": { "Name": "HoverThickness", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Float32" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27098,12 +9862,13 @@ }, "JointsEnabled": { "Name": "JointsEnabled", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27113,12 +9878,13 @@ }, "LinearSnapEnabled": { "Name": "LinearSnapEnabled", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27128,27 +9894,13 @@ }, "LinearSnapIncrement": { "Name": "LinearSnapIncrement", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Float32" }, "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PartSnapEnabled": { - "Name": "PartSnapEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27163,7 +9915,8 @@ "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27173,12 +9926,13 @@ }, "ShowHover": { "Name": "ShowHover", - "Scriptability": "ReadWrite", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -27200,34 +9954,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "UseBoundingBoxes": { - "Name": "UseBoundingBoxes", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "DynamicRotate": { "Name": "DynamicRotate", @@ -27250,17 +9979,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "EchoSoundEffect": { "Name": "EchoSoundEffect", @@ -27321,14 +10040,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Delay": { "Float32": 1.0 @@ -27342,258 +10055,29 @@ "Feedback": { "Float32": 0.5 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Priority": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "WetLevel": { "Float32": 0.0 } } }, - "EditableImage": { - "Name": "EditableImage", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Object", - "Properties": { - "ImageData": { - "Name": "ImageData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageHolder": { - "Name": "ImageHolder", - "Scriptability": "None", - "DataType": { - "Value": "NetAssetRef" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsReplicatedCopy": { - "Name": "IsReplicatedCopy", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": {} - }, - "EditableMesh": { - "Name": "EditableMesh", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Object", - "Properties": { - "EditableMeshDataHolder": { - "Name": "EditableMeshDataHolder", - "Scriptability": "None", - "DataType": { - "Value": "NetAssetRef" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FixedSize": { - "Name": "FixedSize", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsReplicatedCopy": { - "Name": "IsReplicatedCopy", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MeshData": { - "Name": "MeshData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": {} - }, - "EditableService": { - "Name": "EditableService", + "EmotesPages": { + "Name": "EmotesPages", "Tags": [ "NotCreatable", - "Service" + "NotReplicated" ], - "Superclass": "Instance", - "Properties": { - "EditableStatus": { - "Name": "EditableStatus", - "Scriptability": "None", - "DataType": { - "Enum": "EditableStatus" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "EditorSourceService": { - "Name": "EditorSourceService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", + "Superclass": "InventoryPages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "EncodingService": { - "Name": "EncodingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "EqualizerSoundEffect": { "Name": "EqualizerSoundEffect", @@ -27641,14 +10125,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true @@ -27656,9 +10134,6 @@ "HighGain": { "Float32": 0.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LowGain": { "Float32": -20.0 }, @@ -27668,17 +10143,11 @@ "Priority": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -27702,32 +10171,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "RotationOrder": { "Enum": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -27739,416 +10193,8 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExampleV2Service": { - "Name": "ExampleV2Service", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExecutedRemoteCommand": { - "Name": "ExecutedRemoteCommand", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, "DefaultProperties": {} }, - "ExperienceAuthService": { - "Name": "ExperienceAuthService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExperienceInviteOptions": { - "Name": "ExperienceInviteOptions", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "InviteMessageId": { - "Name": "InviteMessageId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InviteUser": { - "Name": "InviteUser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LaunchData": { - "Name": "LaunchData", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PromptMessage": { - "Name": "PromptMessage", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExperienceNotificationService": { - "Name": "ExperienceNotificationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExperienceService": { - "Name": "ExperienceService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExperienceStateCaptureService": { - "Name": "ExperienceStateCaptureService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "HiddenSelectionEnabled": { - "Name": "HiddenSelectionEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsInBackground": { - "Name": "IsInBackground", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsInCaptureMode": { - "Name": "IsInCaptureMode", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SelectionMode": { - "Name": "SelectionMode", - "Scriptability": "None", - "DataType": { - "Enum": "ExperienceStateCaptureSelectionMode" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExperienceStateRecordingService": { - "Name": "ExperienceStateRecordingService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "IsServerDataModelRecorderActive": { - "Name": "IsServerDataModelRecorderActive", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExplorerFilter": { - "Name": "ExplorerFilter", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExplorerFilterAutocompleter": { - "Name": "ExplorerFilterAutocompleter", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "ReplaceRange": { - "Name": "ReplaceRange", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RequiresOutsideContext": { - "Name": "RequiresOutsideContext", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ExplorerServiceVisibilityService": { - "Name": "ExplorerServiceVisibilityService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "Explosion": { "Name": "Explosion", "Tags": [], @@ -28206,22 +10252,6 @@ } } }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Position": { "Name": "Position", "Scriptability": "ReadWrite", @@ -28235,19 +10265,6 @@ } } }, - "TimeScale": { - "Name": "TimeScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Visible": { "Name": "Visible", "Scriptability": "ReadWrite", @@ -28263,11 +10280,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "BlastPressure": { "Float32": 500000.0 @@ -28275,18 +10289,12 @@ "BlastRadius": { "Float32": 4.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "DestroyJointRadiusPercent": { "Float32": 1.0 }, "ExplosionType": { "Enum": 1 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Position": { "Vector3": [ 0.0, @@ -28294,136 +10302,22 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TimeScale": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": true } } }, - "ExternalIdentityService": { - "Name": "ExternalIdentityService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FaceAnimatorService": { - "Name": "FaceAnimatorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AudioAnimationEnabled": { - "Name": "AudioAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FaceTrackingStatusEnum": { - "Name": "FaceTrackingStatusEnum", - "Scriptability": "None", - "DataType": { - "Enum": "TrackerFaceTrackingStatus" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FlipHeadOrientation": { - "Name": "FlipHeadOrientation", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VideoAnimationEnabled": { - "Name": "VideoAnimationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "FaceControls": { "Name": "FaceControls", - "Tags": [], + "Tags": [ + "NotBrowsable" + ], "Superclass": "Instance", "Properties": { "ChinRaiser": { @@ -28561,22 +10455,6 @@ } } }, - "InternalOverrideFACSData": { - "Name": "InternalOverrideFACSData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "JawDrop": { "Name": "JawDrop", "Scriptability": "ReadWrite", @@ -29194,32 +11072,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InternalOverrideFACSData": { + "AttributesSerialize": { "BinaryString": "" }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -29245,172 +11105,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FacialAgeEstimationService": { - "Name": "FacialAgeEstimationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FacialAnimationRecordingService": { - "Name": "FacialAnimationRecordingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "BiometricDataConsent": { - "Name": "BiometricDataConsent", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FacialAnimationStreamingServiceStats": { - "Name": "FacialAnimationStreamingServiceStats", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FacialAnimationStreamingServiceV2": { - "Name": "FacialAnimationStreamingServiceV2", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ServiceState": { - "Name": "ServiceState", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FacialAnimationStreamingSubsessionStats": { - "Name": "FacialAnimationStreamingSubsessionStats", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FacsImportData": { - "Name": "FacsImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseImportData", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Feature": { "Name": "Feature", @@ -29472,37 +11167,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FeatureRestrictionManager": { - "Name": "FeatureRestrictionManager", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "File": { "Name": "File", @@ -29530,78 +11195,16 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FileManagerService": { - "Name": "FileManagerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "FileMesh": { "Name": "FileMesh", "Tags": [], "Superclass": "DataModelMesh", "Properties": { - "MeshContent": { - "Name": "MeshContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MeshId": { "Name": "MeshId", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MeshContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TextureContent": { - "Name": "TextureContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -29616,36 +11219,22 @@ "Name": "TextureId", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" + "Value": "Content" }, "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } + "Serialization": "Serializes" } } } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshContent": { - "Content": "None" + "MeshId": { + "Content": "" }, "Offset": { "Vector3": [ @@ -29654,9 +11243,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Scale": { "Vector3": [ 1.0, @@ -29668,13 +11254,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "TextureId": { + "Content": "" }, "VertexColor": { "Vector3": [ @@ -29685,26 +11268,6 @@ } } }, - "FileSyncReplicationService": { - "Name": "FileSyncReplicationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "Fire": { "Name": "Fire", "Tags": [], @@ -29753,22 +11316,6 @@ } } }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SecondaryColor": { "Name": "SecondaryColor", "Scriptability": "ReadWrite", @@ -29799,29 +11346,13 @@ } } }, - "TimeScale": { - "Name": "TimeScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "heat_xml": { "Name": "heat_xml", "Scriptability": "None", "DataType": { "Value": "Float32" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Heat" @@ -29850,10 +11381,7 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Size" @@ -29862,14 +11390,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { "Color3": [ @@ -29884,12 +11406,6 @@ "Heat": { "Float32": 9.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SecondaryColor": { "Color3": [ 0.54509807, @@ -29904,13 +11420,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TimeScale": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -29936,18 +11446,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CanBeDropped": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, @@ -29977,89 +11481,26 @@ ] } }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LevelOfDetail": { - "Enum": 0 - }, "ManualActivationOnly": { "Bool": false }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, "RequiresHandle": { "Bool": true }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SlimHash": { - "SharedString": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TeamColor": { - "BrickColor": 194 + "Int32": 194 }, - "TextureContent": { - "Content": "None" + "TextureId": { + "Content": "" }, "ToolTip": { "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null } } }, @@ -30088,14 +11529,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -30156,15 +11591,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -30178,9 +11607,6 @@ "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, "FormFactor": { "Enum": 1 }, @@ -30196,9 +11622,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -30220,9 +11643,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -30274,9 +11694,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Shape": { "Enum": 1 }, @@ -30291,10 +11708,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TeamColor": { - "BrickColor": 194 + "Int32": 194 }, "TopParamA": { "Float32": -0.5 @@ -30311,9 +11728,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -30331,17 +11745,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "FlangeSoundEffect": { "Name": "FlangeSoundEffect", @@ -30389,14 +11793,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Depth": { "Float32": 0.45 @@ -30404,9 +11802,6 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Mix": { "Float32": 0.85 }, @@ -30416,17 +11811,11 @@ "Rate": { "Float32": 5.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -30450,51 +11839,17 @@ "Serialization": "DoesNotSerialize" } } - }, - "ValuesAndTimes": { - "Name": "ValuesAndTimes", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ValuesAndTimes": { - "BinaryString": "AgAAAAAAAAABAAAAAAAAAA==" + "BinaryString": "" } } }, @@ -30548,7 +11903,7 @@ "Name": "Texture", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" + "Value": "Content" }, "Tags": [], "Kind": { @@ -30611,31 +11966,19 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, "CycleOffset": { "Float32": 0.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -30643,10 +11986,10 @@ "Float32": 4.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Texture": { - "ContentId": "" + "Content": "" }, "TextureSize": { "Vector2": [ @@ -30657,9 +12000,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Float32": 2.0 }, @@ -30671,90 +12011,6 @@ } } }, - "FluidForceSensor": { - "Name": "FluidForceSensor", - "Tags": [], - "Superclass": "SensorBase", - "Properties": { - "CenterOfPressure": { - "Name": "CenterOfPressure", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Force": { - "Name": "Force", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Torque": { - "Name": "Torque", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpdateType": { - "Enum": 0 - } - } - }, "FlyweightService": { "Name": "FlyweightService", "Tags": [ @@ -30763,29 +12019,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -30793,68 +12034,16 @@ "Name": "Folder", "Tags": [], "Superclass": "Instance", - "Properties": { - "IconTint": { - "Name": "IconTint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReplicatedGuiInsertionOrder": { - "Name": "ReplicatedGuiInsertionOrder", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IconTint": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -30878,29 +12067,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": true @@ -30955,10 +12129,7 @@ "DataType": { "Enum": "FormFactor" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "FormFactor" @@ -30966,17 +12137,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Frame": { "Name": "Frame", @@ -31007,11 +12168,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -31031,9 +12189,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -31042,21 +12200,12 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "Draggable": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true - }, "LayoutOrder": { "Int32": 0 }, @@ -31075,33 +12224,9 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Selectable": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, "Size": { "UDim2": [ [ @@ -31124,10 +12249,7 @@ "Enum": 0 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": true @@ -31145,17 +12267,7 @@ ], "Superclass": "Pages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "FriendService": { "Name": "FriendService", @@ -31165,283 +12277,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FriendsCallingInstance": { - "Name": "FriendsCallingInstance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "CallId": { - "Name": "CallId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ConversationId": { - "Name": "ConversationId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EndReason": { - "Name": "EndReason", - "Scriptability": "None", - "DataType": { - "Enum": "FriendsCallingEndReason" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InitiatorUserId": { - "Name": "InitiatorUserId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsDeafened": { - "Name": "IsDeafened", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Phase": { - "Name": "Phase", - "Scriptability": "None", - "DataType": { - "Enum": "FriendsCallingPhase" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FriendsCallingParticipant": { - "Name": "FriendsCallingParticipant", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Error": { - "Name": "Error", - "Scriptability": "None", - "DataType": { - "Enum": "FriendsCallingParticipantErrors" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsLocalMuted": { - "Name": "IsLocalMuted", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsSpeaking": { - "Name": "IsSpeaking", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeaveReason": { - "Name": "LeaveReason", - "Scriptability": "None", - "DataType": { - "Enum": "FriendsCallingParticipantLeaveReason" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Status": { - "Name": "Status", - "Scriptability": "None", - "DataType": { - "Enum": "FriendsCallingParticipantStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UserId": { - "Name": "UserId", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "FunctionalTest": { "Name": "FunctionalTest", @@ -31450,23 +12286,6 @@ ], "Superclass": "Instance", "Properties": { - "AllowSleep": { - "Name": "AllowSleep", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Description": { "Name": "Description", "Scriptability": "ReadWrite", @@ -31479,105 +12298,20 @@ "Serialization": "Serializes" } } - }, - "HasMigratedSettingsToTestService": { - "Name": "HasMigratedSettingsToTestService", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Is30FpsThrottleEnabled": { - "Name": "Is30FpsThrottleEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicsEnvironmentalThrottle": { - "Name": "PhysicsEnvironmentalThrottle", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Timeout": { - "Name": "Timeout", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Description": { "String": "?" }, - "HasMigratedSettingsToTestService": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -31590,29 +12324,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -31621,38 +12340,66 @@ "Tags": [ "NotBrowsable", "NotCreatable", - "NotReplicated", - "Service" + "Settings" ], "Superclass": "Instance", "Properties": { + "AdditionalCoreIncludeDirs": { + "Name": "AdditionalCoreIncludeDirs", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "OverrideStarterScript": { + "Name": "OverrideStarterScript", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "VideoCaptureEnabled": { "Name": "VideoCaptureEnabled", "Scriptability": "ReadWrite", "DataType": { "Value": "Bool" }, - "Tags": [ - "Deprecated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" } } + }, + "VideoRecording": { + "Name": "VideoRecording", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GamepadService": { "Name": "GamepadService", @@ -31665,108 +12412,22 @@ "Properties": { "GamepadCursorEnabled": { "Name": "GamepadCursorEnabled", - "Scriptability": "Read", + "Scriptability": "None", "DataType": { "Value": "Bool" }, - "Tags": [], + "Tags": [ + "Hidden", + "NotReplicated" + ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GeneratedFolder": { - "Name": "GeneratedFolder", - "Tags": [], - "Superclass": "Folder", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IconTint": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GenerationService": { - "Name": "GenerationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GenericChallengeService": { - "Name": "GenericChallengeService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GenericSettings": { "Name": "GenericSettings", @@ -31775,17 +12436,7 @@ ], "Superclass": "ServiceProvider", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Geometry": { "Name": "Geometry", @@ -31796,119 +12447,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "SourceAssetId": { + "Int64": -1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GeometryService": { - "Name": "GeometryService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GetTextBoundsParams": { - "Name": "GetTextBoundsParams", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Font": { - "Name": "Font", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RichText": { - "Name": "RichText", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Width": { - "Name": "Width", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "Tags": { + "BinaryString": "" } } }, @@ -31920,17 +12466,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GlobalSettings": { "Name": "GlobalSettings", @@ -31940,17 +12476,7 @@ ], "Superclass": "GenericSettings", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Glue": { "Name": "Glue", @@ -32013,11 +12539,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -32071,9 +12594,6 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, @@ -32105,317 +12625,23 @@ 0.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, - "GongService": { - "Name": "GongService", + "GoogleAnalyticsConfiguration": { + "Name": "GoogleAnalyticsConfiguration", "Tags": [ "NotCreatable", "Service" ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GroundController": { - "Name": "GroundController", - "Tags": [], - "Superclass": "ControllerBase", - "Properties": { - "AccelerationLean": { - "Name": "AccelerationLean", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AccelerationTime": { - "Name": "AccelerationTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BalanceMaxTorque": { - "Name": "BalanceMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BalanceSpeed": { - "Name": "BalanceSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DecelerationTime": { - "Name": "DecelerationTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Friction": { - "Name": "Friction", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FrictionWeight": { - "Name": "FrictionWeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GroundOffset": { - "Name": "GroundOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StandForce": { - "Name": "StandForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StandSpeed": { - "Name": "StandSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TurnSpeedFactor": { - "Name": "TurnSpeedFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AccelerationLean": { - "Float32": 1.0 - }, - "AccelerationTime": { - "Float32": 0.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BalanceMaxTorque": { - "Float32": 10000.0 - }, - "BalanceRigidityEnabled": { - "Bool": false - }, - "BalanceSpeed": { - "Float32": 100.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DecelerationTime": { - "Float32": 0.0 - }, - "Friction": { - "Float32": 2.0 - }, - "FrictionWeight": { - "Float32": 1.0 - }, - "GroundOffset": { - "Float32": 1.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MoveSpeedFactor": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "StandForce": { - "Float32": 10000.0 - }, - "StandSpeed": { - "Float32": 100.0 - }, - "Tags": { - "Tags": [] - }, - "TurnSpeedFactor": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GroupImportData": { - "Name": "GroupImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseImportData", - "Properties": { - "Anchored": { - "Name": "Anchored", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImportAsModelAsset": { - "Name": "ImportAsModelAsset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InsertInWorkspace": { - "Name": "InsertInWorkspace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GroupService": { "Name": "GroupService", @@ -32426,17 +12652,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuiBase": { "Name": "GuiBase", @@ -32445,17 +12661,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuiBase2d": { "Name": "GuiBase2d", @@ -32513,23 +12719,6 @@ } } }, - "ActiveQueryNames": { - "Name": "ActiveQueryNames", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "AutoLocalize": { "Name": "AutoLocalize", "Scriptability": "ReadWrite", @@ -32611,22 +12800,6 @@ } } }, - "ReplicatedInsertionOrder": { - "Name": "ReplicatedInsertionOrder", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RootLocalizationTable": { "Name": "RootLocalizationTable", "Scriptability": "ReadWrite", @@ -32640,71 +12813,6 @@ } } }, - "SelectionBehaviorDown": { - "Name": "SelectionBehaviorDown", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SelectionBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionBehaviorLeft": { - "Name": "SelectionBehaviorLeft", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SelectionBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionBehaviorRight": { - "Name": "SelectionBehaviorRight", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SelectionBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionBehaviorUp": { - "Name": "SelectionBehaviorUp", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SelectionBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionGroup": { - "Name": "SelectionGroup", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TotalGroupScale": { "Name": "TotalGroupScale", "Scriptability": "None", @@ -32723,17 +12831,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuiBase3d": { "Name": "GuiBase3d", @@ -32799,17 +12897,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuiButton": { "Name": "GuiButton", @@ -32832,19 +12920,6 @@ } } }, - "HoverHapticEffect": { - "Name": "HoverHapticEffect", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Modal": { "Name": "Modal", "Scriptability": "ReadWrite", @@ -32858,115 +12933,6 @@ } } }, - "MouseButton1ClickConnectionCount": { - "Name": "MouseButton1ClickConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseButton1DownConnectionCount": { - "Name": "MouseButton1DownConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseButton1UpConnectionCount": { - "Name": "MouseButton1UpConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseButton2ClickConnectionCount": { - "Name": "MouseButton2ClickConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseButton2DownConnectionCount": { - "Name": "MouseButton2DownConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseButton2UpConnectionCount": { - "Name": "MouseButton2UpConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PressHapticEffect": { - "Name": "PressHapticEffect", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Selected": { "Name": "Selected", "Scriptability": "ReadWrite", @@ -32994,17 +12960,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuiLabel": { "Name": "GuiLabel", @@ -33013,17 +12969,7 @@ ], "Superclass": "GuiObject", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuiMain": { "Name": "GuiMain", @@ -33033,65 +12979,29 @@ "Superclass": "ScreenGui", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipToDeviceSafeArea": { - "Bool": true - }, "DisplayOrder": { "Int32": 0 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "IgnoreGuiInset": { + "Bool": false }, "ResetOnSpawn": { "Bool": true }, - "SafeAreaCompatibility": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "ScreenInsets": { - "Enum": 2 - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "ZIndexBehavior": { "Enum": 0 @@ -33257,38 +13167,6 @@ } } }, - "DragBeginConnectionCount": { - "Name": "DragBeginConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DragStoppedConnectionCount": { - "Name": "DragStoppedConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Draggable": { "Name": "Draggable", "Scriptability": "ReadWrite", @@ -33304,50 +13182,6 @@ } } }, - "GuiState": { - "Name": "GuiState", - "Scriptability": "Read", - "DataType": { - "Enum": "GuiState" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InputSink": { - "Name": "InputSink", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputSink" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Interactable": { - "Name": "Interactable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LayoutOrder": { "Name": "LayoutOrder", "Scriptability": "ReadWrite", @@ -33361,86 +13195,6 @@ } } }, - "MouseEnterConnectionCount": { - "Name": "MouseEnterConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseLeaveConnectionCount": { - "Name": "MouseLeaveConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseMovedConnectionCount": { - "Name": "MouseMovedConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseWheelBackwardConnectionCount": { - "Name": "MouseWheelBackwardConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseWheelForwardConnectionCount": { - "Name": "MouseWheelForwardConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "NextSelectionDown": { "Name": "NextSelectionDown", "Scriptability": "ReadWrite", @@ -33545,52 +13299,6 @@ } } }, - "SelectionOrder": { - "Name": "SelectionOrder", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionRect2D": { - "Name": "SelectionRect2D", - "Scriptability": "None", - "DataType": { - "Value": "Rect" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Sink": { - "Name": "Sink", - "Scriptability": "None", - "DataType": { - "Enum": "InputSink" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Size": { "Name": "Size", "Scriptability": "ReadWrite", @@ -33624,7 +13332,6 @@ "Value": "Float32" }, "Tags": [ - "Deprecated", "Hidden", "NotReplicated" ], @@ -33661,17 +13368,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuiService": { "Name": "GuiService", @@ -33733,25 +13430,7 @@ "DataType": { "Value": "Bool" }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DisplayScalingMode": { - "Name": "DisplayScalingMode", - "Scriptability": "None", - "DataType": { - "Enum": "DisplayScalingMode" - }, - "Tags": [ - "Hidden" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -33821,56 +13500,6 @@ } } }, - "PreferredTextSize": { - "Name": "PreferredTextSize", - "Scriptability": "Read", - "DataType": { - "Enum": "PreferredTextSize" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PreferredTransparency": { - "Name": "PreferredTransparency", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReducedMotionEnabled": { - "Name": "ReducedMotionEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SelectedCoreObject": { "Name": "SelectedCoreObject", "Scriptability": "None", @@ -33900,22 +13529,6 @@ } } }, - "TopbarInset": { - "Name": "TopbarInset", - "Scriptability": "Read", - "DataType": { - "Value": "Rect" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "TouchControlsEnabled": { "Name": "TouchControlsEnabled", "Scriptability": "ReadWrite", @@ -33928,51 +13541,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "ViewportDisplaySize": { - "Name": "ViewportDisplaySize", - "Scriptability": "Read", - "DataType": { - "Enum": "DisplaySize" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ViewportSizeInMM": { - "Name": "ViewportSizeInMM", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "GuidRegistryService": { "Name": "GuidRegistryService", @@ -33982,53 +13553,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HSRDataContentProvider": { - "Name": "HSRDataContentProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "CacheableContentProvider", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "HandleAdornment": { "Name": "HandleAdornment", @@ -34076,22 +13601,6 @@ } } }, - "GizmoReference": { - "Name": "GizmoReference", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SizeRelativeOffset": { "Name": "SizeRelativeOffset", "Scriptability": "ReadWrite", @@ -34119,17 +13628,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Handles": { "Name": "Handles", @@ -34149,86 +13648,6 @@ } } }, - "MouseButton1DownConnectionCount": { - "Name": "MouseButton1DownConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseButton1UpConnectionCount": { - "Name": "MouseButton1UpConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseDragConnectionCount": { - "Name": "MouseDragConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseEnterConnectionCount": { - "Name": "MouseEnterConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseLeaveConnectionCount": { - "Name": "MouseLeaveConnectionCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Style": { "Name": "Style", "Scriptability": "ReadWrite", @@ -34244,19 +13663,13 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, @@ -34270,12 +13683,6 @@ "Front" ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -34283,14 +13690,11 @@ "Enum": 0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } @@ -34303,137 +13707,7 @@ ], "Superclass": "PartAdornment", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HapticEffect": { - "Name": "HapticEffect", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Looped": { - "Name": "Looped", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Type": { - "Name": "Type", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HapticEffectType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaveformData": { - "Name": "WaveformData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Looped": { - "Bool": false - }, - "Position": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Radius": { - "Float32": 3.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Type": { - "Enum": 2 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WaveformData": { - "BinaryString": "" - } - } + "DefaultProperties": {} }, "HapticService": { "Name": "HapticService", @@ -34444,38 +13718,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HarmonyService": { - "Name": "HarmonyService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Hat": { "Name": "Hat", @@ -34485,9 +13728,6 @@ "Superclass": "Accoutrement", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, "AttachmentPoint": { "CFrame": { "position": [ @@ -34514,86 +13754,14 @@ ] } }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HeapProfilerService": { - "Name": "HeapProfilerService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HeatmapQueryService": { - "Name": "HeatmapQueryService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HeatmapService": { - "Name": "HeatmapService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -34605,109 +13773,13 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HiddenSurfaceRemovalAsset": { - "Name": "HiddenSurfaceRemovalAsset", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "HSRData": { - "Name": "HSRData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HSRMeshIdData": { - "Name": "HSRMeshIdData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HSRData": { - "BinaryString": "" - }, - "HSRMeshIdData": { - "BinaryString": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Highlight": { "Name": "Highlight", "Tags": [], "Superclass": "Instance", "Properties": { - "Adornee": { - "Name": "Adornee", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "DepthMode": { "Name": "DepthMode", "Scriptability": "ReadWrite", @@ -34760,21 +13832,6 @@ } } }, - "LineThickness": { - "Name": "LineThickness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "OutlineColor": { "Name": "OutlineColor", "Scriptability": "ReadWrite", @@ -34800,32 +13857,11 @@ "Serialization": "Serializes" } } - }, - "ReservedId": { - "Name": "ReservedId", - "Scriptability": "None", - "DataType": { - "Enum": "ReservedHighlightId" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "DepthMode": { "Enum": 0 @@ -34843,9 +13879,6 @@ "FillTransparency": { "Float32": 0.5 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "OutlineColor": { "Color3": [ 1.0, @@ -34856,17 +13889,11 @@ "OutlineTransparency": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -35034,21 +14061,6 @@ } } }, - "SoftlockServoUponReachingTarget": { - "Name": "SoftlockServoUponReachingTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TargetAngle": { "Name": "TargetAngle", "Scriptability": "ReadWrite", @@ -35089,24 +14101,15 @@ "AngularVelocity": { "Float32": 0.0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 1009 + "Int32": 1009 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LimitsEnabled": { "Bool": false }, @@ -35114,7 +14117,7 @@ "Float32": -45.0 }, "MotorMaxAcceleration": { - "Float32": 500000.0 + "Float32": null }, "MotorMaxTorque": { "Float32": 0.0 @@ -35125,27 +14128,18 @@ "Restitution": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "ServoMaxTorque": { "Float32": 0.0 }, - "SoftlockServoUponReachingTarget": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TargetAngle": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "UpperAngle": { "Float32": 45.0 }, @@ -35162,32 +14156,17 @@ "Superclass": "Message", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Text": { "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -35199,41 +14178,26 @@ "Superclass": "Feature", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "FaceId": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "InOut": { "Enum": 2 }, "LeftRight": { "Enum": 1 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopBottom": { "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -35246,17 +14210,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "HopperBin": { "Name": "HopperBin", @@ -35290,131 +14244,26 @@ "Serialization": "Serializes" } } - }, - "Command": { - "Name": "Command", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextureName": { - "Name": "TextureName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { "Active": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "BinType": { "Enum": 0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LevelOfDetail": { - "Enum": 0 - }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SlimHash": { - "SharedString": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null + "TextureId": { + "Content": "" } } }, @@ -35426,17 +14275,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "HttpRequest": { "Name": "HttpRequest", @@ -35445,17 +14284,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "HttpService": { "Name": "HttpService", @@ -35467,7 +14296,7 @@ "Properties": { "HttpEnabled": { "Name": "HttpEnabled", - "Scriptability": "Read", + "Scriptability": "None", "DataType": { "Value": "Bool" }, @@ -35480,32 +14309,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "HttpEnabled": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -35566,54 +14380,6 @@ } } }, - "CameraMaxDistance": { - "Name": "CameraMaxDistance", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CameraMinDistance": { - "Name": "CameraMinDistance", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CameraMode": { - "Name": "CameraMode", - "Scriptability": "None", - "DataType": { - "Enum": "CameraMode" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "CameraOffset": { "Name": "CameraOffset", "Scriptability": "ReadWrite", @@ -35668,35 +14434,6 @@ } } }, - "EvaluateStateMachine": { - "Name": "EvaluateStateMachine", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FinishedState": { - "Name": "FinishedState", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "FloorMaterial": { "Name": "FloorMaterial", "Scriptability": "Read", @@ -35754,22 +14491,6 @@ } } }, - "Health_XML": { - "Name": "Health_XML", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "HipHeight": { "Name": "HipHeight", "Scriptability": "ReadWrite", @@ -35783,72 +14504,6 @@ } } }, - "InternalBodyScale": { - "Name": "InternalBodyScale", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InternalDisplayName": { - "Name": "InternalDisplayName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InternalHeadScale": { - "Name": "InternalHeadScale", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InternalOriginalHipHeight": { - "Name": "InternalOriginalHipHeight", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Jump": { "Name": "Jump", "Scriptability": "ReadWrite", @@ -35890,22 +14545,6 @@ } } }, - "JumpReplicate": { - "Name": "JumpReplicate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LeftLeg": { "Name": "LeftLeg", "Scriptability": "ReadWrite", @@ -35965,22 +14604,6 @@ } } }, - "MoveDirectionInternal": { - "Name": "MoveDirectionInternal", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "NameDisplayDistance": { "Name": "NameDisplayDistance", "Scriptability": "ReadWrite", @@ -36007,54 +14630,6 @@ } } }, - "NetworkHumanoidState": { - "Name": "NetworkHumanoidState", - "Scriptability": "None", - "DataType": { - "Enum": "HumanoidStateType" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NoFloorTimerState": { - "Name": "NoFloorTimerState", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OverrideDefaultCollisions": { - "Name": "OverrideDefaultCollisions", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "PlatformStand": { "Name": "PlatformStand", "Scriptability": "ReadWrite", @@ -36127,22 +14702,6 @@ } } }, - "RotationType": { - "Name": "RotationType", - "Scriptability": "None", - "DataType": { - "Enum": "RotationType" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SeatPart": { "Name": "SeatPart", "Scriptability": "Read", @@ -36172,22 +14731,6 @@ } } }, - "Strafe": { - "Name": "Strafe", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "TargetPoint": { "Name": "TargetPoint", "Scriptability": "ReadWrite", @@ -36201,22 +14744,6 @@ } } }, - "TimerState": { - "Name": "TimerState", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Torso": { "Name": "Torso", "Scriptability": "ReadWrite", @@ -36247,38 +14774,6 @@ } } }, - "WalkAngleError": { - "Name": "WalkAngleError", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WalkDirection": { - "Name": "WalkDirection", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "WalkSpeed": { "Name": "WalkSpeed", "Scriptability": "ReadWrite", @@ -36336,11 +14831,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoJumpEnabled": { "Bool": true @@ -36354,9 +14846,6 @@ "BreakJointsOnDeath": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CollisionType": { "Enum": 0 }, @@ -36366,34 +14855,15 @@ "DisplayName": { "String": "" }, - "EvaluateStateMachine": { - "Bool": true - }, "HealthDisplayDistance": { "Float32": 100.0 }, "HealthDisplayType": { "Enum": 0 }, - "Health_XML": { - "Float32": 100.0 - }, "HipHeight": { "Float32": 0.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InternalBodyScale": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "InternalHeadScale": { - "Float32": 1.0 - }, "JumpHeight": { "Float32": 7.2 }, @@ -36418,17 +14888,11 @@ "RigType": { "Enum": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "UseJumpPower": { "Bool": true @@ -36444,29 +14908,14 @@ "Superclass": "Controller", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -36482,12 +14931,11 @@ "Value": "String" }, "Tags": [ - "NotReplicated", "NotScriptable" ], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36497,12 +14945,10 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36545,38 +14991,6 @@ } } }, - "EmotesDataInternal": { - "Name": "EmotesDataInternal", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EquippedEmotesDataInternal": { - "Name": "EquippedEmotesDataInternal", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Face": { "Name": "Face", "Scriptability": "ReadWrite", @@ -36596,12 +15010,10 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36624,12 +15036,10 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36652,12 +15062,10 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36667,12 +15075,10 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36682,12 +15088,10 @@ "DataType": { "Value": "Int64" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36697,12 +15101,10 @@ "DataType": { "Value": "Color3" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36764,12 +15166,10 @@ "DataType": { "Value": "Int64" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36779,12 +15179,10 @@ "DataType": { "Value": "Color3" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36794,12 +15192,10 @@ "DataType": { "Value": "Int64" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36809,21 +15205,6 @@ "DataType": { "Value": "Color3" }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MoodAnimation": { - "Name": "MoodAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, "Tags": [], "Kind": { "Canonical": { @@ -36837,12 +15218,10 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36887,33 +15266,16 @@ } } }, - "ResetIncludesBodyParts": { - "Name": "ResetIncludesBodyParts", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RightArm": { "Name": "RightArm", "Scriptability": "ReadWrite", "DataType": { "Value": "Int64" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36923,12 +15285,10 @@ "DataType": { "Value": "Color3" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36938,12 +15298,10 @@ "DataType": { "Value": "Int64" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36953,12 +15311,10 @@ "DataType": { "Value": "Color3" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -36994,21 +15350,6 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StaticFacialAnimation": { - "Name": "StaticFacialAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, "Tags": [], "Kind": { "Canonical": { @@ -37035,12 +15376,10 @@ "DataType": { "Value": "Int64" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -37050,21 +15389,6 @@ "DataType": { "Value": "Color3" }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseAvatarSettings": { - "Name": "UseAvatarSettings", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, "Tags": [], "Kind": { "Canonical": { @@ -37078,12 +15402,10 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -37115,89 +15437,146 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AccessoryBlob": { + "String": "[]" }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" + }, + "BackAccessory": { + "String": "" }, "BodyTypeScale": { "Float32": 0.3 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClimbAnimation": { "Int64": 0 }, "DepthScale": { "Float32": 1.0 }, - "EmotesDataInternal": { - "String": "" - }, - "EquippedEmotesDataInternal": { - "String": "" - }, "Face": { "Int64": 0 }, + "FaceAccessory": { + "String": "" + }, "FallAnimation": { "Int64": 0 }, + "FrontAccessory": { + "String": "" + }, "GraphicTShirt": { "Int64": 0 }, + "HairAccessory": { + "String": "" + }, + "HatAccessory": { + "String": "" + }, + "Head": { + "Int64": 0 + }, + "HeadColor": { + "Color3": [ + 0.0, + 0.0, + 0.0 + ] + }, "HeadScale": { "Float32": 1.0 }, "HeightScale": { "Float32": 1.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "IdleAnimation": { "Int64": 0 }, "JumpAnimation": { "Int64": 0 }, - "MoodAnimation": { + "LeftArm": { "Int64": 0 }, + "LeftArmColor": { + "Color3": [ + 0.0, + 0.0, + 0.0 + ] + }, + "LeftLeg": { + "Int64": 0 + }, + "LeftLegColor": { + "Color3": [ + 0.0, + 0.0, + 0.0 + ] + }, + "NeckAccessory": { + "String": "" + }, "Pants": { "Int64": 0 }, "ProportionScale": { "Float32": 1.0 }, - "RunAnimation": { + "RightArm": { "Int64": 0 }, - "Sandboxed": { - "Bool": false + "RightArmColor": { + "Color3": [ + 0.0, + 0.0, + 0.0 + ] + }, + "RightLeg": { + "Int64": 0 + }, + "RightLegColor": { + "Color3": [ + 0.0, + 0.0, + 0.0 + ] + }, + "RunAnimation": { + "Int64": 0 }, "Shirt": { "Int64": 0 }, + "ShouldersAccessory": { + "String": "" + }, "SourceAssetId": { "Int64": -1 }, - "StaticFacialAnimation": { - "Bool": false - }, "SwimAnimation": { "Int64": 0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "Torso": { + "Int64": 0 }, - "UseAvatarSettings": { - "Bool": false + "TorsoColor": { + "Color3": [ + 0.0, + 0.0, + 0.0 + ] + }, + "WaistAccessory": { + "String": "" }, "WalkAnimation": { "Int64": 0 @@ -37207,2697 +15586,6 @@ } } }, - "HumanoidRigDescription": { - "Name": "HumanoidRigDescription", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Chest": { - "Name": "Chest", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChestRangeMax": { - "Name": "ChestRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChestRangeMin": { - "Name": "ChestRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChestSize": { - "Name": "ChestSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChestTposeAdjustment": { - "Name": "ChestTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadBase": { - "Name": "HeadBase", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadBaseRangeMax": { - "Name": "HeadBaseRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadBaseRangeMin": { - "Name": "HeadBaseRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadBaseSize": { - "Name": "HeadBaseSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadBaseTposeAdjustment": { - "Name": "HeadBaseTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftAnkle": { - "Name": "LeftAnkle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftAnkleRangeMax": { - "Name": "LeftAnkleRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftAnkleRangeMin": { - "Name": "LeftAnkleRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftAnkleSize": { - "Name": "LeftAnkleSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftAnkleTposeAdjustment": { - "Name": "LeftAnkleTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftClavicle": { - "Name": "LeftClavicle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftClavicleRangeMax": { - "Name": "LeftClavicleRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftClavicleRangeMin": { - "Name": "LeftClavicleRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftClavicleSize": { - "Name": "LeftClavicleSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftClavicleTposeAdjustment": { - "Name": "LeftClavicleTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftElbow": { - "Name": "LeftElbow", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftElbowRangeMax": { - "Name": "LeftElbowRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftElbowRangeMin": { - "Name": "LeftElbowRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftElbowSize": { - "Name": "LeftElbowSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftElbowTposeAdjustment": { - "Name": "LeftElbowTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftHip": { - "Name": "LeftHip", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftHipRangeMax": { - "Name": "LeftHipRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftHipRangeMin": { - "Name": "LeftHipRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftHipSize": { - "Name": "LeftHipSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftHipTposeAdjustment": { - "Name": "LeftHipTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftKnee": { - "Name": "LeftKnee", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftKneeRangeMax": { - "Name": "LeftKneeRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftKneeRangeMin": { - "Name": "LeftKneeRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftKneeSize": { - "Name": "LeftKneeSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftKneeTposeAdjustment": { - "Name": "LeftKneeTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftShoulder": { - "Name": "LeftShoulder", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftShoulderRangeMax": { - "Name": "LeftShoulderRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftShoulderRangeMin": { - "Name": "LeftShoulderRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftShoulderSize": { - "Name": "LeftShoulderSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftShoulderTposeAdjustment": { - "Name": "LeftShoulderTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftToeBase": { - "Name": "LeftToeBase", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftToeBaseRangeMax": { - "Name": "LeftToeBaseRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftToeBaseRangeMin": { - "Name": "LeftToeBaseRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftToeBaseSize": { - "Name": "LeftToeBaseSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftToeBaseTposeAdjustment": { - "Name": "LeftToeBaseTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftWrist": { - "Name": "LeftWrist", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftWristRangeMax": { - "Name": "LeftWristRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftWristRangeMin": { - "Name": "LeftWristRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftWristSize": { - "Name": "LeftWristSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftWristTposeAdjustment": { - "Name": "LeftWristTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Neck": { - "Name": "Neck", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NeckRangeMax": { - "Name": "NeckRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NeckRangeMin": { - "Name": "NeckRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NeckSize": { - "Name": "NeckSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NeckTposeAdjustment": { - "Name": "NeckTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OriginOffset": { - "Name": "OriginOffset", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightAnkle": { - "Name": "RightAnkle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightAnkleRangeMax": { - "Name": "RightAnkleRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightAnkleRangeMin": { - "Name": "RightAnkleRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightAnkleSize": { - "Name": "RightAnkleSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightAnkleTposeAdjustment": { - "Name": "RightAnkleTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightClavicle": { - "Name": "RightClavicle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightClavicleRangeMax": { - "Name": "RightClavicleRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightClavicleRangeMin": { - "Name": "RightClavicleRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightClavicleSize": { - "Name": "RightClavicleSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightClavicleTposeAdjustment": { - "Name": "RightClavicleTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightElbow": { - "Name": "RightElbow", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightElbowRangeMax": { - "Name": "RightElbowRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightElbowRangeMin": { - "Name": "RightElbowRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightElbowSize": { - "Name": "RightElbowSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightElbowTposeAdjustment": { - "Name": "RightElbowTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightHip": { - "Name": "RightHip", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightHipRangeMax": { - "Name": "RightHipRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightHipRangeMin": { - "Name": "RightHipRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightHipSize": { - "Name": "RightHipSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightHipTposeAdjustment": { - "Name": "RightHipTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightKnee": { - "Name": "RightKnee", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightKneeRangeMax": { - "Name": "RightKneeRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightKneeRangeMin": { - "Name": "RightKneeRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightKneeSize": { - "Name": "RightKneeSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightKneeTposeAdjustment": { - "Name": "RightKneeTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightShoulder": { - "Name": "RightShoulder", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightShoulderRangeMax": { - "Name": "RightShoulderRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightShoulderRangeMin": { - "Name": "RightShoulderRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightShoulderSize": { - "Name": "RightShoulderSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightShoulderTposeAdjustment": { - "Name": "RightShoulderTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightToeBase": { - "Name": "RightToeBase", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightToeBaseRangeMax": { - "Name": "RightToeBaseRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightToeBaseRangeMin": { - "Name": "RightToeBaseRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightToeBaseSize": { - "Name": "RightToeBaseSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightToeBaseTposeAdjustment": { - "Name": "RightToeBaseTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightWrist": { - "Name": "RightWrist", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightWristRangeMax": { - "Name": "RightWristRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightWristRangeMin": { - "Name": "RightWristRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightWristSize": { - "Name": "RightWristSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightWristTposeAdjustment": { - "Name": "RightWristTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Root": { - "Name": "Root", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootRangeMax": { - "Name": "RootRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootRangeMin": { - "Name": "RootRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootSize": { - "Name": "RootSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootTposeAdjustment": { - "Name": "RootTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Spine": { - "Name": "Spine", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SpineRangeMax": { - "Name": "SpineRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SpineRangeMin": { - "Name": "SpineRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SpineSize": { - "Name": "SpineSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SpineTposeAdjustment": { - "Name": "SpineTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Waist": { - "Name": "Waist", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaistRangeMax": { - "Name": "WaistRangeMax", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaistRangeMin": { - "Name": "WaistRangeMin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaistSize": { - "Name": "WaistSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaistTposeAdjustment": { - "Name": "WaistTposeAdjustment", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ChestRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ChestRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ChestSize": { - "Float32": 0.0 - }, - "ChestTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "HeadBaseRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "HeadBaseRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "HeadBaseSize": { - "Float32": 0.0 - }, - "HeadBaseTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LeftAnkleRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftAnkleRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftAnkleSize": { - "Float32": 0.0 - }, - "LeftAnkleTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "LeftClavicleRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftClavicleRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftClavicleSize": { - "Float32": 0.0 - }, - "LeftClavicleTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "LeftElbowRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftElbowRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftElbowSize": { - "Float32": 0.0 - }, - "LeftElbowTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "LeftHipRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftHipRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftHipSize": { - "Float32": 0.0 - }, - "LeftHipTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "LeftKneeRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftKneeRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftKneeSize": { - "Float32": 0.0 - }, - "LeftKneeTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "LeftShoulderRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftShoulderRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftShoulderSize": { - "Float32": 0.0 - }, - "LeftShoulderTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "LeftToeBaseRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftToeBaseRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftToeBaseSize": { - "Float32": 0.0 - }, - "LeftToeBaseTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "LeftWristRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftWristRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "LeftWristSize": { - "Float32": 0.0 - }, - "LeftWristTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "NeckRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "NeckRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "NeckSize": { - "Float32": 0.0 - }, - "NeckTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "OriginOffset": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightAnkleRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightAnkleRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightAnkleSize": { - "Float32": 0.0 - }, - "RightAnkleTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightClavicleRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightClavicleRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightClavicleSize": { - "Float32": 0.0 - }, - "RightClavicleTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightElbowRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightElbowRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightElbowSize": { - "Float32": 0.0 - }, - "RightElbowTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightHipRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightHipRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightHipSize": { - "Float32": 0.0 - }, - "RightHipTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightKneeRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightKneeRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightKneeSize": { - "Float32": 0.0 - }, - "RightKneeTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightShoulderRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightShoulderRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightShoulderSize": { - "Float32": 0.0 - }, - "RightShoulderTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightToeBaseRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightToeBaseRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightToeBaseSize": { - "Float32": 0.0 - }, - "RightToeBaseTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RightWristRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightWristRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RightWristSize": { - "Float32": 0.0 - }, - "RightWristTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "RootRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RootRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "RootSize": { - "Float32": 0.0 - }, - "RootTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "SpineRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "SpineRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "SpineSize": { - "Float32": 0.0 - }, - "SpineTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WaistRangeMax": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "WaistRangeMin": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "WaistSize": { - "Float32": 0.0 - }, - "WaistTposeAdjustment": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - } - } - }, - "IKControl": { - "Name": "IKControl", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ChainRoot": { - "Name": "ChainRoot", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EndEffector": { - "Name": "EndEffector", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EndEffectorOffset": { - "Name": "EndEffectorOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Offset": { - "Name": "Offset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pole": { - "Name": "Pole", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SmoothTime": { - "Name": "SmoothTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Target": { - "Name": "Target", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Type": { - "Name": "Type", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "IKControlType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Weight": { - "Name": "Weight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "EndEffectorOffset": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Offset": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SmoothTime": { - "Float32": 0.05 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Type": { - "Enum": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Weight": { - "Float32": 1.0 - } - } - }, "ILegacyStudioBridge": { "Name": "ILegacyStudioBridge", "Tags": [ @@ -39906,17 +15594,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "IXPService": { "Name": "IXPService", @@ -39927,17 +15605,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ImageButton": { "Name": "ImageButton", @@ -39964,24 +15632,6 @@ "HoverImage": { "Name": "HoverImage", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "HoverImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "HoverImageContent": { - "Name": "HoverImageContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -39996,25 +15646,7 @@ "Name": "Image", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ImageColor3": { - "Name": "ImageColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" + "Value": "Content" }, "Tags": [], "Kind": { @@ -40023,11 +15655,11 @@ } } }, - "ImageContent": { - "Name": "ImageContent", + "ImageColor3": { + "Name": "ImageColor3", "Scriptability": "ReadWrite", "DataType": { - "Value": "Content" + "Value": "Color3" }, "Tags": [], "Kind": { @@ -40091,42 +15723,9 @@ } } }, - "LocalizedImageContent": { - "Name": "LocalizedImageContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "PressedImage": { "Name": "PressedImage", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "PressedImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "PressedImageContent": { - "Name": "PressedImageContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -40213,11 +15812,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoButtonColor": { "Bool": true @@ -40240,9 +15836,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -40251,20 +15847,17 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "Draggable": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "HoverImage": { + "Content": "" }, - "HoverImageContent": { - "Content": "None" + "Image": { + "Content": "" }, "ImageColor3": { "Color3": [ @@ -40273,9 +15866,6 @@ 1.0 ] }, - "ImageContent": { - "Content": "None" - }, "ImageRectOffset": { "Vector2": [ 0.0, @@ -40291,9 +15881,6 @@ "ImageTransparency": { "Float32": 0.0 }, - "Interactable": { - "Bool": true - }, "LayoutOrder": { "Int32": 0 }, @@ -40312,8 +15899,8 @@ ] ] }, - "PressedImageContent": { - "Content": "None" + "PressedImage": { + "Content": "" }, "ResampleMode": { "Enum": 0 @@ -40321,9 +15908,6 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "ScaleType": { "Enum": 0 }, @@ -40333,27 +15917,6 @@ "Selected": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 1 - }, "Size": { "UDim2": [ [ @@ -40391,7 +15954,7 @@ "Enum": 0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TileSize": { "UDim2": [ @@ -40405,9 +15968,6 @@ ] ] }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -40424,24 +15984,6 @@ "Image": { "Name": "Image", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ImageContent": { - "Name": "ImageContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -40473,11 +16015,8 @@ "AlwaysOnTop": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -40505,9 +16044,6 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color3": { "Color3": [ 0.9490197, @@ -40515,16 +16051,8 @@ 0.95294124 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ImageContent": { - "Content": { - "Uri": "rbxasset://textures/SurfacesDefault.png" - } - }, - "Sandboxed": { - "Bool": false + "Image": { + "Content": "rbxasset://textures/SurfacesDefault.png" }, "Size": { "Vector2": [ @@ -40543,14 +16071,11 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -40585,25 +16110,7 @@ "Name": "Image", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ImageColor3": { - "Name": "ImageColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" + "Value": "Content" }, "Tags": [], "Kind": { @@ -40612,11 +16119,11 @@ } } }, - "ImageContent": { - "Name": "ImageContent", + "ImageColor3": { + "Name": "ImageColor3", "Scriptability": "ReadWrite", "DataType": { - "Value": "Content" + "Value": "Color3" }, "Tags": [], "Kind": { @@ -40680,21 +16187,6 @@ } } }, - "LocalizedImageContent": { - "Name": "LocalizedImageContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ResampleMode": { "Name": "ResampleMode", "Scriptability": "ReadWrite", @@ -40771,11 +16263,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -40795,9 +16284,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -40806,17 +16295,14 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "Draggable": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "Image": { + "Content": "" }, "ImageColor3": { "Color3": [ @@ -40825,9 +16311,6 @@ 1.0 ] }, - "ImageContent": { - "Content": "None" - }, "ImageRectOffset": { "Vector2": [ 0.0, @@ -40843,9 +16326,6 @@ "ImageTransparency": { "Float32": 0.0 }, - "Interactable": { - "Bool": true - }, "LayoutOrder": { "Int32": 0 }, @@ -40867,36 +16347,12 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "ScaleType": { "Enum": 0 }, "Selectable": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, "Size": { "UDim2": [ [ @@ -40931,7 +16387,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TileSize": { "UDim2": [ @@ -40945,9 +16401,6 @@ ] ] }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -40956,43 +16409,191 @@ } } }, - "ImageScreenCaptureService": { - "Name": "ImageScreenCaptureService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ImportSession": { - "Name": "ImportSession", + "ImporterBaseSettings": { + "Name": "ImporterBaseSettings", "Tags": [ "NotCreatable", "NotReplicated" ], "Superclass": "Instance", "Properties": { - "UploadSource": { - "Name": "UploadSource", - "Scriptability": "None", + "Id": { + "Name": "Id", + "Scriptability": "Read", "DataType": { "Value": "String" }, "Tags": [ - "Hidden", - "NotReplicated" + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "ImportName": { + "Name": "ImportName", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "String" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ShouldImport": { + "Name": "ShouldImport", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "ImporterGroupSettings": { + "Name": "ImporterGroupSettings", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "ImporterBaseSettings", + "Properties": { + "Anchored": { + "Name": "Anchored", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ImportAsModelAsset": { + "Name": "ImportAsModelAsset", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "InsertInWorkspace": { + "Name": "InsertInWorkspace", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, + "DefaultProperties": {} + }, + "ImporterJointSettings": { + "Name": "ImporterJointSettings", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "ImporterBaseSettings", + "Properties": {}, + "DefaultProperties": {} + }, + "ImporterMeshSettings": { + "Name": "ImporterMeshSettings", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "ImporterBaseSettings", + "Properties": { + "Anchored": { + "Name": "Anchored", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Dimensions": { + "Name": "Dimensions", + "Scriptability": "Read", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "DoubleSided": { + "Name": "DoubleSided", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "IgnoreVertexColors": { + "Name": "IgnoreVertexColors", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PolygonCount": { + "Name": "PolygonCount", + "Scriptability": "Read", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -41001,17 +16602,194 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true + "DefaultProperties": {} + }, + "ImporterRootSettings": { + "Name": "ImporterRootSettings", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "ImporterBaseSettings", + "Properties": { + "Anchored": { + "Name": "Anchored", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "FileDimensions": { + "Name": "FileDimensions", + "Scriptability": "Read", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "ImportAsModelAsset": { + "Name": "ImportAsModelAsset", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "InsertInWorkspace": { + "Name": "InsertInWorkspace", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "InvertNegativeFaces": { + "Name": "InvertNegativeFaces", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MergeMeshes": { + "Name": "MergeMeshes", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "PolygonCount": { + "Name": "PolygonCount", + "Scriptability": "Read", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RigType": { + "Name": "RigType", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "RigType" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "ScaleUnit": { + "Name": "ScaleUnit", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "MeshScaleUnit" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "WorldForward": { + "Name": "WorldForward", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "NormalId" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "WorldUp": { + "Name": "WorldUp", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "NormalId" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } } - } + }, + "DefaultProperties": {} + }, + "ImporterTextureSettings": { + "Name": "ImporterTextureSettings", + "Tags": [ + "NotCreatable", + "NotReplicated" + ], + "Superclass": "ImporterBaseSettings", + "Properties": { + "FilePath": { + "Name": "FilePath", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + } + }, + "DefaultProperties": {} }, "IncrementalPatchBuilder": { "Name": "IncrementalPatchBuilder", @@ -41021,1091 +16799,8 @@ "Service" ], "Superclass": "Instance", - "Properties": { - "AddPathsToBundle": { - "Name": "AddPathsToBundle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BuildDebouncePeriod": { - "Name": "BuildDebouncePeriod", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HighCompression": { - "Name": "HighCompression", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SerializePatch": { - "Name": "SerializePatch", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseFileLevelCompressionInsteadOfChunk": { - "Name": "UseFileLevelCompressionInsteadOfChunk", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZstdCompression": { - "Name": "ZstdCompression", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InputAction": { - "Name": "InputAction", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "BoolState": { - "Name": "BoolState", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Direction1DState": { - "Name": "Direction1DState", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Direction2DState": { - "Name": "Direction2DState", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Direction3DState": { - "Name": "Direction3DState", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DisplayName": { - "Name": "DisplayName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PreferredBinding": { - "Name": "PreferredBinding", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Type": { - "Name": "Type", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputActionType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ViewportPositionState": { - "Name": "ViewportPositionState", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DisplayName": { - "String": "" - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Type": { - "Enum": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InputActionLabel": { - "Name": "InputActionLabel", - "Tags": [], - "Superclass": "GuiObject", - "Properties": { - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageColor3": { - "Name": "ImageColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageTransparency": { - "Name": "ImageTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InputAction": { - "Name": "InputAction", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResolvedImageContent": { - "Name": "ResolvedImageContent", - "Scriptability": "Read", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ResolvedText": { - "Name": "ResolvedText", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextTransparency": { - "Name": "TextTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextWrapped": { - "Name": "TextWrapped", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextXAlignment": { - "Name": "TextXAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextXAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextYAlignment": { - "Name": "TextYAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextYAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": false - }, - "AnchorPoint": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "AutomaticSize": { - "Enum": 0 - }, - "BackgroundColor3": { - "Color3": [ - 0.6392157, - 0.63529414, - 0.64705884 - ] - }, - "BackgroundTransparency": { - "Float32": 0.0 - }, - "BorderColor3": { - "Color3": [ - 0.105882354, - 0.16470589, - 0.20784314 - ] - }, - "BorderMode": { - "Enum": 0 - }, - "BorderSizePixel": { - "Int32": 1 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendants": { - "Bool": false - }, - "Draggable": { - "Bool": false - }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/LegacyArial.json", - "weight": "Regular", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/Arimo-Regular.ttf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ImageColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "ImageTransparency": { - "Float32": 0.0 - }, - "Interactable": { - "Bool": true - }, - "LayoutOrder": { - "Int32": 0 - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "Rotation": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "Selectable": { - "Bool": false - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, - "Size": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextColor3": { - "Color3": [ - 0.10588236, - 0.16470589, - 0.20784315 - ] - }, - "TextSize": { - "Float32": 8.0 - }, - "TextTransparency": { - "Float32": 0.0 - }, - "TextWrapped": { - "Bool": false - }, - "TextXAlignment": { - "Enum": 2 - }, - "TextYAlignment": { - "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "InputBinding": { - "Name": "InputBinding", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Backward": { - "Name": "Backward", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClampMagnitudeToOne": { - "Name": "ClampMagnitudeToOne", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DisplayImage": { - "Name": "DisplayImage", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DisplayName": { - "Name": "DisplayName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Down": { - "Name": "Down", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Forward": { - "Name": "Forward", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "KeyCode": { - "Name": "KeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Left": { - "Name": "Left", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PointerIndex": { - "Name": "PointerIndex", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PressedThreshold": { - "Name": "PressedThreshold", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrimaryModifier": { - "Name": "PrimaryModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReleasedThreshold": { - "Name": "ReleasedThreshold", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResponseCurve": { - "Name": "ResponseCurve", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Right": { - "Name": "Right", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Scale": { - "Name": "Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondaryModifier": { - "Name": "SecondaryModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Type": { - "Name": "Type", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputBindingType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UIButton": { - "Name": "UIButton", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UIModifier": { - "Name": "UIModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Up": { - "Name": "Up", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Vector2Scale": { - "Name": "Vector2Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Vector3Scale": { - "Name": "Vector3Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Backward": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClampMagnitudeToOne": { - "Bool": true - }, - "DisplayImage": { - "Content": "None" - }, - "DisplayName": { - "String": "" - }, - "Down": { - "Enum": 0 - }, - "Forward": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "KeyCode": { - "Enum": 0 - }, - "Left": { - "Enum": 0 - }, - "PointerIndex": { - "Int32": 0 - }, - "PressedThreshold": { - "Float32": 0.5 - }, - "PrimaryModifier": { - "Enum": 0 - }, - "ReleasedThreshold": { - "Float32": 0.2 - }, - "ResponseCurve": { - "Float32": 1.0 - }, - "Right": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SecondaryModifier": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Type": { - "Enum": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Up": { - "Enum": 0 - }, - "Vector2Scale": { - "Vector2": [ - 1.0, - 1.0 - ] - }, - "Vector3Scale": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - } - } - }, - "InputContext": { - "Name": "InputContext", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Sink": { - "Name": "Sink", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 1000 - }, - "Sandboxed": { - "Bool": false - }, - "Sink": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "Properties": {}, + "DefaultProperties": {} }, "InputObject": { "Name": "InputObject", @@ -42180,17 +16875,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "InsertService": { "Name": "InsertService", @@ -42200,6 +16885,21 @@ ], "Superclass": "Instance", "Properties": { + "AllowClientInsertModels": { + "Name": "AllowClientInsertModels", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "AllowInsertFreeModels": { "Name": "AllowInsertFreeModels", "Scriptability": "ReadWrite", @@ -42219,32 +16919,20 @@ } }, "DefaultProperties": { + "AllowClientInsertModels": { + "Bool": false + }, "AllowInsertFreeModels": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -42254,7 +16942,7 @@ "NotBrowsable", "NotCreatable" ], - "Superclass": "Object", + "Superclass": null, "Properties": { "Archivable": { "Name": "Archivable", @@ -42273,16 +16961,11 @@ }, "Attributes": { "Name": "Attributes", - "Scriptability": "Custom", + "Scriptability": "None", "DataType": { - "Value": "Attributes" + "Value": "BinaryString" }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": { @@ -42291,45 +16974,12 @@ } } }, - "AttributesReplicate": { - "Name": "AttributesReplicate", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "AttributesSerialize": { "Name": "AttributesSerialize", "Scriptability": "None", "DataType": { "Value": "BinaryString" }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Attributes" - } - } - }, - "Capabilities": { - "Name": "Capabilities", - "Scriptability": "None", - "DataType": { - "Value": "SecurityCapabilities" - }, "Tags": [], "Kind": { "Canonical": { @@ -42337,6 +16987,22 @@ } } }, + "ClassName": { + "Name": "ClassName", + "Scriptability": "Read", + "DataType": { + "Value": "String" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, "DataCost": { "Name": "DataCost", "Scriptability": "None", @@ -42355,56 +17021,6 @@ } } }, - "DefinesCapabilities": { - "Name": "DefinesCapabilities", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Sandboxed" - } - } - }, - "HistoryId": { - "Name": "HistoryId", - "Scriptability": "None", - "DataType": { - "Value": "UniqueId" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsInSandbox": { - "Name": "IsInSandbox", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Name": { "Name": "Name", "Scriptability": "ReadWrite", @@ -42433,41 +17049,6 @@ } } }, - "PredictionMode": { - "Name": "PredictionMode", - "Scriptability": "None", - "DataType": { - "Enum": "PredictionMode" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PropertyStatusStudio": { - "Name": "PropertyStatusStudio", - "Scriptability": "None", - "DataType": { - "Enum": "PropertyStatus" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RobloxLocked": { "Name": "RobloxLocked", "Scriptability": "ReadWrite", @@ -42483,40 +17064,6 @@ } } }, - "Sandboxed": { - "Name": "Sandboxed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "DefinesCapabilities" - } - } - } - }, - "SerializedOverrides": { - "Name": "SerializedOverrides", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "SourceAssetId": { "Name": "SourceAssetId", "Scriptability": "None", @@ -42524,7 +17071,8 @@ "Value": "Int64" }, "Tags": [ - "Hidden" + "Hidden", + "NotReplicated" ], "Kind": { "Canonical": { @@ -42538,25 +17086,7 @@ "DataType": { "Value": "Tags" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UniqueId": { - "Name": "UniqueId", - "Scriptability": "None", - "DataType": { - "Value": "UniqueId" - }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -42580,34 +17110,25 @@ } } }, - "numExpectedDirectChildren": { - "Name": "numExpectedDirectChildren", - "Scriptability": "None", + "className": { + "Name": "className", + "Scriptability": "Read", "DataType": { - "Value": "Int32" + "Value": "String" }, "Tags": [ - "Hidden", - "NotScriptable" + "Deprecated", + "NotReplicated", + "ReadOnly" ], "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" + "Alias": { + "AliasFor": "ClassName" } } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "InstanceAdornment": { "Name": "InstanceAdornment", @@ -42630,58 +17151,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InstanceExtensionsService": { - "Name": "InstanceExtensionsService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InstanceFileSyncService": { - "Name": "InstanceFileSyncService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "IntConstrainedValue": { "Name": "IntConstrainedValue", @@ -42746,36 +17216,11 @@ "Serialization": "DoesNotSerialize" } } - }, - "value": { - "Name": "value", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "MaxValue": { "Int64": 10 @@ -42783,20 +17228,11 @@ "MinValue": { "Int64": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "value": { - "Int64": 0 + "BinaryString": "" } } }, @@ -42820,37 +17256,22 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "Int64": 0 } } }, - "IntentService": { - "Name": "IntentService", + "InternalContainer": { + "Name": "InternalContainer", "Tags": [ "NotCreatable", "NotReplicated", @@ -42858,480 +17279,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InternalMessagingService": { - "Name": "InternalMessagingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InternalMessagingServiceVerifier": { - "Name": "InternalMessagingServiceVerifier", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InternalSyncItem": { - "Name": "InternalSyncItem", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "AutoSync": { - "Name": "AutoSync", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Path": { - "Name": "Path", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Target": { - "Name": "Target", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InternalSyncService": { - "Name": "InternalSyncService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "IntersectOperation": { - "Name": "IntersectOperation", - "Tags": [], - "Superclass": "PartOperation", - "Properties": {}, - "DefaultProperties": { - "AeroMeshData": { - "SharedString": "" - }, - "Anchored": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true - }, - "BackParamA": { - "Float32": -0.5 - }, - "BackParamB": { - "Float32": 0.5 - }, - "BackSurface": { - "Enum": 0 - }, - "BackSurfaceInput": { - "Enum": 0 - }, - "BottomParamA": { - "Float32": -0.5 - }, - "BottomParamB": { - "Float32": 0.5 - }, - "BottomSurface": { - "Enum": 0 - }, - "BottomSurfaceInput": { - "Enum": 0 - }, - "CFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "CanCollide": { - "Bool": true - }, - "CanQuery": { - "Bool": true - }, - "CanTouch": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CastShadow": { - "Bool": true - }, - "ChildData": { - "BinaryString": "" - }, - "ChildData2": { - "SharedString": "" - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 255, - 255, - 255 - ] - }, - "ComponentIndex": { - "Int32": -1 - }, - "Content": { - "Content": "None" - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "EnableFluidForces": { - "Bool": true - }, - "FluidFidelityInternal": { - "Enum": 0 - }, - "FormFactor": { - "Enum": 3 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InertiaMigrated": { - "Bool": true - }, - "InitialSize": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "LeftParamA": { - "Float32": -0.5 - }, - "LeftParamB": { - "Float32": 0.5 - }, - "LeftSurface": { - "Enum": 0 - }, - "LeftSurfaceInput": { - "Enum": 0 - }, - "Locked": { - "Bool": false - }, - "Massless": { - "Bool": false - }, - "Material": { - "Enum": 256 - }, - "MaterialVariant": { - "String": "" - }, - "MeshData": { - "BinaryString": "" - }, - "MeshData2": { - "SharedString": "" - }, - "OffCentered": { - "Bool": false - }, - "PhysicalConfigData": { - "SharedString": "Q1NHUEhTAAAAAEJMT0NL" - }, - "PhysicsData": { - "BinaryString": "" - }, - "PivotOffset": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Reflectance": { - "Float32": 0.0 - }, - "RenderFidelity": { - "Enum": 0 - }, - "RightParamA": { - "Float32": -0.5 - }, - "RightParamB": { - "Float32": 0.5 - }, - "RightSurface": { - "Enum": 0 - }, - "RightSurfaceInput": { - "Enum": 0 - }, - "RootPriority": { - "Int32": 0 - }, - "RotVelocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "Size": { - "Vector3": [ - 4.0, - 1.2, - 2.0 - ] - }, - "SmoothingAngle": { - "Float32": 0.0 - }, - "SolidMeshHolder": { - "NetAssetRef": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 0 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "TriangleCount": { - "Int32": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UnscaledCofm": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolInertiaDiags": { - "Vector3": [ - 0.16666666, - 0.16666666, - 0.16666666 - ] - }, - "UnscaledVolInertiaOffDiags": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolume": { - "Float32": 1.0 - }, - "UsePartColor": { - "Bool": false - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } + "DefaultProperties": {} }, "InventoryPages": { "Name": "InventoryPages", @@ -43341,37 +17289,7 @@ ], "Superclass": "Pages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "JointImportData": { - "Name": "JointImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseImportData", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "JointInstance": { "Name": "JointInstance", @@ -43479,17 +17397,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "JointsService": { "Name": "JointsService", @@ -43500,17 +17408,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "KeyboardService": { "Name": "KeyboardService", @@ -43520,17 +17418,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Keyframe": { "Name": "Keyframe", @@ -43552,32 +17440,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Time": { "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -43601,29 +17474,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "String": "" @@ -43652,41 +17510,23 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AuthoredHipHeight": { "Float32": 2.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "GuidBinaryString": { - "BinaryString": "AAAAAAAAAAAAAAAAAAAAAA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Loop": { "Bool": true }, "Priority": { "Enum": 2 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -43699,17 +17539,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "LanguageService": { "Name": "LanguageService", @@ -43721,14 +17551,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "SourceAssetId": { + "Int64": -1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "Tags": { + "BinaryString": "" } } }, @@ -43766,22 +17596,6 @@ } } }, - "TabKeyboardNavigation": { - "Name": "TabKeyboardNavigation", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ZIndexBehavior": { "Name": "ZIndexBehavior", "Scriptability": "ReadWrite", @@ -43796,17 +17610,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "LegacyStudioBridge": { "Name": "LegacyStudioBridge", @@ -43817,17 +17621,7 @@ ], "Superclass": "ILegacyStudioBridge", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Light": { "Name": "Light", @@ -43889,17 +17683,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Lighting": { "Name": "Lighting", @@ -43946,7 +17730,7 @@ ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -44015,21 +17799,6 @@ } } }, - "ExtendLightRangeTo120": { - "Name": "ExtendLightRangeTo120", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "FogColor": { "Name": "FogColor", "Scriptability": "ReadWrite", @@ -44095,19 +17864,6 @@ } } }, - "LightingStyle": { - "Name": "LightingStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "LightingStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "OutdoorAmbient": { "Name": "OutdoorAmbient", "Scriptability": "ReadWrite", @@ -44136,19 +17892,6 @@ } } }, - "PrioritizeLightingQuality": { - "Name": "PrioritizeLightingQuality", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ShadowColor": { "Name": "ShadowColor", "Scriptability": "ReadWrite", @@ -44184,13 +17927,31 @@ "DataType": { "Enum": "Technology" }, - "Tags": [], + "Tags": [ + "NotScriptable" + ], "Kind": { "Canonical": { "Serialization": "Serializes" } } }, + "TempUseNewSkyRemovalBehaviour": { + "Name": "TempUseNewSkyRemovalBehaviour", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, "TimeOfDay": { "Name": "TimeOfDay", "Scriptability": "ReadWrite", @@ -44213,33 +17974,11 @@ 0.5 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": { - "RBX_BackupBrightness": { - "Float32": 1.0 - }, - "RBX_BackupExposureCompensation": { - "Float32": 0.0 - }, - "RBX_LightingCompatibilityMigrated": { - "Bool": true - }, - "RBX_LightingTechnologyUnifiedMigration": { - "Bool": true - }, - "RBX_OriginalTechnologyOnFileLoad": { - "Int32": 2 - } - } + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { - "Float32": 1.9812492 - }, - "Capabilities": { - "SecurityCapabilities": 0 + "Float32": 1.0 }, "ColorShift_Bottom": { "Color3": [ @@ -44264,9 +18003,6 @@ "ExposureCompensation": { "Float32": 0.0 }, - "ExtendLightRangeTo120": { - "Enum": 0 - }, "FogColor": { "Color3": [ 0.75, @@ -44286,12 +18022,6 @@ "GlobalShadows": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LightingStyle": { - "Enum": 1 - }, "OutdoorAmbient": { "Color3": [ 0.5, @@ -44302,12 +18032,6 @@ "Outlines": { "Bool": true }, - "PrioritizeLightingQuality": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, "ShadowSoftness": { "Float32": 0.5 }, @@ -44315,16 +18039,13 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Technology": { - "Enum": 1 + "Enum": 2 }, "TimeOfDay": { "String": "14:00:00" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -44403,24 +18124,15 @@ "ApplyAtCenterOfMass": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 23 + "Int32": 23 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "InverseSquareLaw": { "Bool": false }, @@ -44433,17 +18145,11 @@ "ReactionForceEnabled": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false @@ -44489,11 +18195,8 @@ "AlwaysOnTop": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -44521,25 +18224,16 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Length": { "Float32": 5.0 }, - "Sandboxed": { - "Bool": false - }, "SizeRelativeOffset": { "Vector3": [ 0.0, @@ -44551,7 +18245,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Thickness": { "Float32": 1.0 @@ -44559,9 +18253,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -44575,32 +18266,6 @@ "Tags": [], "Superclass": "Constraint", "Properties": { - "ForceLimitMode": { - "Name": "ForceLimitMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ForceLimitMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ForceLimitsEnabled": { - "Name": "ForceLimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LineDirection": { "Name": "LineDirection", "Scriptability": "ReadWrite", @@ -44627,19 +18292,6 @@ } } }, - "MaxAxesForce": { - "Name": "MaxAxesForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MaxForce": { "Name": "MaxForce", "Scriptability": "ReadWrite", @@ -44653,19 +18305,6 @@ } } }, - "MaxPlanarAxesForce": { - "Name": "MaxPlanarAxesForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "PlaneVelocity": { "Name": "PlaneVelocity", "Scriptability": "ReadWrite", @@ -44692,19 +18331,6 @@ } } }, - "ReactionForceEnabled": { - "Name": "ReactionForceEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "RelativeTo": { "Name": "RelativeTo", "Scriptability": "ReadWrite", @@ -44759,30 +18385,15 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 26 + "Int32": 26 }, "Enabled": { "Bool": true }, - "ForceLimitMode": { - "Enum": 0 - }, - "ForceLimitsEnabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LineDirection": { "Vector3": [ 1.0, @@ -44793,22 +18404,9 @@ "LineVelocity": { "Float32": -0.0 }, - "MaxAxesForce": { - "Vector3": [ - 1000.0, - 1000.0, - 1000.0 - ] - }, "MaxForce": { "Float32": 1000.0 }, - "MaxPlanarAxesForce": { - "Vector2": [ - 1000.0, - 1000.0 - ] - }, "PlaneVelocity": { "Vector2": [ 0.0, @@ -44822,15 +18420,9 @@ 0.0 ] }, - "ReactionForceEnabled": { - "Bool": true - }, "RelativeTo": { "Enum": 2 }, - "Sandboxed": { - "Bool": false - }, "SecondaryTangentAxis": { "Vector3": [ 0.0, @@ -44842,10 +18434,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "VectorVelocity": { "Vector3": [ @@ -44862,154 +18451,20 @@ } } }, - "LinkingService": { - "Name": "LinkingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LiveScriptingService": { - "Name": "LiveScriptingService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ServerLiveEditingMode": { - "Name": "ServerLiveEditingMode", - "Scriptability": "None", - "DataType": { - "Enum": "ServerLiveEditingMode" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LiveSyncService": { - "Name": "LiveSyncService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "HasSyncedInstances": { - "Name": "HasSyncedInstances", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LocalDebuggerConnection": { - "Name": "LocalDebuggerConnection", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "DebuggerConnection", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "LocalScript": { "Name": "LocalScript", "Tags": [], "Superclass": "Script", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Disabled": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LinkedSource": { - "ContentId": "" - }, - "RunContext": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "ScriptGuid": { - "String": "" + "Content": "" }, "Source": { "String": "" @@ -45018,10 +18473,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -45034,17 +18486,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "LocalizationService": { "Name": "LocalizationService", @@ -45087,38 +18529,6 @@ } } }, - "GameSourceLanguageId": { - "Name": "GameSourceLanguageId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsImageCaptureEnabled": { - "Name": "IsImageCaptureEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "IsTextScraperRunning": { "Name": "IsTextScraperRunning", "Scriptability": "None", @@ -45134,22 +18544,6 @@ } } }, - "LocaleManifest": { - "Name": "LocaleManifest", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RobloxForcePlayModeGameLocaleId": { "Name": "RobloxForcePlayModeGameLocaleId", "Scriptability": "None", @@ -45198,38 +18592,6 @@ } } }, - "ShouldUseCloudTable": { - "Name": "ShouldUseCloudTable", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShouldUseImageLocalizationTable": { - "Name": "ShouldUseImageLocalizationTable", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SystemLocaleId": { "Name": "SystemLocaleId", "Scriptability": "Read", @@ -45248,29 +18610,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -45285,10 +18632,7 @@ "DataType": { "Value": "String" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -45312,22 +18656,6 @@ } } }, - "IsExemptFromUGCAnalytics": { - "Name": "IsExemptFromUGCAnalytics", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Root": { "Name": "Root", "Scriptability": "ReadWrite", @@ -45360,23 +18688,11 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Contents": { - "String": "[]" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "String": "" }, "SourceAssetId": { "Int64": -1 @@ -45385,10 +18701,7 @@ "String": "en-us" }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -45399,22 +18712,6 @@ ], "Superclass": "Instance", "Properties": { - "EntityData": { - "Name": "EntityData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "EntityLodEnabled": { "Name": "EntityLodEnabled", "Scriptability": "ReadWrite", @@ -45430,179 +18727,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "EntityModelSize": { - "Name": "EntityModelSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EntityPosition": { - "Name": "EntityPosition", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EntityScale": { - "Name": "EntityScale", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EntitySource": { - "Name": "EntitySource", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EntityVisible": { - "Name": "EntityVisible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsSlimEnabled": { - "Name": "IsSlimEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SlimAnimationSource": { - "Name": "SlimAnimationSource", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SlimReplicationTimestampSec": { - "Name": "SlimReplicationTimestampSec", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TranscoderFailureReason": { - "Name": "TranscoderFailureReason", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TranscoderStatus": { - "Name": "TranscoderStatus", - "Scriptability": "None", - "DataType": { - "Enum": "SlimTranscoderStatus" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "LodDataService": { "Name": "LodDataService", @@ -45614,50 +18741,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LogReporterService": { - "Name": "LogReporterService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -45669,59 +18760,6 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Logger": { - "Name": "Logger", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "FullPath": { - "Name": "FullPath", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Name": { - "Name": "Name", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, "DefaultProperties": {} }, "LoginService": { @@ -45732,38 +18770,17 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "LuaSettings": { "Name": "LuaSettings", "Tags": [ "NotCreatable", - "NotReplicated", - "Service" + "Settings" ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "LuaSourceContainer": { "Name": "LuaSourceContainer", @@ -45773,112 +18790,13 @@ ], "Superclass": "Instance", "Properties": { - "CachedRemoteSource": { - "Name": "CachedRemoteSource", + "CurrentEditor": { + "Name": "CurrentEditor", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CachedRemoteSourceLoadState": { - "Name": "CachedRemoteSourceLoadState", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HasAssociatedDrafts": { - "Name": "HasAssociatedDrafts", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsDifferentFromFileSystem": { - "Name": "IsDifferentFromFileSystem", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SandboxedSource": { - "Name": "SandboxedSource", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ScriptGuid": { - "Name": "ScriptGuid", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "isPlayerScript": { - "Name": "isPlayerScript", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", "NotScriptable" ], "Kind": { @@ -45888,20 +18806,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ScriptGuid": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "LuaWebService": { "Name": "LuaWebService", @@ -45912,59 +18817,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LuauExpression": { - "Name": "LuauExpression", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "LuauExpressionService": { - "Name": "LuauExpressionService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -45977,176 +18837,16 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MLModelDeliveryService": { - "Name": "MLModelDeliveryService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MLService": { - "Name": "MLService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MLSession": { - "Name": "MLSession", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, "DefaultProperties": {} }, - "MakeupDescription": { - "Name": "MakeupDescription", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AssetId": { - "Name": "AssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Instance": { - "Name": "Instance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MakeupType": { - "Name": "MakeupType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "MakeupType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Order": { - "Name": "Order", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "AssetId": { - "Int64": 0 - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MakeupType": { - "Enum": 0 - }, - "Order": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "ManualGlue": { "Name": "ManualGlue", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "ManualSurfaceJointInstance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -46200,62 +18900,34 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "ManualSurfaceJointInstance": { "Name": "ManualSurfaceJointInstance", "Tags": [ - "Deprecated", "NotCreatable" ], "Superclass": "JointInstance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ManualWeld": { "Name": "ManualWeld", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "ManualSurfaceJointInstance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -46309,26 +18981,14 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -46352,51 +19012,17 @@ "Serialization": "DoesNotSerialize" } } - }, - "ValuesAndTimes": { - "Name": "ValuesAndTimes", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ValuesAndTimes": { - "BinaryString": "AgAAAAAAAAABAAAAAAAAAA==" + "BinaryString": "" } } }, @@ -46408,240 +19034,22 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MatchmakingService": { - "Name": "MatchmakingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MaterialGenerationService": { - "Name": "MaterialGenerationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MaterialImportData": { - "Name": "MaterialImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseImportData", - "Properties": { - "DiffuseFilePath": { - "Name": "DiffuseFilePath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DiffuseVersionedAssetId": { - "Name": "DiffuseVersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveFilePath": { - "Name": "EmissiveFilePath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveVersionedAssetId": { - "Name": "EmissiveVersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsPbr": { - "Name": "IsPbr", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MetalnessFilePath": { - "Name": "MetalnessFilePath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MetalnessVersionedAssetId": { - "Name": "MetalnessVersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NormalFilePath": { - "Name": "NormalFilePath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NormalVersionedAssetId": { - "Name": "NormalVersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RoughnessFilePath": { - "Name": "RoughnessFilePath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RoughnessVersionedAssetId": { - "Name": "RoughnessVersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MaterialService": { "Name": "MaterialService", "Tags": [ + "NotBrowsable", "NotCreatable", "Service" ], "Superclass": "Instance", "Properties": { - "AsphaltName": { - "Name": "AsphaltName", + "Brick": { + "Name": "Brick", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46652,11 +19060,11 @@ } } }, - "BasaltName": { - "Name": "BasaltName", + "Cobblestone": { + "Name": "Cobblestone", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46667,11 +19075,11 @@ } } }, - "BrickName": { - "Name": "BrickName", + "Concrete": { + "Name": "Concrete", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46682,11 +19090,11 @@ } } }, - "CardboardName": { - "Name": "CardboardName", + "CorrodedMetal": { + "Name": "CorrodedMetal", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46697,11 +19105,11 @@ } } }, - "CarpetName": { - "Name": "CarpetName", + "DiamondPlate": { + "Name": "DiamondPlate", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46712,11 +19120,11 @@ } } }, - "CeramicTilesName": { - "Name": "CeramicTilesName", + "Fabric": { + "Name": "Fabric", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46727,11 +19135,11 @@ } } }, - "ClayRoofTilesName": { - "Name": "ClayRoofTilesName", + "Foil": { + "Name": "Foil", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46742,11 +19150,11 @@ } } }, - "CobblestoneName": { - "Name": "CobblestoneName", + "Granite": { + "Name": "Granite", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46757,11 +19165,11 @@ } } }, - "ConcreteName": { - "Name": "ConcreteName", + "Grass": { + "Name": "Grass", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46772,11 +19180,11 @@ } } }, - "CorrodedMetalName": { - "Name": "CorrodedMetalName", + "Ice": { + "Name": "Ice", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46787,11 +19195,11 @@ } } }, - "CrackedLavaName": { - "Name": "CrackedLavaName", + "Marble": { + "Name": "Marble", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46802,11 +19210,11 @@ } } }, - "DiamondPlateName": { - "Name": "DiamondPlateName", + "Metal": { + "Name": "Metal", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46817,11 +19225,11 @@ } } }, - "FabricName": { - "Name": "FabricName", + "Pebble": { + "Name": "Pebble", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46832,11 +19240,11 @@ } } }, - "FoilName": { - "Name": "FoilName", + "Plastic": { + "Name": "Plastic", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46847,11 +19255,11 @@ } } }, - "GlacierName": { - "Name": "GlacierName", + "Sand": { + "Name": "Sand", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46862,11 +19270,11 @@ } } }, - "GraniteName": { - "Name": "GraniteName", + "Slate": { + "Name": "Slate", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46877,11 +19285,11 @@ } } }, - "GrassName": { - "Name": "GrassName", + "SmoothPlastic": { + "Name": "SmoothPlastic", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46892,11 +19300,11 @@ } } }, - "GroundName": { - "Name": "GroundName", + "Wood": { + "Name": "Wood", "Scriptability": "None", "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -46907,359 +19315,11 @@ } } }, - "IceName": { - "Name": "IceName", + "WoodPlanks": { + "Name": "WoodPlanks", "Scriptability": "None", "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeafyGrassName": { - "Name": "LeafyGrassName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeatherName": { - "Name": "LeatherName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimestoneName": { - "Name": "LimestoneName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MarbleName": { - "Name": "MarbleName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MetalName": { - "Name": "MetalName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MudName": { - "Name": "MudName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PavementName": { - "Name": "PavementName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PebbleName": { - "Name": "PebbleName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlasterName": { - "Name": "PlasterName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlasticName": { - "Name": "PlasticName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RockName": { - "Name": "RockName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RoofShinglesName": { - "Name": "RoofShinglesName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RubberName": { - "Name": "RubberName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SaltName": { - "Name": "SaltName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SandName": { - "Name": "SandName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SandstoneName": { - "Name": "SandstoneName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SlateName": { - "Name": "SlateName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SmoothPlasticName": { - "Name": "SmoothPlasticName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SnowName": { - "Name": "SnowName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Use2022Materials": { - "Name": "Use2022Materials", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "Use2022MaterialsXml" - } - } - } - }, - "Use2022MaterialsXml": { - "Name": "Use2022MaterialsXml", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WoodName": { - "Name": "WoodName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WoodPlanksName": { - "Name": "WoodPlanksName", - "Scriptability": "None", - "DataType": { - "Value": "String" + "Value": "Ref" }, "Tags": [ "NotScriptable" @@ -47272,209 +19332,24 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "AsphaltName": { - "String": "Asphalt" - }, - "Attributes": { - "Attributes": {} - }, - "BasaltName": { - "String": "Basalt" - }, - "BrickName": { - "String": "Brick" - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CardboardName": { - "String": "Cardboard" - }, - "CarpetName": { - "String": "Carpet" - }, - "CeramicTilesName": { - "String": "CeramicTiles" - }, - "ClayRoofTilesName": { - "String": "ClayRoofTiles" - }, - "CobblestoneName": { - "String": "Cobblestone" - }, - "ConcreteName": { - "String": "Concrete" - }, - "CorrodedMetalName": { - "String": "CorrodedMetal" - }, - "CrackedLavaName": { - "String": "CrackedLava" - }, - "DiamondPlateName": { - "String": "DiamondPlate" - }, - "FabricName": { - "String": "Fabric" - }, - "FoilName": { - "String": "Foil" - }, - "GlacierName": { - "String": "Glacier" - }, - "GraniteName": { - "String": "Granite" - }, - "GrassName": { - "String": "Grass" - }, - "GroundName": { - "String": "Ground" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IceName": { - "String": "Ice" - }, - "LeafyGrassName": { - "String": "LeafyGrass" - }, - "LeatherName": { - "String": "Leather" - }, - "LimestoneName": { - "String": "Limestone" - }, - "MarbleName": { - "String": "Marble" - }, - "MetalName": { - "String": "Metal" - }, - "MudName": { - "String": "Mud" - }, - "PavementName": { - "String": "Pavement" - }, - "PebbleName": { - "String": "Pebble" - }, - "PlasterName": { - "String": "Plaster" - }, - "PlasticName": { - "String": "Plastic" - }, - "RockName": { - "String": "Rock" - }, - "RoofShinglesName": { - "String": "RoofShingles" - }, - "RubberName": { - "String": "Rubber" - }, - "SaltName": { - "String": "Salt" - }, - "SandName": { - "String": "Sand" - }, - "Sandboxed": { - "Bool": false - }, - "SandstoneName": { - "String": "Sandstone" - }, - "SlateName": { - "String": "Slate" - }, - "SmoothPlasticName": { - "String": "SmoothPlastic" - }, - "SnowName": { - "String": "Snow" + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Use2022MaterialsXml": { - "Bool": false - }, - "WoodName": { - "String": "Wood" - }, - "WoodPlanksName": { - "String": "WoodPlanks" + "BinaryString": "" } } }, "MaterialVariant": { "Name": "MaterialVariant", - "Tags": [], + "Tags": [ + "NotBrowsable" + ], "Superclass": "Instance", "Properties": { - "AlphaMode": { - "Name": "AlphaMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AlphaMode" - }, - "Tags": [ - "NotBrowsable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AvgMetalness": { - "Name": "AvgMetalness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AvgRoughness": { - "Name": "AvgRoughness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "BaseMaterial": { "Name": "BaseMaterial", "Scriptability": "ReadWrite", @@ -47491,24 +19366,6 @@ "ColorMap": { "Name": "ColorMap", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ColorMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ColorMapContent": { - "Name": "ColorMapContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -47519,92 +19376,9 @@ } } }, - "CustomPhysicalProperties": { - "Name": "CustomPhysicalProperties", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "PhysicalProperties" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveMaskContent": { - "Name": "EmissiveMaskContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveStrength": { - "Name": "EmissiveStrength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveTint": { - "Name": "EmissiveTint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaterialPattern": { - "Name": "MaterialPattern", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "MaterialPattern" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MetalnessMap": { "Name": "MetalnessMap", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MetalnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "MetalnessMapContent": { - "Name": "MetalnessMapContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -47618,24 +19392,6 @@ "NormalMap": { "Name": "NormalMap", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "NormalMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "NormalMapContent": { - "Name": "NormalMapContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -47649,24 +19405,6 @@ "RoughnessMap": { "Name": "RoughnessMap", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "RoughnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "RoughnessMapContent": { - "Name": "RoughnessMapContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -47689,97 +19427,26 @@ "Serialization": "Serializes" } } - }, - "TexturePack": { - "Name": "TexturePack", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TexturePackContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TexturePackContent": { - "Name": "TexturePackContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "AlphaMode": { - "Enum": 3 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "BaseMaterial": { "Enum": 256 }, - "Capabilities": { - "SecurityCapabilities": 0 + "ColorMap": { + "Content": "" }, - "ColorMapContent": { - "Content": "None" + "MetalnessMap": { + "Content": "" }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" + "NormalMap": { + "Content": "" }, - "EmissiveMaskContent": { - "Content": "None" - }, - "EmissiveStrength": { - "Float32": 1.0 - }, - "EmissiveTint": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaterialPattern": { - "Enum": 0 - }, - "MetalnessMapContent": { - "Content": "None" - }, - "NormalMapContent": { - "Content": "None" - }, - "RoughnessMapContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false + "RoughnessMap": { + "Content": "" }, "SourceAssetId": { "Int64": -1 @@ -47788,13 +19455,7 @@ "Float32": 10.0 }, "Tags": { - "Tags": [] - }, - "TexturePackContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -47806,17 +19467,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MemStorageService": { "Name": "MemStorageService", @@ -47827,77 +19478,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MemoryStoreDistributedCounter": { - "Name": "MemoryStoreDistributedCounter", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MemoryStoreHashMap": { - "Name": "MemoryStoreHashMap", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MemoryStoreHashMapPages": { - "Name": "MemoryStoreHashMapPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MemoryStoreQueue": { "Name": "MemoryStoreQueue", @@ -47907,17 +19488,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MemoryStoreService": { "Name": "MemoryStoreService", @@ -47927,29 +19498,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -47961,17 +19517,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MeshContentProvider": { "Name": "MeshContentProvider", @@ -47982,362 +19528,13 @@ ], "Superclass": "CacheableContentProvider", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MeshImportData": { - "Name": "MeshImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseImportData", - "Properties": { - "Anchored": { - "Name": "Anchored", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CageManifold": { - "Name": "CageManifold", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CageMeshIntersectedPreview": { - "Name": "CageMeshIntersectedPreview", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CageMeshNotIntersected": { - "Name": "CageMeshNotIntersected", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CageNoOverlappingVertices": { - "Name": "CageNoOverlappingVertices", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CageNonManifoldPreview": { - "Name": "CageNonManifoldPreview", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CageOverlappingVerticesPreview": { - "Name": "CageOverlappingVerticesPreview", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CageUVMatched": { - "Name": "CageUVMatched", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CageUVMisMatchedPreview": { - "Name": "CageUVMisMatchedPreview", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Dimensions": { - "Name": "Dimensions", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DoubleSided": { - "Name": "DoubleSided", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IgnoreVertexColors": { - "Name": "IgnoreVertexColors", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IrrelevantCageModifiedPreview": { - "Name": "IrrelevantCageModifiedPreview", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshHoleDetectedPreview": { - "Name": "MeshHoleDetectedPreview", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshNoHoleDetected": { - "Name": "MeshNoHoleDetected", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NoIrrelevantCageModified": { - "Name": "NoIrrelevantCageModified", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NoOuterCageFarExtendedFromMesh": { - "Name": "NoOuterCageFarExtendedFromMesh", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OuterCageFarExtendedFromMeshPreview": { - "Name": "OuterCageFarExtendedFromMeshPreview", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PolygonCount": { - "Name": "PolygonCount", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseImportedPivot": { - "Name": "UseImportedPivot", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VersionedAssetId": { - "Name": "VersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MeshPart": { "Name": "MeshPart", "Tags": [], "Superclass": "TriangleMeshPart", "Properties": { - "AlternateMeshHash": { - "Name": "AlternateMeshHash", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "DoubleSided": { "Name": "DoubleSided", "Scriptability": "ReadWrite", @@ -48358,7 +19555,6 @@ "Value": "Bool" }, "Tags": [ - "Deprecated", "Hidden" ], "Kind": { @@ -48382,22 +19578,6 @@ } } }, - "InitialSize": { - "Name": "InitialSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "JointOffset": { "Name": "JointOffset", "Scriptability": "Read", @@ -48405,7 +19585,6 @@ "Value": "Vector3" }, "Tags": [ - "Deprecated", "Hidden" ], "Kind": { @@ -48414,8 +19593,24 @@ } } }, - "MeshContent": { - "Name": "MeshContent", + "MeshID": { + "Name": "MeshID", + "Scriptability": "None", + "DataType": { + "Value": "Content" + }, + "Tags": [ + "Deprecated", + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "MeshId": { + "Name": "MeshId", "Scriptability": "Read", "DataType": { "Value": "Content" @@ -48427,17 +19622,15 @@ } } }, - "MeshID": { - "Name": "MeshID", - "Scriptability": "None", + "MeshSize": { + "Name": "MeshSize", + "Scriptability": "Read", "DataType": { - "Value": "ContentId" + "Value": "Vector3" }, "Tags": [ - "Deprecated", - "Hidden", "NotReplicated", - "NotScriptable" + "ReadOnly" ], "Kind": { "Canonical": { @@ -48445,40 +19638,6 @@ } } }, - "MeshId": { - "Name": "MeshId", - "Scriptability": "Read", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MeshContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "PhysicsData": { - "Name": "PhysicsData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "RenderFidelity": { "Name": "RenderFidelity", "Scriptability": "ReadWrite", @@ -48494,40 +19653,8 @@ } } }, - "RenderFidelityReplicate": { - "Name": "RenderFidelityReplicate", - "Scriptability": "None", - "DataType": { - "Enum": "RenderFidelity" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SolidMeshHolder": { - "Name": "SolidMeshHolder", - "Scriptability": "None", - "DataType": { - "Value": "NetAssetRef" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextureContent": { - "Name": "TextureContent", + "TextureID": { + "Name": "TextureID", "Scriptability": "ReadWrite", "DataType": { "Value": "Content" @@ -48538,57 +19665,14 @@ "Serialization": "Serializes" } } - }, - "TextureID": { - "Name": "TextureID", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "VertexCount": { - "Name": "VertexCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "AeroMeshData": { - "SharedString": "" - }, "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -48649,15 +19733,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -48674,12 +19752,6 @@ "DoubleSided": { "Bool": false }, - "EnableFluidForces": { - "Bool": true - }, - "FluidFidelityInternal": { - "Enum": 0 - }, "FrontParamA": { "Float32": -0.5 }, @@ -48698,19 +19770,6 @@ "HasSkinnedMesh": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InertiaMigrated": { - "Bool": true - }, - "InitialSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, "JointOffset": { "Vector3": [ 0.0, @@ -48739,17 +19798,11 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" + "MeshID": { + "Content": "" }, - "MeshContent": { - "Content": "None" - }, - "PhysicalConfigData": { - "SharedString": "Q1NHUEhTAAAAAEJMT0NL" - }, - "PhysicsData": { - "BinaryString": "" + "MeshId": { + "Content": "" }, "PivotOffset": { "CFrame": { @@ -48781,7 +19834,7 @@ "Float32": 0.0 }, "RenderFidelity": { - "Enum": 0 + "Enum": 1 }, "RightParamA": { "Float32": -0.5 @@ -48805,9 +19858,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 4.0, @@ -48819,10 +19869,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" + "TextureID": { + "Content": "" }, "TopParamA": { "Float32": -0.5 @@ -48839,42 +19889,12 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UnscaledCofm": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolInertiaDiags": { - "Vector3": [ - 1.6666664e-31, - 1.6666664e-31, - 1.6666664e-31 - ] - }, - "UnscaledVolInertiaOffDiags": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolume": { - "Float32": 9.999999e-19 - }, "Velocity": { "Vector3": [ 0.0, 0.0, 0.0 ] - }, - "VertexCount": { - "Int32": 0 } } }, @@ -48900,32 +19920,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Text": { "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -48937,17 +19942,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MessageBusService": { "Name": "MessageBusService", @@ -48958,17 +19953,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MessagingService": { "Name": "MessagingService", @@ -48979,17 +19964,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MetaBreakpoint": { "Name": "MetaBreakpoint", @@ -49007,11 +19982,12 @@ }, "Tags": [ "Hidden", - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -49023,11 +19999,12 @@ }, "Tags": [ "Hidden", - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -49039,11 +20016,12 @@ }, "Tags": [ "Hidden", - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -49089,11 +20067,12 @@ }, "Tags": [ "Hidden", - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -49105,27 +20084,12 @@ }, "Tags": [ "Hidden", - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RemoveOnHit": { - "Name": "RemoveOnHit", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -49135,22 +20099,6 @@ "DataType": { "Value": "String" }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Valid": { - "Name": "Valid", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, "Tags": [ "Hidden", "NotReplicated", @@ -49163,53 +20111,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Condition": { - "String": "" - }, - "ContinueExecution": { - "Bool": false - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Line": { - "Int32": 0 - }, - "LogMessage": { - "String": "" - }, - "RemoveOnHit": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "Script": { - "String": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MetaBreakpointContext": { "Name": "MetaBreakpointContext", @@ -49218,109 +20120,8 @@ "NotReplicated" ], "Superclass": "Instance", - "Properties": { - "ContextDataInternal": { - "Name": "ContextDataInternal", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ContextDataInternal": { - "String": "0 1 2 " - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MetaBreakpointManager": { - "Name": "MetaBreakpointManager", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MicroProfilerService": { - "Name": "MicroProfilerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ContextLabel": { - "Name": "ContextLabel", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Model": { "Name": "Model", @@ -49340,100 +20141,6 @@ } } }, - "LodEntity": { - "Name": "LodEntity", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ModelMeshCFrame": { - "Name": "ModelMeshCFrame", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ModelMeshData": { - "Name": "ModelMeshData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ModelMeshSize": { - "Name": "ModelMeshSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ModelStreamingMode": { - "Name": "ModelStreamingMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ModelStreamingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NeedsPivotMigration": { - "Name": "NeedsPivotMigration", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "PrimaryPart": { "Name": "PrimaryPart", "Scriptability": "ReadWrite", @@ -49447,69 +20154,35 @@ } } }, - "Scale": { - "Name": "Scale", - "Scriptability": "Custom", + "World Pivot Orientation": { + "Name": "World Pivot Orientation", + "Scriptability": "None", "DataType": { - "Value": "Float32" + "Value": "Vector3" }, "Tags": [ "NotReplicated", "NotScriptable" ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "ScaleFactor" - } - } - } - }, - "ScaleFactor": { - "Name": "ScaleFactor", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Scale" - } - } - }, - "SlimAnimationTarget": { - "Name": "SlimAnimationTarget", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], "Kind": { "Canonical": { "Serialization": "DoesNotSerialize" } } }, - "SlimHash": { - "Name": "SlimHash", + "World Pivot Position": { + "Name": "World Pivot Position", "Scriptability": "None", "DataType": { - "Value": "SharedString" + "Value": "Vector3" }, "Tags": [ - "Hidden", + "NotReplicated", "NotScriptable" ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -49527,123 +20200,20 @@ "Serialization": "DoesNotSerialize" } } - }, - "WorldPivotData": { - "Name": "WorldPivotData", - "Scriptability": "Custom", - "DataType": { - "Value": "OptionalCFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "LevelOfDetail": { "Enum": 0 }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SlimHash": { - "SharedString": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "ModerationService": { - "Name": "ModerationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -49652,32 +20222,13 @@ "Tags": [], "Superclass": "LuaSourceContainer", "Properties": { - "Confidential": { - "Name": "Confidential", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LinkedSource": { "Name": "LinkedSource", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" + "Value": "Content" }, - "Tags": [ - "Deprecated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -49686,7 +20237,7 @@ }, "Source": { "Name": "Source", - "Scriptability": "Custom", + "Scriptability": "ReadWrite", "DataType": { "Value": "String" }, @@ -49696,45 +20247,14 @@ "Serialization": "Serializes" } } - }, - "UnrestrictedRequireAllowed": { - "Name": "UnrestrictedRequireAllowed", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "LinkedSource": { - "ContentId": "" - }, - "Sandboxed": { - "Bool": false - }, - "ScriptGuid": { - "String": "" + "Content": "" }, "Source": { "String": "" @@ -49743,30 +20263,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MomentsService": { - "Name": "MomentsService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -49815,30 +20312,11 @@ "Serialization": "Serializes" } } - }, - "ReplicateCurrentAngle": { - "Name": "ReplicateCurrentAngle", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -49892,32 +20370,20 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "DesiredAngle": { "Float32": 0.0 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxVelocity": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -49943,21 +20409,6 @@ } } }, - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ParentName": { "Name": "ParentName", "Scriptability": "None", @@ -49975,38 +20426,6 @@ } } }, - "ReplicateCurrentAngle6D": { - "Name": "ReplicateCurrentAngle6D", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReplicateCurrentOffset6D": { - "Name": "ReplicateCurrentOffset6D", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Transform": { "Name": "Transform", "Scriptability": "ReadWrite", @@ -50025,11 +20444,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -50083,32 +20499,20 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "DesiredAngle": { "Float32": 0.0 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxVelocity": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -50120,41 +20524,26 @@ "Superclass": "Feature", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "FaceId": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "InOut": { "Enum": 2 }, "LeftRight": { "Enum": 1 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopBottom": { "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -50184,24 +20573,6 @@ "Icon": { "Name": "Icon", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "IconContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "IconContent": { - "Name": "IconContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -50389,17 +20760,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MouseService": { "Name": "MouseService", @@ -50410,17 +20771,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "MultipleDocumentInterfaceInstance": { "Name": "MultipleDocumentInterfaceInstance", @@ -50448,56 +20799,22 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NegateOperation": { "Name": "NegateOperation", "Tags": [], "Superclass": "PartOperation", - "Properties": { - "PreviousOperation": { - "Name": "PreviousOperation", - "Scriptability": "None", - "DataType": { - "Enum": "NegateOperationHiddenHistory" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "AeroMeshData": { - "SharedString": "" - }, "Anchored": { "Bool": true }, - "Archivable": { - "Bool": true + "AssetId": { + "Content": "" }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -50558,21 +20875,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "ChildData": { - "BinaryString": "" - }, - "ChildData2": { - "SharedString": "" - }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -50583,24 +20888,9 @@ 255 ] }, - "ComponentIndex": { - "Int32": -1 - }, - "Content": { - "Content": "None" - }, "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, - "FluidFidelityInternal": { - "Enum": 0 - }, - "FormFactor": { - "Enum": 3 - }, "FrontParamA": { "Float32": -0.5 }, @@ -50613,19 +20903,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InertiaMigrated": { - "Bool": true - }, - "InitialSize": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, "LeftParamA": { "Float32": -0.5 }, @@ -50647,24 +20924,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, - "MeshData": { - "BinaryString": "" - }, - "MeshData2": { - "SharedString": "" - }, - "OffCentered": { - "Bool": false - }, - "PhysicalConfigData": { - "SharedString": "Q1NHUEhTAAAAAEJMT0NL" - }, - "PhysicsData": { - "BinaryString": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -50691,14 +20950,11 @@ ] } }, - "PreviousOperation": { - "Enum": 0 - }, "Reflectance": { "Float32": 0.0 }, "RenderFidelity": { - "Enum": 0 + "Enum": 1 }, "RightParamA": { "Float32": -0.5 @@ -50722,9 +20978,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 4.0, @@ -50735,14 +20988,11 @@ "SmoothingAngle": { "Float32": 0.0 }, - "SolidMeshHolder": { - "NetAssetRef": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -50759,36 +21009,6 @@ "Transparency": { "Float32": 0.1 }, - "TriangleCount": { - "Int32": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UnscaledCofm": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolInertiaDiags": { - "Vector3": [ - 0.16666666, - 0.16666666, - 0.16666666 - ] - }, - "UnscaledVolInertiaOffDiags": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolume": { - "Float32": 1.0 - }, "UsePartColor": { "Bool": false }, @@ -50810,17 +21030,7 @@ ], "Superclass": "NetworkPeer", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NetworkMarker": { "Name": "NetworkMarker", @@ -50830,17 +21040,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NetworkPeer": { "Name": "NetworkPeer", @@ -50850,17 +21050,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NetworkReplicator": { "Name": "NetworkReplicator", @@ -50870,17 +21060,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NetworkServer": { "Name": "NetworkServer", @@ -50891,24 +21071,13 @@ ], "Superclass": "NetworkPeer", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NetworkSettings": { "Name": "NetworkSettings", "Tags": [ "NotBrowsable", "NotCreatable", - "NotReplicated", "Service" ], "Superclass": "Instance", @@ -50972,51 +21141,6 @@ } } }, - "InboundNetworkJitterMs": { - "Name": "InboundNetworkJitterMs", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InboundNetworkLossPercent": { - "Name": "InboundNetworkLossPercent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InboundNetworkMinDelayMs": { - "Name": "InboundNetworkMinDelayMs", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "IncomingReplicationLag": { "Name": "IncomingReplicationLag", "Scriptability": "ReadWrite", @@ -51030,68 +21154,6 @@ } } }, - "OpenCertManagerDialog": { - "Name": "OpenCertManagerDialog", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OutboundNetworkJitterMs": { - "Name": "OutboundNetworkJitterMs", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OutboundNetworkLossPercent": { - "Name": "OutboundNetworkLossPercent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OutboundNetworkMinDelayMs": { - "Name": "OutboundNetworkMinDelayMs", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "PrintJoinSizeBreakdown": { "Name": "PrintJoinSizeBreakdown", "Scriptability": "ReadWrite", @@ -51169,19 +21231,35 @@ "Serialization": "Serializes" } } + }, + "TrackDataTypes": { + "Name": "TrackDataTypes", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "TrackPhysicsDetails": { + "Name": "TrackPhysicsDetails", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NoCollisionConstraint": { "Name": "NoCollisionConstraint", @@ -51229,78 +21307,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Noise": { - "Name": "Noise", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "NoiseType": { - "Name": "NoiseType", - "Scriptability": "None", - "DataType": { - "Enum": "NoiseType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Seed": { - "Name": "Seed", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -51312,29 +21329,14 @@ "Superclass": "FlyweightService", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -51346,23 +21348,6 @@ ], "Superclass": "Instance", "Properties": { - "IsConnected": { - "Name": "IsConnected", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "IsLuaChatEnabled": { "Name": "IsLuaChatEnabled", "Scriptability": "None", @@ -51412,17 +21397,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "NumberPose": { "Name": "NumberPose", @@ -51444,14 +21419,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "EasingDirection": { "Enum": 0 @@ -51459,20 +21428,11 @@ "EasingStyle": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "Float64": 0.0 @@ -51502,79 +21462,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "Float64": 0.0 } } }, - "Object": { - "Name": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": null, - "Properties": { - "ClassName": { - "Name": "ClassName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "className": { - "Name": "className", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Alias": { - "AliasFor": "ClassName" - } - } - } - }, - "DefaultProperties": {} - }, "ObjectValue": { "Name": "ObjectValue", "Tags": [], @@ -51595,140 +21496,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "OmniRecommendationsService": { - "Name": "OmniRecommendationsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "OpenCloudApiV1": { - "Name": "OpenCloudApiV1", - "Tags": [ - "Deprecated", - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "OpenCloudService": { - "Name": "OpenCloudService", - "Tags": [ - "Deprecated", - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "OperationGraph": { - "Name": "OperationGraph", - "Tags": [], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -51740,17 +21515,7 @@ ], "Superclass": "GlobalDataStore", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "OutfitPages": { "Name": "OutfitPages", @@ -51760,26 +21525,6 @@ ], "Superclass": "Pages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "OutputLink": { - "Name": "OutputLink", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, "DefaultProperties": {} }, "PVAdornment": { @@ -51803,17 +21548,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PVInstance": { "Name": "PVInstance", @@ -51823,11 +21558,11 @@ ], "Superclass": "Instance", "Properties": { - "Origin": { - "Name": "Origin", + "Origin Orientation": { + "Name": "Origin Orientation", "Scriptability": "None", "DataType": { - "Value": "CFrame" + "Value": "Vector3" }, "Tags": [ "NotReplicated", @@ -51839,11 +21574,43 @@ } } }, - "Pivot Offset": { - "Name": "Pivot Offset", + "Origin Position": { + "Name": "Origin Position", "Scriptability": "None", "DataType": { - "Value": "CFrame" + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated", + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Pivot Offset Orientation": { + "Name": "Pivot Offset Orientation", + "Scriptability": "None", + "DataType": { + "Value": "Vector3" + }, + "Tags": [ + "NotReplicated", + "NotScriptable" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "Pivot Offset Position": { + "Name": "Pivot Offset Position", + "Scriptability": "None", + "DataType": { + "Value": "Vector3" }, "Tags": [ "NotReplicated", @@ -51856,17 +21623,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PackageLink": { "Name": "PackageLink", @@ -51882,27 +21639,12 @@ "DataType": { "Value": "Bool" }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanAutoUpdate": { - "Name": "CanAutoUpdate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, "Tags": [ - "Hidden", - "NotReplicated", "NotScriptable" ], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -51923,50 +21665,6 @@ } } }, - "DefaultName": { - "Name": "DefaultName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HasNewVersion": { - "Name": "HasNewVersion", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ModifiedState": { - "Name": "ModifiedState", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "PackageAssetName": { "Name": "PackageAssetName", "Scriptability": "None", @@ -51984,61 +21682,11 @@ } } }, - "PackageContent": { - "Name": "PackageContent", - "Scriptability": "Read", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "PackageContentSerialize" - } - } - } - }, - "PackageContentSerialize": { - "Name": "PackageContentSerialize", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "PackageContent" - } - } - }, - "PackageGuid": { - "Name": "PackageGuid", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "PackageId": { "Name": "PackageId", "Scriptability": "Read", "DataType": { - "Value": "ContentId" + "Value": "Content" }, "Tags": [ "NotReplicated", @@ -52047,10 +21695,7 @@ "Kind": { "Canonical": { "Serialization": { - "Migrate": { - "To": "PackageContent", - "Migration": "ContentIdToContent" - } + "SerializesAs": "PackageIdSerialize" } } } @@ -52059,12 +21704,9 @@ "Name": "PackageIdSerialize", "Scriptability": "None", "DataType": { - "Value": "ContentId" + "Value": "Content" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "PackageId" @@ -52088,19 +21730,6 @@ } } }, - "SerializedDefaultAttributes": { - "Name": "SerializedDefaultAttributes", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Status": { "Name": "Status", "Scriptability": "None", @@ -52117,22 +21746,6 @@ } } }, - "VersionIdSerialize": { - "Name": "VersionIdSerialize", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "VersionNumber": { "Name": "VersionNumber", "Scriptability": "Read", @@ -52149,17 +21762,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PackageService": { "Name": "PackageService", @@ -52170,17 +21773,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PackageUIService": { "Name": "PackageUIService", @@ -52191,107 +21784,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Packages": { - "Name": "Packages", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "IsDehydrated": { - "Name": "IsDehydrated", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShellPackagesCount": { - "Name": "ShellPackagesCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SkippedInstancesCount": { - "Name": "SkippedInstancesCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsDehydrated": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "ShellPackagesCount": { - "Int32": 0 - }, - "SkippedInstancesCount": { - "Int32": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Pages": { "Name": "Pages", @@ -52318,17 +21811,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Pants": { "Name": "Pants", @@ -52338,24 +21821,6 @@ "PantsTemplate": { "Name": "PantsTemplate", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "PantsTemplateContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "PantsTemplateContent": { - "Name": "PantsTemplateContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -52368,14 +21833,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ @@ -52384,23 +21843,14 @@ 1.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PantsTemplateContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false + "PantsTemplate": { + "Content": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -52486,14 +21936,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ @@ -52502,24 +21946,15 @@ 0.95294124 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } @@ -52547,34 +21982,13 @@ } } }, - "shap": { - "Name": "shap", - "Scriptability": "None", - "DataType": { - "Enum": "PartType" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "shape": { "Name": "shape", "Scriptability": "None", "DataType": { "Enum": "PartType" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Shape" @@ -52586,14 +22000,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -52654,15 +22062,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -52676,9 +22078,6 @@ "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, "FormFactor": { "Enum": 1 }, @@ -52694,9 +22093,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -52718,9 +22114,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -52772,9 +22165,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Shape": { "Enum": 1 }, @@ -52789,7 +22179,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -52806,9 +22196,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -52839,17 +22226,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PartOperation": { "Name": "PartOperation", @@ -52859,200 +22236,10 @@ "AssetId": { "Name": "AssetId", "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "Content", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ChildData": { - "Name": "ChildData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChildData2": { - "Name": "ChildData2", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ComponentIndex": { - "Name": "ComponentIndex", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Content": { - "Name": "Content", - "Scriptability": "None", "DataType": { "Value": "Content" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FormFactor": { - "Name": "FormFactor", - "Scriptability": "None", - "DataType": { - "Enum": "FormFactor" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InitialSize": { - "Name": "InitialSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ManifoldMesh_DEPRECATED": { - "Name": "ManifoldMesh_DEPRECATED", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MeshData": { - "Name": "MeshData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshData2": { - "Name": "MeshData2", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OffCentered": { - "Name": "OffCentered", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PhysicsData": { - "Name": "PhysicsData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -53085,32 +22272,19 @@ } } }, - "SolidMeshHolder": { - "Name": "SolidMeshHolder", - "Scriptability": "None", - "DataType": { - "Value": "NetAssetRef" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TriangleCount": { "Name": "TriangleCount", "Scriptability": "Read", "DataType": { "Value": "Int32" }, - "Tags": [], + "Tags": [ + "NotReplicated", + "ReadOnly" + ], "Kind": { "Canonical": { - "Serialization": "Serializes" + "Serialization": "DoesNotSerialize" } } }, @@ -53129,20 +22303,14 @@ } }, "DefaultProperties": { - "AeroMeshData": { - "SharedString": "" - }, "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true + "AssetId": { + "Content": "" }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -53203,21 +22371,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "ChildData": { - "BinaryString": "" - }, - "ChildData2": { - "SharedString": "" - }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -53228,24 +22384,9 @@ 255 ] }, - "ComponentIndex": { - "Int32": -1 - }, - "Content": { - "Content": "None" - }, "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, - "FluidFidelityInternal": { - "Enum": 0 - }, - "FormFactor": { - "Enum": 3 - }, "FrontParamA": { "Float32": -0.5 }, @@ -53258,19 +22399,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InertiaMigrated": { - "Bool": true - }, - "InitialSize": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, "LeftParamA": { "Float32": -0.5 }, @@ -53292,24 +22420,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, - "MeshData": { - "BinaryString": "" - }, - "MeshData2": { - "SharedString": "" - }, - "OffCentered": { - "Bool": false - }, - "PhysicalConfigData": { - "SharedString": "Q1NHUEhTAAAAAEJMT0NL" - }, - "PhysicsData": { - "BinaryString": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -53340,7 +22450,7 @@ "Float32": 0.0 }, "RenderFidelity": { - "Enum": 0 + "Enum": 1 }, "RightParamA": { "Float32": -0.5 @@ -53364,9 +22474,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 4.0, @@ -53377,14 +22484,11 @@ "SmoothingAngle": { "Float32": 0.0 }, - "SolidMeshHolder": { - "NetAssetRef": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -53401,36 +22505,6 @@ "Transparency": { "Float32": 0.0 }, - "TriangleCount": { - "Int32": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UnscaledCofm": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolInertiaDiags": { - "Vector3": [ - 0.16666666, - 0.16666666, - 0.16666666 - ] - }, - "UnscaledVolInertiaOffDiags": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolume": { - "Float32": 1.0 - }, "UsePartColor": { "Bool": false }, @@ -53447,71 +22521,16 @@ "Name": "PartOperationAsset", "Tags": [], "Superclass": "Instance", - "Properties": { - "ChildData": { - "Name": "ChildData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshData": { - "Name": "MeshData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ChildData": { + "AttributesSerialize": { "BinaryString": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshData": { - "BinaryString": "" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -53598,110 +22617,6 @@ } } }, - "FlipbookBlendFrames": { - "Name": "FlipbookBlendFrames", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FlipbookFramerate": { - "Name": "FlipbookFramerate", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FlipbookIncompatible": { - "Name": "FlipbookIncompatible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FlipbookLayout": { - "Name": "FlipbookLayout", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ParticleFlipbookLayout" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FlipbookMode": { - "Name": "FlipbookMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ParticleFlipbookMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FlipbookSizeX": { - "Name": "FlipbookSizeX", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FlipbookSizeY": { - "Name": "FlipbookSizeY", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FlipbookStartRandom": { - "Name": "FlipbookStartRandom", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Lifetime": { "Name": "Lifetime", "Scriptability": "ReadWrite", @@ -53741,22 +22656,6 @@ } } }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LockedToPart": { "Name": "LockedToPart", "Scriptability": "ReadWrite", @@ -53929,24 +22828,6 @@ "Texture": { "Name": "Texture", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TextureContent": { - "Name": "TextureContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -54012,19 +22893,6 @@ } } }, - "WindAffectsDrag": { - "Name": "WindAffectsDrag", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ZOffset": { "Name": "ZOffset", "Scriptability": "ReadWrite", @@ -54047,18 +22915,12 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { "Float32": 1.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color": { "ColorSequence": { "keypoints": [ @@ -54090,36 +22952,6 @@ "Enabled": { "Bool": true }, - "FlipbookBlendFrames": { - "Bool": true - }, - "FlipbookFramerate": { - "NumberRange": [ - 1.0, - 1.0 - ] - }, - "FlipbookIncompatible": { - "String": "Particle texture must be 1024 by 1024 to use flipbooks." - }, - "FlipbookLayout": { - "Enum": 0 - }, - "FlipbookMode": { - "Enum": 0 - }, - "FlipbookSizeX": { - "Int32": 1 - }, - "FlipbookSizeY": { - "Int32": 1 - }, - "FlipbookStartRandom": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Lifetime": { "NumberRange": [ 5.0, @@ -54153,9 +22985,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Shape": { "Enum": 0 }, @@ -54216,12 +23045,10 @@ } }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": { - "Uri": "rbxasset://textures/particles/sparkles_main.dds" - } + "Texture": { + "Content": "rbxasset://textures/particles/sparkles_main.dds" }, "TimeScale": { "Float32": 1.0 @@ -54242,122 +23069,14 @@ ] } }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "VelocityInheritance": { "Float32": 0.0 }, - "WindAffectsDrag": { - "Bool": false - }, "ZOffset": { "Float32": 0.0 } } }, - "PartyEmulatorService": { - "Name": "PartyEmulatorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PatchBundlerFileWatch": { - "Name": "PatchBundlerFileWatch", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PatchMapping": { - "Name": "PatchMapping", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "FlattenTree": { - "Name": "FlattenTree", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PatchId": { - "Name": "PatchId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetPath": { - "Name": "TargetPath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "Path": { "Name": "Path", "Tags": [ @@ -54383,216 +23102,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Path2D": { - "Name": "Path2D", - "Tags": [], - "Superclass": "GuiBase", - "Properties": { - "Closed": { - "Name": "Closed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color3": { - "Name": "Color3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PropertiesSerialize": { - "Name": "PropertiesSerialize", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectedControlPoint": { - "Name": "SelectedControlPoint", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Thickness": { - "Name": "Thickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Visible": { - "Name": "Visible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZIndex": { - "Name": "ZIndex", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Closed": { - "Bool": false - }, - "Color3": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PropertiesSerialize": { - "BinaryString": "AAAAAA==" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Thickness": { - "Float32": 1.0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "Path3D": { - "Name": "Path3D", - "Tags": [], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PathfindingLink": { "Name": "PathfindingLink", @@ -54638,8 +23148,8 @@ } } }, - "Label": { - "Name": "Label", + "ModifierId": { + "Name": "ModifierId", "Scriptability": "ReadWrite", "DataType": { "Value": "String" @@ -54653,35 +23163,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "IsBidirectional": { "Bool": true }, - "Label": { + "ModifierId": { "String": "" }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -54690,8 +23185,8 @@ "Tags": [], "Superclass": "Instance", "Properties": { - "Label": { - "Name": "Label", + "ModifierId": { + "Name": "ModifierId", "Scriptability": "ReadWrite", "DataType": { "Value": "String" @@ -54718,35 +23213,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Label": { + "ModifierId": { "String": "" }, "PassThrough": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -54776,17 +23256,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PausedState": { "Name": "PausedState", @@ -54848,17 +23318,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PausedStateBreakpoint": { "Name": "PausedStateBreakpoint", @@ -54886,17 +23346,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PausedStateException": { "Name": "PausedStateException", @@ -54924,38 +23374,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PerformanceControlService": { - "Name": "PerformanceControlService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PermissionsService": { "Name": "PermissionsService", @@ -54966,29 +23385,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -55001,29 +23405,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -55031,8 +23420,7 @@ "Name": "PhysicsSettings", "Tags": [ "NotCreatable", - "NotReplicated", - "Service" + "Settings" ], "Superclass": "Instance", "Properties": { @@ -55075,19 +23463,6 @@ } } }, - "AreAssemblyCentersOfMassShown": { - "Name": "AreAssemblyCentersOfMassShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AreAwakePartsHighlighted": { "Name": "AreAwakePartsHighlighted", "Scriptability": "ReadWrite", @@ -55114,58 +23489,6 @@ } } }, - "AreCollisionCostsShown": { - "Name": "AreCollisionCostsShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreConstraintForcesShownForSelectedOrHoveredInstances": { - "Name": "AreConstraintForcesShownForSelectedOrHoveredInstances", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreConstraintTorquesShownForSelectedOrHoveredInstances": { - "Name": "AreConstraintTorquesShownForSelectedOrHoveredInstances", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreContactForcesShownForSelectedOrHoveredAssemblies": { - "Name": "AreContactForcesShownForSelectedOrHoveredAssemblies", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AreContactIslandsShown": { "Name": "AreContactIslandsShown", "Scriptability": "ReadWrite", @@ -55192,19 +23515,6 @@ } } }, - "AreGravityForcesShownForSelectedOrHoveredAssemblies": { - "Name": "AreGravityForcesShownForSelectedOrHoveredAssemblies", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AreJointCoordinatesShown": { "Name": "AreJointCoordinatesShown", "Scriptability": "ReadWrite", @@ -55218,19 +23528,6 @@ } } }, - "AreMagnitudesShownForDrawnForcesAndTorques": { - "Name": "AreMagnitudesShownForDrawnForcesAndTorques", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AreMechanismsShown": { "Name": "AreMechanismsShown", "Scriptability": "ReadWrite", @@ -55257,19 +23554,6 @@ } } }, - "AreNonAnchorsShown": { - "Name": "AreNonAnchorsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AreOwnersShown": { "Name": "AreOwnersShown", "Scriptability": "ReadWrite", @@ -55309,19 +23593,6 @@ } } }, - "AreSolverIslandsShown": { - "Name": "AreSolverIslandsShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AreTerrainReplicationRegionsShown": { "Name": "AreTerrainReplicationRegionsShown", "Scriptability": "ReadWrite", @@ -55374,97 +23645,6 @@ } } }, - "CollisionGeomDrawOriginalParts": { - "Name": "CollisionGeomDrawOriginalParts", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGeomMatchPartTransparency": { - "Name": "CollisionGeomMatchPartTransparency", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGeomOverlayTransparency": { - "Name": "CollisionGeomOverlayTransparency", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGeomShowCollidableParts": { - "Name": "CollisionGeomShowCollidableParts", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGeomShowCollisionGroup": { - "Name": "CollisionGeomShowCollisionGroup", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGeomShowQueryableParts": { - "Name": "CollisionGeomShowQueryableParts", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGeomShowTouchableParts": { - "Name": "CollisionGeomShowTouchableParts", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "DisableCSGv2": { "Name": "DisableCSGv2", "Scriptability": "ReadWrite", @@ -55478,84 +23658,6 @@ } } }, - "DisableCSGv3ForPlugins": { - "Name": "DisableCSGv3ForPlugins", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DrawConstraintsNetForce": { - "Name": "DrawConstraintsNetForce", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DrawContactsNetForce": { - "Name": "DrawContactsNetForce", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DrawTotalNetForce": { - "Name": "DrawTotalNetForce", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableForceVisualizationSmoothing": { - "Name": "EnableForceVisualizationSmoothing", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FluidForceDrawScale": { - "Name": "FluidForceDrawScale", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ForceCSGv2": { "Name": "ForceCSGv2", "Scriptability": "ReadWrite", @@ -55572,32 +23674,6 @@ } } }, - "ForceDrawScale": { - "Name": "ForceDrawScale", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ForceVisualizationSmoothingSteps": { - "Name": "ForceVisualizationSmoothingSteps", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "IsInterpolationThrottleShown": { "Name": "IsInterpolationThrottleShown", "Scriptability": "ReadWrite", @@ -55663,58 +23739,6 @@ } } }, - "ShowFluidForcesForSelectedOrHoveredMechanisms": { - "Name": "ShowFluidForcesForSelectedOrHoveredMechanisms", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowInstanceNamesForDrawnForcesAndTorques": { - "Name": "ShowInstanceNamesForDrawnForcesAndTorques", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SolverConvergenceMetricType": { - "Name": "SolverConvergenceMetricType", - "Scriptability": "None", - "DataType": { - "Enum": "SolverConvergenceMetricType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SolverConvergenceVisualizationMode": { - "Name": "SolverConvergenceVisualizationMode", - "Scriptability": "None", - "DataType": { - "Enum": "SolverConvergenceVisualizationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ThrottleAdjustTime": { "Name": "ThrottleAdjustTime", "Scriptability": "ReadWrite", @@ -55728,19 +23752,6 @@ } } }, - "TorqueDrawScale": { - "Name": "TorqueDrawScale", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "UseCSGv2": { "Name": "UseCSGv2", "Scriptability": "ReadWrite", @@ -55755,38 +23766,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PinShortcutService": { - "Name": "PinShortcutService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PitchShiftSoundEffect": { "Name": "PitchShiftSoundEffect", @@ -55808,181 +23788,46 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Octave": { "Float32": 1.25 }, "Priority": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlaceAssetIdsService": { - "Name": "PlaceAssetIdsService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlaceStatsService": { - "Name": "PlaceStatsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlacesService": { - "Name": "PlacesService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "Plane": { "Name": "Plane", - "Tags": [ - "Deprecated" - ], - "Superclass": "PlaneConstraint", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 194 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "PlaneConstraint": { - "Name": "PlaneConstraint", "Tags": [], "Superclass": "Constraint", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 194 + "Int32": 194 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false @@ -55996,79 +23841,7 @@ ], "Superclass": "Part", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlatformCloudStorageService": { - "Name": "PlatformCloudStorageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlatformFriendsService": { - "Name": "PlatformFriendsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlatformLibraries": { - "Name": "PlatformLibraries", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Player": { "Name": "Player", @@ -56091,35 +23864,6 @@ } } }, - "AccountAgeReplicate": { - "Name": "AccountAgeReplicate", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AgeChecked": { - "Name": "AgeChecked", - "Scriptability": "Read", - "DataType": { - "Enum": "AgeCheckStatus" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "AppearanceDidLoad": { "Name": "AppearanceDidLoad", "Scriptability": "None", @@ -56151,38 +23895,6 @@ } } }, - "CameraFieldOfView": { - "Name": "CameraFieldOfView", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CameraFrustumRequested": { - "Name": "CameraFrustumRequested", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "CameraMaxZoomDistance": { "Name": "CameraMaxZoomDistance", "Scriptability": "ReadWrite", @@ -56222,22 +23934,6 @@ } } }, - "CameraViewportSize": { - "Name": "CameraViewportSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "CanLoadCharacterAppearance": { "Name": "CanLoadCharacterAppearance", "Scriptability": "ReadWrite", @@ -56293,38 +23989,6 @@ } } }, - "ChararacterRegionId": { - "Name": "ChararacterRegionId", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ChatAvailabilityStatus": { - "Name": "ChatAvailabilityStatus", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ChatMode": { "Name": "ChatMode", "Scriptability": "None", @@ -56342,70 +24006,6 @@ } } }, - "ChatPrivacyMode": { - "Name": "ChatPrivacyMode", - "Scriptability": "None", - "DataType": { - "Enum": "ChatPrivacyMode" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CloudEditCameraCoordinateFrame": { - "Name": "CloudEditCameraCoordinateFrame", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CloudEditPlayerActive": { - "Name": "CloudEditPlayerActive", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CountryRegionCodeReplicate": { - "Name": "CountryRegionCodeReplicate", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "DataComplexity": { "Name": "DataComplexity", "Scriptability": "Read", @@ -56566,47 +24166,16 @@ } } }, - "FollowUserIdReplicated": { - "Name": "FollowUserIdReplicated", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FrustumStreaming": { - "Name": "FrustumStreaming", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FrustumStreamingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "GameplayPaused": { "Name": "GameplayPaused", "Scriptability": "Read", "DataType": { "Value": "Bool" }, - "Tags": [ - "Hidden" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -56627,32 +24196,6 @@ } } }, - "HasRobloxSubscription": { - "Name": "HasRobloxSubscription", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HasVerifiedBadge": { - "Name": "HasVerifiedBadge", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "HealthDisplayDistance": { "Name": "HealthDisplayDistance", "Scriptability": "ReadWrite", @@ -56666,35 +24209,6 @@ } } }, - "InputLatency": { - "Name": "InputLatency", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InternalCharacterAppearanceLoaded": { - "Name": "InternalCharacterAppearanceLoaded", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LocaleId": { "Name": "LocaleId", "Scriptability": "Read", @@ -56712,22 +24226,6 @@ } } }, - "MaxSimulationRadius": { - "Name": "MaxSimulationRadius", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "MaximumSimulationRadius": { "Name": "MaximumSimulationRadius", "Scriptability": "None", @@ -56760,22 +24258,6 @@ } } }, - "MembershipTypeReplicate": { - "Name": "MembershipTypeReplicate", - "Scriptability": "None", - "DataType": { - "Enum": "MembershipType" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "NameDisplayDistance": { "Name": "NameDisplayDistance", "Scriptability": "ReadWrite", @@ -56789,22 +24271,6 @@ } } }, - "NeedRegionalFallback": { - "Name": "NeedRegionalFallback", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Neutral": { "Name": "Neutral", "Scriptability": "ReadWrite", @@ -56834,38 +24300,6 @@ } } }, - "PartyId": { - "Name": "PartyId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PendingRequestedTool": { - "Name": "PendingRequestedTool", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "PlatformName": { "Name": "PlatformName", "Scriptability": "None", @@ -56881,22 +24315,6 @@ } } }, - "RawJoinData": { - "Name": "RawJoinData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ReplicationFocus": { "Name": "ReplicationFocus", "Scriptability": "ReadWrite", @@ -56938,35 +24356,6 @@ } } }, - "StepIdOffset": { - "Name": "StepIdOffset", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SuperSafeChatReplicate": { - "Name": "SuperSafeChatReplicate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Team": { "Name": "Team", "Scriptability": "ReadWrite", @@ -57027,39 +24416,6 @@ } } }, - "ThirdPartyTextChatRestrictionStatus": { - "Name": "ThirdPartyTextChatRestrictionStatus", - "Scriptability": "None", - "DataType": { - "Enum": "ChatRestrictionStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UnfilteredChat": { - "Name": "UnfilteredChat", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "UserId": { "Name": "UserId", "Scriptability": "ReadWrite", @@ -57073,22 +24429,6 @@ } } }, - "UserIdModeReplicate": { - "Name": "UserIdModeReplicate", - "Scriptability": "None", - "DataType": { - "Enum": "UserIdMode" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "VRDevice": { "Name": "VRDevice", "Scriptability": "None", @@ -57104,38 +24444,6 @@ } } }, - "VREnabled": { - "Name": "VREnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VoiceChatVolume": { - "Name": "VoiceChatVolume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "userId": { "Name": "userId", "Scriptability": "ReadWrite", @@ -57152,330 +24460,12 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerData": { - "Name": "PlayerData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerDataRecord": { - "Name": "PlayerDataRecord", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "CreatedTime": { - "Name": "CreatedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DefaultRecordName": { - "Name": "DefaultRecordName", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Dirty": { - "Name": "Dirty", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Error": { - "Name": "Error", - "Scriptability": "Read", - "DataType": { - "Enum": "PlayerDataErrorState" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FlushedTime": { - "Name": "FlushedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LoadedTime": { - "Name": "LoadedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ModifiedTime": { - "Name": "ModifiedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NewRecord": { - "Name": "NewRecord", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Readable": { - "Name": "Readable", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RecordName": { - "Name": "RecordName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Writable": { - "Name": "Writable", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerDataRecordConfig": { - "Name": "PlayerDataRecordConfig", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "RecordName": { - "Name": "RecordName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerDataService": { - "Name": "PlayerDataService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "LoadFailureBehavior": { - "Name": "LoadFailureBehavior", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PlayerDataLoadFailureBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LoadFailureBehavior": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PlayerEmulatorService": { "Name": "PlayerEmulatorService", "Tags": [ "NotCreatable", - "NotReplicated", "Service" ], "Superclass": "Instance", @@ -57487,8 +24477,7 @@ "Value": "Bool" }, "Tags": [ - "Hidden", - "NotReplicated" + "Hidden" ], "Kind": { "Canonical": { @@ -57503,8 +24492,7 @@ "Value": "String" }, "Tags": [ - "Hidden", - "NotReplicated" + "Hidden" ], "Kind": { "Canonical": { @@ -57519,8 +24507,7 @@ "Value": "String" }, "Tags": [ - "Hidden", - "NotReplicated" + "Hidden" ], "Kind": { "Canonical": { @@ -57535,24 +24522,7 @@ "Value": "Bool" }, "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PseudolocalizationEnabled": { - "Name": "PseudolocalizationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" + "Hidden" ], "Kind": { "Canonical": { @@ -57567,24 +24537,7 @@ "Value": "BinaryString" }, "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextElongationFactor": { - "Name": "TextElongationFactor", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated" + "Hidden" ], "Kind": { "Canonical": { @@ -57594,14 +24547,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "CustomPoliciesEnabled": { "Bool": false @@ -57612,18 +24559,9 @@ "EmulatedGameLocale": { "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "PlayerEmulationEnabled": { "Bool": false }, - "PseudolocalizationEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, "SerializedEmulatedPolicyInfo": { "BinaryString": "" }, @@ -57631,13 +24569,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TextElongationFactor": { - "Int32": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -57665,22 +24597,6 @@ } } }, - "InputBindingMappingsRaw": { - "Name": "InputBindingMappingsRaw", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ScreenOrientation": { "Name": "ScreenOrientation", "Scriptability": "ReadWrite", @@ -57708,71 +24624,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerHydrationService": { - "Name": "PlayerHydrationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerListConfiguration": { - "Name": "PlayerListConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseCoreGuiConfiguration", - "Properties": { - "Open": { - "Name": "Open", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PlayerMouse": { "Name": "PlayerMouse", @@ -57781,17 +24633,7 @@ ], "Superclass": "Mouse", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PlayerScripts": { "Name": "PlayerScripts", @@ -57801,38 +24643,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerViewService": { - "Name": "PlayerViewService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Players": { "Name": "Players", @@ -57842,21 +24653,6 @@ ], "Superclass": "Instance", "Properties": { - "BanningEnabled": { - "Name": "BanningEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "BubbleChat": { "Name": "BubbleChat", "Scriptability": "Read", @@ -58016,53 +24812,6 @@ } } }, - "ServerGitHash": { - "Name": "ServerGitHash", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ServerLogPrefix": { - "Name": "ServerLogPrefix", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseStrafingAnimations": { - "Name": "UseStrafingAnimations", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "localPlayer": { "Name": "localPlayer", "Scriptability": "Read", @@ -58101,24 +24850,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BanningEnabled": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "CharacterAutoLoads": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxPlayers": { "Int32": 12 }, @@ -58128,20 +24865,11 @@ "RespawnTime": { "Float32": 5.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseStrafingAnimations": { - "Bool": false + "BinaryString": "" } } }, @@ -58168,19 +24896,6 @@ } } }, - "DisableUIDragDetectorDrags": { - "Name": "DisableUIDragDetectorDrags", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "GridSize": { "Name": "GridSize", "Scriptability": "Read", @@ -58231,19 +24946,6 @@ } } }, - "IsDebuggable": { - "Name": "IsDebuggable", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MultipleDocumentInterfaceInstance": { "Name": "MultipleDocumentInterfaceInstance", "Scriptability": "None", @@ -58278,17 +24980,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginAction": { "Name": "PluginAction", @@ -58399,157 +25091,6 @@ "DataType": { "Value": "String" }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Visible": { - "Name": "Visible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginCapabilities": { - "Name": "PluginCapabilities", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Manifest": { - "Name": "Manifest", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Manifest": { - "String": "{\"Metadata\":{\"TargetDataModels\": [\"Edit\", \"Server\", \"Client\"]},\"Permissions\":{}}" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginConnection": { - "Name": "PluginConnection", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "Connected": { - "Name": "Connected", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GroupId": { - "Name": "GroupId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TargetId": { - "Name": "TargetId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Type": { - "Name": "Type", - "Scriptability": "Read", - "DataType": { - "Enum": "PluginConnectionTargetType" - }, "Tags": [ "NotReplicated", "ReadOnly" @@ -58563,27 +25104,6 @@ }, "DefaultProperties": {} }, - "PluginConnectionService": { - "Name": "PluginConnectionService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "PluginDebugService": { "Name": "PluginDebugService", "Tags": [ @@ -58593,17 +25113,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginDragEvent": { "Name": "PluginDragEvent", @@ -58678,17 +25188,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginGui": { "Name": "PluginGui", @@ -58698,23 +25198,6 @@ ], "Superclass": "LayerCollector", "Properties": { - "Plugin": { - "Name": "Plugin", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Title": { "Name": "Title", "Scriptability": "ReadWrite", @@ -58729,17 +25212,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginGuiService": { "Name": "PluginGuiService", @@ -58750,38 +25223,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginManagementService": { - "Name": "PluginManagementService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginManager": { "Name": "PluginManager", @@ -58790,17 +25232,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginManagerInterface": { "Name": "PluginManagerInterface", @@ -58810,17 +25242,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginMenu": { "Name": "PluginMenu", @@ -58859,32 +25281,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "Visible": { - "Name": "Visible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginMouse": { "Name": "PluginMouse", @@ -58893,17 +25292,7 @@ ], "Superclass": "Mouse", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginPolicyService": { "Name": "PluginPolicyService", @@ -58914,17 +25303,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginToolbar": { "Name": "PluginToolbar", @@ -58933,17 +25312,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PluginToolbarButton": { "Name": "PluginToolbarButton", @@ -58985,21 +25354,6 @@ "Icon": { "Name": "Icon", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IconContent": { - "Name": "IconContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -59013,17 +25367,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PointLight": { "Name": "PointLight", @@ -59045,18 +25389,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { "Float32": 1.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color": { "Color3": [ 1.0, @@ -59067,15 +25405,9 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Range": { "Float32": 8.0 }, - "Sandboxed": { - "Bool": false - }, "Shadows": { "Bool": false }, @@ -59083,10 +25415,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -59099,17 +25428,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PolicyService": { "Name": "PolicyService", @@ -59151,38 +25470,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PopLatencyService": { - "Name": "PopLatencyService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Pose": { "Name": "Pose", @@ -59220,11 +25508,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -59252,29 +25537,17 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "EasingDirection": { "Enum": 0 }, "EasingStyle": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Weight": { "Float32": 1.0 @@ -59328,17 +25601,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PostEffect": { "Name": "PostEffect", @@ -59361,52 +25624,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Preloaded": { - "Name": "Preloaded", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "PrismaticConstraint": { "Name": "PrismaticConstraint", @@ -59417,24 +25635,15 @@ "ActuatorType": { "Enum": 0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 1009 + "Int32": 1009 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LimitsEnabled": { "Bool": false }, @@ -59453,18 +25662,12 @@ "Restitution": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "ServoMaxForce": { "Float32": 0.0 }, "Size": { "Float32": 0.15 }, - "SoftlockServoUponReachingTarget": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -59472,14 +25675,11 @@ "Float32": 0.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TargetPosition": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "UpperLimit": { "Float32": 5.0 }, @@ -59491,182 +25691,6 @@ } } }, - "ProceduralBehaviorSchedulerService": { - "Name": "ProceduralBehaviorSchedulerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ProceduralModel": { - "Name": "ProceduralModel", - "Tags": [], - "Superclass": "Model", - "Properties": { - "Dirty": { - "Name": "Dirty", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GenerationError": { - "Name": "GenerationError", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Generator": { - "Name": "Generator", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Dirty": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LevelOfDetail": { - "Enum": 0 - }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "Size": { - "Vector3": [ - 12.0, - 12.0, - 12.0 - ] - }, - "SlimHash": { - "SharedString": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, "ProcessInstancePhysicsService": { "Name": "ProcessInstancePhysicsService", "Tags": [ @@ -59676,66 +25700,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ProjectService": { - "Name": "ProjectService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ContentMap": { - "Name": "ContentMap", - "Scriptability": "None", - "DataType": { - "Value": "NetAssetRef" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -59861,19 +25833,6 @@ } } }, - "MaxIndicatorDistance": { - "Name": "MaxIndicatorDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ObjectText": { "Name": "ObjectText", "Scriptability": "ReadWrite", @@ -59944,18 +25903,12 @@ "ActionText": { "String": "Interact" }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClickablePrompt": { "Bool": true }, @@ -59968,9 +25921,6 @@ "GamepadKeyCode": { "Enum": 1000 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "HoldDuration": { "Float32": 0.0 }, @@ -59980,18 +25930,12 @@ "MaxActivationDistance": { "Float32": 10.0 }, - "MaxIndicatorDistance": { - "Float32": 0.0 - }, "ObjectText": { "String": "" }, "RequiresLineOfSight": { "Bool": true }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -59999,16 +25943,13 @@ "Enum": 0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "UIOffset": { "Vector2": [ 0.0, 0.0 ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -60033,19 +25974,6 @@ } } }, - "MaxIndicatorsVisible": { - "Name": "MaxIndicatorsVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MaxPromptsVisible": { "Name": "MaxPromptsVisible", "Scriptability": "ReadWrite", @@ -60061,38 +25989,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxIndicatorsVisible": { - "Int32": 16 - }, "MaxPromptsVisible": { "Int32": 16 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -60105,169 +26015,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PyramidHandleAdornment": { - "Name": "PyramidHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "Height": { - "Name": "Height", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Sides": { - "Name": "Sides", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AdornCullingMode": { - "Enum": 0 - }, - "AlwaysOnTop": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "Height": { - "Float32": 2.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 0 - }, - "Sides": { - "Int32": 4 - }, - "Size": { - "Float32": 1.0 - }, - "SizeRelativeOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": -1 - } - } + "DefaultProperties": {} }, "QWidgetPluginGui": { "Name": "QWidgetPluginGui", @@ -60277,139 +26025,7 @@ ], "Superclass": "PluginGui", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "QueueService": { - "Name": "QueueService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RTAnimationTracker": { - "Name": "RTAnimationTracker", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EnableFallbackAudioInput": { - "Name": "EnableFallbackAudioInput", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SessionName": { - "Name": "SessionName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TrackerMode": { - "Name": "TrackerMode", - "Scriptability": "Read", - "DataType": { - "Enum": "TrackerMode" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TrackerType": { - "Name": "TrackerType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TrackerType" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RayValue": { "Name": "RayValue", @@ -60431,29 +26047,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "Ray": { @@ -60479,138 +26080,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RealtimeMedia": { - "Name": "RealtimeMedia", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AudioInputActive": { - "Name": "AudioInputActive", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ForwardInput": { - "Name": "ForwardInput", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsConnected": { - "Name": "IsConnected", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ForwardInput": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RecommendationPages": { - "Name": "RecommendationPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RecommendationService": { - "Name": "RecommendationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ReflectionMetadata": { "Name": "ReflectionMetadata", @@ -60618,29 +26088,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -60650,29 +26105,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -60732,37 +26172,15 @@ "Serialization": "Serializes" } } - }, - "ServiceVisibility": { - "Name": "ServiceVisibility", - "Scriptability": "None", - "DataType": { - "Enum": "ServiceVisibility" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Browsable": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClassCategory": { "String": "" }, @@ -60790,9 +26208,6 @@ "FFlag": { "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Insertable": { "Bool": true }, @@ -60805,26 +26220,17 @@ "PropertyOrder": { "Int32": 5000 }, - "Sandboxed": { - "Bool": false - }, "ScriptContext": { "String": "" }, "ServerOnly": { "Bool": false }, - "ServiceVisibility": { - "Enum": 0 - }, - "SliderScaling": { - "String": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "UIMaximum": { "Float64": 0.0 @@ -60834,9 +26240,6 @@ }, "UINumTicks": { "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -60846,29 +26249,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -60878,18 +26266,12 @@ "Superclass": "ReflectionMetadataItem", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Browsable": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClassCategory": { "String": "" }, @@ -60911,32 +26293,23 @@ "FFlag": { "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "IsBackend": { "Bool": false }, "PropertyOrder": { "Int32": 5000 }, - "Sandboxed": { - "Bool": false - }, "ScriptContext": { "String": "" }, "ServerOnly": { "Bool": false }, - "SliderScaling": { - "String": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "UIMaximum": { "Float64": 0.0 @@ -60946,9 +26319,6 @@ }, "UINumTicks": { "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -60958,18 +26328,12 @@ "Superclass": "ReflectionMetadataItem", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Browsable": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClassCategory": { "String": "" }, @@ -60991,32 +26355,23 @@ "FFlag": { "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "IsBackend": { "Bool": false }, "PropertyOrder": { "Int32": 5000 }, - "Sandboxed": { - "Bool": false - }, "ScriptContext": { "String": "" }, "ServerOnly": { "Bool": false }, - "SliderScaling": { - "String": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "UIMaximum": { "Float64": 0.0 @@ -61026,9 +26381,6 @@ }, "UINumTicks": { "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -61038,29 +26390,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -61070,29 +26407,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -61102,29 +26424,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -61291,19 +26598,6 @@ } } }, - "SliderScaling": { - "Name": "SliderScaling", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "UIMaximum": { "Name": "UIMaximum", "Scriptability": "ReadWrite", @@ -61344,17 +26638,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ReflectionMetadataMember": { "Name": "ReflectionMetadataMember", @@ -61362,18 +26646,12 @@ "Superclass": "ReflectionMetadataItem", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Browsable": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClassCategory": { "String": "" }, @@ -61395,32 +26673,23 @@ "FFlag": { "String": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "IsBackend": { "Bool": false }, "PropertyOrder": { "Int32": 5000 }, - "Sandboxed": { - "Bool": false - }, "ScriptContext": { "String": "" }, "ServerOnly": { "Bool": false }, - "SliderScaling": { - "String": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "UIMaximum": { "Float64": 0.0 @@ -61430,9 +26699,6 @@ }, "UINumTicks": { "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -61442,29 +26708,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -61474,109 +26725,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReflectionService": { - "Name": "ReflectionService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RelativeGui": { - "Name": "RelativeGui", - "Tags": [ - "NotReplicated" - ], - "Superclass": "GuiObject", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RemoteCommandService": { - "Name": "RemoteCommandService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RemoteCursorService": { - "Name": "RemoteCursorService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -61589,47 +26745,22 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RemoteEvent": { "Name": "RemoteEvent", "Tags": [], - "Superclass": "BaseRemoteEvent", + "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -61639,29 +26770,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -61670,7 +26786,6 @@ "Tags": [ "NotBrowsable", "NotCreatable", - "NotReplicated", "Service" ], "Superclass": "Instance", @@ -61714,19 +26829,6 @@ } } }, - "Enable VR Mode": { - "Name": "Enable VR Mode", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "EnableFRM": { "Name": "EnableFRM", "Scriptability": "ReadWrite", @@ -61859,32 +26961,9 @@ "Serialization": "Serializes" } } - }, - "ViewMode": { - "Name": "ViewMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ViewMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RenderingTest": { "Name": "RenderingTest", @@ -61976,7 +27055,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -61985,19 +27063,6 @@ } } }, - "PerfTest": { - "Name": "PerfTest", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Position": { "Name": "Position", "Scriptability": "ReadWrite", @@ -62005,7 +27070,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -62014,19 +27078,6 @@ } } }, - "QualityAuto": { - "Name": "QualityAuto", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "QualityLevel": { "Name": "QualityLevel", "Scriptability": "ReadWrite", @@ -62040,19 +27091,6 @@ } } }, - "RenderingTestFrameCount": { - "Name": "RenderingTestFrameCount", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ShouldSkip": { "Name": "ShouldSkip", "Scriptability": "ReadWrite", @@ -62078,27 +27116,11 @@ "Serialization": "Serializes" } } - }, - "Timeout": { - "Name": "Timeout", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -62126,9 +27148,6 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ComparisonDiffThreshold": { "Int32": 10 }, @@ -62144,24 +27163,9 @@ "FieldOfView": { "Float32": 70.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PerfTest": { - "Bool": false - }, - "QualityAuto": { - "Bool": false - }, "QualityLevel": { "Int32": 21 }, - "RenderingTestFrameCount": { - "Int32": 20 - }, - "Sandboxed": { - "Bool": false - }, "ShouldSkip": { "Bool": false }, @@ -62169,16 +27173,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Ticket": { "String": "" - }, - "Timeout": { - "Int32": 30 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -62191,29 +27189,34 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" + } + } + }, + "ReplicatedScriptService": { + "Name": "ReplicatedScriptService", + "Tags": [ + "NotCreatable", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": { + "AttributesSerialize": { + "BinaryString": "" }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "SourceAssetId": { + "Int64": -1 + }, + "Tags": { + "BinaryString": "" } } }, @@ -62226,50 +27229,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RequestOrchestratorService": { - "Name": "RequestOrchestratorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -62345,14 +27312,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "DecayTime": { "Float32": 1.5 @@ -62369,101 +27330,115 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Priority": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "WetLevel": { "Float32": 0.0 } } }, - "RibbonNotificationService": { - "Name": "RibbonNotificationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "RigidConstraint": { "Name": "RigidConstraint", - "Tags": [], + "Tags": [ + "NotBrowsable" + ], "Superclass": "Constraint", "Properties": { - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", + "Broken": { + "Name": "Broken", + "Scriptability": "ReadWrite", "DataType": { "Value": "Bool" }, "Tags": [ - "Hidden" + "NotBrowsable" ], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" + } + } + }, + "DestructionEnabled": { + "Name": "DestructionEnabled", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "NotBrowsable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "DestructionForce": { + "Name": "DestructionForce", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotBrowsable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "DestructionTorque": { + "Name": "DestructionTorque", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotBrowsable" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" } } } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "Broken": { + "Bool": false }, "Color": { - "BrickColor": 194 + "Int32": 194 + }, + "DestructionEnabled": { + "Bool": false + }, + "DestructionForce": { + "Float32": null + }, + "DestructionTorque": { + "Float32": null }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false @@ -62479,17 +27454,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RobloxReplicatedStorage": { "Name": "RobloxReplicatedStorage", @@ -62500,114 +27465,13 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RobloxSerializableInstance": { - "Name": "RobloxSerializableInstance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Data": { - "Name": "Data", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Data": { - "BinaryString": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RobloxServerStorage": { - "Name": "RobloxServerStorage", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RocketPropulsion": { "Name": "RocketPropulsion", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "BodyMover", "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "CartoonFactor": { "Name": "CartoonFactor", "Scriptability": "ReadWrite", @@ -62753,21 +27617,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "CartoonFactor": { "Float32": 0.7 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxSpeed": { "Float32": 30.0 }, @@ -62781,14 +27636,11 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TargetOffset": { "Vector3": [ @@ -62811,9 +27663,6 @@ }, "TurnP": { "Float32": 3000.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -62905,24 +27754,15 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 26 + "Int32": 26 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Length": { "Float32": 5.0 }, @@ -62935,843 +27775,20 @@ "LimitsEnabled": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Thickness": { "Float32": 0.1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": false } } }, - "RolloutValidation": { - "Name": "RolloutValidation", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "AdditionalFluffOne": { - "Name": "AdditionalFluffOne", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AdditionalFluffThree": { - "Name": "AdditionalFluffThree", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AdditionalFluffTwo": { - "Name": "AdditionalFluffTwo", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CreationVersion": { - "Name": "CreationVersion", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FirstBinaryExpectedValue": { - "Name": "FirstBinaryExpectedValue", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FirstBinaryString": { - "Name": "FirstBinaryString", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FirstSharedExpectedValue": { - "Name": "FirstSharedExpectedValue", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FirstSharedString": { - "Name": "FirstSharedString", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GenerationStrategy": { - "Name": "GenerationStrategy", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondBinaryExpectedValue": { - "Name": "SecondBinaryExpectedValue", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondBinaryString": { - "Name": "SecondBinaryString", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondSharedExpectedValue": { - "Name": "SecondSharedExpectedValue", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondSharedString": { - "Name": "SecondSharedString", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThirdBinaryExpectedValue": { - "Name": "ThirdBinaryExpectedValue", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThirdBinaryString": { - "Name": "ThirdBinaryString", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThirdSharedExpectedValue": { - "Name": "ThirdSharedExpectedValue", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThirdSharedString": { - "Name": "ThirdSharedString", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AdditionalFluffOne": { - "Int32": 0 - }, - "AdditionalFluffThree": { - "Float32": 0.0 - }, - "AdditionalFluffTwo": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CreationVersion": { - "Int32": 0 - }, - "FirstBinaryExpectedValue": { - "String": "" - }, - "FirstBinaryString": { - "BinaryString": "" - }, - "FirstSharedExpectedValue": { - "String": "" - }, - "FirstSharedString": { - "SharedString": "" - }, - "GenerationStrategy": { - "Int32": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SecondBinaryExpectedValue": { - "String": "" - }, - "SecondBinaryString": { - "BinaryString": "" - }, - "SecondSharedExpectedValue": { - "String": "" - }, - "SecondSharedString": { - "SharedString": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "ThirdBinaryExpectedValue": { - "String": "" - }, - "ThirdBinaryString": { - "BinaryString": "" - }, - "ThirdSharedExpectedValue": { - "String": "" - }, - "ThirdSharedString": { - "SharedString": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RolloutValidationService": { - "Name": "RolloutValidationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RomarkRbxAnalyticsService": { - "Name": "RomarkRbxAnalyticsService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RomarkService": { - "Name": "RomarkService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RootImportData": { - "Name": "RootImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseImportData", - "Properties": { - "AddModelToInventory": { - "Name": "AddModelToInventory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Anchored": { - "Name": "Anchored", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AnimationIdForRestPose": { - "Name": "AnimationIdForRestPose", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExistingPackageId": { - "Name": "ExistingPackageId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FileDimensions": { - "Name": "FileDimensions", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ImportAsModelAsset": { - "Name": "ImportAsModelAsset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImportAsPackage": { - "Name": "ImportAsPackage", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InsertInWorkspace": { - "Name": "InsertInWorkspace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InsertWithScenePosition": { - "Name": "InsertWithScenePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InvertNegativeFaces": { - "Name": "InvertNegativeFaces", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "KeepZeroInfluenceBones": { - "Name": "KeepZeroInfluenceBones", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MergeMeshes": { - "Name": "MergeMeshes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PhysicalConstraintType": { - "Name": "PhysicalConstraintType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PhysicalConstraintType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PolygonCount": { - "Name": "PolygonCount", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PreferredUploadId": { - "Name": "PreferredUploadId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RestPose": { - "Name": "RestPose", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RestPose" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RigScale": { - "Name": "RigScale", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RigScale" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RigType": { - "Name": "RigType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RigType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RigVisualization": { - "Name": "RigVisualization", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScaleFactor": { - "Name": "ScaleFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScaleUnit": { - "Name": "ScaleUnit", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "MeshScaleUnit" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseSceneOriginAsPivot": { - "Name": "UseSceneOriginAsPivot", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UsesCages": { - "Name": "UsesCages", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VersionedAssetId": { - "Name": "VersionedAssetId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WorldForward": { - "Name": "WorldForward", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WorldUp": { - "Name": "WorldUp", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "RopeConstraint": { "Name": "RopeConstraint", "Tags": [], @@ -63899,45 +27916,30 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 25 + "Int32": 25 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Length": { "Float32": 5.0 }, "Restitution": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Thickness": { "Float32": 0.1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": false }, @@ -63960,17 +27962,12 @@ }, "Rotate": { "Name": "Rotate", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "JointInstance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -64024,42 +28021,25 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "RotateP": { "Name": "RotateP", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "DynamicRotate", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "BaseAngle": { "Float32": 0.0 @@ -64116,42 +28096,25 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "RotateV": { "Name": "RotateV", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "DynamicRotate", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "BaseAngle": { "Float32": 0.0 @@ -64208,26 +28171,14 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -64251,72 +28202,17 @@ "Serialization": "DoesNotSerialize" } } - }, - "ValuesAndTimes": { - "Name": "ValuesAndTimes", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ValuesAndTimes": { - "BinaryString": "AQAAAAAAAAABAAAAAAAAAA==" - } - } - }, - "RtMessagingService": { - "Name": "RtMessagingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -64344,50 +28240,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "FrameNumber": { - "Name": "FrameNumber", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RunState": { - "Name": "RunState", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RunState" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RunningAverageItemDouble": { "Name": "RunningAverageItemDouble", @@ -64396,17 +28251,7 @@ ], "Superclass": "StatsItem", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RunningAverageItemInt": { "Name": "RunningAverageItemInt", @@ -64415,17 +28260,7 @@ ], "Superclass": "StatsItem", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RunningAverageTimeIntervalItem": { "Name": "RunningAverageTimeIntervalItem", @@ -64434,37 +28269,7 @@ ], "Superclass": "StatsItem", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RuntimeContentService": { - "Name": "RuntimeContentService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "RuntimeScriptService": { "Name": "RuntimeScriptService", @@ -64475,91 +28280,13 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SafetyService": { - "Name": "SafetyService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "IsCaptureModeForReport": { - "Name": "IsCaptureModeForReport", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SceneAnalysisService": { - "Name": "SceneAnalysisService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ScreenGui": { "Name": "ScreenGui", "Tags": [], "Superclass": "LayerCollector", "Properties": { - "ClipToDeviceSafeArea": { - "Name": "ClipToDeviceSafeArea", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "DisplayOrder": { "Name": "DisplayOrder", "Scriptability": "ReadWrite", @@ -64579,32 +28306,10 @@ "DataType": { "Value": "Bool" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "ScreenInsets", - "Migration": "IgnoreGuiInsetToScreenInsets" - } - } - } - } - }, - "IgnoresTitleBarReservation": { - "Name": "IgnoresTitleBarReservation", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -64622,288 +28327,38 @@ "Serialization": "DoesNotSerialize" } } - }, - "SafeAreaCompatibility": { - "Name": "SafeAreaCompatibility", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SafeAreaCompatibility" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScreenInsets": { - "Name": "ScreenInsets", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ScreenInsets" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipToDeviceSafeArea": { - "Bool": true - }, "DisplayOrder": { "Int32": 0 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "IgnoreGuiInset": { + "Bool": false }, "ResetOnSpawn": { "Bool": true }, - "SafeAreaCompatibility": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "ScreenInsets": { - "Enum": 2 - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "ZIndexBehavior": { "Enum": 0 } } }, - "ScreenshotCapture": { - "Name": "ScreenshotCapture", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Capture", - "Properties": {}, - "DefaultProperties": {} - }, - "ScreenshotHud": { - "Name": "ScreenshotHud", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "CameraButtonIcon": { - "Name": "CameraButtonIcon", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "CameraButtonIconContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "CameraButtonIconContent": { - "Name": "CameraButtonIconContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraButtonPosition": { - "Name": "CameraButtonPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CloseButtonPosition": { - "Name": "CloseButtonPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CloseWhenScreenshotTaken": { - "Name": "CloseWhenScreenshotTaken", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExperienceNameOverlayEnabled": { - "Name": "ExperienceNameOverlayEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HideCoreGuiForCaptures": { - "Name": "HideCoreGuiForCaptures", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HidePlayerGuiForCaptures": { - "Name": "HidePlayerGuiForCaptures", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OverlayFont": { - "Name": "OverlayFont", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "Font" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UsernameOverlayEnabled": { - "Name": "UsernameOverlayEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Visible": { - "Name": "Visible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "Script": { "Name": "Script", "Tags": [], @@ -64911,7 +28366,7 @@ "Properties": { "Source": { "Name": "Source", - "Scriptability": "Custom", + "Scriptability": "ReadWrite", "DataType": { "Value": "String" }, @@ -64924,32 +28379,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Disabled": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LinkedSource": { - "ContentId": "" - }, - "RunContext": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "ScriptGuid": { - "String": "" + "Content": "" }, "Source": { "String": "" @@ -64958,30 +28395,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptBuilder": { - "Name": "ScriptBuilder", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -64994,80 +28408,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptCloneWatcher": { - "Name": "ScriptCloneWatcher", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptCloneWatcherHelper": { - "Name": "ScriptCloneWatcherHelper", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptCommitService": { - "Name": "ScriptCommitService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ScriptContext": { "Name": "ScriptContext", @@ -65094,17 +28435,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ScriptDebugger": { "Name": "ScriptDebugger", @@ -65113,22 +28444,6 @@ ], "Superclass": "Instance", "Properties": { - "CoreScriptIdentifier": { - "Name": "CoreScriptIdentifier", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CurrentLine": { "Name": "CurrentLine", "Scriptability": "Read", @@ -65192,117 +28507,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "ScriptGuid": { - "Name": "ScriptGuid", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptDebuggerService": { - "Name": "ScriptDebuggerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptDocument": { - "Name": "ScriptDocument", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptEditorService": { - "Name": "ScriptEditorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptProfilerService": { - "Name": "ScriptProfilerService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ScriptRegistrationService": { "Name": "ScriptRegistrationService", @@ -65313,57 +28520,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptRuntime": { - "Name": "ScriptRuntime", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptScannerService": { - "Name": "ScriptScannerService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ScriptService": { "Name": "ScriptService", @@ -65374,29 +28531,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -65453,24 +28595,6 @@ "BottomImage": { "Name": "BottomImage", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "BottomImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "BottomImageContent": { - "Name": "BottomImageContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -65507,23 +28631,6 @@ } } }, - "DraggingScrollBar": { - "Name": "DraggingScrollBar", - "Scriptability": "None", - "DataType": { - "Enum": "DraggingScrollBar" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ElasticBehavior": { "Name": "ElasticBehavior", "Scriptability": "ReadWrite", @@ -65587,24 +28694,6 @@ "MidImage": { "Name": "MidImage", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MidImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "MidImageContent": { - "Name": "MidImageContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -65654,22 +28743,6 @@ } } }, - "ScrollRate": { - "Name": "ScrollRate", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ScrollVelocity": { "Name": "ScrollVelocity", "Scriptability": "None", @@ -65712,43 +28785,9 @@ } } }, - "SmoothScroll": { - "Name": "SmoothScroll", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "TopImage": { "Name": "TopImage", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TopImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TopImageContent": { - "Name": "TopImageContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -65813,11 +28852,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -65840,9 +28876,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -65851,10 +28887,8 @@ "BorderSizePixel": { "Int32": 1 }, - "BottomImageContent": { - "Content": { - "Uri": "rbxasset://textures/ui/Scroll/scroll-bottom.png" - } + "BottomImage": { + "Content": "rbxasset://textures/ui/Scroll/scroll-bottom.png" }, "CanvasPosition": { "Vector2": [ @@ -65874,9 +28908,6 @@ ] ] }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": true }, @@ -65886,22 +28917,14 @@ "ElasticBehavior": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "HorizontalScrollBarInset": { "Enum": 0 }, - "Interactable": { - "Bool": true - }, "LayoutOrder": { "Int32": 0 }, - "MidImageContent": { - "Content": { - "Uri": "rbxasset://textures/ui/Scroll/scroll-middle.png" - } + "MidImage": { + "Content": "rbxasset://textures/ui/Scroll/scroll-middle.png" }, "Position": { "UDim2": [ @@ -65918,9 +28941,6 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "ScrollBarImageColor3": { "Color3": [ 1.0, @@ -65943,27 +28963,6 @@ "Selectable": { "Bool": true }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": true - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, "Size": { "UDim2": [ [ @@ -65983,15 +28982,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TopImageContent": { - "Content": { - "Uri": "rbxasset://textures/ui/Scroll/scroll-top.png" - } - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "TopImage": { + "Content": "rbxasset://textures/ui/Scroll/scroll-top.png" }, "VerticalScrollBarInset": { "Enum": 0 @@ -66046,14 +29040,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -66114,15 +29102,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -66139,9 +29121,6 @@ "Disabled": { "Bool": false }, - "EnableFluidForces": { - "Bool": true - }, "FormFactor": { "Enum": 1 }, @@ -66157,9 +29136,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -66181,9 +29157,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -66235,9 +29208,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Shape": { "Enum": 1 }, @@ -66252,7 +29222,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -66269,9 +29239,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -66306,57 +29273,6 @@ } } }, - "RenderMode": { - "Name": "RenderMode", - "Scriptability": "None", - "DataType": { - "Enum": "SelectionRenderMode" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SelectionBoxThickness": { - "Name": "SelectionBoxThickness", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SelectionLineThickness": { - "Name": "SelectionLineThickness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SelectionThickness": { "Name": "SelectionThickness", "Scriptability": "Read", @@ -66372,48 +29288,17 @@ "Serialization": "DoesNotSerialize" } } - }, - "ShowActiveInstanceHighlight": { - "Name": "ShowActiveInstanceHighlight", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -66435,21 +29320,6 @@ } } }, - "StudioSelectionBox": { - "Name": "StudioSelectionBox", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "SurfaceColor": { "Name": "SurfaceColor", "Scriptability": "ReadWrite", @@ -66495,37 +29365,22 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LineThickness": { "Float32": 0.15 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, - "StudioSelectionBox": { - "Bool": false - }, "SurfaceColor3": { "Color3": [ 0.050980397, @@ -66537,39 +29392,16 @@ "Float32": 1.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } } }, - "SelectionHighlightManager": { - "Name": "SelectionHighlightManager", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "SelectionLasso": { "Name": "SelectionLasso", "Tags": [ @@ -66591,17 +29423,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "SelectionPartLasso": { "Name": "SelectionPartLasso", @@ -66625,40 +29447,25 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } @@ -66686,25 +29493,16 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Point": { "Vector3": [ 0.0, @@ -66712,21 +29510,15 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } @@ -66782,28 +29574,16 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -66818,121 +29598,16 @@ "Float32": 1.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } } }, - "SelfViewConfiguration": { - "Name": "SelfViewConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "BaseCoreGuiConfiguration", - "Properties": { - "Open": { - "Name": "Open", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SensorBase": { - "Name": "SensorBase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "UpdateType": { - "Name": "UpdateType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SensorUpdateType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SerializationService": { - "Name": "SerializationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "ServerReplicator": { "Name": "ServerReplicator", "Tags": [ @@ -66941,17 +29616,7 @@ ], "Superclass": "NetworkReplicator", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "ServerScriptService": { "Name": "ServerScriptService", @@ -66980,32 +29645,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "LoadStringEnabled": { "Bool": false }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -67019,29 +29669,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -67053,105 +29688,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ServiceVisibilityService": { - "Name": "ServiceVisibilityService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "HiddenServices": { - "Name": "HiddenServices", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VisibleServices": { - "Name": "VisibleServices", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HiddenServices": { - "BinaryString": "AAAAAA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VisibleServices": { - "BinaryString": "AAAAAA==" - } - } - }, - "SessionCheckService": { - "Name": "SessionCheckService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "SessionService": { "Name": "SessionService", @@ -67161,38 +29698,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SharedTableRegistry": { - "Name": "SharedTableRegistry", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Shirt": { "Name": "Shirt", @@ -67202,24 +29708,6 @@ "ShirtTemplate": { "Name": "ShirtTemplate", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ShirtTemplateContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ShirtTemplateContent": { - "Name": "ShirtTemplateContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -67232,14 +29720,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ @@ -67248,23 +29730,14 @@ 1.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "ShirtTemplateContent": { - "Content": "None" + "ShirtTemplate": { + "Content": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -67289,24 +29762,6 @@ "Graphic": { "Name": "Graphic", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TextureContent": { - "Name": "TextureContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -67319,14 +29774,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ @@ -67335,23 +29784,14 @@ 1.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "Graphic": { + "Content": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -67394,29 +29834,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -67459,22 +29884,6 @@ } } }, - "MoveState": { - "Name": "MoveState", - "Scriptability": "None", - "DataType": { - "Enum": "MoveState" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Steer": { "Name": "Steer", "Scriptability": "ReadWrite", @@ -67519,14 +29928,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -67587,15 +29990,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -67609,9 +30006,6 @@ "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, "FormFactor": { "Enum": 1 }, @@ -67627,9 +30021,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -67651,9 +30042,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -67705,9 +30093,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Shape": { "Enum": 1 }, @@ -67728,7 +30113,7 @@ "Bool": true }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Throttle": { "Int32": 0 @@ -67748,9 +30133,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -67782,32 +30164,17 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SkinColor": { - "BrickColor": 226 + "Int32": 226 }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -67842,40 +30209,9 @@ } } }, - "MoonTextureContent": { - "Name": "MoonTextureContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MoonTextureId": { "Name": "MoonTextureId", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MoonTextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "SkyboxBackContent": { - "Name": "SkyboxBackContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -67889,42 +30225,6 @@ "SkyboxBk": { "Name": "SkyboxBk", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "SkyboxBackContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "SkyboxDn": { - "Name": "SkyboxDn", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "SkyboxDownContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "SkyboxDownContent": { - "Name": "SkyboxDownContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -67935,8 +30235,8 @@ } } }, - "SkyboxFrontContent": { - "Name": "SkyboxFrontContent", + "SkyboxDn": { + "Name": "SkyboxDn", "Scriptability": "ReadWrite", "DataType": { "Value": "Content" @@ -67951,24 +30251,6 @@ "SkyboxFt": { "Name": "SkyboxFt", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "SkyboxFrontContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "SkyboxLeftContent": { - "Name": "SkyboxLeftContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -67982,37 +30264,6 @@ "SkyboxLf": { "Name": "SkyboxLf", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "SkyboxLeftContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "SkyboxOrientation": { - "Name": "SkyboxOrientation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SkyboxRightContent": { - "Name": "SkyboxRightContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -68027,41 +30278,18 @@ "Name": "SkyboxRt", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" + "Value": "Content" }, "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "SkyboxRightContent", - "Migration": "ContentIdToContent" - } - } + "Serialization": "Serializes" } } }, "SkyboxUp": { "Name": "SkyboxUp", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "SkyboxUpContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "SkyboxUpContent": { - "Name": "SkyboxUpContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -68098,8 +30326,8 @@ } } }, - "SunTextureContent": { - "Name": "SunTextureContent", + "SunTextureId": { + "Name": "SunTextureId", "Scriptability": "ReadWrite", "DataType": { "Value": "Content" @@ -68110,89 +30338,38 @@ "Serialization": "Serializes" } } - }, - "SunTextureId": { - "Name": "SunTextureId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "SunTextureContent", - "Migration": "ContentIdToContent" - } - } - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "CelestialBodiesShown": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MoonAngularSize": { "Float32": 11.0 }, - "MoonTextureContent": { - "Content": { - "Uri": "rbxasset://sky/moon.jpg" - } + "MoonTextureId": { + "Content": "rbxasset://sky/moon.jpg" }, - "Sandboxed": { - "Bool": false + "SkyboxBk": { + "Content": "rbxasset://textures/sky/sky512_bk.tex" }, - "SkyboxBackContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_bk.tex" - } + "SkyboxDn": { + "Content": "rbxasset://textures/sky/sky512_dn.tex" }, - "SkyboxDownContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_dn.tex" - } + "SkyboxFt": { + "Content": "rbxasset://textures/sky/sky512_ft.tex" }, - "SkyboxFrontContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_ft.tex" - } + "SkyboxLf": { + "Content": "rbxasset://textures/sky/sky512_lf.tex" }, - "SkyboxLeftContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_lf.tex" - } + "SkyboxRt": { + "Content": "rbxasset://textures/sky/sky512_rt.tex" }, - "SkyboxOrientation": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "SkyboxRightContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_rt.tex" - } - }, - "SkyboxUpContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_up.tex" - } + "SkyboxUp": { + "Content": "rbxasset://textures/sky/sky512_up.tex" }, "SourceAssetId": { "Int64": -1 @@ -68203,16 +30380,11 @@ "SunAngularSize": { "Float32": 21.0 }, - "SunTextureContent": { - "Content": { - "Uri": "rbxasset://sky/sun.jpg" - } + "SunTextureId": { + "Content": "rbxasset://sky/sun.jpg" }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -68356,21 +30528,6 @@ } } }, - "SoftlockServoUponReachingTarget": { - "Name": "SoftlockServoUponReachingTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Speed": { "Name": "Speed", "Scriptability": "ReadWrite", @@ -68424,283 +30581,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SlimAnimationDataEntity": { - "Name": "SlimAnimationDataEntity", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "BoneParentIndices": { - "Name": "BoneParentIndices", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EntityScale": { - "Name": "EntityScale", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EntitySource": { - "Name": "EntitySource", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Handle": { - "Name": "Handle", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsSlimEnabled": { - "Name": "IsSlimEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NumBones": { - "Name": "NumBones", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RootIndex": { - "Name": "RootIndex", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SlimInstanceHashes": { - "Name": "SlimInstanceHashes", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SlimReplicationTimestampSec": { - "Name": "SlimReplicationTimestampSec", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SlimAnimationReplicationService": { - "Name": "SlimAnimationReplicationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SlimContentProvider": { - "Name": "SlimContentProvider", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "CacheableContentProvider", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SlimDebugSettings": { - "Name": "SlimDebugSettings", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SlimReplicationService": { - "Name": "SlimReplicationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SlimService": { - "Name": "SlimService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Smoke": { "Name": "Smoke", @@ -68733,22 +30614,6 @@ } } }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Opacity": { "Name": "Opacity", "Scriptability": "ReadWrite", @@ -68800,29 +30665,13 @@ } } }, - "TimeScale": { - "Name": "TimeScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "opacity_xml": { "Name": "opacity_xml", "Scriptability": "None", "DataType": { "Value": "Float32" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Opacity" @@ -68835,10 +30684,7 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "RiseVelocity" @@ -68851,10 +30697,7 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Size" @@ -68863,14 +30706,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { "Color3": [ @@ -68882,18 +30719,12 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Opacity": { "Float32": 0.5 }, "RiseVelocity": { "Float32": 1.0 }, - "Sandboxed": { - "Bool": false - }, "Size": { "Float32": 1.0 }, @@ -68901,50 +30732,18 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TimeScale": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SmoothVoxelsUpgraderService": { - "Name": "SmoothVoxelsUpgraderService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "Snap": { "Name": "Snap", - "Tags": [ - "Deprecated" - ], + "Tags": [], "Superclass": "JointInstance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -68998,26 +30797,14 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -69030,17 +30817,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "SolidModelContentProvider": { "Name": "SolidModelContentProvider", @@ -69051,67 +30828,13 @@ ], "Superclass": "CacheableContentProvider", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Sound": { "Name": "Sound", "Tags": [], "Superclass": "Instance", "Properties": { - "AcousticSimulationEnabled": { - "Name": "AcousticSimulationEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AssetRepresentation": { - "Name": "AssetRepresentation", - "Scriptability": "None", - "DataType": { - "Enum": "AssetRepresentation" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AudioContent": { - "Name": "AudioContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ChannelCount": { "Name": "ChannelCount", "Scriptability": "None", @@ -69119,7 +30842,7 @@ "Value": "Int32" }, "Tags": [ - "Hidden", + "NotBrowsable", "NotReplicated", "ReadOnly" ], @@ -69139,8 +30862,8 @@ "Deprecated" ], "Kind": { - "Alias": { - "AliasFor": "RollOffMinDistance" + "Canonical": { + "Serialization": "Serializes" } } }, @@ -69167,7 +30890,6 @@ "Value": "Bool" }, "Tags": [ - "Hidden", "NotReplicated", "ReadOnly" ], @@ -69184,7 +30906,6 @@ "Value": "Bool" }, "Tags": [ - "Hidden", "NotReplicated", "ReadOnly" ], @@ -69194,36 +30915,6 @@ } } }, - "IsSpatial": { - "Name": "IsSpatial", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LoopRegion": { - "Name": "LoopRegion", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Looped": { "Name": "Looped", "Scriptability": "ReadWrite", @@ -69313,32 +31004,6 @@ } } }, - "PlaybackRegion": { - "Name": "PlaybackRegion", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaybackRegionsEnabled": { - "Name": "PlaybackRegionsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "PlaybackSpeed": { "Name": "PlaybackSpeed", "Scriptability": "ReadWrite", @@ -69369,51 +31034,18 @@ } } }, - "PlayingReplicator": { - "Name": "PlayingReplicator", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RollOffGain": { - "Name": "RollOffGain", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RollOffMaxDistance": { "Name": "RollOffMaxDistance", "Scriptability": "ReadWrite", "DataType": { "Value": "Float32" }, - "Tags": [], + "Tags": [ + "NotReplicated" + ], "Kind": { "Canonical": { - "Serialization": { - "SerializesAs": "xmlRead_MaxDistance_3" - } + "Serialization": "DoesNotSerialize" } } }, @@ -69423,12 +31055,12 @@ "DataType": { "Value": "Float32" }, - "Tags": [], + "Tags": [ + "NotReplicated" + ], "Kind": { "Canonical": { - "Serialization": { - "SerializesAs": "EmitterSize" - } + "Serialization": "DoesNotSerialize" } } }, @@ -69462,17 +31094,12 @@ "Name": "SoundId", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" + "Value": "Content" }, "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "AudioContent", - "Migration": "ContentIdToContent" - } - } + "Serialization": "Serializes" } } }, @@ -69507,38 +31134,6 @@ } } }, - "TimePositionReplicator": { - "Name": "TimePositionReplicator", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UsageContextPermission": { - "Name": "UsageContextPermission", - "Scriptability": "None", - "DataType": { - "Enum": "UsageContext" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Volume": { "Name": "Volume", "Scriptability": "ReadWrite", @@ -69575,107 +31170,51 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { - "AliasFor": "RollOffMaxDistance" - } - } - }, - "xmlRead_MinDistance_3": { - "Name": "xmlRead_MinDistance_3", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" + "AliasFor": "MaxDistance" } } } }, "DefaultProperties": { - "AcousticSimulationEnabled": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioContent": { - "Content": "None" - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LoopRegion": { - "NumberRange": [ - 0.0, - 60000.0 - ] + "EmitterSize": { + "Float32": 10.0 }, "Looped": { "Bool": false }, + "MaxDistance": { + "Float32": 10000.0 + }, "PlayOnRemove": { "Bool": false }, - "PlaybackRegion": { - "NumberRange": [ - 0.0, - 60000.0 - ] - }, - "PlaybackRegionsEnabled": { - "Bool": false - }, "PlaybackSpeed": { "Float32": 1.0 }, "Playing": { "Bool": false }, - "RollOffMaxDistance": { - "Float32": 10000.0 - }, - "RollOffMinDistance": { - "Float32": 10.0 - }, "RollOffMode": { "Enum": 0 }, - "Sandboxed": { - "Bool": false + "SoundId": { + "Content": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TimePosition": { "Float64": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Volume": { "Float32": 0.5 } @@ -69715,17 +31254,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "SoundGroup": { "Name": "SoundGroup", @@ -69747,29 +31276,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Volume": { "Float32": 0.5 @@ -69784,19 +31298,6 @@ ], "Superclass": "Instance", "Properties": { - "AcousticSimulationEnabled": { - "Name": "AcousticSimulationEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AmbientReverb": { "Name": "AmbientReverb", "Scriptability": "ReadWrite", @@ -69810,60 +31311,6 @@ } } }, - "AudioApiByDefault": { - "Name": "AudioApiByDefault", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterSoundsUseNewApi": { - "Name": "CharacterSoundsUseNewApi", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DefaultListenerLocation": { - "Name": "DefaultListenerLocation", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ListenerLocation" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DiffractionEnabled": { - "Name": "DiffractionEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "DistanceFactor": { "Name": "DistanceFactor", "Scriptability": "ReadWrite", @@ -69890,73 +31337,6 @@ } } }, - "IsNewExpForAudioApiByDefault": { - "Name": "IsNewExpForAudioApiByDefault", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ListenerCFrame": { - "Name": "ListenerCFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ListenerObject": { - "Name": "ListenerObject", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ListenerType": { - "Name": "ListenerType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ListenerType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OcclusionEnabled": { - "Name": "OcclusionEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "RespectFilteringEnabled": { "Name": "RespectFilteringEnabled", "Scriptability": "ReadWrite", @@ -69970,19 +31350,6 @@ } } }, - "ReverbEnabled": { - "Name": "ReverbEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "RolloffScale": { "Name": "RolloffScale", "Scriptability": "ReadWrite", @@ -69995,50 +31362,14 @@ "Serialization": "Serializes" } } - }, - "VolumetricAudio": { - "Name": "VolumetricAudio", - "Scriptability": "None", - "DataType": { - "Enum": "VolumetricAudio" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "AcousticSimulationEnabled": { - "Bool": false - }, "AmbientReverb": { "Enum": 0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioApiByDefault": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CharacterSoundsUseNewApi": { - "Enum": 0 - }, - "DefaultListenerLocation": { - "Enum": 0 - }, - "DiffractionEnabled": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "DistanceFactor": { "Float32": 3.33 @@ -70046,88 +31377,17 @@ "DopplerScale": { "Float32": 1.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsNewExpForAudioApiByDefault": { - "Bool": false - }, - "ListenerCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ListenerType": { - "Enum": 0 - }, - "OcclusionEnabled": { - "Bool": true - }, "RespectFilteringEnabled": { "Bool": false }, - "ReverbEnabled": { - "Bool": true - }, "RolloffScale": { "Float32": 1.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VolumetricAudio": { - "Enum": 1 - } - } - }, - "SoundShimService": { - "Name": "SoundShimService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -70165,22 +31425,6 @@ } } }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SparkleColor": { "Name": "SparkleColor", "Scriptability": "ReadWrite", @@ -70193,40 +31437,15 @@ "Serialization": "Serializes" } } - }, - "TimeScale": { - "Name": "TimeScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -70238,13 +31457,7 @@ ] }, "Tags": { - "Tags": [] - }, - "TimeScale": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -70326,14 +31539,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -70394,15 +31601,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -70419,9 +31620,6 @@ "Duration": { "Int32": 10 }, - "EnableFluidForces": { - "Bool": true - }, "Enabled": { "Bool": true }, @@ -70440,9 +31638,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -70464,9 +31659,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "Neutral": { "Bool": true }, @@ -70521,9 +31713,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Shape": { "Enum": 1 }, @@ -70538,10 +31727,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TeamColor": { - "BrickColor": 194 + "Int32": 194 }, "TopParamA": { "Float32": -0.5 @@ -70558,9 +31747,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -70578,15 +31764,146 @@ ], "Superclass": "Instance", "Properties": {}, + "DefaultProperties": {} + }, + "Speaker": { + "Name": "Speaker", + "Tags": [ + "Deprecated" + ], + "Superclass": "Instance", + "Properties": { + "ChannelCount": { + "Name": "ChannelCount", + "Scriptability": "Read", + "DataType": { + "Value": "Int32" + }, + "Tags": [ + "NotBrowsable", + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "PlaybackLoudness": { + "Name": "PlaybackLoudness", + "Scriptability": "Read", + "DataType": { + "Value": "Float64" + }, + "Tags": [ + "NotReplicated", + "ReadOnly" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RollOffMaxDistance": { + "Name": "RollOffMaxDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RollOffMinDistance": { + "Name": "RollOffMinDistance", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [ + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, + "RollOffMode": { + "Name": "RollOffMode", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "RollOffMode" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SoundGroup": { + "Name": "SoundGroup", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Source": { + "Name": "Source", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Volume": { + "Name": "Volume", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + } + }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "RollOffMode": { + "Enum": 0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "SourceAssetId": { + "Int64": -1 + }, + "Tags": { + "BinaryString": "" + }, + "Volume": { + "Float32": 0.0 } } }, @@ -70610,20 +31927,11 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshContent": { - "Content": "None" + "MeshId": { + "Content": "" }, "MeshType": { "Enum": 0 @@ -70635,9 +31943,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Scale": { "Vector3": [ 1.0, @@ -70649,13 +31954,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "TextureId": { + "Content": "" }, "VertexColor": { "Vector3": [ @@ -70683,19 +31985,6 @@ "Serialization": "Serializes" } } - }, - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { @@ -70705,11 +31994,8 @@ "AlwaysOnTop": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CFrame": { "CFrame": { @@ -70737,28 +32023,16 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Radius": { "Float32": 1.0 }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 0 - }, "SizeRelativeOffset": { "Vector3": [ 0.0, @@ -70770,14 +32044,11 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -70835,18 +32106,12 @@ "Angle": { "Float32": 90.0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { "Float32": 1.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color": { "Color3": [ 1.0, @@ -70860,15 +32125,9 @@ "Face": { "Enum": 5 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Range": { "Float32": 16.0 }, - "Sandboxed": { - "Bool": false - }, "Shadows": { "Bool": false }, @@ -70876,10 +32135,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -71036,20 +32292,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Coils": { "Float32": 3.0 }, "Color": { - "BrickColor": 200 + "Int32": 200 }, "Damping": { "Float32": 0.0 @@ -71060,9 +32310,6 @@ "FreeLength": { "Float32": 1.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LimitsEnabled": { "Bool": false }, @@ -71078,9 +32325,6 @@ "Radius": { "Float32": 0.4 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -71088,14 +32332,11 @@ "Float32": 0.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Thickness": { "Float32": 0.1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": false } @@ -71263,17 +32504,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StandalonePluginScripts": { "Name": "StandalonePluginScripts", @@ -71281,29 +32512,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -71315,58 +32531,7 @@ ], "Superclass": "Pages", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StandardQueue": { - "Name": "StandardQueue", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StartPageService": { - "Name": "StartPageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StarterCharacterScripts": { "Name": "StarterCharacterScripts", @@ -71376,29 +32541,14 @@ "Superclass": "StarterPlayerScripts", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -71408,29 +32558,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -71442,21 +32577,6 @@ ], "Superclass": "BasePlayerGui", "Properties": { - "ClipsDescendantsSupportsRotation": { - "Name": "ClipsDescendantsSupportsRotation", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ProcessUserInput": { "Name": "ProcessUserInput", "Scriptability": "ReadWrite", @@ -71488,21 +32608,6 @@ } } }, - "RtlTextSupport": { - "Name": "RtlTextSupport", - "Scriptability": "None", - "DataType": { - "Enum": "RtlTextSupport" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ScreenOrientation": { "Name": "ScreenOrientation", "Scriptability": "ReadWrite", @@ -71529,36 +32634,6 @@ } } }, - "StudioDefaultStyleSheet": { - "Name": "StudioDefaultStyleSheet", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudioInsertWidgetLayerCollectorAutoLinkStyleSheet": { - "Name": "StudioInsertWidgetLayerCollectorAutoLinkStyleSheet", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "VirtualCursorMode": { "Name": "VirtualCursorMode", "Scriptability": "None", @@ -71576,30 +32651,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendantsSupportsRotation": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "ResetPlayerGuiOnSpawn": { "Bool": true }, - "RtlTextSupport": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, "ScreenOrientation": { "Enum": 2 }, @@ -71610,10 +32667,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "VirtualCursorMode": { "Enum": 0 @@ -71629,29 +32683,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -71691,39 +32730,6 @@ } } }, - "AvatarJointUpgrade": { - "Name": "AvatarJointUpgrade", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "AvatarJointUpgrade_SerializedRollout" - } - } - } - }, - "AvatarJointUpgrade_SerializedRollout": { - "Name": "AvatarJointUpgrade_SerializedRollout", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "AvatarJointUpgrade" - } - } - }, "CameraMaxZoomDistance": { "Name": "CameraMaxZoomDistance", "Scriptability": "ReadWrite", @@ -71763,19 +32769,6 @@ } } }, - "CharacterBreakJointsOnDeath": { - "Name": "CharacterBreakJointsOnDeath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CharacterJumpHeight": { "Name": "CharacterJumpHeight", "Scriptability": "ReadWrite", @@ -71841,34 +32834,6 @@ } } }, - "ClassicDeath": { - "Name": "ClassicDeath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CreateDefaultPlayerModule": { - "Name": "CreateDefaultPlayerModule", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "DevCameraOcclusionMode": { "Name": "DevCameraOcclusionMode", "Scriptability": "ReadWrite", @@ -71934,21 +32899,6 @@ } } }, - "EnableDynamicHeads": { - "Name": "EnableDynamicHeads", - "Scriptability": "None", - "DataType": { - "Enum": "LoadDynamicHeads" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "EnableMouseLockOption": { "Name": "EnableMouseLockOption", "Scriptability": "ReadWrite", @@ -71962,6 +32912,166 @@ } } }, + "GameSettingsAssetIDFace": { + "Name": "GameSettingsAssetIDFace", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDHead": { + "Name": "GameSettingsAssetIDHead", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDLeftArm": { + "Name": "GameSettingsAssetIDLeftArm", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDLeftLeg": { + "Name": "GameSettingsAssetIDLeftLeg", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDPants": { + "Name": "GameSettingsAssetIDPants", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDRightArm": { + "Name": "GameSettingsAssetIDRightArm", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDRightLeg": { + "Name": "GameSettingsAssetIDRightLeg", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDShirt": { + "Name": "GameSettingsAssetIDShirt", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDTeeShirt": { + "Name": "GameSettingsAssetIDTeeShirt", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsAssetIDTorso": { + "Name": "GameSettingsAssetIDTorso", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "GameSettingsAvatar": { "Name": "GameSettingsAvatar", "Scriptability": "None", @@ -71969,7 +33079,8 @@ "Enum": "GameAvatarType" }, "Tags": [ - "Hidden" + "Hidden", + "NotReplicated" ], "Kind": { "Canonical": { @@ -71993,6 +33104,86 @@ } } }, + "GameSettingsScaleRangeBodyType": { + "Name": "GameSettingsScaleRangeBodyType", + "Scriptability": "None", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeHead": { + "Name": "GameSettingsScaleRangeHead", + "Scriptability": "None", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeHeight": { + "Name": "GameSettingsScaleRangeHeight", + "Scriptability": "None", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeProportion": { + "Name": "GameSettingsScaleRangeProportion", + "Scriptability": "None", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "GameSettingsScaleRangeWidth": { + "Name": "GameSettingsScaleRangeWidth", + "Scriptability": "None", + "DataType": { + "Value": "NumberRange" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "HealthDisplayDistance": { "Name": "HealthDisplayDistance", "Scriptability": "ReadWrite", @@ -72019,22 +33210,6 @@ } } }, - "LoadCharacterLayeredClothing": { - "Name": "LoadCharacterLayeredClothing", - "Scriptability": "None", - "DataType": { - "Enum": "LoadCharacterLayeredClothing" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LoadCharacterLayeredClothing ": { "Name": "LoadCharacterLayeredClothing ", "Scriptability": "None", @@ -72051,19 +33226,6 @@ } } }, - "LuaCharacterController": { - "Name": "LuaCharacterController", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CharacterControlMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "NameDisplayDistance": { "Name": "NameDisplayDistance", "Scriptability": "ReadWrite", @@ -72077,36 +33239,6 @@ } } }, - "PlaceAvatarRules": { - "Name": "PlaceAvatarRules", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerModuleStatus": { - "Name": "PlayerModuleStatus", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "UserEmotesEnabled": { "Name": "UserEmotesEnabled", "Scriptability": "ReadWrite", @@ -72125,18 +33257,12 @@ "AllowCustomAnimations": { "Bool": true }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoJumpEnabled": { "Bool": true }, - "AvatarJointUpgrade": { - "Enum": 0 - }, "CameraMaxZoomDistance": { "Float32": 400.0 }, @@ -72146,12 +33272,6 @@ "CameraMode": { "Enum": 0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CharacterBreakJointsOnDeath": { - "Bool": true - }, "CharacterJumpHeight": { "Float32": 7.2 }, @@ -72167,12 +33287,6 @@ "CharacterWalkSpeed": { "Float32": 16.0 }, - "ClassicDeath": { - "Bool": true - }, - "CreateDefaultPlayerModule": { - "Bool": true - }, "DevCameraOcclusionMode": { "Enum": 0 }, @@ -72188,50 +33302,89 @@ "DevTouchMovementMode": { "Enum": 0 }, - "EnableDynamicHeads": { - "Enum": 0 - }, "EnableMouseLockOption": { "Bool": true }, + "GameSettingsAssetIDFace": { + "Int64": 0 + }, + "GameSettingsAssetIDHead": { + "Int64": 0 + }, + "GameSettingsAssetIDLeftArm": { + "Int64": 0 + }, + "GameSettingsAssetIDLeftLeg": { + "Int64": 0 + }, + "GameSettingsAssetIDPants": { + "Int64": 0 + }, + "GameSettingsAssetIDRightArm": { + "Int64": 0 + }, + "GameSettingsAssetIDRightLeg": { + "Int64": 0 + }, + "GameSettingsAssetIDShirt": { + "Int64": 0 + }, + "GameSettingsAssetIDTeeShirt": { + "Int64": 0 + }, + "GameSettingsAssetIDTorso": { + "Int64": 0 + }, "GameSettingsAvatar": { "Enum": 1 }, "GameSettingsR15Collision": { "Enum": 0 }, + "GameSettingsScaleRangeBodyType": { + "NumberRange": [ + 0.0, + 1.0 + ] + }, + "GameSettingsScaleRangeHead": { + "NumberRange": [ + 0.95, + 1.0 + ] + }, + "GameSettingsScaleRangeHeight": { + "NumberRange": [ + 0.9, + 1.05 + ] + }, + "GameSettingsScaleRangeProportion": { + "NumberRange": [ + 0.0, + 1.0 + ] + }, + "GameSettingsScaleRangeWidth": { + "NumberRange": [ + 0.7, + 1.0 + ] + }, "HealthDisplayDistance": { "Float32": 100.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LoadCharacterAppearance": { "Bool": true }, - "LoadCharacterLayeredClothing": { - "Enum": 0 - }, - "LuaCharacterController": { - "Enum": 0 - }, "NameDisplayDistance": { "Float32": 100.0 }, - "PlayerModuleStatus": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "UserEmotesEnabled": { "Bool": true @@ -72246,174 +33399,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StartupMessageService": { - "Name": "StartupMessageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StateMachineDefinition": { - "Name": "StateMachineDefinition", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "NodeId": { - "Name": "NodeId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StateMachineTransitionDefinition": { - "Name": "StateMachineTransitionDefinition", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "From": { - "Name": "From", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "To": { - "Name": "To", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TransitionId": { - "Name": "TransitionId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TransitionId": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -72473,38 +33466,6 @@ } } }, - "FrameTime": { - "Name": "FrameTime", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HeartbeatTime": { - "Name": "HeartbeatTime", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "HeartbeatTimeMs": { "Name": "HeartbeatTimeMs", "Scriptability": "Read", @@ -72512,7 +33473,6 @@ "Value": "Float32" }, "Tags": [ - "Deprecated", "NotReplicated", "ReadOnly" ], @@ -72538,22 +33498,6 @@ } } }, - "MemoryTrackingEnabled": { - "Name": "MemoryTrackingEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "MovingPrimitivesCount": { "Name": "MovingPrimitivesCount", "Scriptability": "Read", @@ -72602,22 +33546,6 @@ } } }, - "PhysicsStepTime": { - "Name": "PhysicsStepTime", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "PhysicsStepTimeMs": { "Name": "PhysicsStepTimeMs", "Scriptability": "Read", @@ -72625,7 +33553,6 @@ "Value": "Float32" }, "Tags": [ - "Deprecated", "NotReplicated", "ReadOnly" ], @@ -72650,179 +33577,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "RenderCPUFrameTime": { - "Name": "RenderCPUFrameTime", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RenderGPUFrameTime": { - "Name": "RenderGPUFrameTime", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SceneDrawcallCount": { - "Name": "SceneDrawcallCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SceneTriangleCount": { - "Name": "SceneTriangleCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShadowsDrawcallCount": { - "Name": "ShadowsDrawcallCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShadowsTriangleCount": { - "Name": "ShadowsTriangleCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UI2DDrawcallCount": { - "Name": "UI2DDrawcallCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UI2DTriangleCount": { - "Name": "UI2DTriangleCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UI3DDrawcallCount": { - "Name": "UI3DDrawcallCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UI3DTriangleCount": { - "Name": "UI3DTriangleCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StatsItem": { "Name": "StatsItem", @@ -72849,17 +33606,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Status": { "Name": "Status", @@ -72869,20 +33616,7 @@ ], "Superclass": "Model", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } + "DefaultProperties": {} }, "StopWatchReporter": { "Name": "StopWatchReporter", @@ -72893,17 +33627,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StringValue": { "Name": "StringValue", @@ -72925,29 +33649,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "String": "" @@ -73038,32 +33747,6 @@ } } }, - "ActionOnAutoResumeSync": { - "Name": "ActionOnAutoResumeSync", - "Scriptability": "None", - "DataType": { - "Enum": "ActionOnAutoResumeSync" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ActionOnStopSync": { - "Name": "ActionOnStopSync", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActionOnStopSync" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Active Color": { "Name": "Active Color", "Scriptability": "ReadWrite", @@ -73116,32 +33799,6 @@ } } }, - "Animation Skeleton Scale": { - "Name": "Animation Skeleton Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Animation Skeleton Transparency": { - "Name": "Animation Skeleton Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Auto Clean Empty Line": { "Name": "Auto Clean Empty Line", "Scriptability": "ReadWrite", @@ -73181,19 +33838,6 @@ } } }, - "Auto Delete Closing Brackets and Quotes": { - "Name": "Auto Delete Closing Brackets and Quotes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Auto Indent Rule": { "Name": "Auto Indent Rule", "Scriptability": "ReadWrite", @@ -73233,58 +33877,6 @@ } } }, - "AutoResumeSyncOnPlaceOpen": { - "Name": "AutoResumeSyncOnPlaceOpen", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutoUpdateEnabled": { - "Name": "AutoUpdateEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutocompleteAcceptanceBehavior": { - "Name": "AutocompleteAcceptanceBehavior", - "Scriptability": "None", - "DataType": { - "Enum": "CompletionAcceptanceBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Automatically trigger AI Code Completion": { - "Name": "Automatically trigger AI Code Completion", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Background Color": { "Name": "Background Color", "Scriptability": "ReadWrite", @@ -73371,19 +33963,6 @@ } } }, - "Camera Pan Speed": { - "Name": "Camera Pan Speed", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Camera Shift Speed": { "Name": "Camera Shift Speed", "Scriptability": "ReadWrite", @@ -73410,19 +33989,6 @@ } } }, - "Camera Speed Adjust Binding": { - "Name": "Camera Speed Adjust Binding", - "Scriptability": "None", - "DataType": { - "Enum": "CameraSpeedAdjustBinding" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Camera Zoom to Mouse Position": { "Name": "Camera Zoom to Mouse Position", "Scriptability": "ReadWrite", @@ -73436,110 +34002,6 @@ } } }, - "CameraAltLeftMouseToRotate": { - "Name": "CameraAltLeftMouseToRotate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraKeyMoveSmoothing": { - "Name": "CameraKeyMoveSmoothing", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraMouseMultiplier": { - "Name": "CameraMouseMultiplier", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraNavigationModel": { - "Name": "CameraNavigationModel", - "Scriptability": "None", - "DataType": { - "Enum": "CameraNavigationModel" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraRotateShiftFactor": { - "Name": "CameraRotateShiftFactor", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraShiftFactor": { - "Name": "CameraShiftFactor", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraTweenFocus": { - "Name": "CameraTweenFocus", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraZoomToMousePosition": { - "Name": "CameraZoomToMousePosition", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Clear Output On Start": { "Name": "Clear Output On Start", "Scriptability": "ReadWrite", @@ -73553,32 +34015,6 @@ } } }, - "CommandBarEnterExec": { - "Name": "CommandBarEnterExec", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CommandBarHistoryLen": { - "Name": "CommandBarHistoryLen", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CommandBarLocalState": { "Name": "CommandBarLocalState", "Scriptability": "ReadWrite", @@ -73652,19 +34088,6 @@ } } }, - "DefaultScriptSyncFileType": { - "Name": "DefaultScriptSyncFileType", - "Scriptability": "None", - "DataType": { - "Enum": "DefaultScriptSyncFileType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "DeprecatedObjectsShown": { "Name": "DeprecatedObjectsShown", "Scriptability": "ReadWrite", @@ -73707,87 +34130,9 @@ } } }, - "DraggerActiveColor": { - "Name": "DraggerActiveColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerLengthFactor": { - "Name": "DraggerLengthFactor", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerMajorGridIncrement": { - "Name": "DraggerMajorGridIncrement", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerMaxSoftSnaps": { - "Name": "DraggerMaxSoftSnaps", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerPassiveColor": { - "Name": "DraggerPassiveColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerScaleFactor": { - "Name": "DraggerScaleFactor", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowAxisTicks": { - "Name": "DraggerShowAxisTicks", - "Scriptability": "None", + "Drag Multiple Parts As Single Part": { + "Name": "Drag Multiple Parts As Single Part", + "Scriptability": "ReadWrite", "DataType": { "Value": "Bool" }, @@ -73798,149 +34143,6 @@ } } }, - "DraggerShowDraggedPoint": { - "Name": "DraggerShowDraggedPoint", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowHoverRuler": { - "Name": "DraggerShowHoverRuler", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowMeasurement": { - "Name": "DraggerShowMeasurement", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowNegativeAxes": { - "Name": "DraggerShowNegativeAxes", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowPlanes": { - "Name": "DraggerShowPlanes", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowTargetSnap": { - "Name": "DraggerShowTargetSnap", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowTrackball": { - "Name": "DraggerShowTrackball", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerShowWhileDragging": { - "Name": "DraggerShowWhileDragging", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerSoftSnapMarginFactor": { - "Name": "DraggerSoftSnapMarginFactor", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerSummonMarginFactor": { - "Name": "DraggerSummonMarginFactor", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggerTiltRotateDuration": { - "Name": "DraggerTiltRotateDuration", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Enable Autocomplete": { "Name": "Enable Autocomplete", "Scriptability": "ReadWrite", @@ -73967,19 +34169,6 @@ } } }, - "Enable Client/Server MDI": { - "Name": "Enable Client/Server MDI", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Enable CoreScript Debugger": { "Name": "Enable CoreScript Debugger", "Scriptability": "ReadWrite", @@ -74123,45 +34312,6 @@ } } }, - "EnableCodeAssist": { - "Name": "EnableCodeAssist", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableFindOnType": { - "Name": "EnableFindOnType", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableIndentationRulers": { - "Name": "EnableIndentationRulers", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "EnableOnTypeAutocomplete": { "Name": "EnableOnTypeAutocomplete", "Scriptability": "None", @@ -74178,45 +34328,6 @@ } } }, - "EnableOvertypeMode": { - "Name": "EnableOvertypeMode", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableSelectionTooltips": { - "Name": "EnableSelectionTooltips", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableStudioStreaming": { - "Name": "EnableStudioStreaming", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Error Color": { "Name": "Error Color", "Scriptability": "ReadWrite", @@ -74232,19 +34343,6 @@ } } }, - "ExternalEditorMode": { - "Name": "ExternalEditorMode", - "Scriptability": "None", - "DataType": { - "Enum": "ExternalEditorMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Find Selection Background Color": { "Name": "Find Selection Background Color", "Scriptability": "ReadWrite", @@ -74327,21 +34425,6 @@ } } }, - "HintColor": { - "Name": "HintColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Hover Animate Speed": { "Name": "Hover Animate Speed", "Scriptability": "ReadWrite", @@ -74368,19 +34451,6 @@ } } }, - "Hover Line Thickness": { - "Name": "Hover Line Thickness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Hover Over Color": { "Name": "Hover Over Color", "Scriptability": "ReadWrite", @@ -74407,36 +34477,6 @@ } } }, - "IndentationRulerColor": { - "Name": "IndentationRulerColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InformationColor": { - "Name": "InformationColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Keyword Color": { "Name": "Keyword Color", "Scriptability": "ReadWrite", @@ -74452,32 +34492,6 @@ } } }, - "LargeFileLineCountThreshold": { - "Name": "LargeFileLineCountThreshold", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LargeFileThreshold": { - "Name": "LargeFileThreshold", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Line Thickness": { "Name": "Line Thickness", "Scriptability": "ReadWrite", @@ -74491,45 +34505,6 @@ } } }, - "LoadAllBuiltinPluginsInRunModes": { - "Name": "LoadAllBuiltinPluginsInRunModes", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LoadInternalPlugins": { - "Name": "LoadInternalPlugins", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LoadUserPluginsInRunModes": { - "Name": "LoadUserPluginsInRunModes", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LuaDebuggerEnabled": { "Name": "LuaDebuggerEnabled", "Scriptability": "ReadWrite", @@ -74575,19 +34550,6 @@ } } }, - "Main Volume": { - "Name": "Main Volume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Matching Word Background Color": { "Name": "Matching Word Background Color", "Scriptability": "ReadWrite", @@ -74603,19 +34565,6 @@ } } }, - "MaxFindReplaceAllResults": { - "Name": "MaxFindReplaceAllResults", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Maximum Output Lines": { "Name": "Maximum Output Lines", "Scriptability": "ReadWrite", @@ -74715,6 +34664,19 @@ } } }, + "OverrideCoreScripts": { + "Name": "OverrideCoreScripts", + "Scriptability": "Read", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "PermissionLevelShown": { "Name": "PermissionLevelShown", "Scriptability": "ReadWrite", @@ -74767,19 +34729,6 @@ } } }, - "PreferredTextSize": { - "Name": "PreferredTextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PreferredTextSize" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Primary Text Color": { "Name": "Primary Text Color", "Scriptability": "ReadWrite", @@ -74810,24 +34759,11 @@ } } }, - "ReloadBuiltinPluginsOnChange": { - "Name": "ReloadBuiltinPluginsOnChange", - "Scriptability": "None", + "Render Throttle Percentage": { + "Name": "Render Throttle Percentage", + "Scriptability": "ReadWrite", "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReloadLocalPluginsOnChange": { - "Name": "ReloadLocalPluginsOnChange", - "Scriptability": "None", - "DataType": { - "Value": "Bool" + "Value": "Int32" }, "Tags": [], "Kind": { @@ -74849,38 +34785,6 @@ } } }, - "ReviewableChangeAddedTextColor": { - "Name": "ReviewableChangeAddedTextColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReviewableChangeRemovedTextColor": { - "Name": "ReviewableChangeRemovedTextColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Ruler Color": { "Name": "Ruler Color", "Scriptability": "ReadWrite", @@ -75023,6 +34927,19 @@ } } }, + "Search Content For Core Scripts": { + "Name": "Search Content For Core Scripts", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "Secondary Text Color": { "Name": "Secondary Text Color", "Scriptability": "ReadWrite", @@ -75109,19 +35026,6 @@ } } }, - "Selection Box Thickness": { - "Name": "Selection Box Thickness", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Selection Color": { "Name": "Selection Color", "Scriptability": "ReadWrite", @@ -75137,11 +35041,24 @@ } } }, - "Selection Line Thickness": { - "Name": "Selection Line Thickness", + "Selection Highlight Thickness": { + "Name": "Selection Highlight Thickness", "Scriptability": "None", "DataType": { - "Value": "Int32" + "Value": "Float32" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Server Audio Behavior": { + "Name": "Server Audio Behavior", + "Scriptability": "ReadWrite", + "DataType": { + "Enum": "ServerAudioBehavior" }, "Tags": [], "Kind": { @@ -75163,71 +35080,6 @@ } } }, - "Show Animation Skeleton": { - "Name": "Show Animation Skeleton", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Animation Skeleton Attachments": { - "Name": "Show Animation Skeleton Attachments", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Animation Skeleton Axes": { - "Name": "Show Animation Skeleton Axes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Animation Skeleton Rotations": { - "Name": "Show Animation Skeleton Rotations", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Animation Skeleton Text": { - "Name": "Show Animation Skeleton Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Show Core GUI in Explorer while Playing": { "Name": "Show Core GUI in Explorer while Playing", "Scriptability": "ReadWrite", @@ -75241,6 +35093,19 @@ } } }, + "Show Deployment Warnings": { + "Name": "Show Deployment Warnings", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "Show Diagnostics Bar": { "Name": "Show Diagnostics Bar", "Scriptability": "ReadWrite", @@ -75306,8 +35171,8 @@ } } }, - "Show Navigation Labels": { - "Name": "Show Navigation Labels", + "Show Navigation Areas": { + "Name": "Show Navigation Areas", "Scriptability": "None", "DataType": { "Value": "Bool" @@ -75332,19 +35197,6 @@ } } }, - "Show Pathfinding Links": { - "Name": "Show Pathfinding Links", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Show Plugin GUI Service in Explorer": { "Name": "Show Plugin GUI Service in Explorer", "Scriptability": "ReadWrite", @@ -75358,9 +35210,9 @@ } } }, - "Show Singly Selected Attachment Parent Frame": { - "Name": "Show Singly Selected Attachment Parent Frame", - "Scriptability": "None", + "Show QT warnings in output": { + "Name": "Show QT warnings in output", + "Scriptability": "ReadWrite", "DataType": { "Value": "Bool" }, @@ -75492,21 +35344,6 @@ } } }, - "TypeColor": { - "Name": "TypeColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "UI Theme": { "Name": "UI Theme", "Scriptability": "Read", @@ -75525,45 +35362,6 @@ } } }, - "Use Bounding Box Move Handles": { - "Name": "Use Bounding Box Move Handles", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseDefaultExternalEditor": { - "Name": "UseDefaultExternalEditor", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VAxisColor": { - "Name": "VAxisColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Warning Color": { "Name": "Warning Color", "Scriptability": "ReadWrite", @@ -75593,111 +35391,6 @@ "Serialization": "DoesNotSerialize" } } - }, - "XAxisColor": { - "Name": "XAxisColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "YAxisColor": { - "Name": "YAxisColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZAxisColor": { - "Name": "ZAxisColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioActionOverride": { - "Name": "StudioActionOverride", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Released": { - "Name": "Released", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StudioAction": { - "Name": "StudioAction", - "Scriptability": "None", - "DataType": { - "Enum": "StudioAction" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": {} @@ -75711,303 +35404,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioAttachment": { - "Name": "StudioAttachment", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "AutoHideParent": { - "Name": "AutoHideParent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsArrowVisible": { - "Name": "IsArrowVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Offset": { - "Name": "Offset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SourceAnchorPoint": { - "Name": "SourceAnchorPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetAnchorPoint": { - "Name": "TargetAnchorPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioCallout": { - "Name": "StudioCallout", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "AnchorPoint": { - "Name": "AnchorPoint", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsArrowVisible": { - "Name": "IsArrowVisible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsNextVisible": { - "Name": "IsNextVisible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RowName": { - "Name": "RowName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Title": { - "Name": "Title", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioCameraService": { - "Name": "StudioCameraService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "FocusDistance": { - "Name": "FocusDistance", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LockCameraSpeed": { - "Name": "LockCameraSpeed", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LoggingEnabled": { - "Name": "LoggingEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioCaptureService": { - "Name": "StudioCaptureService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StudioData": { "Name": "StudioData", @@ -76031,35 +35428,76 @@ "Serialization": "Serializes" } } + }, + "EnableTeamCreateStreamingOnLoad": { + "Name": "EnableTeamCreateStreamingOnLoad", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SrcPlaceId": { + "Name": "SrcPlaceId", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "SrcUniverseId": { + "Name": "SrcUniverseId", + "Scriptability": "None", + "DataType": { + "Value": "Int64" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "EnableScriptCollabByDefaultOnLoad": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { + "EnableTeamCreateStreamingOnLoad": { "Bool": false }, "SourceAssetId": { "Int64": -1 }, - "Tags": { - "Tags": [] + "SrcPlaceId": { + "Int64": 0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "SrcUniverseId": { + "Int64": 0 + }, + "Tags": { + "BinaryString": "" } } }, @@ -76072,210 +35510,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioDeviceSimulatorService": { - "Name": "StudioDeviceSimulatorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioObjectBase": { - "Name": "StudioObjectBase", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioPublishService": { - "Name": "StudioPublishService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "PublishLocked": { - "Name": "PublishLocked", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioScreenshotCapture": { - "Name": "StudioScreenshotCapture", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "BufferFormat": { - "Name": "BufferFormat", - "Scriptability": "Read", - "DataType": { - "Enum": "StudioCaptureScreenshotFormat" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BufferStatus": { - "Name": "BufferStatus", - "Scriptability": "Read", - "DataType": { - "Enum": "StudioCaptureBufferStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OriginalSize": { - "Name": "OriginalSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Resolution": { - "Name": "Resolution", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UICaptureMode": { - "Name": "UICaptureMode", - "Scriptability": "Read", - "DataType": { - "Enum": "UICaptureMode" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StudioScriptDebugEventListener": { "Name": "StudioScriptDebugEventListener", @@ -76286,38 +35521,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioSdkService": { - "Name": "StudioSdkService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StudioService": { "Name": "StudioService", @@ -76352,7 +35556,8 @@ }, "Tags": [ "Hidden", - "NotReplicated" + "NotReplicated", + "ReadOnly" ], "Kind": { "Canonical": { @@ -76383,7 +35588,6 @@ "Value": "Bool" }, "Tags": [ - "Deprecated", "NotReplicated", "ReadOnly" ], @@ -76475,28 +35679,15 @@ } } }, - "Secrets": { - "Name": "Secrets", + "ShowActiveInstanceHighlight": { + "Name": "ShowActiveInstanceHighlight", "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowConstraintDetails": { - "Name": "ShowConstraintDetails", - "Scriptability": "Read", "DataType": { "Value": "Bool" }, "Tags": [ - "NotReplicated", - "ReadOnly" + "Hidden", + "NotReplicated" ], "Kind": { "Canonical": { @@ -76504,9 +35695,9 @@ } } }, - "ShowWeldDetails": { - "Name": "ShowWeldDetails", - "Scriptability": "None", + "ShowConstraintDetails": { + "Name": "ShowConstraintDetails", + "Scriptability": "Read", "DataType": { "Value": "Bool" }, @@ -76552,52 +35743,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioTestService": { - "Name": "StudioTestService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "EditModeActive": { - "Name": "EditModeActive", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "StudioTheme": { "Name": "StudioTheme", @@ -76607,622 +35753,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioUserService": { - "Name": "StudioUserService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "IsLoggedIn": { - "Name": "IsLoggedIn", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioWidget": { - "Name": "StudioWidget", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "StudioObjectBase", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioWidgetsService": { - "Name": "StudioWidgetsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StyleBase": { - "Name": "StyleBase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StyleDerive": { - "Name": "StyleDerive", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Index": { - "Name": "Index", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StyleSheet": { - "Name": "StyleSheet", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StyleLink": { - "Name": "StyleLink", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "StyleSheet": { - "Name": "StyleSheet", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StyleQuery": { - "Name": "StyleQuery", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AspectRatioRange": { - "Name": "AspectRatioRange", - "Scriptability": "None", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ConditionsSerialize": { - "Name": "ConditionsSerialize", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsActive": { - "Name": "IsActive", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxSize": { - "Name": "MaxSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MinSize": { - "Name": "MinSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PreferredInput": { - "Name": "PreferredInput", - "Scriptability": "None", - "DataType": { - "Enum": "PreferredInput" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PreferredTextSize": { - "Name": "PreferredTextSize", - "Scriptability": "None", - "DataType": { - "Enum": "PreferredTextSize" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReducedMotionEnabled": { - "Name": "ReducedMotionEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ViewportDisplaySize": { - "Name": "ViewportDisplaySize", - "Scriptability": "None", - "DataType": { - "Enum": "DisplaySize" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ConditionsSerialize": { - "BinaryString": "AAAAAA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StyleRule": { - "Name": "StyleRule", - "Tags": [], - "Superclass": "StyleBase", - "Properties": { - "Index": { - "Name": "Index", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Properties": { - "Name": "Properties", - "Scriptability": "Custom", - "DataType": { - "Value": "Attributes" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "PropertiesSerialize" - } - } - } - }, - "PropertiesSerialize": { - "Name": "PropertiesSerialize", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Properties" - } - } - }, - "PropertyTransitionsSerialize": { - "Name": "PropertyTransitionsSerialize", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Selector": { - "Name": "Selector", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectorError": { - "Name": "SelectorError", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 0 - }, - "Properties": { - "Attributes": {} - }, - "PropertyTransitionsSerialize": { - "BinaryString": "AgAAAAAA" - }, - "Sandboxed": { - "Bool": false - }, - "Selector": { - "String": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StyleSheet": { - "Name": "StyleSheet", - "Tags": [], - "Superclass": "StyleBase", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StylingService": { - "Name": "StylingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "SunRaysEffect": { "Name": "SunRaysEffect", @@ -77257,27 +35788,15 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Intensity": { "Float32": 0.25 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -77285,10 +35804,7 @@ "Float32": 1.0 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -77299,7 +35815,7 @@ "Properties": { "AlphaMode": { "Name": "AlphaMode", - "Scriptability": "ReadWrite", + "Scriptability": "None", "DataType": { "Enum": "AlphaMode" }, @@ -77310,84 +35826,12 @@ } } }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ColorMap": { "Name": "ColorMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ColorMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ColorMapContent": { - "Name": "ColorMapContent", - "Scriptability": "ReadWrite", + "Scriptability": "None", "DataType": { "Value": "Content" }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveMaskContent": { - "Name": "EmissiveMaskContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveStrength": { - "Name": "EmissiveStrength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveTint": { - "Name": "EmissiveTint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, "Tags": [], "Kind": { "Canonical": { @@ -77397,31 +35841,11 @@ }, "MetalnessMap": { "Name": "MetalnessMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MetalnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "MetalnessMapContent": { - "Name": "MetalnessMapContent", - "Scriptability": "ReadWrite", + "Scriptability": "None", "DataType": { "Value": "Content" }, - "Tags": [ - "Hidden" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -77430,43 +35854,10 @@ }, "NormalMap": { "Name": "NormalMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "NormalMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "NormalMapContent": { - "Name": "NormalMapContent", - "Scriptability": "ReadWrite", + "Scriptability": "None", "DataType": { "Value": "Content" }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResampleMode": { - "Name": "ResampleMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ResamplerMode" - }, "Tags": [], "Kind": { "Canonical": { @@ -77476,31 +35867,11 @@ }, "RoughnessMap": { "Name": "RoughnessMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "RoughnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "RoughnessMapContent": { - "Name": "RoughnessMapContent", - "Scriptability": "ReadWrite", + "Scriptability": "None", "DataType": { "Value": "Content" }, - "Tags": [ - "Hidden" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -77510,28 +35881,12 @@ "TexturePack": { "Name": "TexturePack", "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TexturePackContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TexturePackContent": { - "Name": "TexturePackContent", - "Scriptability": "None", "DataType": { "Value": "Content" }, - "Tags": [], + "Tags": [ + "Hidden" + ], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -77543,75 +35898,63 @@ "AlphaMode": { "Enum": 0 }, - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} + "ColorMap": { + "Content": "" }, - "Capabilities": { - "SecurityCapabilities": 0 + "MetalnessMap": { + "Content": "" }, - "Color": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] + "NormalMap": { + "Content": "" }, - "ColorMapContent": { - "Content": "None" - }, - "EmissiveMaskContent": { - "Content": "None" - }, - "EmissiveStrength": { - "Float32": 1.0 - }, - "EmissiveTint": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MetalnessMapContent": { - "Content": "None" - }, - "NormalMapContent": { - "Content": "None" - }, - "ResampleMode": { - "Enum": 0 - }, - "RoughnessMapContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false + "RoughnessMap": { + "Content": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TexturePackContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "TexturePack": { + "Content": "" } } }, "SurfaceGui": { "Name": "SurfaceGui", "Tags": [], - "Superclass": "SurfaceGuiBase", + "Superclass": "LayerCollector", "Properties": { + "Active": { + "Name": "Active", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Bool" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, + "Adornee": { + "Name": "Adornee", + "Scriptability": "ReadWrite", + "DataType": { + "Value": "Ref" + }, + "Tags": [], + "Kind": { + "Canonical": { + "Serialization": "Serializes" + } + } + }, "AlwaysOnTop": { "Name": "AlwaysOnTop", "Scriptability": "ReadWrite", @@ -77664,26 +36007,11 @@ } } }, - "HorizontalCurvature": { - "Name": "HorizontalCurvature", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LightInfluence": { - "Name": "LightInfluence", + "Face": { + "Name": "Face", "Scriptability": "ReadWrite", "DataType": { - "Value": "Float32" + "Enum": "NormalId" }, "Tags": [], "Kind": { @@ -77692,8 +36020,8 @@ } } }, - "MaxDistance": { - "Name": "MaxDistance", + "LightInfluence": { + "Name": "LightInfluence", "Scriptability": "ReadWrite", "DataType": { "Value": "Float32" @@ -77718,21 +36046,6 @@ } } }, - "Shape": { - "Name": "Shape", - "Scriptability": "None", - "DataType": { - "Enum": "SurfaceGuiShape" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "SizingMode": { "Name": "SizingMode", "Scriptability": "ReadWrite", @@ -77780,11 +36093,8 @@ "AlwaysOnTop": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -77798,9 +36108,6 @@ 600.0 ] }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, @@ -77810,39 +36117,15 @@ "Face": { "Enum": 5 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LightInfluence": { "Float32": 0.0 }, - "MaxDistance": { - "Float32": 0.0 - }, "PixelsPerStud": { "Float32": 50.0 }, "ResetOnSpawn": { "Bool": true }, - "Sandboxed": { - "Bool": false - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, "SizingMode": { "Enum": 0 }, @@ -77850,14 +36133,11 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "ToolPunchThroughDistance": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "ZIndexBehavior": { "Enum": 0 }, @@ -77866,65 +36146,6 @@ } } }, - "SurfaceGuiBase": { - "Name": "SurfaceGuiBase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "LayerCollector", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Adornee": { - "Name": "Adornee", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Face": { - "Name": "Face", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "SurfaceLight": { "Name": "SurfaceLight", "Tags": [], @@ -77974,18 +36195,12 @@ "Angle": { "Float32": 90.0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { "Float32": 1.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color": { "Color3": [ 1.0, @@ -77999,15 +36214,9 @@ "Face": { "Enum": 5 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Range": { "Float32": 16.0 }, - "Sandboxed": { - "Bool": false - }, "Shadows": { "Bool": false }, @@ -78015,10 +36224,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -78042,33 +36248,21 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ - 0.050980393, - 0.4117647, + 0.050980397, + 0.41176474, 0.6745098 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TargetSurface": { "Enum": 0 @@ -78076,247 +36270,15 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true } } }, - "SwimController": { - "Name": "SwimController", - "Tags": [], - "Superclass": "ControllerBase", - "Properties": { - "AccelerationTime": { - "Name": "AccelerationTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PitchMaxTorque": { - "Name": "PitchMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PitchSpeedFactor": { - "Name": "PitchSpeedFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RollMaxTorque": { - "Name": "RollMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RollSpeedFactor": { - "Name": "RollSpeedFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AccelerationTime": { - "Float32": 0.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BalanceRigidityEnabled": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MoveSpeedFactor": { - "Float32": 1.0 - }, - "PitchMaxTorque": { - "Float32": 10000.0 - }, - "PitchSpeedFactor": { - "Float32": 1.0 - }, - "RollMaxTorque": { - "Float32": 10000.0 - }, - "RollSpeedFactor": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SyncScriptBuilder": { - "Name": "SyncScriptBuilder", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "ScriptBuilder", - "Properties": { - "CompileTarget": { - "Name": "CompileTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CompileTarget" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CoverageInfo": { - "Name": "CoverageInfo", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DebugInfo": { - "Name": "DebugInfo", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PackAsSource": { - "Name": "PackAsSource", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RawBytecode": { - "Name": "RawBytecode", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SystemThemeService": { - "Name": "SystemThemeService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "TaskScheduler": { "Name": "TaskScheduler", "Tags": [ "NotCreatable", - "NotReplicated", "Service" ], "Superclass": "Instance", @@ -78383,17 +36345,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Team": { "Name": "Team", @@ -78475,113 +36427,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoAssignable": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TeamColor": { - "BrickColor": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TeamCreateData": { - "Name": "TeamCreateData", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "InitialCameraCFrame": { - "Name": "InitialCameraCFrame", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TeamCreatePublishService": { - "Name": "TeamCreatePublishService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TeamCreateService": { - "Name": "TeamCreateService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "Int32": 1 } } }, @@ -78594,50 +36453,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TelemetryService": { - "Name": "TelemetryService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -78681,17 +36504,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TeleportOptions": { "Name": "TeleportOptions", @@ -78711,19 +36524,6 @@ } } }, - "ReservedServerId": { - "Name": "ReservedServerId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ServerInstanceId": { "Name": "ServerInstanceId", "Scriptability": "ReadWrite", @@ -78749,43 +36549,15 @@ "Serialization": "Serializes" } } - }, - "VipServerId": { - "Name": "VipServerId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "ReservedServerAccessCode": { "String": "" }, - "ReservedServerId": { - "String": "" - }, - "Sandboxed": { - "Bool": false - }, "ServerInstanceId": { "String": "" }, @@ -78796,13 +36568,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VipServerId": { - "String": "" + "BinaryString": "" } } }, @@ -78832,29 +36598,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -78867,17 +36618,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TemporaryScriptService": { "Name": "TemporaryScriptService", @@ -78888,17 +36629,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Terrain": { "Name": "Terrain", @@ -78907,76 +36638,6 @@ ], "Superclass": "BasePart", "Properties": { - "AcquisitionMethod": { - "Name": "AcquisitionMethod", - "Scriptability": "None", - "DataType": { - "Enum": "TerrainAcquisitionMethod" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClusterGrid": { - "Name": "ClusterGrid", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ClusterGridV2": { - "Name": "ClusterGridV2", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ClusterGridV3": { - "Name": "ClusterGridV3", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Decoration": { "Name": "Decoration", "Scriptability": "None", @@ -78992,36 +36653,6 @@ } } }, - "ExpandedTerrainResolved": { - "Name": "ExpandedTerrainResolved", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GrassLength": { - "Name": "GrassLength", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "IsSmooth": { "Name": "IsSmooth", "Scriptability": "Read", @@ -79057,27 +36688,11 @@ }, "MaterialColors": { "Name": "MaterialColors", - "Scriptability": "Custom", - "DataType": { - "Value": "MaterialColors" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Materials": { - "Name": "Materials", "Scriptability": "None", "DataType": { - "Value": "SharedString" + "Value": "BinaryString" }, "Tags": [ - "Hidden", "NotScriptable" ], "Kind": { @@ -79102,55 +36717,6 @@ } } }, - "PhysicsGrid": { - "Name": "PhysicsGrid", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SmoothGrid": { - "Name": "SmoothGrid", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SmoothVoxelsUpgraded": { - "Name": "SmoothVoxelsUpgraded", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "WaterColor": { "Name": "WaterColor", "Scriptability": "ReadWrite", @@ -79218,20 +36784,11 @@ } }, "DefaultProperties": { - "AcquisitionMethod": { - "Enum": 0 - }, "Anchored": { "Bool": true }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -79292,15 +36849,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -79317,9 +36868,6 @@ "Decoration": { "Bool": false }, - "EnableFluidForces": { - "Bool": true - }, "FrontParamA": { "Float32": -0.5 }, @@ -79332,12 +36880,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "GrassLength": { - "Float32": 0.7 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -79360,122 +36902,7 @@ "Enum": 256 }, "MaterialColors": { - "MaterialColors": { - "Grass": [ - 106, - 127, - 63 - ], - "Slate": [ - 63, - 127, - 107 - ], - "Concrete": [ - 127, - 102, - 63 - ], - "Brick": [ - 138, - 86, - 62 - ], - "Sand": [ - 143, - 126, - 95 - ], - "WoodPlanks": [ - 139, - 109, - 79 - ], - "Rock": [ - 102, - 108, - 111 - ], - "Glacier": [ - 101, - 176, - 234 - ], - "Snow": [ - 195, - 199, - 218 - ], - "Sandstone": [ - 137, - 90, - 71 - ], - "Mud": [ - 58, - 46, - 36 - ], - "Basalt": [ - 30, - 30, - 37 - ], - "Ground": [ - 102, - 92, - 59 - ], - "CrackedLava": [ - 232, - 156, - 74 - ], - "Asphalt": [ - 115, - 123, - 107 - ], - "Cobblestone": [ - 132, - 123, - 90 - ], - "Ice": [ - 129, - 194, - 224 - ], - "LeafyGrass": [ - 115, - 132, - 74 - ], - "Salt": [ - 198, - 189, - 181 - ], - "Limestone": [ - 206, - 173, - 148 - ], - "Pavement": [ - 148, - 148, - 140 - ] - } - }, - "MaterialVariant": { - "String": "" - }, - "Materials": { - "SharedString": "AQAAABUAAAACAAAAan8/AAUAAAAAAAADAAAAP39rIAMAAAAAAAAEAAAAf2Y/MAMAAAAAAAAFAAAAilY+UAMAAAAAAAAGAAAAj35fEAUAAAAAAAAHAAAAi21PEAIAAAAAAAAIAAAAZmxvgAMAAAAAAAAJAAAAZbDqEAYAAAAAAAAKAAAAw8faMAUAAAAAAAALAAAAiVpHkAMAAAAAAAAMAAAAOi4kQAUAAAAAAAANAAAAHh4lFAMAAAAAAAAOAAAAZlw7UAUAAAAAAAAPAAAA6JxKJAMAAAAAAAAQAAAAc3trYAUAAAAAAAARAAAAhHtacAMAAAAAAAASAAAAgcLgAAYAAAAAAAATAAAAc4RKBAUAAAAAAAAUAAAAxr21cAUAAAAAAAAVAAAAzq2UNAMAAAAAAAAWAAAAlJSMRAMAAAAAAAA=" - }, - "PhysicsGrid": { - "BinaryString": "AgMAAAAAAAAAAAAAAAA=" + "BinaryString": "AAAAAAAAan8/P39rf2Y/ilY+j35fi21PZmxvZbDqw8faiVpHOi4kHh4lZlw76JxKc3trhHtagcLgc4RKxr21zq2UlJSM" }, "PivotOffset": { "CFrame": { @@ -79528,9 +36955,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 2044.0, @@ -79538,17 +36962,11 @@ 2044.0 ] }, - "SmoothGrid": { - "BinaryString": "AQU=" - }, - "SmoothVoxelsUpgraded": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -79565,9 +36983,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -79596,400 +37011,11 @@ } } }, - "TerrainDetail": { - "Name": "TerrainDetail", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ColorMap": { - "Name": "ColorMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ColorMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ColorMapContent": { - "Name": "ColorMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveMaskContent": { - "Name": "EmissiveMaskContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveStrength": { - "Name": "EmissiveStrength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissiveTint": { - "Name": "EmissiveTint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Face": { - "Name": "Face", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TerrainFace" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaterialPattern": { - "Name": "MaterialPattern", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "MaterialPattern" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MetalnessMap": { - "Name": "MetalnessMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MetalnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "MetalnessMapContent": { - "Name": "MetalnessMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NormalMap": { - "Name": "NormalMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "NormalMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "NormalMapContent": { - "Name": "NormalMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RoughnessMap": { - "Name": "RoughnessMap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "RoughnessMapContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "RoughnessMapContent": { - "Name": "RoughnessMapContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudsPerTile": { - "Name": "StudsPerTile", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TexturePack": { - "Name": "TexturePack", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TexturePackContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TexturePackContent": { - "Name": "TexturePackContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ColorMapContent": { - "Content": "None" - }, - "EmissiveMaskContent": { - "Content": "None" - }, - "EmissiveStrength": { - "Float32": 1.0 - }, - "EmissiveTint": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Face": { - "Enum": 1 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaterialPattern": { - "Enum": 0 - }, - "MetalnessMapContent": { - "Content": "None" - }, - "NormalMapContent": { - "Content": "None" - }, - "RoughnessMapContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "StudsPerTile": { - "Float32": 10.0 - }, - "Tags": { - "Tags": [] - }, - "TexturePackContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TerrainIterateOperation": { - "Name": "TerrainIterateOperation", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "TerrainModifyOperation": { - "Name": "TerrainModifyOperation", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "TerrainReadOperation": { - "Name": "TerrainReadOperation", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, "TerrainRegion": { "Name": "TerrainRegion", "Tags": [], "Superclass": "Instance", "Properties": { - "ExtentsMax": { - "Name": "ExtentsMax", - "Scriptability": "None", - "DataType": { - "Value": "Vector3int16" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExtentsMin": { - "Name": "ExtentsMin", - "Scriptability": "None", - "DataType": { - "Value": "Vector3int16" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GridV3": { - "Name": "GridV3", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "IsSmooth": { "Name": "IsSmooth", "Scriptability": "Read", @@ -80022,95 +37048,17 @@ "Serialization": "DoesNotSerialize" } } - }, - "SmoothGrid": { - "Name": "SmoothGrid", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ExtentsMax": { - "Vector3int16": [ - 0, - 0, - 0 - ] - }, - "ExtentsMin": { - "Vector3int16": [ - 0, - 0, - 0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SmoothGrid": { - "BinaryString": "AQU=" + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TerrainWriteOperation": { - "Name": "TerrainWriteOperation", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "TestCase": { - "Name": "TestCase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -80147,22 +37095,6 @@ } } }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ErrorCount": { "Name": "ErrorCount", "Scriptability": "Read", @@ -80198,13 +37130,10 @@ "DataType": { "Value": "Bool" }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -80276,19 +37205,6 @@ } } }, - "ThrottlePhysicsToRealtime": { - "Name": "ThrottlePhysicsToRealtime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Timeout": { "Name": "Timeout", "Scriptability": "ReadWrite", @@ -80320,26 +37236,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoRuns": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Description": { "String": "" }, "ExecuteWithStudioRun": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "Is30FpsThrottleEnabled": { + "Bool": true }, "IsPhysicsEnvironmentalThrottled": { "Bool": true @@ -80350,9 +37260,6 @@ "NumberOfPlayers": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SimulateSecondsLag": { "Float64": 0.0 }, @@ -80360,16 +37267,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "ThrottlePhysicsToRealtime": { - "Bool": true + "BinaryString": "" }, "Timeout": { "Float64": 10.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -80391,23 +37292,6 @@ } } }, - "Confidential": { - "Name": "Confidential", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ContentText": { "Name": "ContentText", "Scriptability": "Read", @@ -80437,11 +37321,11 @@ } } }, - "Font": { - "Name": "Font", - "Scriptability": "ReadWrite", + "EnableRealtimeFilteringHints": { + "Name": "EnableRealtimeFilteringHints", + "Scriptability": "None", "DataType": { - "Enum": "Font" + "Value": "Bool" }, "Tags": [ "Hidden", @@ -80449,20 +37333,15 @@ ], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "FontFace", - "Migration": "FontToFontFace" - } - } + "Serialization": "DoesNotSerialize" } } }, - "FontFace": { - "Name": "FontFace", + "Font": { + "Name": "Font", "Scriptability": "ReadWrite", "DataType": { - "Value": "Font" + "Enum": "Font" }, "Tags": [], "Kind": { @@ -80487,24 +37366,6 @@ } } }, - "HasFocus": { - "Name": "HasFocus", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LineHeight": { "Name": "LineHeight", "Scriptability": "ReadWrite", @@ -80518,56 +37379,6 @@ } } }, - "LocalizationMatchIdentifier": { - "Name": "LocalizationMatchIdentifier", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalizationMatchedSourceText": { - "Name": "LocalizationMatchedSourceText", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalizedPlaceholderText": { - "Name": "LocalizedPlaceholderText", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ManualFocusRelease": { "Name": "ManualFocusRelease", "Scriptability": "None", @@ -80610,35 +37421,6 @@ } } }, - "OpenTypeFeatures": { - "Name": "OpenTypeFeatures", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OpenTypeFeaturesError": { - "Name": "OpenTypeFeaturesError", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "OverlayNativeInput": { "Name": "OverlayNativeInput", "Scriptability": "None", @@ -80723,54 +37505,6 @@ } } }, - "ShouldEmitReturnEvents": { - "Name": "ShouldEmitReturnEvents", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShouldEmitTabEvents": { - "Name": "ShouldEmitTabEvents", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShouldEmitUpAndDownArrowEvents": { - "Name": "ShouldEmitUpAndDownArrowEvents", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ShowNativeInput": { "Name": "ShowNativeInput", "Scriptability": "ReadWrite", @@ -80843,19 +37577,6 @@ } } }, - "TextDirection": { - "Name": "TextDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TextEditable": { "Name": "TextEditable", "Scriptability": "ReadWrite", @@ -81045,11 +37766,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -81069,9 +37787,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -81080,9 +37798,6 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClearTextOnFocus": { "Bool": true }, @@ -81092,19 +37807,8 @@ "Draggable": { "Bool": false }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/LegacyArial.json", - "weight": "Regular", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/Arimo-Regular.ttf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true + "Font": { + "Enum": 0 }, "LayoutOrder": { "Int32": 0 @@ -81112,26 +37816,17 @@ "LineHeight": { "Float32": 1.0 }, - "LocalizationMatchIdentifier": { - "String": "" - }, - "LocalizationMatchedSourceText": { - "String": "" - }, "MaxVisibleGraphemes": { "Int32": -1 }, "MultiLine": { "Bool": false }, - "OpenTypeFeatures": { - "String": "" - }, "PlaceholderColor3": { "Color3": [ - 0.5, - 0.5, - 0.5 + 0.7, + 0.7, + 0.7 ] }, "PlaceholderText": { @@ -81155,36 +37850,12 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Selectable": { "Bool": true }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, "ShowNativeInput": { "Bool": true }, - "Sink": { - "Enum": 1 - }, "Size": { "UDim2": [ [ @@ -81204,7 +37875,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Text": { "String": "TextBox" @@ -81216,9 +37887,6 @@ 0.20784315 ] }, - "TextDirection": { - "Enum": 0 - }, "TextEditable": { "Bool": true }, @@ -81253,9 +37921,6 @@ "TextYAlignment": { "Enum": 1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -81264,48 +37929,11 @@ } } }, - "TextBoxService": { - "Name": "TextBoxService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "TextButton": { "Name": "TextButton", "Tags": [], "Superclass": "GuiButton", "Properties": { - "Confidential": { - "Name": "Confidential", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ContentText": { "Name": "ContentText", "Scriptability": "Read", @@ -81328,27 +37956,6 @@ "DataType": { "Enum": "Font" }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "FontFace", - "Migration": "FontToFontFace" - } - } - } - } - }, - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, "Tags": [], "Kind": { "Canonical": { @@ -81385,38 +37992,6 @@ } } }, - "LocalizationMatchIdentifier": { - "Name": "LocalizationMatchIdentifier", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalizationMatchedSourceText": { - "Name": "LocalizationMatchedSourceText", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LocalizedText": { "Name": "LocalizedText", "Scriptability": "Read", @@ -81447,35 +38022,6 @@ } } }, - "OpenTypeFeatures": { - "Name": "OpenTypeFeatures", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OpenTypeFeaturesError": { - "Name": "OpenTypeFeaturesError", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RichText": { "Name": "RichText", "Scriptability": "ReadWrite", @@ -81548,19 +38094,6 @@ } } }, - "TextDirection": { - "Name": "TextDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TextFits": { "Name": "TextFits", "Scriptability": "Read", @@ -81721,11 +38254,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoButtonColor": { "Bool": true @@ -81748,9 +38278,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -81759,28 +38289,14 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "Draggable": { "Bool": false }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/LegacyArial.json", - "weight": "Regular", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/Arimo-Regular.ttf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true + "Font": { + "Enum": 0 }, "LayoutOrder": { "Int32": 0 @@ -81788,21 +38304,12 @@ "LineHeight": { "Float32": 1.0 }, - "LocalizationMatchIdentifier": { - "String": "" - }, - "LocalizationMatchedSourceText": { - "String": "" - }, "MaxVisibleGraphemes": { "Int32": -1 }, "Modal": { "Bool": false }, - "OpenTypeFeatures": { - "String": "" - }, "Position": { "UDim2": [ [ @@ -81821,36 +38328,12 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Selectable": { "Bool": true }, "Selected": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 1 - }, "Size": { "UDim2": [ [ @@ -81873,7 +38356,7 @@ "Enum": 0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Text": { "String": "Button" @@ -81885,9 +38368,6 @@ 0.20784315 ] }, - "TextDirection": { - "Enum": 0 - }, "TextScaled": { "Bool": false }, @@ -81919,9 +38399,6 @@ "TextYAlignment": { "Enum": 1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -81934,844 +38411,16 @@ "Name": "TextChannel", "Tags": [], "Superclass": "Instance", - "Properties": { - "AddPlayersOnJoin": { - "Name": "AddPlayersOnJoin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DirectChatRequester": { - "Name": "DirectChatRequester", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsDefaultTextChannel": { - "Name": "IsDefaultTextChannel", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "AddPlayersOnJoin": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextChannelWindow": { - "Name": "TextChannelWindow", - "Tags": [ - "NotBrowsable" - ], - "Superclass": "GuiObject", - "Properties": { - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsRendering": { - "Name": "IsRendering", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Target": { - "Name": "Target", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseDefaultFont": { - "Name": "UseDefaultFont", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": false - }, - "AnchorPoint": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "AutomaticSize": { - "Enum": 0 - }, - "BackgroundColor3": { - "Color3": [ - 0.6392157, - 0.63529414, - 0.64705884 - ] - }, - "BackgroundTransparency": { - "Float32": 0.0 - }, - "BorderColor3": { - "Color3": [ - 0.105882354, - 0.16470589, - 0.20784314 - ] - }, - "BorderMode": { - "Enum": 0 - }, - "BorderSizePixel": { - "Int32": 1 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendants": { - "Bool": false - }, - "Draggable": { - "Bool": false - }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/BuilderSans.json", - "weight": "Medium", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/BuilderSans-Medium.otf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true - }, - "LayoutOrder": { - "Int32": 0 - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "Rotation": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "Selectable": { - "Bool": false - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, - "Size": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseDefaultFont": { - "Bool": true - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "TextChatCommand": { - "Name": "TextChatCommand", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AutocompleteVisible": { - "Name": "AutocompleteVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrimaryAlias": { - "Name": "PrimaryAlias", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondaryAlias": { - "Name": "SecondaryAlias", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutocompleteVisible": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PrimaryAlias": { - "String": "" - }, - "Sandboxed": { - "Bool": false - }, - "SecondaryAlias": { - "String": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextChatConfigurations": { - "Name": "TextChatConfigurations", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextChatMessage": { - "Name": "TextChatMessage", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "BubbleChatMessageProperties": { - "Name": "BubbleChatMessageProperties", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChatActionType": { - "Name": "ChatActionType", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ChatWindowMessageProperties": { - "Name": "ChatWindowMessageProperties", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ForModeration": { - "Name": "ForModeration", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsHiddenMessage": { - "Name": "IsHiddenMessage", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsHistorical": { - "Name": "IsHistorical", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MessageId": { - "Name": "MessageId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Metadata": { - "Name": "Metadata", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OriginalText": { - "Name": "OriginalText", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PrefixText": { - "Name": "PrefixText", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PrefixTextInternal": { - "Name": "PrefixTextInternal", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PresetChatVersion": { - "Name": "PresetChatVersion", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PresetId": { - "Name": "PresetId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RewrittenText": { - "Name": "RewrittenText", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RewrittenTranslation": { - "Name": "RewrittenTranslation", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Status": { - "Name": "Status", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextChatMessageStatus" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextChannel": { - "Name": "TextChannel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextInternal": { - "Name": "TextInternal", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextSource": { - "Name": "TextSource", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Translation": { - "Name": "Translation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TranslationInternal": { - "Name": "TranslationInternal", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Verified": { - "Name": "Verified", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WasRewritten": { - "Name": "WasRewritten", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextChatMessageProperties": { - "Name": "TextChatMessageProperties", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "PrefixText": { - "Name": "PrefixText", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Translation": { - "Name": "Translation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -82779,240 +38428,20 @@ "Name": "TextChatService", "Tags": [ "NotCreatable", + "NotReplicated", "Service" ], "Superclass": "Instance", - "Properties": { - "ChatTranslationEnabled": { - "Name": "ChatTranslationEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ChatTranslationFTUXShown": { - "Name": "ChatTranslationFTUXShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChatTranslationToggleEnabled": { - "Name": "ChatTranslationToggleEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChatVersion": { - "Name": "ChatVersion", - "Scriptability": "Read", - "DataType": { - "Enum": "ChatVersion" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CreateDefaultCommands": { - "Name": "CreateDefaultCommands", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CreateDefaultTextChannels": { - "Name": "CreateDefaultTextChannels", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HasSeenDeprecationDialog": { - "Name": "HasSeenDeprecationDialog", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsLegacyChatDisabled": { - "Name": "IsLegacyChatDisabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlatformIntegratedChat": { - "Name": "PlatformIntegratedChat", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ChatTranslationFTUXShown": { - "Bool": true - }, - "ChatTranslationToggleEnabled": { - "Bool": false - }, - "ChatVersion": { - "Enum": 0 - }, - "CreateDefaultCommands": { - "Bool": true - }, - "CreateDefaultTextChannels": { - "Bool": true - }, - "HasSeenDeprecationDialog": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsLegacyChatDisabled": { - "Bool": false - }, - "PlatformIntegratedChat": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextDocument": { - "Name": "TextDocument", - "Tags": [ - "NotBrowsable" - ], - "Superclass": "Instance", - "Properties": { - "TextContent": { - "Name": "TextContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -83024,190 +38453,13 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextFilterTranslatedResult": { - "Name": "TextFilterTranslatedResult", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "SourceLanguage": { - "Name": "SourceLanguage", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SourceText": { - "Name": "SourceText", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextGenerator": { - "Name": "TextGenerator", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Seed": { - "Name": "Seed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SystemPrompt": { - "Name": "SystemPrompt", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Temperature": { - "Name": "Temperature", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TopP": { - "Name": "TopP", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "Seed": { - "Int32": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "SystemPrompt": { - "String": "" - }, - "Tags": { - "Tags": [] - }, - "Temperature": { - "Float32": 0.7 - }, - "TopP": { - "Float32": 0.9 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TextLabel": { "Name": "TextLabel", "Tags": [], "Superclass": "GuiLabel", "Properties": { - "Confidential": { - "Name": "Confidential", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "ContentText": { "Name": "ContentText", "Scriptability": "Read", @@ -83230,27 +38482,6 @@ "DataType": { "Enum": "Font" }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "FontFace", - "Migration": "FontToFontFace" - } - } - } - } - }, - "FontFace": { - "Name": "FontFace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Font" - }, "Tags": [], "Kind": { "Canonical": { @@ -83287,38 +38518,6 @@ } } }, - "LocalizationMatchIdentifier": { - "Name": "LocalizationMatchIdentifier", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalizationMatchedSourceText": { - "Name": "LocalizationMatchedSourceText", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "LocalizedText": { "Name": "LocalizedText", "Scriptability": "Read", @@ -83349,35 +38548,6 @@ } } }, - "OpenTypeFeatures": { - "Name": "OpenTypeFeatures", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OpenTypeFeaturesError": { - "Name": "OpenTypeFeaturesError", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RichText": { "Name": "RichText", "Scriptability": "ReadWrite", @@ -83450,19 +38620,6 @@ } } }, - "TextDirection": { - "Name": "TextDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TextFits": { "Name": "TextFits", "Scriptability": "Read", @@ -83623,11 +38780,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -83647,9 +38801,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -83658,28 +38812,14 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "Draggable": { "Bool": false }, - "FontFace": { - "Font": { - "family": "rbxasset://fonts/families/LegacyArial.json", - "weight": "Regular", - "style": "Normal", - "cachedFaceId": "rbxasset://fonts/Arimo-Regular.ttf" - } - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true + "Font": { + "Enum": 0 }, "LayoutOrder": { "Int32": 0 @@ -83687,18 +38827,9 @@ "LineHeight": { "Float32": 1.0 }, - "LocalizationMatchIdentifier": { - "String": "" - }, - "LocalizationMatchedSourceText": { - "String": "" - }, "MaxVisibleGraphemes": { "Int32": -1 }, - "OpenTypeFeatures": { - "String": "" - }, "Position": { "UDim2": [ [ @@ -83717,33 +38848,9 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Selectable": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, "Size": { "UDim2": [ [ @@ -83763,7 +38870,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Text": { "String": "Label" @@ -83775,9 +38882,6 @@ 0.20784315 ] }, - "TextDirection": { - "Enum": 0 - }, "TextScaled": { "Bool": false }, @@ -83809,9 +38913,6 @@ "TextYAlignment": { "Enum": 1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": true }, @@ -83829,17 +38930,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TextSource": { "Name": "TextSource", @@ -83861,22 +38952,6 @@ } } }, - "DisplayName": { - "Name": "DisplayName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "UserId": { "Name": "UserId", "Scriptability": "Read", @@ -83892,51 +38967,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "UserIdReplicated": { - "Name": "UserIdReplicated", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Username": { - "Name": "Username", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Texture": { "Name": "Texture", @@ -83997,17 +39030,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color3": { "Color3": [ @@ -84016,46 +39040,15 @@ 1.0 ] }, - "EmissiveMaskContent": { - "Content": "None" - }, - "EmissiveStrength": { - "Float32": 1.0 - }, - "EmissiveTint": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, "Face": { "Enum": 5 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MetalnessMapContent": { - "Content": "None" - }, - "NormalMapContent": { - "Content": "None" - }, "OffsetStudsU": { "Float32": 0.0 }, "OffsetStudsV": { "Float32": 0.0 }, - "Rotation": { - "Float32": 0.0 - }, - "RoughnessMapContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -84066,101 +39059,19 @@ "Float32": 2.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" - }, - "TexturePack": { - "ContentId": "" - }, - "TexturePackMetadata": { - "String": "" + "Texture": { + "Content": "" }, "Transparency": { "Float32": 0.0 }, - "UVOffset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "UVScale": { - "Vector2": [ - 1.0, - 1.0 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "ZIndex": { "Int32": 1 } } }, - "TextureGenerationPartGroup": { - "Name": "TextureGenerationPartGroup", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextureGenerationService": { - "Name": "TextureGenerationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextureGenerationUnwrappingRequest": { - "Name": "TextureGenerationUnwrappingRequest", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "ThirdPartyUserService": { "Name": "ThirdPartyUserService", "Tags": [ @@ -84169,67 +39080,8 @@ "Service" ], "Superclass": "Instance", - "Properties": { - "FriendCommunicationRestrictionStatus": { - "Name": "FriendCommunicationRestrictionStatus", - "Scriptability": "None", - "DataType": { - "Enum": "ChatRestrictionStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HasActiveUser": { - "Name": "HasActiveUser", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VoiceChatRestrictionStatus": { - "Name": "VoiceChatRestrictionStatus", - "Scriptability": "None", - "DataType": { - "Enum": "ChatRestrictionStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "Properties": {}, + "DefaultProperties": {} }, "ThreadState": { "Name": "ThreadState", @@ -84308,17 +39160,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TimerService": { "Name": "TimerService", @@ -84329,29 +39171,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -84364,17 +39191,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Tool": { "Name": "Tool", @@ -84427,7 +39244,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -84443,7 +39259,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -84459,7 +39274,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -84475,7 +39289,6 @@ "Value": "Vector3" }, "Tags": [ - "Hidden", "NotReplicated" ], "Kind": { @@ -84525,18 +39338,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "CanBeDropped": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, @@ -84566,89 +39373,37 @@ ] } }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LevelOfDetail": { - "Enum": 0 - }, "ManualActivationOnly": { "Bool": false }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, "RequiresHandle": { "Bool": true }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SlimHash": { - "SharedString": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" + "TextureId": { + "Content": "" }, "ToolTip": { "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null } } }, + "ToolboxService": { + "Name": "ToolboxService", + "Tags": [ + "NotCreatable", + "NotReplicated", + "Service" + ], + "Superclass": "Instance", + "Properties": {}, + "DefaultProperties": {} + }, "Torque": { "Name": "Torque", "Tags": [], @@ -84682,35 +39437,23 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 23 + "Int32": 23 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "RelativeTo": { "Enum": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Torque": { "Vector3": [ @@ -84719,9 +39462,6 @@ 0.0 ] }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Visible": { "Bool": false } @@ -84870,20 +39610,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Coils": { "Float32": 8.0 }, "Color": { - "BrickColor": 200 + "Int32": 200 }, "Damping": { "Float32": 0.01 @@ -84891,9 +39625,6 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LimitEnabled": { "Bool": false }, @@ -84912,9 +39643,6 @@ "Restitution": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -84922,10 +39650,7 @@ "Float32": 100.0 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false @@ -84939,17 +39664,7 @@ ], "Superclass": "StatsItem", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TouchInputService": { "Name": "TouchInputService", @@ -84960,29 +39675,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -84994,37 +39694,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TraceRouteService": { - "Name": "TraceRouteService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TracerService": { "Name": "TracerService", @@ -85035,109 +39705,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TrackerLodController": { - "Name": "TrackerLodController", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "AudioMode": { - "Name": "AudioMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TrackerLodFlagMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoExtrapolationMode": { - "Name": "VideoExtrapolationMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TrackerExtrapolationFlagMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoLodMode": { - "Name": "VideoLodMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TrackerLodValueMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoMode": { - "Name": "VideoMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TrackerLodFlagMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TrackerStreamAnimation": { - "Name": "TrackerStreamAnimation", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Trail": { "Name": "Trail", @@ -85261,22 +39829,6 @@ } } }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "MaxLength": { "Name": "MaxLength", "Scriptability": "ReadWrite", @@ -85306,24 +39858,6 @@ "Texture": { "Name": "Texture", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TextureContent": { - "Name": "TextureContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -85388,18 +39922,12 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "Brightness": { "Float32": 1.0 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Color": { "ColorSequence": { "keypoints": [ @@ -85428,9 +39956,6 @@ "FaceCamera": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Lifetime": { "Float32": 2.0 }, @@ -85446,17 +39971,14 @@ "MinLength": { "Float32": 0.1 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, - "TextureContent": { - "Content": "None" + "Texture": { + "Content": "" }, "TextureLength": { "Float32": 1.0 @@ -85480,9 +40002,6 @@ ] } }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "WidthScale": { "NumberSequence": { "keypoints": [ @@ -85526,17 +40045,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TremoloSoundEffect": { "Name": "TremoloSoundEffect", @@ -85584,14 +40093,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Depth": { "Float32": 1.0 @@ -85605,50 +40108,24 @@ "Frequency": { "Float32": 5.0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Priority": { "Int32": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "TriangleMeshPart": { "Name": "TriangleMeshPart", "Tags": [ - "NotBrowsable", "NotCreatable" ], "Superclass": "BasePart", "Properties": { - "AeroMeshData": { - "Name": "AeroMeshData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CollisionFidelity": { "Name": "CollisionFidelity", "Scriptability": "ReadWrite", @@ -85663,206 +40140,9 @@ "Serialization": "DoesNotSerialize" } } - }, - "CollisionPrecision": { - "Name": "CollisionPrecision", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ConvexDecompHolder": { - "Name": "ConvexDecompHolder", - "Scriptability": "None", - "DataType": { - "Value": "NetAssetRef" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FluidFidelity": { - "Name": "FluidFidelity", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FluidFidelity" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FluidFidelityInternal": { - "Name": "FluidFidelityInternal", - "Scriptability": "None", - "DataType": { - "Enum": "FluidFidelity" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InertiaMigrated": { - "Name": "InertiaMigrated", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshSize": { - "Name": "MeshSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PCDRequestId": { - "Name": "PCDRequestId", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicalConfigData": { - "Name": "PhysicalConfigData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UnscaledCofm": { - "Name": "UnscaledCofm", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UnscaledVolInertiaDiags": { - "Name": "UnscaledVolInertiaDiags", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UnscaledVolInertiaOffDiags": { - "Name": "UnscaledVolInertiaOffDiags", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UnscaledVolume": { - "Name": "UnscaledVolume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TrussPart": { "Name": "TrussPart", @@ -85883,36 +40163,14 @@ "Serialization": "DoesNotSerialize" } } - }, - "style": { - "Name": "style", - "Scriptability": "None", - "DataType": { - "Enum": "Style" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -85973,15 +40231,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -85995,9 +40247,6 @@ "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, "FrontParamA": { "Float32": -0.5 }, @@ -86010,9 +40259,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -86034,9 +40280,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -86088,9 +40331,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 2.0, @@ -86102,7 +40342,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -86119,39 +40359,12 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, 0.0, 0.0 ] - }, - "style": { - "Enum": 0 - } - } - }, - "TutorialService": { - "Name": "TutorialService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -86178,29 +40391,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -86229,17 +40427,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "TweenService": { "Name": "TweenService", @@ -86250,64 +40438,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UGCAvatarService": { - "Name": "UGCAvatarService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -86320,17 +40458,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UIAspectRatioConstraint": { "Name": "UIAspectRatioConstraint", @@ -86378,38 +40506,23 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, "AspectRatio": { "Float32": 1.0 }, "AspectType": { "Enum": 0 }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "DominantAxis": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -86420,17 +40533,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UIComponent": { "Name": "UIComponent", @@ -86439,17 +40542,7 @@ ], "Superclass": "UIBase", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UIConstraint": { "Name": "UIConstraint", @@ -86458,93 +40551,19 @@ ], "Superclass": "UIComponent", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UICorner": { "Name": "UICorner", "Tags": [], "Superclass": "UIComponent", "Properties": { - "BottomLeftRadius": { - "Name": "BottomLeftRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BottomRightRadius": { - "Name": "BottomRightRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CornerRadius": { "Name": "CornerRadius", "Scriptability": "ReadWrite", "DataType": { "Value": "UDim" }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": [ - "BottomLeftRadius", - "BottomRightRadius", - "TopLeftRadius", - "TopRightRadius" - ], - "Migration": "CornerRadiusToCornerRadii" - } - } - } - } - }, - "TopLeftRadius": { - "Name": "TopLeftRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TopRightRadius": { - "Name": "TopRightRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, "Tags": [], "Kind": { "Canonical": { @@ -86554,593 +40573,20 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "BottomLeftRadius": { + "CornerRadius": { "UDim": [ 0.0, 8 ] }, - "BottomRightRadius": { - "UDim": [ - 0.0, - 8 - ] - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TopLeftRadius": { - "UDim": [ - 0.0, - 8 - ] - }, - "TopRightRadius": { - "UDim": [ - 0.0, - 8 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIDragDetector": { - "Name": "UIDragDetector", - "Tags": [], - "Superclass": "UIComponent", - "Properties": { - "ActivatedCursorIcon": { - "Name": "ActivatedCursorIcon", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ActivatedCursorIconContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ActivatedCursorIconContent": { - "Name": "ActivatedCursorIconContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BoundingBehavior": { - "Name": "BoundingBehavior", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIDragDetectorBoundingBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BoundingUI": { - "Name": "BoundingUI", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CursorIcon": { - "Name": "CursorIcon", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "CursorIconContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "CursorIconContent": { - "Name": "CursorIconContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DragAxis": { - "Name": "DragAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DragRelativity": { - "Name": "DragRelativity", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIDragDetectorDragRelativity" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DragRotation": { - "Name": "DragRotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DragSpace": { - "Name": "DragSpace", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIDragDetectorDragSpace" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DragStyle": { - "Name": "DragStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIDragDetectorDragStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DragUDim2": { - "Name": "DragUDim2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDragAngle": { - "Name": "MaxDragAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDragTranslation": { - "Name": "MaxDragTranslation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinDragAngle": { - "Name": "MinDragAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinDragTranslation": { - "Name": "MinDragTranslation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReferenceUIInstance": { - "Name": "ReferenceUIInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResponseStyle": { - "Name": "ResponseStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIDragDetectorResponseStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionModeDragSpeed": { - "Name": "SelectionModeDragSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionModeRotateSpeed": { - "Name": "SelectionModeRotateSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UIDragSpeedAxisMapping": { - "Name": "UIDragSpeedAxisMapping", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIDragSpeedAxisMapping" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "ActivatedCursorIconContent": { - "Content": "None" - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BoundingBehavior": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CursorIconContent": { - "Content": "None" - }, - "DragAxis": { - "Vector2": [ - 1.0, - 0.0 - ] - }, - "DragRelativity": { - "Enum": 0 - }, - "DragRotation": { - "Float32": 0.0 - }, - "DragSpace": { - "Enum": 0 - }, - "DragStyle": { - "Enum": 0 - }, - "DragUDim2": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxDragAngle": { - "Float32": 0.0 - }, - "MaxDragTranslation": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "MinDragAngle": { - "Float32": 0.0 - }, - "MinDragTranslation": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "ResponseStyle": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SelectionModeDragSpeed": { - "UDim2": [ - [ - 0.0, - 300 - ], - [ - 0.0, - 300 - ] - ] - }, - "SelectionModeRotateSpeed": { - "Float32": 90.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UIDragSpeedAxisMapping": { - "Enum": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIDragDetectorService": { - "Name": "UIDragDetectorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIFlexItem": { - "Name": "UIFlexItem", - "Tags": [], - "Superclass": "UIComponent", - "Properties": { - "FlexMode": { - "Name": "FlexMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIFlexMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GrowRatio": { - "Name": "GrowRatio", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ItemLineAlignment": { - "Name": "ItemLineAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ItemLineAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShrinkRatio": { - "Name": "ShrinkRatio", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FlexMode": { - "Enum": 0 - }, - "GrowRatio": { - "Float32": 0.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ItemLineAlignment": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "ShrinkRatio": { - "Float32": 0.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -87201,36 +40647,6 @@ } } }, - "Scale": { - "Name": "Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotBrowsable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TileMode": { - "Name": "TileMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "GradientTileMode" - }, - "Tags": [ - "NotBrowsable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Transparency": { "Name": "Transparency", "Scriptability": "ReadWrite", @@ -87243,32 +40659,11 @@ "Serialization": "Serializes" } } - }, - "Type": { - "Name": "Type", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "GradientType" - }, - "Tags": [ - "NotBrowsable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { "ColorSequence": { @@ -87295,9 +40690,6 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "Offset": { "Vector2": [ 0.0, @@ -87307,20 +40699,11 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TileMode": { - "Enum": 0 + "BinaryString": "" }, "Transparency": { "NumberSequence": { @@ -87337,12 +40720,6 @@ } ] } - }, - "Type": { - "Enum": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -87437,14 +40814,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "CellPadding": { "UDim2": [ @@ -87476,15 +40847,9 @@ "FillDirectionMaxCells": { "Int32": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "HorizontalAlignment": { "Enum": 1 }, - "Sandboxed": { - "Bool": false - }, "SortOrder": { "Enum": 0 }, @@ -87495,10 +40860,7 @@ "Enum": 0 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "VerticalAlignment": { "Enum": 1 @@ -87582,17 +40944,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UILayout": { "Name": "UILayout", @@ -87601,65 +40953,13 @@ ], "Superclass": "UIComponent", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UIListLayout": { "Name": "UIListLayout", "Tags": [], "Superclass": "UIGridStyleLayout", "Properties": { - "HorizontalFlex": { - "Name": "HorizontalFlex", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIFlexAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HorizontalPadding": { - "Name": "HorizontalPadding", - "Scriptability": "None", - "DataType": { - "Value": "UDim" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ItemLineAlignment": { - "Name": "ItemLineAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ItemLineAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Padding": { "Name": "Padding", "Scriptability": "ReadWrite", @@ -87672,84 +40972,24 @@ "Serialization": "Serializes" } } - }, - "VerticalFlex": { - "Name": "VerticalFlex", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UIFlexAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VerticalPadding": { - "Name": "VerticalPadding", - "Scriptability": "None", - "DataType": { - "Value": "UDim" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Wraps": { - "Name": "Wraps", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "FillDirection": { "Enum": 1 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "HorizontalAlignment": { "Enum": 1 }, - "HorizontalFlex": { - "Enum": 0 - }, - "ItemLineAlignment": { - "Enum": 0 - }, "Padding": { "UDim": [ 0.0, 0 ] }, - "Sandboxed": { - "Bool": false - }, "SortOrder": { "Enum": 0 }, @@ -87757,19 +40997,10 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "VerticalAlignment": { "Enum": 1 - }, - "VerticalFlex": { - "Enum": 0 - }, - "Wraps": { - "Bool": false } } }, @@ -87832,17 +41063,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "PaddingBottom": { "UDim": [ @@ -87868,17 +41090,11 @@ 0 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -88025,14 +41241,8 @@ "Animated": { "Bool": true }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Circular": { "Bool": false @@ -88049,9 +41259,6 @@ "GamepadInputEnabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "HorizontalAlignment": { "Enum": 1 }, @@ -88061,9 +41268,6 @@ 0 ] }, - "Sandboxed": { - "Bool": false - }, "ScrollWheelInputEnabled": { "Bool": true }, @@ -88074,7 +41278,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TouchInputEnabled": { "Bool": true @@ -88082,9 +41286,6 @@ "TweenTime": { "Float32": 1.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "VerticalAlignment": { "Enum": 1 } @@ -88110,20 +41311,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "Scale": { "Float32": 1.0 @@ -88132,228 +41321,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIShadow": { - "Name": "UIShadow", - "Tags": [], - "Superclass": "UIComponent", - "Properties": { - "BlurRadius": { - "Name": "BlurRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Inset": { - "Name": "Inset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Mode": { - "Name": "Mode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ApplyShadowMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Offset": { - "Name": "Offset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowBehindParent": { - "Name": "ShowBehindParent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Spread": { - "Name": "Spread", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZIndex": { - "Name": "ZIndex", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BlurRadius": { - "UDim": [ - 0.0, - 0 - ] - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Inset": { - "Bool": false - }, - "Mode": { - "Enum": 0 - }, - "Offset": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "Sandboxed": { - "Bool": false - }, - "ShowBehindParent": { - "Bool": true - }, - "SourceAssetId": { - "Int64": -1 - }, - "Spread": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "Tags": { - "Tags": [] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ZIndex": { - "Int32": -1 + "BinaryString": "" } } }, @@ -88390,17 +41358,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "MaxSize": { "Vector2": [ @@ -88414,17 +41373,11 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -88446,32 +41399,6 @@ } } }, - "BorderOffset": { - "Name": "BorderOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BorderStrokePosition": { - "Name": "BorderStrokePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "BorderStrokePosition" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Color": { "Name": "Color", "Scriptability": "ReadWrite", @@ -88511,19 +41438,6 @@ } } }, - "StrokeSizingMode": { - "Name": "StrokeSizingMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "StrokeSizingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Thickness": { "Name": "Thickness", "Scriptability": "ReadWrite", @@ -88549,42 +41463,14 @@ "Serialization": "Serializes" } } - }, - "ZIndex": { - "Name": "ZIndex", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { "ApplyStrokeMode": { "Enum": 0 }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BorderOffset": { - "UDim": [ - 0.0, - 0 - ] - }, - "BorderStrokePosition": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { "Color3": [ @@ -88596,35 +41482,20 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LineJoinMode": { "Enum": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, - "StrokeSizingMode": { - "Enum": 0 - }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Thickness": { "Float32": 1.0 }, "Transparency": { "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ZIndex": { - "Int32": 1 } } }, @@ -88687,14 +41558,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "FillDirection": { "Enum": 1 @@ -88705,9 +41570,6 @@ "FillEmptySpaceRows": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "HorizontalAlignment": { "Enum": 1 }, @@ -88726,9 +41588,6 @@ ] ] }, - "Sandboxed": { - "Bool": false - }, "SortOrder": { "Enum": 0 }, @@ -88736,10 +41595,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "VerticalAlignment": { "Enum": 1 @@ -88779,17 +41635,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "AttributesSerialize": { + "BinaryString": "" }, "MaxTextSize": { "Int32": 100 @@ -88797,17 +41644,11 @@ "MinTextSize": { "Int32": 1 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -88817,20 +41658,14 @@ "Superclass": "PartOperation", "Properties": {}, "DefaultProperties": { - "AeroMeshData": { - "SharedString": "" - }, "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true + "AssetId": { + "Content": "" }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -88891,21 +41726,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "ChildData": { - "BinaryString": "" - }, - "ChildData2": { - "SharedString": "" - }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -88916,24 +41739,9 @@ 255 ] }, - "ComponentIndex": { - "Int32": -1 - }, - "Content": { - "Content": "None" - }, "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, - "FluidFidelityInternal": { - "Enum": 0 - }, - "FormFactor": { - "Enum": 3 - }, "FrontParamA": { "Float32": -0.5 }, @@ -88946,19 +41754,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InertiaMigrated": { - "Bool": true - }, - "InitialSize": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, "LeftParamA": { "Float32": -0.5 }, @@ -88980,24 +41775,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, - "MeshData": { - "BinaryString": "" - }, - "MeshData2": { - "SharedString": "" - }, - "OffCentered": { - "Bool": false - }, - "PhysicalConfigData": { - "SharedString": "Q1NHUEhTAAAAAEJMT0NL" - }, - "PhysicsData": { - "BinaryString": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -89028,7 +41805,7 @@ "Float32": 0.0 }, "RenderFidelity": { - "Enum": 0 + "Enum": 1 }, "RightParamA": { "Float32": -0.5 @@ -89052,9 +41829,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 4.0, @@ -89065,14 +41839,11 @@ "SmoothingAngle": { "Float32": 0.0 }, - "SolidMeshHolder": { - "NetAssetRef": "" - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -89089,36 +41860,6 @@ "Transparency": { "Float32": 0.0 }, - "TriangleCount": { - "Int32": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UnscaledCofm": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolInertiaDiags": { - "Vector3": [ - 0.16666666, - 0.16666666, - 0.16666666 - ] - }, - "UnscaledVolInertiaOffDiags": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UnscaledVolume": { - "Float32": 1.0 - }, "UsePartColor": { "Bool": false }, @@ -89131,26 +41872,6 @@ } } }, - "UniqueIdLookupService": { - "Name": "UniqueIdLookupService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "UniversalConstraint": { "Name": "UniversalConstraint", "Tags": [], @@ -89210,24 +41931,15 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 1009 + "Int32": 1009 }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LimitsEnabled": { "Bool": false }, @@ -89240,55 +41952,17 @@ "Restitution": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false } } }, - "UnreliableRemoteEvent": { - "Name": "UnreliableRemoteEvent", - "Tags": [], - "Superclass": "BaseRemoteEvent", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "UnvalidatedAssetService": { "Name": "UnvalidatedAssetService", "Tags": [ @@ -89296,51 +41970,16 @@ "Service" ], "Superclass": "Instance", - "Properties": { - "CachedData": { - "Name": "CachedData", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CachedData": { - "String": "{\"lastSaveTime\":0,\"lastKnownPublishRequest\":0,\"users\":[]}" - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -89348,8 +41987,7 @@ "Name": "UserGameSettings", "Tags": [ "NotCreatable", - "NotReplicated", - "Service" + "UserSettings" ], "Superclass": "Instance", "Properties": { @@ -89366,19 +42004,6 @@ } } }, - "BadgeVisible": { - "Name": "BadgeVisible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CameraMode": { "Name": "CameraMode", "Scriptability": "None", @@ -89408,70 +42033,6 @@ } } }, - "ChatTranslationEnabled": { - "Name": "ChatTranslationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChatTranslationFTUXShown": { - "Name": "ChatTranslationFTUXShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChatTranslationLocale": { - "Name": "ChatTranslationLocale", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ChatTranslationToggleEnabled": { - "Name": "ChatTranslationToggleEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ChatVisible": { "Name": "ChatVisible", "Scriptability": "None", @@ -89485,39 +42046,6 @@ } } }, - "CompletedTutorials": { - "Name": "CompletedTutorials", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ComputerCameraMovementChanged": { - "Name": "ComputerCameraMovementChanged", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ComputerCameraMovementMode": { "Name": "ComputerCameraMovementMode", "Scriptability": "ReadWrite", @@ -89531,23 +42059,6 @@ } } }, - "ComputerMovementChanged": { - "Name": "ComputerMovementChanged", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ComputerMovementMode": { "Name": "ComputerMovementMode", "Scriptability": "ReadWrite", @@ -89574,38 +42085,6 @@ } } }, - "DefaultCameraID": { - "Name": "DefaultCameraID", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FramerateCap": { - "Name": "FramerateCap", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Fullscreen": { "Name": "Fullscreen", "Scriptability": "None", @@ -89632,19 +42111,6 @@ } } }, - "GraphicsOptimizationMode": { - "Name": "GraphicsOptimizationMode", - "Scriptability": "None", - "DataType": { - "Enum": "GraphicsOptimizationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "GraphicsQualityLevel": { "Name": "GraphicsQualityLevel", "Scriptability": "None", @@ -89658,22 +42124,6 @@ } } }, - "HapticStrength": { - "Name": "HapticStrength", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "HasEverUsedVR": { "Name": "HasEverUsedVR", "Scriptability": "None", @@ -89723,7 +42173,7 @@ }, "MasterVolume": { "Name": "MasterVolume", - "Scriptability": "None", + "Scriptability": "ReadWrite", "DataType": { "Value": "Float32" }, @@ -89734,32 +42184,6 @@ } } }, - "MasterVolumeStudio": { - "Name": "MasterVolumeStudio", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxQualityEnabled": { - "Name": "MaxQualityEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MicroProfilerWebServerEnabled": { "Name": "MicroProfilerWebServerEnabled", "Scriptability": "None", @@ -89882,32 +42306,6 @@ } } }, - "PartyVoiceVolume": { - "Name": "PartyVoiceVolume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PeoplePageLayout": { - "Name": "PeoplePageLayout", - "Scriptability": "None", - "DataType": { - "Enum": "PeoplePageLayout" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "PerformanceStatsVisible": { "Name": "PerformanceStatsVisible", "Scriptability": "None", @@ -89923,95 +42321,6 @@ } } }, - "PlayerHeight": { - "Name": "PlayerHeight", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerListVisible": { - "Name": "PlayerListVisible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerNamesEnabled": { - "Name": "PlayerNamesEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PreferredTextSize": { - "Name": "PreferredTextSize", - "Scriptability": "None", - "DataType": { - "Enum": "PreferredTextSize" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PreferredTransparency": { - "Name": "PreferredTransparency", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "QualityResetLevel": { - "Name": "QualityResetLevel", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "RCCProfilerRecordFrameRate": { "Name": "RCCProfilerRecordFrameRate", "Scriptability": "ReadWrite", @@ -90038,38 +42347,6 @@ } } }, - "ReadAloud": { - "Name": "ReadAloud", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReducedMotion": { - "Name": "ReducedMotion", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "RotationType": { "Name": "RotationType", "Scriptability": "ReadWrite", @@ -90144,39 +42421,6 @@ } } }, - "StudioPreferredTextSize": { - "Name": "StudioPreferredTextSize", - "Scriptability": "None", - "DataType": { - "Enum": "PreferredTextSize" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TouchCameraMovementChanged": { - "Name": "TouchCameraMovementChanged", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TouchCameraMovementMode": { "Name": "TouchCameraMovementMode", "Scriptability": "ReadWrite", @@ -90190,23 +42434,6 @@ } } }, - "TouchMovementChanged": { - "Name": "TouchMovementChanged", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TouchMovementMode": { "Name": "TouchMovementMode", "Scriptability": "ReadWrite", @@ -90220,38 +42447,6 @@ } } }, - "UIScaleMultiplierHundredths": { - "Name": "UIScaleMultiplierHundredths", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UiNavigationKeyBindEnabled": { - "Name": "UiNavigationKeyBindEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "UsedCoreGuiIsVisibleToggle": { "Name": "UsedCoreGuiIsVisibleToggle", "Scriptability": "None", @@ -90291,22 +42486,6 @@ } } }, - "VRComfortSetting": { - "Name": "VRComfortSetting", - "Scriptability": "None", - "DataType": { - "Enum": "VRComfortSetting" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "VREnabled": { "Name": "VREnabled", "Scriptability": "None", @@ -90332,155 +42511,9 @@ "Serialization": "Serializes" } } - }, - "VRSafetyBubbleMode": { - "Name": "VRSafetyBubbleMode", - "Scriptability": "None", - "DataType": { - "Enum": "VRSafetyBubbleMode" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VRSmoothRotationEnabled": { - "Name": "VRSmoothRotationEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VRSmoothRotationEnabledCustomOption": { - "Name": "VRSmoothRotationEnabledCustomOption", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VRThirdPersonFollowCamEnabled": { - "Name": "VRThirdPersonFollowCamEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VRThirdPersonFollowCamEnabledCustomOption": { - "Name": "VRThirdPersonFollowCamEnabledCustomOption", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VignetteEnabled": { - "Name": "VignetteEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VignetteEnabledCustomOption": { - "Name": "VignetteEnabledCustomOption", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VoiceChatVolume": { - "Name": "VoiceChatVolume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "gaID": { - "Name": "gaID", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UserInputService": { "Name": "UserInputService", @@ -90540,6 +42573,22 @@ } } }, + "GazeSelectionEnabled": { + "Name": "GazeSelectionEnabled", + "Scriptability": "None", + "DataType": { + "Value": "Bool" + }, + "Tags": [ + "Hidden", + "NotReplicated" + ], + "Kind": { + "Canonical": { + "Serialization": "DoesNotSerialize" + } + } + }, "GyroscopeEnabled": { "Name": "GyroscopeEnabled", "Scriptability": "Read", @@ -90579,7 +42628,6 @@ "Value": "Bool" }, "Tags": [ - "Deprecated", "Hidden" ], "Kind": { @@ -90647,37 +42695,6 @@ } } }, - "MouseIcon": { - "Name": "MouseIcon", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MouseIconContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "MouseIconContent": { - "Name": "MouseIconContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MouseIconEnabled": { "Name": "MouseIconEnabled", "Scriptability": "ReadWrite", @@ -90788,22 +42805,6 @@ } } }, - "PreferredInput": { - "Name": "PreferredInput", - "Scriptability": "Read", - "DataType": { - "Enum": "PreferredInput" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "RightBarSize": { "Name": "RightBarSize", "Scriptability": "None", @@ -90854,22 +42855,6 @@ } } }, - "TouchScreenEnabled": { - "Name": "TouchScreenEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "UserHeadCFrame": { "Name": "UserHeadCFrame", "Scriptability": "Read", @@ -90904,17 +42889,7 @@ } } }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UserService": { "Name": "UserService", @@ -90924,17 +42899,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UserSettings": { "Name": "UserSettings", @@ -90943,17 +42908,7 @@ ], "Superclass": "GenericSettings", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "UserStorageService": { "Name": "UserStorageService", @@ -90964,17 +42919,7 @@ ], "Superclass": "LocalStorageService", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "VRService": { "Name": "VRService", @@ -90984,179 +42929,13 @@ ], "Superclass": "Instance", "Properties": { - "AutomaticScaling": { - "Name": "AutomaticScaling", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VRScaling" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AvatarGestures": { - "Name": "AvatarGestures", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ControllerModels": { - "Name": "ControllerModels", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VRControllerModelMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DidPointerHit": { - "Name": "DidPointerHit", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FadeOutViewOnCollision": { - "Name": "FadeOutViewOnCollision", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "GuiInputUserCFrame": { "Name": "GuiInputUserCFrame", "Scriptability": "ReadWrite", "DataType": { "Enum": "UserCFrame" }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LaserDistance": { - "Name": "LaserDistance", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LaserPointer": { - "Name": "LaserPointer", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VRLaserPointerMode" - }, "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PointerHitCFrame": { - "Name": "PointerHitCFrame", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "QuestASWState": { - "Name": "QuestASWState", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "QuestDisplayRefreshRate": { - "Name": "QuestDisplayRefreshRate", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ThirdPersonFollowCamEnabled": { - "Name": "ThirdPersonFollowCamEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], "Kind": { "Canonical": { "Serialization": "DoesNotSerialize" @@ -91212,84 +42991,17 @@ "Serialization": "DoesNotSerialize" } } - }, - "VRSessionState": { - "Name": "VRSessionState", - "Scriptability": "None", - "DataType": { - "Enum": "VRSessionState" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutomaticScaling": { - "Enum": 0 - }, - "AvatarGestures": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ControllerModels": { - "Enum": 1 - }, - "FadeOutViewOnCollision": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LaserPointer": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VRStatusService": { - "Name": "VRStatusService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -91300,101 +43012,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ValueCurve": { - "Name": "ValueCurve", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Length": { - "Name": "Length", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ValueType": { - "Name": "ValueType", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ValuesAndTimes": { - "Name": "ValuesAndTimes", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ValuesAndTimes": { - "BinaryString": "AgAAAAAAAAABAAAAAAAAAA==" - } - } + "DefaultProperties": {} }, "Vector3Curve": { "Name": "Vector3Curve", @@ -91402,29 +43020,14 @@ "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -91448,29 +43051,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Value": { "Vector3": [ @@ -91530,17 +43118,11 @@ "ApplyAtCenterOfMass": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "Color": { - "BrickColor": 23 + "Int32": 23 }, "Enabled": { "Bool": true @@ -91552,23 +43134,14 @@ 0.0 ] }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "RelativeTo": { "Enum": 0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": false @@ -91581,29 +43154,14 @@ "Superclass": "Controller", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -91689,9 +43247,7 @@ "DataType": { "Value": "Int32" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -91717,9 +43273,7 @@ "DataType": { "Value": "Int32" }, - "Tags": [ - "NotReplicated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -91770,14 +43324,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -91838,15 +43386,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -91863,9 +43405,6 @@ "Disabled": { "Bool": false }, - "EnableFluidForces": { - "Bool": true - }, "FrontParamA": { "Float32": -0.5 }, @@ -91881,9 +43420,6 @@ "HeadsUpDisplay": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -91905,9 +43441,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "MaxSpeed": { "Float32": 25.0 }, @@ -91962,9 +43495,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 4.0, @@ -91982,7 +43512,7 @@ "Float32": 0.0 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "Throttle": { "Int32": 0 @@ -92011,9 +43541,6 @@ "TurnSpeed": { "Float32": 1.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -92082,11 +43609,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -92140,9 +43664,6 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CurrentAngle": { "Float32": 0.0 }, @@ -92152,23 +43673,14 @@ "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "MaxVelocity": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -92194,518 +43706,15 @@ "Serialization": "DoesNotSerialize" } } - }, - "ScriptCollabVersionHistoryEnabled": { - "Name": "ScriptCollabVersionHistoryEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VideoCapture": { - "Name": "VideoCapture", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Capture", - "Properties": { - "FilePath": { - "Name": "FilePath", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimeLength": { - "Name": "TimeLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": {} }, - "VideoCaptureService": { - "Name": "VideoCaptureService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CameraID": { - "Name": "CameraID", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VideoDeviceInput": { - "Name": "VideoDeviceInput", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraId": { - "Name": "CameraId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CaptureQuality": { - "Name": "CaptureQuality", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VideoDeviceCaptureQuality" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsReady": { - "Name": "IsReady", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VideoDisplay": { - "Name": "VideoDisplay", - "Tags": [ - "NotBrowsable" - ], - "Superclass": "GuiObject", - "Properties": { - "ResampleMode": { - "Name": "ResampleMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ResamplerMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScaleType": { - "Name": "ScaleType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ScaleType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TileSize": { - "Name": "TileSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoColor3": { - "Name": "VideoColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoRectOffset": { - "Name": "VideoRectOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoRectSize": { - "Name": "VideoRectSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoTransparency": { - "Name": "VideoTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": false - }, - "AnchorPoint": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "AutomaticSize": { - "Enum": 0 - }, - "BackgroundColor3": { - "Color3": [ - 0.6392157, - 0.63529414, - 0.64705884 - ] - }, - "BackgroundTransparency": { - "Float32": 0.0 - }, - "BorderColor3": { - "Color3": [ - 0.105882354, - 0.16470589, - 0.20784314 - ] - }, - "BorderMode": { - "Enum": 0 - }, - "BorderSizePixel": { - "Int32": 1 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendants": { - "Bool": false - }, - "Draggable": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true - }, - "LayoutOrder": { - "Int32": 0 - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "ResampleMode": { - "Enum": 0 - }, - "Rotation": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "ScaleType": { - "Enum": 0 - }, - "Selectable": { - "Bool": false - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, - "Size": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TileSize": { - "UDim2": [ - [ - 1.0, - 0 - ], - [ - 1.0, - 0 - ] - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VideoColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "VideoRectOffset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "VideoRectSize": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "VideoTransparency": { - "Float32": 0.0 - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, "VideoFrame": { "Name": "VideoFrame", "Tags": [], "Superclass": "GuiObject", "Properties": { - "InternalVideoUsage": { - "Name": "InternalVideoUsage", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InternalVideoUsage" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "IsLoaded": { "Name": "IsLoaded", "Scriptability": "Read", @@ -92735,21 +43744,6 @@ } } }, - "MaximumResolution": { - "Name": "MaximumResolution", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VideoSampleSize" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Playing": { "Name": "Playing", "Scriptability": "ReadWrite", @@ -92765,22 +43759,6 @@ } } }, - "PlayingReplicating": { - "Name": "PlayingReplicating", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Resolution": { "Name": "Resolution", "Scriptability": "Read", @@ -92797,45 +43775,6 @@ } } }, - "RollOffMaxDistance": { - "Name": "RollOffMaxDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RollOffMinDistance": { - "Name": "RollOffMinDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RollOffMode": { - "Name": "RollOffMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RollOffMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TimeLength": { "Name": "TimeLength", "Scriptability": "Read", @@ -92867,43 +43806,9 @@ } } }, - "TimePositionReplicating": { - "Name": "TimePositionReplicating", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Video": { "Name": "Video", "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "VideoContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "VideoContent": { - "Name": "VideoContent", - "Scriptability": "ReadWrite", "DataType": { "Value": "Content" }, @@ -92938,11 +43843,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -92962,9 +43864,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -92973,33 +43875,18 @@ "BorderSizePixel": { "Int32": 1 }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "Draggable": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Interactable": { - "Bool": true - }, - "InternalVideoUsage": { - "Enum": 0 - }, "LayoutOrder": { "Int32": 0 }, "Looped": { "Bool": false }, - "MaximumResolution": { - "Enum": 3 - }, "Playing": { "Bool": false }, @@ -93015,45 +43902,12 @@ ] ] }, - "RollOffMaxDistance": { - "Float32": 10000.0 - }, - "RollOffMinDistance": { - "Float32": 1.0 - }, - "RollOffMode": { - "Enum": 0 - }, "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Selectable": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, "Size": { "UDim2": [ [ @@ -93073,16 +43927,13 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TimePosition": { "Float64": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VideoContent": { - "Content": "None" + "Video": { + "Content": "" }, "Visible": { "Bool": true @@ -93095,484 +43946,6 @@ } } }, - "VideoPlayer": { - "Name": "VideoPlayer", - "Tags": [ - "NotBrowsable" - ], - "Superclass": "Instance", - "Properties": { - "AutoLoadInStudio": { - "Name": "AutoLoadInStudio", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AutoPlayInStudio": { - "Name": "AutoPlayInStudio", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InternalVideoUsage": { - "Name": "InternalVideoUsage", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InternalVideoUsage" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsLoaded": { - "Name": "IsLoaded", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPlaying": { - "Name": "IsPlaying", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Looping": { - "Name": "Looping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaximumResolution": { - "Name": "MaximumResolution", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VideoSampleSize" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaybackSpeed": { - "Name": "PlaybackSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayingReplicating": { - "Name": "PlayingReplicating", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Resolution": { - "Name": "Resolution", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimeLength": { - "Name": "TimeLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimePosition": { - "Name": "TimePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VideoContent": { - "Name": "VideoContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Volume": { - "Name": "Volume", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InternalVideoUsage": { - "Enum": 0 - }, - "Looping": { - "Bool": false - }, - "MaximumResolution": { - "Enum": 3 - }, - "PlaybackSpeed": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TimePosition": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VideoContent": { - "Content": "None" - }, - "Volume": { - "Float32": 1.0 - } - } - }, - "VideoSampler": { - "Name": "VideoSampler", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "TimeLength": { - "Name": "TimeLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VideoContent": { - "Name": "VideoContent", - "Scriptability": "Read", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": {} - }, - "VideoScreenCaptureService": { - "Name": "VideoScreenCaptureService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VideoService": { - "Name": "VideoService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ViewportCamera": { - "Name": "ViewportCamera", - "Tags": [], - "Superclass": "Camera", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CFrame": { - "CFrame": { - "position": [ - 0.0, - 20.0, - 20.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - -0.0 - ], - [ - -0.0, - 0.7071068, - 0.7071068 - ], - [ - 0.0, - -0.7071068, - 0.7071068 - ] - ] - } - }, - "CameraType": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FieldOfView": { - "Float32": 70.0 - }, - "FieldOfViewMode": { - "Enum": 0 - }, - "Focus": { - "CFrame": { - "position": [ - 0.0, - 0.0, - -5.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "HeadLocked": { - "Bool": true - }, - "HeadScale": { - "Float32": 1.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VRTiltAndRollEnabled": { - "Bool": false - } - } - }, "ViewportFrame": { "Name": "ViewportFrame", "Tags": [], @@ -93591,38 +43964,6 @@ } } }, - "CameraCFrame": { - "Name": "CameraCFrame", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraFieldOfView": { - "Name": "CameraFieldOfView", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "CurrentCamera": { "Name": "CurrentCamera", "Scriptability": "ReadWrite", @@ -93664,22 +44005,6 @@ } } }, - "IsMirrored": { - "Name": "IsMirrored", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "LightColor": { "Name": "LightColor", "Scriptability": "ReadWrite", @@ -93724,11 +44049,8 @@ 0.0 ] }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "AutoLocalize": { "Bool": true @@ -93748,9 +44070,9 @@ }, "BorderColor3": { "Color3": [ - 0.105882354, + 0.10588236, 0.16470589, - 0.20784314 + 0.20784315 ] }, "BorderMode": { @@ -93759,47 +44081,12 @@ "BorderSizePixel": { "Int32": 1 }, - "CameraCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "CameraFieldOfView": { - "Float32": 1.2217306 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "ClipsDescendants": { "Bool": false }, "Draggable": { "Bool": false }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "ImageColor3": { "Color3": [ 1.0, @@ -93810,9 +44097,6 @@ "ImageTransparency": { "Float32": 0.0 }, - "Interactable": { - "Bool": true - }, "LayoutOrder": { "Int32": 0 }, @@ -93845,33 +44129,9 @@ "Rotation": { "Float32": 0.0 }, - "Sandboxed": { - "Bool": false - }, "Selectable": { "Bool": false }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "SelectionOrder": { - "Int32": 0 - }, - "Sink": { - "Enum": 0 - }, "Size": { "UDim2": [ [ @@ -93891,10 +44151,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" }, "Visible": { "Bool": true @@ -93904,16 +44161,6 @@ } } }, - "VirtualInput": { - "Name": "VirtualInput", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, "VirtualInputManager": { "Name": "VirtualInputManager", "Tags": [ @@ -93939,29 +44186,14 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -93974,37 +44206,7 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VisibilityCheckDispatcher": { - "Name": "VisibilityCheckDispatcher", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "Visit": { "Name": "Visit", @@ -94015,188 +44217,28 @@ ], "Superclass": "Instance", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, - "VisualizationMode": { - "Name": "VisualizationMode", + "VoiceChannel": { + "Name": "VoiceChannel", "Tags": [], "Superclass": "Instance", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Title": { - "Name": "Title", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ToolTip": { - "Name": "ToolTip", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Title": { - "String": "" - }, - "ToolTip": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VisualizationModeCategory": { - "Name": "VisualizationModeCategory", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Title": { - "Name": "Title", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Title": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VisualizationModeService": { - "Name": "VisualizationModeService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" + "SourceAssetId": { + "Int64": -1 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "Tags": { + "BinaryString": "" } } }, "VoiceChatInternal": { "Name": "VoiceChatInternal", "Tags": [ - "NotBrowsable", "NotCreatable", "Service" ], @@ -94222,303 +44264,51 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, "VoiceChatService": { "Name": "VoiceChatService", "Tags": [ + "Deprecated", "NotCreatable", "Service" ], "Superclass": "Instance", - "Properties": { - "DefaultDistanceAttenuation": { - "Name": "DefaultDistanceAttenuation", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VoiceChatDistanceAttenuationType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableDefaultVoice": { - "Name": "EnableDefaultVoice", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableVoiceVolumeControls": { - "Name": "EnableVoiceVolumeControls", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseAudioApi": { - "Name": "UseAudioApi", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AudioApiRollout" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseNewAudioApi": { - "Name": "UseNewAudioApi", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseNewControlPaths": { - "Name": "UseNewControlPaths", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseNewJoinFlow": { - "Name": "UseNewJoinFlow", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseStreamSwitching": { - "Name": "UseStreamSwitching", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VoiceChatEnabledForPlaceOnRcc": { - "Name": "VoiceChatEnabledForPlaceOnRcc", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VoiceChatEnabledForUniverseOnRcc": { - "Name": "VoiceChatEnabledForUniverseOnRcc", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DefaultDistanceAttenuation": { - "Enum": 0 - }, - "EnableDefaultVoice": { - "Bool": true - }, - "EnableVoiceVolumeControls": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseAudioApi": { - "Enum": 1 + "BinaryString": "" } } }, - "VoxelBuffer": { - "Name": "VoxelBuffer", + "VoiceSource": { + "Name": "VoiceSource", "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "WebSocketClient": { - "Name": "WebSocketClient", - "Tags": [ - "NotCreatable", - "NotReplicated" + "Deprecated", + "NotCreatable" ], "Superclass": "Instance", "Properties": { - "ConnectionState": { - "Name": "ConnectionState", + "UserId": { + "Name": "UserId", "Scriptability": "Read", "DataType": { - "Enum": "WebSocketState" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WebSocketService": { - "Name": "WebSocketService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WebStreamClient": { - "Name": "WebStreamClient", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": { - "ConnectionState": { - "Name": "ConnectionState", - "Scriptability": "Read", - "DataType": { - "Enum": "WebStreamClientState" + "Value": "Int64" }, "Tags": [ "NotReplicated", @@ -94533,27 +44323,6 @@ }, "DefaultProperties": {} }, - "WebViewService": { - "Name": "WebViewService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, "WedgePart": { "Name": "WedgePart", "Tags": [], @@ -94563,14 +44332,8 @@ "Anchored": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioCanCollide": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, "BackParamA": { "Float32": -0.5 @@ -94631,15 +44394,9 @@ "CanTouch": { "Bool": true }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "CastShadow": { "Bool": true }, - "CollisionGroup": { - "String": "Default" - }, "CollisionGroupId": { "Int32": 0 }, @@ -94653,9 +44410,6 @@ "CustomPhysicalProperties": { "PhysicalProperties": "Default" }, - "EnableFluidForces": { - "Bool": true - }, "FormFactor": { "Enum": 1 }, @@ -94671,9 +44425,6 @@ "FrontSurfaceInput": { "Enum": 0 }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "LeftParamA": { "Float32": -0.5 }, @@ -94695,9 +44446,6 @@ "Material": { "Enum": 256 }, - "MaterialVariant": { - "String": "" - }, "PivotOffset": { "CFrame": { "position": [ @@ -94749,9 +44497,6 @@ 0.0 ] }, - "Sandboxed": { - "Bool": false - }, "Size": { "Vector3": [ 4.0, @@ -94763,7 +44508,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] + "BinaryString": "" }, "TopParamA": { "Float32": -0.5 @@ -94780,9 +44525,6 @@ "Transparency": { "Float32": 0.0 }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, "Velocity": { "Vector3": [ 0.0, @@ -94796,29 +44538,10 @@ "Name": "Weld", "Tags": [], "Superclass": "JointInstance", - "Properties": { - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, + "Properties": {}, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} + "AttributesSerialize": { + "BinaryString": "" }, "C0": { "CFrame": { @@ -94872,26 +44595,14 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -94916,39 +44627,6 @@ } } }, - "CFrame0": { - "Name": "CFrame0", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CFrame1": { - "Name": "CFrame1", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Enabled": { "Name": "Enabled", "Scriptability": "ReadWrite", @@ -94987,10 +44665,7 @@ "DataType": { "Value": "Ref" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Part0" @@ -95020,338 +44695,23 @@ "DataType": { "Value": "Ref" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Alias": { "AliasFor": "Part1" } } - }, - "State": { - "Name": "State", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CFrame0": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "State": { - "Int32": 3 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WindowProtocolService": { - "Name": "WindowProtocolService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Wire": { - "Name": "Wire", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Connected": { - "Name": "Connected", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SourceInstance": { - "Name": "SourceInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SourceName": { - "Name": "SourceName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetInstance": { - "Name": "TargetInstance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetName": { - "Name": "TargetName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "SourceName": { - "String": "Output" - }, - "Tags": { - "Tags": [] - }, - "TargetName": { - "String": "Input" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WireframeHandleAdornment": { - "Name": "WireframeHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "Scale": { - "Name": "Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thickness": { - "Name": "Thickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AdornCullingMode": { - "Enum": 0 - }, - "AlwaysOnTop": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "SizeRelativeOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] + "AttributesSerialize": { + "BinaryString": "" }, "SourceAssetId": { "Int64": -1 }, "Tags": { - "Tags": [] - }, - "Thickness": { - "Float32": 1.0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": -1 + "BinaryString": "" } } }, @@ -95363,32 +44723,6 @@ ], "Superclass": "WorldRoot", "Properties": { - "AirDensity": { - "Name": "AirDensity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AirTurbulenceIntensity": { - "Name": "AirTurbulenceIntensity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "AllowThirdPartySales": { "Name": "AllowThirdPartySales", "Scriptability": "ReadWrite", @@ -95404,24 +44738,11 @@ } } }, - "AuthorityMode": { - "Name": "AuthorityMode", + "AnimationWeightedBlendFix": { + "Name": "AnimationWeightedBlendFix", "Scriptability": "None", "DataType": { - "Enum": "AuthorityMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AvatarUnificationMode": { - "Name": "AvatarUnificationMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarUnificationMode" + "Enum": "NewAnimationRuntimeSetting" }, "Tags": [ "NotScriptable" @@ -95451,12 +44772,7 @@ "DataType": { "Value": "String" }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -95478,22 +44794,6 @@ } } }, - "DataModelPlaceVersion": { - "Name": "DataModelPlaceVersion", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "DistributedGameTime": { "Name": "DistributedGameTime", "Scriptability": "ReadWrite", @@ -95509,58 +44809,12 @@ } } }, - "EnableSLIMAvatars": { - "Name": "EnableSLIMAvatars", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExpandedTerrain": { - "Name": "ExpandedTerrain", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "ExplicitAutoJoints": { "Name": "ExplicitAutoJoints", "Scriptability": "None", "DataType": { "Value": "Bool" }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FallHeightEnabled": { - "Name": "FallHeightEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, "Tags": [], "Kind": { "Canonical": { @@ -95598,34 +44852,6 @@ } } }, - "FluidForces": { - "Name": "FluidForces", - "Scriptability": "None", - "DataType": { - "Enum": "FluidForces" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GlobalWind": { - "Name": "GlobalWind", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Gravity": { "Name": "Gravity", "Scriptability": "ReadWrite", @@ -95639,11 +44865,11 @@ } } }, - "IKControlConstraintSupport": { - "Name": "IKControlConstraintSupport", + "HumanoidOnlySetCollisionsOnStateChange": { + "Name": "HumanoidOnlySetCollisionsOnStateChange", "Scriptability": "None", "DataType": { - "Enum": "IKControlConstraintSupport" + "Enum": "HumanoidOnlySetCollisionsOnStateChange" }, "Tags": [ "NotScriptable" @@ -95654,89 +44880,12 @@ } } }, - "ImprovedAnimationConstraint": { - "Name": "ImprovedAnimationConstraint", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImprovedPhysicsReplication": { - "Name": "ImprovedPhysicsReplication", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InsertPoint": { - "Name": "InsertPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "InterpolationThrottling": { "Name": "InterpolationThrottling", "Scriptability": "ReadWrite", "DataType": { "Enum": "InterpolationThrottlingMode" }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LayeredClothingCacheOptimizations": { - "Name": "LayeredClothingCacheOptimizations", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LuauTypeCheckMode": { - "Name": "LuauTypeCheckMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "LuauTypeCheckMode" - }, "Tags": [], "Kind": { "Canonical": { @@ -95744,21 +44893,6 @@ } } }, - "MapTVRemoteToGamepadKeycodes": { - "Name": "MapTVRemoteToGamepadKeycodes", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "MeshPartHeadsAndAccessories": { "Name": "MeshPartHeadsAndAccessories", "Scriptability": "None", @@ -95774,60 +44908,15 @@ } } }, - "MeshStreamingAndImprovedLods": { - "Name": "MeshStreamingAndImprovedLods", - "Scriptability": "None", + "PhysicsSimulationRate": { + "Name": "PhysicsSimulationRate", + "Scriptability": "ReadWrite", "DataType": { - "Enum": "RolloutState" + "Enum": "PhysicsSimulationRate" }, "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ModelStreamingBehavior": { - "Name": "ModelStreamingBehavior", - "Scriptability": "None", - "DataType": { - "Enum": "ModelStreamingBehavior" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NextGenerationReplication": { - "Name": "NextGenerationReplication", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NextGenerationReplicationAlias": { - "Name": "NextGenerationReplicationAlias", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" + "Hidden", + "NotReplicated" ], "Kind": { "Canonical": { @@ -95835,21 +44924,6 @@ } } }, - "PathfindingUseImprovedSearch": { - "Name": "PathfindingUseImprovedSearch", - "Scriptability": "None", - "DataType": { - "Enum": "PathfindingUseImprovedSearch" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "PhysicsSteppingMethod": { "Name": "PhysicsSteppingMethod", "Scriptability": "None", @@ -95865,127 +44939,6 @@ } } }, - "PlayerCharacterDestroyBehavior": { - "Name": "PlayerCharacterDestroyBehavior", - "Scriptability": "None", - "DataType": { - "Enum": "PlayerCharacterDestroyBehavior" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerScriptsUseInputActionSystem": { - "Name": "PlayerScriptsUseInputActionSystem", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerScriptsUseInputActionSystemAlias": { - "Name": "PlayerScriptsUseInputActionSystemAlias", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PredictiveStreamingMode": { - "Name": "PredictiveStreamingMode", - "Scriptability": "None", - "DataType": { - "Enum": "PredictiveStreamingMode" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrimalPhysicsSolver": { - "Name": "PrimalPhysicsSolver", - "Scriptability": "None", - "DataType": { - "Enum": "PrimalPhysicsSolver" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RejectCharacterDeletions": { - "Name": "RejectCharacterDeletions", - "Scriptability": "None", - "DataType": { - "Enum": "RejectCharacterDeletions" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RenderingCacheOptimizations": { - "Name": "RenderingCacheOptimizations", - "Scriptability": "None", - "DataType": { - "Enum": "RenderingCacheOptimizationMode" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReplicateInstanceDestroySetting": { - "Name": "ReplicateInstanceDestroySetting", - "Scriptability": "None", - "DataType": { - "Enum": "ReplicateInstanceDestroySetting" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "Retargeting": { "Name": "Retargeting", "Scriptability": "ReadWrite", @@ -95999,21 +44952,6 @@ } } }, - "SandboxedInstanceMode": { - "Name": "SandboxedInstanceMode", - "Scriptability": "None", - "DataType": { - "Enum": "SandboxedInstanceMode" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "SignalBehavior": { "Name": "SignalBehavior", "Scriptability": "None", @@ -96025,42 +44963,7 @@ ], "Kind": { "Canonical": { - "Serialization": { - "SerializesAs": "SignalBehavior2" - } - } - } - }, - "SignalBehavior2": { - "Name": "SignalBehavior2", - "Scriptability": "None", - "DataType": { - "Enum": "SignalBehavior" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "SignalBehavior" - } - } - }, - "SignalBehaviorAlias": { - "Name": "SignalBehaviorAlias", - "Scriptability": "None", - "DataType": { - "Enum": "SignalBehavior" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -96079,19 +44982,6 @@ } } }, - "StreamingAdaptiveRadius": { - "Name": "StreamingAdaptiveRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "StreamingEnabled": { "Name": "StreamingEnabled", "Scriptability": "ReadWrite", @@ -96105,54 +44995,6 @@ } } }, - "StreamingEnabledAlias": { - "Name": "StreamingEnabledAlias", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StreamingEnabledStorage": { - "Name": "StreamingEnabledStorage", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StreamingIntegrityMode": { - "Name": "StreamingIntegrityMode", - "Scriptability": "None", - "DataType": { - "Enum": "StreamingIntegrityMode" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "StreamingMinRadius": { "Name": "StreamingMinRadius", "Scriptability": "None", @@ -96175,13 +45017,11 @@ "Enum": "StreamingPauseMode" }, "Tags": [ - "Hidden", - "NotReplicated", "NotScriptable" ], "Kind": { "Canonical": { - "Serialization": "DoesNotSerialize" + "Serialization": "Serializes" } } }, @@ -96216,53 +45056,6 @@ } } }, - "TerrainWeldsFixed": { - "Name": "TerrainWeldsFixed", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThrottleLevel": { - "Name": "ThrottleLevel", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TouchEventsUseCollisionGroups": { - "Name": "TouchEventsUseCollisionGroups", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "TouchesUseCollisionGroups": { "Name": "TouchesUseCollisionGroups", "Scriptability": "None", @@ -96277,406 +45070,80 @@ "Serialization": "Serializes" } } - }, - "UseFixedSimulation": { - "Name": "UseFixedSimulation", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseFixedSimulationAlias": { - "Name": "UseFixedSimulationAlias", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseInputSink": { - "Name": "UseInputSink", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseNewLuauTypeSolver": { - "Name": "UseNewLuauTypeSolver", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ValidateEnabledProximityPrompt": { - "Name": "ValidateEnabledProximityPrompt", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WatermarkHash": { - "Name": "WatermarkHash", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } } }, "DefaultProperties": { - "AirDensity": { - "Float32": 0.0012 - }, - "AirTurbulenceIntensity": { - "Float32": 0.0 - }, "AllowThirdPartySales": { "Bool": false }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AuthorityMode": { - "Enum": 1 - }, - "AutoSimulate": { - "Bool": true - }, - "AvatarUnificationMode": { + "AnimationWeightedBlendFix": { "Enum": 0 }, - "Capabilities": { - "SecurityCapabilities": 0 + "AttributesSerialize": { + "BinaryString": "" }, "ClientAnimatorThrottling": { "Enum": 0 }, - "CollisionGroupData": { - "BinaryString": "AQEABP////8HRGVmYXVsdA==" + "CollisionGroups": { + "String": "Default^0^-1" }, "DistributedGameTime": { "Float64": 0.0 }, - "EnableSLIMAvatars": { - "Enum": 0 - }, - "ExpandedTerrain": { - "Enum": 0 - }, "ExplicitAutoJoints": { "Bool": true }, - "FallHeightEnabled": { - "Bool": true - }, "FallenPartsDestroyHeight": { "Float32": -500.0 }, - "FluidForces": { - "Enum": 0 - }, - "GlobalWind": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, "Gravity": { "Float32": 196.2 }, - "GravityDirection": { - "Vector3": [ - 0.0, - -1.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IKControlConstraintSupport": { + "HumanoidOnlySetCollisionsOnStateChange": { "Enum": 0 }, - "ImprovedAnimationConstraint": { - "Enum": 0 - }, - "ImprovedPhysicsReplication": { - "Enum": 0 - }, - "LayeredClothingCacheOptimizations": { + "InterpolationThrottling": { "Enum": 0 }, "LevelOfDetail": { "Enum": 0 }, - "LuauTypeCheckMode": { - "Enum": 0 - }, - "MapTVRemoteToGamepadKeycodes": { - "Enum": 0 - }, "MeshPartHeadsAndAccessories": { "Enum": 0 }, - "MeshStreamingAndImprovedLods": { - "Enum": 0 - }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingBehavior": { - "Enum": 0 - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, - "NextGenerationReplication": { - "Enum": 0 - }, - "PathfindingUseImprovedSearch": { - "Enum": 0 - }, "PhysicsSteppingMethod": { "Enum": 0 }, - "PlayerCharacterDestroyBehavior": { - "Enum": 0 - }, - "PlayerScriptsUseInputActionSystem": { - "Enum": 0 - }, - "PredictiveStreamingMode": { - "Enum": 0 - }, - "PrimalPhysicsSolver": { - "Enum": 0 - }, - "RejectCharacterDeletions": { - "Enum": 0 - }, - "RenderingCacheOptimizations": { - "Enum": 0 - }, - "ReplicateInstanceDestroySetting": { - "Enum": 0 - }, "Retargeting": { "Enum": 0 }, - "Sandboxed": { - "Bool": false - }, - "SandboxedInstanceMode": { - "Enum": 0 - }, - "Scale": { - "Float32": 1.0 - }, "SignalBehavior": { "Enum": 0 }, - "SimulationRate": { - "Float32": 1.0 - }, - "SlimHash": { - "SharedString": "" - }, "SourceAssetId": { "Int64": -1 }, "StreamOutBehavior": { "Enum": 0 }, - "StreamingAdaptiveRadius": { - "Bool": false - }, "StreamingEnabled": { "Bool": false }, - "StreamingIntegrityMode": { - "Enum": 0 - }, "StreamingMinRadius": { "Int32": 64 }, + "StreamingPauseMode": { + "Enum": 0 + }, "StreamingTargetRadius": { "Int32": 1024 }, "Tags": { - "Tags": [] - }, - "TerrainWeldsFixed": { - "Bool": true - }, - "TouchEventsUseCollisionGroups": { - "Enum": 0 + "BinaryString": "" }, "TouchesUseCollisionGroups": { "Bool": false - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseFixedSimulation": { - "Enum": 0 - }, - "UseInputSink": { - "Enum": 0 - }, - "UseNewLuauTypeSolver": { - "Enum": 2 - }, - "ValidateEnabledProximityPrompt": { - "Enum": 0 - }, - "Wind": { - "Float32": 0.0 - }, - "WindDirection": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "WorkspaceAnnotation": { - "Name": "WorkspaceAnnotation", - "Tags": [], - "Superclass": "Annotation", - "Properties": { - "Adornee": { - "Name": "Adornee", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AdorneeOffset": { - "Name": "AdorneeOffset", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" } } }, @@ -96684,130 +45151,8 @@ "Name": "WorldModel", "Tags": [], "Superclass": "WorldRoot", - "Properties": { - "UseWorkspaceCollisionGroups": { - "Name": "UseWorkspaceCollisionGroups", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoSimulate": { - "Bool": false - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CollisionGroupData": { - "BinaryString": "AQEABP////8HRGVmYXVsdA==" - }, - "GravityDirection": { - "Vector3": [ - 0.0, - -1.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LevelOfDetail": { - "Enum": 0 - }, - "ModelMeshCFrame": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "ModelMeshData": { - "SharedString": "" - }, - "ModelMeshSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ModelStreamingMode": { - "Enum": 0 - }, - "NeedsPivotMigration": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SimulationRate": { - "Float32": 1.0 - }, - "SlimHash": { - "SharedString": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseWorkspaceCollisionGroups": { - "Bool": false - }, - "Wind": { - "Float32": 0.0 - }, - "WindDirection": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } + "Properties": {}, + "DefaultProperties": {} }, "WorldRoot": { "Name": "WorldRoot", @@ -96815,290 +45160,14 @@ "NotCreatable" ], "Superclass": "Model", - "Properties": { - "AutoSimulate": { - "Name": "AutoSimulate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGroupData": { - "Name": "CollisionGroupData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GravityDirection": { - "Name": "GravityDirection", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PhysicsStepTime": { - "Name": "PhysicsStepTime", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SimulationRate": { - "Name": "SimulationRate", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Wind": { - "Name": "Wind", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WindDirection": { - "Name": "WindDirection", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "WrapContentProvider": { - "Name": "WrapContentProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "CacheableContentProvider", "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WrapDeformMeshProvider": { - "Name": "WrapDeformMeshProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WrapDeformer": { - "Name": "WrapDeformer", - "Tags": [], - "Superclass": "BaseWrap", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CageMeshContent": { - "Content": "None" - }, - "CageOrigin": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HSRContent": { - "Content": "None" - }, - "HSRData": { - "SharedString": "" - }, - "HSRMeshIdData": { - "SharedString": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ImportOrigin": { - "CFrame": { - "position": [ - 0.0, - 0.0, - 0.0 - ], - "orientation": [ - [ - 1.0, - 0.0, - 0.0 - ], - [ - 0.0, - 1.0, - 0.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ] - } - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TemporaryCageMeshContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } + "DefaultProperties": {} }, "WrapLayer": { "Name": "WrapLayer", "Tags": [], "Superclass": "BaseWrap", "Properties": { - "AutoSkin": { - "Name": "AutoSkin", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "WrapLayerAutoSkin" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, "BindOffset": { "Name": "BindOffset", "Scriptability": "ReadWrite", @@ -97157,36 +45226,6 @@ } } }, - "MaxSize": { - "Name": "MaxSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Offset": { - "Name": "Offset", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, "Order": { "Name": "Order", "Scriptability": "ReadWrite", @@ -97206,21 +45245,6 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReferenceMeshContent": { - "Name": "ReferenceMeshContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, "Tags": [], "Kind": { "Canonical": { @@ -97232,17 +45256,12 @@ "Name": "ReferenceMeshId", "Scriptability": "ReadWrite", "DataType": { - "Value": "ContentId" + "Value": "Content" }, "Tags": [], "Kind": { "Canonical": { - "Serialization": { - "Migrate": { - "To": "ReferenceMeshContent", - "Migration": "ContentIdToContent" - } - } + "Serialization": "Serializes" } } }, @@ -97281,46 +45300,7 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TemporaryReferenceId": { - "Name": "TemporaryReferenceId", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TemporaryReferenceMeshContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TemporaryReferenceMeshContent": { - "Name": "TemporaryReferenceMeshContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -97329,14 +45309,8 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoSkin": { - "Enum": 0 + "AttributesSerialize": { + "BinaryString": "" }, "BindOffset": { "CFrame": { @@ -97364,8 +45338,8 @@ ] } }, - "CageMeshContent": { - "Content": "None" + "CageMeshId": { + "Content": "" }, "CageOrigin": { "CFrame": { @@ -97393,24 +45367,9 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, "Enabled": { "Bool": true }, - "HSRContent": { - "Content": "None" - }, - "HSRData": { - "SharedString": "" - }, - "HSRMeshIdData": { - "SharedString": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "ImportOrigin": { "CFrame": { "position": [ @@ -97443,8 +45402,8 @@ "Puffiness": { "Float32": 1.0 }, - "ReferenceMeshContent": { - "Content": "None" + "ReferenceMeshId": { + "Content": "" }, "ReferenceOrigin": { "CFrame": { @@ -97472,9 +45431,6 @@ ] } }, - "Sandboxed": { - "Bool": false - }, "ShrinkFactor": { "Float32": 0.0 }, @@ -97482,16 +45438,7 @@ "Int64": -1 }, "Tags": { - "Tags": [] - }, - "TemporaryCageMeshContent": { - "Content": "None" - }, - "TemporaryReferenceMeshContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } }, @@ -97538,9 +45485,7 @@ "DataType": { "Value": "Float32" }, - "Tags": [ - "Deprecated" - ], + "Tags": [], "Kind": { "Canonical": { "Serialization": "Serializes" @@ -97549,14 +45494,11 @@ } }, "DefaultProperties": { - "Archivable": { - "Bool": true + "AttributesSerialize": { + "BinaryString": "" }, - "Attributes": { - "Attributes": {} - }, - "CageMeshContent": { - "Content": "None" + "CageMeshId": { + "Content": "" }, "CageOrigin": { "CFrame": { @@ -97584,21 +45526,6 @@ ] } }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HSRContent": { - "Content": "None" - }, - "HSRData": { - "SharedString": "" - }, - "HSRMeshIdData": { - "SharedString": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, "ImportOrigin": { "CFrame": { "position": [ @@ -97625,9 +45552,6 @@ ] } }, - "Sandboxed": { - "Bool": false - }, "SourceAssetId": { "Int64": -1 }, @@ -97635,110 +45559,21 @@ "Float32": 0.0 }, "Tags": { - "Tags": [] - }, - "TemporaryCageMeshContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WrapTextureTransfer": { - "Name": "WrapTextureTransfer", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ReferenceCageMeshContent": { - "Name": "ReferenceCageMeshContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UVMaxBound": { - "Name": "UVMaxBound", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UVMinBound": { - "Name": "UVMinBound", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ReferenceCageMeshContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UVMaxBound": { - "Vector2": [ - null, - null - ] - }, - "UVMinBound": { - "Vector2": [ - null, - null - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" + "BinaryString": "" } } } }, "Enums": { - "AccessModifierType": { - "name": "AccessModifierType", + "ABTestLoadingStatus": { + "name": "ABTestLoadingStatus", "items": { - "Allow": 0, - "Deny": 1 + "Error": 3, + "Initialized": 2, + "None": 0, + "Pending": 1, + "ShutOff": 5, + "TimedOut": 4 } }, "AccessoryType": { @@ -97746,8 +45581,6 @@ "items": { "Back": 7, "DressSkirt": 17, - "Eyebrow": 18, - "Eyelash": 19, "Face": 3, "Front": 6, "Hair": 2, @@ -97766,22 +45599,6 @@ "Waist": 8 } }, - "ActionOnAutoResumeSync": { - "name": "ActionOnAutoResumeSync", - "items": { - "DontResume": 0, - "KeepLocal": 2, - "KeepStudio": 1 - } - }, - "ActionOnStopSync": { - "name": "ActionOnStopSync", - "items": { - "AlwaysAsk": 0, - "DeleteLocalFiles": 2, - "KeepLocalFiles": 1 - } - }, "ActionType": { "name": "ActionType", "items": { @@ -97792,17 +45609,6 @@ "Win": 4 } }, - "ActivePayerStatus": { - "name": "ActivePayerStatus", - "items": { - "Casual50Percent": 3, - "Intermediate35Percent": 4, - "Lapsed": 2, - "Never": 1, - "Top15Percent": 5, - "Unknown": 0 - } - }, "ActuatorRelativeTo": { "name": "ActuatorRelativeTo", "items": { @@ -97819,79 +45625,6 @@ "Servo": 2 } }, - "AdAvailabilityResult": { - "name": "AdAvailabilityResult", - "items": { - "DeviceIneligible": 2, - "ExperienceIneligible": 3, - "InternalError": 4, - "IsAvailable": 1, - "NoFill": 5, - "PlayerIneligible": 6, - "PublisherIneligible": 7 - } - }, - "AdEventType": { - "name": "AdEventType", - "items": { - "RewardedAdGrant": 4, - "RewardedAdLoaded": 3, - "RewardedAdUnloaded": 5, - "UserCompletedVideo": 2, - "VideoLoaded": 0, - "VideoRemoved": 1 - } - }, - "AdFormat": { - "name": "AdFormat", - "items": { - "RewardedVideo": 0 - } - }, - "AdShape": { - "name": "AdShape", - "items": { - "HorizontalRectangle": 1 - } - }, - "AdTeleportMethod": { - "name": "AdTeleportMethod", - "items": { - "InGameMenuBackButton": 2, - "PortalForward": 1, - "UIBackButton": 3, - "Undefined": 0 - } - }, - "AdUIEventType": { - "name": "AdUIEventType", - "items": { - "AdLabelClicked": 0, - "CloseButtonClicked": 5, - "FullscreenButtonClicked": 2, - "PauseButtonClicked": 4, - "PauseEventTriggered": 8, - "PlayButtonClicked": 3, - "PlayEventTriggered": 7, - "VolumeButtonClicked": 1, - "WhyThisAdClicked": 6 - } - }, - "AdUIType": { - "name": "AdUIType", - "items": { - "Image": 1, - "None": 0, - "Video": 2 - } - }, - "AdUnitStatus": { - "name": "AdUnitStatus", - "items": { - "Active": 1, - "Inactive": 0 - } - }, "AdornCullingMode": { "name": "AdornCullingMode", "items": { @@ -97899,51 +45632,20 @@ "Never": 1 } }, - "AdornShading": { - "name": "AdornShading", - "items": { - "AlwaysOnTop": 4, - "Default": 0, - "Shaded": 1, - "XRay": 2, - "XRayShaded": 3 - } - }, - "AgeCheckStatus": { - "name": "AgeCheckStatus", - "items": { - "Checked": 1, - "Unchecked": 0 - } - }, "AlignType": { "name": "AlignType", "items": { - "AllAxes": 5, "Parallel": 0, - "Perpendicular": 1, - "PrimaryAxisLookAt": 4, - "PrimaryAxisParallel": 2, - "PrimaryAxisPerpendicular": 3 + "Perpendicular": 1 } }, "AlphaMode": { "name": "AlphaMode", "items": { - "Opaque": 3, "Overlay": 0, - "TintMask": 2, "Transparency": 1 } }, - "AnalyticsCustomFieldKeys": { - "name": "AnalyticsCustomFieldKeys", - "items": { - "CustomField01": 0, - "CustomField02": 1, - "CustomField03": 2 - } - }, "AnalyticsEconomyAction": { "name": "AnalyticsEconomyAction", "items": { @@ -97952,24 +45654,6 @@ "Spend": 2 } }, - "AnalyticsEconomyFlowType": { - "name": "AnalyticsEconomyFlowType", - "items": { - "Sink": 0, - "Source": 1 - } - }, - "AnalyticsEconomyTransactionType": { - "name": "AnalyticsEconomyTransactionType", - "items": { - "ContextualPurchase": 3, - "Gameplay": 2, - "IAP": 0, - "Onboarding": 5, - "Shop": 1, - "TimedReward": 4 - } - }, "AnalyticsLogLevel": { "name": "AnalyticsLogLevel", "items": { @@ -97991,152 +45675,15 @@ "Fail": 4 } }, - "AnalyticsProgressionType": { - "name": "AnalyticsProgressionType", - "items": { - "Complete": 3, - "Custom": 0, - "Fail": 2, - "Start": 1 - } - }, - "AnimatedImagePlaybackState": { - "name": "AnimatedImagePlaybackState", - "items": { - "Begin": 0, - "Canceled": 4, - "Completed": 3, - "Paused": 2, - "Playing": 1 - } - }, - "AnimatedImageScaleType": { - "name": "AnimatedImageScaleType", - "items": { - "Crop": 3, - "Fit": 2, - "Stretch": 0, - "Tile": 1 - } - }, - "AnimationClipFromVideoStatus": { - "name": "AnimationClipFromVideoStatus", - "items": { - "Cancelled": 11, - "ErrorGeneric": 4, - "ErrorMultiplePeople": 12, - "ErrorNoPersonDetected": 8, - "ErrorUploadingVideo": 2001, - "ErrorVideoTooLong": 7, - "ErrorVideoUnstable": 9, - "Initializing": 0, - "Pending": 1, - "Processing": 2, - "Success": 6, - "Timeout": 10 - } - }, - "AnimationNodeBlend2DInputMode": { - "name": "AnimationNodeBlend2DInputMode", - "items": { - "Cartesian": 0, - "Polar": 1 - } - }, - "AnimationNodeBlendMode": { - "name": "AnimationNodeBlendMode", - "items": { - "Add": 1, - "Over": 0, - "Subtract": 2 - } - }, - "AnimationNodeInterruptible": { - "name": "AnimationNodeInterruptible", - "items": { - "Always": 0, - "Finished": 1, - "Trigger": 2 - } - }, - "AnimationNodePhaseSync": { - "name": "AnimationNodePhaseSync", - "items": { - "Synced": 0, - "Unsynced": 1 - } - }, - "AnimationNodePlayMode": { - "name": "AnimationNodePlayMode", - "items": { - "Loop": 0, - "OnceAndHold": 2, - "OnceAndReset": 3, - "PingPong": 1 - } - }, - "AnimationNodeTransitionType": { - "name": "AnimationNodeTransitionType", - "items": { - "CrossFade": 0, - "DeadBlend": 2, - "InertialBlend": 1 - } - }, - "AnimationNodeTransitionWhen": { - "name": "AnimationNodeTransitionWhen", - "items": { - "BeforeFinished": 1, - "Finished": 0 - } - }, - "AnimationNodeType": { - "name": "AnimationNodeType", - "items": { - "AddNode": 1, - "Blend1DNode": 3, - "Blend2DNode": 4, - "ClipNode": 5, - "GraphOutput": 6, - "InvalidNode": 0, - "MaskNode": 7, - "OneShotNode": 14, - "OverNode": 2, - "PrioritySelectNode": 8, - "RandomSequenceNode": 9, - "SelectNode": 10, - "SequenceNode": 11, - "SpeedNode": 12, - "StateMachineNode": 16, - "SubtractNode": 13 - } - }, - "AnimationNodeWaitFor": { - "name": "AnimationNodeWaitFor", - "items": { - "Finished": 0, - "Trigger": 1 - } - }, "AnimationPriority": { "name": "AnimationPriority", "items": { "Action": 2, - "Action2": 3, - "Action3": 4, - "Action4": 5, "Core": 1000, "Idle": 0, "Movement": 1 } }, - "AnimationValueNodeType": { - "name": "AnimationValueNodeType", - "items": { - "Expression": 1, - "Invalid": 0 - } - }, "AnimatorRetargetingMode": { "name": "AnimatorRetargetingMode", "items": { @@ -98145,73 +45692,11 @@ "Enabled": 2 } }, - "AnnotationChannelContentPreference": { - "name": "AnnotationChannelContentPreference", - "items": { - "All": 1, - "None": 0, - "Unknown": 2 - } - }, - "AnnotationEditingMode": { - "name": "AnnotationEditingMode", - "items": { - "None": 0, - "PlacingNew": 1, - "WritingNew": 2 - } - }, - "AnnotationPlaceContentPreference": { - "name": "AnnotationPlaceContentPreference", - "items": { - "All": 1, - "MentionsAndReplies": 2, - "None": 0, - "Unknown": 3 - } - }, - "AnnotationRequestStatus": { - "name": "AnnotationRequestStatus", - "items": { - "ErrorInternalFailure": 2, - "ErrorModerated": 4, - "ErrorNotFound": 3, - "Loading": 1, - "Success": 0 - } - }, - "AnnotationRequestType": { - "name": "AnnotationRequestType", - "items": { - "Create": 1, - "Delete": 3, - "Edit": 4, - "Resolve": 2, - "Unknown": 0 - } - }, - "AntiAliasing": { - "name": "AntiAliasing", - "items": { - "Disabled": 0, - "Enabled": 1 - } - }, - "AppLifecycleManagerState": { - "name": "AppLifecycleManagerState", - "items": { - "Active": 1, - "Detached": 0, - "Hidden": 3, - "Inactive": 2 - } - }, "AppShellActionType": { "name": "AppShellActionType", "items": { "AvatarEditorPageLoaded": 10, "GamePageLoaded": 8, - "HomePageInteractive": 11, "HomePageLoaded": 9, "None": 0, "OpenApp": 1, @@ -98232,29 +45717,19 @@ "HomePage": 4, "Landing": 6, "More": 5, - "None": 0, - "WatchPage": 7 + "None": 0 } }, "AppUpdateStatus": { "name": "AppUpdateStatus", "items": { "Available": 4, - "AvailableBetaProgram": 6, - "AvailableBoundChannel": 5, "Failed": 2, "NotAvailable": 3, "NotSupported": 1, "Unknown": 0 } }, - "ApplyShadowMode": { - "name": "ApplyShadowMode", - "items": { - "Shape": 0, - "Text": 1 - } - }, "ApplyStrokeMode": { "name": "ApplyStrokeMode", "items": { @@ -98269,28 +45744,11 @@ "ScaleWithParentSize": 1 } }, - "AssetCreatorType": { - "name": "AssetCreatorType", - "items": { - "Group": 1, - "User": 0 - } - }, "AssetFetchStatus": { "name": "AssetFetchStatus", "items": { "Failure": 1, - "Loading": 3, - "None": 2, - "Success": 0, - "TimedOut": 4 - } - }, - "AssetRepresentation": { - "name": "AssetRepresentation", - "items": { - "FullLength": 0, - "ShortPreview": 1 + "Success": 0 } }, "AssetType": { @@ -98298,25 +45756,18 @@ "items": { "Animation": 24, "Audio": 3, - "AvatarBackground": 92, "BackAccessory": 46, "Badge": 21, "ClimbAnimation": 48, "DeathAnimation": 49, "Decal": 13, "DressSkirtAccessory": 72, - "DynamicHead": 79, "EarAccessory": 57, "EmoteAnimation": 61, "EyeAccessory": 58, - "EyeMakeup": 90, - "EyebrowAccessory": 76, - "EyelashAccessory": 77, "Face": 18, "FaceAccessory": 42, - "FaceMakeup": 88, "FallAnimation": 50, - "FontFamily": 73, "FrontAccessory": 45, "GamePass": 34, "Gear": 19, @@ -98330,12 +45781,10 @@ "LeftArm": 29, "LeftLeg": 30, "LeftShoeAccessory": 70, - "LipMakeup": 89, "Lua": 5, "Mesh": 4, "MeshPart": 40, "Model": 10, - "MoodAnimation": 78, "NeckAccessory": 43, "Package": 32, "Pants": 12, @@ -98355,7 +45804,6 @@ "SwimAnimation": 54, "TShirt": 2, "TShirtAccessory": 64, - "TextDocument": 93, "Torso": 27, "Video": 62, "WaistAccessory": 47, @@ -98370,90 +45818,6 @@ "Default": 1 } }, - "AudioApiRollout": { - "name": "AudioApiRollout", - "items": { - "Automatic": 1, - "Disabled": 0, - "Enabled": 2 - } - }, - "AudioCaptureMode": { - "name": "AudioCaptureMode", - "items": {} - }, - "AudioChannelLayout": { - "name": "AudioChannelLayout", - "items": { - "Mono": 0, - "Quad": 2, - "Stereo": 1, - "Surround_5": 3, - "Surround_5_1": 4, - "Surround_7_1": 5, - "Surround_7_1_4": 6 - } - }, - "AudioFilterType": { - "name": "AudioFilterType", - "items": { - "Bandpass": 9, - "HighShelf": 2, - "Highpass12dB": 6, - "Highpass24dB": 7, - "Highpass48dB": 8, - "LowShelf": 1, - "Lowpass12dB": 3, - "Lowpass24dB": 4, - "Lowpass48dB": 5, - "Lowpass6dB": 11, - "Notch": 10, - "Peak": 0 - } - }, - "AudioPositionType": { - "name": "AudioPositionType", - "items": { - "Instance": 1, - "Parent": 0 - } - }, - "AudioSampleFormat": { - "name": "AudioSampleFormat", - "items": { - "Float32": 1, - "Int16": 0 - } - }, - "AudioSimulationFidelity": { - "name": "AudioSimulationFidelity", - "items": { - "Automatic": 1, - "None": 0 - } - }, - "AudioSubType": { - "name": "AudioSubType", - "items": { - "Music": 1, - "SoundEffect": 2 - } - }, - "AudioWindowSize": { - "name": "AudioWindowSize", - "items": { - "Large": 2, - "Medium": 1, - "Small": 0 - } - }, - "AuthorityMode": { - "name": "AuthorityMode", - "items": { - "Automatic": 1, - "Server": 0 - } - }, "AutoIndentRule": { "name": "AutoIndentRule", "items": { @@ -98474,18 +45838,12 @@ "AvatarAssetType": { "name": "AvatarAssetType", "items": { - "AvatarBackground": 92, "BackAccessory": 46, "ClimbAnimation": 48, "DressSkirtAccessory": 72, - "DynamicHead": 79, "EmoteAnimation": 61, - "EyeMakeup": 90, - "EyebrowAccessory": 76, - "EyelashAccessory": 77, "Face": 18, "FaceAccessory": 42, - "FaceMakeup": 88, "FallAnimation": 50, "FrontAccessory": 45, "Gear": 19, @@ -98498,8 +45856,6 @@ "LeftArm": 29, "LeftLeg": 30, "LeftShoeAccessory": 70, - "LipMakeup": 89, - "MoodAnimation": 78, "NeckAccessory": 43, "Pants": 12, "PantsAccessory": 66, @@ -98520,22 +45876,6 @@ "WalkAnimation": 55 } }, - "AvatarChatServiceFeature": { - "name": "AvatarChatServiceFeature", - "items": { - "None": 0, - "PlaceAudio": 4, - "PlaceVideo": 8, - "UniverseAudio": 1, - "UniverseVideo": 2, - "UserAudio": 32, - "UserAudioEligible": 16, - "UserBanned": 256, - "UserVerifiedForVoice": 512, - "UserVideo": 128, - "UserVideoEligible": 64 - } - }, "AvatarContextMenuOption": { "name": "AvatarContextMenuOption", "items": { @@ -98545,18 +45885,6 @@ "InspectMenu": 3 } }, - "AvatarGenerationError": { - "name": "AvatarGenerationError", - "items": { - "Canceled": 3, - "DownloadFailed": 2, - "JobNotFound": 6, - "None": 0, - "Offensive": 4, - "Timeout": 5, - "Unknown": 1 - } - }, "AvatarItemType": { "name": "AvatarItemType", "items": { @@ -98572,138 +45900,6 @@ "Success": 1 } }, - "AvatarSettingsAccessoryLimitMethod": { - "name": "AvatarSettingsAccessoryLimitMethod", - "items": { - "PreviewRemove": 3, - "PreviewScale": 2, - "Remove": 1, - "Scale": 0 - } - }, - "AvatarSettingsAccessoryMode": { - "name": "AvatarSettingsAccessoryMode", - "items": { - "CustomLimit": 1, - "PlayerChoice": 0 - } - }, - "AvatarSettingsAnimationClipsMode": { - "name": "AvatarSettingsAnimationClipsMode", - "items": { - "CustomClips": 1, - "PlayerChoice": 0 - } - }, - "AvatarSettingsAnimationPacksMode": { - "name": "AvatarSettingsAnimationPacksMode", - "items": { - "PlayerChoice": 0, - "StandardR15": 1, - "StandardR6": 2 - } - }, - "AvatarSettingsAppearanceMode": { - "name": "AvatarSettingsAppearanceMode", - "items": { - "CustomBody": 2, - "CustomParts": 1, - "PlayerChoice": 0 - } - }, - "AvatarSettingsBuildMode": { - "name": "AvatarSettingsBuildMode", - "items": { - "CustomBuild": 1, - "PlayerChoice": 0 - } - }, - "AvatarSettingsCharacterControllerMode": { - "name": "AvatarSettingsCharacterControllerMode", - "items": { - "LegacyHumanoid": 0, - "LuaCharacterController": 1 - } - }, - "AvatarSettingsClothingMode": { - "name": "AvatarSettingsClothingMode", - "items": { - "CustomLimit": 1, - "PlayerChoice": 0 - } - }, - "AvatarSettingsCollisionMode": { - "name": "AvatarSettingsCollisionMode", - "items": { - "Default": 0, - "Legacy": 2, - "SingleCollider": 1 - } - }, - "AvatarSettingsCustomAccessoryMode": { - "name": "AvatarSettingsCustomAccessoryMode", - "items": { - "CustomAccessories": 1, - "PlayerChoice": 0 - } - }, - "AvatarSettingsCustomBodyType": { - "name": "AvatarSettingsCustomBodyType", - "items": { - "AvatarReference": 0, - "BundleId": 1 - } - }, - "AvatarSettingsCustomClothingMode": { - "name": "AvatarSettingsCustomClothingMode", - "items": { - "CustomClothing": 1, - "PlayerChoice": 0 - } - }, - "AvatarSettingsHitAndTouchDetectionMode": { - "name": "AvatarSettingsHitAndTouchDetectionMode", - "items": { - "UseCollider": 1, - "UseParts": 0 - } - }, - "AvatarSettingsJumpMode": { - "name": "AvatarSettingsJumpMode", - "items": { - "JumpHeight": 0, - "JumpPower": 1 - } - }, - "AvatarSettingsLegacyCollisionMode": { - "name": "AvatarSettingsLegacyCollisionMode", - "items": { - "InnerBoxColliders": 1, - "R6Colliders": 0 - } - }, - "AvatarSettingsScaleMode": { - "name": "AvatarSettingsScaleMode", - "items": { - "CustomScale": 1, - "PlayerChoice": 0 - } - }, - "AvatarThumbnailCustomizationType": { - "name": "AvatarThumbnailCustomizationType", - "items": { - "Closeup": 1, - "FullBody": 2 - } - }, - "AvatarUnificationMode": { - "name": "AvatarUnificationMode", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, "Axis": { "name": "Axis", "items": { @@ -98712,22 +45908,6 @@ "Z": 2 } }, - "BasicMeshPartShape": { - "name": "BasicMeshPartShape", - "items": { - "Capsule": 5, - "Cone": 6, - "RoundedBox": 7 - } - }, - "BenefitType": { - "name": "BenefitType", - "items": { - "AvatarAsset": 1, - "AvatarBundle": 2, - "DeveloperProduct": 0 - } - }, "BinType": { "name": "BinType", "items": { @@ -98779,23 +45959,6 @@ "Outline": 0 } }, - "BorderStrokePosition": { - "name": "BorderStrokePosition", - "items": { - "Center": 1, - "Inner": 2, - "Outer": 0 - } - }, - "BranchStatus": { - "name": "BranchStatus", - "items": { - "Archived": 3, - "Draft": 0, - "Merged": 2, - "ReadyToMerge": 1 - } - }, "BreakReason": { "name": "BreakReason", "items": { @@ -98824,10 +45987,7 @@ "name": "BundleType", "items": { "Animations": 2, - "BodyParts": 1, - "DynamicHead": 4, - "DynamicHeadAvatar": 5, - "Shoes": 3 + "BodyParts": 1 } }, "Button": { @@ -98862,13 +46022,6 @@ "LockFirstPerson": 1 } }, - "CameraNavigationModel": { - "name": "CameraNavigationModel", - "items": { - "IndustryCompatible": 1, - "Roblox": 0 - } - }, "CameraPanMode": { "name": "CameraPanMode", "items": { @@ -98876,14 +46029,6 @@ "EdgeBump": 1 } }, - "CameraSpeedAdjustBinding": { - "name": "CameraSpeedAdjustBinding", - "items": { - "AltScroll": 2, - "None": 0, - "RmbScroll": 1 - } - }, "CameraType": { "name": "CameraType", "items": { @@ -98897,37 +46042,6 @@ "Watch": 2 } }, - "CanCollaborateError": { - "name": "CanCollaborateError", - "items": { - "AgeVerificationCountryBlocked": 11, - "Invalid": 0, - "None": 1, - "NotAgeVerified": 2, - "NotAuthorized": 8, - "NotFound": 6, - "OtherCollaboratorSettingsPreventTrust": 10, - "OtherUserCannotCollaborate": 12, - "OutsideAgeBucket": 3, - "OutsideAgeBucketTcPc": 9, - "OutsideOwnerAgeBucket": 7, - "PCBlock": 5, - "TooManyCollaborators": 4 - } - }, - "CaptureGalleryPermission": { - "name": "CaptureGalleryPermission", - "items": { - "ReadAndUpload": 0 - } - }, - "CaptureType": { - "name": "CaptureType", - "items": { - "Screenshot": 1, - "Video": 2 - } - }, "CatalogCategoryFilter": { "name": "CatalogCategoryFilter", "items": { @@ -98939,25 +46053,13 @@ "Recommended": 6 } }, - "CatalogSortAggregation": { - "name": "CatalogSortAggregation", - "items": { - "AllTime": 6, - "Past12Hours": 1, - "Past3Days": 3, - "PastDay": 2, - "PastMonth": 5, - "PastWeek": 4 - } - }, "CatalogSortType": { "name": "CatalogSortType", "items": { - "Bestselling": 7, "MostFavorited": 5, "PriceHighToLow": 2, "PriceLowToHigh": 3, - "RecentlyCreated": 6, + "RecentlyUpdated": 4, "Relevance": 1 } }, @@ -99012,15 +46114,6 @@ "UnsolicitedDialog": 1 } }, - "CharacterControlMode": { - "name": "CharacterControlMode", - "items": { - "Default": 0, - "Legacy": 1, - "LuaCharacterController": 3, - "NoCharacterController": 2 - } - }, "ChatCallbackType": { "name": "ChatCallbackType", "items": { @@ -99054,14 +46147,6 @@ "NoOne": 1 } }, - "ChatRestrictionStatus": { - "name": "ChatRestrictionStatus", - "items": { - "NotRestricted": 1, - "Restricted": 2, - "Unknown": 0 - } - }, "ChatStyle": { "name": "ChatStyle", "items": { @@ -99070,13 +46155,6 @@ "ClassicAndBubble": 2 } }, - "ChatVersion": { - "name": "ChatVersion", - "items": { - "LegacyChatService": 0, - "TextChatService": 1 - } - }, "ClientAnimatorThrottlingMode": { "name": "ClientAnimatorThrottlingMode", "items": { @@ -99085,35 +46163,13 @@ "Enabled": 2 } }, - "CloseReason": { - "name": "CloseReason", - "items": { - "DeveloperShutdown": 2, - "DeveloperUpdate": 3, - "Moderation": 6, - "OutOfMemory": 5, - "RobloxMaintenance": 1, - "ServerEmpty": 4, - "Unknown": 0 - } - }, - "CollaboratorStatus": { - "name": "CollaboratorStatus", - "items": { - "Editing3D": 1, - "None": 0, - "PrivateScripting": 3, - "Scripting": 2 - } - }, "CollisionFidelity": { "name": "CollisionFidelity", "items": { "Box": 2, "Default": 0, "Hull": 1, - "PreciseConvexDecomposition": 3, - "Tunable": 4 + "PreciseConvexDecomposition": 3 } }, "CommandPermission": { @@ -99123,97 +46179,6 @@ "Plugin": 0 } }, - "CompileTarget": { - "name": "CompileTarget", - "items": { - "Client": 0, - "CoreScript": 1, - "CoreScriptRaw": 3, - "Studio": 2 - } - }, - "CompletionAcceptanceBehavior": { - "name": "CompletionAcceptanceBehavior", - "items": { - "Insert": 0, - "InsertOnEnterReplaceOnTab": 3, - "Replace": 1, - "ReplaceOnEnterInsertOnTab": 2 - } - }, - "CompletionItemKind": { - "name": "CompletionItemKind", - "items": { - "Class": 7, - "Color": 16, - "Constant": 21, - "Constructor": 4, - "Enum": 13, - "EnumMember": 20, - "Event": 23, - "Field": 5, - "File": 17, - "Folder": 19, - "Function": 3, - "Interface": 8, - "Keyword": 14, - "Method": 2, - "Module": 9, - "Operator": 24, - "Property": 10, - "Reference": 18, - "Snippet": 15, - "Struct": 22, - "Text": 1, - "TypeParameter": 25, - "Unit": 11, - "Value": 12, - "Variable": 6 - } - }, - "CompletionItemTag": { - "name": "CompletionItemTag", - "items": { - "AddParens": 6, - "ClientServerBoundaryViolation": 9, - "CommandLinePermissions": 4, - "Deprecated": 1, - "IncorrectIndexType": 2, - "Invalidated": 10, - "PluginPermissions": 3, - "PutCursorBeforeEnd": 11, - "PutCursorInParens": 7, - "RobloxPermissions": 5, - "TypeCorrect": 8 - } - }, - "CompletionTriggerKind": { - "name": "CompletionTriggerKind", - "items": { - "Invoked": 1, - "TriggerCharacter": 2, - "TriggerForIncompleteCompletions": 3 - } - }, - "CompositeValueCurveType": { - "name": "CompositeValueCurveType", - "items": { - "ColorHSV": 1, - "ColorRGB": 0, - "NumberRange": 2, - "Rect": 3, - "UDim": 4, - "UDim2": 5, - "Vector2": 6, - "Vector3": 7 - } - }, - "CompressionAlgorithm": { - "name": "CompressionAlgorithm", - "items": { - "Zstd": 0 - } - }, "ComputerCameraMovementMode": { "name": "ComputerCameraMovementMode", "items": { @@ -99232,37 +46197,14 @@ "KeyboardMouse": 1 } }, - "ConfigSnapshotErrorState": { - "name": "ConfigSnapshotErrorState", - "items": { - "LoadFailed": 1, - "None": 0 - } - }, "ConnectionError": { "name": "ConnectionError", "items": { - "AlreadyConnected": 3, - "AndroidAnticheatKick": 304, - "AndroidEmulatorKick": 305, - "AndroidRootedKick": 306, - "ConnectErrors": 2, - "ConnectionBanned": 5, "DisconnectBadhash": 257, "DisconnectBlockedIP": 282, "DisconnectBySecurityPolicy": 281, "DisconnectClientFailure": 284, - "DisconnectClientRequest": 285, "DisconnectCloudEditKick": 270, - "DisconnectCollaboratorNotAgeVerified": 310, - "DisconnectCollaboratorOwnerActionRequired": 312, - "DisconnectCollaboratorPermissionRevoked": 294, - "DisconnectCollaboratorRequestedEviction": 315, - "DisconnectCollaboratorTooManyCollaborators": 313, - "DisconnectCollaboratorTrustedConnectionsRequired": 311, - "DisconnectCollaboratorTrustedConnectionsRequiredPC": 316, - "DisconnectCollaboratorUnderage": 295, - "DisconnectCollaboratorUnknownError": 314, "DisconnectConnectionLost": 277, "DisconnectDevMaintenance": 274, "DisconnectDuplicatePlayer": 264, @@ -99273,54 +46215,21 @@ "DisconnectIdle": 278, "DisconnectIllegalTeleport": 263, "DisconnectLuaKick": 267, - "DisconnectModeratedGame": 287, "DisconnectNewSecurityKeyMismatch": 272, "DisconnectOnRemoteSysStats": 268, - "DisconnectOutOfMemoryKeepPlayingLeave": 292, "DisconnectPlayerless": 271, - "DisconnectPrivateServerKickout": 286, "DisconnectProtocolMismatch": 259, "DisconnectRaknetErrors": 279, "DisconnectReceivePacketError": 260, "DisconnectReceivePacketStreamError": 261, "DisconnectRejoin": 276, - "DisconnectRemoteAttestationBootValidationFailure": 321, - "DisconnectRemoteAttestationGeneralFailure": 318, - "DisconnectRemoteAttestationOSOutOfDate": 320, - "DisconnectRemoteAttestationTimeout": 319, - "DisconnectRemoteAttestationUnsupported": 317, "DisconnectRobloxMaintenance": 275, - "DisconnectRomarkEndOfTest": 293, "DisconnectSecurityKeyMismatch": 258, "DisconnectSendPacketError": 262, "DisconnectTimeout": 266, - "DisconnectTransportIoError": 1025, - "DisconnectTransportIoInternetError": 1026, - "DisconnectTransportNgtcp2Error": 1028, - "DisconnectTransportProtocolError": 1027, - "DisconnectTransportQuicError": 1029, - "DisconnectTransportRnaError": 1030, - "DisconnectVerboselyModeratedGame": 309, "DisconnectWrongVersion": 280, - "DisconnectionNotification": 308, - "IPRecentlyConnected": 8, - "IncompatibleProtocolVersion": 7, - "InvalidPassword": 6, - "NetworkInternal": 296, - "NetworkMisbehavior": 299, - "NetworkSecurity": 300, - "NetworkSend": 297, - "NetworkTimeout": 298, - "NoFreeIncomingConnections": 4, "OK": 0, - "OurSystemRequiresSecurity": 9, - "PhantomFreeze": 303, - "PlacelaunchAgeVerificationRequired": 542, - "PlacelaunchCollaborationCoreGated": 545, - "PlacelaunchCoreGated": 544, - "PlacelaunchCreatorBan": 600, "PlacelaunchCustomMessage": 610, - "PlacelaunchDeviceBlock": 601, "PlacelaunchDisabled": 515, "PlacelaunchError": 516, "PlacelaunchErrors": 512, @@ -99331,20 +46240,10 @@ "PlacelaunchHashExpired": 526, "PlacelaunchHttpError": 529, "PlacelaunchOtherError": 611, - "PlacelaunchParentalApprovalRequired": 543, "PlacelaunchPartyCannotFit": 528, "PlacelaunchRestricted": 523, "PlacelaunchUnauthorized": 524, "PlacelaunchUserLeft": 522, - "PlacelaunchUserPrivacyUnauthorized": 533, - "PlacelaunchVipOwnerNotPresent": 541, - "PlayerRemoved": 291, - "ReplacementReady": 301, - "ReplicatorTimeout": 290, - "ScreentimeLockoutKick": 307, - "SecurityKeyMismatch": 10, - "ServerEmpty": 302, - "ServerShutdown": 288, "TeleportErrors": 768, "TeleportFailure": 769, "TeleportFlooded": 774, @@ -99352,9 +46251,7 @@ "TeleportGameFull": 772, "TeleportGameNotFound": 770, "TeleportIsTeleporting": 775, - "TeleportUnauthorized": 773, - "TransportErrors": 1024, - "Unknown": 1 + "TeleportUnauthorized": 773 } }, "ConnectionState": { @@ -99364,18 +46261,10 @@ "Disconnected": 1 } }, - "ContentSourceType": { - "name": "ContentSourceType", - "items": { - "None": 0, - "Object": 2, - "Opaque": 3, - "Uri": 1 - } - }, "ContextActionPriority": { "name": "ContextActionPriority", "items": { + "Default": 2000, "High": 3000, "Low": 1000, "Medium": 2000 @@ -99399,34 +46288,11 @@ "name": "CoreGuiType", "items": { "All": 4, - "AvatarSwitcher": 8, "Backpack": 2, - "Captures": 7, "Chat": 3, "EmotesMenu": 5, - "ExperienceShop": 9, "Health": 1, - "PlayerList": 0, - "SelfView": 6 - } - }, - "CreateAssetResult": { - "name": "CreateAssetResult", - "items": { - "PermissionDenied": 2, - "Success": 1, - "Unknown": 4, - "UploadFailed": 3 - } - }, - "CreateContentResult": { - "name": "CreateContentResult", - "items": { - "PermissionDenied": 2, - "StorageLimitExceeded": 4, - "Success": 1, - "Unknown": 5, - "UploadFailed": 3 + "PlayerList": 0 } }, "CreateOutfitFailure": { @@ -99444,14 +46310,6 @@ "User": 0 } }, - "CreatorTypeFilter": { - "name": "CreatorTypeFilter", - "items": { - "All": 2, - "Group": 1, - "User": 0 - } - }, "CurrencyType": { "name": "CurrencyType", "items": { @@ -99468,53 +46326,17 @@ "Follow": 2 } }, - "DataModelChangeType": { - "name": "DataModelChangeType", - "items": { - "Add": 0, - "AddPackage": 3, - "Modify": 2, - "Remove": 1 - } - }, - "DataModelExtractorFileType": { - "name": "DataModelExtractorFileType", - "items": { - "FirstSlice": 1, - "NonFirstSlice": 2, - "PlaceFile": 0 - } - }, "DataStoreRequestType": { "name": "DataStoreRequestType", "items": { "GetAsync": 0, "GetSortedAsync": 3, - "GetVersionAsync": 7, - "ListAsync": 6, "OnUpdate": 5, - "OrderedList": 15, - "OrderedRead": 13, - "OrderedRemove": 16, - "OrderedWrite": 14, - "RemoveVersionAsync": 8, "SetIncrementAsync": 1, "SetIncrementSortedAsync": 4, - "StandardList": 11, - "StandardRead": 9, - "StandardRemove": 12, - "StandardWrite": 10, "UpdateAsync": 2 } }, - "DebugBreakModeType": { - "name": "DebugBreakModeType", - "items": { - "Always": 1, - "Never": 0, - "Unhandled": 2 - } - }, "DebuggerEndReason": { "name": "DebuggerEndReason", "items": { @@ -99528,14 +46350,6 @@ "Timeout": 1 } }, - "DebuggerExceptionBreakMode": { - "name": "DebuggerExceptionBreakMode", - "items": { - "Always": 1, - "Never": 0, - "Unhandled": 2 - } - }, "DebuggerFrameType": { "name": "DebuggerFrameType", "items": { @@ -99554,19 +46368,9 @@ "Unknown": 0 } }, - "DebuggerResumeType": { - "name": "DebuggerResumeType", - "items": { - "Resume": 3, - "StepInto": 0, - "StepOut": 1, - "StepOver": 2 - } - }, "DebuggerStatus": { "name": "DebuggerStatus", "items": { - "ConnectionClosed": 8, "ConnectionLost": 2, "InternalError": 4, "InvalidArgument": 7, @@ -99577,13 +46381,6 @@ "Timeout": 1 } }, - "DefaultScriptSyncFileType": { - "name": "DefaultScriptSyncFileType", - "items": { - "Lua": 0, - "Luau": 1 - } - }, "DevCameraOcclusionMode": { "name": "DevCameraOcclusionMode", "items": { @@ -99634,63 +46431,28 @@ "DeveloperMemoryTag": { "name": "DeveloperMemoryTag", "items": { - "Animation": 22, - "BaseParts": 7, - "GeometryCSG": 24, - "GraphicsMeshParts": 10, - "GraphicsParticles": 11, - "GraphicsParts": 12, - "GraphicsSlimModels": 25, + "Animation": 21, + "GraphicsMeshParts": 9, + "GraphicsParticles": 10, + "GraphicsParts": 11, "GraphicsSolidModels": 8, - "GraphicsSpatialHash": 13, - "GraphicsTerrain": 14, - "GraphicsTexture": 15, - "GraphicsTextureCharacter": 16, - "Gui": 21, + "GraphicsSpatialHash": 12, + "GraphicsTerrain": 13, + "GraphicsTexture": 14, + "GraphicsTextureCharacter": 15, + "Gui": 20, "HttpCache": 1, "Instances": 2, "Internal": 0, "LuaHeap": 4, - "Navigation": 23, + "Navigation": 22, "PhysicsCollision": 6, + "PhysicsParts": 7, "Script": 5, "Signals": 3, - "Sounds": 17, - "StreamingSounds": 18, - "TerrainVoxels": 19 - } - }, - "DeviceFeatureType": { - "name": "DeviceFeatureType", - "items": { - "DeviceCapture": 0, - "InExperienceFAE": 1 - } - }, - "DeviceForm": { - "name": "DeviceForm", - "items": { - "Console": 0, - "Desktop": 3, - "Phone": 1, - "Tablet": 2, - "VR": 4 - } - }, - "DeviceLevel": { - "name": "DeviceLevel", - "items": { - "High": 2, - "Low": 0, - "Medium": 1 - } - }, - "DeviceSimulatorScalingMode": { - "name": "DeviceSimulatorScalingMode", - "items": { - "ActualResolution": 1, - "FitToWindow": 2, - "ScaleToPhysicalSize": 0 + "Sounds": 16, + "StreamingSounds": 17, + "TerrainVoxels": 18 } }, "DeviceType": { @@ -99698,7 +46460,6 @@ "items": { "Desktop": 1, "Phone": 3, - "TV": 4, "Tablet": 2, "Unknown": 0 } @@ -99726,53 +46487,6 @@ "Neutral": 0 } }, - "DigitsRigDescriptionSide": { - "name": "DigitsRigDescriptionSide", - "items": { - "Left": 1, - "None": 0, - "Right": 2 - } - }, - "DiscountType": { - "name": "DiscountType", - "items": { - "Uncategorized": 0 - } - }, - "DisplayScalingMode": { - "name": "DisplayScalingMode", - "items": { - "Default": 0, - "Legacy": 1, - "Responsive": 2 - } - }, - "DisplaySize": { - "name": "DisplaySize", - "items": { - "Large": 2, - "Medium": 1, - "Small": 0 - } - }, - "DistanceAttenuationMode": { - "name": "DistanceAttenuationMode", - "items": { - "Custom": 0, - "Inverse": 4, - "InverseTapered": 1, - "Linear": 2, - "LinearSquared": 3 - } - }, - "DomainType": { - "name": "DomainType", - "items": { - "EXPERIENCE": 1, - "OAUTH": 3 - } - }, "DominantAxis": { "name": "DominantAxis", "items": { @@ -99789,36 +46503,6 @@ "ScriptRemoved": 2 } }, - "DragDetectorDragStyle": { - "name": "DragDetectorDragStyle", - "items": { - "BestForDevice": 8, - "RotateAxis": 5, - "RotateTrackball": 6, - "Scriptable": 7, - "TranslateLine": 0, - "TranslateLineOrPlane": 3, - "TranslatePlane": 1, - "TranslatePlaneOrLine": 2, - "TranslateViewPlane": 4 - } - }, - "DragDetectorPermissionPolicy": { - "name": "DragDetectorPermissionPolicy", - "items": { - "Everybody": 1, - "Nobody": 0, - "Scriptable": 2 - } - }, - "DragDetectorResponseStyle": { - "name": "DragDetectorResponseStyle", - "items": { - "Custom": 2, - "Geometric": 0, - "Physical": 1 - } - }, "DraggerCoordinateSpace": { "name": "DraggerCoordinateSpace", "items": { @@ -99833,14 +46517,6 @@ "Physical": 1 } }, - "DraggingScrollBar": { - "name": "DraggingScrollBar", - "items": { - "Horizontal": 1, - "None": 0, - "Vertical": 2 - } - }, "EasingDirection": { "name": "EasingDirection", "items": { @@ -99865,14 +46541,6 @@ "Sine": 1 } }, - "EditableStatus": { - "name": "EditableStatus", - "items": { - "Allowed": 1, - "Disallowed": 2, - "Unknown": 0 - } - }, "ElasticBehavior": { "name": "ElasticBehavior", "items": { @@ -99881,31 +46549,6 @@ "WhenScrollable": 0 } }, - "EmitterPositionType": { - "name": "EmitterPositionType", - "items": { - "Instance": 1, - "Parent": 0 - } - }, - "EngagementLevel": { - "name": "EngagementLevel", - "items": { - "High": 4, - "Inactive": 1, - "Low": 2, - "Medium": 3, - "Unknown": 0 - } - }, - "EngineFolder": { - "name": "EngineFolder", - "items": { - "Logs": 2, - "Screenshots": 0, - "Videos": 1 - } - }, "EnviromentalPhysicsThrottle": { "name": "EnviromentalPhysicsThrottle", "items": { @@ -99918,64 +46561,6 @@ "Skip8": 5 } }, - "ExperienceActivationStatus": { - "name": "ExperienceActivationStatus", - "items": { - "Active": 2, - "Lapsed": 3, - "New": 1, - "Reactivated": 4, - "Unknown": 0 - } - }, - "ExperienceAuthScope": { - "name": "ExperienceAuthScope", - "items": { - "CreatorAssetsCreate": 1, - "DefaultScope": 0 - } - }, - "ExperienceEventStatus": { - "name": "ExperienceEventStatus", - "items": { - "Active": 0, - "Cancelled": 1, - "Moderated": 2, - "Unknown": 4, - "Unpublished": 3 - } - }, - "ExperienceStateCaptureSelectionMode": { - "name": "ExperienceStateCaptureSelectionMode", - "items": { - "Default": 0, - "SafetyHighlightMode": 1 - } - }, - "ExperienceStateRecordingLoadMode": { - "name": "ExperienceStateRecordingLoadMode", - "items": { - "ContiguousSlice": 1, - "NewReplay": 0, - "NoncontiguousSlice": 2 - } - }, - "ExperienceStateRecordingLoadSourceType": { - "name": "ExperienceStateRecordingLoadSourceType", - "items": { - "File": 1, - "S3Url": 0 - } - }, - "ExperienceStateRecordingPlaybackMode": { - "name": "ExperienceStateRecordingPlaybackMode", - "items": { - "Playing": 2, - "Rewinding": 3, - "Stopped": 1, - "Undefined": 0 - } - }, "ExplosionType": { "name": "ExplosionType", "items": { @@ -99983,108 +46568,6 @@ "NoCraters": 0 } }, - "ExternalEditorMode": { - "name": "ExternalEditorMode", - "items": { - "SystemDefault": 0, - "UserSelectedEditor": 1 - } - }, - "FACSDataLod": { - "name": "FACSDataLod", - "items": { - "LOD0": 0, - "LOD1": 1, - "LODCount": 2 - } - }, - "FacialAgeEstimationResultType": { - "name": "FacialAgeEstimationResultType", - "items": { - "Cancel": 1, - "Complete": 0, - "Error": 2 - } - }, - "FacialAnimationStreamingState": { - "name": "FacialAnimationStreamingState", - "items": { - "Audio": 1, - "None": 0, - "Place": 4, - "Server": 8, - "Video": 2 - } - }, - "FacsActionUnit": { - "name": "FacsActionUnit", - "items": { - "ChinRaiser": 1, - "ChinRaiserUpperLip": 0, - "Corrugator": 28, - "EyesLookDown": 37, - "EyesLookLeft": 38, - "EyesLookRight": 40, - "EyesLookUp": 39, - "FlatPucker": 2, - "Funneler": 3, - "JawDrop": 25, - "JawLeft": 26, - "JawRight": 27, - "LeftBrowLowerer": 29, - "LeftCheekPuff": 11, - "LeftCheekRaiser": 41, - "LeftDimpler": 12, - "LeftEyeClosed": 43, - "LeftEyeUpperLidRaiser": 42, - "LeftInnerBrowRaiser": 32, - "LeftLipCornerDown": 13, - "LeftLipCornerPuller": 15, - "LeftLipStretcher": 16, - "LeftLowerLipDepressor": 14, - "LeftNoseWrinkler": 31, - "LeftOuterBrowRaiser": 30, - "LeftUpperLipRaiser": 17, - "LipPresser": 5, - "LipsTogether": 6, - "LowerLipSuck": 4, - "MouthLeft": 7, - "MouthRight": 8, - "Pucker": 9, - "RightBrowLowerer": 33, - "RightCheekPuff": 18, - "RightCheekRaiser": 44, - "RightDimpler": 19, - "RightEyeClosed": 46, - "RightEyeUpperLidRaiser": 45, - "RightInnerBrowRaiser": 35, - "RightLipCornerDown": 20, - "RightLipCornerPuller": 22, - "RightLipStretcher": 23, - "RightLowerLipDepressor": 21, - "RightNoseWrinkler": 36, - "RightOuterBrowRaiser": 34, - "RightUpperLipRaiser": 24, - "TongueDown": 47, - "TongueOut": 48, - "TongueUp": 49, - "UpperLipSuck": 10 - } - }, - "FeatureRestrictionAbuseVector": { - "name": "FeatureRestrictionAbuseVector", - "items": { - "Communication": 1, - "ExperienceChat": 0 - } - }, - "FeedbackType": { - "name": "FeedbackType", - "items": { - "Feedback": 0, - "PlayerSupport": 1 - } - }, "FieldOfViewMode": { "name": "FieldOfViewMode", "items": { @@ -100100,30 +46583,6 @@ "Vertical": 1 } }, - "FilterErrorType": { - "name": "FilterErrorType", - "items": { - "BackslashNotEscapingAnything": 0, - "BadBespokeFilter": 1, - "BadName": 2, - "IncompleteOr": 3, - "IncompleteParenthesis": 4, - "InvalidDoubleStar": 5, - "InvalidTilde": 6, - "PropertyBadOperator": 7, - "PropertyDoesNotExist": 8, - "PropertyInvalidField": 9, - "PropertyInvalidValue": 10, - "PropertyUnsupportedFields": 11, - "PropertyUnsupportedProperty": 12, - "UnexpectedNameIndex": 13, - "UnexpectedToken": 14, - "UnfinishedBinaryOperator": 15, - "UnfinishedQuote": 16, - "UnknownBespokeFilter": 17, - "WildcardInProperty": 18 - } - }, "FilterResult": { "name": "FilterResult", "items": { @@ -100131,36 +46590,6 @@ "Rejected": 1 } }, - "FilterType": { - "name": "FilterType", - "items": { - "Exclude": 0, - "Include": 1 - } - }, - "FinishRecordingOperation": { - "name": "FinishRecordingOperation", - "items": { - "Append": 2, - "Cancel": 0, - "Commit": 1 - } - }, - "FluidFidelity": { - "name": "FluidFidelity", - "items": { - "Automatic": 0, - "UseCollisionGeometry": 1, - "UsePreciseGeometry": 2 - } - }, - "FluidForces": { - "name": "FluidForces", - "items": { - "Default": 0, - "Experimental": 1 - } - }, "Font": { "name": "Font", "items": { @@ -100169,14 +46598,8 @@ "Arcade": 13, "Arial": 1, "ArialBold": 2, - "Arimo": 50, - "ArimoBold": 51, "Bangers": 22, "Bodoni": 7, - "BuilderSans": 46, - "BuilderSansBold": 48, - "BuilderSansExtraBold": 49, - "BuilderSansMedium": 47, "Cartoon": 9, "Code": 10, "Creepster": 23, @@ -100188,7 +46611,7 @@ "Gotham": 17, "GothamBlack": 20, "GothamBold": 19, - "GothamMedium": 18, + "GothamSemibold": 18, "GrenzeGotisch": 27, "Highway": 11, "IndieFlower": 28, @@ -100215,8 +46638,7 @@ "SourceSansSemibold": 16, "SpecialElite": 43, "TitilliumWeb": 44, - "Ubuntu": 45, - "Unknown": 100 + "Ubuntu": 45 } }, "FontSize": { @@ -100239,34 +46661,6 @@ "Size96": 14 } }, - "FontStyle": { - "name": "FontStyle", - "items": { - "Italic": 1, - "Normal": 0 - } - }, - "FontWeight": { - "name": "FontWeight", - "items": { - "Bold": 700, - "ExtraBold": 800, - "ExtraLight": 200, - "Heavy": 900, - "Light": 300, - "Medium": 500, - "Regular": 400, - "SemiBold": 600, - "Thin": 100 - } - }, - "ForceLimitMode": { - "name": "ForceLimitMode", - "items": { - "Magnitude": 0, - "PerAxis": 1 - } - }, "FormFactor": { "name": "FormFactor", "items": { @@ -100315,72 +46709,6 @@ "Unknown": 0 } }, - "FriendsCallingEndReason": { - "name": "FriendsCallingEndReason", - "items": { - "Canceled": 6, - "Declined": 4, - "Failed": 5, - "LocalHangup": 1, - "Missed": 3, - "None": 0, - "RemoteHangup": 2 - } - }, - "FriendsCallingParticipantErrors": { - "name": "FriendsCallingParticipantErrors", - "items": { - "ConnectionFailed": 2, - "None": 0, - "PermissionDenied": 4, - "PublishFailed": 3, - "Unknown": 1 - } - }, - "FriendsCallingParticipantLeaveReason": { - "name": "FriendsCallingParticipantLeaveReason", - "items": { - "Declined": 2, - "Failed": 5, - "Hangup": 1, - "Missed": 3, - "None": 0, - "Removed": 4, - "TimedOut": 6 - } - }, - "FriendsCallingParticipantStatus": { - "name": "FriendsCallingParticipantStatus", - "items": { - "Declined": 3, - "Ineligible": 6, - "Invited": 0, - "Joined": 2, - "Left": 4, - "Muted": 8, - "Removed": 5, - "Ringing": 1, - "TimedOut": 7 - } - }, - "FriendsCallingPhase": { - "name": "FriendsCallingPhase", - "items": { - "Active": 2, - "Ended": 3, - "Idle": 0, - "Ringing": 1 - } - }, - "FrustumStreamingMode": { - "name": "FrustumStreamingMode", - "items": { - "Automatic": 3, - "Default": 0, - "Disabled": 2, - "Enabled": 1 - } - }, "FunctionalTestResult": { "name": "FunctionalTestResult", "items": { @@ -100397,15 +46725,6 @@ "R6": 0 } }, - "GamepadType": { - "name": "GamepadType", - "items": { - "PS4": 1, - "PS5": 2, - "Unknown": 0, - "XboxOne": 3 - } - }, "GearGenreSetting": { "name": "GearGenreSetting", "items": { @@ -100427,15 +46746,6 @@ "Transport": 8 } }, - "GenerateMomentTextResult": { - "name": "GenerateMomentTextResult", - "items": { - "Failed": 2, - "Filtered": 3, - "Pending": 1, - "Success": 0 - } - }, "Genre": { "name": "Genre", "items": { @@ -100455,70 +46765,17 @@ "WildWest": 10 } }, - "GradientTileMode": { - "name": "GradientTileMode", - "items": { - "Clamp": 0, - "Mirror": 2, - "Repeat": 1 - } - }, - "GradientType": { - "name": "GradientType", - "items": { - "Conical": 2, - "Elliptical": 3, - "Linear": 0, - "Radial": 1 - } - }, "GraphicsMode": { "name": "GraphicsMode", "items": { "Automatic": 1, "Direct3D11": 2, "Metal": 5, - "NoGraphics": 9, + "NoGraphics": 7, "OpenGL": 4, "Vulkan": 6 } }, - "GraphicsOptimizationMode": { - "name": "GraphicsOptimizationMode", - "items": { - "Balanced": 1, - "Performance": 0, - "Quality": 2 - } - }, - "GroupMembershipStatus": { - "name": "GroupMembershipStatus", - "items": { - "AlreadyMember": 3, - "JoinRequestPending": 2, - "Joined": 1, - "None": 0 - } - }, - "GuiState": { - "name": "GuiState", - "items": { - "Hover": 1, - "Idle": 0, - "NonInteractable": 3, - "Press": 2 - } - }, - "GuiType": { - "name": "GuiType", - "items": { - "Core": 0, - "CoreBillboards": 4, - "Custom": 1, - "CustomBillboards": 3, - "PlayerNameplates": 2 - } - }, "HandlesStyle": { "name": "HandlesStyle", "items": { @@ -100526,32 +46783,11 @@ "Resize": 0 } }, - "HapticEffectType": { - "name": "HapticEffectType", - "items": { - "Custom": 0, - "GameplayCollision": 5, - "GameplayExplosion": 4, - "UIClick": 2, - "UIHover": 1, - "UINotification": 3 - } - }, - "HashAlgorithm": { - "name": "HashAlgorithm", - "items": { - "Blake2b": 0, - "Blake3": 1, - "Md5": 2, - "Sha1": 3, - "Sha256": 4 - } - }, "HighlightDepthMode": { "name": "HighlightDepthMode", "items": { "AlwaysOnTop": 0, - "Occluded": 1 + "Default": 1 } }, "HorizontalAlignment": { @@ -100582,13 +46818,6 @@ "None": 0 } }, - "HttpCompression": { - "name": "HttpCompression", - "items": { - "Gzip": 1, - "None": 0 - } - }, "HttpContentType": { "name": "HttpContentType", "items": { @@ -100604,21 +46833,15 @@ "items": { "Aborted": 9, "ConnectFail": 3, - "ConnectionClosed": 13, - "CreatorEnvironmentsNotSupportedByService": 15, "DnsResolve": 2, - "InactivityTimeout": 16, - "InvalidRangeResponse": 18, "InvalidRedirect": 7, "InvalidUrl": 1, "NetFail": 8, "OK": 0, "OutOfMemory": 4, - "ServerProtocolError": 14, "SslConnectFail": 10, "SslVerificationFail": 11, "TimedOut": 5, - "TooManyOutstandingRequests": 17, "TooManyRedirects": 6, "Unknown": 12 } @@ -100658,6 +46881,14 @@ "DisplayWhenDamaged": 0 } }, + "HumanoidOnlySetCollisionsOnStateChange": { + "name": "HumanoidOnlySetCollisionsOnStateChange", + "items": { + "Default": 0, + "Disabled": 1, + "Enabled": 2 + } + }, "HumanoidRigType": { "name": "HumanoidRigType", "items": { @@ -100695,53 +46926,17 @@ "OtherMechanismsAnchored": 1 } }, - "IKControlConstraintSupport": { - "name": "IKControlConstraintSupport", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "IKControlType": { - "name": "IKControlType", - "items": { - "LookAt": 3, - "Position": 1, - "Rotation": 2, - "Transform": 0 - } - }, "IXPLoadingStatus": { "name": "IXPLoadingStatus", "items": { - "ErrorConnection": 4, - "ErrorInvalidUser": 3, - "ErrorJsonParse": 5, - "ErrorTimedOut": 6, + "ErrorConnection": 5, + "ErrorInvalidUser": 4, + "ErrorJsonParse": 6, + "ErrorTimedOut": 7, "Initialized": 2, "None": 0, - "Pending": 1 - } - }, - "ImageAlphaType": { - "name": "ImageAlphaType", - "items": { - "Default": 1, - "LockCanvasAlpha": 2, - "LockCanvasColor": 3 - } - }, - "ImageCombineType": { - "name": "ImageCombineType", - "items": { - "Add": 3, - "AlphaBlend": 5, - "BlendSourceOver": 1, - "Multiply": 4, - "NormalMapBlend": 6, - "Overwrite": 2, - "Subtract": 7 + "Pending": 1, + "ShutOff": 3 } }, "InOut": { @@ -100772,31 +46967,6 @@ "Top": 0 } }, - "InputActionType": { - "name": "InputActionType", - "items": { - "Bool": 0, - "Direction1D": 1, - "Direction2D": 2, - "Direction3D": 3, - "ViewportPosition": 4 - } - }, - "InputBindingType": { - "name": "InputBindingType", - "items": { - "Automatic": 0, - "Scriptable": 1 - } - }, - "InputSink": { - "name": "InputSink", - "items": { - "Activate": 1, - "All": 100, - "None": 0 - } - }, "InputType": { "name": "InputType", "items": { @@ -100805,35 +46975,6 @@ "Sin": 13 } }, - "InstanceFileSyncStatus": { - "name": "InstanceFileSyncStatus", - "items": { - "AncestorErrored": 4, - "Errored": 1, - "NotSynced": 0, - "SyncedAsDescendant": 3, - "SyncedAsRoot": 2 - } - }, - "IntentReplicability": { - "name": "IntentReplicability", - "items": {} - }, - "IntermediateMeshGenerationResult": { - "name": "IntermediateMeshGenerationResult", - "items": { - "HighQualityMesh": 0 - } - }, - "InternalVideoUsage": { - "name": "InternalVideoUsage", - "items": { - "Default": 0, - "FeatureTileAd": 3, - "HomeCarousel": 2, - "WatchPage": 1 - } - }, "InterpolationThrottlingMode": { "name": "InterpolationThrottlingMode", "items": { @@ -100842,31 +46983,6 @@ "Enabled": 2 } }, - "InviteState": { - "name": "InviteState", - "items": { - "Accepted": 1, - "Declined": 2, - "Missed": 3, - "Placed": 0 - } - }, - "ItemLineAlignment": { - "name": "ItemLineAlignment", - "items": { - "Automatic": 0, - "Center": 2, - "End": 3, - "Start": 1, - "Stretch": 4 - } - }, - "JoinSource": { - "name": "JoinSource", - "items": { - "CreatedItemAttribution": 1 - } - }, "JointCreationMode": { "name": "JointCreationMode", "items": { @@ -100889,20 +47005,14 @@ "Break": 318, "ButtonA": 1002, "ButtonB": 1003, - "ButtonBack": 1052, - "ButtonCenter": 1051, - "ButtonDown": 1054, "ButtonL1": 1005, "ButtonL2": 1007, "ButtonL3": 1009, - "ButtonLeft": 1055, "ButtonR1": 1004, "ButtonR2": 1006, "ButtonR3": 1008, - "ButtonRight": 1056, "ButtonSelect": 1011, "ButtonStart": 1010, - "ButtonUp": 1053, "ButtonX": 1000, "ButtonY": 1001, "C": 99, @@ -100986,19 +47096,8 @@ "Menu": 319, "Minus": 45, "Mode": 313, - "MouseBackButton": 1029, - "MouseDelta": 1048, - "MouseLeftButton": 1026, - "MouseMiddleButton": 1028, - "MouseNoButton": 1030, - "MousePosition": 1033, - "MouseRightButton": 1027, - "MouseWheel": 1035, - "MouseX": 1031, - "MouseY": 1032, "N": 110, "Nine": 57, - "None": 0, "NumLock": 300, "O": 111, "One": 49, @@ -101039,25 +47138,13 @@ "Tab": 9, "Three": 51, "Thumbstick1": 1016, - "Thumbstick1Down": 1019, - "Thumbstick1Left": 1020, - "Thumbstick1Right": 1021, - "Thumbstick1Up": 1018, "Thumbstick2": 1017, - "Thumbstick2Down": 1023, - "Thumbstick2Left": 1024, - "Thumbstick2Right": 1025, - "Thumbstick2Up": 1022, "Tilde": 126, - "TouchDelta": 1049, - "TouchPinch": 1050, - "TouchPosition": 1034, - "TrackpadPan": 1040, - "TrackpadPinch": 1045, "Two": 50, "U": 117, "Underscore": 95, "Undo": 322, + "Unknown": 0, "Up": 273, "V": 118, "W": 119, @@ -101163,13 +47250,6 @@ "Zero": 48 } }, - "KeyCodeStringFormat": { - "name": "KeyCodeStringFormat", - "items": { - "Abbreviated": 1, - "Default": 0 - } - }, "KeyInterpolationMode": { "name": "KeyInterpolationMode", "items": { @@ -101185,10 +47265,10 @@ "Include": 0 } }, - "KnownWindow": { - "name": "KnownWindow", + "Language": { + "name": "Language", "items": { - "Main": 0 + "Default": 0 } }, "LeftRight": { @@ -101199,35 +47279,12 @@ "Right": 2 } }, - "LexemeType": { - "name": "LexemeType", + "LevelOfDetailSetting": { + "name": "LevelOfDetailSetting", "items": { - "And": 4, - "Colon": 12, - "Dot": 13, - "DoubleStar": 17, - "Eof": 0, - "Equal": 6, - "GreaterThan": 8, - "GreaterThanEqual": 9, - "LeftParenthesis": 14, - "LessThan": 10, - "LessThanEqual": 11, - "Name": 1, - "Number": 3, - "Or": 5, - "QuotedString": 2, - "ReservedSpecial": 18, - "RightParenthesis": 15, - "Star": 16, - "TildeEqual": 7 - } - }, - "LightingStyle": { - "name": "LightingStyle", - "items": { - "Realistic": 0, - "Soft": 1 + "High": 2, + "Low": 0, + "Medium": 1 } }, "Limb": { @@ -101257,22 +47314,6 @@ "Vertical": 1 } }, - "ListenerLocation": { - "name": "ListenerLocation", - "items": { - "Camera": 3, - "Character": 2, - "Default": 0, - "None": 1 - } - }, - "ListenerPositionType": { - "name": "ListenerPositionType", - "items": { - "Instance": 1, - "Parent": 0 - } - }, "ListenerType": { "name": "ListenerType", "items": { @@ -101282,23 +47323,6 @@ "ObjectPosition": 2 } }, - "LiveEditingAtomicUpdateResponse": { - "name": "LiveEditingAtomicUpdateResponse", - "items": { - "FailureGuidNotFound": 1, - "FailureHashMismatch": 2, - "FailureOperationIllegal": 3, - "Success": 0 - } - }, - "LiveEditingBroadcastMessageType": { - "name": "LiveEditingBroadcastMessageType", - "items": { - "Error": 2, - "Normal": 0, - "Warning": 1 - } - }, "LoadCharacterLayeredClothing": { "name": "LoadCharacterLayeredClothing", "items": { @@ -101307,87 +47331,6 @@ "Enabled": 2 } }, - "LoadDynamicHeads": { - "name": "LoadDynamicHeads", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "LocationType": { - "name": "LocationType", - "items": { - "Camera": 1, - "Character": 0, - "ObjectPosition": 2 - } - }, - "LuauTypeCheckMode": { - "name": "LuauTypeCheckMode", - "items": { - "Default": 0, - "NoCheck": 1, - "Nonstrict": 2, - "Strict": 3 - } - }, - "MakeupType": { - "name": "MakeupType", - "items": { - "Eye": 2, - "Face": 0, - "Lip": 1 - } - }, - "MarketplaceBulkPurchasePromptStatus": { - "name": "MarketplaceBulkPurchasePromptStatus", - "items": { - "Aborted": 2, - "Completed": 1, - "Error": 3 - } - }, - "MarketplaceItemPurchaseStatus": { - "name": "MarketplaceItemPurchaseStatus", - "items": { - "AlreadyOwned": 3, - "InsufficientMembership": 12, - "InsufficientRobux": 4, - "NotAvailableForPurchaser": 8, - "NotForSale": 7, - "PlaceInvalid": 13, - "PriceMismatch": 9, - "PurchaserIsSeller": 11, - "QuantityLimitExceeded": 5, - "QuotaExceeded": 6, - "SoldOut": 10, - "Success": 1, - "SystemError": 2 - } - }, - "MarketplaceProductType": { - "name": "MarketplaceProductType", - "items": { - "AvatarAsset": 1, - "AvatarBundle": 2 - } - }, - "MarkupKind": { - "name": "MarkupKind", - "items": { - "Markdown": 1, - "PlainText": 0 - } - }, - "MatchmakingType": { - "name": "MatchmakingType", - "items": { - "Default": 1, - "PlayStationOnly": 3, - "XboxOnly": 2 - } - }, "Material": { "name": "Material", "items": { @@ -101395,10 +47338,6 @@ "Asphalt": 1376, "Basalt": 788, "Brick": 848, - "Cardboard": 2304, - "Carpet": 2305, - "CeramicTiles": 2306, - "ClayRoofTiles": 2307, "Cobblestone": 880, "Concrete": 816, "CorrodedMetal": 1040, @@ -101414,7 +47353,6 @@ "Ground": 1360, "Ice": 1536, "LeafyGrass": 1284, - "Leather": 2309, "Limestone": 820, "Marble": 784, "Metal": 1088, @@ -101422,11 +47360,8 @@ "Neon": 288, "Pavement": 836, "Pebble": 864, - "Plaster": 2310, "Plastic": 256, "Rock": 896, - "RoofShingles": 2308, - "Rubber": 2311, "Salt": 1392, "Sand": 1296, "Sandstone": 912, @@ -101438,13 +47373,6 @@ "WoodPlanks": 528 } }, - "MaterialPattern": { - "name": "MaterialPattern", - "items": { - "Organic": 1, - "Regular": 0 - } - }, "MembershipType": { "name": "MembershipType", "items": { @@ -101455,47 +47383,14 @@ "TurboBuildersClub": 2 } }, - "MergeResolution": { - "name": "MergeResolution", - "items": { - "Manual": 3, - "None": 0, - "UseSource": 1, - "UseTarget": 2 - } - }, - "MergeStatus": { - "name": "MergeStatus", - "items": { - "Loading": 1, - "Merging": 2, - "None": 0 - } - }, - "MeshAttribute": { - "name": "MeshAttribute", - "items": { - "Color": 2, - "Face": 4, - "Normal": 1, - "UV": 3, - "Vertex": 0 - } - }, "MeshPartDetailLevel": { "name": "MeshPartDetailLevel", "items": { "DistanceBased": 0, - "Level00": 1, - "Level01": 2, - "Level02": 3, - "Level03": 4, - "Level04": 5, - "Level05": 6, - "Level06": 7, - "Level07": 8, - "Level08": 9, - "Level09": 10 + "Level01": 1, + "Level02": 2, + "Level03": 3, + "Level04": 4 } }, "MeshPartHeadsAndAccessories": { @@ -101548,62 +47443,9 @@ "items": { "Automatic": 0, "Disabled": 2, - "SLIM": 4, "StreamingMesh": 1 } }, - "ModelStreamingBehavior": { - "name": "ModelStreamingBehavior", - "items": { - "Default": 0, - "Improved": 2, - "Legacy": 1 - } - }, - "ModelStreamingMode": { - "name": "ModelStreamingMode", - "items": { - "Atomic": 1, - "Default": 0, - "Nonatomic": 4, - "Persistent": 2, - "PersistentPerPlayer": 3 - } - }, - "ModerationResultCategory": { - "name": "ModerationResultCategory", - "items": { - "Borderline": 1, - "NoViolationDetected": 2, - "ViolationDetected": 0 - } - }, - "ModerationResultLabel": { - "name": "ModerationResultLabel", - "items": { - "ChildExploitation": 0, - "DiscriminationSlursAndHateSpeech": 4, - "IllegalAndRegulatedGoodsAndActivities": 8, - "Other": 100, - "Profanity": 9, - "RealWorldSensitiveEvents": 5, - "RomanticAndSexualContent": 7, - "SuicideSelfInjuryAndHarmfulBehavior": 1, - "TerrorismAndViolentExtremism": 3, - "ThreatsBullyingAndHarassment": 2, - "ViolentContentAndGore": 6 - } - }, - "ModerationStatus": { - "name": "ModerationStatus", - "items": { - "Invalid": 5, - "NotApplicable": 4, - "NotReviewed": 3, - "ReviewedApproved": 1, - "ReviewedRejected": 2 - } - }, "ModifierKey": { "name": "ModifierKey", "items": { @@ -101631,13 +47473,6 @@ "Stopping": 3 } }, - "MuteState": { - "name": "MuteState", - "items": { - "Muted": 1, - "Unmuted": 0 - } - }, "NameOcclusion": { "name": "NameOcclusion", "items": { @@ -101646,14 +47481,6 @@ "OccludeAll": 2 } }, - "NegateOperationHiddenHistory": { - "name": "NegateOperationHiddenHistory", - "items": { - "NegatedIntersection": 2, - "NegatedUnion": 1, - "None": 0 - } - }, "NetworkOwnership": { "name": "NetworkOwnership", "items": { @@ -101662,18 +47489,12 @@ "OnContact": 2 } }, - "NetworkStatus": { - "name": "NetworkStatus", + "NewAnimationRuntimeSetting": { + "name": "NewAnimationRuntimeSetting", "items": { - "Connected": 1, - "Disconnected": 2, - "Unknown": 0 - } - }, - "NoiseType": { - "name": "NoiseType", - "items": { - "SimplexGabor": 0 + "Default": 0, + "Disabled": 1, + "Enabled": 2 } }, "NormalId": { @@ -101687,23 +47508,6 @@ "Top": 1 } }, - "NotificationButtonType": { - "name": "NotificationButtonType", - "items": { - "Primary": 0, - "Secondary": 1 - } - }, - "OperationType": { - "name": "OperationType", - "items": { - "Intersection": 3, - "Null": 0, - "Primitive": 4, - "Subtraction": 2, - "Union": 1 - } - }, "OrientationAlignmentMode": { "name": "OrientationAlignmentMode", "items": { @@ -101719,16 +47523,6 @@ "Purchased": 3 } }, - "OutfitType": { - "name": "OutfitType", - "items": { - "All": 1, - "Avatar": 2, - "DynamicHead": 3, - "Makeup": 5, - "Shoes": 4 - } - }, "OutputLayoutMode": { "name": "OutputLayoutMode", "items": { @@ -101755,22 +47549,13 @@ "UseView": 3 } }, - "PageMilestoneType": { - "name": "PageMilestoneType", + "PacketPriority": { + "name": "PacketPriority", "items": { - "FunctionallyReady": 2, - "Interactive": 0, - "SurfaceMounted": 1, - "SurfaceReady": 3 - } - }, - "PageType": { - "name": "PageType", - "items": { - "AvatarEditor": 0, - "AvatarMarketplace": 3, - "ExperienceDetail": 2, - "Party": 1 + "HIGH_PRIORITY": 1, + "IMMEDIATE_PRIORITY": 0, + "LOW_PRIORITY": 3, + "MEDIUM_PRIORITY": 2 } }, "PartType": { @@ -101778,9 +47563,7 @@ "items": { "Ball": 0, "Block": 1, - "CornerWedge": 4, - "Cylinder": 2, - "Wedge": 3 + "Cylinder": 2 } }, "ParticleEmitterShape": { @@ -101807,33 +47590,6 @@ "Volume": 0 } }, - "ParticleFlipbookLayout": { - "name": "ParticleFlipbookLayout", - "items": { - "Custom": 4, - "Grid2x2": 1, - "Grid4x4": 2, - "Grid8x8": 3, - "None": 0 - } - }, - "ParticleFlipbookMode": { - "name": "ParticleFlipbookMode", - "items": { - "Loop": 0, - "OneShot": 1, - "PingPong": 2, - "Random": 3 - } - }, - "ParticleFlipbookTextureCompatible": { - "name": "ParticleFlipbookTextureCompatible", - "items": { - "Compatible": 1, - "NotCompatible": 0, - "Unknown": 2 - } - }, "ParticleOrientation": { "name": "ParticleOrientation", "items": { @@ -101857,35 +47613,10 @@ "PathWaypointAction": { "name": "PathWaypointAction", "items": { - "Custom": 2, "Jump": 1, "Walk": 0 } }, - "PathfindingUseImprovedSearch": { - "name": "PathfindingUseImprovedSearch", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "PeoplePageLayout": { - "name": "PeoplePageLayout", - "items": { - "Card": 0, - "List": 1 - } - }, - "PerformanceOverlayMode": { - "name": "PerformanceOverlayMode", - "items": { - "Decals": 2, - "Lights": 3, - "Overdraw": 0, - "Transparent": 1 - } - }, "PermissionLevelShown": { "name": "PermissionLevelShown", "items": { @@ -101896,13 +47627,6 @@ "Studio": 3 } }, - "PhysicalConstraintType": { - "name": "PhysicalConstraintType", - "items": { - "AnimationConstraint": 0, - "Motor6D": 1 - } - }, "PhysicsSimulationRate": { "name": "PhysicsSimulationRate", "items": { @@ -101919,39 +47643,6 @@ "Fixed": 1 } }, - "PinExperienceStatus": { - "name": "PinExperienceStatus", - "items": { - "AlreadyExists": 2, - "Failure": 1, - "Success": 0 - } - }, - "PioneerSource": { - "name": "PioneerSource", - "items": { - "DaveyBazooka": 1, - "Oof": 2, - "Roblox": 0 - } - }, - "PlaceContentPreference": { - "name": "PlaceContentPreference", - "items": { - "All": 1, - "MentionsAndReplies": 2, - "None": 0, - "Unknown": 3 - } - }, - "PlacePublishType": { - "name": "PlacePublishType", - "items": { - "None": 0, - "Publish": 1, - "Save": 2 - } - }, "Platform": { "name": "Platform", "items": { @@ -101962,17 +47653,14 @@ "DOS": 16, "IOS": 2, "Linux": 13, - "MetaOS": 20, "NX": 9, - "None": 22, + "None": 19, "OSX": 1, "Ouya": 10, "PS3": 6, "PS4": 5, - "PS5": 19, "SteamOS": 14, "UWP": 18, - "Web": 21, "WebOS": 15, "WiiU": 8, "Windows": 0, @@ -102001,14 +47689,6 @@ "CharacterRight": 3 } }, - "PlayerCharacterDestroyBehavior": { - "name": "PlayerCharacterDestroyBehavior", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, "PlayerChatType": { "name": "PlayerChatType", "items": { @@ -102017,56 +47697,6 @@ "Whisper": 2 } }, - "PlayerDataErrorState": { - "name": "PlayerDataErrorState", - "items": { - "FlushFailed": 1, - "LoadFailed": 0, - "None": 3, - "ReleaseFailed": 2 - } - }, - "PlayerDataLoadFailureBehavior": { - "name": "PlayerDataLoadFailureBehavior", - "items": { - "Failure": 0, - "FallbackToDefault": 1, - "Kick": 2 - } - }, - "PlayerExitReason": { - "name": "PlayerExitReason", - "items": { - "CreatorKick": 2, - "PlatformKick": 1, - "Unknown": 0 - } - }, - "PlayerPlatformActivationStatus": { - "name": "PlayerPlatformActivationStatus", - "items": { - "Active": 2, - "Lapsed": 3, - "New": 1, - "Reactivated": 4, - "Unknown": 0 - } - }, - "PlayerPlatformSpenderStatus": { - "name": "PlayerPlatformSpenderStatus", - "items": { - "Active": 1, - "OtherPayer": 2, - "Unknown": 0 - } - }, - "PluginConnectionTargetType": { - "name": "PluginConnectionTargetType", - "items": { - "Edit": 0, - "Test": 1 - } - }, "PoseEasingDirection": { "name": "PoseEasingDirection", "items": { @@ -102081,7 +47711,6 @@ "Bounce": 4, "Constant": 1, "Cubic": 3, - "CubicV2": 5, "Elastic": 2, "Linear": 0 } @@ -102093,76 +47722,6 @@ "TwoAttachment": 1 } }, - "PredictionMode": { - "name": "PredictionMode", - "items": { - "Automatic": 0, - "Off": 2, - "On": 1 - } - }, - "PredictionStatus": { - "name": "PredictionStatus", - "items": { - "Authoritative": 0, - "None": 2, - "Predicted": 1 - } - }, - "PredictiveStreamingMode": { - "name": "PredictiveStreamingMode", - "items": { - "Default": 0, - "Disabled": 2, - "Enabled": 1 - } - }, - "PreferredInput": { - "name": "PreferredInput", - "items": { - "Gamepad": 1, - "KeyboardAndMouse": 0, - "MicroGamepad": 3, - "Touch": 2 - } - }, - "PreferredTextSize": { - "name": "PreferredTextSize", - "items": { - "Large": 2, - "Larger": 3, - "Largest": 4, - "Medium": 1 - } - }, - "PrefetchDownloadStatus": { - "name": "PrefetchDownloadStatus", - "items": { - "Completed": 2, - "Failed": 3, - "InProgress": 1, - "NotStarted": 0 - } - }, - "PrimalPhysicsSolver": { - "name": "PrimalPhysicsSolver", - "items": { - "Default": 0, - "Disabled": 2, - "Experimental": 1 - } - }, - "PrimitiveType": { - "name": "PrimitiveType", - "items": { - "Ball": 1, - "Block": 3, - "CornerWedge": 5, - "Cylinder": 2, - "Null": 0, - "Wedge": 4 - } - }, "PrivilegeType": { "name": "PrivilegeType", "items": { @@ -102181,15 +47740,6 @@ "AvatarShop": 0 } }, - "ProductPurchaseChannel": { - "name": "ProductPurchaseChannel", - "items": { - "AdReward": 3, - "CommerceProduct": 4, - "ExperienceDetailsPage": 2, - "InExperience": 1 - } - }, "ProductPurchaseDecision": { "name": "ProductPurchaseDecision", "items": { @@ -102197,104 +47747,6 @@ "PurchaseGranted": 1 } }, - "ProjectServiceOperationResult": { - "name": "ProjectServiceOperationResult", - "items": {} - }, - "PromptCreateAssetResult": { - "name": "PromptCreateAssetResult", - "items": { - "ModeratedName": 8, - "NoUserInput": 5, - "PermissionDenied": 2, - "PurchaseFailure": 9, - "Success": 1, - "Timeout": 3, - "TokenInvalid": 10, - "UGCValidationFailed": 7, - "UnknownFailure": 6, - "UploadFailed": 4 - } - }, - "PromptCreateAvatarResult": { - "name": "PromptCreateAvatarResult", - "items": { - "InvalidHumanoidDescription": 6, - "MaxOutfits": 9, - "ModeratedName": 8, - "NoUserInput": 5, - "PermissionDenied": 2, - "PurchaseFailure": 10, - "Success": 1, - "Timeout": 3, - "TokenInvalid": 12, - "UGCValidationFailed": 7, - "UnknownFailure": 11, - "UploadFailed": 4 - } - }, - "PromptCreateOutfitResult": { - "name": "PromptCreateOutfitResult", - "items": { - "CreationFailure": 3, - "NoUserInput": 6, - "PartialSuccess": 2, - "PermissionDenied": 4, - "Success": 1, - "Timeout": 5, - "UGCValidationFailed": 8, - "UnknownFailure": 7 - } - }, - "PromptCreatePlatformContentResult": { - "name": "PromptCreatePlatformContentResult", - "items": { - "ModeratedName": 8, - "NoUserInput": 5, - "PermissionDenied": 2, - "PurchaseFailure": 9, - "Success": 1, - "Timeout": 3, - "TokenInvalid": 10, - "UGCValidationFailed": 7, - "UnknownFailure": 6, - "UploadFailed": 4 - } - }, - "PromptExperienceDetailsResult": { - "name": "PromptExperienceDetailsResult", - "items": { - "PromptClosed": 0, - "TeleportAttempted": 1 - } - }, - "PromptLinkSharingResult": { - "name": "PromptLinkSharingResult", - "items": { - "InvalidLaunchData": 3, - "PlayerLeft": 2, - "Success": 1 - } - }, - "PromptPublishAssetResult": { - "name": "PromptPublishAssetResult", - "items": { - "NoUserInput": 5, - "PermissionDenied": 2, - "Success": 1, - "Timeout": 3, - "UnknownFailure": 6, - "UploadFailed": 4 - } - }, - "PropertyStatus": { - "name": "PropertyStatus", - "items": { - "Error": 2, - "Ok": 0, - "Warning": 1 - } - }, "ProximityPromptExclusivity": { "name": "ProximityPromptExclusivity", "items": { @@ -102318,13 +47770,6 @@ "Default": 0 } }, - "PurchaseOption": { - "name": "PurchaseOption", - "items": { - "Permanent": 2, - "TimedOption": 1 - } - }, "QualityLevel": { "name": "QualityLevel", "items": { @@ -102352,13 +47797,6 @@ "Level21": 21 } }, - "QueueDecision": { - "name": "QueueDecision", - "items": { - "Commit": 0, - "Defer": 1 - } - }, "R15CollisionType": { "name": "R15CollisionType", "items": { @@ -102369,97 +47807,8 @@ "RaycastFilterType": { "name": "RaycastFilterType", "items": { - "Exclude": 0, - "Include": 1 - } - }, - "ReadCapturesFromGalleryResult": { - "name": "ReadCapturesFromGalleryResult", - "items": { - "NeedPermission": 1, - "Success": 0 - } - }, - "ReceiptDecision": { - "name": "ReceiptDecision", - "items": { - "NotProcessedYet": 0, - "Processed": 1 - } - }, - "ReceiptType": { - "name": "ReceiptType", - "items": { - "DeveloperProduct": 0, - "RobuxTransferReceiver": 2, - "RobuxTransferSender": 1 - } - }, - "RecommendationActionType": { - "name": "RecommendationActionType", - "items": { - "AddReaction": 0, - "Comment": 4, - "Play": 5, - "Purchase": 6, - "RemoveReaction": 1, - "Report": 3, - "Share": 2 - } - }, - "RecommendationDepartureIntent": { - "name": "RecommendationDepartureIntent", - "items": { - "Negative": 2, - "Neutral": 0, - "Positive": 1 - } - }, - "RecommendationImpressionType": { - "name": "RecommendationImpressionType", - "items": { - "NotViewable": 1, - "View": 0 - } - }, - "RecommendationItemContentType": { - "name": "RecommendationItemContentType", - "items": { - "Dynamic": 1, - "Interactive": 2, - "Static": 0 - } - }, - "RecommendationItemVisibility": { - "name": "RecommendationItemVisibility", - "items": { - "Private": 0, - "Public": 1 - } - }, - "RecommendationPreferenceTargetType": { - "name": "RecommendationPreferenceTargetType", - "items": { - "CustomTag": 2, - "Universe": 1, - "User": 0 - } - }, - "RecommendationPreferenceType": { - "name": "RecommendationPreferenceType", - "items": { - "AddFollow": 0, - "AddMute": 2, - "RemoveFollow": 1, - "RemoveMute": 3 - } - }, - "RejectCharacterDeletions": { - "name": "RejectCharacterDeletions", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 + "Blacklist": 0, + "Whitelist": 1 } }, "RenderFidelity": { @@ -102480,14 +47829,6 @@ "Last": 2000 } }, - "RenderingCacheOptimizationMode": { - "name": "RenderingCacheOptimizationMode", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, "RenderingTestComparisonMethod": { "name": "RenderingTestComparisonMethod", "items": { @@ -102495,14 +47836,6 @@ "psnr": 0 } }, - "ReplicateInstanceDestroySetting": { - "name": "ReplicateInstanceDestroySetting", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, "ResamplerMode": { "name": "ResamplerMode", "items": { @@ -102510,33 +47843,6 @@ "Pixelated": 1 } }, - "ReservedHighlightId": { - "name": "ReservedHighlightId", - "items": { - "Active": 131072, - "Hover": 262144, - "NegatedPart": 1048576, - "Selection": 524288, - "Standard": 0 - } - }, - "RestPose": { - "name": "RestPose", - "items": { - "Custom": 2, - "Default": 0, - "RotationsReset": 1 - } - }, - "RestPoseModel": { - "name": "RestPoseModel", - "items": { - "FromCustomClip": 3, - "FromRigInACE": 0, - "FromRigInFile": 1, - "FromRigInFileZeroedRotations": 2 - } - }, "ReturnKeyType": { "name": "ReturnKeyType", "items": { @@ -102577,14 +47883,6 @@ "UnderWater": 23 } }, - "ReviewableContentState": { - "name": "ReviewableContentState", - "items": { - "Completed": 1, - "Failed": 2, - "Pending": 0 - } - }, "RibbonTool": { "name": "RibbonTool", "items": { @@ -102593,7 +47891,6 @@ "MaterialPicker": 6, "Move": 3, "None": 9, - "PivotEditor": 10, "Rotate": 2, "Scale": 1, "Select": 0, @@ -102601,64 +47898,14 @@ "Ungroup": 8 } }, - "RigLabel": { - "name": "RigLabel", - "items": { - "Chest": 24, - "HeadBase": 25, - "Index1": 33, - "Index2": 34, - "Index3": 35, - "Invalid": 0, - "LeftAnkle": 5, - "LeftClavicle": 26, - "LeftElbow": 13, - "LeftHip": 3, - "LeftKnee": 4, - "LeftShoulder": 12, - "LeftToeBase": 28, - "LeftWrist": 14, - "Middle1": 36, - "Middle2": 37, - "Middle3": 38, - "Neck": 20, - "Pinky1": 42, - "Pinky2": 43, - "Pinky3": 44, - "RightAnkle": 9, - "RightClavicle": 27, - "RightElbow": 17, - "RightHip": 7, - "RightKnee": 8, - "RightShoulder": 16, - "RightToeBase": 29, - "RightWrist": 18, - "Ring1": 39, - "Ring2": 40, - "Ring3": 41, - "Root": 2, - "Spine": 23, - "Thumb1": 30, - "Thumb2": 31, - "Thumb3": 32, - "Waist": 11 - } - }, - "RigScale": { - "name": "RigScale", - "items": { - "Default": 0, - "Rthro": 1, - "RthroNarrow": 2 - } - }, "RigType": { "name": "RigType", "items": { - "Custom": 2, - "CustomHumanoid": 1, - "None": 3, - "R15": 0 + "Custom": 3, + "None": 4, + "R15": 0, + "Rthro": 1, + "RthroNarrow": 2 } }, "RollOffMode": { @@ -102670,14 +47917,6 @@ "LinearSquare": 2 } }, - "RolloutState": { - "name": "RolloutState", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, "RotationOrder": { "name": "RotationOrder", "items": { @@ -102696,39 +47935,6 @@ "MovementRelative": 0 } }, - "RsvpStatus": { - "name": "RsvpStatus", - "items": { - "Going": 1, - "None": 0, - "NotGoing": 2 - } - }, - "RtlTextSupport": { - "name": "RtlTextSupport", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "RunContext": { - "name": "RunContext", - "items": { - "Client": 2, - "Legacy": 0, - "Plugin": 3, - "Server": 1 - } - }, - "RunState": { - "name": "RunState", - "items": { - "Paused": 2, - "Running": 1, - "Stopped": 0 - } - }, "RuntimeUndoBehavior": { "name": "RuntimeUndoBehavior", "items": { @@ -102737,40 +47943,6 @@ "Snapshot": 1 } }, - "SafeAreaCompatibility": { - "name": "SafeAreaCompatibility", - "items": { - "FullscreenExtension": 1, - "None": 0 - } - }, - "SalesTypeFilter": { - "name": "SalesTypeFilter", - "items": { - "All": 1, - "Collectibles": 2, - "Premium": 3, - "TimedOptions": 4 - } - }, - "SandboxedInstanceMode": { - "name": "SandboxedInstanceMode", - "items": { - "Default": 0, - "Experimental": 1 - } - }, - "SaveAvatarThumbnailCustomizationFailure": { - "name": "SaveAvatarThumbnailCustomizationFailure", - "items": { - "BadDistanceScale": 4, - "BadFieldOfViewDeg": 3, - "BadThumbnailType": 1, - "BadYRotDeg": 2, - "Other": 5, - "Throttled": 6 - } - }, "SaveFilter": { "name": "SaveFilter", "items": { @@ -102805,28 +47977,6 @@ "Tile": 2 } }, - "ScopeCheckResult": { - "name": "ScopeCheckResult", - "items": { - "BackendError": 4, - "ConsentAccepted": 0, - "ConsentDenied": 7, - "InvalidArgument": 6, - "InvalidScopes": 1, - "NoUserInput": 3, - "Timeout": 2, - "UnexpectedError": 5 - } - }, - "ScreenInsets": { - "name": "ScreenInsets", - "items": { - "CoreUISafeInsets": 2, - "DeviceSafeInsets": 1, - "None": 0, - "TopbarSafeInsets": 3 - } - }, "ScreenOrientation": { "name": "ScreenOrientation", "items": { @@ -102837,41 +47987,6 @@ "Sensor": 4 } }, - "ScreenshotCaptureResult": { - "name": "ScreenshotCaptureResult", - "items": { - "NoDeviceSupport": 2, - "NoSpaceOnDevice": 3, - "OtherError": 1, - "Success": 0 - } - }, - "ScriptScannerUpdateType": { - "name": "ScriptScannerUpdateType", - "items": { - "Added": 1, - "Init": 0, - "Removed": 2 - } - }, - "ScriptStoppedReason": { - "name": "ScriptStoppedReason", - "items": { - "Breakpoint": 0, - "Entry": 4, - "Exception": 1, - "Pause": 2, - "Step": 3 - } - }, - "ScriptVariableScope": { - "name": "ScriptVariableScope", - "items": { - "Global": 2, - "Local": 0, - "Upvalue": 1 - } - }, "ScrollBarInset": { "name": "ScrollBarInset", "items": { @@ -102880,13 +47995,6 @@ "ScrollBar": 1 } }, - "ScrollState": { - "name": "ScrollState", - "items": { - "Idle": 0, - "Scrolling": 1 - } - }, "ScrollingDirection": { "name": "ScrollingDirection", "items": { @@ -102895,158 +48003,22 @@ "Y": 2 } }, - "SecurityCapability": { - "name": "SecurityCapability", + "ServerAudioBehavior": { + "name": "ServerAudioBehavior", "items": { - "AccessOutsideWrite": 2, - "Animation": 15, - "AssetCreateUpdate": 37, - "AssetManagement": 34, - "AssetRead": 33, - "AssetRequire": 3, - "Assistant": 31, - "Audio": 8, - "Avatar": 16, - "AvatarAppearance": 51, - "AvatarBehavior": 50, - "Basic": 7, - "CSG": 13, - "CapabilityControl": 22, - "Capture": 38, - "Chat": 14, - "Consequences": 48, - "CreateInstances": 6, - "DataStore": 9, - "DynamicGeneration": 35, - "Environment": 18, - "Groups": 46, - "Input": 17, - "InternalTest": 29, - "LegacySound": 20, - "LoadOwnedAsset": 41, - "LoadString": 4, - "LoadUnownedAsset": 52, - "LocalUser": 24, - "Logging": 44, - "Material": 49, - "Monetization": 40, - "Network": 10, - "Physics": 11, - "PlatformAvatarEditing": 36, - "Players": 21, - "Plugin": 23, - "PluginOrOpenCloud": 30, - "PromptExternalPurchase": 45, - "RemoteCommand": 32, - "RemoteEvent": 19, - "RobloxEngine": 27, - "RobloxScript": 26, - "RunClientScript": 0, - "RunServerScript": 1, - "ScriptGlobals": 5, - "SensitiveInput": 39, - "ServerCommunication": 43, - "Social": 42, - "Teleport": 47, - "UI": 12, - "Unassigned": 28, - "WritePlayer": 25 - } - }, - "SelectionBehavior": { - "name": "SelectionBehavior", - "items": { - "Escape": 0, - "Stop": 1 - } - }, - "SelectionRenderMode": { - "name": "SelectionRenderMode", - "items": { - "Both": 2, - "BoundingBoxes": 1, - "Outlines": 0 - } - }, - "SelfViewPosition": { - "name": "SelfViewPosition", - "items": { - "BottomLeft": 3, - "BottomRight": 4, - "LastPosition": 0, - "TopLeft": 1, - "TopRight": 2 - } - }, - "SensorMode": { - "name": "SensorMode", - "items": { - "ClassicFloor": 2, - "ClassicLadder": 3, - "Floor": 0, - "Ladder": 1 - } - }, - "SensorUpdateType": { - "name": "SensorUpdateType", - "items": { - "Manual": 1, - "OnRead": 0 - } - }, - "ServerLiveEditingMode": { - "name": "ServerLiveEditingMode", - "items": { - "Disabled": 2, - "Enabled": 1, - "Uninitialized": 0 - } - }, - "ServiceVisibility": { - "name": "ServiceVisibility", - "items": { - "Always": 0, - "Off": 1, - "WithChildren": 2 - } - }, - "Severity": { - "name": "Severity", - "items": { - "Error": 1, - "Hint": 4, - "Information": 3, - "Warning": 2 - } - }, - "ShowAdResult": { - "name": "ShowAdResult", - "items": { - "AdAlreadyShowing": 3, - "AdNotReady": 2, - "InsufficientMemory": 6, - "InternalError": 4, - "ShowCompleted": 1, - "ShowInterrupted": 5 + "Enabled": 0, + "Muted": 1, + "OnlineGame": 2 } }, "SignalBehavior": { "name": "SignalBehavior", "items": { - "AncestryDeferred": 3, "Default": 0, "Deferred": 2, "Immediate": 1 } }, - "SimulationMode": { - "name": "SimulationMode", - "items": { - "Default": 0, - "Disabled": 2, - "Enabled": 1 - } - }, "SizeConstraint": { "name": "SizeConstraint", "items": { @@ -103055,50 +48027,6 @@ "RelativeYY": 2 } }, - "SlimTintMode": { - "name": "SlimTintMode", - "items": { - "ContentId": 4, - "DataModelState": 5, - "LevelOfDetail": 1, - "MeshResourcePtr": 3, - "Meshes": 2, - "None": 0, - "TranscoderStatus": 6 - } - }, - "SlimTranscoderStatus": { - "name": "SlimTranscoderStatus", - "items": { - "Failed": 3, - "Succeeded": 2, - "Transcoding": 1, - "Unknown": 0 - } - }, - "SlimViewContext": { - "name": "SlimViewContext", - "items": { - "Editor": 1, - "ImGui": 2, - "Player": 0 - } - }, - "SolverConvergenceMetricType": { - "name": "SolverConvergenceMetricType", - "items": { - "AlgorithmAgnostic": 1, - "IterationBased": 0 - } - }, - "SolverConvergenceVisualizationMode": { - "name": "SolverConvergenceVisualizationMode", - "items": { - "Disabled": 0, - "PerEdge": 2, - "PerIsland": 1 - } - }, "SortDirection": { "name": "SortDirection", "items": { @@ -103114,6 +48042,26 @@ "Name": 0 } }, + "SoundType": { + "name": "SoundType", + "items": { + "Boing": 1, + "Bomb": 2, + "Break": 3, + "Click": 4, + "Clock": 5, + "NoSound": 0, + "Page": 7, + "Ping": 8, + "Slingshot": 6, + "Snap": 9, + "Splat": 10, + "Step": 11, + "StepOn": 12, + "Swoosh": 13, + "Victory": 14 + } + }, "SpecialKey": { "name": "SpecialKey", "items": { @@ -103134,28 +48082,6 @@ "TopRight": 1 } }, - "StateObjectFieldType": { - "name": "StateObjectFieldType", - "items": { - "Boolean": 0, - "CFrame": 1, - "Color3": 2, - "Float": 3, - "INVALID": 8, - "Instance": 4, - "Random": 5, - "Vector2": 6, - "Vector3": 7 - } - }, - "StateReferenceFrame": { - "name": "StateReferenceFrame", - "items": { - "CurrentState": 0, - "LastObservedState": 2, - "PreviousState": 1 - } - }, "Status": { "name": "Status", "items": { @@ -103163,17 +48089,6 @@ "Poison": 0 } }, - "StepFrequency": { - "name": "StepFrequency", - "items": { - "Hz1": 5, - "Hz10": 3, - "Hz15": 2, - "Hz30": 1, - "Hz5": 4, - "Hz60": 0 - } - }, "StreamOutBehavior": { "name": "StreamOutBehavior", "items": { @@ -103182,15 +48097,6 @@ "Opportunistic": 2 } }, - "StreamingIntegrityMode": { - "name": "StreamingIntegrityMode", - "items": { - "Default": 0, - "Disabled": 1, - "MinimumRadiusPause": 2, - "PauseOutsideLoadedArea": 3 - } - }, "StreamingPauseMode": { "name": "StreamingPauseMode", "items": { @@ -103199,50 +48105,11 @@ "Disabled": 1 } }, - "StrokeSizingMode": { - "name": "StrokeSizingMode", - "items": { - "FixedSize": 0, - "ScaledSize": 1 - } - }, - "StudioAction": { - "name": "StudioAction", - "items": { - "ClearSelection": 5, - "Copy": 61, - "Cut": 62, - "DeleteSelected": 3, - "DuplicateSelection": 4, - "Paste": 63, - "Redo": 1, - "SelectAll": 2, - "Undo": 0, - "ZoomExtents": 6 - } - }, - "StudioCaptureBufferStatus": { - "name": "StudioCaptureBufferStatus", - "items": { - "Error": 3, - "NotStarted": 0, - "Pending": 1, - "Ready": 2 - } - }, - "StudioCaptureScreenshotFormat": { - "name": "StudioCaptureScreenshotFormat", - "items": { - "PNG": 1, - "RGBA8": 0 - } - }, "StudioCloseMode": { "name": "StudioCloseMode", "items": { "CloseDoc": 2, "CloseStudio": 1, - "LogOut": 3, "None": 0 } }, @@ -103250,71 +48117,55 @@ "name": "StudioDataModelType", "items": { "Edit": 0, - "None": 4, + "None": 5, "PlayClient": 1, "PlayServer": 2, - "Standalone": 3 - } - }, - "StudioPlaceUpdateFailureReason": { - "name": "StudioPlaceUpdateFailureReason", - "items": { - "Other": 0, - "TeamCreateConflict": 1 + "RobloxPlugin": 3, + "UserPlugin": 4 } }, "StudioScriptEditorColorCategories": { "name": "StudioScriptEditorColorCategories", "items": { - "AICOOverlayButtonBackground": 43, - "AICOOverlayButtonBackgroundHover": 44, - "AICOOverlayButtonBackgroundPressed": 45, - "AICOOverlayText": 42, - "ActiveLine": 27, + "ActiveLine": 25, "Background": 17, "Bool": 10, - "Bracket": 31, + "Bracket": 29, "Builtin": 6, "Comment": 4, - "DebuggerCurrentLine": 28, - "DebuggerErrorLine": 29, + "DebuggerCurrentLine": 26, + "DebuggerErrorLine": 27, "Default": 0, - "DocViewCodeBackground": 41, + "DocViewCodeBackground": 38, "Error": 23, "FindSelectionBackground": 20, "Function": 11, "FunctionName": 15, - "Hint": 25, - "IndentationRuler": 46, - "Info": 24, "Keyword": 5, "Local": 12, "LuauKeyword": 14, "MatchingWordBackground": 21, - "MenuBackground": 36, - "MenuBorder": 40, - "MenuPrimaryText": 33, - "MenuScrollbarBackground": 38, - "MenuScrollbarHandle": 39, - "MenuSecondaryText": 34, - "MenuSelectedBackground": 37, - "MenuSelectedText": 35, + "MenuBackground": 33, + "MenuBorder": 37, + "MenuPrimaryText": 30, + "MenuScrollbarBackground": 35, + "MenuScrollbarHandle": 36, + "MenuSecondaryText": 31, + "MenuSelectedBackground": 34, + "MenuSelectedText": 32, "Method": 7, "Nil": 9, "Number": 2, "Operator": 1, "Property": 8, - "ReviewableChangeAddedText": 47, - "ReviewableChangeRemovedText": 48, - "Ruler": 30, + "Ruler": 28, "SelectionBackground": 19, "SelectionText": 18, "Self": 13, "String": 3, "TODO": 16, - "Type": 32, "Warning": 22, - "Whitespace": 26 + "Whitespace": 24 } }, "StudioScriptEditorColorPresets": { @@ -103329,61 +48180,53 @@ "StudioStyleGuideColor": { "name": "StudioStyleGuideColor", "items": { - "AICOOverlayButtonBackground": 129, - "AICOOverlayButtonBackgroundHover": 130, - "AICOOverlayButtonBackgroundPressed": 131, - "AICOOverlayText": 128, - "AttributeCog": 119, + "AttributeCog": 116, "Border": 31, - "BreakpointMarker": 136, - "BrightText": 40, + "BrightText": 39, "Button": 17, - "ButtonBorder": 91, - "ButtonText": 92, + "ButtonBorder": 88, + "ButtonText": 89, "CategoryItem": 24, - "ChatIncomingBgColor": 85, - "ChatIncomingTextColor": 86, - "ChatModeratedMessageColor": 89, - "ChatOutgoingBgColor": 87, - "ChatOutgoingTextColor": 88, - "CheckedFieldBackground": 94, - "CheckedFieldBorder": 95, - "CheckedFieldIndicator": 96, + "ChatIncomingBgColor": 82, + "ChatIncomingTextColor": 83, + "ChatModeratedMessageColor": 86, + "ChatOutgoingBgColor": 84, + "ChatOutgoingTextColor": 85, + "CheckedFieldBackground": 91, + "CheckedFieldBorder": 92, + "CheckedFieldIndicator": 93, "ColorPickerFrame": 29, "CurrentMarker": 30, - "Dark": 35, - "DebuggerCurrentLine": 67, - "DebuggerErrorLine": 68, - "DialogButton": 100, - "DialogButtonBorder": 102, - "DialogButtonText": 101, - "DialogMainButton": 103, - "DialogMainButtonText": 104, - "DiffFilePathBackground": 83, - "DiffFilePathBorder": 84, - "DiffFilePathText": 69, - "DiffLineNum": 78, - "DiffLineNumAdditionBackground": 81, - "DiffLineNumDeletionBackground": 82, - "DiffLineNumHover": 137, - "DiffLineNumNoChangeBackground": 80, - "DiffLineNumSeparatorBackground": 79, - "DiffLineNumSeparatorBackgroundHover": 138, - "DiffTextAddition": 72, - "DiffTextAdditionBackground": 76, - "DiffTextDeletion": 73, - "DiffTextDeletionBackground": 77, - "DiffTextHunkInfo": 70, - "DiffTextNoChange": 71, - "DiffTextNoChangeBackground": 75, - "DiffTextSeparatorBackground": 74, - "DimmedText": 41, - "DocViewCodeBackground": 66, - "DropShadow": 32, + "Dark": 34, + "DebuggerCurrentLine": 64, + "DebuggerErrorLine": 65, + "DialogButton": 97, + "DialogButtonBorder": 99, + "DialogButtonText": 98, + "DialogMainButton": 100, + "DialogMainButtonText": 101, + "DiffFilePathBackground": 80, + "DiffFilePathBorder": 81, + "DiffFilePathText": 66, + "DiffLineNum": 75, + "DiffLineNumAdditionBackground": 78, + "DiffLineNumDeletionBackground": 79, + "DiffLineNumNoChangeBackground": 77, + "DiffLineNumSeparatorBackground": 76, + "DiffTextAddition": 69, + "DiffTextAdditionBackground": 73, + "DiffTextDeletion": 70, + "DiffTextDeletionBackground": 74, + "DiffTextHunkInfo": 67, + "DiffTextNoChange": 68, + "DiffTextNoChangeBackground": 72, + "DiffTextSeparatorBackground": 71, + "DimmedText": 40, + "DocViewCodeBackground": 63, "Dropdown": 2, "EmulatorBar": 27, "EmulatorDropDown": 28, - "ErrorText": 44, + "ErrorText": 43, "FilterButtonAccent": 12, "FilterButtonBorder": 13, "FilterButtonBorderAlt": 14, @@ -103392,73 +48235,68 @@ "FilterButtonHover": 10, "GameSettingsTableItem": 25, "GameSettingsTooltip": 26, - "HeaderSection": 97, - "InfoBarWarningBackground": 105, - "InfoBarWarningText": 106, - "InfoText": 45, + "HeaderSection": 94, + "InfoBarWarningBackground": 102, + "InfoBarWarningText": 103, + "InfoText": 44, "InputFieldBackground": 21, - "InputFieldBorder": 93, + "InputFieldBorder": 90, "Item": 22, - "Light": 34, - "LinkText": 42, + "Light": 33, + "LinkText": 41, "MainBackground": 0, "MainButton": 18, - "MainText": 37, - "Mid": 36, - "Midlight": 98, + "MainText": 36, + "Mid": 35, + "Midlight": 95, "Notification": 4, - "OnboardingCover": 132, - "OnboardingHighlight": 133, - "OnboardingShadow": 134, "RibbonButton": 19, "RibbonTab": 15, "RibbonTabTopBar": 16, - "ScriptBackground": 48, - "ScriptBool": 111, - "ScriptBracket": 118, - "ScriptBuiltInFunction": 59, - "ScriptComment": 57, - "ScriptEditorCurrentLine": 107, - "ScriptError": 61, - "ScriptFindSelectionBackground": 52, - "ScriptFunction": 112, - "ScriptFunctionName": 116, - "ScriptHint": 63, - "ScriptInformation": 62, - "ScriptKeyword": 58, - "ScriptLocal": 113, - "ScriptLuauKeyword": 115, - "ScriptMatchingWordSelectionBackground": 53, - "ScriptMethod": 108, - "ScriptNil": 110, - "ScriptNumber": 55, - "ScriptOperator": 54, - "ScriptProperty": 109, - "ScriptRuler": 65, - "ScriptSelectionBackground": 51, - "ScriptSelectionText": 50, - "ScriptSelf": 114, - "ScriptSideWidget": 47, - "ScriptString": 56, - "ScriptText": 49, - "ScriptTodo": 117, - "ScriptWarning": 60, - "ScriptWhitespace": 64, + "ScriptBackground": 47, + "ScriptBool": 108, + "ScriptBracket": 115, + "ScriptBuiltInFunction": 58, + "ScriptComment": 56, + "ScriptEditorCurrentLine": 104, + "ScriptError": 60, + "ScriptFindSelectionBackground": 51, + "ScriptFunction": 109, + "ScriptFunctionName": 113, + "ScriptKeyword": 57, + "ScriptLocal": 110, + "ScriptLuauKeyword": 112, + "ScriptMatchingWordSelectionBackground": 52, + "ScriptMethod": 105, + "ScriptNil": 107, + "ScriptNumber": 54, + "ScriptOperator": 53, + "ScriptProperty": 106, + "ScriptRuler": 62, + "ScriptSelectionBackground": 50, + "ScriptSelectionText": 49, + "ScriptSelf": 111, + "ScriptSideWidget": 46, + "ScriptString": 55, + "ScriptText": 48, + "ScriptTodo": 114, + "ScriptWarning": 59, + "ScriptWhitespace": 61, "ScrollBar": 5, "ScrollBarBackground": 6, - "SensitiveText": 46, - "Separator": 90, - "Shadow": 33, - "StatusBar": 99, - "SubText": 38, + "SensitiveText": 45, + "Separator": 87, + "Shadow": 32, + "StatusBar": 96, + "SubText": 37, "Tab": 8, "TabBar": 7, "TableItem": 23, "Titlebar": 1, - "TitlebarText": 39, + "TitlebarText": 38, "Tooltip": 3, "ViewPortBackground": 20, - "WarningText": 43 + "WarningText": 42 } }, "StudioStyleGuideModifier": { @@ -103479,39 +48317,6 @@ "NoSupports": 2 } }, - "SubscriptionExpirationReason": { - "name": "SubscriptionExpirationReason", - "items": { - "Lapsed": 4, - "ProductDeleted": 1, - "ProductInactive": 0, - "SubscriberCancelled": 2, - "SubscriberRefunded": 3 - } - }, - "SubscriptionPaymentStatus": { - "name": "SubscriptionPaymentStatus", - "items": { - "Paid": 0, - "Refunded": 1 - } - }, - "SubscriptionPeriod": { - "name": "SubscriptionPeriod", - "items": { - "Month": 0 - } - }, - "SubscriptionState": { - "name": "SubscriptionState", - "items": { - "Expired": 4, - "NeverSubscribed": 0, - "SubscribedRenewalPaymentPending": 3, - "SubscribedWillNotRenew": 2, - "SubscribedWillRenew": 1 - } - }, "SurfaceConstraint": { "name": "SurfaceConstraint", "items": { @@ -103521,13 +48326,6 @@ "SteppingMotor": 2 } }, - "SurfaceGuiShape": { - "name": "SurfaceGuiShape", - "items": { - "CurvedHorizontally": 1, - "Flat": 0 - } - }, "SurfaceGuiSizingMode": { "name": "SurfaceGuiSizingMode", "items": { @@ -103560,16 +48358,6 @@ "Up": 2 } }, - "SystemThemeValue": { - "name": "SystemThemeValue", - "items": { - "dark": 2, - "error": 0, - "light": 1, - "systemDark": 4, - "systemLight": 3 - } - }, "TableMajorAxis": { "name": "TableMajorAxis", "items": { @@ -103577,15 +48365,6 @@ "RowMajor": 0 } }, - "TeamCreateErrorState": { - "name": "TeamCreateErrorState", - "items": { - "NoError": 3, - "PlaceSizeApproachingLimit": 1, - "PlaceSizeTooLarge": 0, - "PlaceUploadFailing": 2 - } - }, "Technology": { "name": "Technology", "items": { @@ -103593,51 +48372,17 @@ "Future": 4, "Legacy": 0, "ShadowMap": 3, - "Unified": 5, "Voxel": 1 } }, - "TelemetryBackend": { - "name": "TelemetryBackend", - "items": { - "Counter": 6, - "EphemeralCounter": 4, - "EphemeralStat": 5, - "EventIngest": 1, - "Points": 2, - "Stat": 7, - "Teletune": 3, - "UNSPECIFIED": 0 - } - }, - "TelemetryStandardizedField": { - "name": "TelemetryStandardizedField", - "items": { - "AddArchitectureInfo": 7, - "AddCpuInfo": 8, - "AddCurrentContextName": 5, - "AddDatacenterId": 0, - "AddMemoryInfo": 9, - "AddOsInfo": 6, - "AddPlaceId": 1, - "AddPlaceInstanceId": 3, - "AddPlaySessionId": 4, - "AddSessionInfo": 10, - "AddUniverseId": 2 - } - }, "TeleportMethod": { "name": "TeleportMethod", "items": { - "Teleport": 7, "TeleportPartyAsync": 3, - "TeleportSwitchServer": 8, - "TeleportToInstanceBack": 5, "TeleportToPlaceInstance": 1, "TeleportToPrivateServer": 2, "TeleportToSpawnByName": 0, - "TeleportToVIPServer": 4, - "TeleportUnknown": 6 + "TeleportUnknown": 4 } }, "TeleportResult": { @@ -103667,10 +48412,8 @@ "name": "TeleportType", "items": { "ToInstance": 1, - "ToInstanceBack": 4, "ToPlace": 0, - "ToReservedServer": 2, - "ToVIPServer": 3 + "ToReservedServer": 2 } }, "TerrainAcquisitionMethod": { @@ -103690,65 +48433,14 @@ "Template": 2 } }, - "TerrainFace": { - "name": "TerrainFace", - "items": { - "Bottom": 2, - "Side": 1, - "Top": 0 - } - }, - "TerrainLiquidMergeOperation": { - "name": "TerrainLiquidMergeOperation", - "items": { - "Difference": 3, - "Intersect": 4, - "None": 0, - "Source": 1, - "Union": 2 - } - }, - "TerrainSolidMergeOperation": { - "name": "TerrainSolidMergeOperation", - "items": { - "Cut": 7, - "Difference": 5, - "Dig": 4, - "Intersect": 6, - "None": 0, - "Paint": 1, - "Place": 8, - "Source": 2, - "Union": 3 - } - }, - "TextChannelDisplayMode": { - "name": "TextChannelDisplayMode", - "items": { - "AllTextChannels": 0, - "DefaultTextChannels": 1 - } - }, "TextChatMessageStatus": { "name": "TextChatMessageStatus", "items": { - "Floodchecked": 5, - "InvalidPrivacySettings": 6, - "InvalidTextChannelPermissions": 7, - "MessageTooLong": 8, - "ModerationTimeout": 9, - "Sending": 3, - "Success": 2, - "TextFilterFailed": 4, - "Unknown": 1 - } - }, - "TextDirection": { - "name": "TextDirection", - "items": { - "Auto": 0, - "LeftToRight": 1, - "RightToLeft": 2 + "Floodchecked": 3, + "InvalidPrivacySettings": 4, + "InvalidTextChannelPermissions": 5, + "Success": 1, + "TextFilterFailed": 2 } }, "TextFilterContext": { @@ -103763,8 +48455,6 @@ "items": { "Default": 0, "Email": 3, - "NewPassword": 9, - "NewPasswordShown": 10, "NoSuggestions": 1, "Number": 2, "OneTimePassword": 8, @@ -103778,8 +48468,7 @@ "name": "TextTruncate", "items": { "AtEnd": 1, - "None": 0, - "SplitWord": 2 + "None": 0 } }, "TextXAlignment": { @@ -103867,28 +48556,6 @@ "Precise": 2 } }, - "TitleBarControlsPosition": { - "name": "TitleBarControlsPosition", - "items": { - "Left": 1, - "Right": 2, - "Unknown": 0 - } - }, - "TitleBarMode": { - "name": "TitleBarMode", - "items": { - "Custom": 1, - "Native": 0 - } - }, - "TonemapperPreset": { - "name": "TonemapperPreset", - "items": { - "Default": 0, - "Retro": 1 - } - }, "TopBottom": { "name": "TopBottom", "items": { @@ -103917,82 +48584,6 @@ "Thumbstick": 1 } }, - "TrackerError": { - "name": "TrackerError", - "items": { - "AudioError": 8, - "AudioNoPermission": 9, - "InitFailed": 2, - "NoAudio": 7, - "NoService": 1, - "NoVideo": 3, - "Ok": 0, - "UnsupportedDevice": 10, - "VideoError": 4, - "VideoNoPermission": 5, - "VideoUnsupported": 6 - } - }, - "TrackerExtrapolationFlagMode": { - "name": "TrackerExtrapolationFlagMode", - "items": { - "Auto": 3, - "ExtrapolateFacsAndPose": 1, - "ExtrapolateFacsOnly": 2, - "ForceDisabled": 0 - } - }, - "TrackerFaceTrackingStatus": { - "name": "TrackerFaceTrackingStatus", - "items": { - "FaceTrackingHasTrackingError": 4, - "FaceTrackingIsOccluded": 5, - "FaceTrackingLost": 3, - "FaceTrackingNoFaceFound": 1, - "FaceTrackingSuccess": 0, - "FaceTrackingUninitialized": 6, - "FaceTrackingUnknown": 2 - } - }, - "TrackerLodFlagMode": { - "name": "TrackerLodFlagMode", - "items": { - "Auto": 2, - "ForceFalse": 0, - "ForceTrue": 1 - } - }, - "TrackerLodValueMode": { - "name": "TrackerLodValueMode", - "items": { - "Auto": 2, - "Force0": 0, - "Force1": 1 - } - }, - "TrackerMode": { - "name": "TrackerMode", - "items": { - "Audio": 1, - "AudioVideo": 3, - "None": 0, - "Video": 2 - } - }, - "TrackerPromptEvent": { - "name": "TrackerPromptEvent", - "items": { - "LODCameraRecommendDisable": 0 - } - }, - "TrackerType": { - "name": "TrackerType", - "items": { - "Face": 1, - "None": 0, - "UpperBody": 2 - } - }, "TriStateBoolean": { "name": "TriStateBoolean", "items": { @@ -104008,82 +48599,6 @@ "Completed": 1 } }, - "UICaptureMode": { - "name": "UICaptureMode", - "items": { - "All": 0, - "None": 1 - } - }, - "UIDragDetectorBoundingBehavior": { - "name": "UIDragDetectorBoundingBehavior", - "items": { - "Automatic": 0, - "EntireObject": 1, - "HitPoint": 2 - } - }, - "UIDragDetectorDragRelativity": { - "name": "UIDragDetectorDragRelativity", - "items": { - "Absolute": 0, - "Relative": 1 - } - }, - "UIDragDetectorDragSpace": { - "name": "UIDragDetectorDragSpace", - "items": { - "LayerCollector": 1, - "Parent": 0, - "Reference": 2 - } - }, - "UIDragDetectorDragStyle": { - "name": "UIDragDetectorDragStyle", - "items": { - "Rotate": 2, - "Scriptable": 3, - "TranslateLine": 1, - "TranslatePlane": 0 - } - }, - "UIDragDetectorResponseStyle": { - "name": "UIDragDetectorResponseStyle", - "items": { - "CustomOffset": 2, - "CustomScale": 3, - "Offset": 0, - "Scale": 1 - } - }, - "UIDragSpeedAxisMapping": { - "name": "UIDragSpeedAxisMapping", - "items": { - "XX": 1, - "XY": 0, - "YY": 2 - } - }, - "UIFlexAlignment": { - "name": "UIFlexAlignment", - "items": { - "Fill": 1, - "None": 0, - "SpaceAround": 2, - "SpaceBetween": 3, - "SpaceEvenly": 4 - } - }, - "UIFlexMode": { - "name": "UIFlexMode", - "items": { - "Custom": 4, - "Fill": 3, - "Grow": 1, - "None": 0, - "Shrink": 2 - } - }, "UITheme": { "name": "UITheme", "items": { @@ -104098,69 +48613,14 @@ "UiMessageInfo": 1 } }, - "UpdateState": { - "name": "UpdateState", - "items": { - "UpdateAvailable": 1, - "UpdateFailed": 4, - "UpdateInProgress": 2, - "UpdateNotAvailable": 0, - "UpdateReady": 3 - } - }, - "UploadCaptureResult": { - "name": "UploadCaptureResult", - "items": { - "CaptureModerated": 2, - "CaptureNotInGallery": 3, - "IneligibleCapture": 4, - "NeedPermission": 1, - "Success": 0, - "UploadFailed": 7, - "UploadPending": 6, - "UploadQuotaReached": 5 - } - }, - "UsageContext": { - "name": "UsageContext", - "items": { - "Default": 0, - "Preview": 1 - } - }, - "UserAcquisitionSource": { - "name": "UserAcquisitionSource", - "items": { - "Ads": 8, - "ContinueToPlay": 3, - "Curation": 4, - "Friends": 5, - "HomeOther": 9, - "HomeRecommendation": 2, - "Other": 10, - "PendingAttribution": 1, - "Search": 6, - "Teleport": 7, - "Unknown": 0 - } - }, "UserCFrame": { "name": "UserCFrame", "items": { - "Floor": 3, "Head": 0, "LeftHand": 1, "RightHand": 2 } }, - "UserIdMode": { - "name": "UserIdMode", - "items": { - "Domain": 2, - "Global": 1, - "Invalid": 0 - } - }, "UserInputState": { "name": "UserInputState", "items": { @@ -104197,81 +48657,6 @@ "Touch": 7 } }, - "UserNewReturningStatus": { - "name": "UserNewReturningStatus", - "items": { - "New": 1, - "Returning": 2, - "Unknown": 0 - } - }, - "UserReturnStatus": { - "name": "UserReturnStatus", - "items": { - "New": 1, - "Returning": 2, - "Unknown": 0 - } - }, - "VRComfortSetting": { - "name": "VRComfortSetting", - "items": { - "Comfort": 0, - "Custom": 3, - "Expert": 2, - "Normal": 1 - } - }, - "VRControllerModelMode": { - "name": "VRControllerModelMode", - "items": { - "Disabled": 0, - "Transparent": 1 - } - }, - "VRDeviceType": { - "name": "VRDeviceType", - "items": { - "HTCVive": 2, - "OculusQuest": 4, - "OculusRift": 1, - "Unknown": 0, - "ValveIndex": 3 - } - }, - "VRLaserPointerMode": { - "name": "VRLaserPointerMode", - "items": { - "Disabled": 0, - "DualPointer": 2, - "Pointer": 1 - } - }, - "VRSafetyBubbleMode": { - "name": "VRSafetyBubbleMode", - "items": { - "Anyone": 2, - "NoOne": 0, - "OnlyFriends": 1 - } - }, - "VRScaling": { - "name": "VRScaling", - "items": { - "Off": 1, - "World": 0 - } - }, - "VRSessionState": { - "name": "VRSessionState", - "items": { - "Focused": 3, - "Idle": 1, - "Stopping": 4, - "Undefined": 0, - "Visible": 2 - } - }, "VRTouchpad": { "name": "VRTouchpad", "items": { @@ -104295,13 +48680,6 @@ "Vector": 2 } }, - "VerifiedLevel": { - "name": "VerifiedLevel", - "items": { - "High": 1, - "Low": 0 - } - }, "VerticalAlignment": { "name": "VerticalAlignment", "items": { @@ -104328,76 +48706,6 @@ "Small": 1 } }, - "VideoCaptureResult": { - "name": "VideoCaptureResult", - "items": { - "OtherError": 1, - "ScreenSizeChanged": 2, - "Success": 0, - "TimeLimitReached": 3 - } - }, - "VideoCaptureStartedResult": { - "name": "VideoCaptureStartedResult", - "items": { - "CapturingAlready": 2, - "NoDeviceSupport": 3, - "NoSpaceOnDevice": 4, - "OtherError": 1, - "Success": 0 - } - }, - "VideoDeviceCaptureQuality": { - "name": "VideoDeviceCaptureQuality", - "items": { - "Default": 0, - "High": 3, - "Low": 1, - "Medium": 2 - } - }, - "VideoError": { - "name": "VideoError", - "items": { - "AllocFailed": 4, - "BadParameter": 3, - "CodecCloseFailed": 6, - "CodecInitFailed": 5, - "CreateFailed": 14, - "DecodeFailed": 7, - "DownloadFailed": 11, - "EAgain": 2, - "EncodeFailed": 13, - "Eof": 1, - "Generic": 10, - "NoPermission": 15, - "NoService": 16, - "Ok": 0, - "ParsingFailed": 8, - "ReleaseFailed": 17, - "StreamNotFound": 12, - "Unknown": 18, - "Unsupported": 9 - } - }, - "VideoSampleSize": { - "name": "VideoSampleSize", - "items": { - "Full": 3, - "Large": 2, - "Medium": 1, - "Small": 0 - } - }, - "ViewMode": { - "name": "ViewMode", - "items": { - "Decal": 3, - "GeometryComplexity": 1, - "None": 0, - "Transparent": 2 - } - }, "VirtualCursorMode": { "name": "VirtualCursorMode", "items": { @@ -104414,13 +48722,6 @@ "Recording": 1 } }, - "VoiceChatDistanceAttenuationType": { - "name": "VoiceChatDistanceAttenuationType", - "items": { - "Inverse": 0, - "Legacy": 1 - } - }, "VoiceChatState": { "name": "VoiceChatState", "items": { @@ -104433,46 +48734,6 @@ "Leaving": 4 } }, - "VoiceClientLeaveReasons": { - "name": "VoiceClientLeaveReasons", - "items": { - "ClientNetworkDisconnected": 1, - "ClientShutdown": 3, - "ImguiDebugLeave": 7, - "LuaInitiated": 8, - "PlayerLeft": 2, - "PublishFailed": 4, - "RejoinReceived": 5, - "Unknown": 0, - "VoiceReboot": 6 - } - }, - "VoiceControlPath": { - "name": "VoiceControlPath", - "items": { - "Join": 2, - "Publish": 0, - "Subscribe": 1 - } - }, - "VoiceRccReconnectReason": { - "name": "VoiceRccReconnectReason", - "items": { - "BlockListChanged": 4, - "CloseRoom": 2, - "FAEUpdate": 3, - "Migration": 1, - "Unknown": 0 - } - }, - "VolumetricAudio": { - "name": "VolumetricAudio", - "items": { - "Automatic": 1, - "Disabled": 0, - "Enabled": 2 - } - }, "WaterDirection": { "name": "WaterDirection", "items": { @@ -104494,109 +48755,22 @@ "Strong": 3 } }, - "WebSocketState": { - "name": "WebSocketState", - "items": { - "Closed": 3, - "Closing": 2, - "Connecting": 0, - "Open": 1 - } - }, - "WebStreamClientState": { - "name": "WebStreamClientState", - "items": { - "Closed": 3, - "Connecting": 0, - "Error": 2, - "Open": 1 - } - }, - "WebStreamClientType": { - "name": "WebStreamClientType", - "items": { - "RawStream": 1, - "SSE": 0, - "WebSocket": 2 - } - }, - "WeldConstraintPreserve": { - "name": "WeldConstraintPreserve", - "items": { - "All": 0, - "None": 1, - "Touching": 2 - } - }, - "WhenUserFirstPlayed": { - "name": "WhenUserFirstPlayed", - "items": { - "Days0To30": 1, - "Days181To365": 4, - "Days31To90": 2, - "Days366Plus": 5, - "Days91To180": 3, - "Unknown": 0 - } - }, - "WhisperChatPrivacyMode": { - "name": "WhisperChatPrivacyMode", - "items": { - "AllUsers": 0, - "NoOne": 1 - } - }, - "WindSoundProfile": { - "name": "WindSoundProfile", - "items": { - "Foliage": 2, - "Turbulence": 0, - "Whistle": 1 - } - }, - "WindowState": { - "name": "WindowState", - "items": { - "Maximized": 2, - "Minimized": 1, - "Normal": 0 - } - }, - "WrapLayerAutoSkin": { - "name": "WrapLayerAutoSkin", - "items": { - "Disabled": 0, - "EnabledOverride": 2, - "EnabledPreserve": 1 - } - }, "WrapLayerDebugMode": { "name": "WrapLayerDebugMode", "items": { "BoundCage": 1, "BoundCageAndLinks": 3, - "HSRInner": 10, - "HSRInnerReverse": 11, - "HSROuter": 9, - "HSROuterDetail": 8, "LayerCage": 2, - "LayerCageFittedToBase": 12, - "LayerCageFittedToPrev": 13, "None": 0, "OuterCage": 6, - "PreWrapDeformerOuterCage": 14, "Rbf": 5, - "Reference": 4, - "ReferenceMeshAfterMorph": 7, - "SkinningTransfer": 15 + "Reference": 4 } }, "WrapTargetDebugMode": { "name": "WrapTargetDebugMode", "items": { "None": 0, - "OuterCageDetail": 8, - "PreWrapDeformerCage": 9, "Rbf": 7, "TargetCageCompressed": 2, "TargetCageInterface": 3, diff --git a/plugin/rbx_dom_lua/init.lua b/plugin/rbx_dom_lua/init.lua index 2d390a24..4230a0a1 100644 --- a/plugin/rbx_dom_lua/init.lua +++ b/plugin/rbx_dom_lua/init.lua @@ -24,8 +24,7 @@ local function findCanonicalPropertyDescriptor(className, propertyName) return PropertyDescriptor.fromRaw( currentClass.Properties[aliasData.AliasFor], currentClassName, - aliasData.AliasFor - ) + aliasData.AliasFor) end return nil diff --git a/plugin/rbx_dom_lua/init.spec.lua b/plugin/rbx_dom_lua/init.spec.lua new file mode 100644 index 00000000..4cafe5ae --- /dev/null +++ b/plugin/rbx_dom_lua/init.spec.lua @@ -0,0 +1,7 @@ +return function() + local RbxDom = require(script.Parent) + + it("should load", function() + expect(RbxDom).to.be.ok() + end) +end \ No newline at end of file diff --git a/plugin/run-tests.server.lua b/plugin/run-tests.server.lua index aa5daa9f..a9ebcdf6 100644 --- a/plugin/run-tests.server.lua +++ b/plugin/run-tests.server.lua @@ -1,11 +1,19 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage") -local TestEZ = require(ReplicatedStorage:WaitForChild("Packages", 10):WaitForChild("TestEZ", 10)) +local TestEZ = require(ReplicatedStorage.TestEZ) -local Rojo = ReplicatedStorage:WaitForChild("Rojo", 10) +local Rojo = ReplicatedStorage.Rojo -local Settings = require(Rojo.Plugin.Settings) -Settings:set("logLevel", "Trace") -Settings:set("typecheckingEnabled", true) +local DevSettings = require(Rojo.Plugin.DevSettings) + +local setDevSettings = not DevSettings:hasChangedValues() + +if setDevSettings then + DevSettings:createTestSettings() +end require(Rojo.Plugin.runTests)(TestEZ) + +if setDevSettings then + DevSettings:resetValues() +end \ No newline at end of file diff --git a/plugin/src/ApiContext.lua b/plugin/src/ApiContext.lua index 2ce6ea14..40af8058 100644 --- a/plugin/src/ApiContext.lua +++ b/plugin/src/ApiContext.lua @@ -1,8 +1,6 @@ -local Packages = script.Parent.Parent.Packages -local HttpService = game:GetService("HttpService") -local Http = require(Packages.Http) -local Log = require(Packages.Log) -local Promise = require(Packages.Promise) +local Http = require(script.Parent.Parent.Http) +local Log = require(script.Parent.Parent.Log) +local Promise = require(script.Parent.Parent.Promise) local Config = require(script.Parent.Config) local Types = require(script.Parent.Types) @@ -10,9 +8,14 @@ local Version = require(script.Parent.Version) local validateApiInfo = Types.ifEnabled(Types.ApiInfoResponse) local validateApiRead = Types.ifEnabled(Types.ApiReadResponse) -local validateApiSocketPacket = Types.ifEnabled(Types.ApiSocketPacket) -local validateApiSerialize = Types.ifEnabled(Types.ApiSerializeResponse) -local validateApiRefPatch = Types.ifEnabled(Types.ApiRefPatchResponse) +local validateApiSubscribe = Types.ifEnabled(Types.ApiSubscribeResponse) + +--[[ + Returns a promise that will never resolve nor reject. +]] +local function hangingPromise() + return Promise.new(function() end) +end local function rejectFailedRequests(response) if response.code >= 400 then @@ -27,17 +30,15 @@ end local function rejectWrongProtocolVersion(infoResponseBody) if infoResponseBody.protocolVersion ~= Config.protocolVersion then local message = ( - "Found a Rojo dev server, but it's using a different protocol version, and is incompatible." - .. "\nMake sure you have matching versions of both the Rojo plugin and server!" - .. "\n\nYour client is version %s, with protocol version %s. It expects server version %s." - .. "\nYour server is version %s, with protocol version %s." - .. "\n\nGo to https://github.com/rojo-rbx/rojo for more details." + "Found a Rojo dev server, but it's using a different protocol version, and is incompatible." .. + "\nMake sure you have matching versions of both the Rojo plugin and server!" .. + "\n\nYour client is version %s, with protocol version %s. It expects server version %s." .. + "\nYour server is version %s, with protocol version %s." .. + "\n\nGo to https://github.com/rojo-rbx/rojo for more details." ):format( - Version.display(Config.version), - Config.protocolVersion, + Version.display(Config.version), Config.protocolVersion, Config.expectedServerVersionString, - infoResponseBody.serverVersion, - infoResponseBody.protocolVersion + infoResponseBody.serverVersion, infoResponseBody.protocolVersion ) return Promise.reject(message) @@ -48,7 +49,14 @@ end local function rejectWrongPlaceId(infoResponseBody) if infoResponseBody.expectedPlaceIds ~= nil then - local foundId = table.find(infoResponseBody.expectedPlaceIds, game.PlaceId) + local foundId = false + + for _, id in ipairs(infoResponseBody.expectedPlaceIds) do + if id == game.PlaceId then + foundId = true + break + end + end if not foundId then local idList = {} @@ -57,31 +65,14 @@ local function rejectWrongPlaceId(infoResponseBody) end local message = ( - "Found a Rojo server, but its project is set to only be used with a specific list of places." - .. "\nYour place ID is %u, but needs to be one of these:" - .. "\n%s" - .. "\n\nTo change this list, edit 'servePlaceIds' in your .project.json file." - ):format(game.PlaceId, table.concat(idList, "\n")) - - return Promise.reject(message) - end - end - - if infoResponseBody.unexpectedPlaceIds ~= nil then - local foundId = table.find(infoResponseBody.unexpectedPlaceIds, game.PlaceId) - - if foundId then - local idList = {} - for _, id in ipairs(infoResponseBody.unexpectedPlaceIds) do - table.insert(idList, "- " .. tostring(id)) - end - - local message = ( - "Found a Rojo server, but its project is set to not be used with a specific list of places." - .. "\nYour place ID is %u, but needs to not be one of these:" - .. "\n%s" - .. "\n\nTo change this list, edit 'blockedPlaceIds' in your .project.json file." - ):format(game.PlaceId, table.concat(idList, "\n")) + "Found a Rojo server, but its project is set to only be used with a specific list of places." .. + "\nYour place ID is %s, but needs to be one of these:" .. + "\n%s" .. + "\n\nTo change this list, edit 'servePlaceIds' in your .project.json file." + ):format( + tostring(game.PlaceId), + table.concat(idList, "\n") + ) return Promise.reject(message) end @@ -94,15 +85,13 @@ local ApiContext = {} ApiContext.__index = ApiContext function ApiContext.new(baseUrl) - assert(type(baseUrl) == "string", "baseUrl must be a string") + assert(type(baseUrl) == "string") local self = { __baseUrl = baseUrl, __sessionId = nil, __messageCursor = -1, - __wsClient = nil, __connected = true, - __activeRequests = {}, } return setmetatable(self, ApiContext) @@ -123,17 +112,6 @@ end function ApiContext:disconnect() self.__connected = false - for request in self.__activeRequests do - Log.trace("Cancelling request {}", request) - request:cancel() - end - self.__activeRequests = {} - - if self.__wsClient then - Log.trace("Closing WebSocket client") - self.__wsClient:Close() - end - self.__wsClient = nil end function ApiContext:setMessageCursor(index) @@ -145,7 +123,7 @@ function ApiContext:connect() return Http.get(url) :andThen(rejectFailedRequests) - :andThen(Http.Response.msgpack) + :andThen(Http.Response.json) :andThen(rejectWrongProtocolVersion) :andThen(function(body) assert(validateApiInfo(body)) @@ -163,15 +141,18 @@ end function ApiContext:read(ids) local url = ("%s/api/read/%s"):format(self.__baseUrl, table.concat(ids, ",")) - return Http.get(url):andThen(rejectFailedRequests):andThen(Http.Response.msgpack):andThen(function(body) - if body.sessionId ~= self.__sessionId then - return Promise.reject("Server changed ID") - end + return Http.get(url) + :andThen(rejectFailedRequests) + :andThen(Http.Response.json) + :andThen(function(body) + if body.sessionId ~= self.__sessionId then + return Promise.reject("Server changed ID") + end - assert(validateApiRead(body)) + assert(validateApiRead(body)) - return body - end) + return body + end) end function ApiContext:write(patch) @@ -191,9 +172,9 @@ function ApiContext:write(patch) table.insert(updated, fixedUpdate) end - -- Only add the 'added' field if the table is non-empty, or else the msgpack - -- encode implementation will turn the table into an array instead of a map, - -- causing API validation to fail. + -- Only add the 'added' field if the table is non-empty, or else Roblox's + -- JSON implementation will turn the table into an array instead of an + -- object, causing API validation to fail. local added if next(patch.added) ~= nil then added = patch.added @@ -206,126 +187,65 @@ function ApiContext:write(patch) added = added, } - body = Http.msgpackEncode(body) + body = Http.jsonEncode(body) return Http.post(url, body) :andThen(rejectFailedRequests) - :andThen(Http.Response.msgpack) - :andThen(function(responseBody) - Log.info("Write response: {:?}", responseBody) + :andThen(Http.Response.json) + :andThen(function(body) + Log.info("Write response: {:?}", body) - return responseBody + return body end) end -function ApiContext:connectWebSocket(packetHandlers) - local url = ("%s/api/socket/%s"):format(self.__baseUrl, self.__messageCursor) - -- Convert HTTP/HTTPS URL to WS/WSS - url = url:gsub("^http://", "ws://"):gsub("^https://", "wss://") +function ApiContext:retrieveMessages() + local url = ("%s/api/subscribe/%s"):format(self.__baseUrl, self.__messageCursor) - return Promise.new(function(resolve, reject) - local success, wsClient = - pcall(HttpService.CreateWebStreamClient, HttpService, Enum.WebStreamClientType.WebSocket, { - Url = url, - }) - if not success then - reject("Failed to create WebSocket client: " .. tostring(wsClient)) - return - end - self.__wsClient = wsClient - - local closed, errored, received - - received = self.__wsClient.MessageReceived:Connect(function(msg) - local data = Http.msgpackDecode(msg) - if data.sessionId ~= self.__sessionId then - Log.warn("Received message with wrong session ID; ignoring") - return - end - - assert(validateApiSocketPacket(data)) - - Log.trace("Received websocket packet: {:#?}", data) - - local handler = packetHandlers[data.packetType] - if handler then - local ok, err = pcall(handler, data.body) - if not ok then - Log.error("Error in WebSocket packet handler for type '%s': %s", data.packetType, err) + local function sendRequest() + return Http.get(url) + :catch(function(err) + if err.type == Http.Error.Kind.Timeout then + if self.__connected then + return sendRequest() + else + return hangingPromise() + end end - else - Log.warn("No handler for WebSocket packet type '%s'", data.packetType) + + return Promise.reject(err) + end) + end + + return sendRequest() + :andThen(rejectFailedRequests) + :andThen(Http.Response.json) + :andThen(function(body) + if body.sessionId ~= self.__sessionId then + return Promise.reject("Server changed ID") end + + assert(validateApiSubscribe(body)) + + self:setMessageCursor(body.messageCursor) + + return body.messages end) - - closed = self.__wsClient.Closed:Connect(function() - closed:Disconnect() - errored:Disconnect() - received:Disconnect() - - if self.__connected then - reject("WebSocket connection closed unexpectedly") - else - resolve() - end - end) - - errored = self.__wsClient.Error:Connect(function(code, msg) - closed:Disconnect() - errored:Disconnect() - received:Disconnect() - - reject("WebSocket error: " .. code .. " - " .. msg) - end) - end) end function ApiContext:open(id) local url = ("%s/api/open/%s"):format(self.__baseUrl, id) - return Http.post(url, ""):andThen(rejectFailedRequests):andThen(Http.Response.msgpack):andThen(function(body) - if body.sessionId ~= self.__sessionId then - return Promise.reject("Server changed ID") - end - - return nil - end) -end - -function ApiContext:serialize(ids: { string }) - local url = ("%s/api/serialize"):format(self.__baseUrl) - local request_body = Http.msgpackEncode({ sessionId = self.__sessionId, ids = ids }) - - return Http.post(url, request_body) + return Http.post(url, "") :andThen(rejectFailedRequests) - :andThen(Http.Response.msgpack) - :andThen(function(response_body) - if response_body.sessionId ~= self.__sessionId then + :andThen(Http.Response.json) + :andThen(function(body) + if body.sessionId ~= self.__sessionId then return Promise.reject("Server changed ID") end - assert(validateApiSerialize(response_body)) - - return response_body + return nil end) end -function ApiContext:refPatch(ids: { string }) - local url = ("%s/api/ref-patch"):format(self.__baseUrl) - local request_body = Http.msgpackEncode({ sessionId = self.__sessionId, ids = ids }) - - return Http.post(url, request_body) - :andThen(rejectFailedRequests) - :andThen(Http.Response.msgpack) - :andThen(function(response_body) - if response_body.sessionId ~= self.__sessionId then - return Promise.reject("Server changed ID") - end - - assert(validateApiRefPatch(response_body)) - - return response_body - end) -end - -return ApiContext +return ApiContext \ No newline at end of file diff --git a/plugin/src/App/Components/BorderedContainer.lua b/plugin/src/App/Components/BorderedContainer.lua index 42fec65c..78ceb426 100644 --- a/plugin/src/App/Components/BorderedContainer.lua +++ b/plugin/src/App/Components/BorderedContainer.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Theme = require(Plugin.App.Theme) local Assets = require(Plugin.Assets) @@ -24,10 +23,8 @@ local function BorderedContainer(props) layoutOrder = props.layoutOrder, }, { Content = e("Frame", { - Size = UDim2.new(1, -2, 1, -2), - Position = UDim2.new(0, 1, 0, 1), + Size = UDim2.new(1, 0, 1, 0), BackgroundTransparency = 1, - ZIndex = 2, }, props[Roact.Children]), Border = e(SlicedImage, { @@ -41,4 +38,4 @@ local function BorderedContainer(props) end) end -return BorderedContainer +return BorderedContainer \ No newline at end of file diff --git a/plugin/src/App/Components/Checkbox.lua b/plugin/src/App/Components/Checkbox.lua index 98cbf8c0..21c2c544 100644 --- a/plugin/src/App/Components/Checkbox.lua +++ b/plugin/src/App/Components/Checkbox.lua @@ -1,16 +1,14 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) +local Roact = require(Rojo.Roact) +local Flipper = require(Rojo.Flipper) local Assets = require(Plugin.Assets) local Theme = require(Plugin.App.Theme) local bindingUtil = require(Plugin.App.bindingUtil) local SlicedImage = require(script.Parent.SlicedImage) -local Tooltip = require(script.Parent.Tooltip) local e = Roact.createElement @@ -23,16 +21,18 @@ end function Checkbox:didUpdate(lastProps) if lastProps.active ~= self.props.active then - self.motor:setGoal(Flipper.Spring.new(self.props.active and 1 or 0, { - frequency = 6, - dampingRatio = 1.1, - })) + self.motor:setGoal( + Flipper.Spring.new(self.props.active and 1 or 0, { + frequency = 6, + dampingRatio = 1.1, + }) + ) end end function Checkbox:render() return Theme.with(function(theme) - local checkboxTheme = theme.Checkbox + theme = theme.Checkbox local activeTransparency = Roact.joinBindings({ self.binding:map(function(value) @@ -49,29 +49,18 @@ function Checkbox:render() ZIndex = self.props.zIndex, BackgroundTransparency = 1, - [Roact.Event.Activated] = function() - if self.props.locked then - return - end - self.props.onClick() - end, + [Roact.Event.Activated] = self.props.onClick, }, { - StateTip = e(Tooltip.Trigger, { - text = (if self.props.locked - then (self.props.lockedTooltip or "(Cannot be changed right now)") .. "\n" - else "") .. (if self.props.active then "Enabled" else "Disabled"), - }), - Active = e(SlicedImage, { slice = Assets.Slices.RoundedBackground, - color = checkboxTheme.Active.BackgroundColor, + color = theme.Active.BackgroundColor, transparency = activeTransparency, size = UDim2.new(1, 0, 1, 0), zIndex = 2, }, { Icon = e("ImageLabel", { - Image = if self.props.locked then Assets.Images.Checkbox.Locked else Assets.Images.Checkbox.Active, - ImageColor3 = checkboxTheme.Active.IconColor, + Image = Assets.Images.Checkbox.Active, + ImageColor3 = theme.Active.IconColor, ImageTransparency = activeTransparency, Size = UDim2.new(0, 16, 0, 16), @@ -84,15 +73,13 @@ function Checkbox:render() Inactive = e(SlicedImage, { slice = Assets.Slices.RoundedBorder, - color = checkboxTheme.Inactive.BorderColor, + color = theme.Inactive.BorderColor, transparency = self.props.transparency, size = UDim2.new(1, 0, 1, 0), }, { Icon = e("ImageLabel", { - Image = if self.props.locked - then Assets.Images.Checkbox.Locked - else Assets.Images.Checkbox.Inactive, - ImageColor3 = checkboxTheme.Inactive.IconColor, + Image = Assets.Images.Checkbox.Inactive, + ImageColor3 = theme.Inactive.IconColor, ImageTransparency = self.props.transparency, Size = UDim2.new(0, 16, 0, 16), @@ -106,4 +93,4 @@ function Checkbox:render() end) end -return Checkbox +return Checkbox \ No newline at end of file diff --git a/plugin/src/App/Components/ClassIcon.lua b/plugin/src/App/Components/ClassIcon.lua deleted file mode 100644 index 43f1ed2b..00000000 --- a/plugin/src/App/Components/ClassIcon.lua +++ /dev/null @@ -1,160 +0,0 @@ -local StudioService = game:GetService("StudioService") -local AssetService = game:GetService("AssetService") - -type CachedImageInfo = { - pixels: buffer, - size: Vector2, -} - -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local e = Roact.createElement - -local EditableImage = require(Plugin.App.Components.EditableImage) - -local imageCache: { [string]: CachedImageInfo } = {} - -local function cloneBuffer(b: buffer): buffer - local newBuffer = buffer.create(buffer.len(b)) - buffer.copy(newBuffer, 0, b) - return newBuffer -end - -local function getImageSizeAndPixels(image: string): (Vector2, buffer) - local cachedImage = imageCache[image] - - if not cachedImage then - local editableImage = AssetService:CreateEditableImageAsync(Content.fromUri(image)) - local size = editableImage.Size - local pixels = editableImage:ReadPixelsBuffer(Vector2.zero, size) - imageCache[image] = { - pixels = pixels, - size = size, - } - - return size, cloneBuffer(pixels) - end - - return cachedImage.size, cloneBuffer(cachedImage.pixels) -end - -local function getRecoloredClassIcon(className, color) - local iconProps = StudioService:GetClassIcon(className) - - if iconProps and color then - --stylua: ignore - local success, editableImageSize, editableImagePixels = pcall(function(_iconProps: { [any]: any }, _color: Color3): (Vector2, buffer) - local size, pixels = getImageSizeAndPixels(_iconProps.Image) - local pixelsLen = buffer.len(pixels) - - local minVal, maxVal = math.huge, -math.huge - - for i = 0, pixelsLen, 4 do - if buffer.readu8(pixels, i + 3) == 0 then - continue - end - local pixelVal = math.max( - buffer.readu8(pixels, i), - buffer.readu8(pixels, i + 1), - buffer.readu8(pixels, i + 2) - ) - - minVal = math.min(minVal, pixelVal) - maxVal = math.max(maxVal, pixelVal) - end - - local hue, sat, val = _color:ToHSV() - - for i = 0, pixelsLen, 4 do - if buffer.readu8(pixels, i + 3) == 0 then - continue - end - local gIndex = i + 1 - local bIndex = i + 2 - - local pixelVal = math.max( - buffer.readu8(pixels, i), - buffer.readu8(pixels, gIndex), - buffer.readu8(pixels, bIndex) - ) - local newVal = val - if minVal < maxVal then - -- Remap minVal - maxVal to val*0.9 - val - newVal = val * (0.9 + 0.1 * (pixelVal - minVal) / (maxVal - minVal)) - end - - local newPixelColor = Color3.fromHSV(hue, sat, newVal) - buffer.writeu8(pixels, i, newPixelColor.R) - buffer.writeu8(pixels, gIndex, newPixelColor.G) - buffer.writeu8(pixels, bIndex, newPixelColor.B) - end - return size, pixels - end, iconProps, color) - if success then - iconProps.EditableImagePixels = editableImagePixels - iconProps.EditableImageSize = editableImageSize - end - end - - return iconProps -end - -local ClassIcon = Roact.PureComponent:extend("ClassIcon") - -function ClassIcon:init() - self.state = { - iconProps = nil, - } -end - -function ClassIcon:updateIcon() - local props = self.props - local iconProps = getRecoloredClassIcon(props.className, props.color) - self:setState({ - iconProps = iconProps, - }) -end - -function ClassIcon:didMount() - self:updateIcon() -end - -function ClassIcon:didUpdate(lastProps) - if lastProps.className ~= self.props.className or lastProps.color ~= self.props.color then - self:updateIcon() - end -end - -function ClassIcon:render() - local iconProps = self.state.iconProps - if not iconProps then - return nil - end - - return e( - "ImageLabel", - { - Size = self.props.size, - Position = self.props.position, - LayoutOrder = self.props.layoutOrder, - AnchorPoint = self.props.anchorPoint, - ImageTransparency = self.props.transparency, - Image = iconProps.Image, - ImageRectOffset = iconProps.ImageRectOffset, - ImageRectSize = iconProps.ImageRectSize, - BackgroundTransparency = 1, - }, - if iconProps.EditableImagePixels - then e(EditableImage, { - size = iconProps.EditableImageSize, - pixels = iconProps.EditableImagePixels, - }) - else nil - ) -end - -return ClassIcon diff --git a/plugin/src/App/Components/Dropdown.lua b/plugin/src/App/Components/Dropdown.lua deleted file mode 100644 index 486a614c..00000000 --- a/plugin/src/App/Components/Dropdown.lua +++ /dev/null @@ -1,182 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) - -local Assets = require(Plugin.Assets) -local Theme = require(Plugin.App.Theme) -local bindingUtil = require(Plugin.App.bindingUtil) -local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) - -local SlicedImage = require(script.Parent.SlicedImage) -local ScrollingFrame = require(script.Parent.ScrollingFrame) -local Tooltip = require(script.Parent.Tooltip) - -local e = Roact.createElement - -local Dropdown = Roact.Component:extend("Dropdown") - -function Dropdown:init() - self.openMotor = Flipper.SingleMotor.new(0) - self.openBinding = bindingUtil.fromMotor(self.openMotor) - - self.contentSize, self.setContentSize = Roact.createBinding(Vector2.new(0, 0)) - - self:setState({ - open = false, - }) -end - -function Dropdown:didUpdate(prevProps) - if self.props.locked and not prevProps.locked then - self:setState({ - open = false, - }) - end - - self.openMotor:setGoal(Flipper.Spring.new(self.state.open and 1 or 0, { - frequency = 6, - dampingRatio = 1.1, - })) -end - -function Dropdown:render() - return Theme.with(function(theme) - local dropdownTheme = theme.Dropdown - - local optionButtons = {} - local width = -1 - for i, option in self.props.options do - local text = tostring(option or "") - local textBounds = getTextBoundsAsync(text, theme.Font.Main, theme.TextSize.Body, math.huge) - if textBounds.X > width then - width = textBounds.X - end - - optionButtons[text] = e("TextButton", { - Text = text, - LayoutOrder = i, - Size = UDim2.new(1, 0, 0, 24), - BackgroundColor3 = dropdownTheme.BackgroundColor, - TextTransparency = self.props.transparency, - BackgroundTransparency = self.props.transparency, - BorderSizePixel = 0, - TextColor3 = dropdownTheme.TextColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextSize = theme.TextSize.Body, - FontFace = theme.Font.Main, - - [Roact.Event.Activated] = function() - if self.props.locked then - return - end - self:setState({ - open = false, - }) - self.props.onClick(option) - end, - }, { - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 6), - }), - }) - end - - return e("ImageButton", { - Size = UDim2.new(0, width + 50, 0, 28), - Position = self.props.position, - AnchorPoint = self.props.anchorPoint, - LayoutOrder = self.props.layoutOrder, - ZIndex = self.props.zIndex, - BackgroundTransparency = 1, - - [Roact.Event.Activated] = function() - if self.props.locked then - return - end - self:setState({ - open = not self.state.open, - }) - end, - }, { - Border = e(SlicedImage, { - slice = Assets.Slices.RoundedBorder, - color = dropdownTheme.BorderColor, - transparency = self.props.transparency, - size = UDim2.new(1, 0, 1, 0), - }, { - DropArrow = e("ImageLabel", { - Image = if self.props.locked then Assets.Images.Dropdown.Locked else Assets.Images.Dropdown.Arrow, - ImageColor3 = dropdownTheme.IconColor, - ImageTransparency = self.props.transparency, - - Size = UDim2.new(0, 18, 0, 18), - Position = UDim2.new(1, -6, 0.5, 0), - AnchorPoint = Vector2.new(1, 0.5), - Rotation = self.openBinding:map(function(a) - return a * 180 - end), - - BackgroundTransparency = 1, - }, { - StateTip = if self.props.locked - then e(Tooltip.Trigger, { - text = self.props.lockedTooltip or "(Cannot be changed right now)", - }) - else nil, - }), - Active = e("TextLabel", { - Size = UDim2.new(1, -30, 1, 0), - Position = UDim2.new(0, 6, 0, 0), - BackgroundTransparency = 1, - Text = self.props.active, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = dropdownTheme.TextColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = self.props.transparency, - }), - }), - Options = if self.state.open - then e(SlicedImage, { - slice = Assets.Slices.RoundedBackground, - color = dropdownTheme.BackgroundColor, - position = UDim2.new(1, 0, 1, 3), - size = self.openBinding:map(function(a) - return UDim2.new(1, 0, a * math.min(3, #self.props.options), 0) - end), - anchorPoint = Vector2.new(1, 0), - }, { - Border = e(SlicedImage, { - slice = Assets.Slices.RoundedBorder, - color = dropdownTheme.BorderColor, - transparency = self.props.transparency, - size = UDim2.new(1, 0, 1, 0), - }), - ScrollingFrame = e(ScrollingFrame, { - size = UDim2.new(1, -4, 1, -4), - position = UDim2.new(0, 2, 0, 2), - transparency = self.props.transparency, - contentSize = self.contentSize, - }, { - Layout = e("UIListLayout", { - VerticalAlignment = Enum.VerticalAlignment.Top, - FillDirection = Enum.FillDirection.Vertical, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 0), - - [Roact.Change.AbsoluteContentSize] = function(object) - self.setContentSize(object.AbsoluteContentSize) - end, - }), - Options = Roact.createFragment(optionButtons), - }), - }) - else nil, - }) - end) -end - -return Dropdown diff --git a/plugin/src/App/Components/EditableImage.lua b/plugin/src/App/Components/EditableImage.lua deleted file mode 100644 index cf7dcd7d..00000000 --- a/plugin/src/App/Components/EditableImage.lua +++ /dev/null @@ -1,42 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local e = Roact.createElement - -local EditableImage = Roact.PureComponent:extend("EditableImage") - -function EditableImage:init() - self.ref = Roact.createRef() -end - -function EditableImage:writePixels() - local image = self.ref.current :: EditableImage - - if not image then - return - end - if not self.props.pixels then - return - end - - image:WritePixelsBuffer(Vector2.zero, self.props.size, self.props.pixels) -end - -function EditableImage:render() - return e("EditableImage", { - Size = self.props.size, - [Roact.Ref] = self.ref, - }) -end - -function EditableImage:didMount() - self:writePixels() -end - -function EditableImage:didUpdate() - self:writePixels() -end - -return EditableImage diff --git a/plugin/src/App/Components/Header.lua b/plugin/src/App/Components/Header.lua index fa8c9173..fdc5e5d1 100644 --- a/plugin/src/App/Components/Header.lua +++ b/plugin/src/App/Components/Header.lua @@ -1,78 +1,15 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Theme = require(Plugin.App.Theme) local Assets = require(Plugin.Assets) local Config = require(Plugin.Config) local Version = require(Plugin.Version) -local Tooltip = require(Plugin.App.Components.Tooltip) -local SlicedImage = require(script.Parent.SlicedImage) - local e = Roact.createElement -local function VersionIndicator(props) - local updateMessage = Version.getUpdateMessage() - - return Theme.with(function(theme) - return e("Frame", { - LayoutOrder = props.layoutOrder, - Size = UDim2.new(0, 0, 0, 25), - BackgroundTransparency = 1, - AutomaticSize = Enum.AutomaticSize.X, - }, { - Border = if updateMessage - then e(SlicedImage, { - slice = Assets.Slices.RoundedBorder, - color = theme.Button.Bordered.Enabled.BorderColor, - transparency = props.transparency, - size = UDim2.fromScale(1, 1), - zIndex = 0, - }, { - Indicator = e("ImageLabel", { - Size = UDim2.new(0, 10, 0, 10), - ScaleType = Enum.ScaleType.Fit, - Image = Assets.Images.Circles[16], - ImageColor3 = theme.Header.LogoColor, - ImageTransparency = props.transparency, - BackgroundTransparency = 1, - Position = UDim2.new(1, 0, 0, 0), - AnchorPoint = Vector2.new(0.5, 0.5), - }), - }) - else nil, - - Tip = if updateMessage - then e(Tooltip.Trigger, { - text = updateMessage, - delay = 0.1, - }) - else nil, - - VersionText = e("TextLabel", { - Text = Version.display(Config.version), - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Header.VersionColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - BackgroundTransparency = 1, - - Size = UDim2.new(0, 0, 1, 0), - AutomaticSize = Enum.AutomaticSize.X, - }, { - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 6), - PaddingRight = UDim.new(0, 6), - }), - }), - }) - end) -end - local function Header(props) return Theme.with(function(theme) return e("Frame", { @@ -91,9 +28,18 @@ local function Header(props) BackgroundTransparency = 1, }), - VersionIndicator = e(VersionIndicator, { - transparency = props.transparency, - layoutOrder = 2, + Version = e("TextLabel", { + Text = Version.display(Config.version), + Font = Enum.Font.Gotham, + TextSize = 14, + TextColor3 = theme.Header.VersionColor, + TextXAlignment = Enum.TextXAlignment.Left, + TextTransparency = props.transparency, + + Size = UDim2.new(1, 0, 0, 14), + + LayoutOrder = 2, + BackgroundTransparency = 1, }), Layout = e("UIListLayout", { @@ -106,4 +52,4 @@ local function Header(props) end) end -return Header +return Header \ No newline at end of file diff --git a/plugin/src/App/Components/IconButton.lua b/plugin/src/App/Components/IconButton.lua index dc451b0d..388a1fe0 100644 --- a/plugin/src/App/Components/IconButton.lua +++ b/plugin/src/App/Components/IconButton.lua @@ -1,9 +1,8 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) +local Roact = require(Rojo.Roact) +local Flipper = require(Rojo.Flipper) local Assets = require(Plugin.Assets) local bindingUtil = require(Plugin.App.bindingUtil) @@ -30,7 +29,6 @@ function IconButton:render() Position = self.props.position, AnchorPoint = self.props.anchorPoint, - Visible = self.props.visible, LayoutOrder = self.props.layoutOrder, ZIndex = self.props.zIndex, BackgroundTransparency = 1, @@ -38,11 +36,15 @@ function IconButton:render() [Roact.Event.Activated] = self.props.onClick, [Roact.Event.MouseEnter] = function() - self.motor:setGoal(Flipper.Spring.new(1, HOVER_SPRING_PROPS)) + self.motor:setGoal( + Flipper.Spring.new(1, HOVER_SPRING_PROPS) + ) end, [Roact.Event.MouseLeave] = function() - self.motor:setGoal(Flipper.Spring.new(0, HOVER_SPRING_PROPS)) + self.motor:setGoal( + Flipper.Spring.new(0, HOVER_SPRING_PROPS) + ) end, }, { Icon = e("ImageLabel", { @@ -71,9 +73,7 @@ function IconButton:render() BackgroundTransparency = 1, }), - - Children = Roact.createFragment(self.props[Roact.Children]), }) end -return IconButton +return IconButton \ No newline at end of file diff --git a/plugin/src/App/Components/Notifications/FullscreenNotification.lua b/plugin/src/App/Components/Notifications/FullscreenNotification.lua deleted file mode 100644 index 47d0ae6f..00000000 --- a/plugin/src/App/Components/Notifications/FullscreenNotification.lua +++ /dev/null @@ -1,157 +0,0 @@ -local StudioService = game:GetService("StudioService") - -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Log = require(Packages.Log) - -local Theme = require(Plugin.App.Theme) -local Assets = require(Plugin.Assets) - -local TextButton = require(Plugin.App.Components.TextButton) - -local e = Roact.createElement - -local FullscreenNotification = Roact.Component:extend("FullscreeFullscreenNotificationnNotification") - -function FullscreenNotification:init() - self.transparency, self.setTransparency = Roact.createBinding(0) - self.lifetime = self.props.timeout - self.dismissed = false -end - -function FullscreenNotification:dismiss() - if self.dismissed then - return - end - self.dismissed = true - - if self.props.onClose then - self.props.onClose() - end -end - -function FullscreenNotification:didMount() - self.props.soundPlayer:play(Assets.Sounds.Notification) - - self.timeout = task.spawn(function() - local clock = os.clock() - local seen = false - while task.wait(1 / 10) do - local now = os.clock() - local dt = now - clock - clock = now - - if not seen then - seen = StudioService.ActiveScript == nil - end - - if not seen then - -- Don't run down timer before being viewed - continue - end - - self.lifetime -= dt - if self.lifetime <= 0 then - self:dismiss() - break - end - end - - self.timeout = nil - end) -end - -function FullscreenNotification:willUnmount() - if self.timeout and coroutine.status(self.timeout) == "suspended" then - task.cancel(self.timeout) - end -end - -function FullscreenNotification:render() - return Theme.with(function(theme) - local actionButtons = {} - if self.props.actions then - for key, action in self.props.actions do - actionButtons[key] = e(TextButton, { - text = action.text, - style = action.style, - onClick = function() - self:dismiss() - if action.onClick then - local success, err = pcall(action.onClick, self) - if not success then - Log.warn("Error in notification action: " .. tostring(err)) - end - end - end, - layoutOrder = -action.layoutOrder, - transparency = self.transparency, - }) - end - end - - return e("Frame", { - BackgroundColor3 = theme.BackgroundColor, - Size = UDim2.fromScale(1, 1), - ZIndex = self.props.layoutOrder, - }, { - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 17), - PaddingRight = UDim.new(0, 15), - PaddingTop = UDim.new(0, 10), - PaddingBottom = UDim.new(0, 10), - }), - Layout = e("UIListLayout", { - SortOrder = Enum.SortOrder.LayoutOrder, - FillDirection = Enum.FillDirection.Vertical, - HorizontalAlignment = Enum.HorizontalAlignment.Center, - VerticalAlignment = Enum.VerticalAlignment.Center, - Padding = UDim.new(0, 10), - }), - Logo = e("ImageLabel", { - ImageTransparency = self.transparency, - Image = Assets.Images.Logo, - ImageColor3 = theme.Header.LogoColor, - BackgroundTransparency = 1, - Size = UDim2.fromOffset(60, 27), - LayoutOrder = 1, - }), - Info = e("TextLabel", { - Text = self.props.text, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Notification.InfoColor, - TextTransparency = self.transparency, - TextXAlignment = Enum.TextXAlignment.Center, - TextYAlignment = Enum.TextYAlignment.Center, - TextWrapped = true, - BackgroundTransparency = 1, - - AutomaticSize = Enum.AutomaticSize.Y, - Size = UDim2.fromScale(0.4, 0), - LayoutOrder = 2, - }), - Actions = if self.props.actions - then e("Frame", { - Size = UDim2.new(1, -40, 0, 37), - BackgroundTransparency = 1, - LayoutOrder = 3, - }, { - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - HorizontalAlignment = Enum.HorizontalAlignment.Center, - VerticalAlignment = Enum.VerticalAlignment.Center, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 5), - }), - Buttons = Roact.createFragment(actionButtons), - }) - else nil, - }) - end) -end - -return FullscreenNotification diff --git a/plugin/src/App/Components/Notifications/Notification.lua b/plugin/src/App/Components/Notifications/Notification.lua deleted file mode 100644 index 1d9464c9..00000000 --- a/plugin/src/App/Components/Notifications/Notification.lua +++ /dev/null @@ -1,210 +0,0 @@ -local StudioService = game:GetService("StudioService") - -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) -local Log = require(Packages.Log) - -local Theme = require(Plugin.App.Theme) -local Assets = require(Plugin.Assets) -local bindingUtil = require(Plugin.App.bindingUtil) -local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) - -local BorderedContainer = require(Plugin.App.Components.BorderedContainer) -local TextButton = require(Plugin.App.Components.TextButton) - -local e = Roact.createElement - -local Notification = Roact.Component:extend("Notification") - -function Notification:init() - self.motor = Flipper.SingleMotor.new(0) - self.binding = bindingUtil.fromMotor(self.motor) - - self.lifetime = self.props.timeout - self.dismissed = false - - self.motor:onStep(function(value) - if value <= 0 and self.props.onClose then - self.props.onClose() - end - end) -end - -function Notification:dismiss() - if self.dismissed then - return - end - self.dismissed = true - - self.motor:setGoal(Flipper.Spring.new(0, { - frequency = 5, - dampingRatio = 1, - })) -end - -function Notification:didMount() - self.motor:setGoal(Flipper.Spring.new(1, { - frequency = 3, - dampingRatio = 1, - })) - - self.props.soundPlayer:play(Assets.Sounds.Notification) - - self.timeout = task.spawn(function() - local clock = os.clock() - local seen = false - while task.wait(1 / 10) do - local now = os.clock() - local dt = now - clock - clock = now - - if not seen then - seen = StudioService.ActiveScript == nil - end - - if not seen then - -- Don't run down timer before being viewed - continue - end - - self.lifetime -= dt - if self.lifetime <= 0 then - self:dismiss() - break - end - end - end) -end - -function Notification:willUnmount() - if self.timeout and coroutine.status(self.timeout) == "suspended" then - task.cancel(self.timeout) - end -end - -function Notification:render() - local transparency = self.binding:map(function(value) - return 1 - value - end) - - return Theme.with(function(theme) - local actionButtons = {} - local buttonsX = 0 - if self.props.actions then - local count = 0 - for key, action in self.props.actions do - actionButtons[key] = e(TextButton, { - text = action.text, - style = action.style, - onClick = function() - self:dismiss() - if action.onClick then - local success, err = pcall(action.onClick, self) - if not success then - Log.warn("Error in notification action: " .. tostring(err)) - end - end - end, - layoutOrder = -action.layoutOrder, - transparency = transparency, - }) - - buttonsX += getTextBoundsAsync(action.text, theme.Font.Main, theme.TextSize.Large, math.huge).X + (theme.TextSize.Body * 2) - - count += 1 - end - - buttonsX += (count - 1) * 5 - end - - local paddingY, logoSize = 20, 32 - local actionsY = if self.props.actions then 37 else 0 - local textXSpace = math.max(250, buttonsX) + 35 - local textBounds = getTextBoundsAsync(self.props.text, theme.Font.Main, theme.TextSize.Body, textXSpace) - local contentX = math.max(textBounds.X, buttonsX) - - local size = self.binding:map(function(value) - return UDim2.fromOffset( - (35 + 40 + contentX) * value, - 5 + actionsY + paddingY + math.max(logoSize, textBounds.Y) - ) - end) - - return e("TextButton", { - BackgroundTransparency = 1, - Size = size, - LayoutOrder = self.props.layoutOrder, - Text = "", - ClipsDescendants = true, - - [Roact.Event.Activated] = function() - self:dismiss() - end, - }, { - e(BorderedContainer, { - transparency = transparency, - size = UDim2.fromScale(1, 1), - }, { - Contents = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - Logo = e("ImageLabel", { - ImageTransparency = transparency, - Image = Assets.Images.PluginButton, - BackgroundTransparency = 1, - Size = UDim2.fromOffset(logoSize, logoSize), - Position = UDim2.new(0, 0, 0, 0), - AnchorPoint = Vector2.new(0, 0), - }), - Info = e("TextLabel", { - Text = self.props.text, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Notification.InfoColor, - TextTransparency = transparency, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Center, - TextWrapped = true, - - Size = UDim2.new(0, textBounds.X, 1, -actionsY), - Position = UDim2.fromOffset(35, 0), - - LayoutOrder = 1, - BackgroundTransparency = 1, - }), - Actions = if self.props.actions - then e("Frame", { - Size = UDim2.new(1, -40, 0, actionsY), - Position = UDim2.fromScale(1, 1), - AnchorPoint = Vector2.new(1, 1), - BackgroundTransparency = 1, - }, { - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - HorizontalAlignment = Enum.HorizontalAlignment.Right, - VerticalAlignment = Enum.VerticalAlignment.Center, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 5), - }), - Buttons = Roact.createFragment(actionButtons), - }) - else nil, - }), - - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 17), - PaddingRight = UDim.new(0, 15), - PaddingTop = UDim.new(0, paddingY / 2), - PaddingBottom = UDim.new(0, paddingY / 2), - }), - }), - }) - end) -end - -return Notification diff --git a/plugin/src/App/Components/Notifications/init.lua b/plugin/src/App/Components/Notifications/init.lua deleted file mode 100644 index 1cc544d5..00000000 --- a/plugin/src/App/Components/Notifications/init.lua +++ /dev/null @@ -1,66 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") - -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) - -local e = Roact.createElement - -local Notification = require(script.Notification) -local FullscreenNotification = require(script.FullscreenNotification) - -local Notifications = Roact.Component:extend("Notifications") - -function Notifications:render() - local popupNotifs = {} - local fullscreenNotifs = {} - - for id, notif in self.props.notifications do - local targetTable = if notif.isFullscreen then fullscreenNotifs else popupNotifs - local targetComponent = if notif.isFullscreen then FullscreenNotification else Notification - targetTable["NotifID_" .. id] = e(targetComponent, { - soundPlayer = self.props.soundPlayer, - text = notif.text, - timeout = notif.timeout, - actions = notif.actions, - layoutOrder = id, - onClose = function() - if notif.onClose then - notif.onClose() - end - self.props.onClose(id) - end, - }) - end - - return e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - Fullscreen = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - notifs = Roact.createFragment(fullscreenNotifs), - }), - Popups = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - Layout = e("UIListLayout", { - SortOrder = Enum.SortOrder.LayoutOrder, - HorizontalAlignment = Enum.HorizontalAlignment.Right, - VerticalAlignment = Enum.VerticalAlignment.Bottom, - Padding = UDim.new(0, 5), - }), - Padding = e("UIPadding", { - PaddingTop = UDim.new(0, 5), - PaddingBottom = UDim.new(0, 5), - PaddingLeft = UDim.new(0, 5), - PaddingRight = UDim.new(0, 5), - }), - notifs = Roact.createFragment(popupNotifs), - }), - }) -end - -return Notifications diff --git a/plugin/src/App/Components/PatchVisualizer/ChangeList.lua b/plugin/src/App/Components/PatchVisualizer/ChangeList.lua deleted file mode 100644 index fd6f83cc..00000000 --- a/plugin/src/App/Components/PatchVisualizer/ChangeList.lua +++ /dev/null @@ -1,281 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Assets = require(Plugin.Assets) -local Theme = require(Plugin.App.Theme) -local ScrollingFrame = require(Plugin.App.Components.ScrollingFrame) -local BorderedContainer = require(Plugin.App.Components.BorderedContainer) -local DisplayValue = require(script.Parent.DisplayValue) - -local EMPTY_TABLE = {} - -local e = Roact.createElement - -local function ViewDiffButton(props) - return Theme.with(function(theme) - return e("TextButton", { - Text = "", - Size = UDim2.new(0.7, 0, 1, -4), - LayoutOrder = 2, - BackgroundTransparency = 1, - [Roact.Event.Activated] = props.onClick, - }, { - e(BorderedContainer, { - size = UDim2.new(1, 0, 1, 0), - transparency = props.transparency:map(function(t) - return 0.5 + (0.5 * t) - end), - }, { - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - SortOrder = Enum.SortOrder.LayoutOrder, - HorizontalAlignment = Enum.HorizontalAlignment.Center, - VerticalAlignment = Enum.VerticalAlignment.Center, - Padding = UDim.new(0, 5), - }), - Label = e("TextLabel", { - Text = "View Diff", - BackgroundTransparency = 1, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Settings.Setting.DescriptionColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(0, 65, 1, 0), - LayoutOrder = 1, - }), - Icon = e("ImageLabel", { - Image = Assets.Images.Icons.Expand, - ImageColor3 = theme.Settings.Setting.DescriptionColor, - ImageTransparency = props.transparency, - - Size = UDim2.new(0, 16, 0, 16), - Position = UDim2.new(0.5, 0, 0.5, 0), - AnchorPoint = Vector2.new(0.5, 0.5), - - BackgroundTransparency = 1, - LayoutOrder = 2, - }), - }), - }) - end) -end - -local function RowContent(props) - local values = props.values - local metadata = props.metadata - - if props.showStringDiff and values[1] == "Source" then - -- Special case for .Source updates - return e(ViewDiffButton, { - transparency = props.transparency, - onClick = function() - if not props.showStringDiff then - return - end - props.showStringDiff(tostring(values[2]), tostring(values[3])) - end, - }) - end - - if props.showTableDiff and (type(values[2]) == "table" or type(values[3]) == "table") then - -- Special case for table properties (like Attributes/Tags) - return e(ViewDiffButton, { - transparency = props.transparency, - onClick = function() - if not props.showTableDiff then - return - end - props.showTableDiff(values[2], values[3]) - end, - }) - end - - return Theme.with(function(theme) - return Roact.createFragment({ - ColumnB = e( - "Frame", - { - BackgroundTransparency = 1, - Size = UDim2.new(0.35, 0, 1, 0), - LayoutOrder = 2, - }, - e(DisplayValue, { - value = values[2], - transparency = props.transparency, - textColor = if metadata.isWarning - then theme.Diff.Warning - else theme.Settings.Setting.DescriptionColor, - }) - ), - ColumnC = e( - "Frame", - { - BackgroundTransparency = 1, - Size = UDim2.new(0.35, 0, 1, 0), - LayoutOrder = 3, - }, - e(DisplayValue, { - value = values[3], - transparency = props.transparency, - textColor = if metadata.isWarning - then theme.Diff.Warning - else theme.Settings.Setting.DescriptionColor, - }) - ), - }) - end) -end - -local ChangeList = Roact.Component:extend("ChangeList") - -function ChangeList:init() - self.contentSize, self.setContentSize = Roact.createBinding(Vector2.new(0, 0)) -end - -function ChangeList:render() - return Theme.with(function(theme) - local props = self.props - local changes = props.changes - - -- Color alternating rows for readability - local rowTransparency = props.transparency:map(function(t) - return 0.93 + (0.07 * t) - end) - - local rows = {} - local pad = { - PaddingLeft = UDim.new(0, 5), - PaddingRight = UDim.new(0, 5), - } - - local headerRow = changes[1] - local headers = e("Frame", { - Size = UDim2.new(1, 0, 0, 24), - BackgroundTransparency = rowTransparency, - BackgroundColor3 = theme.Diff.Row, - LayoutOrder = 0, - }, { - Padding = e("UIPadding", pad), - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - SortOrder = Enum.SortOrder.LayoutOrder, - HorizontalAlignment = Enum.HorizontalAlignment.Left, - VerticalAlignment = Enum.VerticalAlignment.Center, - }), - ColumnA = e("TextLabel", { - Text = tostring(headerRow[1]), - BackgroundTransparency = 1, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.TextColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(0.3, 0, 1, 0), - LayoutOrder = 1, - }), - ColumnB = e("TextLabel", { - Text = tostring(headerRow[2]), - BackgroundTransparency = 1, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.TextColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(0.35, 0, 1, 0), - LayoutOrder = 2, - }), - ColumnC = e("TextLabel", { - Text = tostring(headerRow[3]), - BackgroundTransparency = 1, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.TextColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(0.35, 0, 1, 0), - LayoutOrder = 3, - }), - }) - - for row, values in changes do - if row == 1 then - continue -- Skip headers, already handled above - end - - local metadata = values[4] or EMPTY_TABLE - local isWarning = metadata.isWarning - - rows[row] = e("Frame", { - Size = UDim2.new(1, 0, 0, 24), - BackgroundTransparency = row % 2 ~= 0 and rowTransparency or 1, - BackgroundColor3 = theme.Diff.Row, - BorderSizePixel = 0, - LayoutOrder = row, - }, { - Padding = e("UIPadding", pad), - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - SortOrder = Enum.SortOrder.LayoutOrder, - HorizontalAlignment = Enum.HorizontalAlignment.Left, - VerticalAlignment = Enum.VerticalAlignment.Center, - }), - ColumnA = e("TextLabel", { - Text = (if isWarning then "âš  " else "") .. tostring(values[1]), - BackgroundTransparency = 1, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = if isWarning then theme.Diff.Warning else theme.TextColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(0.3, 0, 1, 0), - LayoutOrder = 1, - }), - Content = e(RowContent, { - values = values, - metadata = metadata, - transparency = props.transparency, - showStringDiff = props.showStringDiff, - showTableDiff = props.showTableDiff, - }), - }) - end - - table.insert( - rows, - e("UIListLayout", { - FillDirection = Enum.FillDirection.Vertical, - SortOrder = Enum.SortOrder.LayoutOrder, - HorizontalAlignment = Enum.HorizontalAlignment.Right, - VerticalAlignment = Enum.VerticalAlignment.Top, - - [Roact.Change.AbsoluteContentSize] = function(object) - self.setContentSize(object.AbsoluteContentSize) - end, - }) - ) - - return e("Frame", { - Size = UDim2.new(1, 0, 1, 0), - BackgroundTransparency = 1, - }, { - Headers = headers, - Values = e(ScrollingFrame, { - size = UDim2.new(1, 0, 1, -24), - position = UDim2.new(0, 0, 0, 24), - contentSize = self.contentSize, - transparency = props.transparency, - }, rows), - }) - end) -end - -return ChangeList diff --git a/plugin/src/App/Components/PatchVisualizer/DisplayValue.lua b/plugin/src/App/Components/PatchVisualizer/DisplayValue.lua deleted file mode 100644 index 94106af6..00000000 --- a/plugin/src/App/Components/PatchVisualizer/DisplayValue.lua +++ /dev/null @@ -1,126 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Theme = require(Plugin.App.Theme) - -local e = Roact.createElement - -local function DisplayValue(props) - return Theme.with(function(theme) - local t = typeof(props.value) - if t == "Color3" then - -- Colors get a blot that shows the color - return Roact.createFragment({ - Blot = e("Frame", { - BackgroundTransparency = props.transparency, - BackgroundColor3 = props.value, - Size = UDim2.new(0, 20, 0, 20), - Position = UDim2.new(0, 0, 0.5, 0), - AnchorPoint = Vector2.new(0, 0.5), - }, { - Corner = e("UICorner", { - CornerRadius = UDim.new(0, 4), - }), - Stroke = e("UIStroke", { - Color = theme.BorderedContainer.BorderColor, - Transparency = props.transparency, - }), - }), - Label = e("TextLabel", { - Text = string.format("%d, %d, %d", props.value.R * 255, props.value.G * 255, props.value.B * 255), - BackgroundTransparency = 1, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = props.textColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(1, -25, 1, 0), - Position = UDim2.new(0, 25, 0, 0), - }), - }) - elseif t == "table" then - -- Showing a memory address for tables is useless, so we want to show the best we can - local textRepresentation = nil - - local meta = getmetatable(props.value) - if meta and meta.__tostring then - -- If the table has a tostring metamethod, use that - textRepresentation = tostring(props.value) - elseif next(props.value) == nil then - -- If it's empty, show empty braces - textRepresentation = "{}" - elseif next(props.value) == 1 then - -- We don't need to support mixed tables, so checking the first key is enough - -- to determine if it's a simple array - local out, i = table.create(#props.value), 0 - for _, v in props.value do - i += 1 - - -- Wrap strings in quotes - if type(v) == "string" then - v = '"' .. v .. '"' - end - - out[i] = tostring(v) - end - textRepresentation = "{ " .. table.concat(out, ", ") .. " }" - else - -- Otherwise, show the table contents as a dictionary - local out, i = {}, 0 - for k, v in pairs(props.value) do - i += 1 - - -- Wrap strings in quotes - if type(k) == "string" then - k = '"' .. k .. '"' - end - if type(v) == "string" then - v = '"' .. v .. '"' - end - - out[i] = string.format("[%s] = %s", tostring(k), tostring(v)) - end - textRepresentation = "{ " .. table.concat(out, ", ") .. " }" - end - - return e("TextLabel", { - Text = textRepresentation, - BackgroundTransparency = 1, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = props.textColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(1, 0, 1, 0), - }) - end - - -- TODO: Maybe add visualizations to other datatypes? - -- Or special text handling tostring for some? - -- Will add as needed, let's see what cases arise. - - local textRepresentation = string.gsub(tostring(props.value), "%s", " ") - if t == "string" then - textRepresentation = '"' .. textRepresentation .. '"' - end - - return e("TextLabel", { - Text = textRepresentation, - BackgroundTransparency = 1, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = props.textColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(1, 0, 1, 0), - }) - end) -end - -return DisplayValue diff --git a/plugin/src/App/Components/PatchVisualizer/DomLabel.lua b/plugin/src/App/Components/PatchVisualizer/DomLabel.lua deleted file mode 100644 index bc9b110e..00000000 --- a/plugin/src/App/Components/PatchVisualizer/DomLabel.lua +++ /dev/null @@ -1,282 +0,0 @@ -local SelectionService = game:GetService("Selection") - -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) - -local Assets = require(Plugin.Assets) -local Theme = require(Plugin.App.Theme) -local bindingUtil = require(Plugin.App.bindingUtil) - -local e = Roact.createElement - -local ChangeList = require(script.Parent.ChangeList) -local Tooltip = require(Plugin.App.Components.Tooltip) -local ClassIcon = require(Plugin.App.Components.ClassIcon) - -local Expansion = Roact.Component:extend("Expansion") - -function Expansion:render() - local props = self.props - - if not props.rendered then - return nil - end - - return e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(1, -props.indent, 1, -24), - Position = UDim2.new(0, props.indent, 0, 24), - }, { - ChangeList = e(ChangeList, { - changes = props.changeList, - transparency = props.transparency, - showStringDiff = props.showStringDiff, - showTableDiff = props.showTableDiff, - }), - }) -end - -local DomLabel = Roact.Component:extend("DomLabel") - -function DomLabel:init() - local initHeight = self.props.elementHeight:getValue() - self.expanded = initHeight > 24 - - self.motor = Flipper.SingleMotor.new(initHeight) - self.binding = bindingUtil.fromMotor(self.motor) - - self:setState({ - renderExpansion = self.expanded, - }) - self.motor:onStep(function(value) - local renderExpansion = value > 24 - - self.props.setElementHeight(value) - if self.props.updateEvent then - self.props.updateEvent:Fire() - end - - self:setState(function(state) - if state.renderExpansion == renderExpansion then - return nil - end - - return { - renderExpansion = renderExpansion, - } - end) - end) -end - -function DomLabel:didUpdate(prevProps) - if - prevProps.instance ~= self.props.instance - or prevProps.patchType ~= self.props.patchType - or prevProps.name ~= self.props.name - or prevProps.changeList ~= self.props.changeList - then - -- Close the expansion when the domlabel is changed to a different thing - self.expanded = false - self.motor:setGoal(Flipper.Spring.new(24, { - frequency = 5, - dampingRatio = 1, - })) - end -end - -function DomLabel:render() - local props = self.props - local depth = props.depth or 1 - - return Theme.with(function(theme) - local color = if props.isWarning - then theme.Diff.Warning - elseif props.patchType then theme.Diff.Background[props.patchType] - else theme.TextColor - - local indent = (depth - 1) * 12 + 15 - - -- Line guides help indent depth remain readable - local lineGuides = {} - for i = 2, depth do - if props.depthsComplete[i] then - continue - end - if props.isFinalChild and i == depth then - -- This line stops halfway down to merge with our connector for the right angle - lineGuides["Line_" .. i] = e("Frame", { - Size = UDim2.new(0, 2, 0, 15), - Position = UDim2.new(0, (12 * (i - 1)) + 6, 0, -1), - BorderSizePixel = 0, - BackgroundTransparency = props.transparency, - BackgroundColor3 = theme.BorderedContainer.BorderColor, - }) - else - -- All other lines go all the way - -- with the exception of the final element, which stops halfway down - lineGuides["Line_" .. i] = e("Frame", { - Size = UDim2.new(0, 2, 1, if props.isFinalElement then -9 else 2), - Position = UDim2.new(0, (12 * (i - 1)) + 6, 0, -1), - BorderSizePixel = 0, - BackgroundTransparency = props.transparency, - BackgroundColor3 = theme.BorderedContainer.BorderColor, - }) - end - end - - if depth ~= 1 then - lineGuides["Connector"] = e("Frame", { - Size = UDim2.new(0, 8, 0, 2), - Position = UDim2.new(0, 2 + (12 * props.depth), 0, 12), - AnchorPoint = Vector2.xAxis, - BorderSizePixel = 0, - BackgroundTransparency = props.transparency, - BackgroundColor3 = theme.BorderedContainer.BorderColor, - }) - end - - return e("Frame", { - ClipsDescendants = true, - BackgroundTransparency = if props.elementIndex % 2 == 0 then 0.985 else 1, - BackgroundColor3 = theme.Diff.Row, - Size = self.binding:map(function(expand) - return UDim2.new(1, 0, 0, expand) - end), - }, { - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 10), - PaddingRight = UDim.new(0, 10), - }), - Button = e("TextButton", { - BackgroundTransparency = 1, - Text = "", - Size = UDim2.new(1, 0, 1, 0), - [Roact.Event.Activated] = function(_rbx: Instance, _input: InputObject, clickCount: number) - if clickCount == 1 then - -- Double click opens the instance in explorer - self.lastDoubleClickTime = os.clock() - if props.instance then - SelectionService:Set({ props.instance }) - end - elseif clickCount == 0 then - -- Single click expands the changes - task.wait(0.25) - if os.clock() - (self.lastDoubleClickTime or 0) <= 0.25 then - -- This is a double click, so don't expand - return - end - - if props.changeList then - self.expanded = not self.expanded - local goalHeight = 24 - + (if self.expanded then math.clamp(#props.changeList * 24, 24, 24 * 6) else 0) - self.motor:setGoal(Flipper.Spring.new(goalHeight, { - frequency = 5, - dampingRatio = 1, - })) - end - end - end, - }, { - StateTip = if (props.instance or props.changeList) - then e(Tooltip.Trigger, { - text = (if props.changeList - then "Click to " .. (if self.expanded then "hide" else "view") .. " changes" - else "") .. (if props.instance - then (if props.changeList then " & d" else "D") .. "ouble click to open in Explorer" - else ""), - }) - else nil, - }), - Expansion = if props.changeList - then e(Expansion, { - rendered = self.state.renderExpansion, - indent = indent, - transparency = props.transparency, - changeList = props.changeList, - showStringDiff = props.showStringDiff, - showTableDiff = props.showTableDiff, - }) - else nil, - DiffIcon = if props.patchType - then e("ImageLabel", { - Image = Assets.Images.Diff[props.patchType], - ImageColor3 = color, - ImageTransparency = props.transparency, - BackgroundTransparency = 1, - Size = UDim2.new(0, 14, 0, 14), - Position = UDim2.new(0, 0, 0, 12), - AnchorPoint = Vector2.new(0, 0.5), - }) - else nil, - ClassIcon = e(ClassIcon, { - className = props.className, - color = color, - transparency = props.transparency, - size = UDim2.new(0, 16, 0, 16), - position = UDim2.new(0, indent + 2, 0, 12), - anchorPoint = Vector2.new(0, 0.5), - }), - InstanceName = e("TextLabel", { - Text = (if props.isWarning then "âš  " else "") .. props.name, - RichText = true, - BackgroundTransparency = 1, - FontFace = if props.patchType then theme.Font.Bold else theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = color, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = props.transparency, - TextTruncate = Enum.TextTruncate.AtEnd, - Size = UDim2.new(1, -indent - 50, 0, 24), - Position = UDim2.new(0, indent + 22, 0, 0), - }), - ChangeInfo = e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(1, -indent - 80, 0, 24), - Position = UDim2.new(1, -2, 0, 0), - AnchorPoint = Vector2.new(1, 0), - }, { - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - HorizontalAlignment = Enum.HorizontalAlignment.Right, - VerticalAlignment = Enum.VerticalAlignment.Center, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 4), - }), - Edits = if props.changeInfo and props.changeInfo.edits - then e("TextLabel", { - Text = props.changeInfo.edits .. if props.changeInfo.failed then "," else "", - BackgroundTransparency = 1, - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Body, - TextColor3 = theme.SubTextColor, - TextTransparency = props.transparency, - Size = UDim2.new(0, 0, 0, theme.TextSize.Body), - AutomaticSize = Enum.AutomaticSize.X, - LayoutOrder = 2, - }) - else nil, - Failed = if props.changeInfo and props.changeInfo.failed - then e("TextLabel", { - Text = props.changeInfo.failed, - BackgroundTransparency = 1, - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Diff.Warning, - TextTransparency = props.transparency, - Size = UDim2.new(0, 0, 0, theme.TextSize.Body), - AutomaticSize = Enum.AutomaticSize.X, - LayoutOrder = 6, - }) - else nil, - }), - LineGuides = e("Folder", nil, lineGuides), - }) - end) -end - -return DomLabel diff --git a/plugin/src/App/Components/PatchVisualizer/init.lua b/plugin/src/App/Components/PatchVisualizer/init.lua deleted file mode 100644 index 3e600dca..00000000 --- a/plugin/src/App/Components/PatchVisualizer/init.lua +++ /dev/null @@ -1,152 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local PatchTree = require(Plugin.PatchTree) -local PatchSet = require(Plugin.PatchSet) - -local Theme = require(Plugin.App.Theme) -local VirtualScroller = require(Plugin.App.Components.VirtualScroller) -local BorderedContainer = require(Plugin.App.Components.BorderedContainer) - -local e = Roact.createElement - -local DomLabel = require(script.DomLabel) - -local PatchVisualizer = Roact.Component:extend("PatchVisualizer") - -function PatchVisualizer:init() - self.contentSize, self.setContentSize = Roact.createBinding(Vector2.new(0, 0)) - - self.updateEvent = Instance.new("BindableEvent") -end - -function PatchVisualizer:willUnmount() - self.updateEvent:Destroy() -end - -function PatchVisualizer:shouldUpdate(nextProps) - if self.props.patchTree ~= nextProps.patchTree then - return true - end - - local currentPatch, nextPatch = self.props.patch, nextProps.patch - if currentPatch ~= nil or nextPatch ~= nil then - return not PatchSet.isEqual(currentPatch, nextPatch) - end - - return false -end - -function PatchVisualizer:render() - local patchTree = self.props.patchTree - if patchTree == nil and self.props.patch ~= nil then - patchTree = PatchTree.build( - self.props.patch, - self.props.instanceMap, - self.props.changeListHeaders or { "Property", "Current", "Incoming" } - ) - if self.props.unappliedPatch then - patchTree = - PatchTree.updateMetadata(patchTree, self.props.patch, self.props.instanceMap, self.props.unappliedPatch) - end - end - - -- Recusively draw tree - local scrollElements, elementHeights, elementIndex = {}, {}, 0 - - if patchTree then - local elementTotal = patchTree:getCount() - local depthsComplete = {} - local function drawNode(node, depth) - elementIndex += 1 - - local parentNode = patchTree:getNode(node.parentId) - local isFinalChild = true - if parentNode then - for _id, sibling in parentNode.children do - if type(sibling) == "table" and sibling.name and sibling.name > node.name then - isFinalChild = false - break - end - end - end - - local elementHeight, setElementHeight = Roact.createBinding(24) - elementHeights[elementIndex] = elementHeight - scrollElements[elementIndex] = e(DomLabel, { - transparency = self.props.transparency, - showStringDiff = self.props.showStringDiff, - showTableDiff = self.props.showTableDiff, - updateEvent = self.updateEvent, - elementHeight = elementHeight, - setElementHeight = setElementHeight, - elementIndex = elementIndex, - isFinalElement = elementIndex == elementTotal, - depth = depth, - depthsComplete = table.clone(depthsComplete), - hasChildren = (node.children ~= nil and next(node.children) ~= nil), - isFinalChild = isFinalChild, - patchType = node.patchType, - className = node.className, - isWarning = node.isWarning, - instance = node.instance, - name = node.name, - changeInfo = node.changeInfo, - changeList = node.changeList, - }) - - if isFinalChild then - depthsComplete[depth] = true - end - end - - patchTree:forEach(function(node, depth) - depthsComplete[depth] = false - for i = depth + 1, #depthsComplete do - depthsComplete[i] = nil - end - - drawNode(node, depth) - end) - end - - return Theme.with(function(theme) - return e(BorderedContainer, { - transparency = self.props.transparency, - size = self.props.size, - position = self.props.position, - anchorPoint = self.props.anchorPoint, - layoutOrder = self.props.layoutOrder, - }, { - CleanMerge = e("TextLabel", { - Visible = #scrollElements == 0, - Text = "No changes to sync, project is up to date.", - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Medium, - TextColor3 = theme.TextColor, - TextWrapped = true, - Size = UDim2.new(1, 0, 1, 0), - BackgroundTransparency = 1, - }), - - VirtualScroller = e(VirtualScroller, { - size = UDim2.new(1, 0, 1, -2), - position = UDim2.new(0, 0, 0, 2), - transparency = self.props.transparency, - count = #scrollElements, - updateEvent = self.updateEvent.Event, - render = function(i) - return scrollElements[i] - end, - getHeightBinding = function(i) - return elementHeights[i] - end, - }), - }) - end) -end - -return PatchVisualizer diff --git a/plugin/src/App/Components/ScrollingFrame.lua b/plugin/src/App/Components/ScrollingFrame.lua index f2113be0..87d10226 100644 --- a/plugin/src/App/Components/ScrollingFrame.lua +++ b/plugin/src/App/Components/ScrollingFrame.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Assets = require(Plugin.Assets) local Theme = require(Plugin.App.Theme) @@ -10,12 +9,6 @@ local bindingUtil = require(Plugin.App.bindingUtil) local e = Roact.createElement -local scrollDirToAutoSize = { - [Enum.ScrollingDirection.X] = Enum.AutomaticSize.X, - [Enum.ScrollingDirection.Y] = Enum.AutomaticSize.Y, - [Enum.ScrollingDirection.XY] = Enum.AutomaticSize.XY, -} - local function ScrollingFrame(props) return Theme.with(function(theme) return e("ScrollingFrame", { @@ -29,33 +22,21 @@ local function ScrollingFrame(props) BottomImage = Assets.Images.ScrollBar.Bottom, ElasticBehavior = Enum.ElasticBehavior.Always, - ScrollingDirection = props.scrollingDirection or Enum.ScrollingDirection.Y, + ScrollingDirection = Enum.ScrollingDirection.Y, Size = props.size, Position = props.position, AnchorPoint = props.anchorPoint, - CanvasSize = if props.contentSize - then props.contentSize:map(function(value) - return UDim2.new( - 0, - if (props.scrollingDirection and props.scrollingDirection ~= Enum.ScrollingDirection.Y) - then value.X - else 0, - 0, - value.Y - ) - end) - else UDim2.new(), - AutomaticCanvasSize = if props.contentSize == nil - then scrollDirToAutoSize[props.scrollingDirection or Enum.ScrollingDirection.XY] - else nil, + CanvasSize = props.contentSize:map(function(value) + return UDim2.new(0, 0, 0, value.Y) + end), BorderSizePixel = 0, BackgroundTransparency = 1, - [Roact.Change.AbsoluteSize] = props[Roact.Change.AbsoluteSize], + [Roact.Change.AbsoluteSize] = props[Roact.Change.AbsoluteSize] }, props[Roact.Children]) end) end -return ScrollingFrame +return ScrollingFrame \ No newline at end of file diff --git a/plugin/src/App/Components/SlicedImage.lua b/plugin/src/App/Components/SlicedImage.lua index 1dff9caa..8c03c877 100644 --- a/plugin/src/App/Components/SlicedImage.lua +++ b/plugin/src/App/Components/SlicedImage.lua @@ -1,7 +1,6 @@ local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local e = Roact.createElement @@ -20,7 +19,6 @@ local function SlicedImage(props) Size = props.size, Position = props.position, AnchorPoint = props.anchorPoint, - AutomaticSize = props.automaticSize, ZIndex = props.zIndex, LayoutOrder = props.layoutOrder, @@ -28,4 +26,4 @@ local function SlicedImage(props) }, props[Roact.Children]) end -return SlicedImage +return SlicedImage \ No newline at end of file diff --git a/plugin/src/App/Components/Spinner.lua b/plugin/src/App/Components/Spinner.lua index f09ea776..562bd679 100644 --- a/plugin/src/App/Components/Spinner.lua +++ b/plugin/src/App/Components/Spinner.lua @@ -2,9 +2,8 @@ local RunService = game:GetService("RunService") local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Theme = require(Plugin.App.Theme) local Assets = require(Plugin.Assets) @@ -64,4 +63,4 @@ function Spinner:willUnmount() self.stepper:Disconnect() end -return Spinner +return Spinner \ No newline at end of file diff --git a/plugin/src/App/Components/StringDiffVisualizer/StringDiff.lua b/plugin/src/App/Components/StringDiffVisualizer/StringDiff.lua deleted file mode 100644 index 0b3a0f4a..00000000 --- a/plugin/src/App/Components/StringDiffVisualizer/StringDiff.lua +++ /dev/null @@ -1,734 +0,0 @@ ---!strict ---[[ - Based on DiffMatchPatch by Neil Fraser. - https://github.com/google/diff-match-patch -]] - -export type DiffAction = number -export type Diff = { actionType: DiffAction, value: string } -export type Diffs = { Diff } - -local StringDiff = { - ActionTypes = table.freeze({ - Equal = 0, - Delete = 1, - Insert = 2, - }), -} - -function StringDiff.findDiffs(text1: string, text2: string): Diffs - -- Validate inputs - if type(text1) ~= "string" or type(text2) ~= "string" then - error( - string.format( - "Invalid inputs to StringDiff.findDiffs, expected strings and got (%s, %s)", - type(text1), - type(text2) - ), - 2 - ) - end - - -- Shortcut if the texts are identical - if text1 == text2 then - return { { actionType = StringDiff.ActionTypes.Equal, value = text1 } } - end - - -- Trim off any shared prefix and suffix - -- These are easy to detect and can be dealt with quickly without needing a complex diff - -- and later we simply add them as Equal to the start and end of the diff - local sharedPrefix, sharedSuffix - local prefixLength = StringDiff._sharedPrefix(text1, text2) - if prefixLength > 0 then - -- Store the prefix - sharedPrefix = string.sub(text1, 1, prefixLength) - -- Now trim it off - text1 = string.sub(text1, prefixLength + 1) - text2 = string.sub(text2, prefixLength + 1) - end - - local suffixLength = StringDiff._sharedSuffix(text1, text2) - if suffixLength > 0 then - -- Store the suffix - sharedSuffix = string.sub(text1, -suffixLength) - -- Now trim it off - text1 = string.sub(text1, 1, -suffixLength - 1) - text2 = string.sub(text2, 1, -suffixLength - 1) - end - - -- Compute the diff on the middle block where the changes lie - local diffs = StringDiff._computeDiff(text1, text2) - - -- Restore the prefix and suffix - if sharedPrefix then - table.insert(diffs, 1, { actionType = StringDiff.ActionTypes.Equal, value = sharedPrefix }) - end - if sharedSuffix then - table.insert(diffs, { actionType = StringDiff.ActionTypes.Equal, value = sharedSuffix }) - end - - -- Cleanup the diff - diffs = StringDiff._cleanupSemantic(diffs) - diffs = StringDiff._reorderAndMerge(diffs) - - -- Remove any empty diffs - local cursor = 1 - while cursor and diffs[cursor] do - if diffs[cursor].value == "" then - table.remove(diffs, cursor) - else - cursor += 1 - end - end - - return diffs -end - -function StringDiff._computeDiff(text1: string, text2: string): Diffs - -- Assumes that the prefix and suffix have already been trimmed off - -- and shortcut returns have been made so these texts must be different - - local text1Length, text2Length = #text1, #text2 - - if text1Length == 0 then - -- It's simply inserting all of text2 into text1 - return { { actionType = StringDiff.ActionTypes.Insert, value = text2 } } - end - - if text2Length == 0 then - -- It's simply deleting all of text1 - return { { actionType = StringDiff.ActionTypes.Delete, value = text1 } } - end - - local longText = if text1Length > text2Length then text1 else text2 - local shortText = if text1Length > text2Length then text2 else text1 - local shortTextLength = #shortText - - -- Shortcut if the shorter string exists entirely inside the longer one - local indexOf = if shortTextLength == 0 then nil else string.find(longText, shortText, 1, true) - if indexOf ~= nil then - local diffs = { - { actionType = StringDiff.ActionTypes.Insert, value = string.sub(longText, 1, indexOf - 1) }, - { actionType = StringDiff.ActionTypes.Equal, value = shortText }, - { actionType = StringDiff.ActionTypes.Insert, value = string.sub(longText, indexOf + shortTextLength) }, - } - -- Swap insertions for deletions if diff is reversed - if text1Length > text2Length then - diffs[1].actionType, diffs[3].actionType = StringDiff.ActionTypes.Delete, StringDiff.ActionTypes.Delete - end - return diffs - end - - if shortTextLength == 1 then - -- Single character string - -- After the previous shortcut, the character can't be an equality - return { - { actionType = StringDiff.ActionTypes.Delete, value = text1 }, - { actionType = StringDiff.ActionTypes.Insert, value = text2 }, - } - end - - return StringDiff._bisect(text1, text2) -end - -function StringDiff._cleanupSemantic(diffs: Diffs): Diffs - -- Reduce the number of edits by eliminating semantically trivial equalities. - local changes = false - local equalities = {} -- Stack of indices where equalities are found. - local equalitiesLength = 0 -- Keeping our own length var is faster. - local lastEquality: string? = nil - -- Always equal to diffs[equalities[equalitiesLength]].value - local pointer = 1 -- Index of current position. - -- Number of characters that changed prior to the equality. - local length_insertions1 = 0 - local length_deletions1 = 0 - -- Number of characters that changed after the equality. - local length_insertions2 = 0 - local length_deletions2 = 0 - - while diffs[pointer] do - if diffs[pointer].actionType == StringDiff.ActionTypes.Equal then -- Equality found. - equalitiesLength = equalitiesLength + 1 - equalities[equalitiesLength] = pointer - length_insertions1 = length_insertions2 - length_deletions1 = length_deletions2 - length_insertions2 = 0 - length_deletions2 = 0 - lastEquality = diffs[pointer].value - else -- An insertion or deletion. - if diffs[pointer].actionType == StringDiff.ActionTypes.Insert then - length_insertions2 = length_insertions2 + #diffs[pointer].value - else - length_deletions2 = length_deletions2 + #diffs[pointer].value - end - -- Eliminate an equality that is smaller or equal to the edits on both - -- sides of it. - if - lastEquality - and (#lastEquality <= math.max(length_insertions1, length_deletions1)) - and (#lastEquality <= math.max(length_insertions2, length_deletions2)) - then - -- Duplicate record. - table.insert( - diffs, - equalities[equalitiesLength], - { actionType = StringDiff.ActionTypes.Delete, value = lastEquality } - ) - -- Change second copy to insert. - diffs[equalities[equalitiesLength] + 1].actionType = StringDiff.ActionTypes.Insert - -- Throw away the equality we just deleted. - equalitiesLength = equalitiesLength - 1 - -- Throw away the previous equality (it needs to be reevaluated). - equalitiesLength = equalitiesLength - 1 - pointer = (equalitiesLength > 0) and equalities[equalitiesLength] or 0 - length_insertions1, length_deletions1 = 0, 0 -- Reset the counters. - length_insertions2, length_deletions2 = 0, 0 - lastEquality = nil - changes = true - end - end - pointer = pointer + 1 - end - - -- Normalize the diff. - if changes then - StringDiff._reorderAndMerge(diffs) - end - StringDiff._cleanupSemanticLossless(diffs) - - -- Find any overlaps between deletions and insertions. - -- e.g: abcxxxxxxdef - -- -> abcxxxdef - -- e.g: xxxabcdefxxx - -- -> defxxxabc - -- Only extract an overlap if it is as big as the edit ahead or behind it. - pointer = 2 - while diffs[pointer] do - if - diffs[pointer - 1].actionType == StringDiff.ActionTypes.Delete - and diffs[pointer].actionType == StringDiff.ActionTypes.Insert - then - local deletion = diffs[pointer - 1].value - local insertion = diffs[pointer].value - local overlap_length1 = StringDiff._commonOverlap(deletion, insertion) - local overlap_length2 = StringDiff._commonOverlap(insertion, deletion) - if overlap_length1 >= overlap_length2 then - if overlap_length1 >= #deletion / 2 or overlap_length1 >= #insertion / 2 then - -- Overlap found. Insert an equality and trim the surrounding edits. - table.insert( - diffs, - pointer, - { actionType = StringDiff.ActionTypes.Equal, value = string.sub(insertion, 1, overlap_length1) } - ) - diffs[pointer - 1].value = string.sub(deletion, 1, #deletion - overlap_length1) - diffs[pointer + 1].value = string.sub(insertion, overlap_length1 + 1) - pointer = pointer + 1 - end - else - if overlap_length2 >= #deletion / 2 or overlap_length2 >= #insertion / 2 then - -- Reverse overlap found. - -- Insert an equality and swap and trim the surrounding edits. - table.insert( - diffs, - pointer, - { actionType = StringDiff.ActionTypes.Equal, value = string.sub(deletion, 1, overlap_length2) } - ) - diffs[pointer - 1] = { - actionType = StringDiff.ActionTypes.Insert, - value = string.sub(insertion, 1, #insertion - overlap_length2), - } - diffs[pointer + 1] = { - actionType = StringDiff.ActionTypes.Delete, - value = string.sub(deletion, overlap_length2 + 1), - } - pointer = pointer + 1 - end - end - pointer = pointer + 1 - end - pointer = pointer + 1 - end - - return diffs -end - -function StringDiff._sharedPrefix(text1: string, text2: string): number - -- Uses a binary search to find the largest common prefix between the two strings - -- Performance analysis: http://neil.fraser.name/news/2007/10/09/ - - -- Shortcut common cases - if (#text1 == 0) or (#text2 == 0) or (string.byte(text1, 1) ~= string.byte(text2, 1)) then - return 0 - end - - local pointerMin = 1 - local pointerMax = math.min(#text1, #text2) - local pointerMid = pointerMax - local pointerStart = 1 - while pointerMin < pointerMid do - if string.sub(text1, pointerStart, pointerMid) == string.sub(text2, pointerStart, pointerMid) then - pointerMin = pointerMid - pointerStart = pointerMin - else - pointerMax = pointerMid - end - pointerMid = math.floor(pointerMin + (pointerMax - pointerMin) / 2) - end - - return pointerMid -end - -function StringDiff._sharedSuffix(text1: string, text2: string): number - -- Uses a binary search to find the largest common suffix between the two strings - -- Performance analysis: http://neil.fraser.name/news/2007/10/09/ - - -- Shortcut common cases - if (#text1 == 0) or (#text2 == 0) or (string.byte(text1, -1) ~= string.byte(text2, -1)) then - return 0 - end - - local pointerMin = 1 - local pointerMax = math.min(#text1, #text2) - local pointerMid = pointerMax - local pointerEnd = 1 - while pointerMin < pointerMid do - if string.sub(text1, -pointerMid, -pointerEnd) == string.sub(text2, -pointerMid, -pointerEnd) then - pointerMin = pointerMid - pointerEnd = pointerMin - else - pointerMax = pointerMid - end - pointerMid = math.floor(pointerMin + (pointerMax - pointerMin) / 2) - end - - return pointerMid -end - -function StringDiff._commonOverlap(text1: string, text2: string): number - -- Determine if the suffix of one string is the prefix of another. - - -- Cache the text lengths to prevent multiple calls. - local text1_length = #text1 - local text2_length = #text2 - -- Eliminate the null case. - if text1_length == 0 or text2_length == 0 then - return 0 - end - -- Truncate the longer string. - if text1_length > text2_length then - text1 = string.sub(text1, text1_length - text2_length + 1) - elseif text1_length < text2_length then - text2 = string.sub(text2, 1, text1_length) - end - local text_length = math.min(text1_length, text2_length) - -- Quick check for the worst case. - if text1 == text2 then - return text_length - end - - -- Start by looking for a single character match - -- and increase length until no match is found. - -- Performance analysis: https://neil.fraser.name/news/2010/11/04/ - local best = 0 - local length = 1 - while true do - local pattern = string.sub(text1, text_length - length + 1) - local found = string.find(text2, pattern, 1, true) - if found == nil then - return best - end - length = length + found - 1 - if found == 1 or string.sub(text1, text_length - length + 1) == string.sub(text2, 1, length) then - best = length - length = length + 1 - end - end -end - -function StringDiff._cleanupSemanticScore(one: string, two: string): number - -- Given two strings, compute a score representing whether the internal - -- boundary falls on logical boundaries. - -- Scores range from 6 (best) to 0 (worst). - - if (#one == 0) or (#two == 0) then - -- Edges are the best. - return 6 - end - - -- Each port of this function behaves slightly differently due to - -- subtle differences in each language's definition of things like - -- 'whitespace'. Since this function's purpose is largely cosmetic, - -- the choice has been made to use each language's native features - -- rather than force total conformity. - local char1 = string.sub(one, -1) - local char2 = string.sub(two, 1, 1) - local nonAlphaNumeric1 = string.match(char1, "%W") - local nonAlphaNumeric2 = string.match(char2, "%W") - local whitespace1 = nonAlphaNumeric1 and string.match(char1, "%s") - local whitespace2 = nonAlphaNumeric2 and string.match(char2, "%s") - local lineBreak1 = whitespace1 and string.match(char1, "%c") - local lineBreak2 = whitespace2 and string.match(char2, "%c") - local blankLine1 = lineBreak1 and string.match(one, "\n\r?\n$") - local blankLine2 = lineBreak2 and string.match(two, "^\r?\n\r?\n") - - if blankLine1 or blankLine2 then - -- Five points for blank lines. - return 5 - elseif lineBreak1 or lineBreak2 then - -- Four points for line breaks - -- DEVIATION: Prefer to start on a line break instead of end on it - return if lineBreak1 then 4 else 4.5 - elseif nonAlphaNumeric1 and not whitespace1 and whitespace2 then - -- Three points for end of sentences. - return 3 - elseif whitespace1 or whitespace2 then - -- Two points for whitespace. - return 2 - elseif nonAlphaNumeric1 or nonAlphaNumeric2 then - -- One point for non-alphanumeric. - return 1 - end - return 0 -end - -function StringDiff._cleanupSemanticLossless(diffs: Diffs) - -- Look for single edits surrounded on both sides by equalities - -- which can be shifted sideways to align the edit to a word boundary. - -- e.g: The cat came. -> The cat came. - - local pointer = 2 - -- Intentionally ignore the first and last element (don't need checking). - while diffs[pointer + 1] do - local prevDiff, nextDiff = diffs[pointer - 1], diffs[pointer + 1] - if - (prevDiff.actionType == StringDiff.ActionTypes.Equal) - and (nextDiff.actionType == StringDiff.ActionTypes.Equal) - then - -- This is a single edit surrounded by equalities. - local diff = diffs[pointer] - - local equality1 = prevDiff.value - local edit = diff.value - local equality2 = nextDiff.value - - -- First, shift the edit as far left as possible. - local commonOffset = StringDiff._sharedSuffix(equality1, edit) - if commonOffset > 0 then - local commonString = string.sub(edit, -commonOffset) - equality1 = string.sub(equality1, 1, -commonOffset - 1) - edit = commonString .. string.sub(edit, 1, -commonOffset - 1) - equality2 = commonString .. equality2 - end - - -- Second, step character by character right, looking for the best fit. - local bestEquality1 = equality1 - local bestEdit = edit - local bestEquality2 = equality2 - local bestScore = StringDiff._cleanupSemanticScore(equality1, edit) - + StringDiff._cleanupSemanticScore(edit, equality2) - - while string.byte(edit, 1) == string.byte(equality2, 1) do - equality1 = equality1 .. string.sub(edit, 1, 1) - edit = string.sub(edit, 2) .. string.sub(equality2, 1, 1) - equality2 = string.sub(equality2, 2) - local score = StringDiff._cleanupSemanticScore(equality1, edit) - + StringDiff._cleanupSemanticScore(edit, equality2) - -- The > (rather than >=) encourages leading rather than trailing whitespace on edits. - -- I just think it looks better for indentation changes to start the line, - -- since then indenting several lines all have aligned diffs at the start - if score > bestScore then - bestScore = score - bestEquality1 = equality1 - bestEdit = edit - bestEquality2 = equality2 - end - end - if prevDiff.value ~= bestEquality1 then - -- We have an improvement, save it back to the diff. - if #bestEquality1 > 0 then - diffs[pointer - 1].value = bestEquality1 - else - table.remove(diffs, pointer - 1) - pointer = pointer - 1 - end - diffs[pointer].value = bestEdit - if #bestEquality2 > 0 then - diffs[pointer + 1].value = bestEquality2 - else - table.remove(diffs, pointer + 1) - pointer = pointer - 1 - end - end - end - pointer = pointer + 1 - end -end - -function StringDiff._bisect(text1: string, text2: string): Diffs - -- Find the 'middle snake' of a diff, split the problem in two - -- and return the recursively constructed diff - -- See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations - - -- Cache the text lengths to prevent multiple calls - local text1Length = #text1 - local text2Length = #text2 - - local _sub, _element - local maxD = math.ceil((text1Length + text2Length) / 2) - local vOffset = maxD - local vLength = 2 * maxD - local v1 = table.create(vLength) - local v2 = table.create(vLength) - - -- Setting all elements to -1 is faster in Lua than mixing integers and nil - for x = 0, vLength - 1 do - v1[x] = -1 - v2[x] = -1 - end - v1[vOffset + 1] = 0 - v2[vOffset + 1] = 0 - local delta = text1Length - text2Length - - -- If the total number of characters is odd, then - -- the front path will collide with the reverse path - local front = (delta % 2 ~= 0) - - -- Offsets for start and end of k loop - -- Prevents mapping of space beyond the grid - local k1Start = 0 - local k1End = 0 - local k2Start = 0 - local k2End = 0 - for d = 0, maxD - 1 do - -- Walk the front path one step - for k1 = -d + k1Start, d - k1End, 2 do - local k1_offset = vOffset + k1 - local x1 - if (k1 == -d) or ((k1 ~= d) and (v1[k1_offset - 1] < v1[k1_offset + 1])) then - x1 = v1[k1_offset + 1] - else - x1 = v1[k1_offset - 1] + 1 - end - local y1 = x1 - k1 - while - (x1 <= text1Length) - and (y1 <= text2Length) - and (string.sub(text1, x1, x1) == string.sub(text2, y1, y1)) - do - x1 = x1 + 1 - y1 = y1 + 1 - end - v1[k1_offset] = x1 - if x1 > text1Length + 1 then - -- Ran off the right of the graph - k1End = k1End + 2 - elseif y1 > text2Length + 1 then - -- Ran off the bottom of the graph - k1Start = k1Start + 2 - elseif front then - local k2_offset = vOffset + delta - k1 - if k2_offset >= 0 and k2_offset < vLength and v2[k2_offset] ~= -1 then - -- Mirror x2 onto top-left coordinate system - local x2 = text1Length - v2[k2_offset] + 1 - if x1 > x2 then - -- Overlap detected - return StringDiff._bisectSplit(text1, text2, x1, y1) - end - end - end - end - - -- Walk the reverse path one step - for k2 = -d + k2Start, d - k2End, 2 do - local k2_offset = vOffset + k2 - local x2 - if (k2 == -d) or ((k2 ~= d) and (v2[k2_offset - 1] < v2[k2_offset + 1])) then - x2 = v2[k2_offset + 1] - else - x2 = v2[k2_offset - 1] + 1 - end - local y2 = x2 - k2 - while - (x2 <= text1Length) - and (y2 <= text2Length) - and (string.sub(text1, -x2, -x2) == string.sub(text2, -y2, -y2)) - do - x2 = x2 + 1 - y2 = y2 + 1 - end - v2[k2_offset] = x2 - if x2 > text1Length + 1 then - -- Ran off the left of the graph - k2End = k2End + 2 - elseif y2 > text2Length + 1 then - -- Ran off the top of the graph - k2Start = k2Start + 2 - elseif not front then - local k1_offset = vOffset + delta - k2 - if k1_offset >= 0 and k1_offset < vLength and v1[k1_offset] ~= -1 then - local x1 = v1[k1_offset] - local y1 = vOffset + x1 - k1_offset - -- Mirror x2 onto top-left coordinate system - x2 = text1Length - x2 + 1 - if x1 > x2 then - -- Overlap detected - return StringDiff._bisectSplit(text1, text2, x1, y1) - end - end - end - end - end - - -- Number of diffs equals number of characters, no commonality at all - return { - { actionType = StringDiff.ActionTypes.Delete, value = text1 }, - { actionType = StringDiff.ActionTypes.Insert, value = text2 }, - } -end - -function StringDiff._bisectSplit(text1: string, text2: string, x: number, y: number): Diffs - -- Given the location of the 'middle snake', - -- split the diff in two parts and recurse - - local text1a = string.sub(text1, 1, x - 1) - local text2a = string.sub(text2, 1, y - 1) - local text1b = string.sub(text1, x) - local text2b = string.sub(text2, y) - - -- Compute both diffs serially - local diffs = StringDiff.findDiffs(text1a, text2a) - local diffsB = StringDiff.findDiffs(text1b, text2b) - - -- Merge diffs - table.move(diffsB, 1, #diffsB, #diffs + 1, diffs) - return diffs -end - -function StringDiff._reorderAndMerge(diffs: Diffs): Diffs - -- Reorder and merge like edit sections and merge equalities - -- Any edit section can move as long as it doesn't cross an equality - - -- Add a dummy entry at the end - table.insert(diffs, { actionType = StringDiff.ActionTypes.Equal, value = "" }) - - local pointer = 1 - local countDelete, countInsert = 0, 0 - local textDelete, textInsert = "", "" - local commonLength - while diffs[pointer] do - local actionType = diffs[pointer].actionType - if actionType == StringDiff.ActionTypes.Insert then - countInsert = countInsert + 1 - textInsert = textInsert .. diffs[pointer].value - pointer = pointer + 1 - elseif actionType == StringDiff.ActionTypes.Delete then - countDelete = countDelete + 1 - textDelete = textDelete .. diffs[pointer].value - pointer = pointer + 1 - elseif actionType == StringDiff.ActionTypes.Equal then - -- Upon reaching an equality, check for prior redundancies - if countDelete + countInsert > 1 then - if (countDelete > 0) and (countInsert > 0) then - -- Factor out any common prefixies - commonLength = StringDiff._sharedPrefix(textInsert, textDelete) - if commonLength > 0 then - local back_pointer = pointer - countDelete - countInsert - if - (back_pointer > 1) and (diffs[back_pointer - 1].actionType == StringDiff.ActionTypes.Equal) - then - diffs[back_pointer - 1].value = diffs[back_pointer - 1].value - .. string.sub(textInsert, 1, commonLength) - else - table.insert(diffs, 1, { - actionType = StringDiff.ActionTypes.Equal, - value = string.sub(textInsert, 1, commonLength), - }) - pointer = pointer + 1 - end - textInsert = string.sub(textInsert, commonLength + 1) - textDelete = string.sub(textDelete, commonLength + 1) - end - -- Factor out any common suffixies - commonLength = StringDiff._sharedSuffix(textInsert, textDelete) - if commonLength ~= 0 then - diffs[pointer].value = string.sub(textInsert, -commonLength) .. diffs[pointer].value - textInsert = string.sub(textInsert, 1, -commonLength - 1) - textDelete = string.sub(textDelete, 1, -commonLength - 1) - end - end - -- Delete the offending records and add the merged ones - pointer = pointer - countDelete - countInsert - for _ = 1, countDelete + countInsert do - table.remove(diffs, pointer) - end - if #textDelete > 0 then - table.insert(diffs, pointer, { actionType = StringDiff.ActionTypes.Delete, value = textDelete }) - pointer = pointer + 1 - end - if #textInsert > 0 then - table.insert(diffs, pointer, { actionType = StringDiff.ActionTypes.Insert, value = textInsert }) - pointer = pointer + 1 - end - pointer = pointer + 1 - elseif (pointer > 1) and (diffs[pointer - 1].actionType == StringDiff.ActionTypes.Equal) then - -- Merge this equality with the previous one - diffs[pointer - 1].value = diffs[pointer - 1].value .. diffs[pointer].value - table.remove(diffs, pointer) - else - pointer = pointer + 1 - end - countInsert, countDelete = 0, 0 - textDelete, textInsert = "", "" - end - end - if diffs[#diffs].value == "" then - -- Remove the dummy entry at the end - diffs[#diffs] = nil - end - - -- Second pass: look for single edits surrounded on both sides by equalities - -- which can be shifted sideways to eliminate an equality - -- e.g: ABAC -> ABAC - local changes = false - pointer = 2 - -- Intentionally ignore the first and last element (don't need checking) - while pointer < #diffs do - local prevDiff, nextDiff = diffs[pointer - 1], diffs[pointer + 1] - if - (prevDiff.actionType == StringDiff.ActionTypes.Equal) - and (nextDiff.actionType == StringDiff.ActionTypes.Equal) - then - -- This is a single edit surrounded by equalities - local currentDiff = diffs[pointer] - local currentText = currentDiff.value - local prevText = prevDiff.value - local nextText = nextDiff.value - if #prevText == 0 then - table.remove(diffs, pointer - 1) - changes = true - elseif string.sub(currentText, -#prevText) == prevText then - -- Shift the edit over the previous equality - currentDiff.value = prevText .. string.sub(currentText, 1, -#prevText - 1) - nextDiff.value = prevText .. nextDiff.value - table.remove(diffs, pointer - 1) - changes = true - elseif string.sub(currentText, 1, #nextText) == nextText then - -- Shift the edit over the next equality - prevDiff.value = prevText .. nextText - currentDiff.value = string.sub(currentText, #nextText + 1) .. nextText - table.remove(diffs, pointer + 1) - changes = true - end - end - pointer = pointer + 1 - end - - -- If shifts were made, the diffs need reordering and another shift sweep - if changes then - return StringDiff._reorderAndMerge(diffs) - end - - return diffs -end - -return StringDiff diff --git a/plugin/src/App/Components/StringDiffVisualizer/init.lua b/plugin/src/App/Components/StringDiffVisualizer/init.lua deleted file mode 100644 index 6802383c..00000000 --- a/plugin/src/App/Components/StringDiffVisualizer/init.lua +++ /dev/null @@ -1,452 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Log = require(Packages.Log) -local Highlighter = require(Packages.Highlighter) -Highlighter.matchStudioSettings() -local StringDiff = require(script:FindFirstChild("StringDiff")) - -local Timer = require(Plugin.Timer) -local Theme = require(Plugin.App.Theme) -local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) - -local BorderedContainer = require(Plugin.App.Components.BorderedContainer) -local VirtualScroller = require(Plugin.App.Components.VirtualScroller) - -local e = Roact.createElement - -local StringDiffVisualizer = Roact.Component:extend("StringDiffVisualizer") - -function StringDiffVisualizer:init() - self.scriptBackground, self.setScriptBackground = Roact.createBinding(Color3.fromRGB(0, 0, 0)) - self.updateEvent = Instance.new("BindableEvent") - self.lineHeight, self.setLineHeight = Roact.createBinding(15) - self.canvasPosition, self.setCanvasPosition = Roact.createBinding(Vector2.zero) - self.windowWidth, self.setWindowWidth = Roact.createBinding(math.huge) - - -- Ensure that the script background is up to date with the current theme - self.themeChangedConnection = settings().Studio.ThemeChanged:Connect(function() - -- Delay to allow Highlighter to process the theme change first - task.delay(1 / 20, function() - self:updateScriptBackground() - self:updateDiffs() - -- Rerender the virtual list elements - self.updateEvent:Fire() - end) - end) - - self:updateScriptBackground() - self:updateDiffs() -end - -function StringDiffVisualizer:willUnmount() - self.themeChangedConnection:Disconnect() - self.updateEvent:Destroy() -end - -function StringDiffVisualizer:updateScriptBackground() - local backgroundColor = Highlighter.getTokenColor("background") - if backgroundColor ~= self.scriptBackground:getValue() then - self.setScriptBackground(backgroundColor) - end -end - -function StringDiffVisualizer:didUpdate(previousProps) - if - previousProps.currentString ~= self.props.currentString - or previousProps.incomingString ~= self.props.incomingString - then - self:updateDiffs() - end -end - -function StringDiffVisualizer:updateDiffs() - Timer.start("StringDiffVisualizer:updateDiffs") - local currentString, incomingString = self.props.currentString, self.props.incomingString - - -- Diff the two texts - local startClock = os.clock() - local diffs = - StringDiff.findDiffs((string.gsub(currentString, "\t", " ")), (string.gsub(incomingString, "\t", " "))) - local stopClock = os.clock() - - Log.trace( - "Diffing {} byte and {} byte strings took {} microseconds and found {} diff sections", - #currentString, - #incomingString, - math.round((stopClock - startClock) * 1000 * 1000), - #diffs - ) - - -- Build the rich text lines - local currentRichTextLines = Highlighter.buildRichTextLines({ - src = currentString, - }) - local incomingRichTextLines = Highlighter.buildRichTextLines({ - src = incomingString, - }) - - local maxLines = math.max(#currentRichTextLines, #incomingRichTextLines) - - -- Find the diff locations - local currentDiffs, incomingDiffs = {}, {} - local firstDiffLineNum = 0 - - local currentLineNum, incomingLineNum = 1, 1 - local currentIdx, incomingIdx = 1, 1 - for _, diff in diffs do - local actionType, text = diff.actionType, diff.value - local lineCount = select(2, string.gsub(text, "\n", "\n")) - local lines = string.split(text, "\n") - - if actionType == StringDiff.ActionTypes.Equal then - if lineCount > 0 then - -- Jump cursor ahead to last line - currentLineNum += lineCount - incomingLineNum += lineCount - currentIdx = #lines[#lines] - incomingIdx = #lines[#lines] - else - -- Move along this line - currentIdx += #text - incomingIdx += #text - end - - continue - end - - if actionType == StringDiff.ActionTypes.Insert then - if firstDiffLineNum == 0 then - firstDiffLineNum = incomingLineNum - end - - for i, lineText in lines do - if i > 1 then - -- Move to next line - incomingLineNum += 1 - incomingIdx = 0 - end - if not incomingDiffs[incomingLineNum] then - incomingDiffs[incomingLineNum] = {} - end - -- Mark these characters on this line - table.insert(incomingDiffs[incomingLineNum], { - start = incomingIdx, - stop = incomingIdx + #lineText, - }) - incomingIdx += #lineText - end - elseif actionType == StringDiff.ActionTypes.Delete then - if firstDiffLineNum == 0 then - firstDiffLineNum = currentLineNum - end - - for i, lineText in lines do - if i > 1 then - -- Move to next line - currentLineNum += 1 - currentIdx = 0 - end - if not currentDiffs[currentLineNum] then - currentDiffs[currentLineNum] = {} - end - -- Mark these characters on this line - table.insert(currentDiffs[currentLineNum], { - start = currentIdx, - stop = currentIdx + #lineText, - }) - currentIdx += #lineText - end - else - Log.warn("Unknown diff action: {} {}", actionType, text) - end - end - - Timer.stop() - - self:setState({ - maxLines = maxLines, - currentRichTextLines = currentRichTextLines, - incomingRichTextLines = incomingRichTextLines, - currentDiffs = currentDiffs, - incomingDiffs = incomingDiffs, - }) - - -- Scroll to the first diff line - task.defer(self.setCanvasPosition, Vector2.new(0, math.max(0, (firstDiffLineNum - 4) * 16))) -end - -function StringDiffVisualizer:render() - local currentDiffs, incomingDiffs = self.state.currentDiffs, self.state.incomingDiffs - local currentRichTextLines, incomingRichTextLines = - self.state.currentRichTextLines, self.state.incomingRichTextLines - local maxLines = self.state.maxLines - - return Theme.with(function(theme) - self.setLineHeight(theme.TextSize.Code) - - -- Calculate the width of the canvas - -- (One line at a time to avoid the char limit of getTextBoundsAsync) - local canvasWidth = 0 - for i = 1, maxLines do - local currentLine = currentRichTextLines[i] - if currentLine and string.find(currentLine, "%S") then - local bounds = getTextBoundsAsync(currentLine, theme.Font.Code, theme.TextSize.Code, math.huge, true) - if bounds.X > canvasWidth then - canvasWidth = bounds.X - end - end - local incomingLine = incomingRichTextLines[i] - if incomingLine and string.find(incomingLine, "%S") then - local bounds = getTextBoundsAsync(incomingLine, theme.Font.Code, theme.TextSize.Code, math.huge, true) - if bounds.X > canvasWidth then - canvasWidth = bounds.X - end - end - end - - local lineNumberWidth = - getTextBoundsAsync(tostring(maxLines), theme.Font.Code, theme.TextSize.Body, math.huge, true).X - - canvasWidth += lineNumberWidth + 12 - - local removalScrollMarkers = {} - local insertionScrollMarkers = {} - for lineNum in currentDiffs do - table.insert( - removalScrollMarkers, - e("Frame", { - Size = UDim2.fromScale(0.5, 1 / maxLines), - Position = UDim2.fromScale(0, (lineNum - 1) / maxLines), - BorderSizePixel = 0, - BackgroundColor3 = theme.Diff.Background.Remove, - }) - ) - end - for lineNum in incomingDiffs do - table.insert( - insertionScrollMarkers, - e("Frame", { - Size = UDim2.fromScale(0.5, 1 / maxLines), - Position = UDim2.fromScale(0.5, (lineNum - 1) / maxLines), - BorderSizePixel = 0, - BackgroundColor3 = theme.Diff.Background.Add, - }) - ) - end - - return e(BorderedContainer, { - size = self.props.size, - position = self.props.position, - anchorPoint = self.props.anchorPoint, - transparency = self.props.transparency, - }, { - Background = e("Frame", { - Size = UDim2.new(1, 0, 1, 0), - Position = UDim2.new(0, 0, 0, 0), - BorderSizePixel = 0, - BackgroundColor3 = self.scriptBackground, - ZIndex = -10, - }, { - UICorner = e("UICorner", { - CornerRadius = UDim.new(0, 5), - }), - }), - Main = e("Frame", { - Size = UDim2.new(1, -10, 1, -2), - Position = UDim2.new(0, 2, 0, 2), - BackgroundTransparency = 1, - [Roact.Change.AbsoluteSize] = function(rbx) - self.setWindowWidth(rbx.AbsoluteSize.X * 0.5 - 10) - end, - }, { - Separator = e("Frame", { - Size = UDim2.new(0, 2, 1, 0), - Position = UDim2.new(0.5, 0, 0, 0), - AnchorPoint = Vector2.new(0.5, 0), - BorderSizePixel = 0, - BackgroundColor3 = theme.BorderedContainer.BorderColor, - BackgroundTransparency = 0.5, - }), - Current = e(VirtualScroller, { - position = UDim2.new(0, 0, 0, 0), - size = UDim2.new(0.5, -1, 1, 0), - transparency = self.props.transparency, - count = maxLines, - updateEvent = self.updateEvent.Event, - canvasWidth = canvasWidth, - canvasPosition = self.canvasPosition, - onCanvasPositionChanged = self.setCanvasPosition, - render = function(i) - local lineDiffs = currentDiffs[i] - local diffFrames = table.create(if lineDiffs then #lineDiffs else 0) - - -- Show diff markers over the specific changed characters - if lineDiffs then - local charWidth = math.round(theme.TextSize.Code * 0.5) - for diffIdx, diff in lineDiffs do - local start, stop = diff.start, diff.stop - diffFrames[diffIdx] = e("Frame", { - Size = if #lineDiffs == 1 - and start == 0 - and stop == 0 - then UDim2.fromScale(1, 1) - else UDim2.new( - 0, - math.max(charWidth * (stop - start), charWidth * 0.4), - 1, - 0 - ), - Position = UDim2.fromOffset(charWidth * start, 0), - BackgroundColor3 = theme.Diff.Background.Remove, - BackgroundTransparency = 0.85, - BorderSizePixel = 0, - ZIndex = -1, - }) - end - end - - return Roact.createFragment({ - LineNumber = e("TextLabel", { - Size = UDim2.new(0, lineNumberWidth + 8, 1, 0), - Text = i, - BackgroundColor3 = Color3.new(0, 0, 0), - BackgroundTransparency = 0.9, - BorderSizePixel = 0, - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Body, - TextColor3 = if lineDiffs then theme.Diff.Background.Remove else theme.SubTextColor, - TextXAlignment = Enum.TextXAlignment.Right, - }, { - Padding = e("UIPadding", { PaddingRight = UDim.new(0, 6) }), - }), - Content = e("Frame", { - Size = UDim2.new(1, -(lineNumberWidth + 10), 1, 0), - Position = UDim2.fromScale(1, 0), - AnchorPoint = Vector2.new(1, 0), - BackgroundColor3 = theme.Diff.Background.Remove, - BackgroundTransparency = if lineDiffs then 0.95 else 1, - BorderSizePixel = 0, - }, { - CodeLabel = e("TextLabel", { - Size = UDim2.fromScale(1, 1), - Position = UDim2.fromScale(0, 0), - Text = currentRichTextLines[i] or "", - RichText = true, - BackgroundTransparency = 1, - BorderSizePixel = 0, - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Code, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Top, - TextColor3 = Color3.fromRGB(255, 255, 255), - }), - DiffFrames = Roact.createFragment(diffFrames), - }), - }) - end, - getHeightBinding = function() - return self.lineHeight - end, - }), - Incoming = e(VirtualScroller, { - position = UDim2.new(0.5, 1, 0, 0), - size = UDim2.new(0.5, -1, 1, 0), - transparency = self.props.transparency, - count = maxLines, - updateEvent = self.updateEvent.Event, - canvasWidth = canvasWidth, - canvasPosition = self.canvasPosition, - onCanvasPositionChanged = self.setCanvasPosition, - render = function(i) - local lineDiffs = incomingDiffs[i] - local diffFrames = table.create(if lineDiffs then #lineDiffs else 0) - - -- Show diff markers over the specific changed characters - if lineDiffs then - local charWidth = math.round(theme.TextSize.Code * 0.5) - for diffIdx, diff in lineDiffs do - local start, stop = diff.start, diff.stop - diffFrames[diffIdx] = e("Frame", { - Size = if #lineDiffs == 1 - and start == 0 - and stop == 0 - then UDim2.fromScale(1, 1) - else UDim2.new( - 0, - math.max(charWidth * (stop - start), charWidth * 0.4), - 1, - 0 - ), - Position = UDim2.fromOffset(charWidth * start, 0), - BackgroundColor3 = theme.Diff.Background.Add, - BackgroundTransparency = 0.85, - BorderSizePixel = 0, - ZIndex = -1, - }) - end - end - - return Roact.createFragment({ - LineNumber = e("TextLabel", { - Size = UDim2.new(0, lineNumberWidth + 8, 1, 0), - Text = i, - BackgroundColor3 = Color3.new(0, 0, 0), - BackgroundTransparency = 0.9, - BorderSizePixel = 0, - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Body, - TextColor3 = if lineDiffs then theme.Diff.Background.Add else theme.SubTextColor, - TextXAlignment = Enum.TextXAlignment.Right, - }, { - Padding = e("UIPadding", { PaddingRight = UDim.new(0, 6) }), - }), - Content = e("Frame", { - Size = UDim2.new(1, -(lineNumberWidth + 10), 1, 0), - Position = UDim2.fromScale(1, 0), - AnchorPoint = Vector2.new(1, 0), - BackgroundColor3 = theme.Diff.Background.Add, - BackgroundTransparency = if lineDiffs then 0.95 else 1, - BorderSizePixel = 0, - }, { - CodeLabel = e("TextLabel", { - Size = UDim2.fromScale(1, 1), - Position = UDim2.fromScale(0, 0), - Text = incomingRichTextLines[i] or "", - RichText = true, - BackgroundColor3 = theme.Diff.Background.Add, - BackgroundTransparency = 1, - BorderSizePixel = 0, - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Code, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Top, - TextColor3 = Color3.fromRGB(255, 255, 255), - }), - DiffFrames = Roact.createFragment(diffFrames), - }), - }) - end, - getHeightBinding = function() - return self.lineHeight - end, - }), - }), - ScrollMarkers = e("Frame", { - Size = self.windowWidth:map(function(windowWidth) - return UDim2.new(0, 8, 1, -4 - (if canvasWidth > windowWidth then 10 else 0)) - end), - Position = UDim2.new(1, -2, 0, 2), - AnchorPoint = Vector2.new(1, 0), - BackgroundTransparency = 1, - }, { - insertions = Roact.createFragment(insertionScrollMarkers), - removals = Roact.createFragment(removalScrollMarkers), - }), - }) - end) -end - -return StringDiffVisualizer diff --git a/plugin/src/App/Components/Studio/StudioPluginAction.lua b/plugin/src/App/Components/Studio/StudioPluginAction.lua index 95581829..458bd4fc 100644 --- a/plugin/src/App/Components/Studio/StudioPluginAction.lua +++ b/plugin/src/App/Components/Studio/StudioPluginAction.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Dictionary = require(Plugin.Dictionary) @@ -10,15 +9,11 @@ local StudioPluginContext = require(script.Parent.StudioPluginContext) local e = Roact.createElement -local StudioPluginAction = Roact.Component:extend("StudioPluginAction") +local StudioPluginAction = Roact.Component:extend("StudioPluginAction") function StudioPluginAction:init() self.pluginAction = self.props.plugin:CreatePluginAction( - self.props.name, - self.props.title, - self.props.description, - self.props.icon, - self.props.bindable + self.props.name, self.props.title, self.props.description, self.props.icon, self.props.bindable ) self.pluginAction.Triggered:Connect(self.props.onTriggered) @@ -35,12 +30,9 @@ end local function StudioPluginActionWrapper(props) return e(StudioPluginContext.Consumer, { render = function(plugin) - return e( - StudioPluginAction, - Dictionary.merge(props, { - plugin = plugin, - }) - ) + return e(StudioPluginAction, Dictionary.merge(props, { + plugin = plugin, + })) end, }) end diff --git a/plugin/src/App/Components/Studio/StudioPluginContext.lua b/plugin/src/App/Components/Studio/StudioPluginContext.lua index a04f59d8..978f628f 100644 --- a/plugin/src/App/Components/Studio/StudioPluginContext.lua +++ b/plugin/src/App/Components/Studio/StudioPluginContext.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local StudioPluginContext = Roact.createContext(nil) -return StudioPluginContext +return StudioPluginContext \ No newline at end of file diff --git a/plugin/src/App/Components/Studio/StudioPluginGui.lua b/plugin/src/App/Components/Studio/StudioPluginGui.lua index 7c043be3..6bd37511 100644 --- a/plugin/src/App/Components/Studio/StudioPluginGui.lua +++ b/plugin/src/App/Components/Studio/StudioPluginGui.lua @@ -1,13 +1,9 @@ -local HttpService = game:GetService("HttpService") - local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Dictionary = require(Plugin.Dictionary) -local Theme = require(Plugin.App.Theme) local StudioPluginContext = require(script.Parent.StudioPluginContext) @@ -32,16 +28,11 @@ function StudioPluginGui:init() self.props.initDockState, self.props.active, self.props.overridePreviousState, - floatingSize.X, - floatingSize.Y, - minimumSize.X, - minimumSize.Y + floatingSize.X, floatingSize.Y, + minimumSize.X, minimumSize.Y ) - local pluginGui = self.props.plugin:CreateDockWidgetPluginGui( - if self.props.isEphemeral then HttpService:GenerateGUID(false) else self.props.id, - dockWidgetPluginGuiInfo - ) + local pluginGui = self.props.plugin:CreateDockWidgetPluginGui(self.props.id, dockWidgetPluginGuiInfo) pluginGui.Name = self.props.id pluginGui.Title = self.props.title @@ -65,28 +56,13 @@ end function StudioPluginGui:render() return e(Roact.Portal, { target = self.pluginGui, - }, { - Background = Theme.with(function(theme) - return e("Frame", { - Size = UDim2.new(1, 0, 1, 0), - BackgroundColor3 = theme.BackgroundColor, - ZIndex = 0, - BorderSizePixel = 0, - }, self.props[Roact.Children]) - end), - }) + }, self.props[Roact.Children]) end function StudioPluginGui:didUpdate(lastProps) if self.props.active ~= lastProps.active then -- This is intentionally in didUpdate to make sure the initial active state -- (if the PluginGui is open initially) is preserved. - - -- Studio widgets are very unreliable and sometimes need to be flickered - -- in order to force them to render correctly - -- This happens within a single frame so it doesn't flicker visibly - self.pluginGui.Enabled = self.props.active - self.pluginGui.Enabled = not self.props.active self.pluginGui.Enabled = self.props.active end end @@ -98,14 +74,11 @@ end local function StudioPluginGuiWrapper(props) return e(StudioPluginContext.Consumer, { render = function(plugin) - return e( - StudioPluginGui, - Dictionary.merge(props, { - plugin = plugin, - }) - ) + return e(StudioPluginGui, Dictionary.merge(props, { + plugin = plugin, + })) end, }) end -return StudioPluginGuiWrapper +return StudioPluginGuiWrapper \ No newline at end of file diff --git a/plugin/src/App/Components/Studio/StudioToggleButton.lua b/plugin/src/App/Components/Studio/StudioToggleButton.lua index 724801c1..1adde586 100644 --- a/plugin/src/App/Components/Studio/StudioToggleButton.lua +++ b/plugin/src/App/Components/Studio/StudioToggleButton.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Dictionary = require(Plugin.Dictionary) @@ -18,8 +17,12 @@ StudioToggleButton.defaultProps = { } function StudioToggleButton:init() - local button = - self.props.toolbar:CreateButton(self.props.name, self.props.tooltip, self.props.icon, self.props.text) + local button = self.props.toolbar:CreateButton( + self.props.name, + self.props.tooltip, + self.props.icon, + self.props.text + ) button.Click:Connect(function() if self.props.onClick then @@ -57,12 +60,9 @@ end local function StudioToggleButtonWrapper(props) return e(StudioToolbarContext.Consumer, { render = function(toolbar) - return e( - StudioToggleButton, - Dictionary.merge(props, { - toolbar = toolbar, - }) - ) + return e(StudioToggleButton, Dictionary.merge(props, { + toolbar = toolbar, + })) end, }) end diff --git a/plugin/src/App/Components/Studio/StudioToolbar.lua b/plugin/src/App/Components/Studio/StudioToolbar.lua index 11b7214e..c03b20c0 100644 --- a/plugin/src/App/Components/Studio/StudioToolbar.lua +++ b/plugin/src/App/Components/Studio/StudioToolbar.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Dictionary = require(Plugin.Dictionary) @@ -36,14 +35,11 @@ end local function StudioToolbarWrapper(props) return e(StudioPluginContext.Consumer, { render = function(plugin) - return e( - StudioToolbar, - Dictionary.merge(props, { - plugin = plugin, - }) - ) + return e(StudioToolbar, Dictionary.merge(props, { + plugin = plugin, + })) end, }) end -return StudioToolbarWrapper +return StudioToolbarWrapper \ No newline at end of file diff --git a/plugin/src/App/Components/Studio/StudioToolbarContext.lua b/plugin/src/App/Components/Studio/StudioToolbarContext.lua index 4dcba1dd..925b7e0c 100644 --- a/plugin/src/App/Components/Studio/StudioToolbarContext.lua +++ b/plugin/src/App/Components/Studio/StudioToolbarContext.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local StudioToolbarContext = Roact.createContext(nil) -return StudioToolbarContext +return StudioToolbarContext \ No newline at end of file diff --git a/plugin/src/App/Components/TableDiffVisualizer/Array.lua b/plugin/src/App/Components/TableDiffVisualizer/Array.lua deleted file mode 100644 index 1ca002d4..00000000 --- a/plugin/src/App/Components/TableDiffVisualizer/Array.lua +++ /dev/null @@ -1,195 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Timer = require(Plugin.Timer) -local Assets = require(Plugin.Assets) -local Theme = require(Plugin.App.Theme) - -local ScrollingFrame = require(Plugin.App.Components.ScrollingFrame) -local DisplayValue = require(Plugin.App.Components.PatchVisualizer.DisplayValue) - -local e = Roact.createElement - -local Array = Roact.Component:extend("Array") - -function Array:init() - self:setState({ - diff = self:calculateDiff(), - }) -end - -function Array:calculateDiff() - Timer.start("Array:calculateDiff") - --[[ - Find the indexes that are added or removed from the array, - and display them side by side with gaps for the indexes that - dont exist in the opposite array. - ]] - local oldTable, newTable = self.props.oldTable or {}, self.props.newTable or {} - - local i, j = 1, 1 - local diff = {} - - while i <= #oldTable and j <= #newTable do - if oldTable[i] == newTable[j] then - table.insert(diff, { oldTable[i], newTable[j] }) -- Unchanged - i += 1 - j += 1 - elseif not table.find(newTable, oldTable[i], j) then - table.insert(diff, { oldTable[i], nil }) -- Removal - i += 1 - elseif not table.find(oldTable, newTable[j], i) then - table.insert(diff, { nil, newTable[j] }) -- Addition - j += 1 - else - if table.find(newTable, oldTable[i], j) then - table.insert(diff, { nil, newTable[j] }) -- Addition - j += 1 - else - table.insert(diff, { oldTable[i], nil }) -- Removal - i += 1 - end - end - end - - -- Handle remaining elements - while i <= #oldTable do - table.insert(diff, { oldTable[i], nil }) -- Remaining Removals - i += 1 - end - while j <= #newTable do - table.insert(diff, { nil, newTable[j] }) -- Remaining Additions - j += 1 - end - - Timer.stop() - return diff -end - -function Array:didUpdate(previousProps) - if previousProps.oldTable ~= self.props.oldTable or previousProps.newTable ~= self.props.newTable then - self:setState({ - diff = self:calculateDiff(), - }) - end -end - -function Array:render() - return Theme.with(function(theme) - local diff = self.state.diff - local lines = table.create(#diff) - - for i, element in diff do - local oldValue = element[1] - local newValue = element[2] - - local patchType = if oldValue == nil then "Add" elseif newValue == nil then "Remove" else "Remain" - - table.insert( - lines, - e("Frame", { - Size = UDim2.new(1, 0, 0, 25), - BackgroundTransparency = if patchType == "Remain" then 1 else self.props.transparency, - BackgroundColor3 = theme.Diff.Background[patchType], - BorderSizePixel = 0, - LayoutOrder = i, - }, { - DiffIcon = if patchType ~= "Remain" - then e("ImageLabel", { - Image = Assets.Images.Diff[patchType], - ImageColor3 = theme.AddressEntry.PlaceholderColor, - ImageTransparency = self.props.transparency, - BackgroundTransparency = 1, - Size = UDim2.new(0, 15, 0, 15), - Position = UDim2.new(0, 7, 0.5, 0), - AnchorPoint = Vector2.new(0, 0.5), - }) - else nil, - Old = e("Frame", { - Size = UDim2.new(0.5, -30, 1, 0), - Position = UDim2.new(0, 30, 0, 0), - BackgroundTransparency = 1, - }, { - Display = if oldValue ~= nil - then e(DisplayValue, { - value = oldValue, - transparency = self.props.transparency, - textColor = theme.Settings.Setting.DescriptionColor, - }) - else nil, - }), - New = e("Frame", { - Size = UDim2.new(0.5, -10, 1, 0), - Position = UDim2.new(0.5, 5, 0, 0), - BackgroundTransparency = 1, - }, { - Display = if newValue ~= nil - then e(DisplayValue, { - value = newValue, - transparency = self.props.transparency, - textColor = theme.Settings.Setting.DescriptionColor, - }) - else nil, - }), - }) - ) - end - - return Roact.createFragment({ - Headers = e("Frame", { - Size = UDim2.new(1, 0, 0, 25), - BackgroundTransparency = self.props.transparency:map(function(t) - return 0.95 + (0.05 * t) - end), - BackgroundColor3 = theme.Diff.Row, - }, { - ColumnA = e("TextLabel", { - Size = UDim2.new(0.5, -30, 1, 0), - Position = UDim2.new(0, 30, 0, 0), - BackgroundTransparency = 1, - Text = "Old", - TextXAlignment = Enum.TextXAlignment.Left, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Settings.Setting.DescriptionColor, - TextTruncate = Enum.TextTruncate.AtEnd, - }), - ColumnB = e("TextLabel", { - Size = UDim2.new(0.5, -10, 1, 0), - Position = UDim2.new(0.5, 5, 0, 0), - BackgroundTransparency = 1, - Text = "New", - TextXAlignment = Enum.TextXAlignment.Left, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Settings.Setting.DescriptionColor, - TextTruncate = Enum.TextTruncate.AtEnd, - }), - Separator = e("Frame", { - Size = UDim2.new(1, 0, 0, 1), - Position = UDim2.new(0, 0, 1, 0), - BackgroundTransparency = 0, - BorderSizePixel = 0, - BackgroundColor3 = theme.BorderedContainer.BorderColor, - }), - }), - KeyValues = e(ScrollingFrame, { - position = UDim2.new(0, 1, 0, 25), - size = UDim2.new(1, -2, 1, -27), - scrollingDirection = Enum.ScrollingDirection.Y, - transparency = self.props.transparency, - }, { - Layout = e("UIListLayout", { - SortOrder = Enum.SortOrder.LayoutOrder, - VerticalAlignment = Enum.VerticalAlignment.Top, - }), - Lines = Roact.createFragment(lines), - }), - }) - end) -end - -return Array diff --git a/plugin/src/App/Components/TableDiffVisualizer/Dictionary.lua b/plugin/src/App/Components/TableDiffVisualizer/Dictionary.lua deleted file mode 100644 index f5ac319c..00000000 --- a/plugin/src/App/Components/TableDiffVisualizer/Dictionary.lua +++ /dev/null @@ -1,209 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Timer = require(Plugin.Timer) -local Assets = require(Plugin.Assets) -local Theme = require(Plugin.App.Theme) - -local ScrollingFrame = require(Plugin.App.Components.ScrollingFrame) -local DisplayValue = require(Plugin.App.Components.PatchVisualizer.DisplayValue) - -local e = Roact.createElement - -local Dictionary = Roact.Component:extend("Dictionary") - -function Dictionary:init() - self:setState({ - diff = self:calculateDiff(), - }) -end - -function Dictionary:calculateDiff() - Timer.start("Dictionary:calculateDiff") - local oldTable, newTable = self.props.oldTable or {}, self.props.newTable or {} - - -- Diff the two tables and find the added keys, removed keys, and changed keys - local diff = {} - - for key, oldValue in oldTable do - local newValue = newTable[key] - if newValue == nil then - table.insert(diff, { - key = key, - patchType = "Remove", - }) - elseif newValue ~= oldValue then - -- Note: should this do some sort of deep comparison for various types? - table.insert(diff, { - key = key, - patchType = "Edit", - }) - else - table.insert(diff, { - key = key, - patchType = "Remain", - }) - end - end - for key in newTable do - if oldTable[key] == nil then - table.insert(diff, { - key = key, - patchType = "Add", - }) - end - end - - table.sort(diff, function(a, b) - return a.key < b.key - end) - - Timer.stop() - return diff -end - -function Dictionary:didUpdate(previousProps) - if previousProps.oldTable ~= self.props.oldTable or previousProps.newTable ~= self.props.newTable then - self:setState({ - diff = self:calculateDiff(), - }) - end -end - -function Dictionary:render() - local oldTable, newTable = self.props.oldTable or {}, self.props.newTable or {} - local diff = self.state.diff - - return Theme.with(function(theme) - local lines = table.create(#diff) - for order, line in diff do - local key = line.key - local oldValue = oldTable[key] - local newValue = newTable[key] - - table.insert( - lines, - e("Frame", { - Size = UDim2.new(1, 0, 0, 25), - LayoutOrder = order, - BorderSizePixel = 0, - BackgroundTransparency = if line.patchType == "Remain" then 1 else self.props.transparency, - BackgroundColor3 = theme.Diff.Background[line.patchType], - }, { - DiffIcon = if line.patchType ~= "Remain" - then e("ImageLabel", { - Image = Assets.Images.Diff[line.patchType], - ImageColor3 = theme.AddressEntry.PlaceholderColor, - ImageTransparency = self.props.transparency, - BackgroundTransparency = 1, - Size = UDim2.new(0, 15, 0, 15), - Position = UDim2.new(0, 7, 0.5, 0), - AnchorPoint = Vector2.new(0, 0.5), - }) - else nil, - KeyName = e("TextLabel", { - Size = UDim2.new(0.3, -15, 1, 0), - Position = UDim2.new(0, 30, 0, 0), - BackgroundTransparency = 1, - Text = key, - TextXAlignment = Enum.TextXAlignment.Left, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Diff.Text[line.patchType], - TextTruncate = Enum.TextTruncate.AtEnd, - }), - OldValue = e("Frame", { - Size = UDim2.new(0.35, -7, 1, 0), - Position = UDim2.new(0.3, 15, 0, 0), - BackgroundTransparency = 1, - }, { - e(DisplayValue, { - value = oldValue, - transparency = self.props.transparency, - textColor = theme.Diff.Text[line.patchType], - }), - }), - NewValue = e("Frame", { - Size = UDim2.new(0.35, -8, 1, 0), - Position = UDim2.new(0.65, 8, 0, 0), - BackgroundTransparency = 1, - }, { - e(DisplayValue, { - value = newValue, - transparency = self.props.transparency, - textColor = theme.Diff.Text[line.patchType], - }), - }), - }) - ) - end - - return Roact.createFragment({ - Headers = e("Frame", { - Size = UDim2.new(1, 0, 0, 25), - BackgroundTransparency = self.props.transparency:map(function(t) - return 0.95 + (0.05 * t) - end), - BackgroundColor3 = theme.Diff.Row, - }, { - ColumnA = e("TextLabel", { - Size = UDim2.new(0.3, -15, 1, 0), - Position = UDim2.new(0, 30, 0, 0), - BackgroundTransparency = 1, - Text = "Key", - TextXAlignment = Enum.TextXAlignment.Left, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Settings.Setting.DescriptionColor, - TextTruncate = Enum.TextTruncate.AtEnd, - }), - ColumnB = e("TextLabel", { - Size = UDim2.new(0.35, -7, 1, 0), - Position = UDim2.new(0.3, 15, 0, 0), - BackgroundTransparency = 1, - Text = "Old", - TextXAlignment = Enum.TextXAlignment.Left, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Settings.Setting.DescriptionColor, - TextTruncate = Enum.TextTruncate.AtEnd, - }), - ColumnC = e("TextLabel", { - Size = UDim2.new(0.35, -8, 1, 0), - Position = UDim2.new(0.65, 8, 0, 0), - BackgroundTransparency = 1, - Text = "New", - TextXAlignment = Enum.TextXAlignment.Left, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Settings.Setting.DescriptionColor, - TextTruncate = Enum.TextTruncate.AtEnd, - }), - Separator = e("Frame", { - Size = UDim2.new(1, 0, 0, 1), - Position = UDim2.new(0, 0, 1, 0), - BackgroundTransparency = 0, - BorderSizePixel = 0, - BackgroundColor3 = theme.BorderedContainer.BorderColor, - }), - }), - KeyValues = e(ScrollingFrame, { - position = UDim2.new(0, 1, 0, 25), - size = UDim2.new(1, -2, 1, -27), - scrollingDirection = Enum.ScrollingDirection.Y, - transparency = self.props.transparency, - }, { - Layout = e("UIListLayout", { - SortOrder = Enum.SortOrder.LayoutOrder, - VerticalAlignment = Enum.VerticalAlignment.Top, - }), - Lines = Roact.createFragment(lines), - }), - }) - end) -end - -return Dictionary diff --git a/plugin/src/App/Components/TableDiffVisualizer/init.lua b/plugin/src/App/Components/TableDiffVisualizer/init.lua deleted file mode 100644 index 2a1218a7..00000000 --- a/plugin/src/App/Components/TableDiffVisualizer/init.lua +++ /dev/null @@ -1,48 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local BorderedContainer = require(Plugin.App.Components.BorderedContainer) -local Array = require(script:FindFirstChild("Array")) -local Dictionary = require(script:FindFirstChild("Dictionary")) - -local e = Roact.createElement - -local TableDiffVisualizer = Roact.Component:extend("TableDiffVisualizer") - -function TableDiffVisualizer:render() - local oldTable, newTable = self.props.oldTable or {}, self.props.newTable or {} - - -- Ensure we're diffing tables, not mixing types - if type(oldTable) ~= "table" then - oldTable = {} - end - if type(newTable) ~= "table" then - newTable = {} - end - - local isArray = next(newTable) == 1 or next(oldTable) == 1 - - return e(BorderedContainer, { - size = self.props.size, - position = self.props.position, - anchorPoint = self.props.anchorPoint, - transparency = self.props.transparency, - }, { - Content = if isArray - then e(Array, { - oldTable = oldTable, - newTable = newTable, - transparency = self.props.transparency, - }) - else e(Dictionary, { - oldTable = oldTable, - newTable = newTable, - transparency = self.props.transparency, - }), - }) -end - -return TableDiffVisualizer diff --git a/plugin/src/App/Components/Tag.lua b/plugin/src/App/Components/Tag.lua deleted file mode 100644 index 6e6d4c4f..00000000 --- a/plugin/src/App/Components/Tag.lua +++ /dev/null @@ -1,59 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Theme = require(Plugin.App.Theme) -local Assets = require(Plugin.Assets) - -local SlicedImage = require(Plugin.App.Components.SlicedImage) - -local e = Roact.createElement - -return function(props) - return Theme.with(function(theme) - return e(SlicedImage, { - slice = Assets.Slices.RoundedBackground, - color = props.color, - transparency = props.transparency:map(function(transparency) - return 0.9 + (0.1 * transparency) - end), - layoutOrder = props.layoutOrder, - position = props.position, - anchorPoint = props.anchorPoint, - size = UDim2.new(0, 0, 0, theme.TextSize.Medium), - automaticSize = Enum.AutomaticSize.X, - }, { - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 4), - PaddingRight = UDim.new(0, 4), - PaddingTop = UDim.new(0, 2), - PaddingBottom = UDim.new(0, 2), - }), - Icon = if props.icon - then e("ImageLabel", { - Size = UDim2.new(0, 12, 0, 12), - Position = UDim2.new(0, 0, 0.5, 0), - AnchorPoint = Vector2.new(0, 0.5), - Image = props.icon, - BackgroundTransparency = 1, - ImageColor3 = props.color, - ImageTransparency = props.transparency, - }) - else nil, - Text = e("TextLabel", { - Text = props.text, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Small, - TextColor3 = props.color, - TextXAlignment = Enum.TextXAlignment.Center, - TextTransparency = props.transparency, - Size = UDim2.new(0, 0, 1, 0), - Position = UDim2.new(0, if props.icon then 15 else 0, 0, 0), - AutomaticSize = Enum.AutomaticSize.X, - BackgroundTransparency = 1, - }), - }) - end) -end diff --git a/plugin/src/App/Components/TextButton.lua b/plugin/src/App/Components/TextButton.lua index f4243c1b..e4e97e71 100644 --- a/plugin/src/App/Components/TextButton.lua +++ b/plugin/src/App/Components/TextButton.lua @@ -1,14 +1,14 @@ +local TextService = game:GetService("TextService") + local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) +local Roact = require(Rojo.Roact) +local Flipper = require(Rojo.Flipper) local Theme = require(Plugin.App.Theme) local Assets = require(Plugin.Assets) local bindingUtil = require(Plugin.App.bindingUtil) -local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) local SlicedImage = require(script.Parent.SlicedImage) local TouchRipple = require(script.Parent.TouchRipple) @@ -40,17 +40,20 @@ end function TextButton:render() return Theme.with(function(theme) - local textBounds = getTextBoundsAsync(self.props.text, theme.Font.Main, theme.TextSize.Large, math.huge) + local textSize = TextService:GetTextSize( + self.props.text, 18, Enum.Font.GothamSemibold, + Vector2.new(math.huge, math.huge) + ) local style = self.props.style - local buttonTheme = theme.Button[style] + theme = theme.Button[style] local bindingHover = bindingUtil.deriveProperty(self.binding, "hover") local bindingEnabled = bindingUtil.deriveProperty(self.binding, "enabled") return e("ImageButton", { - Size = UDim2.new(0, (theme.TextSize.Body * 2) + textBounds.X, 0, 34), + Size = UDim2.new(0, 15 + textSize.X + 15, 0, 34), Position = self.props.position, AnchorPoint = self.props.anchorPoint, @@ -72,22 +75,18 @@ function TextButton:render() end, }, { TouchRipple = e(TouchRipple, { - color = buttonTheme.ActionFillColor, + color = theme.ActionFillColor, transparency = self.props.transparency:map(function(value) - return bindingUtil.blendAlpha({ buttonTheme.ActionFillTransparency, value }) + return bindingUtil.blendAlpha({ theme.ActionFillTransparency, value }) end), zIndex = 2, }), Text = e("TextLabel", { Text = self.props.text, - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Large, - TextColor3 = bindingUtil.mapLerp( - bindingEnabled, - buttonTheme.Enabled.TextColor, - buttonTheme.Disabled.TextColor - ), + Font = Enum.Font.GothamSemibold, + TextSize = 18, + TextColor3 = bindingUtil.mapLerp(bindingEnabled, theme.Enabled.TextColor, theme.Disabled.TextColor), TextTransparency = self.props.transparency, Size = UDim2.new(1, 0, 1, 0), @@ -97,11 +96,7 @@ function TextButton:render() Border = style == "Bordered" and e(SlicedImage, { slice = Assets.Slices.RoundedBorder, - color = bindingUtil.mapLerp( - bindingEnabled, - buttonTheme.Enabled.BorderColor, - buttonTheme.Disabled.BorderColor - ), + color = bindingUtil.mapLerp(bindingEnabled, theme.Enabled.BorderColor, theme.Disabled.BorderColor), transparency = self.props.transparency, size = UDim2.new(1, 0, 1, 0), @@ -111,18 +106,14 @@ function TextButton:render() HoverOverlay = e(SlicedImage, { slice = Assets.Slices.RoundedBackground, - color = buttonTheme.ActionFillColor, + color = theme.ActionFillColor, transparency = Roact.joinBindings({ hover = bindingHover:map(function(value) return 1 - value end), transparency = self.props.transparency, }):map(function(values) - return bindingUtil.blendAlpha({ - buttonTheme.ActionFillTransparency, - values.hover, - values.transparency, - }) + return bindingUtil.blendAlpha({ theme.ActionFillTransparency, values.hover, values.transparency }) end), size = UDim2.new(1, 0, 1, 0), @@ -132,21 +123,15 @@ function TextButton:render() Background = style == "Solid" and e(SlicedImage, { slice = Assets.Slices.RoundedBackground, - color = bindingUtil.mapLerp( - bindingEnabled, - buttonTheme.Enabled.BackgroundColor, - buttonTheme.Disabled.BackgroundColor - ), + color = bindingUtil.mapLerp(bindingEnabled, theme.Enabled.BackgroundColor, theme.Disabled.BackgroundColor), transparency = self.props.transparency, size = UDim2.new(1, 0, 1, 0), zIndex = -2, }), - - Children = Roact.createFragment(self.props[Roact.Children]), }) end) end -return TextButton +return TextButton \ No newline at end of file diff --git a/plugin/src/App/Components/TextInput.lua b/plugin/src/App/Components/TextInput.lua deleted file mode 100644 index 1187296b..00000000 --- a/plugin/src/App/Components/TextInput.lua +++ /dev/null @@ -1,119 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) - -local Theme = require(Plugin.App.Theme) -local Assets = require(Plugin.Assets) -local bindingUtil = require(Plugin.App.bindingUtil) - -local SlicedImage = require(script.Parent.SlicedImage) - -local SPRING_PROPS = { - frequency = 5, - dampingRatio = 1, -} - -local e = Roact.createElement - -local TextInput = Roact.Component:extend("TextInput") - -function TextInput:init() - self.motor = Flipper.GroupMotor.new({ - hover = 0, - enabled = self.props.enabled and 1 or 0, - }) - self.binding = bindingUtil.fromMotor(self.motor) -end - -function TextInput:didUpdate(lastProps) - if lastProps.enabled ~= self.props.enabled then - self.motor:setGoal({ - enabled = Flipper.Spring.new(self.props.enabled and 1 or 0), - }) - end -end - -function TextInput:render() - return Theme.with(function(theme) - local textInputTheme = theme.TextInput - - local bindingHover = bindingUtil.deriveProperty(self.binding, "hover") - local bindingEnabled = bindingUtil.deriveProperty(self.binding, "enabled") - - return e(SlicedImage, { - slice = Assets.Slices.RoundedBorder, - color = bindingUtil.mapLerp( - bindingEnabled, - textInputTheme.Enabled.BorderColor, - textInputTheme.Disabled.BorderColor - ), - transparency = self.props.transparency, - - size = self.props.size or UDim2.new(1, 0, 1, 0), - position = self.props.position, - layoutOrder = self.props.layoutOrder, - anchorPoint = self.props.anchorPoint, - }, { - HoverOverlay = e(SlicedImage, { - slice = Assets.Slices.RoundedBackground, - color = textInputTheme.ActionFillColor, - transparency = Roact.joinBindings({ - hover = bindingHover:map(function(value) - return 1 - value - end), - transparency = self.props.transparency, - }):map(function(values) - return bindingUtil.blendAlpha({ - textInputTheme.ActionFillTransparency, - values.hover, - values.transparency, - }) - end), - size = UDim2.new(1, 0, 1, 0), - zIndex = -1, - }), - Input = e("TextBox", { - BackgroundTransparency = 1, - Size = UDim2.fromScale(1, 1), - Text = self.props.text, - PlaceholderText = self.props.placeholder, - FontFace = theme.Font.Main, - TextColor3 = bindingUtil.mapLerp( - bindingEnabled, - textInputTheme.Disabled.TextColor, - textInputTheme.Enabled.TextColor - ), - PlaceholderColor3 = bindingUtil.mapLerp( - bindingEnabled, - textInputTheme.Disabled.PlaceholderColor, - textInputTheme.Enabled.PlaceholderColor - ), - TextSize = theme.TextSize.Large, - TextEditable = self.props.enabled, - ClearTextOnFocus = self.props.clearTextOnFocus, - - [Roact.Event.MouseEnter] = function() - self.motor:setGoal({ - hover = Flipper.Spring.new(1, SPRING_PROPS), - }) - end, - - [Roact.Event.MouseLeave] = function() - self.motor:setGoal({ - hover = Flipper.Spring.new(0, SPRING_PROPS), - }) - end, - - [Roact.Event.FocusLost] = function(rbx) - self.props.onEntered(rbx.Text) - end, - }), - Children = Roact.createFragment(self.props[Roact.Children]), - }) - end) -end - -return TextInput diff --git a/plugin/src/App/Components/Tooltip.lua b/plugin/src/App/Components/Tooltip.lua deleted file mode 100644 index 49d37af7..00000000 --- a/plugin/src/App/Components/Tooltip.lua +++ /dev/null @@ -1,270 +0,0 @@ -local HttpService = game:GetService("HttpService") - -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Theme = require(Plugin.App.Theme) - -local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) - -local BorderedContainer = require(Plugin.App.Components.BorderedContainer) - -local e = Roact.createElement - -local DELAY = 0.75 -- How long to hover before a popup is shown (seconds) -local TEXT_PADDING = Vector2.new(8 * 2, 6 * 2) -- Padding for the popup text containers -local TAIL_SIZE = 16 -- Size of the triangle tail piece -local X_OFFSET = 30 -- How far right (from left) the tail will be (assuming enough space) -local Y_OVERLAP = 10 -- Let the triangle tail piece overlap the target a bit to help "connect" it - -local TooltipContext = Roact.createContext({}) - -local function Popup(props) - return Theme.with(function(theme) - local textXSpace = math.min(props.parentSize.X, 250) - TEXT_PADDING.X - local textBounds = getTextBoundsAsync(props.Text, theme.Font.Main, theme.TextSize.Medium, textXSpace) - local contentSize = textBounds + TEXT_PADDING + (Vector2.one * 2) - - local trigger = props.Trigger:getValue() - - local spaceBelow = props.parentSize.Y - - (trigger.AbsolutePosition.Y + trigger.AbsoluteSize.Y - Y_OVERLAP + TAIL_SIZE) - local spaceAbove = trigger.AbsolutePosition.Y + Y_OVERLAP - TAIL_SIZE - - -- If there's not enough space below, and there's more space above, then show the tooltip above the trigger - local displayAbove = spaceBelow < contentSize.Y and spaceAbove > spaceBelow - - local X = math.clamp(props.Position.X - X_OFFSET, 0, math.max(props.parentSize.X - contentSize.X, 1)) - local Y = 0 - - if displayAbove then - Y = math.max(trigger.AbsolutePosition.Y - TAIL_SIZE - contentSize.Y + Y_OVERLAP, 0) - else - Y = math.min( - trigger.AbsolutePosition.Y + trigger.AbsoluteSize.Y + TAIL_SIZE - Y_OVERLAP, - props.parentSize.Y - contentSize.Y - ) - end - - return e(BorderedContainer, { - position = UDim2.fromOffset(X, Y), - size = UDim2.fromOffset(contentSize.X, contentSize.Y), - transparency = props.transparency, - }, { - Label = e("TextLabel", { - BackgroundTransparency = 1, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Size = UDim2.fromOffset(textBounds.X, textBounds.Y), - Text = props.Text, - TextSize = theme.TextSize.Medium, - FontFace = theme.Font.Main, - TextWrapped = true, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Center, - TextColor3 = theme.Button.Bordered.Enabled.TextColor, - TextTransparency = props.transparency, - }), - - Tail = e("ImageLabel", { - ZIndex = 100, - Position = if displayAbove - then UDim2.new(0, math.clamp(props.Position.X - X, 6, contentSize.X - 6), 1, -1) - else UDim2.new(0, math.clamp(props.Position.X - X, 6, contentSize.X - 6), 0, -TAIL_SIZE + 1), - Size = UDim2.fromOffset(TAIL_SIZE, TAIL_SIZE), - AnchorPoint = Vector2.new(0.5, 0), - Rotation = if displayAbove then 180 else 0, - BackgroundTransparency = 1, - Image = "rbxassetid://10983945016", - ImageColor3 = theme.BorderedContainer.BackgroundColor, - ImageTransparency = props.transparency, - }, { - Border = e("ImageLabel", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - Image = "rbxassetid://10983946430", - ImageColor3 = theme.BorderedContainer.BorderColor, - ImageTransparency = props.transparency, - }), - }), - }) - end) -end - -local Provider = Roact.Component:extend("TooltipManager") - -function Provider:init() - self:setState({ - tips = {}, - addTip = function(id: string, data: { Text: string, Position: Vector2, Trigger: any }) - self:setState(function(state) - state.tips[id] = data - return state - end) - end, - removeTip = function(id: string) - self:setState(function(state) - state.tips[id] = nil - return state - end) - end, - }) -end - -function Provider:render() - return Roact.createElement(TooltipContext.Provider, { - value = self.state, - }, self.props[Roact.Children]) -end - -local Container = Roact.Component:extend("TooltipContainer") - -function Container:init() - self:setState({ - size = Vector2.new(200, 100), - }) -end - -function Container:render() - return Roact.createElement(TooltipContext.Consumer, { - render = function(context) - local tips = context.tips - local popups = {} - - for key, value in tips do - popups[key] = e(Popup, { - Text = value.Text or "", - Position = value.Position or Vector2.zero, - Trigger = value.Trigger, - - parentSize = self.state.size, - }) - end - - return e("Frame", { - [Roact.Change.AbsoluteSize] = function(rbx) - self:setState({ - size = rbx.AbsoluteSize, - }) - end, - ZIndex = 100, - BackgroundTransparency = 1, - Size = UDim2.fromScale(1, 1), - }, popups) - end, - }) -end - -local Trigger = Roact.Component:extend("TooltipTrigger") - -function Trigger:init() - self.id = HttpService:GenerateGUID(false) - self.ref = Roact.createRef() - self.showingPopup = false - - self.destroy = function() - self.props.context.removeTip(self.id) - self.showingPopup = false - end -end - -function Trigger:willUnmount() - if self.showDelayThread then - pcall(task.cancel, self.showDelayThread) - end - if self.destroy then - self.destroy() - end -end - -function Trigger:didUpdate(prevProps) - if prevProps.text ~= self.props.text then - -- Any existing popup is now invalid - self.props.context.removeTip(self.id) - self.showingPopup = false - - -- Let the new text propagate - self:managePopup() - end -end - -function Trigger:isHovering() - local rbx = self.ref.current - if rbx then - return rbx.GuiState == Enum.GuiState.Hover - end - return false -end - -function Trigger:getMousePos() - local rbx = self.ref.current - if rbx then - local widget = rbx:FindFirstAncestorOfClass("DockWidgetPluginGui") - if widget then - return widget:GetRelativeMousePosition() - end - end - return Vector2.zero -end - -function Trigger:managePopup() - if self:isHovering() then - if self.showingPopup or self.showDelayThread then - -- Don't duplicate popups - return - end - - self.showDelayThread = task.delay(self.props.delay or DELAY, function() - self.props.context.addTip(self.id, { - Text = self.props.text, - Position = self:getMousePos(), - Trigger = self.ref, - }) - self.showDelayThread = nil - self.showingPopup = true - end) - else - if self.showDelayThread then - pcall(task.cancel, self.showDelayThread) - self.showDelayThread = nil - end - self.props.context.removeTip(self.id) - self.showingPopup = false - end -end - -function Trigger:render() - local function recalculate() - self:managePopup() - end - - return e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - ZIndex = self.props.zIndex or 100, - [Roact.Ref] = self.ref, - - [Roact.Change.GuiState] = recalculate, - [Roact.Change.AbsolutePosition] = recalculate, - [Roact.Change.AbsoluteSize] = recalculate, - }) -end - -local function TriggerConsumer(props) - return Roact.createElement(TooltipContext.Consumer, { - render = function(context) - local innerProps = table.clone(props) - innerProps.context = context - - return e(Trigger, innerProps) - end, - }) -end - -return { - Provider = Provider, - Container = Container, - Trigger = TriggerConsumer, -} diff --git a/plugin/src/App/Components/TouchRipple.lua b/plugin/src/App/Components/TouchRipple.lua index 1ea4c27d..955d0716 100644 --- a/plugin/src/App/Components/TouchRipple.lua +++ b/plugin/src/App/Components/TouchRipple.lua @@ -1,9 +1,8 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) +local Roact = require(Rojo.Roact) +local Flipper = require(Rojo.Flipper) local Assets = require(Plugin.Assets) local bindingUtil = require(Plugin.App.bindingUtil) @@ -24,7 +23,9 @@ function TouchRipple:init() }) self.binding = bindingUtil.fromMotor(self.motor) - self.position, self.setPosition = Roact.createBinding(Vector2.new(0, 0)) + self.position, self.setPosition = Roact.createBinding( + Vector2.new(0, 0) + ) end function TouchRipple:reset() @@ -41,7 +42,10 @@ function TouchRipple:calculateRadius(position) local container = self.ref.current if container then - local corner = Vector2.new(math.floor((1 - position.X) + 0.5), math.floor((1 - position.Y) + 0.5)) + local corner = Vector2.new( + math.floor((1 - position.X) + 0.5), + math.floor((1 - position.Y) + 0.5) + ) local size = container.AbsoluteSize local ratio = size / math.min(size.X, size.Y) @@ -88,7 +92,10 @@ function TouchRipple:render() input:GetPropertyChangedSignal("UserInputState"):Connect(function() local userInputState = input.UserInputState - if userInputState == Enum.UserInputState.Cancel or userInputState == Enum.UserInputState.End then + if + userInputState == Enum.UserInputState.Cancel + or userInputState == Enum.UserInputState.End + then self.motor:setGoal({ opacity = Flipper.Spring.new(0, { frequency = 5, @@ -119,10 +126,8 @@ function TouchRipple:render() local containerAspect = containerSize.X / containerSize.Y return UDim2.new( - currentSize / math.max(containerAspect, 1), - 0, - currentSize * math.min(containerAspect, 1), - 0 + currentSize / math.max(containerAspect, 1), 0, + currentSize * math.min(containerAspect, 1), 0 ) end end), @@ -137,4 +142,4 @@ function TouchRipple:render() }) end -return TouchRipple +return TouchRipple \ No newline at end of file diff --git a/plugin/src/App/Components/VirtualScroller.lua b/plugin/src/App/Components/VirtualScroller.lua deleted file mode 100644 index 63d966ca..00000000 --- a/plugin/src/App/Components/VirtualScroller.lua +++ /dev/null @@ -1,175 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Assets = require(Plugin.Assets) -local Theme = require(Plugin.App.Theme) -local bindingUtil = require(Plugin.App.bindingUtil) - -local e = Roact.createElement - -local VirtualScroller = Roact.Component:extend("VirtualScroller") - -function VirtualScroller:init() - self.scrollFrameRef = Roact.createRef() - self:setState({ - WindowSize = Vector2.zero, - CanvasPosition = if self.props.canvasPosition - then self.props.canvasPosition:getValue() or Vector2.zero - else Vector2.zero, - }) - - self.totalCanvas, self.setTotalCanvas = Roact.createBinding(0) - self.padding, self.setPadding = Roact.createBinding(0) - - self:refresh() - if self.props.updateEvent then - self.connection = self.props.updateEvent:Connect(function() - self:refresh() - end) - end -end - -function VirtualScroller:didMount() - local rbx = self.scrollFrameRef:getValue() - - local windowSizeSignal = rbx:GetPropertyChangedSignal("AbsoluteWindowSize") - self.windowSizeChanged = windowSizeSignal:Connect(function() - self:setState({ WindowSize = rbx.AbsoluteWindowSize }) - self:refresh() - end) - - local canvasPositionSignal = rbx:GetPropertyChangedSignal("CanvasPosition") - self.canvasPositionChanged = canvasPositionSignal:Connect(function() - if self.props.onCanvasPositionChanged then - pcall(self.props.onCanvasPositionChanged, rbx.CanvasPosition) - end - - if math.abs(rbx.CanvasPosition.Y - self.state.CanvasPosition.Y) > 5 then - self:setState({ CanvasPosition = rbx.CanvasPosition }) - self:refresh() - end - end) - - self:refresh() -end - -function VirtualScroller:willUnmount() - self.windowSizeChanged:Disconnect() - self.canvasPositionChanged:Disconnect() - if self.connection then - self.connection:Disconnect() - self.connection = nil - end -end - -function VirtualScroller:refresh() - local props = self.props - local state = self.state - - local count = props.count - local windowSize, canvasPosition = state.WindowSize.Y, state.CanvasPosition.Y - local bottom = canvasPosition + windowSize - - local minIndex, maxIndex = 1, count - local padding, canvasSize = 0, 0 - - local pos = 0 - for i = 1, count do - local height = props.getHeightBinding(i):getValue() - canvasSize += height - - if pos > bottom then - -- Below window - if maxIndex > i then - maxIndex = i - end - end - - pos += height - - if pos < canvasPosition then - -- Above window - minIndex = i - padding = pos - height - end - end - - self.setPadding(padding) - self.setTotalCanvas(canvasSize) - self:setState({ - Start = minIndex, - End = maxIndex, - }) -end - -function VirtualScroller:didUpdate(previousProps) - if self.props.count ~= previousProps.count then - -- Items have changed, so we need to refresh - self:refresh() - end -end - -function VirtualScroller:render() - local props, state = self.props, self.state - - local items = {} - for i = state.Start, state.End do - local content = props.render(i) - if content == nil then - continue - end - - items["Item" .. i] = e("Frame", { - LayoutOrder = i, - Size = props.getHeightBinding(i):map(function(height) - return UDim2.new(1, 0, 0, height) - end), - BackgroundTransparency = 1, - }, content) - end - - return Theme.with(function(theme) - return e("ScrollingFrame", { - Size = props.size, - Position = props.position, - AnchorPoint = props.anchorPoint, - BackgroundTransparency = props.backgroundTransparency or 1, - BackgroundColor3 = props.backgroundColor3 or theme.BorderedContainer.BackgroundColor, - BorderColor3 = props.borderColor3 or theme.BorderedContainer.BorderColor, - CanvasSize = self.totalCanvas:map(function(s) - return UDim2.fromOffset(props.canvasWidth or 0, s) - end), - CanvasPosition = self.props.canvasPosition, - ScrollBarThickness = 9, - ScrollBarImageColor3 = theme.ScrollBarColor, - ScrollBarImageTransparency = props.transparency:map(function(value) - return bindingUtil.blendAlpha({ 0.65, value }) - end), - TopImage = Assets.Images.ScrollBar.Top, - MidImage = Assets.Images.ScrollBar.Middle, - BottomImage = Assets.Images.ScrollBar.Bottom, - - ElasticBehavior = Enum.ElasticBehavior.Always, - ScrollingDirection = Enum.ScrollingDirection.XY, - VerticalScrollBarInset = Enum.ScrollBarInset.ScrollBar, - [Roact.Ref] = self.scrollFrameRef, - }, { - Layout = e("UIListLayout", { - Padding = UDim.new(0, 0), - SortOrder = Enum.SortOrder.LayoutOrder, - FillDirection = Enum.FillDirection.Vertical, - }), - Padding = e("UIPadding", { - PaddingTop = self.padding:map(function(p) - return UDim.new(0, p) - end), - }), - Content = Roact.createFragment(items), - }) - end) -end - -return VirtualScroller diff --git a/plugin/src/App/Page.lua b/plugin/src/App/Page.lua index 42bc68b2..99b5a942 100644 --- a/plugin/src/App/Page.lua +++ b/plugin/src/App/Page.lua @@ -1,9 +1,8 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) -local Flipper = require(Packages.Flipper) +local Roact = require(Rojo.Roact) +local Flipper = require(Rojo.Flipper) local Dictionary = require(Plugin.Dictionary) @@ -15,7 +14,7 @@ local Page = Roact.Component:extend("Page") function Page:init() self:setState({ - rendered = self.props.active, + rendered = self.props.active }) self.motor = Flipper.SingleMotor.new(self.props.active and 1 or 0) @@ -51,22 +50,21 @@ function Page:render() Size = UDim2.new(1, 0, 1, 0), BackgroundTransparency = 1, }, { - Component = e( - self.props.component, - Dictionary.merge(self.props, { - transparency = transparency, - }) - ), + Component = e(self.props.component, Dictionary.merge(self.props, { + transparency = transparency, + })) }) end function Page:didUpdate(lastProps) if self.props.active ~= lastProps.active then - self.motor:setGoal(Flipper.Spring.new(self.props.active and 1 or 0, { - frequency = 6, - dampingRatio = 1, - })) + self.motor:setGoal( + Flipper.Spring.new(self.props.active and 1 or 0, { + frequency = 6, + dampingRatio = 1, + }) + ) end end -return Page +return Page \ No newline at end of file diff --git a/plugin/src/App/PluginSettings.lua b/plugin/src/App/PluginSettings.lua new file mode 100644 index 00000000..1c5b4e37 --- /dev/null +++ b/plugin/src/App/PluginSettings.lua @@ -0,0 +1,121 @@ +--[[ + Persistent plugin settings that can be accessed via Roact context. +]] + +local Rojo = script:FindFirstAncestor("Rojo") + +local Roact = require(Rojo.Roact) + +local defaultSettings = { + openScriptsExternally = false, + twoWaySync = false, +} + +local Settings = {} +Settings.__index = Settings + +function Settings.fromPlugin(plugin) + local values = {} + + for name, defaultValue in pairs(defaultSettings) do + local savedValue = plugin:GetSetting("Rojo_" .. name) + + if savedValue == nil then + plugin:SetSetting("Rojo_" .. name, defaultValue) + values[name] = defaultValue + else + values[name] = savedValue + end + end + + return setmetatable({ + __values = values, + __plugin = plugin, + __updateListeners = {}, + }, Settings) +end + +function Settings:get(name) + if defaultSettings[name] == nil then + error("Invalid setings name " .. tostring(name), 2) + end + + return self.__values[name] +end + +function Settings:set(name, value) + self.__plugin:SetSetting("Rojo_" .. name, value) + self.__values[name] = value + + for callback in pairs(self.__updateListeners) do + callback(name, value) + end +end + +function Settings:onUpdate(newCallback) + local newListeners = {} + for callback in pairs(self.__updateListeners) do + newListeners[callback] = true + end + + newListeners[newCallback] = true + self.__updateListeners = newListeners + + return function() + local newListeners = {} + for callback in pairs(self.__updateListeners) do + if callback ~= newCallback then + newListeners[callback] = true + end + end + + self.__updateListeners = newListeners + end +end + +local Context = Roact.createContext(nil) + +local StudioProvider = Roact.Component:extend("StudioProvider") + +function StudioProvider:init() + self.settings = Settings.fromPlugin(self.props.plugin) +end + +function StudioProvider:render() + return Roact.createElement(Context.Provider, { + value = self.settings, + }, self.props[Roact.Children]) +end + +local InternalConsumer = Roact.Component:extend("InternalConsumer") + +function InternalConsumer:render() + return self.props.render(self.props.settings) +end + +function InternalConsumer:didMount() + self.disconnect = self.props.settings:onUpdate(function() + -- Trigger a dummy state update to update the settings consumer. + self:setState({}) + end) +end + +function InternalConsumer:willUnmount() + self.disconnect() +end + +local function with(callback) + return Roact.createElement(Context.Consumer, { + render = function(settings) + return Roact.createElement(InternalConsumer, { + settings = settings, + render = callback, + }) + end, + }) +end + +return { + StudioProvider = StudioProvider, + with = with, +} \ No newline at end of file diff --git a/plugin/src/App/StatusPages/Confirming.lua b/plugin/src/App/StatusPages/Confirming.lua deleted file mode 100644 index 951df0f5..00000000 --- a/plugin/src/App/StatusPages/Confirming.lua +++ /dev/null @@ -1,247 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Settings = require(Plugin.Settings) -local Theme = require(Plugin.App.Theme) -local TextButton = require(Plugin.App.Components.TextButton) -local StudioPluginGui = require(Plugin.App.Components.Studio.StudioPluginGui) -local Tooltip = require(Plugin.App.Components.Tooltip) -local PatchVisualizer = require(Plugin.App.Components.PatchVisualizer) -local StringDiffVisualizer = require(Plugin.App.Components.StringDiffVisualizer) -local TableDiffVisualizer = require(Plugin.App.Components.TableDiffVisualizer) - -local e = Roact.createElement - -local ConfirmingPage = Roact.Component:extend("ConfirmingPage") - -function ConfirmingPage:init() - self.contentSize, self.setContentSize = Roact.createBinding(0) - self.containerSize, self.setContainerSize = Roact.createBinding(Vector2.new(0, 0)) - - self:setState({ - showingStringDiff = false, - currentString = "", - incomingString = "", - showingTableDiff = false, - oldTable = {}, - newTable = {}, - }) -end - -function ConfirmingPage:render() - return Theme.with(function(theme) - local pageContent = Roact.createFragment({ - Title = e("TextLabel", { - Text = string.format( - "Sync changes for project '%s':", - self.props.confirmData.serverInfo.projectName or "UNKNOWN" - ), - FontFace = theme.Font.Thin, - LineHeight = 1.2, - TextSize = theme.TextSize.Body, - TextColor3 = theme.TextColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = self.props.transparency, - Size = UDim2.new(1, 0, 0, theme.TextSize.Large + 2), - BackgroundTransparency = 1, - }), - - PatchVisualizer = e(PatchVisualizer, { - size = UDim2.new(1, 0, 1, -100), - transparency = self.props.transparency, - layoutOrder = 3, - - patchTree = self.props.patchTree, - - showStringDiff = function(currentString: string, incomingString: string) - self:setState({ - showingStringDiff = true, - currentString = currentString, - incomingString = incomingString, - }) - end, - showTableDiff = function(oldTable: { [any]: any? }, newTable: { [any]: any? }) - self:setState({ - showingTableDiff = true, - oldTable = oldTable, - newTable = newTable, - }) - end, - }), - - Buttons = e("Frame", { - Size = UDim2.new(1, 0, 0, 34), - LayoutOrder = 4, - BackgroundTransparency = 1, - }, { - Abort = e(TextButton, { - text = "Abort", - style = "Bordered", - transparency = self.props.transparency, - layoutOrder = 1, - onClick = self.props.onAbort, - }, { - Tip = e(Tooltip.Trigger, { - text = "Stop the connection process", - }), - }), - - Reject = if Settings:get("twoWaySync") - then e(TextButton, { - text = "Reject", - style = "Bordered", - transparency = self.props.transparency, - layoutOrder = 2, - onClick = self.props.onReject, - }, { - Tip = e(Tooltip.Trigger, { - text = "Push Studio changes to the Rojo server", - }), - }) - else nil, - - Accept = e(TextButton, { - text = "Accept", - style = "Solid", - transparency = self.props.transparency, - layoutOrder = 3, - onClick = self.props.onAccept, - }, { - Tip = e(Tooltip.Trigger, { - text = "Pull Rojo server changes to Studio", - }), - }), - - Layout = e("UIListLayout", { - HorizontalAlignment = Enum.HorizontalAlignment.Right, - FillDirection = Enum.FillDirection.Horizontal, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 10), - }), - }), - - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 8), - PaddingRight = UDim.new(0, 8), - }), - - Layout = e("UIListLayout", { - HorizontalAlignment = Enum.HorizontalAlignment.Center, - VerticalAlignment = Enum.VerticalAlignment.Center, - FillDirection = Enum.FillDirection.Vertical, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 10), - }), - - StringDiff = e(StudioPluginGui, { - id = "Rojo_ConfirmingStringDiff", - title = "String diff", - active = self.state.showingStringDiff, - isEphemeral = true, - - initDockState = Enum.InitialDockState.Float, - overridePreviousState = true, - floatingSize = Vector2.new(500, 350), - minimumSize = Vector2.new(400, 250), - - zIndexBehavior = Enum.ZIndexBehavior.Sibling, - - onClose = function() - self:setState({ - showingStringDiff = false, - }) - end, - }, { - TooltipsProvider = e(Tooltip.Provider, nil, { - Tooltips = e(Tooltip.Container, nil), - Content = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - e(StringDiffVisualizer, { - size = UDim2.new(1, -10, 1, -10), - position = UDim2.new(0, 5, 0, 5), - anchorPoint = Vector2.new(0, 0), - transparency = self.props.transparency, - - currentString = self.state.currentString, - incomingString = self.state.incomingString, - }), - }), - }), - }), - - TableDiff = e(StudioPluginGui, { - id = "Rojo_ConfirmingTableDiff", - title = "Table diff", - active = self.state.showingTableDiff, - isEphemeral = true, - - initDockState = Enum.InitialDockState.Float, - overridePreviousState = true, - floatingSize = Vector2.new(500, 350), - minimumSize = Vector2.new(400, 250), - - zIndexBehavior = Enum.ZIndexBehavior.Sibling, - - onClose = function() - self:setState({ - showingTableDiff = false, - }) - end, - }, { - TooltipsProvider = e(Tooltip.Provider, nil, { - Tooltips = e(Tooltip.Container, nil), - Content = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - e(TableDiffVisualizer, { - size = UDim2.new(1, -10, 1, -10), - position = UDim2.new(0, 5, 0, 5), - anchorPoint = Vector2.new(0, 0), - transparency = self.props.transparency, - - oldTable = self.state.oldTable, - newTable = self.state.newTable, - }), - }), - }), - }), - }) - - if self.props.createPopup then - return e(StudioPluginGui, { - id = "Rojo_DiffSync", - title = string.format( - "Confirm sync for project '%s':", - self.props.confirmData.serverInfo.projectName or "UNKNOWN" - ), - active = true, - isEphemeral = true, - - initDockState = Enum.InitialDockState.Float, - overridePreviousState = false, - floatingSize = Vector2.new(500, 350), - minimumSize = Vector2.new(400, 250), - - zIndexBehavior = Enum.ZIndexBehavior.Sibling, - - onClose = self.props.onAbort, - }, { - Tooltips = e(Tooltip.Container, nil), - Content = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, pageContent), - }) - end - - return pageContent - end) -end - -return ConfirmingPage diff --git a/plugin/src/App/StatusPages/Connected.lua b/plugin/src/App/StatusPages/Connected.lua index 2a489366..5793c6ba 100644 --- a/plugin/src/App/StatusPages/Connected.lua +++ b/plugin/src/App/StatusPages/Connected.lua @@ -1,209 +1,17 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) -local timeUtil = require(Plugin.timeUtil) local Theme = require(Plugin.App.Theme) local Assets = require(Plugin.Assets) -local PatchSet = require(Plugin.PatchSet) -local StudioPluginGui = require(Plugin.App.Components.Studio.StudioPluginGui) local Header = require(Plugin.App.Components.Header) local IconButton = require(Plugin.App.Components.IconButton) -local TextButton = require(Plugin.App.Components.TextButton) local BorderedContainer = require(Plugin.App.Components.BorderedContainer) -local Tooltip = require(Plugin.App.Components.Tooltip) -local PatchVisualizer = require(Plugin.App.Components.PatchVisualizer) -local StringDiffVisualizer = require(Plugin.App.Components.StringDiffVisualizer) -local TableDiffVisualizer = require(Plugin.App.Components.TableDiffVisualizer) local e = Roact.createElement -local ChangesViewer = Roact.Component:extend("ChangesViewer") - -function ChangesViewer:init() - -- Hold onto the serve session during the lifecycle of this component - -- so that it can still render during the fade out after disconnecting - self.serveSession = self.props.serveSession -end - -function ChangesViewer:render() - if self.props.rendered == false or self.serveSession == nil or self.props.patchData == nil then - return nil - end - - local unapplied = PatchSet.countChanges(self.props.patchData.unapplied) - local applied = PatchSet.countChanges(self.props.patchData.patch) - unapplied - - return Theme.with(function(theme) - return Roact.createFragment({ - Navbar = e("Frame", { - Size = UDim2.new(1, 0, 0, 40), - BackgroundTransparency = 1, - }, { - Close = e(IconButton, { - icon = Assets.Images.Icons.Close, - iconSize = 24, - color = theme.Settings.Navbar.BackButtonColor, - transparency = self.props.transparency, - - position = UDim2.new(0, 0, 0.5, 0), - anchorPoint = Vector2.new(0, 0.5), - - onClick = self.props.onBack, - }, { - Tip = e(Tooltip.Trigger, { - text = "Close", - }), - }), - - Title = e("TextLabel", { - Text = "Sync", - FontFace = theme.Font.Main, - TextSize = theme.TextSize.Large, - TextXAlignment = Enum.TextXAlignment.Left, - TextColor3 = theme.TextColor, - TextTransparency = self.props.transparency, - Size = UDim2.new(1, -40, 0, theme.TextSize.Large + 2), - Position = UDim2.new(0, 40, 0, 0), - BackgroundTransparency = 1, - }), - - Subtitle = e("TextLabel", { - Text = DateTime.fromUnixTimestamp(self.props.patchData.timestamp):FormatLocalTime("LTS", "en-us"), - TextXAlignment = Enum.TextXAlignment.Left, - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Medium, - TextColor3 = theme.SubTextColor, - TextTruncate = Enum.TextTruncate.AtEnd, - TextTransparency = self.props.transparency, - Size = UDim2.new(1, -40, 0, theme.TextSize.Medium), - Position = UDim2.new(0, 40, 0, theme.TextSize.Large + 2), - BackgroundTransparency = 1, - }), - - Info = e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(0, 10, 0, 24), - AutomaticSize = Enum.AutomaticSize.X, - Position = UDim2.new(1, -5, 0.5, 0), - AnchorPoint = Vector2.new(1, 0.5), - }, { - Tooltip = e(Tooltip.Trigger, { - text = `{applied} changes applied` - .. (if unapplied > 0 then `, {unapplied} changes failed` else ""), - }), - Content = e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(0, 0, 1, 0), - AutomaticSize = Enum.AutomaticSize.X, - }, { - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - HorizontalAlignment = Enum.HorizontalAlignment.Right, - VerticalAlignment = Enum.VerticalAlignment.Center, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 4), - }), - - StatusIcon = e("ImageLabel", { - BackgroundTransparency = 1, - Image = if unapplied > 0 - then Assets.Images.Icons.SyncWarning - else Assets.Images.Icons.SyncSuccess, - ImageColor3 = if unapplied > 0 then theme.Diff.Warning else theme.TextColor, - Size = UDim2.new(0, 24, 0, 24), - LayoutOrder = 10, - }), - StatusSpacer = e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(0, 6, 0, 4), - LayoutOrder = 9, - }), - AppliedIcon = e("ImageLabel", { - BackgroundTransparency = 1, - Image = Assets.Images.Icons.Checkmark, - ImageColor3 = theme.TextColor, - Size = UDim2.new(0, 16, 0, 16), - LayoutOrder = 1, - }), - AppliedText = e("TextLabel", { - Text = applied, - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Body, - TextColor3 = theme.TextColor, - TextTransparency = self.props.transparency, - Size = UDim2.new(0, 0, 1, 0), - AutomaticSize = Enum.AutomaticSize.X, - BackgroundTransparency = 1, - LayoutOrder = 2, - }), - Warnings = if unapplied > 0 - then Roact.createFragment({ - WarningsSpacer = e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(0, 4, 0, 4), - LayoutOrder = 3, - }), - UnappliedIcon = e("ImageLabel", { - BackgroundTransparency = 1, - Image = Assets.Images.Icons.Exclamation, - ImageColor3 = theme.Diff.Warning, - Size = UDim2.new(0, 4, 0, 16), - LayoutOrder = 4, - }), - UnappliedText = e("TextLabel", { - Text = unapplied, - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Body, - TextColor3 = theme.Diff.Warning, - TextTransparency = self.props.transparency, - Size = UDim2.new(0, 0, 1, 0), - AutomaticSize = Enum.AutomaticSize.X, - BackgroundTransparency = 1, - LayoutOrder = 5, - }), - }) - else nil, - }), - }), - - Divider = e("Frame", { - BackgroundColor3 = theme.Settings.DividerColor, - BackgroundTransparency = self.props.transparency, - Size = UDim2.new(1, 0, 0, 1), - Position = UDim2.new(0, 0, 1, 0), - BorderSizePixel = 0, - }, { - Gradient = e("UIGradient", { - Transparency = NumberSequence.new({ - NumberSequenceKeypoint.new(0, 1), - NumberSequenceKeypoint.new(0.1, 0), - NumberSequenceKeypoint.new(0.9, 0), - NumberSequenceKeypoint.new(1, 1), - }), - }), - }), - }), - - Patch = e(PatchVisualizer, { - size = UDim2.new(1, -10, 1, -65), - position = UDim2.new(0, 5, 1, -5), - anchorPoint = Vector2.new(0, 1), - transparency = self.props.transparency, - layoutOrder = self.props.layoutOrder, - - patchTree = self.props.patchTree, - - showStringDiff = self.props.showStringDiff, - showTableDiff = self.props.showTableDiff, - }), - }) - end) -end - local function ConnectionDetails(props) return Theme.with(function(theme) return e(BorderedContainer, { @@ -213,17 +21,17 @@ local function ConnectionDetails(props) }, { TextContainer = e("Frame", { Size = UDim2.new(1, 0, 1, 0), - BackgroundTransparency = 1, + BackgroundTransparency = 1 }, { ProjectName = e("TextLabel", { Text = props.projectName, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Large, + Font = Enum.Font.GothamBold, + TextSize = 20, TextColor3 = theme.ConnectionDetails.ProjectNameColor, TextTransparency = props.transparency, TextXAlignment = Enum.TextXAlignment.Left, - Size = UDim2.new(1, 0, 0, theme.TextSize.Large), + Size = UDim2.new(1, 0, 0, 20), LayoutOrder = 1, BackgroundTransparency = 1, @@ -231,13 +39,13 @@ local function ConnectionDetails(props) Address = e("TextLabel", { Text = props.address, - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Medium, + Font = Enum.Font.Code, + TextSize = 15, TextColor3 = theme.ConnectionDetails.AddressColor, TextTransparency = props.transparency, TextXAlignment = Enum.TextXAlignment.Left, - Size = UDim2.new(1, 0, 0, theme.TextSize.Medium), + Size = UDim2.new(1, 0, 0, 15), LayoutOrder = 2, BackgroundTransparency = 1, @@ -251,6 +59,18 @@ local function ConnectionDetails(props) }), }), + Disconnect = e(IconButton, { + icon = Assets.Images.Icons.Close, + iconSize = 24, + color = theme.ConnectionDetails.DisconnectColor, + transparency = props.transparency, + + position = UDim2.new(1, 0, 0.5, 0), + anchorPoint = Vector2.new(1, 0.5), + + onClick = props.onDisconnect, + }), + Padding = e("UIPadding", { PaddingLeft = UDim.new(0, 17), PaddingRight = UDim.new(0, 15), @@ -261,357 +81,34 @@ end local ConnectedPage = Roact.Component:extend("ConnectedPage") -function ConnectedPage:getChangeInfoText() - local patchData = self.props.patchData - if patchData == nil then - return "" - end - return timeUtil.elapsedToText(DateTime.now().UnixTimestamp - patchData.timestamp) -end - -function ConnectedPage:startChangeInfoTextUpdater() - -- Cancel any existing updater - self:stopChangeInfoTextUpdater() - - -- Start a new updater - self.changeInfoTextUpdater = task.defer(function() - while true do - self.setChangeInfoText(self:getChangeInfoText()) - - local elapsed = DateTime.now().UnixTimestamp - self.props.patchData.timestamp - local updateInterval = 1 - - -- Update timestamp text as frequently as currently needed - for _, UnitData in ipairs(timeUtil.AGE_UNITS) do - local UnitSeconds = UnitData[1] - if elapsed > UnitSeconds then - updateInterval = UnitSeconds - break - end - end - - task.wait(updateInterval) - end - end) -end - -function ConnectedPage:stopChangeInfoTextUpdater() - if self.changeInfoTextUpdater then - task.cancel(self.changeInfoTextUpdater) - self.changeInfoTextUpdater = nil - end -end - -function ConnectedPage:init() - self:setState({ - renderChanges = false, - hoveringChangeInfo = false, - showingStringDiff = false, - currentString = "", - incomingString = "", - }) - - self.changeInfoText, self.setChangeInfoText = Roact.createBinding("") - - self:startChangeInfoTextUpdater() -end - -function ConnectedPage:willUnmount() - self:stopChangeInfoTextUpdater() -end - -function ConnectedPage:didUpdate(previousProps) - if self.props.patchData.timestamp ~= previousProps.patchData.timestamp then - -- New patch recieved - self:startChangeInfoTextUpdater() - self:setState({ - showingStringDiff = false, - }) - end -end - function ConnectedPage:render() - local syncWarning = self.props.patchData - and self.props.patchData.unapplied - and PatchSet.countChanges(self.props.patchData.unapplied) > 0 + return Roact.createFragment({ + Header = e(Header, { + transparency = self.props.transparency, + layoutOrder = 1, + }), - return Theme.with(function(theme) - return Roact.createFragment({ - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 20), - PaddingRight = UDim.new(0, 20), - }), + ConnectionDetails = e(ConnectionDetails, { + projectName = self.state.projectName, + address = self.state.address, + transparency = self.props.transparency, + layoutOrder = 2, - Layout = e("UIListLayout", { - VerticalAlignment = Enum.VerticalAlignment.Center, - FillDirection = Enum.FillDirection.Vertical, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 10), - }), + onDisconnect = self.props.onDisconnect, + }), - Heading = e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(1, 0, 0, 32), - }, { - Header = e(Header, { - transparency = self.props.transparency, - }), + Layout = e("UIListLayout", { + VerticalAlignment = Enum.VerticalAlignment.Center, + FillDirection = Enum.FillDirection.Vertical, + SortOrder = Enum.SortOrder.LayoutOrder, + Padding = UDim.new(0, 10), + }), - ChangeInfo = e("TextButton", { - Text = "", - Size = UDim2.new(0, 0, 1, 0), - AutomaticSize = Enum.AutomaticSize.X, - BackgroundColor3 = theme.BorderedContainer.BorderedColor, - BackgroundTransparency = if self.state.hoveringChangeInfo then 0.7 else 1, - BorderSizePixel = 0, - Position = UDim2.new(1, -5, 0.5, 0), - AnchorPoint = Vector2.new(1, 0.5), - [Roact.Event.MouseEnter] = function() - self:setState({ - hoveringChangeInfo = true, - }) - end, - [Roact.Event.MouseLeave] = function() - self:setState({ - hoveringChangeInfo = false, - }) - end, - [Roact.Event.Activated] = function() - self:setState(function(prevState) - prevState = prevState or {} - return { - renderChanges = not prevState.renderChanges, - } - end) - end, - }, { - Corner = e("UICorner", { - CornerRadius = UDim.new(0, 5), - }), - Tooltip = e(Tooltip.Trigger, { - text = if self.state.renderChanges then "Hide changes" else "View changes", - }), - Content = e("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(0, 0, 1, 0), - AutomaticSize = Enum.AutomaticSize.X, - }, { - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Horizontal, - HorizontalAlignment = Enum.HorizontalAlignment.Center, - VerticalAlignment = Enum.VerticalAlignment.Center, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 5), - }), - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 5), - PaddingRight = UDim.new(0, 5), - }), - Text = e("TextLabel", { - BackgroundTransparency = 1, - Text = self.changeInfoText, - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Body, - TextColor3 = if syncWarning then theme.Diff.Warning else theme.Header.VersionColor, - TextTransparency = self.props.transparency, - TextXAlignment = Enum.TextXAlignment.Right, - Size = UDim2.new(0, 0, 1, 0), - AutomaticSize = Enum.AutomaticSize.X, - LayoutOrder = 1, - }), - Icon = e("ImageLabel", { - BackgroundTransparency = 1, - Image = if syncWarning - then Assets.Images.Icons.SyncWarning - else Assets.Images.Icons.SyncSuccess, - ImageColor3 = if syncWarning then theme.Diff.Warning else theme.Header.VersionColor, - ImageTransparency = self.props.transparency, - Size = UDim2.new(0, 24, 0, 24), - LayoutOrder = 2, - }), - }), - }), - }), - - ConnectionDetails = e(ConnectionDetails, { - projectName = self.state.projectName, - address = self.state.address, - transparency = self.props.transparency, - layoutOrder = 2, - - onDisconnect = self.props.onDisconnect, - }), - - Buttons = e("Frame", { - Size = UDim2.new(1, 0, 0, 34), - LayoutOrder = 3, - BackgroundTransparency = 1, - ZIndex = 2, - }, { - Settings = e(TextButton, { - text = "Settings", - style = "Bordered", - transparency = self.props.transparency, - layoutOrder = 1, - onClick = self.props.onNavigateSettings, - }, { - Tip = e(Tooltip.Trigger, { - text = "View and modify plugin settings", - }), - }), - - Disconnect = e(TextButton, { - text = "Disconnect", - style = "Solid", - transparency = self.props.transparency, - layoutOrder = 2, - onClick = self.props.onDisconnect, - }, { - Tip = e(Tooltip.Trigger, { - text = "Disconnect from the Rojo sync server", - }), - }), - - Layout = e("UIListLayout", { - HorizontalAlignment = Enum.HorizontalAlignment.Right, - FillDirection = Enum.FillDirection.Horizontal, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 10), - }), - }), - - ChangesViewer = e(StudioPluginGui, { - id = "Rojo_ChangesViewer", - title = "View changes", - active = self.state.renderChanges, - isEphemeral = true, - - initDockState = Enum.InitialDockState.Float, - overridePreviousState = true, - floatingSize = Vector2.new(400, 500), - minimumSize = Vector2.new(300, 300), - - zIndexBehavior = Enum.ZIndexBehavior.Sibling, - - onClose = function() - self:setState({ - renderChanges = false, - }) - end, - }, { - TooltipsProvider = e(Tooltip.Provider, nil, { - Tooltips = e(Tooltip.Container, nil), - Content = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - Changes = e(ChangesViewer, { - transparency = self.props.transparency, - rendered = self.state.renderChanges, - patchData = self.props.patchData, - patchTree = self.props.patchTree, - serveSession = self.props.serveSession, - showStringDiff = function(currentString: string, incomingString: string) - self:setState({ - showingStringDiff = true, - currentString = currentString, - incomingString = incomingString, - }) - end, - showTableDiff = function(oldTable: { [any]: any? }, newTable: { [any]: any? }) - self:setState({ - showingTableDiff = true, - oldTable = oldTable, - newTable = newTable, - }) - end, - onBack = function() - self:setState({ - renderChanges = false, - }) - end, - }), - }), - }), - }), - - StringDiff = e(StudioPluginGui, { - id = "Rojo_ConnectedStringDiff", - title = "String diff", - active = self.state.showingStringDiff, - isEphemeral = true, - - initDockState = Enum.InitialDockState.Float, - overridePreviousState = false, - floatingSize = Vector2.new(500, 350), - minimumSize = Vector2.new(400, 250), - - zIndexBehavior = Enum.ZIndexBehavior.Sibling, - - onClose = function() - self:setState({ - showingStringDiff = false, - }) - end, - }, { - TooltipsProvider = e(Tooltip.Provider, nil, { - Tooltips = e(Tooltip.Container, nil), - Content = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - e(StringDiffVisualizer, { - size = UDim2.new(1, -10, 1, -10), - position = UDim2.new(0, 5, 0, 5), - anchorPoint = Vector2.new(0, 0), - transparency = self.props.transparency, - - currentString = self.state.currentString, - incomingString = self.state.incomingString, - }), - }), - }), - }), - - TableDiff = e(StudioPluginGui, { - id = "Rojo_ConnectedTableDiff", - title = "Table diff", - active = self.state.showingTableDiff, - isEphemeral = true, - - initDockState = Enum.InitialDockState.Float, - overridePreviousState = false, - floatingSize = Vector2.new(500, 350), - minimumSize = Vector2.new(400, 250), - - zIndexBehavior = Enum.ZIndexBehavior.Sibling, - - onClose = function() - self:setState({ - showingTableDiff = false, - }) - end, - }, { - TooltipsProvider = e(Tooltip.Provider, nil, { - Tooltips = e(Tooltip.Container, nil), - Content = e("Frame", { - Size = UDim2.fromScale(1, 1), - BackgroundTransparency = 1, - }, { - e(TableDiffVisualizer, { - size = UDim2.new(1, -10, 1, -10), - position = UDim2.new(0, 5, 0, 5), - anchorPoint = Vector2.new(0, 0), - transparency = self.props.transparency, - - oldTable = self.state.oldTable, - newTable = self.state.newTable, - }), - }), - }), - }), - }) - end) + Padding = e("UIPadding", { + PaddingLeft = UDim.new(0, 20), + PaddingRight = UDim.new(0, 20), + }), + }) end function ConnectedPage.getDerivedStateFromProps(props) @@ -625,4 +122,4 @@ function ConnectedPage.getDerivedStateFromProps(props) } end -return ConnectedPage +return ConnectedPage \ No newline at end of file diff --git a/plugin/src/App/StatusPages/Connecting.lua b/plugin/src/App/StatusPages/Connecting.lua index c3059a36..e45c3c53 100644 --- a/plugin/src/App/StatusPages/Connecting.lua +++ b/plugin/src/App/StatusPages/Connecting.lua @@ -1,10 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) - -local Theme = require(Plugin.App.Theme) +local Roact = require(Rojo.Roact) local Spinner = require(Plugin.App.Components.Spinner) @@ -13,35 +10,11 @@ local e = Roact.createElement local ConnectingPage = Roact.Component:extend("ConnectingPage") function ConnectingPage:render() - return Theme.with(function(theme) - return e("Frame", { - Size = UDim2.new(1, 0, 1, 0), - BackgroundTransparency = 1, - }, { - Spinner = e(Spinner, { - position = UDim2.new(0.5, 0, 0.5, 0), - anchorPoint = Vector2.new(0.5, 0.5), - transparency = self.props.transparency, - }), - Text = if type(self.props.text) == "string" and #self.props.text > 0 - then e("TextLabel", { - Text = self.props.text, - Position = UDim2.new(0.5, 0, 0.5, 30), - Size = UDim2.new(1, -40, 0.5, -40), - AnchorPoint = Vector2.new(0.5, 0), - TextXAlignment = Enum.TextXAlignment.Center, - TextYAlignment = Enum.TextYAlignment.Top, - RichText = true, - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Medium, - TextColor3 = theme.SubTextColor, - TextTruncate = Enum.TextTruncate.AtEnd, - TextTransparency = self.props.transparency, - BackgroundTransparency = 1, - }) - else nil, - }) - end) + return e(Spinner, { + position = UDim2.new(0.5, 0, 0.5, 0), + anchorPoint = Vector2.new(0.5, 0.5), + transparency = self.props.transparency, + }) end -return ConnectingPage +return ConnectingPage \ No newline at end of file diff --git a/plugin/src/App/StatusPages/Error.lua b/plugin/src/App/StatusPages/Error.lua index c6c6914c..01ad1091 100644 --- a/plugin/src/App/StatusPages/Error.lua +++ b/plugin/src/App/StatusPages/Error.lua @@ -1,17 +1,15 @@ +local TextService = game:GetService("TextService") + local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Theme = require(Plugin.App.Theme) -local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) local TextButton = require(Plugin.App.Components.TextButton) -local Header = require(Plugin.App.Components.Header) local BorderedContainer = require(Plugin.App.Components.BorderedContainer) local ScrollingFrame = require(Plugin.App.Components.ScrollingFrame) -local Tooltip = require(Plugin.App.Components.Tooltip) local e = Roact.createElement @@ -24,75 +22,64 @@ function Error:init() end function Error:render() - return Theme.with(function(theme) - return e(BorderedContainer, { - size = Roact.joinBindings({ - containerSize = self.props.containerSize, - contentSize = self.contentSize, - }):map(function(values) - local maximumSize = values.containerSize - maximumSize -= Vector2.new(14, 14) * 2 -- Page padding - maximumSize -= Vector2.new(0, 34 + 10) -- Buttons and spacing + return e(BorderedContainer, { + size = Roact.joinBindings({ + containerSize = self.props.containerSize, + contentSize = self.contentSize, + }):map(function(values) + local maximumSize = values.containerSize + maximumSize -= Vector2.new(14, 14) * 2 -- Page padding + maximumSize -= Vector2.new(0, 34 + 10) -- Buttons and spacing - local outerSize = values.contentSize + ERROR_PADDING * 2 + local outerSize = values.contentSize + ERROR_PADDING * 2 - return UDim2.new(1, 0, 0, math.min(outerSize.Y, maximumSize.Y)) + return UDim2.new(1, 0, 0, math.min(outerSize.Y, maximumSize.Y)) + end), + transparency = self.props.transparency, + }, { + ScrollingFrame = e(ScrollingFrame, { + size = UDim2.new(1, 0, 1, 0), + contentSize = self.contentSize:map(function(value) + return value + ERROR_PADDING * 2 end), transparency = self.props.transparency, - layoutOrder = self.props.layoutOrder, + + [Roact.Change.AbsoluteSize] = function(object) + local containerSize = object.AbsoluteSize - ERROR_PADDING * 2 + + local textBounds = TextService:GetTextSize( + self.props.errorMessage, 16, Enum.Font.Code, + Vector2.new(containerSize.X, math.huge) + ) + + self.setContentSize(Vector2.new(containerSize.X, textBounds.Y)) + end, }, { - ScrollingFrame = e(ScrollingFrame, { - size = UDim2.new(1, 0, 1, 0), - contentSize = self.contentSize:map(function(value) - return value + ERROR_PADDING * 2 - end), - transparency = self.props.transparency, - - [Roact.Change.AbsoluteSize] = function(object) - local containerSize = object.AbsoluteSize - ERROR_PADDING * 2 - - local textBounds = getTextBoundsAsync( - self.props.errorMessage, - theme.Font.Code, - theme.TextSize.Code, - containerSize.X - ) - - self.setContentSize(Vector2.new(containerSize.X, textBounds.Y)) - end, - }, { - ErrorMessage = e("TextBox", { - [Roact.Event.InputBegan] = function(rbx, input) - if input.UserInputType ~= Enum.UserInputType.MouseButton1 then - return - end - rbx.SelectionStart = 0 - rbx.CursorPosition = #rbx.Text + 1 - end, - + ErrorMessage = Theme.with(function(theme) + return e("TextLabel", { Text = self.props.errorMessage, - TextEditable = false, - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Code, + Font = Enum.Font.Code, + TextSize = 16, TextColor3 = theme.ErrorColor, TextXAlignment = Enum.TextXAlignment.Left, TextYAlignment = Enum.TextYAlignment.Top, TextTransparency = self.props.transparency, TextWrapped = true, - ClearTextOnFocus = false, - BackgroundTransparency = 1, - Size = UDim2.new(1, 0, 1, 0), - }), - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, ERROR_PADDING.X), - PaddingRight = UDim.new(0, ERROR_PADDING.X), - PaddingTop = UDim.new(0, ERROR_PADDING.Y), - PaddingBottom = UDim.new(0, ERROR_PADDING.Y), - }), + Size = UDim2.new(1, 0, 1, 0), + + BackgroundTransparency = 1, + }) + end), + + Padding = e("UIPadding", { + PaddingLeft = UDim.new(0, ERROR_PADDING.X), + PaddingRight = UDim.new(0, ERROR_PADDING.X), + PaddingTop = UDim.new(0, ERROR_PADDING.Y), + PaddingBottom = UDim.new(0, ERROR_PADDING.Y), }), - }) - end) + }), + }) end local ErrorPage = Roact.Component:extend("ErrorPage") @@ -110,21 +97,16 @@ function ErrorPage:render() self.setContainerSize(object.AbsoluteSize) end, }, { - Header = e(Header, { - transparency = self.props.transparency, - layoutOrder = 1, - }), - Error = e(Error, { errorMessage = self.state.errorMessage, containerSize = self.containerSize, transparency = self.props.transparency, - layoutOrder = 2, + layoutOrder = 1, }), Buttons = e("Frame", { Size = UDim2.new(1, 0, 0, 35), - LayoutOrder = 3, + LayoutOrder = 2, BackgroundTransparency = 1, }, { Close = e(TextButton, { @@ -133,10 +115,6 @@ function ErrorPage:render() transparency = self.props.transparency, layoutOrder = 1, onClick = self.props.onClose, - }, { - Tip = e(Tooltip.Trigger, { - text = "Dismiss message", - }), }), Layout = e("UIListLayout", { @@ -172,4 +150,4 @@ function ErrorPage.getDerivedStateFromProps(props) } end -return ErrorPage +return ErrorPage \ No newline at end of file diff --git a/plugin/src/App/StatusPages/NotConnected.lua b/plugin/src/App/StatusPages/NotConnected.lua index aabf7640..7cc7abfc 100644 --- a/plugin/src/App/StatusPages/NotConnected.lua +++ b/plugin/src/App/StatusPages/NotConnected.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) local Config = require(Plugin.Config) @@ -10,7 +9,6 @@ local Theme = require(Plugin.App.Theme) local BorderedContainer = require(Plugin.App.Components.BorderedContainer) local TextButton = require(Plugin.App.Components.TextButton) local Header = require(Plugin.App.Components.Header) -local Tooltip = require(Plugin.App.Components.Tooltip) local PORT_WIDTH = 74 local DIVIDER_WIDTH = 1 @@ -27,8 +25,8 @@ local function AddressEntry(props) }, { Host = e("TextBox", { Text = props.host or "", - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Large, + Font = Enum.Font.Code, + TextSize = 18, TextColor3 = theme.AddressEntry.TextColor, TextXAlignment = Enum.TextXAlignment.Left, TextTransparency = props.transparency, @@ -46,13 +44,13 @@ local function AddressEntry(props) if props.onHostChange ~= nil then props.onHostChange(object.Text) end - end, + end }), Port = e("TextBox", { Text = props.port or "", - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Large, + Font = Enum.Font.Code, + TextSize = 18, TextColor3 = theme.AddressEntry.TextColor, TextTransparency = props.transparency, PlaceholderText = Config.defaultPort, @@ -110,7 +108,6 @@ function NotConnectedPage:render() Size = UDim2.new(1, 0, 0, 34), LayoutOrder = 3, BackgroundTransparency = 1, - ZIndex = 2, }, { Settings = e(TextButton, { text = "Settings", @@ -118,10 +115,6 @@ function NotConnectedPage:render() transparency = self.props.transparency, layoutOrder = 1, onClick = self.props.onNavigateSettings, - }, { - Tip = e(Tooltip.Trigger, { - text = "View and modify plugin settings", - }), }), Connect = e(TextButton, { @@ -130,10 +123,6 @@ function NotConnectedPage:render() transparency = self.props.transparency, layoutOrder = 2, onClick = self.props.onConnect, - }, { - Tip = e(Tooltip.Trigger, { - text = "Connect to a Rojo sync server", - }), }), Layout = e("UIListLayout", { @@ -159,4 +148,4 @@ function NotConnectedPage:render() }) end -return NotConnectedPage +return NotConnectedPage \ No newline at end of file diff --git a/plugin/src/App/StatusPages/Settings.lua b/plugin/src/App/StatusPages/Settings.lua new file mode 100644 index 00000000..f78efbff --- /dev/null +++ b/plugin/src/App/StatusPages/Settings.lua @@ -0,0 +1,230 @@ +local TextService = game:GetService("TextService") + +local Rojo = script:FindFirstAncestor("Rojo") +local Plugin = Rojo.Plugin + +local Roact = require(Rojo.Roact) + +local Assets = require(Plugin.Assets) +local Theme = require(Plugin.App.Theme) +local PluginSettings = require(Plugin.App.PluginSettings) + +local Checkbox = require(Plugin.App.Components.Checkbox) +local IconButton = require(Plugin.App.Components.IconButton) +local ScrollingFrame = require(Plugin.App.Components.ScrollingFrame) + +local e = Roact.createElement + +local DIVIDER_FADE_SIZE = 0.1 + +local function getTextBounds(text, textSize, font, lineHeight, bounds) + local textBounds = TextService:GetTextSize(text, textSize, font, bounds) + + local lineCount = textBounds.Y / textSize + local lineHeightAbsolute = textSize * lineHeight + + return Vector2.new(textBounds.X, lineHeightAbsolute * lineCount - (lineHeightAbsolute - textSize)) +end + +local function Navbar(props) + return Theme.with(function(theme) + theme = theme.Settings.Navbar + + return e("Frame", { + Size = UDim2.new(1, 0, 0, 46), + LayoutOrder = props.layoutOrder, + BackgroundTransparency = 1, + }, { + Back = e(IconButton, { + icon = Assets.Images.Icons.Back, + iconSize = 24, + color = theme.BackButtonColor, + transparency = props.transparency, + + position = UDim2.new(0, 0, 0.5, 0), + anchorPoint = Vector2.new(0, 0.5), + + onClick = props.onBack, + }), + + Text = e("TextLabel", { + Text = "Settings", + Font = Enum.Font.Gotham, + TextSize = 18, + TextColor3 = theme.TextColor, + TextTransparency = props.transparency, + + Size = UDim2.new(1, 0, 1, 0), + + BackgroundTransparency = 1, + }) + }) + end) +end + +local Setting = Roact.Component:extend("Setting") + +function Setting:init() + self.contentSize, self.setContentSize = Roact.createBinding(Vector2.new(0, 0)) + self.containerSize, self.setContainerSize = Roact.createBinding(Vector2.new(0, 0)) +end + +function Setting:render() + return Theme.with(function(theme) + theme = theme.Settings + + return PluginSettings.with(function(settings) + return e("Frame", { + Size = self.contentSize:map(function(value) + return UDim2.new(1, 0, 0, 20 + value.Y + 20) + end), + LayoutOrder = self.props.layoutOrder, + BackgroundTransparency = 1, + + [Roact.Change.AbsoluteSize] = function(object) + self.setContainerSize(object.AbsoluteSize) + end, + }, { + Checkbox = e(Checkbox, { + active = settings:get(self.props.id), + transparency = self.props.transparency, + position = UDim2.new(1, 0, 0.5, 0), + anchorPoint = Vector2.new(1, 0.5), + onClick = function() + local currentValue = settings:get(self.props.id) + settings:set(self.props.id, not currentValue) + end, + }), + + Text = e("Frame", { + Size = UDim2.new(1, 0, 1, 0), + BackgroundTransparency = 1, + }, { + Name = e("TextLabel", { + Text = self.props.name, + Font = Enum.Font.GothamBold, + TextSize = 17, + TextColor3 = theme.Setting.NameColor, + TextXAlignment = Enum.TextXAlignment.Left, + TextTransparency = self.props.transparency, + + Size = UDim2.new(1, 0, 0, 17), + + LayoutOrder = 1, + BackgroundTransparency = 1, + }), + + Description = e("TextLabel", { + Text = self.props.description, + Font = Enum.Font.Gotham, + LineHeight = 1.2, + TextSize = 14, + TextColor3 = theme.Setting.DescriptionColor, + TextXAlignment = Enum.TextXAlignment.Left, + TextTransparency = self.props.transparency, + TextWrapped = true, + + Size = self.containerSize:map(function(value) + local textBounds = getTextBounds( + self.props.description, 14, Enum.Font.Gotham, 1.2, + Vector2.new(value.X - 50, math.huge) + ) + return UDim2.new(1, -50, 0, textBounds.Y) + end), + + LayoutOrder = 2, + BackgroundTransparency = 1, + }), + + Layout = e("UIListLayout", { + VerticalAlignment = Enum.VerticalAlignment.Center, + FillDirection = Enum.FillDirection.Vertical, + SortOrder = Enum.SortOrder.LayoutOrder, + Padding = UDim.new(0, 6), + + [Roact.Change.AbsoluteContentSize] = function(object) + self.setContentSize(object.AbsoluteContentSize) + end, + }), + + Padding = e("UIPadding", { + PaddingTop = UDim.new(0, 20), + PaddingBottom = UDim.new(0, 20), + }), + }), + + Divider = e("Frame", { + BackgroundColor3 = theme.DividerColor, + BackgroundTransparency = self.props.transparency, + Size = UDim2.new(1, 0, 0, 1), + BorderSizePixel = 0, + }, { + Gradient = e("UIGradient", { + Transparency = NumberSequence.new({ + NumberSequenceKeypoint.new(0, 1), + NumberSequenceKeypoint.new(DIVIDER_FADE_SIZE, 0), + NumberSequenceKeypoint.new(1 - DIVIDER_FADE_SIZE, 0), + NumberSequenceKeypoint.new(1, 1), + }), + }), + }), + }) + end) + end) +end + +local SettingsPage = Roact.Component:extend("SettingsPage") + +function SettingsPage:init() + self.contentSize, self.setContentSize = Roact.createBinding(Vector2.new(0, 0)) +end + +function SettingsPage:render() + return Theme.with(function(theme) + theme = theme.Settings + + return e(ScrollingFrame, { + size = UDim2.new(1, 0, 1, 0), + contentSize = self.contentSize, + transparency = self.props.transparency, + }, { + Navbar = e(Navbar, { + onBack = self.props.onBack, + transparency = self.props.transparency, + layoutOrder = 0, + }), + + OpenScriptsExternally = e(Setting, { + id = "openScriptsExternally", + name = "Open Scripts Externally", + description = "Attempt to open scripts in an external editor", + transparency = self.props.transparency, + layoutOrder = 1, + }), + + TwoWaySync = e(Setting, { + id = "twoWaySync", + name = "Two-Way Sync", + description = "EXPERIMENTAL! Editing files in Studio will sync them into the filesystem", + transparency = self.props.transparency, + layoutOrder = 2, + }), + + Layout = e("UIListLayout", { + FillDirection = Enum.FillDirection.Vertical, + SortOrder = Enum.SortOrder.LayoutOrder, + + [Roact.Change.AbsoluteContentSize] = function(object) + self.setContentSize(object.AbsoluteContentSize) + end, + }), + + Padding = e("UIPadding", { + PaddingLeft = UDim.new(0, 20), + PaddingRight = UDim.new(0, 20), + }), + }) + end) +end + +return SettingsPage \ No newline at end of file diff --git a/plugin/src/App/StatusPages/Settings/Setting.lua b/plugin/src/App/StatusPages/Settings/Setting.lua deleted file mode 100644 index 01608cf2..00000000 --- a/plugin/src/App/StatusPages/Settings/Setting.lua +++ /dev/null @@ -1,252 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) - -local Settings = require(Plugin.Settings) -local Assets = require(Plugin.Assets) -local Theme = require(Plugin.App.Theme) -local getTextBoundsAsync = require(Plugin.App.getTextBoundsAsync) - -local Checkbox = require(Plugin.App.Components.Checkbox) -local Dropdown = require(Plugin.App.Components.Dropdown) -local IconButton = require(Plugin.App.Components.IconButton) -local Tag = require(Plugin.App.Components.Tag) - -local e = Roact.createElement - -local DIVIDER_FADE_SIZE = 0.1 -local TAG_TYPES = { - unstable = { - text = "UNSTABLE", - icon = Assets.Images.Icons.Warning, - color = { "Settings", "Setting", "UnstableColor" }, - }, - debug = { - text = "DEBUG", - icon = Assets.Images.Icons.Debug, - color = { "Settings", "Setting", "DebugColor" }, - }, -} - -local function getTextBoundsWithLineHeight( - text: string, - font: Font, - textSize: number, - width: number, - lineHeight: number -) - local textBounds = getTextBoundsAsync(text, font, textSize, width) - - local lineCount = math.ceil(textBounds.Y / textSize) - local lineHeightAbsolute = textSize * lineHeight - - return Vector2.new(textBounds.X, lineHeightAbsolute * lineCount - (lineHeightAbsolute - textSize)) -end - -local function getThemeColorFromPath(theme, path) - local color = theme - for _, key in path do - if color[key] == nil then - return theme.BrandColor - end - color = color[key] - end - return color -end - -local Setting = Roact.Component:extend("Setting") - -function Setting:init() - self.contentSize, self.setContentSize = Roact.createBinding(Vector2.new(0, 0)) - self.containerSize, self.setContainerSize = Roact.createBinding(Vector2.new(0, 0)) - self.inputSize, self.setInputSize = Roact.createBinding(Vector2.new(0, 0)) - - self:setState({ - setting = Settings:get(self.props.id), - }) - - self.changedCleanup = Settings:onChanged(self.props.id, function(value) - self:setState({ - setting = value, - }) - end) -end - -function Setting:willUnmount() - self.changedCleanup() -end - -function Setting:render() - return Theme.with(function(theme) - local settingsTheme = theme.Settings - - return e("Frame", { - Size = self.contentSize:map(function(value) - return UDim2.new(1, 0, 0, value.Y + 20) - end), - LayoutOrder = self.props.layoutOrder, - ZIndex = -self.props.layoutOrder, - BackgroundTransparency = 1, - Visible = self.props.visible, - - [Roact.Change.AbsoluteSize] = function(object) - self.setContainerSize(object.AbsoluteSize) - end, - }, { - RightAligned = Roact.createElement("Frame", { - BackgroundTransparency = 1, - Size = UDim2.new(1, 0, 1, 0), - }, { - Layout = e("UIListLayout", { - VerticalAlignment = Enum.VerticalAlignment.Center, - HorizontalAlignment = Enum.HorizontalAlignment.Right, - FillDirection = Enum.FillDirection.Horizontal, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 2), - [Roact.Change.AbsoluteContentSize] = function(rbx) - self.setInputSize(rbx.AbsoluteContentSize) - end, - }), - - Input = if self.props.input ~= nil - then self.props.input - elseif self.props.options ~= nil then e(Dropdown, { - locked = self.props.locked, - lockedTooltip = self.props.lockedTooltip, - options = self.props.options, - active = self.state.setting, - transparency = self.props.transparency, - onClick = function(option) - Settings:set(self.props.id, option) - end, - }) - else e(Checkbox, { - locked = self.props.locked, - lockedTooltip = self.props.lockedTooltip, - active = self.state.setting, - transparency = self.props.transparency, - onClick = function() - local currentValue = Settings:get(self.props.id) - Settings:set(self.props.id, not currentValue) - end, - }), - - Reset = if self.props.onReset - then e(IconButton, { - icon = Assets.Images.Icons.Reset, - iconSize = 24, - color = settingsTheme.BackButtonColor, - transparency = self.props.transparency, - visible = self.props.showReset, - layoutOrder = -1, - - onClick = self.props.onReset, - }) - else nil, - }), - - Text = e("Frame", { - Size = UDim2.new(1, 0, 1, 0), - BackgroundTransparency = 1, - }, { - Heading = e("Frame", { - Size = UDim2.new(1, 0, 0, theme.TextSize.Medium), - BackgroundTransparency = 1, - }, { - Layout = e("UIListLayout", { - VerticalAlignment = Enum.VerticalAlignment.Center, - FillDirection = Enum.FillDirection.Horizontal, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 5), - }), - Tag = if self.props.tag and TAG_TYPES[self.props.tag] - then e(Tag, { - layoutOrder = 1, - transparency = self.props.transparency, - text = TAG_TYPES[self.props.tag].text, - icon = TAG_TYPES[self.props.tag].icon, - color = getThemeColorFromPath(theme, TAG_TYPES[self.props.tag].color), - }) - else nil, - Name = e("TextLabel", { - Text = self.props.name, - FontFace = theme.Font.Bold, - TextSize = theme.TextSize.Medium, - TextColor3 = if self.props.tag and TAG_TYPES[self.props.tag] - then getThemeColorFromPath(theme, TAG_TYPES[self.props.tag].color) - else settingsTheme.Setting.NameColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = self.props.transparency, - RichText = true, - - Size = UDim2.new(1, 0, 0, theme.TextSize.Medium), - - LayoutOrder = 2, - BackgroundTransparency = 1, - }), - }), - - Description = e("TextLabel", { - Text = self.props.description, - FontFace = theme.Font.Main, - LineHeight = 1.2, - TextSize = theme.TextSize.Body, - TextColor3 = settingsTheme.Setting.DescriptionColor, - TextXAlignment = Enum.TextXAlignment.Left, - TextTransparency = self.props.transparency, - TextWrapped = true, - RichText = true, - - Size = Roact.joinBindings({ - containerSize = self.containerSize, - inputSize = self.inputSize, - }):map(function(values) - local offset = values.inputSize.X + 5 - local textBounds = getTextBoundsWithLineHeight( - self.props.description, - theme.Font.Main, - theme.TextSize.Body, - values.containerSize.X - offset, - 1.2 - ) - return UDim2.new(1, -offset, 0, textBounds.Y) - end), - - LayoutOrder = 3, - BackgroundTransparency = 1, - }), - - Layout = e("UIListLayout", { - VerticalAlignment = Enum.VerticalAlignment.Center, - FillDirection = Enum.FillDirection.Vertical, - SortOrder = Enum.SortOrder.LayoutOrder, - Padding = UDim.new(0, 5), - - [Roact.Change.AbsoluteContentSize] = function(object) - self.setContentSize(object.AbsoluteContentSize) - end, - }), - }), - - Divider = e("Frame", { - BackgroundColor3 = settingsTheme.DividerColor, - BackgroundTransparency = self.props.transparency, - Size = UDim2.new(1, 0, 0, 1), - BorderSizePixel = 0, - }, { - Gradient = e("UIGradient", { - Transparency = NumberSequence.new({ - NumberSequenceKeypoint.new(0, 1), - NumberSequenceKeypoint.new(DIVIDER_FADE_SIZE, 0), - NumberSequenceKeypoint.new(1 - DIVIDER_FADE_SIZE, 0), - NumberSequenceKeypoint.new(1, 1), - }), - }), - }), - }) - end) -end - -return Setting diff --git a/plugin/src/App/StatusPages/Settings/init.lua b/plugin/src/App/StatusPages/Settings/init.lua deleted file mode 100644 index b93eba3e..00000000 --- a/plugin/src/App/StatusPages/Settings/init.lua +++ /dev/null @@ -1,295 +0,0 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Roact = require(Packages.Roact) -local Log = require(Packages.Log) - -local Assets = require(Plugin.Assets) -local Settings = require(Plugin.Settings) -local Theme = require(Plugin.App.Theme) -local Version = require(Plugin.Version) - -local IconButton = require(Plugin.App.Components.IconButton) -local ScrollingFrame = require(Plugin.App.Components.ScrollingFrame) -local Tooltip = require(Plugin.App.Components.Tooltip) -local TextInput = require(Plugin.App.Components.TextInput) -local Setting = require(script.Setting) - -local e = Roact.createElement - -local function invertTbl(tbl) - local new = {} - for key, value in tbl do - new[value] = key - end - return new -end - -local invertedLevels = invertTbl(Log.Level) -local confirmationBehaviors = { "Initial", "Always", "Large Changes", "Unlisted PlaceId", "Never" } -local syncReminderModes = { "None", "Notify", "Fullscreen" } - -local function Navbar(props) - return Theme.with(function(theme) - local navbarTheme = theme.Settings.Navbar - - return e("Frame", { - Size = UDim2.new(1, 0, 0, 46), - LayoutOrder = props.layoutOrder, - BackgroundTransparency = 1, - }, { - Back = e(IconButton, { - icon = Assets.Images.Icons.Back, - iconSize = 24, - color = navbarTheme.BackButtonColor, - transparency = props.transparency, - - position = UDim2.new(0, 0, 0.5, 0), - anchorPoint = Vector2.new(0, 0.5), - - onClick = props.onBack, - }, { - Tip = e(Tooltip.Trigger, { - text = "Back", - }), - }), - - Text = e("TextLabel", { - Text = "Settings", - FontFace = theme.Font.Thin, - TextSize = theme.TextSize.Large, - TextColor3 = navbarTheme.TextColor, - TextTransparency = props.transparency, - - Size = UDim2.new(1, 0, 1, 0), - - BackgroundTransparency = 1, - }), - }) - end) -end - -local SettingsPage = Roact.Component:extend("SettingsPage") - -function SettingsPage:init() - self.contentSize, self.setContentSize = Roact.createBinding(Vector2.new(0, 0)) -end - -function SettingsPage:render() - local layoutOrder = 0 - local function layoutIncrement() - layoutOrder += 1 - return layoutOrder - end - - return Roact.createFragment({ - Navbar = e(Navbar, { - onBack = self.props.onBack, - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - Content = e(ScrollingFrame, { - size = UDim2.new(1, 0, 1, -47), - position = UDim2.new(0, 0, 0, 47), - contentSize = self.contentSize, - transparency = self.props.transparency, - }, { - AutoReconnect = e(Setting, { - id = "autoReconnect", - name = "Auto Reconnect", - description = "Reconnect to server on place open if the served project matches the last sync to the place", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - ShowNotifications = e(Setting, { - id = "showNotifications", - name = "Show Notifications", - description = "Popup notifications in viewport", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - SyncReminderMode = e(Setting, { - id = "syncReminderMode", - name = "Sync Reminder", - description = "What type of reminders you receive for syncing your project", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - visible = Settings:getBinding("showNotifications"), - - options = syncReminderModes, - }), - - SyncReminderPolling = e(Setting, { - id = "syncReminderPolling", - name = "Sync Reminder Polling", - description = "Look for available sync servers periodically", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - visible = Settings:getBindings("syncReminderMode", "showNotifications"):map(function(values) - return values.syncReminderMode ~= "None" and values.showNotifications - end), - }), - - ConfirmationBehavior = e(Setting, { - id = "confirmationBehavior", - name = "Confirmation Behavior", - description = "When to prompt for confirmation before syncing", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - - options = confirmationBehaviors, - }), - - LargeChangesConfirmationThreshold = e(Setting, { - id = "largeChangesConfirmationThreshold", - name = "Confirmation Threshold", - description = "How many modified instances to be considered a large change", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - visible = Settings:getBinding("confirmationBehavior"):map(function(value) - return value == "Large Changes" - end), - input = e(TextInput, { - size = UDim2.new(0, 40, 0, 28), - text = Settings:getBinding("largeChangesConfirmationThreshold"):map(function(value) - return tostring(value) - end), - transparency = self.props.transparency, - enabled = true, - onEntered = function(text) - local number = tonumber(string.match(text, "%d+")) - if number then - Settings:set("largeChangesConfirmationThreshold", math.clamp(number, 1, 999)) - else - -- Force text back to last valid value - Settings:set( - "largeChangesConfirmationThreshold", - Settings:get("largeChangesConfirmationThreshold") - ) - end - end, - }), - }), - - PlaySounds = e(Setting, { - id = "playSounds", - name = "Play Sounds", - description = "Toggle sound effects", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - EnableSyncFallback = e(Setting, { - id = "enableSyncFallback", - name = "Enable Sync Fallback", - description = "Whether Instances that fail to sync are remade as a fallback. If this is enabled, Instances may be destroyed and remade when syncing.", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - CheckForUpdates = e(Setting, { - id = "checkForUpdates", - name = "Check For Updates", - description = "Notify about newer compatible Rojo releases", - locked = Version.isApiBlocked(), - lockedTooltip = "(HTTP requests to api.github.com are blocked, Rojo cannot fetch what the latest version is.)", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - CheckForPreleases = e(Setting, { - id = "checkForPrereleases", - name = "Include Prerelease Updates", - description = "Include prereleases when checking for updates", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - visible = if string.find(debug.traceback(), "\n[^\n]-user_.-$") == nil - then false -- Must be a local install to allow prerelease checks - else Settings:getBinding("checkForUpdates"), - }), - - AutoConnectPlaytestServer = e(Setting, { - id = "autoConnectPlaytestServer", - name = "Auto Connect Playtest Server", - description = "Automatically connect game server to Rojo when playtesting while connected in Edit", - tag = "unstable", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - OpenScriptsExternally = e(Setting, { - id = "openScriptsExternally", - name = "Open Scripts Externally", - description = "Attempt to open scripts in an external editor", - tag = "unstable", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - TwoWaySync = e(Setting, { - id = "twoWaySync", - name = "Two-Way Sync", - description = "Editing files in Studio will sync them into the filesystem", - locked = self.props.syncActive, - lockedTooltip = "(Cannot change while currently syncing. Disconnect first.)", - tag = "unstable", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - LogLevel = e(Setting, { - id = "logLevel", - name = "Log Level", - description = "Plugin output verbosity level", - tag = "debug", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - - options = invertedLevels, - showReset = Settings:getBinding("logLevel"):map(function(value) - return value ~= "Info" - end), - onReset = function() - Settings:set("logLevel", "Info") - end, - }), - - TypecheckingEnabled = e(Setting, { - id = "typecheckingEnabled", - name = "Typechecking", - description = "Toggle typechecking on the API surface", - tag = "debug", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - TimingLogsEnabled = e(Setting, { - id = "timingLogsEnabled", - name = "Timing Logs", - description = "Toggle logging timing of internal actions for benchmarking Rojo performance", - tag = "debug", - transparency = self.props.transparency, - layoutOrder = layoutIncrement(), - }), - - Layout = e("UIListLayout", { - FillDirection = Enum.FillDirection.Vertical, - SortOrder = Enum.SortOrder.LayoutOrder, - - [Roact.Change.AbsoluteContentSize] = function(object) - self.setContentSize(object.AbsoluteContentSize) - end, - }), - - Padding = e("UIPadding", { - PaddingLeft = UDim.new(0, 20), - PaddingRight = UDim.new(0, 20), - }), - }), - }) -end - -return SettingsPage diff --git a/plugin/src/App/StatusPages/init.lua b/plugin/src/App/StatusPages/init.lua index 111c9c55..03d64e45 100644 --- a/plugin/src/App/StatusPages/init.lua +++ b/plugin/src/App/StatusPages/init.lua @@ -2,7 +2,6 @@ return { NotConnected = require(script.NotConnected), Settings = require(script.Settings), Connecting = require(script.Connecting), - Confirming = require(script.Confirming), Connected = require(script.Connected), Error = require(script.Error), -} +} \ No newline at end of file diff --git a/plugin/src/App/Theme.lua b/plugin/src/App/Theme.lua index 09e3bd57..32578d3e 100644 --- a/plugin/src/App/Theme.lua +++ b/plugin/src/App/Theme.lua @@ -1,6 +1,7 @@ --[[ - Theming system provided through Roact's context. - Uses Studio colors when possible. + Theming system taking advantage of Roact's new context API. + Doesn't use colors provided by Studio and instead just branches on theme + name. This isn't exactly best practice. ]] -- Studio does not exist outside Roblox Studio, so we'll lazily initialize it @@ -14,18 +15,173 @@ local function getStudio() return _Studio end -local ContentProvider = game:GetService("ContentProvider") - local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) +local Roact = require(Rojo.Roact) +local Log = require(Rojo.Log) local strict = require(script.Parent.Parent.strict) -local BRAND_COLOR = Color3.fromHex("E13835") +-- Copying hex colors back and forth from design programs is faster +local function hexColor(decimal) + local red = bit32.band(bit32.rshift(decimal, 16), 2^8 - 1) + local green = bit32.band(bit32.rshift(decimal, 8), 2^8 - 1) + local blue = bit32.band(decimal, 2^8 - 1) -local Context = Roact.createContext({}) + return Color3.fromRGB(red, green, blue) +end + +local BRAND_COLOR = hexColor(0xE13835) + +local lightTheme = strict("LightTheme", { + BackgroundColor = hexColor(0xFFFFFF), + Button = { + Solid = { + ActionFillColor = hexColor(0xFFFFFF), + ActionFillTransparency = 0.8, + Enabled = { + TextColor = hexColor(0xFFFFFF), + BackgroundColor = BRAND_COLOR, + }, + Disabled = { + TextColor = hexColor(0xFFFFFF), + BackgroundColor = BRAND_COLOR, + }, + }, + Bordered = { + ActionFillColor = hexColor(0x000000), + ActionFillTransparency = 0.9, + Enabled = { + TextColor = hexColor(0x393939), + BorderColor = hexColor(0xACACAC), + }, + Disabled = { + TextColor = hexColor(0x393939), + BorderColor = hexColor(0xACACAC), + }, + }, + }, + Checkbox = { + Active = { + IconColor = hexColor(0xFFFFFF), + BackgroundColor = BRAND_COLOR, + }, + Inactive = { + IconColor = hexColor(0xEEEEEE), + BorderColor = hexColor(0xAFAFAF), + }, + }, + AddressEntry = { + TextColor = hexColor(0x000000), + PlaceholderColor = hexColor(0x8C8C8C) + }, + BorderedContainer = { + BorderColor = hexColor(0xCBCBCB), + BackgroundColor = hexColor(0xEEEEEE), + }, + Spinner = { + ForegroundColor = BRAND_COLOR, + BackgroundColor = hexColor(0xEEEEEE), + }, + ConnectionDetails = { + ProjectNameColor = hexColor(0x00000), + AddressColor = hexColor(0x00000), + DisconnectColor = BRAND_COLOR, + }, + Settings = { + DividerColor = hexColor(0xCBCBCB), + Navbar = { + BackButtonColor = hexColor(0x000000), + TextColor = hexColor(0x000000), + }, + Setting = { + NameColor = hexColor(0x000000), + DescriptionColor = hexColor(0x5F5F5F), + }, + }, + Header = { + LogoColor = BRAND_COLOR, + VersionColor = hexColor(0x727272), + }, + ErrorColor = hexColor(0x000000), + ScrollBarColor = hexColor(0x000000), +}) + +local darkTheme = strict("DarkTheme", { + BackgroundColor = hexColor(0x2E2E2E), + Button = { + Solid = { + ActionFillColor = hexColor(0xFFFFFF), + ActionFillTransparency = 0.8, + Enabled = { + TextColor = hexColor(0xFFFFFF), + BackgroundColor = BRAND_COLOR, + }, + Disabled = { + TextColor = hexColor(0xFFFFFF), + BackgroundColor = BRAND_COLOR, + }, + }, + Bordered = { + ActionFillColor = hexColor(0xFFFFFF), + ActionFillTransparency = 0.9, + Enabled = { + TextColor = hexColor(0xDBDBDB), + BorderColor = hexColor(0x535353), + }, + Disabled = { + TextColor = hexColor(0xDBDBDB), + BorderColor = hexColor(0x535353), + }, + }, + }, + Checkbox = { + Active = { + IconColor = hexColor(0xFFFFFF), + BackgroundColor = BRAND_COLOR, + }, + Inactive = { + IconColor = hexColor(0x484848), + BorderColor = hexColor(0x5A5A5A), + }, + }, + AddressEntry = { + TextColor = hexColor(0xFFFFFF), + PlaceholderColor = hexColor(0x8B8B8B) + }, + BorderedContainer = { + BorderColor = hexColor(0x535353), + BackgroundColor = hexColor(0x2B2B2B), + }, + Spinner = { + ForegroundColor = BRAND_COLOR, + BackgroundColor = hexColor(0x2B2B2B), + }, + ConnectionDetails = { + ProjectNameColor = hexColor(0xFFFFFF), + AddressColor = hexColor(0xFFFFFF), + DisconnectColor = hexColor(0xFFFFFF), + }, + Settings = { + DividerColor = hexColor(0x535353), + Navbar = { + BackButtonColor = hexColor(0xFFFFFF), + TextColor = hexColor(0xFFFFFF), + }, + Setting = { + NameColor = hexColor(0xFFFFFF), + DescriptionColor = hexColor(0xD3D3D3), + }, + }, + Header = { + LogoColor = BRAND_COLOR, + VersionColor = hexColor(0xD3D3D3) + }, + ErrorColor = hexColor(0xFFFFFF), + ScrollBarColor = hexColor(0xFFFFFF), +}) + +local Context = Roact.createContext(lightTheme) local StudioProvider = Roact.Component:extend("StudioProvider") @@ -33,209 +189,25 @@ local StudioProvider = Roact.Component:extend("StudioProvider") function StudioProvider:updateTheme() local studioTheme = getStudio().Theme - local isDark = studioTheme.Name == "Dark" + if studioTheme.Name == "Light" then + self:setState({ + theme = lightTheme, + }) + elseif studioTheme.Name == "Dark" then + self:setState({ + theme = darkTheme, + }) + else + Log.warn("Unexpected theme '{}'' -- falling back to light theme!", studioTheme.Name) - local theme = strict(studioTheme.Name .. "Theme", { - Font = { - Main = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.Medium, Enum.FontStyle.Normal), - Bold = Font.new("rbxasset://fonts/families/Montserrat.json", Enum.FontWeight.Bold, Enum.FontStyle.Normal), - Thin = Font.new( - "rbxasset://fonts/families/Montserrat.json", - Enum.FontWeight.Regular, - Enum.FontStyle.Normal - ), - Code = Font.new( - "rbxasset://fonts/families/Inconsolata.json", - Enum.FontWeight.Regular, - Enum.FontStyle.Normal - ), - }, - TextSize = { - Body = 15, - Small = 13, - Medium = 16, - Large = 18, - Code = 16, - }, - BrandColor = BRAND_COLOR, - BackgroundColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.MainBackground), - TextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.MainText), - SubTextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.SubText), - Button = { - Solid = { - -- Solid uses brand theming, not Studio theming. - ActionFillColor = Color3.fromHex("FFFFFF"), - ActionFillTransparency = 0.8, - Enabled = { - TextColor = Color3.fromHex("FFFFFF"), - BackgroundColor = BRAND_COLOR, - }, - Disabled = { - TextColor = Color3.fromHex("FFFFFF"), - BackgroundColor = BRAND_COLOR, - }, - }, - Bordered = { - ActionFillColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.ButtonText, - Enum.StudioStyleGuideModifier.Selected - ), - ActionFillTransparency = 0.9, - Enabled = { - TextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.ButtonText), - BorderColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - }, - Disabled = { - TextColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.ButtonText, - Enum.StudioStyleGuideModifier.Disabled - ), - BorderColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - }, - }, - }, - Checkbox = { - Active = { - -- Active checkboxes use brand theming, not Studio theming. - IconColor = Color3.fromHex("FFFFFF"), - BackgroundColor = BRAND_COLOR, - }, - Inactive = { - IconColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldIndicator, - Enum.StudioStyleGuideModifier.Disabled - ), - BorderColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - }, - }, - Dropdown = { - TextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.ButtonText), - BorderColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - BackgroundColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.MainBackground), - IconColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldIndicator, - Enum.StudioStyleGuideModifier.Disabled - ), - }, - TextInput = { - Enabled = { - TextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - PlaceholderColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.SubText), - BorderColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - }, - Disabled = { - TextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.MainText), - PlaceholderColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.SubText), - BorderColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - }, - ActionFillColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - ActionFillTransparency = 0.9, - }, - AddressEntry = { - TextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - PlaceholderColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.SubText), - }, - BorderedContainer = { - BorderColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - BackgroundColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.InputFieldBackground), - }, - Spinner = { - ForegroundColor = BRAND_COLOR, - BackgroundColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.InputFieldBackground), - }, - Diff = { - -- Very bright different colors in case some places were not updated to use - -- the new background diff colors. - Add = Color3.fromRGB(255, 0, 255), - Remove = Color3.fromRGB(255, 0, 255), - Edit = Color3.fromRGB(255, 0, 255), - - Row = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - Warning = studioTheme:GetColor(Enum.StudioStyleGuideColor.WarningText), - - Background = { - -- Studio doesn't have good colors since their diffs use backgrounds, not text - Add = if isDark then Color3.fromRGB(143, 227, 154) else Color3.fromRGB(41, 164, 45), - Remove = if isDark then Color3.fromRGB(242, 125, 125) else Color3.fromRGB(150, 29, 29), - Edit = if isDark then Color3.fromRGB(120, 154, 248) else Color3.fromRGB(0, 70, 160), - Remain = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - }, - - Text = { - Add = if isDark then Color3.new(0, 0, 0) else Color3.new(1, 1, 1), - Remove = if isDark then Color3.new(0, 0, 0) else Color3.new(1, 1, 1), - Edit = if isDark then Color3.new(0, 0, 0) else Color3.new(1, 1, 1), - Remain = studioTheme:GetColor(Enum.StudioStyleGuideColor.MainText), - }, - }, - ConnectionDetails = { - ProjectNameColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - AddressColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - DisconnectColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - }, - Settings = { - DividerColor = studioTheme:GetColor( - Enum.StudioStyleGuideColor.CheckedFieldBorder, - Enum.StudioStyleGuideModifier.Disabled - ), - Navbar = { - BackButtonColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - TextColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - }, - Setting = { - NameColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - DescriptionColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.MainText), - UnstableColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.WarningText), - DebugColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.InfoText), - }, - }, - Header = { - LogoColor = BRAND_COLOR, - VersionColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.MainText), - }, - Notification = { - InfoColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - CloseColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - }, - ErrorColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - ScrollBarColor = studioTheme:GetColor(Enum.StudioStyleGuideColor.BrightText), - }) - - self:setState({ - theme = theme, - }) + self:setState({ + theme = lightTheme, + }) + end end function StudioProvider:init() self:updateTheme() - - -- Preload the Fonts so that getTextBoundsAsync won't yield - local fontAssetIds = {} - for _, font in self.state.theme.Font do - table.insert(fontAssetIds, font.Family) - end - pcall(ContentProvider.PreloadAsync, ContentProvider, fontAssetIds) end function StudioProvider:render() diff --git a/plugin/src/App/bindingUtil.lua b/plugin/src/App/bindingUtil.lua index 60d3876f..daabd711 100644 --- a/plugin/src/App/bindingUtil.lua +++ b/plugin/src/App/bindingUtil.lua @@ -1,8 +1,7 @@ local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) -local Log = require(Packages.Log) +local Roact = require(Rojo.Roact) +local Log = require(Rojo.Log) local LERP_DATA_TYPES = { Color3 = true, @@ -44,7 +43,7 @@ end local function blendAlpha(alphaValues) local alpha = 0 - for _, value in alphaValues do + for _, value in pairs(alphaValues) do alpha = alpha + (1 - alpha) * value end @@ -56,4 +55,4 @@ return { mapLerp = mapLerp, deriveProperty = deriveProperty, blendAlpha = blendAlpha, -} +} \ No newline at end of file diff --git a/plugin/src/App/getTextBoundsAsync.lua b/plugin/src/App/getTextBoundsAsync.lua deleted file mode 100644 index 2813903e..00000000 --- a/plugin/src/App/getTextBoundsAsync.lua +++ /dev/null @@ -1,41 +0,0 @@ -local TextService = game:GetService("TextService") - -local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages - -local Log = require(Packages.Log) - -local params = Instance.new("GetTextBoundsParams") - -local function getTextBoundsAsync( - text: string, - font: Font, - textSize: number, - width: number, - richText: boolean? -): Vector2 - if type(text) ~= "string" then - Log.warn(`Invalid text. Expected string, received {type(text)} instead`) - return Vector2.zero - end - if #text >= 200_000 then - Log.warn(`Invalid text. Exceeds the 199,999 character limit`) - return Vector2.zero - end - - params.Text = text - params.Font = font - params.Size = textSize - params.Width = width - params.RichText = not not richText - - local success, bounds = pcall(TextService.GetTextBoundsAsync, TextService, params) - if not success then - Log.warn(`Failed to get text bounds: {bounds}`) - return Vector2.zero - end - - return bounds -end - -return getTextBoundsAsync diff --git a/plugin/src/App/init.lua b/plugin/src/App/init.lua index e6e4deee..ed9b4443 100644 --- a/plugin/src/App/init.lua +++ b/plugin/src/App/init.lua @@ -1,35 +1,21 @@ -local ChangeHistoryService = game:GetService("ChangeHistoryService") -local Players = game:GetService("Players") -local ServerStorage = game:GetService("ServerStorage") -local RunService = game:GetService("RunService") - local Rojo = script:FindFirstAncestor("Rojo") local Plugin = Rojo.Plugin -local Packages = Rojo.Packages -local Roact = require(Packages.Roact) -local Log = require(Packages.Log) -local Promise = require(Packages.Promise) +local Roact = require(Rojo.Roact) +local Log = require(Rojo.Log) local Assets = require(Plugin.Assets) local Version = require(Plugin.Version) local Config = require(Plugin.Config) -local Settings = require(Plugin.Settings) local strict = require(Plugin.strict) local Dictionary = require(Plugin.Dictionary) local ServeSession = require(Plugin.ServeSession) local ApiContext = require(Plugin.ApiContext) -local PatchSet = require(Plugin.PatchSet) -local PatchTree = require(Plugin.PatchTree) local preloadAssets = require(Plugin.preloadAssets) -local soundPlayer = require(Plugin.soundPlayer) -local ignorePlaceIds = require(Plugin.ignorePlaceIds) -local timeUtil = require(Plugin.timeUtil) local Theme = require(script.Theme) +local PluginSettings = require(script.PluginSettings) local Page = require(script.Page) -local Notifications = require(script.Components.Notifications) -local Tooltip = require(script.Components.Tooltip) local StudioPluginAction = require(script.Components.Studio.StudioPluginAction) local StudioToolbar = require(script.Components.Studio.StudioToolbar) local StudioToggleButton = require(script.Components.Studio.StudioToggleButton) @@ -41,7 +27,6 @@ local AppStatus = strict("AppStatus", { NotConnected = "NotConnected", Settings = "Settings", Connecting = "Connecting", - Confirming = "Confirming", Connected = "Connected", Error = "Error", }) @@ -53,642 +38,50 @@ local App = Roact.Component:extend("App") function App:init() preloadAssets() - local priorSyncInfo = self:getPriorSyncInfo() - self.host, self.setHost = Roact.createBinding(priorSyncInfo.host or "") - self.port, self.setPort = Roact.createBinding(priorSyncInfo.port or "") - - self.confirmationBindable = Instance.new("BindableEvent") - self.confirmationEvent = self.confirmationBindable.Event - self.knownProjects = {} - self.notifId = 0 - - self.waypointConnection = ChangeHistoryService.OnUndo:Connect(function(action: string) - if not string.find(action, "^Rojo: Patch") then - return - end - - local undoConnection, redoConnection = nil, nil - local function cleanup() - undoConnection:Disconnect() - redoConnection:Disconnect() - end - - Log.warn( - string.format( - "You've undone '%s'.\nIf this was not intended, please Redo in the topbar or with Ctrl/⌘+Y.", - action - ) - ) - local dismissNotif = self:addNotification({ - text = string.format("You've undone '%s'.\nIf this was not intended, please restore.", action), - timeout = 10, - onClose = function() - cleanup() - end, - actions = { - Restore = { - text = "Restore", - style = "Solid", - layoutOrder = 1, - onClick = function() - ChangeHistoryService:Redo() - end, - }, - Dismiss = { - text = "Dismiss", - style = "Bordered", - layoutOrder = 2, - }, - }, - }) - - undoConnection = ChangeHistoryService.OnUndo:Once(function() - -- Our notif is now out of date- redoing will not restore the patch - -- since we've undone even further. Dismiss the notif. - cleanup() - dismissNotif() - end) - redoConnection = ChangeHistoryService.OnRedo:Once(function(redoneAction: string) - if redoneAction == action then - -- The user has restored the patch, so we can dismiss the notif - cleanup() - dismissNotif() - end - end) - end) - - self.disconnectUpdatesCheckChanged = Settings:onChanged("checkForUpdates", function() - self:checkForUpdates() - end) - self.disconnectPrereleasesCheckChanged = Settings:onChanged("checkForPrereleases", function() - self:checkForUpdates() - end) + self.host, self.setHost = Roact.createBinding("") + self.port, self.setPort = Roact.createBinding("") self:setState({ appStatus = AppStatus.NotConnected, guiEnabled = false, - confirmData = {}, - patchData = { - patch = PatchSet.newEmpty(), - unapplied = PatchSet.newEmpty(), - timestamp = os.time(), - }, - notifications = {}, toolbarIcon = Assets.Images.PluginButton, }) - - if RunService:IsEdit() then - self:checkForUpdates() - - self:startSyncReminderPolling() - self.disconnectSyncReminderPollingChanged = Settings:onChanged("syncReminderPolling", function(enabled) - if enabled then - self:startSyncReminderPolling() - else - self:stopSyncReminderPolling() - end - end) - - self:tryAutoReconnect():andThen(function(didReconnect) - if not didReconnect then - self:checkSyncReminder() - end - end) - end - - if self:isAutoConnectPlaytestServerAvailable() then - self:useRunningConnectionInfo() - self:startSession() - end - self.autoConnectPlaytestServerListener = Settings:onChanged("autoConnectPlaytestServer", function(enabled) - if enabled then - if self:isAutoConnectPlaytestServerWriteable() and self.serveSession ~= nil then - -- Write the existing session - local baseUrl = self.serveSession.__apiContext.__baseUrl - self:setRunningConnectionInfo(baseUrl) - end - else - self:clearRunningConnectionInfo() - end - end) -end - -function App:willUnmount() - self:endSession() - - self.waypointConnection:Disconnect() - self.confirmationBindable:Destroy() - - self.disconnectUpdatesCheckChanged() - self.disconnectPrereleasesCheckChanged() - if self.disconnectSyncReminderPollingChanged then - self.disconnectSyncReminderPollingChanged() - end - - self:stopSyncReminderPolling() - - self.autoConnectPlaytestServerListener() - self:clearRunningConnectionInfo() -end - -function App:addNotification(notif: { - text: string, - isFullscreen: boolean?, - timeout: number?, - actions: { [string]: { text: string, style: string, layoutOrder: number, onClick: (any) -> ()? } }?, - onClose: (any) -> ()?, -}) - if not Settings:get("showNotifications") then - return - end - - self.notifId += 1 - local id = self.notifId - - self:setState(function(prevState) - local notifications = table.clone(prevState.notifications) - notifications[id] = Dictionary.merge({ - timeout = notif.timeout or 5, - isFullscreen = notif.isFullscreen or false, - }, notif) - - return { - notifications = notifications, - } - end) - - return function() - self:closeNotification(id) - end -end - -function App:closeNotification(id: number) - if not self.state.notifications[id] then - return - end - - self:setState(function(prevState) - local notifications = table.clone(prevState.notifications) - notifications[id] = nil - - return { - notifications = notifications, - } - end) -end - -function App:checkForUpdates() - local updateMessage = Version.getUpdateMessage() - - if updateMessage then - self:addNotification({ - text = updateMessage, - timeout = 500, - actions = { - Dismiss = { - text = "Dismiss", - style = "Bordered", - layoutOrder = 2, - }, - }, - }) - end -end - -function App:getPriorSyncInfo(): { host: string?, port: string?, projectName: string?, timestamp: number? } - local priorSyncInfos = Settings:get("priorEndpoints") - if not priorSyncInfos then - return {} - end - - local id = tostring(game.PlaceId) - if ignorePlaceIds[id] then - return {} - end - - return priorSyncInfos[id] or {} -end - -function App:setPriorSyncInfo(host: string, port: string, projectName: string) - local priorSyncInfos = Settings:get("priorEndpoints") - if not priorSyncInfos then - priorSyncInfos = {} - end - - local now = os.time() - - -- Clear any stale saves to avoid disc bloat - for placeId, syncInfo in priorSyncInfos do - if now - (syncInfo.timestamp or now) > 12_960_000 then - priorSyncInfos[placeId] = nil - Log.trace("Cleared stale saved endpoint for {}", placeId) - end - end - - local id = tostring(game.PlaceId) - if ignorePlaceIds[id] then - return - end - - priorSyncInfos[id] = { - host = if host ~= Config.defaultHost then host else nil, - port = if port ~= Config.defaultPort then port else nil, - projectName = projectName, - timestamp = now, - } - Log.trace("Saved last used endpoint for {}", game.PlaceId) - - Settings:set("priorEndpoints", priorSyncInfos) -end - -function App:forgetPriorSyncInfo() - local priorSyncInfos = Settings:get("priorEndpoints") - if not priorSyncInfos then - priorSyncInfos = {} - end - - local id = tostring(game.PlaceId) - priorSyncInfos[id] = nil - Log.trace("Erased last used endpoint for {}", game.PlaceId) - - Settings:set("priorEndpoints", priorSyncInfos) end function App:getHostAndPort() local host = self.host:getValue() local port = self.port:getValue() - return if #host > 0 then host else Config.defaultHost, if #port > 0 then port else Config.defaultPort -end + local host = if #host > 0 then host else Config.defaultHost + local port = if #port > 0 then port else Config.defaultPort -function App:isSyncLockAvailable() - if #Players:GetPlayers() == 0 then - -- Team Create is not active, so no one can be holding the lock - return true - end - - local lock = ServerStorage:FindFirstChild("__Rojo_SessionLock") - if not lock then - -- No lock is made yet, so it is available - return true - end - - if lock.Value and lock.Value ~= Players.LocalPlayer and lock.Value.Parent then - -- Someone else is holding the lock - return false, lock.Value - end - - -- The lock exists, but is not claimed - return true -end - -function App:claimSyncLock() - if #Players:GetPlayers() == 0 then - Log.trace("Skipping sync lock because this isn't in Team Create") - return true - end - - local isAvailable, priorOwner = self:isSyncLockAvailable() - if not isAvailable then - Log.trace("Skipping sync lock because it is already claimed") - return false, priorOwner - end - - local lock = ServerStorage:FindFirstChild("__Rojo_SessionLock") - if not lock then - lock = Instance.new("ObjectValue") - lock.Name = "__Rojo_SessionLock" - lock.Archivable = false - lock.Value = Players.LocalPlayer - lock.Parent = ServerStorage - Log.trace("Created and claimed sync lock") - return true - end - - lock.Value = Players.LocalPlayer - Log.trace("Claimed existing sync lock") - return true -end - -function App:releaseSyncLock() - local lock = ServerStorage:FindFirstChild("__Rojo_SessionLock") - if not lock then - Log.trace("No sync lock found, assumed released") - return - end - - if lock.Value == Players.LocalPlayer then - lock.Value = nil - Log.trace("Released sync lock") - return - end - - Log.trace("Could not relase sync lock because it is owned by {}", lock.Value) -end - -function App:findActiveServer() - local host, port = self:getHostAndPort() - local baseUrl = if string.find(host, "^https?://") - then string.format("%s:%s", host, port) - else string.format("http://%s:%s", host, port) - - Log.trace("Checking for active sync server at {}", baseUrl) - - local apiContext = ApiContext.new(baseUrl) - return apiContext:connect():andThen(function(serverInfo) - apiContext:disconnect() - return serverInfo, host, port - end) -end - -function App:tryAutoReconnect() - if not Settings:get("autoReconnect") then - return Promise.resolve(false) - end - - local priorSyncInfo = self:getPriorSyncInfo() - if not priorSyncInfo.projectName then - Log.trace("No prior sync info found, skipping auto-reconnect") - return Promise.resolve(false) - end - - return self:findActiveServer() - :andThen(function(serverInfo) - -- change - if serverInfo.projectName == priorSyncInfo.projectName then - Log.trace("Auto-reconnect found matching server, reconnecting...") - self:addNotification({ - text = `Auto-reconnect discovered project '{serverInfo.projectName}'...`, - }) - self:startSession() - return true - end - Log.trace("Auto-reconnect found different server, not reconnecting") - return false - end) - :catch(function() - Log.trace("Auto-reconnect did not find a server, not reconnecting") - return false - end) -end - -function App:checkSyncReminder() - local syncReminderMode = Settings:get("syncReminderMode") - if syncReminderMode == "None" then - return - end - - if self.serveSession ~= nil or not self:isSyncLockAvailable() then - -- Already syncing or cannot sync, no reason to remind - return - end - - local priorSyncInfo = self:getPriorSyncInfo() - - self:findActiveServer() - :andThen(function(serverInfo, host, port) - self:sendSyncReminder( - `Project '{serverInfo.projectName}' is serving at {host}:{port}.\nWould you like to connect?`, - { "Connect", "Dismiss" } - ) - end) - :catch(function() - if priorSyncInfo.timestamp and priorSyncInfo.projectName then - -- We didn't find an active server, - -- but this place has a prior sync - -- so we should remind the user to serve - - local timeSinceSync = timeUtil.elapsedToText(os.time() - priorSyncInfo.timestamp) - self:sendSyncReminder( - `You synced project '{priorSyncInfo.projectName}' to this place {timeSinceSync}.\nDid you mean to run 'rojo serve' and then connect?`, - { "Connect", "Forget", "Dismiss" } - ) - end - end) -end - -function App:startSyncReminderPolling() - if - self.syncReminderPollingThread ~= nil - or Settings:get("syncReminderMode") == "None" - or not Settings:get("syncReminderPolling") - then - return - end - - Log.trace("Starting sync reminder polling thread") - self.syncReminderPollingThread = task.spawn(function() - while task.wait(30) do - if self.syncReminderPollingThread == nil then - -- The polling thread was stopped, so exit - return - end - if self.dismissSyncReminder then - -- There is already a sync reminder being shown - task.wait(5) - continue - end - self:checkSyncReminder() - end - end) -end - -function App:stopSyncReminderPolling() - if self.syncReminderPollingThread then - Log.trace("Stopping sync reminder polling thread") - task.cancel(self.syncReminderPollingThread) - self.syncReminderPollingThread = nil - end -end - -function App:sendSyncReminder(message: string, shownActions: { string }) - local syncReminderMode = Settings:get("syncReminderMode") - if syncReminderMode == "None" then - return - end - - local connectIndex = table.find(shownActions, "Connect") - local forgetIndex = table.find(shownActions, "Forget") - local dismissIndex = table.find(shownActions, "Dismiss") - - self.dismissSyncReminder = self:addNotification({ - text = message, - timeout = 120, - isFullscreen = Settings:get("syncReminderMode") == "Fullscreen", - onClose = function() - self.dismissSyncReminder = nil - end, - actions = { - Connect = if connectIndex - then { - text = "Connect", - style = "Solid", - layoutOrder = connectIndex, - onClick = function() - self:startSession() - end, - } - else nil, - Forget = if forgetIndex - then { - text = "Forget", - style = "Bordered", - layoutOrder = forgetIndex, - onClick = function() - -- The user doesn't want to be reminded again about this sync - self:forgetPriorSyncInfo() - end, - } - else nil, - Dismiss = if dismissIndex - then { - text = "Dismiss", - style = "Bordered", - layoutOrder = dismissIndex, - onClick = function() - -- If the user dismisses the reminder, - -- then we don't need to remind them again - self:stopSyncReminderPolling() - end, - } - else nil, - }, - }) -end - -function App:isAutoConnectPlaytestServerAvailable() - return RunService:IsRunning() - and RunService:IsStudio() - and RunService:IsServer() - and Settings:get("autoConnectPlaytestServer") - and workspace:GetAttribute("__Rojo_ConnectionUrl") -end - -function App:isAutoConnectPlaytestServerWriteable() - return RunService:IsEdit() and Settings:get("autoConnectPlaytestServer") -end - -function App:setRunningConnectionInfo(baseUrl: string) - if not self:isAutoConnectPlaytestServerWriteable() then - return - end - - Log.trace("Setting connection info for play solo auto-connect") - workspace:SetAttribute("__Rojo_ConnectionUrl", baseUrl) -end - -function App:clearRunningConnectionInfo() - if not RunService:IsEdit() then - -- Only write connection info from edit mode - return - end - - Log.trace("Clearing connection info for play solo auto-connect") - workspace:SetAttribute("__Rojo_ConnectionUrl", nil) -end - -function App:useRunningConnectionInfo() - local connectionInfo = workspace:GetAttribute("__Rojo_ConnectionUrl") - if not connectionInfo then - return - end - - Log.trace("Using connection info for play solo auto-connect") - local host, port = string.match(connectionInfo, "^(.+):(.-)$") - - self.setHost(host) - self.setPort(port) + return host, port end function App:startSession() - local claimedLock, priorOwner = self:claimSyncLock() - if not claimedLock then - local msg = string.format("Could not sync because user '%s' is already syncing", tostring(priorOwner)) - - Log.warn(msg) - self:addNotification({ - text = msg, - timeout = 10, - }) - self:setState({ - appStatus = AppStatus.Error, - errorMessage = msg, - toolbarIcon = Assets.Images.PluginButtonWarning, - }) - - return - end - local host, port = self:getHostAndPort() - local baseUrl = if string.find(host, "^https?://") - then string.format("%s:%s", host, port) - else string.format("http://%s:%s", host, port) + local sessionOptions = { + openScriptsExternally = self.props.settings:get("openScriptsExternally"), + twoWaySync = self.props.settings:get("twoWaySync"), + } + + local baseUrl = ("http://%s:%s"):format(host, port) local apiContext = ApiContext.new(baseUrl) local serveSession = ServeSession.new({ apiContext = apiContext, - twoWaySync = Settings:get("twoWaySync"), + openScriptsExternally = sessionOptions.openScriptsExternally, + twoWaySync = sessionOptions.twoWaySync, }) - serveSession:setUpdateLoadingTextCallback(function(text: string) - self:setState({ - connectingText = text, - }) - end) - - self.cleanupPrecommit = serveSession:hookPrecommit(function(patch, instanceMap) - -- Build new tree for patch - self:setState({ - patchTree = PatchTree.build(patch, instanceMap, { "Property", "Old", "New" }), - }) - end) - self.cleanupPostcommit = serveSession:hookPostcommit(function(patch, instanceMap, unappliedPatch) - local now = DateTime.now().UnixTimestamp - self:setState(function(prevState) - local oldPatchData = prevState.patchData - local newPatchData = { - patch = patch, - unapplied = unappliedPatch, - timestamp = now, - } - - if PatchSet.isEmpty(patch) then - -- Keep existing patch info, but use new timestamp - newPatchData.patch = oldPatchData.patch - newPatchData.unapplied = oldPatchData.unapplied - elseif now - oldPatchData.timestamp < 2 then - -- Patches that apply in the same second are combined for human clarity - newPatchData.patch = PatchSet.assign(PatchSet.newEmpty(), oldPatchData.patch, patch) - newPatchData.unapplied = PatchSet.assign(PatchSet.newEmpty(), oldPatchData.unapplied, unappliedPatch) - end - - return { - patchTree = PatchTree.updateMetadata(prevState.patchTree, patch, instanceMap, unappliedPatch), - patchData = newPatchData, - } - end) - end) - serveSession:onStatusChanged(function(status, details) if status == ServeSession.Status.Connecting then - if self.dismissSyncReminder then - self.dismissSyncReminder() - self.dismissSyncReminder = nil - end - self:setState({ appStatus = AppStatus.Connecting, toolbarIcon = Assets.Images.PluginButton, }) - self:addNotification({ - text = "Connecting to session...", - }) elseif status == ServeSession.Status.Connected then - self.knownProjects[details] = true - self:setPriorSyncInfo(host, port, details) - self:setRunningConnectionInfo(baseUrl) - local address = ("%s:%s"):format(host, port) self:setState({ appStatus = AppStatus.Connected, @@ -696,20 +89,10 @@ function App:startSession() address = address, toolbarIcon = Assets.Images.PluginButtonConnected, }) - self:addNotification({ - text = string.format("Connected to session '%s' at %s.", details, address), - }) + + Log.info("Connected to session '{}' at {}", details, address) elseif status == ServeSession.Status.Disconnected then self.serveSession = nil - self:releaseSyncLock() - self:clearRunningConnectionInfo() - self:setState({ - patchData = { - patch = PatchSet.newEmpty(), - unapplied = PatchSet.newEmpty(), - timestamp = os.time(), - }, - }) -- Details being present indicates that this -- disconnection was from an error. @@ -721,109 +104,17 @@ function App:startSession() errorMessage = tostring(details), toolbarIcon = Assets.Images.PluginButtonWarning, }) - self:addNotification({ - text = tostring(details), - timeout = 10, - }) else self:setState({ appStatus = AppStatus.NotConnected, toolbarIcon = Assets.Images.PluginButton, }) - self:addNotification({ - text = "Disconnected from session.", - timeout = 10, - }) + + Log.info("Disconnected session") end end end) - serveSession:setConfirmCallback(function(instanceMap, patch, serverInfo) - if PatchSet.isEmpty(patch) then - Log.trace("Accepting patch without confirmation because it is empty") - return "Accept" - end - - -- Play solo auto-connect does not require confirmation - if self:isAutoConnectPlaytestServerAvailable() then - Log.trace("Accepting patch without confirmation because play solo auto-connect is enabled") - return "Accept" - end - - local confirmationBehavior = Settings:get("confirmationBehavior") - if confirmationBehavior == "Initial" then - -- Only confirm if we haven't synced this project yet this session - if self.knownProjects[serverInfo.projectName] then - Log.trace( - "Accepting patch without confirmation because project has already been connected and behavior is set to Initial" - ) - return "Accept" - end - elseif confirmationBehavior == "Large Changes" then - -- Only confirm if the patch impacts many instances - if PatchSet.countInstances(patch) < Settings:get("largeChangesConfirmationThreshold") then - Log.trace( - "Accepting patch without confirmation because patch is small and behavior is set to Large Changes" - ) - return "Accept" - end - elseif confirmationBehavior == "Unlisted PlaceId" then - -- Only confirm if the current placeId is not in the servePlaceIds allowlist - if serverInfo.expectedPlaceIds then - local isListed = table.find(serverInfo.expectedPlaceIds, game.PlaceId) ~= nil - if isListed then - Log.trace( - "Accepting patch without confirmation because placeId is listed and behavior is set to Unlisted PlaceId" - ) - return "Accept" - end - end - elseif confirmationBehavior == "Never" then - Log.trace("Accepting patch without confirmation because behavior is set to Never") - return "Accept" - end - - -- The datamodel name gets overwritten by Studio, making confirmation of it intrusive - -- and unnecessary. This special case allows it to be accepted without confirmation. - if - PatchSet.hasAdditions(patch) == false - and PatchSet.hasRemoves(patch) == false - and PatchSet.containsOnlyInstance(patch, instanceMap, game) - then - local datamodelUpdates = PatchSet.getUpdateForInstance(patch, instanceMap, game) - if - datamodelUpdates ~= nil - and next(datamodelUpdates.changedProperties) == nil - and datamodelUpdates.changedClassName == nil - then - Log.trace("Accepting patch without confirmation because it only contains a datamodel name change") - return "Accept" - end - end - - self:setState({ - connectingText = "Computing diff view...", - }) - self:setState({ - appStatus = AppStatus.Confirming, - patchTree = PatchTree.build(patch, instanceMap, { "Property", "Current", "Incoming" }), - confirmData = { - serverInfo = serverInfo, - }, - toolbarIcon = Assets.Images.PluginButton, - }) - - self:addNotification({ - text = string.format( - "Please accept%sor abort the initializing sync session.", - Settings:get("twoWaySync") and ", reject, " or " " - ), - timeout = 7, - }) - - return self.confirmationEvent:Wait() - end) - serveSession:start() self.serveSession = serveSession @@ -842,13 +133,6 @@ function App:endSession() appStatus = AppStatus.NotConnected, }) - if self.cleanupPrecommit ~= nil then - self.cleanupPrecommit() - end - if self.cleanupPostcommit ~= nil then - self.cleanupPostcommit() - end - Log.trace("Session terminated by user") end @@ -870,127 +154,86 @@ function App:render() value = self.props.plugin, }, { e(Theme.StudioProvider, nil, { - tooltip = e(Tooltip.Provider, nil, { - gui = e(StudioPluginGui, { - id = pluginName, - title = pluginName, - active = self.state.guiEnabled, - isEphemeral = false, + gui = e(StudioPluginGui, { + id = pluginName, + title = pluginName, + active = self.state.guiEnabled, - initDockState = Enum.InitialDockState.Right, - overridePreviousState = false, - floatingSize = Vector2.new(320, 210), - minimumSize = Vector2.new(300, 210), + initDockState = Enum.InitialDockState.Right, + initEnabled = false, + overridePreviousState = false, + floatingSize = Vector2.new(300, 200), + minimumSize = Vector2.new(300, 200), - zIndexBehavior = Enum.ZIndexBehavior.Sibling, + zIndexBehavior = Enum.ZIndexBehavior.Sibling, - onInitialState = function(initialState) + onInitialState = function(initialState) + self:setState({ + guiEnabled = initialState, + }) + end, + + onClose = function() + self:setState({ + guiEnabled = false, + }) + end, + }, { + NotConnectedPage = createPageElement(AppStatus.NotConnected, { + host = self.host, + onHostChange = self.setHost, + port = self.port, + onPortChange = self.setPort, + + onConnect = function() + self:startSession() + end, + + onNavigateSettings = function() self:setState({ - guiEnabled = initialState, + appStatus = AppStatus.Settings, }) end, + }), + + Connecting = createPageElement(AppStatus.Connecting), + + Connected = createPageElement(AppStatus.Connected, { + projectName = self.state.projectName, + address = self.state.address, + + onDisconnect = function() + self:endSession() + end, + }), + + Settings = createPageElement(AppStatus.Settings, { + onBack = function() + self:setState({ + appStatus = AppStatus.NotConnected, + }) + end, + }), + + Error = createPageElement(AppStatus.Error, { + errorMessage = self.state.errorMessage, onClose = function() self:setState({ - guiEnabled = false, + appStatus = AppStatus.NotConnected, + toolbarIcon = Assets.Images.PluginButton, }) end, - }, { - Tooltips = e(Tooltip.Container, nil), - - NotConnectedPage = createPageElement(AppStatus.NotConnected, { - host = self.host, - onHostChange = self.setHost, - port = self.port, - onPortChange = self.setPort, - - onConnect = function() - self:startSession() - end, - - onNavigateSettings = function() - self.backPage = AppStatus.NotConnected - self:setState({ - appStatus = AppStatus.Settings, - }) - end, - }), - - ConfirmingPage = createPageElement(AppStatus.Confirming, { - confirmData = self.state.confirmData, - patchTree = self.state.patchTree, - createPopup = not self.state.guiEnabled, - - onAbort = function() - self.confirmationBindable:Fire("Abort") - end, - onAccept = function() - self.confirmationBindable:Fire("Accept") - end, - onReject = function() - self.confirmationBindable:Fire("Reject") - end, - }), - - Connecting = createPageElement(AppStatus.Connecting, { - text = self.state.connectingText, - }), - - Connected = createPageElement(AppStatus.Connected, { - projectName = self.state.projectName, - address = self.state.address, - patchTree = self.state.patchTree, - patchData = self.state.patchData, - serveSession = self.serveSession, - - onDisconnect = function() - self:endSession() - end, - - onNavigateSettings = function() - self.backPage = AppStatus.Connected - self:setState({ - appStatus = AppStatus.Settings, - }) - end, - }), - - Settings = createPageElement(AppStatus.Settings, { - syncActive = self.serveSession ~= nil - and self.serveSession:getStatus() == ServeSession.Status.Connected, - - onBack = function() - self:setState({ - appStatus = self.backPage or AppStatus.NotConnected, - }) - end, - }), - - Error = createPageElement(AppStatus.Error, { - errorMessage = self.state.errorMessage, - - onClose = function() - self:setState({ - appStatus = AppStatus.NotConnected, - toolbarIcon = Assets.Images.PluginButton, - }) - end, - }), }), - RojoNotifications = e("ScreenGui", { - ZIndexBehavior = Enum.ZIndexBehavior.Sibling, - ResetOnSpawn = false, - DisplayOrder = 100, - }, { - Notifications = e(Notifications, { - soundPlayer = self.props.soundPlayer, - notifications = self.state.notifications, - onClose = function(id) - self:closeNotification(id) - end, - }), - }), + Background = Theme.with(function(theme) + return e("Frame", { + Size = UDim2.new(1, 0, 1, 0), + BackgroundColor3 = theme.BackgroundColor, + ZIndex = 0, + BorderSizePixel = 0, + }) + end), }), toggleAction = e(StudioPluginAction, { @@ -1002,9 +245,7 @@ function App:render() onTriggered = function() if self.serveSession == nil or self.serveSession:getStatus() == ServeSession.Status.NotStarted then self:startSession() - elseif - self.serveSession ~= nil and self.serveSession:getStatus() == ServeSession.Status.Connected - then + elseif self.serveSession ~= nil and self.serveSession:getStatus() == ServeSession.Status.Connected then self:endSession() end end, @@ -1052,16 +293,21 @@ function App:render() } end) end, - }), + }) }), }), }) end return function(props) - local mergedProps = Dictionary.merge(props, { - soundPlayer = soundPlayer.new(Settings), + return e(PluginSettings.StudioProvider, { + plugin = props.plugin, + }, { + App = PluginSettings.with(function(settings) + local settingsProps = Dictionary.merge(props, { + settings = settings, + }) + return e(App, settingsProps) + end), }) - - return e(App, mergedProps) end diff --git a/plugin/src/Assets.lua b/plugin/src/Assets.lua index c2c168ee..29e61d11 100644 --- a/plugin/src/Assets.lua +++ b/plugin/src/Assets.lua @@ -23,28 +23,10 @@ local Assets = { Icons = { Close = "rbxassetid://6012985953", Back = "rbxassetid://6017213752", - Reset = "rbxassetid://10142422327", - Expand = "rbxassetid://12045401097", - Warning = "rbxassetid://16571019891", - Debug = "rbxassetid://16588411361", - Checkmark = "rbxassetid://16571012729", - Exclamation = "rbxassetid://16571172190", - SyncSuccess = "rbxassetid://16565035221", - SyncWarning = "rbxassetid://16565325171", - }, - Diff = { - Add = "rbxassetid://10434145835", - Remove = "rbxassetid://10434408368", - Edit = "rbxassetid://10434144680", }, Checkbox = { Active = "rbxassetid://6016251644", Inactive = "rbxassetid://6016251963", - Locked = "rbxassetid://14011257320", - }, - Dropdown = { - Arrow = "rbxassetid://10131770538", - Locked = "rbxassetid://14011257320", }, Spinner = { Foreground = "rbxassetid://3222731032", @@ -60,12 +42,9 @@ local Assets = { [32] = "rbxassetid://3088713341", [64] = "rbxassetid://4918677124", [128] = "rbxassetid://2600845734", - [500] = "rbxassetid://2609138523", + [500] = "rbxassetid://2609138523" }, }, - Sounds = { - Notification = "rbxassetid://203785492", - }, StartSession = "", SessionActive = "", Configure = "", @@ -74,7 +53,7 @@ local Assets = { local function guardForTypos(name, map) strict(name, map) - for key, child in map do + for key, child in pairs(map) do if type(child) == "table" then guardForTypos(("%s.%s"):format(name, key), child) end @@ -83,4 +62,4 @@ end guardForTypos("Assets", Assets) -return Assets +return Assets \ No newline at end of file diff --git a/plugin/src/ChangeBatcher/createPatchSet.lua b/plugin/src/ChangeBatcher/createPatchSet.lua index 5502d0d6..e4c0fc0a 100644 --- a/plugin/src/ChangeBatcher/createPatchSet.lua +++ b/plugin/src/ChangeBatcher/createPatchSet.lua @@ -5,8 +5,7 @@ of instances) and return the patch. ]] -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) +local Log = require(script.Parent.Parent.Parent.Log) local PatchSet = require(script.Parent.Parent.PatchSet) @@ -15,7 +14,7 @@ local encodePatchUpdate = require(script.Parent.encodePatchUpdate) return function(instanceMap, propertyChanges) local patch = PatchSet.newEmpty() - for instance, properties in propertyChanges do + for instance, properties in pairs(propertyChanges) do local instanceId = instanceMap.fromInstances[instance] if instanceId == nil then diff --git a/plugin/src/ChangeBatcher/encodePatchUpdate.lua b/plugin/src/ChangeBatcher/encodePatchUpdate.lua index 5076fea2..a3af8069 100644 --- a/plugin/src/ChangeBatcher/encodePatchUpdate.lua +++ b/plugin/src/ChangeBatcher/encodePatchUpdate.lua @@ -1,6 +1,5 @@ -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) -local RbxDom = require(Packages.RbxDom) +local Log = require(script.Parent.Parent.Parent.Log) +local RbxDom = require(script.Parent.Parent.Parent.RbxDom) local encodeProperty = require(script.Parent.encodeProperty) @@ -10,7 +9,7 @@ return function(instance, instanceId, properties) changedProperties = {}, } - for propertyName in properties do + for propertyName in pairs(properties) do if propertyName == "Name" then update.changedName = instance.Name else diff --git a/plugin/src/ChangeBatcher/encodeProperty.lua b/plugin/src/ChangeBatcher/encodeProperty.lua index 52710e16..e6ad95a2 100644 --- a/plugin/src/ChangeBatcher/encodeProperty.lua +++ b/plugin/src/ChangeBatcher/encodeProperty.lua @@ -1,6 +1,5 @@ -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) -local RbxDom = require(Packages.RbxDom) +local Log = require(script.Parent.Parent.Parent.Log) +local RbxDom = require(script.Parent.Parent.Parent.RbxDom) return function(instance, propertyName, propertyDescriptor) local readSuccess, readResult = propertyDescriptor:read(instance) diff --git a/plugin/src/Config.lua b/plugin/src/Config.lua index 8897996a..4e77df61 100644 --- a/plugin/src/Config.lua +++ b/plugin/src/Config.lua @@ -2,26 +2,12 @@ local strict = require(script.Parent.strict) local isDevBuild = script.Parent.Parent:FindFirstChild("ROJO_DEV_BUILD") ~= nil -local Version = script.Parent.Parent.Version -local trimmedVersionValue = Version.Value:gsub("^%s+", ""):gsub("%s+$", "") -local major, minor, patch, metadata = trimmedVersionValue:match("^(%d+)%.(%d+)%.(%d+)(.*)$") - -local realVersion = { major, minor, patch, metadata } -for i = 1, 3 do - local num = tonumber(realVersion[i]) - if num then - realVersion[i] = num - else - error(("invalid version `%s` (field %d)"):format(realVersion[i], i)) - end -end - return strict("Config", { isDevBuild = isDevBuild, codename = "Epiphany", - version = realVersion, - expectedServerVersionString = ("%d.%d or newer"):format(realVersion[1], realVersion[2]), - protocolVersion = 5, + version = {7, 1, 1}, + expectedServerVersionString = "7.0 or newer", + protocolVersion = 4, defaultHost = "localhost", - defaultPort = "34872", -}) + defaultPort = 34872, +}) \ No newline at end of file diff --git a/plugin/src/DevSettings.lua b/plugin/src/DevSettings.lua new file mode 100644 index 00000000..f1458c00 --- /dev/null +++ b/plugin/src/DevSettings.lua @@ -0,0 +1,139 @@ +local Config = require(script.Parent.Config) + +local Environment = { + User = "User", + Dev = "Dev", + Test = "Test", +} + +local DEFAULT_ENVIRONMENT = Config.isDevBuild and Environment.Dev or Environment.User + +local VALUES = { + LogLevel = { + type = "IntValue", + values = { + [Environment.User] = 2, + [Environment.Dev] = 4, + [Environment.Test] = 4, + }, + }, + TypecheckingEnabled = { + type = "BoolValue", + values = { + [Environment.User] = false, + [Environment.Dev] = true, + [Environment.Test] = true, + }, + }, +} + +local CONTAINER_NAME = "RojoDevSettings" .. Config.codename + +local function getValueContainer() + return game:FindFirstChild(CONTAINER_NAME) +end + +local valueContainer = getValueContainer() + +game.ChildAdded:Connect(function(child) + local success, name = pcall(function() + return child.Name + end) + + if success and name == CONTAINER_NAME then + valueContainer = child + end +end) + +local function getStoredValue(name) + if valueContainer == nil then + return nil + end + + local valueObject = valueContainer:FindFirstChild(name) + + if valueObject == nil then + return nil + end + + return valueObject.Value +end + +local function setStoredValue(name, kind, value) + local object = valueContainer:FindFirstChild(name) + + if object == nil then + object = Instance.new(kind) + object.Name = name + object.Parent = valueContainer + end + + object.Value = value +end + +local function createAllValues(environment) + assert(Environment[environment] ~= nil, "Invalid environment") + + valueContainer = getValueContainer() + + if valueContainer == nil then + valueContainer = Instance.new("Folder") + valueContainer.Name = CONTAINER_NAME + valueContainer.Parent = game + end + + for name, value in pairs(VALUES) do + setStoredValue(name, value.type, value.values[environment]) + end +end + +local function getValue(name) + assert(VALUES[name] ~= nil, "Invalid DevSettings name") + + local stored = getStoredValue(name) + + if stored ~= nil then + return stored + end + + return VALUES[name].values[DEFAULT_ENVIRONMENT] +end + +local DevSettings = {} + +function DevSettings:createDevSettings() + createAllValues(Environment.Dev) +end + +function DevSettings:createTestSettings() + createAllValues(Environment.Test) +end + +function DevSettings:hasChangedValues() + return valueContainer ~= nil +end + +function DevSettings:resetValues() + if valueContainer then + valueContainer:Destroy() + valueContainer = nil + end +end + +function DevSettings:isEnabled() + return valueContainer ~= nil +end + +function DevSettings:getLogLevel() + return getValue("LogLevel") +end + +function DevSettings:shouldTypecheck() + return getValue("TypecheckingEnabled") +end + +function _G.ROJO_DEV_CREATE() + DevSettings:createDevSettings() +end + +return DevSettings \ No newline at end of file diff --git a/plugin/src/Dictionary.lua b/plugin/src/Dictionary.lua index 09b878a6..c4b1e532 100644 --- a/plugin/src/Dictionary.lua +++ b/plugin/src/Dictionary.lua @@ -14,7 +14,7 @@ local function merge(...) local source = select(i, ...) if source ~= nil then - for key, value in source do + for key, value in pairs(source) do if value == None then output[key] = nil else @@ -30,4 +30,4 @@ end return { None = None, merge = merge, -} +} \ No newline at end of file diff --git a/plugin/src/InstanceMap.lua b/plugin/src/InstanceMap.lua index 250f41e6..2d9cbffb 100644 --- a/plugin/src/InstanceMap.lua +++ b/plugin/src/InstanceMap.lua @@ -1,7 +1,6 @@ local RunService = game:GetService("RunService") -local Packages = script.Parent.Parent.Packages -local Log = require(Packages.Log) +local Log = require(script.Parent.Parent.Log) --[[ A bidirectional map between instance IDs and Roblox instances. It lets us @@ -63,17 +62,17 @@ function InstanceMap:__fmtDebug(output) -- Collect all of the entries in the InstanceMap and sort them by their -- label, which helps make our output deterministic. local entries = {} - for id, instance in self.fromIds do + for id, instance in pairs(self.fromIds) do local label = string.format("%s (%s)", instance:GetFullName(), instance.ClassName) - table.insert(entries, { id, label }) + table.insert(entries, {id, label}) end table.sort(entries, function(a, b) return a[2] < b[2] end) - for _, entry in entries do + for _, entry in ipairs(entries) do output:writeLine("{}: {}", entry[1], entry[2]) end @@ -112,33 +111,28 @@ end function InstanceMap:destroyInstance(instance) local id = self.fromInstances[instance] - local descendants = instance:GetDescendants() - - -- Because the user might want to Undo this change, we cannot use Destroy - -- since that locks that parent and prevents ChangeHistoryService from - -- ever bringing it back. Instead, we parent to nil. - instance.Parent = nil - - -- After the instance is successfully destroyed, - -- we can remove all the id mappings if id ~= nil then self:removeId(id) end - for _, descendantInstance in descendants do + for _, descendantInstance in ipairs(instance:GetDescendants()) do self:removeInstance(descendantInstance) end + + instance:Destroy() end function InstanceMap:destroyId(id) local instance = self.fromIds[id] + self:removeId(id) + if instance ~= nil then - self:destroyInstance(instance) - else - -- There is no instance with this id, so we can just remove the id - -- without worrying about instance destruction - self:removeId(id) + for _, descendantInstance in ipairs(instance:GetDescendants()) do + self:removeInstance(descendantInstance) + end + + instance:Destroy() end end @@ -227,7 +221,7 @@ function InstanceMap:__disconnectSignals(instance) -- around the extra table. ValueBase objects force us to use multiple -- signals to emulate the Instance.Changed event, however. if typeof(signals) == "table" then - for _, signal in signals do + for _, signal in ipairs(signals) do signal:Disconnect() end else diff --git a/plugin/src/PatchSet.lua b/plugin/src/PatchSet.lua index 3f6ece3c..d8fde747 100644 --- a/plugin/src/PatchSet.lua +++ b/plugin/src/PatchSet.lua @@ -3,47 +3,10 @@ patch returned from the API. ]] -local Packages = script.Parent.Parent.Packages -local t = require(Packages.t) +local t = require(script.Parent.Parent.t) local Types = require(script.Parent.Types) -local function deepEqual(a: any, b: any): boolean - local typeA = typeof(a) - if typeA ~= typeof(b) then - return false - end - - if typeof(a) == "table" then - local checkedKeys = {} - - for key, value in a do - checkedKeys[key] = true - - if deepEqual(value, b[key]) == false then - return false - end - end - - for key, value in b do - if checkedKeys[key] then - continue - end - if deepEqual(value, a[key]) == false then - return false - end - end - - return true - end - - if a == b then - return true - end - - return false -end - local PatchSet = {} PatchSet.validate = t.interface({ @@ -67,7 +30,9 @@ end Tells whether the given PatchSet is empty. ]] function PatchSet.isEmpty(patchSet) - return next(patchSet.removed) == nil and next(patchSet.added) == nil and next(patchSet.updated) == nil + return next(patchSet.removed) == nil and + next(patchSet.added) == nil and + next(patchSet.updated) == nil end --[[ @@ -91,174 +56,6 @@ function PatchSet.hasUpdates(patchSet) return next(patchSet.updated) ~= nil end ---[[ - Tells whether the given PatchSet contains changes to the given instance id -]] -function PatchSet.containsId(patchSet, instanceMap, id) - if patchSet.added[id] ~= nil then - return true - end - - for _, idOrInstance in patchSet.removed do - local removedId = if Types.RbxId(idOrInstance) then idOrInstance else instanceMap.fromInstances[idOrInstance] - if removedId == id then - return true - end - end - - for _, update in patchSet.updated do - if update.id == id then - return true - end - end - - return false -end - ---[[ - Tells whether the given PatchSet contains changes to the given instance. - If the given InstanceMap does not contain the instance, this function always returns false. -]] -function PatchSet.containsInstance(patchSet, instanceMap, instance) - local id = instanceMap.fromInstances[instance] - if id == nil then - return false - end - - return PatchSet.containsId(patchSet, instanceMap, id) -end - ---[[ - Tells whether the given PatchSet contains changes to nothing but the given instance id -]] -function PatchSet.containsOnlyId(patchSet, instanceMap, id) - if not PatchSet.containsId(patchSet, instanceMap, id) then - -- Patch doesn't contain the id at all - return false - end - - for addedId in patchSet.added do - if addedId ~= id then - return false - end - end - - for _, idOrInstance in patchSet.removed do - local removedId = if Types.RbxId(idOrInstance) then idOrInstance else instanceMap.fromInstances[idOrInstance] - if removedId ~= id then - return false - end - end - - for _, update in patchSet.updated do - if update.id ~= id then - return false - end - end - - return true -end - ---[[ - Tells whether the given PatchSet contains changes to nothing but the given instance. - If the given InstanceMap does not contain the instance, this function always returns false. -]] -function PatchSet.containsOnlyInstance(patchSet, instanceMap, instance) - local id = instanceMap.fromInstances[instance] - if id == nil then - return false - end - - return PatchSet.containsOnlyId(patchSet, instanceMap, id) -end - ---[[ - Returns the update to the given instance id, or nil if there aren't any -]] -function PatchSet.getUpdateForId(patchSet, id) - for _, update in patchSet.updated do - if update.id == id then - return update - end - end - - return nil -end - ---[[ - Returns the update to the given instance, or nil if there aren't any. - If the given InstanceMap does not contain the instance, this function always returns nil. -]] -function PatchSet.getUpdateForInstance(patchSet, instanceMap, instance) - local id = instanceMap.fromInstances[instance] - if id == nil then - return nil - end - - return PatchSet.getUpdateForId(patchSet, id) -end - ---[[ - Tells whether the given PatchSets are equal. -]] -function PatchSet.isEqual(patchA, patchB) - return deepEqual(patchA, patchB) -end - ---[[ - Count the number of changes in the given PatchSet. -]] -function PatchSet.countChanges(patch) - local count = 0 - - for _, add in patch.added do - -- Adding an instance is 1 change per property - for _ in add.Properties do - count += 1 - end - end - for _ in patch.removed do - -- Removing an instance is 1 change - count += 1 - end - for _, update in patch.updated do - -- Updating an instance is 1 change per property updated - for _ in update.changedProperties do - count += 1 - end - if update.changedName ~= nil then - count += 1 - end - if update.changedClassName ~= nil then - count += 1 - end - end - - return count -end - ---[[ - Count the number of instances affected by the given PatchSet. -]] -function PatchSet.countInstances(patch) - local count = 0 - - -- Added instances - for _ in patch.added do - count += 1 - end - -- Removed instances - for _ in patch.removed do - count += 1 - end - -- Updated instances - for _ in patch.updated do - count += 1 - end - - return count -end - --[[ Merge multiple PatchSet objects into the given PatchSet. ]] @@ -282,22 +79,6 @@ function PatchSet.assign(target, ...) return target end -function PatchSet.addedIdList(patchSet): { string } - local idList = table.create(#patchSet.added) - for id in patchSet.added do - table.insert(idList, id) - end - return table.freeze(idList) -end - -function PatchSet.updatedIdList(patchSet): { string } - local idList = table.create(#patchSet.updated) - for _, item in patchSet.updated do - table.insert(idList, item.id) - end - return table.freeze(idList) -end - --[[ Create a list of human-readable statements summarizing the contents of this patch, intended to be displayed to users. @@ -308,7 +89,7 @@ function PatchSet.humanSummary(instanceMap, patchSet) for _, idOrInstance in ipairs(patchSet.removed) do local instance, id - if Types.RbxId(idOrInstance) then + if type(idOrInstance) == "string" then id = idOrInstance instance = instanceMap.fromIds[id] else @@ -360,15 +141,9 @@ function PatchSet.humanSummary(instanceMap, patchSet) end end - table.insert( - statements, - string.format( - "- Add instance %q (ClassName %q) to %s", - virtualInstance.Name, - virtualInstance.ClassName, - parentDisplayName - ) - ) + table.insert(statements, string.format( + "- Add instance %q (ClassName %q) to %s", + virtualInstance.Name, virtualInstance.ClassName, parentDisplayName)) end for _, update in ipairs(patchSet.updated) do @@ -398,13 +173,12 @@ function PatchSet.humanSummary(instanceMap, patchSet) displayName = "[unknown instance]" end - table.insert( - statements, - string.format("- Update properties on %s: %s", displayName, table.concat(updatedProperties, ",")) - ) + table.insert(statements, string.format( + "- Update properties on %s: %s", + displayName, table.concat(updatedProperties, ","))) end return table.concat(statements, "\n") end -return PatchSet +return PatchSet \ No newline at end of file diff --git a/plugin/src/PatchTree.lua b/plugin/src/PatchTree.lua deleted file mode 100644 index 37deae11..00000000 --- a/plugin/src/PatchTree.lua +++ /dev/null @@ -1,538 +0,0 @@ ---[[ - Methods to turn PatchSets into trees matching the DataModel containing - the changes and metadata for use in the PatchVisualizer component. -]] - -local HttpService = game:GetService("HttpService") - -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Log = require(Packages.Log) - -local Timer = require(Plugin.Timer) -local Types = require(Plugin.Types) -local decodeValue = require(Plugin.Reconciler.decodeValue) -local getProperty = require(Plugin.Reconciler.getProperty) - -local function yieldIfNeeded(clock) - if os.clock() - clock > 1 / 20 then - task.wait() - return os.clock() - end - return clock -end - -local function alphabeticalNext(t, state) - -- Equivalent of the next function, but returns the keys in the alphabetic - -- order of node names. We use a temporary ordered key table that is stored in the - -- table being iterated. - - local key = nil - if state == nil then - -- First iteration, generate the index - local orderedIndex, i = table.create(5), 0 - for k in t do - i += 1 - orderedIndex[i] = k - end - table.sort(orderedIndex, function(a, b) - local nodeA, nodeB = t[a], t[b] - return (nodeA.name or "") < (nodeB.name or "") - end) - - t.__orderedIndex = orderedIndex - key = orderedIndex[1] - else - -- Fetch the next value - for i, orderedState in t.__orderedIndex do - if orderedState == state then - key = t.__orderedIndex[i + 1] - break - end - end - end - - if key then - return key, t[key] - end - - -- No more value to return, cleanup - t.__orderedIndex = nil - - return -end - -local function alphabeticalPairs(t) - -- Equivalent of the pairs() iterator, but sorted - return alphabeticalNext, t, nil -end - -local Tree = {} -Tree.__index = Tree - -function Tree.new() - local tree = { - idToNode = {}, - ROOT = { - className = "DataModel", - name = "ROOT", - children = {}, - }, - } - -- Add ROOT to idToNode or it won't be found by getNode since that searches *within* ROOT - tree.idToNode["ROOT"] = tree.ROOT - - return setmetatable(tree, Tree) -end - --- Iterates over all nodes and counts them up -function Tree:getCount() - local count = 0 - self:forEach(function() - count += 1 - end) - return count -end - --- Iterates over all sub-nodes, depth first --- node is where to start from, defaults to root --- depth is used for recursion but can be used to set the starting depth -function Tree:forEach(callback, node, depth) - depth = depth or 1 - for _, child in alphabeticalPairs(if node then node.children else self.ROOT.children) do - callback(child, depth) - if type(child.children) == "table" then - self:forEach(callback, child, depth + 1) - end - end -end - --- Finds a node by id, depth first --- searchNode is the node to start the search within, defaults to root -function Tree:getNode(id, searchNode) - if self.idToNode[id] then - return self.idToNode[id] - end - - local searchChildren = (searchNode or self.ROOT).children - for nodeId, node in searchChildren do - if nodeId == id then - self.idToNode[id] = node - return node - end - local descendant = self:getNode(id, node) - if descendant then - return descendant - end - end - - return nil -end - -function Tree:doesNodeExist(id) - return self.idToNode[id] ~= nil -end - --- Adds a node to the tree as a child of the node with id == parent --- If parent is nil, it defaults to root --- props must contain id, and cannot contain children or parentId --- other than those three, it can hold anything -function Tree:addNode(parent, props) - assert(props.id, "props must contain id") - - parent = parent or "ROOT" - - if self:doesNodeExist(props.id) then - -- Update existing node - local node = self:getNode(props.id) - for k, v in props do - node[k] = v - end - return node - end - - local node = table.clone(props) - node.children = {} - node.parentId = parent - - local parentNode = self:getNode(parent) - if not parentNode then - Log.warn("Failed to create node since parent doesnt exist: {}, {}", parent, props) - return - end - - parentNode.children[node.id] = node - self.idToNode[node.id] = node - - return node -end - --- Given a list of ancestor ids in descending order, builds the nodes for them --- using the patch and instanceMap info -function Tree:buildAncestryNodes(previousId: string?, ancestryIds: { string }, patch, instanceMap) - local clock = os.clock() - -- Build nodes for ancestry by going up the tree - previousId = previousId or "ROOT" - - for _, ancestorId in ancestryIds do - clock = yieldIfNeeded(clock) - - local value = instanceMap.fromIds[ancestorId] or patch.added[ancestorId] - if not value then - Log.warn("Failed to find ancestor object for " .. ancestorId) - continue - end - self:addNode(previousId, { - id = ancestorId, - className = value.ClassName, - name = value.Name, - instance = if typeof(value) == "Instance" then value else nil, - }) - previousId = ancestorId - end -end - -local PatchTree = {} - --- Builds a new tree from a patch and instanceMap --- uses changeListHeaders in node.changeList -function PatchTree.build(patch, instanceMap, changeListHeaders) - Timer.start("PatchTree.build") - local clock = os.clock() - - local tree = Tree.new() - - local knownAncestors = {} - - Timer.start("patch.updated") - for _, change in patch.updated do - clock = yieldIfNeeded(clock) - - local instance = instanceMap.fromIds[change.id] - if not instance then - continue - end - - -- Gather ancestors from existing DOM - local ancestryIds = {} - local parentObject = instance.Parent - local parentId = instanceMap.fromInstances[parentObject] - local previousId = nil - while parentObject do - if knownAncestors[parentId] then - -- We've already added this ancestor - previousId = parentId - break - end - - table.insert(ancestryIds, 1, parentId) - knownAncestors[parentId] = true - parentObject = parentObject.Parent - parentId = instanceMap.fromInstances[parentObject] - end - - tree:buildAncestryNodes(previousId, ancestryIds, patch, instanceMap) - - -- Gather detail text - local changeList, changeInfo = nil, nil - if next(change.changedProperties) or change.changedName then - changeList = {} - - local changeIndex = 0 - local function addProp(prop: string, current: any?, incoming: any?, metadata: any?) - changeIndex += 1 - changeList[changeIndex] = { prop, current, incoming, metadata } - end - - -- Gather the changes - - if change.changedName then - addProp("Name", instance.Name, change.changedName) - end - - for prop, incoming in change.changedProperties do - local incomingSuccess, incomingValue = decodeValue(incoming, instanceMap) - local currentSuccess, currentValue = getProperty(instance, prop) - - addProp( - prop, - if currentSuccess then currentValue else "[Error]", - if incomingSuccess then incomingValue else select(2, next(incoming)) - ) - end - - changeInfo = { - edits = changeIndex, - } - - -- Sort changes and add header - table.sort(changeList, function(a, b) - return a[1] < b[1] - end) - table.insert(changeList, 1, changeListHeaders) - end - - -- Add this node to tree - tree:addNode(instanceMap.fromInstances[instance.Parent], { - id = change.id, - patchType = "Edit", - className = instance.ClassName, - name = instance.Name, - instance = instance, - changeInfo = changeInfo, - changeList = changeList, - }) - end - Timer.stop() - - Timer.start("patch.removed") - for _, idOrInstance in patch.removed do - clock = yieldIfNeeded(clock) - - local instance = if Types.RbxId(idOrInstance) then instanceMap.fromIds[idOrInstance] else idOrInstance - if not instance then - -- If we're viewing a past patch, the instance is already removed - -- and we therefore cannot get the tree for it anymore - continue - end - - -- Gather ancestors from existing DOM - -- (note that they may have no ID if they're being removed as unknown) - local ancestryIds = {} - local parentObject = instance.Parent - local parentId = instanceMap.fromInstances[parentObject] or HttpService:GenerateGUID(false) - local previousId = nil - while parentObject do - if knownAncestors[parentId] then - -- We've already added this ancestor - previousId = parentId - break - end - - instanceMap:insert(parentId, parentObject) -- This ensures we can find the parent later - table.insert(ancestryIds, 1, parentId) - knownAncestors[parentId] = true - parentObject = parentObject.Parent - parentId = instanceMap.fromInstances[parentObject] or HttpService:GenerateGUID(false) - end - - tree:buildAncestryNodes(previousId, ancestryIds, patch, instanceMap) - - -- Add this node to tree - local nodeId = instanceMap.fromInstances[instance] or HttpService:GenerateGUID(false) - instanceMap:insert(nodeId, instance) - tree:addNode(instanceMap.fromInstances[instance.Parent], { - id = nodeId, - patchType = "Remove", - className = instance.ClassName, - name = instance.Name, - instance = instance, - }) - end - Timer.stop() - - Timer.start("patch.added") - for id, change in patch.added do - clock = yieldIfNeeded(clock) - - -- Gather ancestors from existing DOM or future additions - local ancestryIds = {} - local parentId = change.Parent - local parentData = patch.added[parentId] - local parentObject = instanceMap.fromIds[parentId] - local previousId = nil - while parentId do - if knownAncestors[parentId] then - -- We've already added this ancestor - previousId = parentId - break - end - - table.insert(ancestryIds, 1, parentId) - knownAncestors[parentId] = true - parentId = nil - - if parentData then - -- object is parented to an instance that does not exist yet - parentId = parentData.Parent - parentData = patch.added[parentId] - parentObject = instanceMap.fromIds[parentId] - elseif parentObject then - -- object is parented to an instance that exists - parentObject = parentObject.Parent - parentId = instanceMap.fromInstances[parentObject] - parentData = patch.added[parentId] - end - end - - tree:buildAncestryNodes(previousId, ancestryIds, patch, instanceMap) - - -- Gather detail text - local changeList, changeInfo = nil, nil - if next(change.Properties) then - changeList = {} - - local changeIndex = 0 - local function addProp(prop: string, incoming: any) - changeIndex += 1 - changeList[changeIndex] = { prop, "N/A", incoming } - end - - for prop, incoming in change.Properties do - local success, incomingValue = decodeValue(incoming, instanceMap) - addProp(prop, if success then incomingValue else select(2, next(incoming))) - end - - changeInfo = { - edits = changeIndex, - } - - -- Sort changes and add header - table.sort(changeList, function(a, b) - return a[1] < b[1] - end) - table.insert(changeList, 1, changeListHeaders) - end - - -- Add this node to tree - tree:addNode(change.Parent, { - id = change.Id, - patchType = "Add", - className = change.ClassName, - name = change.Name, - changeInfo = changeInfo, - changeList = changeList, - instance = instanceMap.fromIds[id], - }) - end - Timer.stop() - - Timer.stop() - return tree -end - --- Updates the metadata of a tree with the unapplied patch and currently existing instances --- Builds a new tree from the data if one isn't provided --- Always returns a new tree for immutability purposes in Roact -function PatchTree.updateMetadata(tree, patch, instanceMap, unappliedPatch) - Timer.start("PatchTree.updateMetadata") - if tree then - -- A shallow copy is enough for our purposes here since we really only need a new top-level object - -- for immutable comparison checks in Roact - tree = table.clone(tree) - else - tree = PatchTree.build(patch, instanceMap) - end - - -- Update isWarning metadata - Timer.start("isWarning") - for _, failedChange in unappliedPatch.updated do - local node = tree:getNode(failedChange.id) - if not node then - continue - end - - node.isWarning = true - Log.trace("Marked node as warning: {} {}", node.id, node.name) - - if not node.changeList then - continue - end - - local warnings = 0 - for _, change in node.changeList do - local property = change[1] - local propertyFailedToApply = if property == "Name" - then failedChange.changedName ~= nil -- Name is not in changedProperties, so it needs a special case - else failedChange.changedProperties[property] ~= nil - - if not propertyFailedToApply then - -- This change didn't fail, no need to mark - continue - end - - warnings += 1 - if change[4] == nil then - change[4] = { isWarning = true } - else - change[4].isWarning = true - end - Log.trace(" Marked property as warning: {}.{}", node.name, property) - end - - node.changeInfo = { - edits = (node.changeInfo.edits or (#node.changeList - 1)) - warnings, - failed = if warnings > 0 then warnings else nil, - } - end - for failedAdditionId in unappliedPatch.added do - local node = tree:getNode(failedAdditionId) - if not node then - continue - end - - node.isWarning = true - Log.trace("Marked node as warning: {} {}", node.id, node.name) - - if not node.changeList then - continue - end - - for _, change in node.changeList do - -- Failed addition means that all properties failed to be added - if change[4] == nil then - change[4] = { isWarning = true } - else - change[4].isWarning = true - end - Log.trace(" Marked property as warning: {}.{}", node.name, change[1]) - end - - node.changeInfo = { - failed = node.changeInfo.edits or (#node.changeList - 1), - } - end - for _, failedRemovalIdOrInstance in unappliedPatch.removed do - local failedRemovalId = if Types.RbxId(failedRemovalIdOrInstance) - then failedRemovalIdOrInstance - else instanceMap.fromInstances[failedRemovalIdOrInstance] - if not failedRemovalId then - continue - end - - local node = tree:getNode(failedRemovalId) - if not node then - continue - end - - node.isWarning = true - Log.trace("Marked node as warning: {} {}", node.id, node.name) - end - Timer.stop() - - -- Update if instances exist - Timer.start("instanceAncestry") - tree:forEach(function(node) - if node.instance then - if node.instance.Parent == nil and node.instance ~= game then - -- This instance has been removed - Log.trace("Removed instance from node: {} {}", node.id, node.name) - node.instance = nil - end - else - -- This instance may have been added - node.instance = instanceMap.fromIds[node.id] - if node.instance then - Log.trace("Added instance to node: {} {}", node.id, node.name) - end - end - end) - Timer.stop() - - Timer.stop() - return tree -end - -return PatchTree diff --git a/plugin/src/Reconciler/Error.lua b/plugin/src/Reconciler/Error.lua index 1e65c854..5833420a 100644 --- a/plugin/src/Reconciler/Error.lua +++ b/plugin/src/Reconciler/Error.lua @@ -2,8 +2,7 @@ Defines the errors that can be returned by the reconciler. ]] -local Packages = script.Parent.Parent.Parent.Packages -local Fmt = require(Packages.Fmt) +local Fmt = require(script.Parent.Parent.Parent.Fmt) local Error = {} @@ -35,4 +34,4 @@ function Error:__tostring() return Fmt.fmt("Error({}): {:#?}", self.kind, self.details) end -return Error +return Error \ No newline at end of file diff --git a/plugin/src/Reconciler/applyPatch.lua b/plugin/src/Reconciler/applyPatch.lua index 8da223d1..4ecf3e1f 100644 --- a/plugin/src/Reconciler/applyPatch.lua +++ b/plugin/src/Reconciler/applyPatch.lua @@ -5,8 +5,7 @@ Patches can come from the server or be generated by the client. ]] -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) +local Log = require(script.Parent.Parent.Parent.Log) local PatchSet = require(script.Parent.Parent.PatchSet) local Types = require(script.Parent.Parent.Types) @@ -14,28 +13,17 @@ local invariant = require(script.Parent.Parent.invariant) local decodeValue = require(script.Parent.decodeValue) local reify = require(script.Parent.reify) -local reifyInstance, applyDeferredRefs = reify.reifyInstance, reify.applyDeferredRefs local setProperty = require(script.Parent.setProperty) local function applyPatch(instanceMap, patch) -- Tracks any portions of the patch that could not be applied to the DOM. local unappliedPatch = PatchSet.newEmpty() - -- Contains a list of all of the ref properties that we'll need to assign. - -- It is imperative that refs are assigned after all instances are created - -- to ensure that referents can be mapped to instances correctly. - local deferredRefs = {} - for _, removedIdOrInstance in ipairs(patch.removed) do - local removeInstanceSuccess = pcall(function() - if Types.RbxId(removedIdOrInstance) then - instanceMap:destroyId(removedIdOrInstance) - else - instanceMap:destroyInstance(removedIdOrInstance) - end - end) - if not removeInstanceSuccess then - table.insert(unappliedPatch.removed, removedIdOrInstance) + if Types.RbxId(removedIdOrInstance) then + instanceMap:destroyId(removedIdOrInstance) + else + instanceMap:destroyInstance(removedIdOrInstance) end end @@ -72,7 +60,7 @@ local function applyPatch(instanceMap, patch) ) end - local failedToReify = reifyInstance(deferredRefs, instanceMap, patch.added, id, parentInstance) + local failedToReify = reify(instanceMap, patch.added, id, parentInstance) if not PatchSet.isEmpty(failedToReify) then Log.debug("Failed to reify as part of applying a patch: {:#?}", failedToReify) @@ -137,7 +125,7 @@ local function applyPatch(instanceMap, patch) [update.id] = mockVirtualInstance, } - local failedToReify = reifyInstance(deferredRefs, instanceMap, mockAdded, update.id, instance.Parent) + local failedToReify = reify(instanceMap, mockAdded, update.id, instance.Parent) local newInstance = instanceMap.fromIds[update.id] @@ -166,14 +154,10 @@ local function applyPatch(instanceMap, patch) end -- See you later, original instance. - - -- Because the user might want to Undo this change, we cannot use Destroy - -- since that locks that parent and prevents ChangeHistoryService from - -- ever bringing it back. Instead, we parent to nil. - + -- -- TODO: Can this fail? Some kinds of instance may not appreciate - -- being reparented, like services. - instance.Parent = nil + -- being destroyed, like services. + instance:Destroy() -- This completes your rebuilding a plane mid-flight safety -- instruction. Please sit back, relax, and enjoy your flight. @@ -181,13 +165,7 @@ local function applyPatch(instanceMap, patch) end if update.changedName ~= nil then - local setNameSuccess = pcall(function() - instance.Name = update.changedName - end) - if not setNameSuccess then - unappliedUpdate.changedName = update.changedName - partiallyApplied = true - end + instance.Name = update.changedName end if update.changedMetadata ~= nil then @@ -200,27 +178,15 @@ local function applyPatch(instanceMap, patch) if update.changedProperties ~= nil then for propertyName, propertyValue in pairs(update.changedProperties) do - -- Because refs may refer to instances that we haven't constructed yet, - -- we defer applying any ref properties until all instances are created. - if next(propertyValue) == "Ref" then - table.insert(deferredRefs, { - id = update.id, - instance = instance, - propertyName = propertyName, - virtualValue = propertyValue, - }) - continue - end - - local decodeSuccess, decodedValue = decodeValue(propertyValue, instanceMap) - if not decodeSuccess then + local ok, decodedValue = decodeValue(propertyValue, instanceMap) + if not ok then unappliedUpdate.changedProperties[propertyName] = propertyValue partiallyApplied = true continue end - local setPropertySuccess = setProperty(instance, propertyName, decodedValue) - if not setPropertySuccess then + local ok = setProperty(instance, propertyName, decodedValue) + if not ok then unappliedUpdate.changedProperties[propertyName] = propertyValue partiallyApplied = true end @@ -232,8 +198,6 @@ local function applyPatch(instanceMap, patch) end end - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) - return unappliedPatch end diff --git a/plugin/src/Reconciler/applyPatch.spec.lua b/plugin/src/Reconciler/applyPatch.spec.lua index b44e3eda..2432359f 100644 --- a/plugin/src/Reconciler/applyPatch.spec.lua +++ b/plugin/src/Reconciler/applyPatch.spec.lua @@ -4,41 +4,25 @@ return function() local InstanceMap = require(script.Parent.Parent.InstanceMap) local PatchSet = require(script.Parent.Parent.PatchSet) - local container = Instance.new("Folder") - - local tempContainer = Instance.new("Folder") - local function wasRemoved(instance) + local dummy = Instance.new("Folder") + local function wasDestroyed(instance) -- If an instance was destroyed, its parent property is locked. - -- If an instance was removed, its parent property is nil. - -- We need to ensure we only remove, so that ChangeHistoryService can still Undo. - - local isParentUnlocked = pcall(function() + local ok = pcall(function() local oldParent = instance.Parent - instance.Parent = tempContainer + instance.Parent = dummy instance.Parent = oldParent end) - return instance.Parent == nil and isParentUnlocked + return not ok end - beforeEach(function() - container:ClearAllChildren() - end) - - afterAll(function() - container:Destroy() - tempContainer:Destroy() - end) - it("should return an empty patch if given an empty patch", function() local patch = applyPatch(InstanceMap.new(), PatchSet.newEmpty()) assert(PatchSet.isEmpty(patch), "expected remaining patch to be empty") end) - it("should remove instances listed for remove", function() + it("should destroy instances listed for remove", function() local root = Instance.new("Folder") - root.Name = "ROOT" - root.Parent = container local child = Instance.new("Folder") child.Name = "Child" @@ -54,16 +38,14 @@ return function() local unapplied = applyPatch(instanceMap, patch) assert(PatchSet.isEmpty(unapplied), "expected remaining patch to be empty") - assert(not wasRemoved(root), "expected root to be left alone") - assert(wasRemoved(child), "expected child to be removed") + assert(not wasDestroyed(root), "expected root to be left alone") + assert(wasDestroyed(child), "expected child to be destroyed") instanceMap:stop() end) - it("should remove IDs listed for remove", function() + it("should destroy IDs listed for remove", function() local root = Instance.new("Folder") - root.Name = "ROOT" - root.Parent = container local child = Instance.new("Folder") child.Name = "Child" @@ -80,8 +62,8 @@ return function() assert(PatchSet.isEmpty(unapplied), "expected remaining patch to be empty") expect(instanceMap:size()).to.equal(1) - assert(not wasRemoved(root), "expected root to be left alone") - assert(wasRemoved(child), "expected child to be removed") + assert(not wasDestroyed(root), "expected root to be left alone") + assert(wasDestroyed(child), "expected child to be destroyed") instanceMap:stop() end) @@ -91,8 +73,6 @@ return function() -- tests on reify, not here. local root = Instance.new("Folder") - root.Name = "ROOT" - root.Parent = container local instanceMap = InstanceMap.new() instanceMap:insert("ROOT", root) @@ -103,11 +83,11 @@ return function() ClassName = "Model", Name = "Child", Parent = "ROOT", - Children = { "GRANDCHILD" }, + Children = {"GRANDCHILD"}, Properties = {}, } - patch.added["GRANDCHILD"] = { + patch.added["GRANDCHILD"] = { Id = "GRANDCHILD", ClassName = "Part", Name = "Grandchild", @@ -133,8 +113,6 @@ return function() it("should return unapplied additions when instances cannot be created", function() local root = Instance.new("Folder") - root.Name = "ROOT" - root.Parent = container local instanceMap = InstanceMap.new() instanceMap:insert("ROOT", root) @@ -181,7 +159,6 @@ return function() it("should recreate instances when changedClassName is set, preserving children", function() local root = Instance.new("Folder") root.Name = "Initial Root Name" - root.Parent = container local child = Instance.new("Folder") child.Name = "Child" @@ -216,4 +193,4 @@ return function() assert(newChild ~= nil, "expected child to be present") assert(newChild == child, "expected child to be preserved") end) -end +end \ No newline at end of file diff --git a/plugin/src/Reconciler/countMatchingProperties.lua b/plugin/src/Reconciler/countMatchingProperties.lua deleted file mode 100644 index 0ddfdcc3..00000000 --- a/plugin/src/Reconciler/countMatchingProperties.lua +++ /dev/null @@ -1,44 +0,0 @@ ---[[ - Counts how many of a virtual instance's properties match the live values on a - candidate Roblox instance. `hydrate` uses this to break ties when several - existing children share the same Name and ClassName. - - This mirrors the read -> decode -> compare flow that `diff` uses, reusing the - same `getProperty`, `decodeValue`, and `trueEquals` helpers. -]] - -local getProperty = require(script.Parent.getProperty) -local decodeValue = require(script.Parent.decodeValue) -local trueEquals = require(script.Parent.trueEquals) - -local function countMatchingProperties(instance, virtualInstance, instanceMap) - local score = 0 - - for propertyName, virtualValue in virtualInstance.Properties do - -- Skip refs. During hydration the instanceMap is still being built - -- top-down, so a ref may point at an instance we haven't hydrated yet - -- and therefore can't decode reliably. Refs are also a poor - -- disambiguator between same-named siblings. - if next(virtualValue) == "Ref" then - continue - end - - local getSuccess, existingValue = getProperty(instance, propertyName) - if not getSuccess then - continue - end - - local decodeSuccess, decodedValue = decodeValue(virtualValue, instanceMap) - if not decodeSuccess then - continue - end - - if trueEquals(existingValue, decodedValue) then - score += 1 - end - end - - return score -end - -return countMatchingProperties diff --git a/plugin/src/Reconciler/countMatchingProperties.spec.lua b/plugin/src/Reconciler/countMatchingProperties.spec.lua deleted file mode 100644 index 3d6bb18d..00000000 --- a/plugin/src/Reconciler/countMatchingProperties.spec.lua +++ /dev/null @@ -1,91 +0,0 @@ -return function() - local countMatchingProperties = require(script.Parent.countMatchingProperties) - - local InstanceMap = require(script.Parent.Parent.InstanceMap) - - it("counts properties whose values match the instance", function() - local instance = Instance.new("StringValue") - instance.Value = "hello" - - local virtualInstance = { - ClassName = "StringValue", - Name = "Value", - Properties = { - Value = { String = "hello" }, - }, - Children = {}, - } - - expect(countMatchingProperties(instance, virtualInstance, InstanceMap.new())).to.equal(1) - end) - - it("does not count properties whose values differ", function() - local instance = Instance.new("StringValue") - instance.Value = "hello" - - local virtualInstance = { - ClassName = "StringValue", - Name = "Value", - Properties = { - Value = { String = "different" }, - }, - Children = {}, - } - - expect(countMatchingProperties(instance, virtualInstance, InstanceMap.new())).to.equal(0) - end) - - it("counts multiple matching properties independently", function() - local instance = Instance.new("Part") - instance.Anchored = true - instance.CanCollide = false - - local virtualInstance = { - ClassName = "Part", - Name = "Part", - Properties = { - Anchored = { Bool = true }, - CanCollide = { Bool = false }, - }, - Children = {}, - } - - expect(countMatchingProperties(instance, virtualInstance, InstanceMap.new())).to.equal(2) - - -- Flip one so only a single property matches. - instance.CanCollide = true - expect(countMatchingProperties(instance, virtualInstance, InstanceMap.new())).to.equal(1) - end) - - it("skips unknown properties without counting or erroring", function() - local instance = Instance.new("Folder") - - local virtualInstance = { - ClassName = "Folder", - Name = "Folder", - Properties = { - FAKE_PROPERTY = { String = "nope" }, - }, - Children = {}, - } - - expect(countMatchingProperties(instance, virtualInstance, InstanceMap.new())).to.equal(0) - end) - - it("skips Ref properties without counting or erroring", function() - local instance = Instance.new("ObjectValue") - - local virtualInstance = { - ClassName = "ObjectValue", - Name = "ObjectValue", - Properties = { - -- A ref must be skipped rather than decoded: during hydration - -- the target may not be in the map yet. - Value = { Ref = "00000000000000000000000000000000" }, - }, - Children = {}, - } - - expect(countMatchingProperties(instance, virtualInstance, InstanceMap.new())).to.equal(0) - end) -end diff --git a/plugin/src/Reconciler/decodeValue.lua b/plugin/src/Reconciler/decodeValue.lua index 9a171761..0fe7bf59 100644 --- a/plugin/src/Reconciler/decodeValue.lua +++ b/plugin/src/Reconciler/decodeValue.lua @@ -3,8 +3,7 @@ usable by Rojo's reconciler, potentially using RbxDom. ]] -local Packages = script.Parent.Parent.Parent.Packages -local RbxDom = require(Packages.RbxDom) +local RbxDom = require(script.Parent.Parent.Parent.RbxDom) local Error = require(script.Parent.Error) local function decodeValue(encodedValue, instanceMap) @@ -27,17 +26,16 @@ local function decodeValue(encodedValue, instanceMap) end end - local decodeSuccess, decodedValue = RbxDom.EncodedValue.decode(encodedValue) + local ok, decodedValue = RbxDom.EncodedValue.decode(encodedValue) - if not decodeSuccess then - return false, - Error.new(Error.CannotDecodeValue, { - encodedValue = encodedValue, - innerError = decodedValue, - }) + if not ok then + return false, Error.new(Error.CannotDecodeValue, { + encodedValue = encodedValue, + innerError = decodedValue, + }) end return true, decodedValue end -return decodeValue +return decodeValue \ No newline at end of file diff --git a/plugin/src/Reconciler/diff.lua b/plugin/src/Reconciler/diff.lua index 73d41236..e4cb7d88 100644 --- a/plugin/src/Reconciler/diff.lua +++ b/plugin/src/Reconciler/diff.lua @@ -3,14 +3,11 @@ patch that can be later applied. ]] -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) - +local Log = require(script.Parent.Parent.Parent.Log) local invariant = require(script.Parent.Parent.invariant) local getProperty = require(script.Parent.getProperty) local Error = require(script.Parent.Error) local decodeValue = require(script.Parent.decodeValue) -local trueEquals = require(script.Parent.trueEquals) local function isEmpty(table) return next(table) == nil @@ -67,41 +64,18 @@ local function diff(instanceMap, virtualInstances, rootId) local changedProperties = {} for propertyName, virtualValue in pairs(virtualInstance.Properties) do - local getProperySuccess, existingValueOrErr = getProperty(instance, propertyName) + local ok, existingValueOrErr = getProperty(instance, propertyName) - if getProperySuccess then + if ok then local existingValue = existingValueOrErr - local decodeSuccess, decodedValue + local ok, decodedValue = decodeValue(virtualValue, instanceMap) - -- If `virtualValue` is a ref then instead of decoding it to an instance, - -- we change `existingValue` to be a ref. This is because `virtualValue` - -- may point to an Instance which doesn't exist yet and therefore - -- decoding it may throw an error. - if next(virtualValue) == "Ref" then - decodeSuccess, decodedValue = true, virtualValue - - if existingValue and typeof(existingValue) == "Instance" then - local existingValueRef = instanceMap.fromInstances[existingValue] - if existingValueRef then - existingValue = { Ref = existingValueRef } - end - end - else - decodeSuccess, decodedValue = decodeValue(virtualValue, instanceMap) - end - - if decodeSuccess then - if not trueEquals(existingValue, decodedValue) then - Log.debug( - "{}.{} changed from '{}' to '{}'", - instance:GetFullName(), - propertyName, - existingValue, - decodedValue - ) + if ok then + if existingValue ~= decodedValue then changedProperties[propertyName] = virtualValue end else + local propertyType = next(virtualValue) Log.warn( "Failed to decode property {}.{}. Encoded property was: {:#?}", virtualInstance.ClassName, @@ -114,8 +88,10 @@ local function diff(instanceMap, virtualInstances, rootId) if err.kind == Error.UnknownProperty then Log.trace("Skipping unknown property {}.{}", err.details.className, err.details.propertyName) - else + elseif err.kind == Error.UnreadableProperty then Log.trace("Skipping unreadable property {}.{}", err.details.className, err.details.propertyName) + else + return false, err end end end @@ -137,16 +113,6 @@ local function diff(instanceMap, virtualInstances, rootId) local childId = instanceMap.fromInstances[childInstance] if childId == nil then - -- pcall to avoid security permission errors - local success, skip = pcall(function() - -- We don't remove instances that aren't going to be saved anyway, - -- such as the Rojo session lock value. - return childInstance.Archivable == false - end) - if success and skip then - continue - end - -- This is an existing instance not present in the virtual DOM. -- We can mark it for deletion unless the user has asked us not -- to delete unknown stuff. @@ -154,9 +120,9 @@ local function diff(instanceMap, virtualInstances, rootId) table.insert(patch.removed, childInstance) end else - local diffSuccess, err = diffInternal(childId) + local ok, err = diffInternal(childId) - if not diffSuccess then + if not ok then return false, err end end @@ -177,13 +143,13 @@ local function diff(instanceMap, virtualInstances, rootId) return true end - local diffSuccess, err = diffInternal(rootId) + local ok, err = diffInternal(rootId) - if not diffSuccess then + if not ok then return false, err end return true, patch end -return diff +return diff \ No newline at end of file diff --git a/plugin/src/Reconciler/diff.spec.lua b/plugin/src/Reconciler/diff.spec.lua index 69279ef5..7618eea9 100644 --- a/plugin/src/Reconciler/diff.spec.lua +++ b/plugin/src/Reconciler/diff.spec.lua @@ -1,6 +1,5 @@ return function() - local Packages = script.Parent.Parent.Parent.Packages - local Log = require(Packages.Log) + local Log = require(script.Parent.Parent.Parent.Log) local InstanceMap = require(script.Parent.Parent.InstanceMap) local PatchSet = require(script.Parent.Parent.PatchSet) @@ -14,7 +13,7 @@ return function() local function size(dict) local len = 0 - for _ in dict do + for _ in pairs(dict) do len = len + 1 end @@ -264,7 +263,7 @@ return function() ClassName = "Folder", Name = "Folder", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -287,4 +286,4 @@ return function() expect(size(patch.added)).to.equal(1) expect(patch.added["CHILD"]).to.equal(virtualInstances["CHILD"]) end) -end +end \ No newline at end of file diff --git a/plugin/src/Reconciler/getProperty.lua b/plugin/src/Reconciler/getProperty.lua index 3b8b5b92..cd5c11f3 100644 --- a/plugin/src/Reconciler/getProperty.lua +++ b/plugin/src/Reconciler/getProperty.lua @@ -2,8 +2,7 @@ Attempts to read a property from the given instance. ]] -local Packages = script.Parent.Parent.Parent.Packages -local RbxDom = require(Packages.RbxDom) +local RbxDom = require(script.Parent.Parent.Parent.RbxDom) local Error = require(script.Parent.Error) local function getProperty(instance, propertyName) @@ -14,19 +13,17 @@ local function getProperty(instance, propertyName) -- A good example of a property like this is `Model.ModelInPrimary`, which -- is serialized but not reflected to Lua. if descriptor == nil then - return false, - Error.new(Error.UnknownProperty, { - className = instance.ClassName, - propertyName = propertyName, - }) + return false, Error.new(Error.UnknownProperty, { + className = instance.ClassName, + propertyName = propertyName, + }) end if descriptor.scriptability == "None" or descriptor.scriptability == "Write" then - return false, - Error.new(Error.UnreadableProperty, { - className = instance.ClassName, - propertyName = propertyName, - }) + return false, Error.new(Error.UnreadableProperty, { + className = instance.ClassName, + propertyName = propertyName, + }) end local success, valueOrErr = descriptor:read(instance) @@ -37,29 +34,26 @@ local function getProperty(instance, propertyName) -- If we don't have permission to read a property, we can chalk that up -- to our database being out of date and the engine being right. if err.kind == RbxDom.Error.Kind.Roblox and err.extra:find("lacking permission") then - return false, - Error.new(Error.LackingPropertyPermissions, { - className = instance.ClassName, - propertyName = propertyName, - }) - end - - if err.kind == RbxDom.Error.Kind.Roblox and err.extra:find("is not a valid member of") then - return false, - Error.new(Error.UnknownProperty, { - className = instance.ClassName, - propertyName = propertyName, - }) - end - - return false, - Error.new(Error.OtherPropertyError, { + return false, Error.new(Error.LackingPropertyPermissions, { className = instance.ClassName, propertyName = propertyName, }) + end + + if err.kind == RbxDom.Error.Kind.Roblox and err.extra:find("is not a valid member of") then + return false, Error.new(Error.UnknownProperty, { + className = instance.ClassName, + propertyName = propertyName, + }) + end + + return false, Error.new(Error.OtherPropertyError, { + className = instance.ClassName, + propertyName = propertyName, + }) end return true, valueOrErr end -return getProperty +return getProperty \ No newline at end of file diff --git a/plugin/src/Reconciler/hydrate.lua b/plugin/src/Reconciler/hydrate.lua index fdd6c4a2..4d677f57 100644 --- a/plugin/src/Reconciler/hydrate.lua +++ b/plugin/src/Reconciler/hydrate.lua @@ -3,22 +3,9 @@ concrete instances and assigning them IDs. ]] -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) - local invariant = require(script.Parent.Parent.invariant) -local countMatchingProperties = require(script.Parent.countMatchingProperties) --- When several existing children share a Name and ClassName we disambiguate --- them by scoring how well each one's properties match the virtual instance. --- That scoring is far more expensive than a Name/ClassName check, so we only do --- it for reasonably-sized groups. Larger groups (e.g. a folder with thousands of --- identically-named parts) fall back to the original order-based matching, which --- bounds the added work to roughly MAX_CANDIDATES_TO_SCORE^2 property reads per --- group regardless of how large the group is. -local MAX_CANDIDATES_TO_SCORE = 32 - -local function hydrateInner(stats, instanceMap, virtualInstances, rootId, rootInstance) +local function hydrate(instanceMap, virtualInstances, rootId, rootInstance) local virtualInstance = virtualInstances[rootId] if virtualInstance == nil then @@ -26,163 +13,38 @@ local function hydrateInner(stats, instanceMap, virtualInstances, rootId, rootIn end instanceMap:insert(rootId, rootInstance) - stats.hydrated += 1 local existingChildren = rootInstance:GetChildren() - -- Group existing children by Name then ClassName so each virtual child can - -- find its candidate matches without scanning every sibling. This is what - -- keeps hydration fast for parents with thousands of children. Nesting the - -- two tables (rather than a combined key) keeps the Name and ClassName checks - -- exact, with no way for one to bleed into the other. - local buckets = {} - for _, childInstance in existingChildren do - -- We guard accessing Name and ClassName in order to avoid tripping over - -- children of DataModel that Rojo won't have permissions to access at all. - local accessSuccess, name, className = pcall(function() - return childInstance.Name, childInstance.ClassName - end) - if not accessSuccess then - continue - end - - local bucketsByClassName = buckets[name] - if bucketsByClassName == nil then - bucketsByClassName = {} - buckets[name] = bucketsByClassName - end - - local bucket = bucketsByClassName[className] - if bucket == nil then - bucket = { cursor = 1, instances = {} } - bucketsByClassName[className] = bucket - end - - table.insert(bucket.instances, childInstance) + -- For each existing child, we'll track whether it's been paired with an + -- instance that the Rojo server knows about. + local isExistingChildVisited = {} + for i = 1, #existingChildren do + isExistingChildVisited[i] = false end - -- Tracks which existing children have already been paired, so one instance - -- isn't matched to two different virtual instances. - local visited = {} - for _, childId in ipairs(virtualInstance.Children) do local virtualChild = virtualInstances[childId] - local bucketsByClassName = buckets[virtualChild.Name] - local bucket = bucketsByClassName and bucketsByClassName[virtualChild.ClassName] - if bucket == nil then - -- No existing instance matches; diff will mark this id for creation. - Log.trace( - "hydrate: no existing instance matches {} ({}) for id {}", - virtualChild.Name, - virtualChild.ClassName, - childId - ) - continue - end + for childIndex, childInstance in ipairs(existingChildren) do + if not isExistingChildVisited[childIndex] then + -- We guard accessing Name and ClassName in order to avoid + -- tripping over children of DataModel that Rojo won't have + -- permissions to access at all. + local ok, name, className = pcall(function() + return childInstance.Name, childInstance.ClassName + end) - local instances = bucket.instances - - -- Advance past any leading children that have already been paired. The - -- cursor makes order-based matching amortized O(1) per child even for - -- very large groups, rather than rescanning the visited prefix. - while bucket.cursor <= #instances and visited[instances[bucket.cursor]] do - bucket.cursor += 1 - end - if bucket.cursor > #instances then - -- Every matching instance has already been paired with an earlier id. - Log.trace( - "hydrate: no unpaired instance left for {} ({}) for id {}", - virtualChild.Name, - virtualChild.ClassName, - childId - ) - continue - end - - -- The cursor points at the earliest unvisited child, so the slots from - -- here to the end bound how many candidates remain. Visited children - -- after the cursor (gaps) only appear once a group is small enough to be - -- scored -- the order-based path below always takes the earliest, which - -- keeps the visited region a contiguous prefix. So whenever this count - -- exceeds the cap it is exact, and we can pick the earliest match without - -- collecting anything. - local remaining = #instances - bucket.cursor + 1 - - local match - if remaining > MAX_CANDIDATES_TO_SCORE then - -- Too many to score affordably; take the earliest in child order, - -- reproducing the original Name + ClassName behavior. - match = instances[bucket.cursor] - Log.trace( - "hydrate: {} candidates named {} ({}) exceeds the scoring cap of {}; matching id {} by child order", - remaining, - virtualChild.Name, - virtualChild.ClassName, - MAX_CANDIDATES_TO_SCORE, - childId - ) - else - -- Collect the (at most `remaining`) unvisited candidates. - local candidates = {} - for index = bucket.cursor, #instances do - local childInstance = instances[index] - if not visited[childInstance] then - table.insert(candidates, childInstance) + -- This rule is very conservative and could be loosened in the + -- future, or more heuristics could be introduced. + if ok and name == virtualChild.Name and className == virtualChild.ClassName then + isExistingChildVisited[childIndex] = true + hydrate(instanceMap, virtualInstances, childId, childInstance) + break end end - - if #candidates == 1 then - -- Only one candidate, so there's nothing to disambiguate. - match = candidates[1] - else - -- Break the tie by choosing the candidate whose properties best - -- match the virtual instance, falling back to the earliest in - -- child order when scores are equal. - local bestScore = -1 - for _, childInstance in candidates do - local score = countMatchingProperties(childInstance, virtualChild, instanceMap) - if score > bestScore then - bestScore = score - match = childInstance - end - end - - stats.ambiguousGroups += 1 - stats.candidatesScored += #candidates - Log.trace( - "hydrate: disambiguated {} candidates named {} ({}) for id {} by property match (best score {})", - #candidates, - virtualChild.Name, - virtualChild.ClassName, - childId, - bestScore - ) - end end - - visited[match] = true - hydrateInner(stats, instanceMap, virtualInstances, childId, match) end end -local function hydrate(instanceMap, virtualInstances, rootId, rootInstance) - -- Tallies of the work hydration did, surfaced in a single debug log below so - -- the cost of property-based disambiguation is visible without per-node spam. - local stats = { - hydrated = 0, - ambiguousGroups = 0, - candidatesScored = 0, - } - - hydrateInner(stats, instanceMap, virtualInstances, rootId, rootInstance) - - Log.debug( - "Hydrated {} instances ({} ambiguous name+class groups, {} candidates scored)", - stats.hydrated, - stats.ambiguousGroups, - stats.candidatesScored - ) -end - -return hydrate +return hydrate \ No newline at end of file diff --git a/plugin/src/Reconciler/hydrate.spec.lua b/plugin/src/Reconciler/hydrate.spec.lua index 7f6fea7c..b9ff796b 100644 --- a/plugin/src/Reconciler/hydrate.spec.lua +++ b/plugin/src/Reconciler/hydrate.spec.lua @@ -91,7 +91,7 @@ return function() ClassName = "Folder", Name = "Root", Properties = {}, - Children = { "CHILD1", "CHILD2" }, + Children = {"CHILD1", "CHILD2"}, }, CHILD1 = { @@ -126,140 +126,4 @@ return function() expect(knownInstances.fromIds["CHILD1"]).to.equal(child1) expect(knownInstances.fromIds["CHILD2"]).to.equal(child2) end) - - it("should disambiguate duplicate-named siblings by matching properties", function() - local knownInstances = InstanceMap.new() - local virtualInstances = { - ROOT = { - ClassName = "Folder", - Name = "Root", - Properties = {}, - Children = { "CHILD_A", "CHILD_B" }, - }, - - CHILD_A = { - ClassName = "StringValue", - Name = "a", - Properties = { Value = { String = "first" } }, - Children = {}, - }, - - CHILD_B = { - ClassName = "StringValue", - Name = "a", - Properties = { Value = { String = "second" } }, - Children = {}, - }, - } - - local rootInstance = Instance.new("Folder") - - -- Created in the reverse order of the virtual children, so a purely - -- order-based tiebreak would mis-pair them. - local child1 = Instance.new("StringValue") - child1.Name = "a" - child1.Value = "second" - child1.Parent = rootInstance - - local child2 = Instance.new("StringValue") - child2.Name = "a" - child2.Value = "first" - child2.Parent = rootInstance - - hydrate(knownInstances, virtualInstances, "ROOT", rootInstance) - - expect(knownInstances:size()).to.equal(3) - expect(knownInstances.fromIds["CHILD_A"]).to.equal(child2) - expect(knownInstances.fromIds["CHILD_B"]).to.equal(child1) - end) - - it("should fall back to child order for duplicate-named siblings with no distinguishing properties", function() - local knownInstances = InstanceMap.new() - local virtualInstances = { - ROOT = { - ClassName = "Folder", - Name = "Root", - Properties = {}, - Children = { "CHILD_A", "CHILD_B" }, - }, - - CHILD_A = { - ClassName = "Folder", - Name = "a", - Properties = {}, - Children = {}, - }, - - CHILD_B = { - ClassName = "Folder", - Name = "a", - Properties = {}, - Children = {}, - }, - } - - local rootInstance = Instance.new("Folder") - - local child1 = Instance.new("Folder") - child1.Name = "a" - child1.Parent = rootInstance - - local child2 = Instance.new("Folder") - child2.Name = "a" - child2.Parent = rootInstance - - hydrate(knownInstances, virtualInstances, "ROOT", rootInstance) - - expect(knownInstances:size()).to.equal(3) - -- With equal scores the earliest unvisited child wins, preserving the - -- original order-based behavior. - expect(knownInstances.fromIds["CHILD_A"]).to.equal(child1) - expect(knownInstances.fromIds["CHILD_B"]).to.equal(child2) - end) - - it("should fall back to child order for very large duplicate-named groups", function() - -- More candidates than hydrate is willing to score at once. The group - -- must fall back to order-based matching, so virtual child N pairs with - -- existing child N regardless of properties. - local count = 64 - - local knownInstances = InstanceMap.new() - local virtualInstances = { - ROOT = { - ClassName = "Folder", - Name = "Root", - Properties = {}, - Children = {}, - }, - } - - local rootInstance = Instance.new("Folder") - - local expectedInstances = {} - for i = 1, count do - local id = "CHILD_" .. i - table.insert(virtualInstances.ROOT.Children, id) - virtualInstances[id] = { - ClassName = "StringValue", - Name = "a", - -- Distinct values that, if scored, would pair by value rather - -- than by order. - Properties = { Value = { String = "value " .. i } }, - Children = {}, - } - - local child = Instance.new("StringValue") - child.Name = "a" - child.Value = "value " .. (count - i + 1) - child.Parent = rootInstance - expectedInstances[id] = child - end - - hydrate(knownInstances, virtualInstances, "ROOT", rootInstance) - - expect(knownInstances:size()).to.equal(count + 1) - for id, expectedInstance in expectedInstances do - expect(knownInstances.fromIds[id]).to.equal(expectedInstance) - end - end) -end +end \ No newline at end of file diff --git a/plugin/src/Reconciler/init.lua b/plugin/src/Reconciler/init.lua index 4ed46503..1db295a4 100644 --- a/plugin/src/Reconciler/init.lua +++ b/plugin/src/Reconciler/init.lua @@ -3,11 +3,6 @@ and mutating the Roblox DOM. ]] -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin - -local Timer = require(Plugin.Timer) - local applyPatch = require(script.applyPatch) local hydrate = require(script.hydrate) local diff = require(script.diff) @@ -25,28 +20,15 @@ function Reconciler.new(instanceMap) end function Reconciler:applyPatch(patch) - Timer.start("Reconciler:applyPatch") - - local unappliedPatch = applyPatch(self.__instanceMap, patch) - - Timer.stop() - return unappliedPatch + return applyPatch(self.__instanceMap, patch) end function Reconciler:hydrate(virtualInstances, rootId, rootInstance) - Timer.start("Reconciler:hydrate") - local result = hydrate(self.__instanceMap, virtualInstances, rootId, rootInstance) - Timer.stop() - - return result + return hydrate(self.__instanceMap, virtualInstances, rootId, rootInstance) end function Reconciler:diff(virtualInstances, rootId) - Timer.start("Reconciler:diff") - local success, result = diff(self.__instanceMap, virtualInstances, rootId) - Timer.stop() - - return success, result + return diff(self.__instanceMap, virtualInstances, rootId) end -return Reconciler +return Reconciler \ No newline at end of file diff --git a/plugin/src/Reconciler/reify.lua b/plugin/src/Reconciler/reify.lua index de7725ce..3c396573 100644 --- a/plugin/src/Reconciler/reify.lua +++ b/plugin/src/Reconciler/reify.lua @@ -7,6 +7,26 @@ local PatchSet = require(script.Parent.Parent.PatchSet) local setProperty = require(script.Parent.setProperty) local decodeValue = require(script.Parent.decodeValue) +local reifyInner, applyDeferredRefs + +local function reify(instanceMap, virtualInstances, rootId, parentInstance) + -- Create an empty patch that will be populated with any parts of this reify + -- that could not happen, like instances that couldn't be created and + -- properties that could not be assigned. + local unappliedPatch = PatchSet.newEmpty() + + -- Contains a list of all of the ref properties that we'll need to assign + -- after all instances are created. We apply refs in a second pass, after + -- we create as many instances as we can, so that we ensure that referents + -- can be mapped to instances correctly. + local deferredRefs = {} + + reifyInner(instanceMap, virtualInstances, rootId, parentInstance, unappliedPatch, deferredRefs) + applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + + return unappliedPatch +end + --[[ Add the given ID and all of its descendants in virtualInstances to the given PatchSet, marked for addition. @@ -20,21 +40,10 @@ local function addAllToPatch(patchSet, virtualInstances, id) end end -function reifyInstance(deferredRefs, instanceMap, virtualInstances, rootId, parentInstance) - -- Create an empty patch that will be populated with any parts of this reify - -- that could not happen, like instances that couldn't be created and - -- properties that could not be assigned. - local unappliedPatch = PatchSet.newEmpty() - - reifyInstanceInner(unappliedPatch, deferredRefs, instanceMap, virtualInstances, rootId, parentInstance) - - return unappliedPatch -end - --[[ Inner function that defines the core routine. ]] -function reifyInstanceInner(unappliedPatch, deferredRefs, instanceMap, virtualInstances, id, parentInstance) +function reifyInner(instanceMap, virtualInstances, id, parentInstance, unappliedPatch, deferredRefs) local virtualInstance = virtualInstances[id] if virtualInstance == nil then @@ -44,9 +53,9 @@ function reifyInstanceInner(unappliedPatch, deferredRefs, instanceMap, virtualIn -- Instance.new can fail if we're passing in something that can't be -- created, like a service, something enabled with a feature flag, or -- something that requires higher security than we have. - local createSuccess, instance = pcall(Instance.new, virtualInstance.ClassName) + local ok, instance = pcall(Instance.new, virtualInstance.ClassName) - if not createSuccess then + if not ok then addAllToPatch(unappliedPatch, virtualInstances, id) return end @@ -71,14 +80,14 @@ function reifyInstanceInner(unappliedPatch, deferredRefs, instanceMap, virtualIn continue end - local decodeSuccess, value = decodeValue(virtualValue, instanceMap) - if not decodeSuccess then + local ok, value = decodeValue(virtualValue, instanceMap) + if not ok then unappliedProperties[propertyName] = virtualValue continue end - local setPropertySuccess = setProperty(instance, propertyName, value) - if not setPropertySuccess then + local ok = setProperty(instance, propertyName, value) + if not ok then unappliedProperties[propertyName] = virtualValue end end @@ -93,7 +102,7 @@ function reifyInstanceInner(unappliedPatch, deferredRefs, instanceMap, virtualIn end for _, childId in ipairs(virtualInstance.Children) do - reifyInstanceInner(unappliedPatch, deferredRefs, instanceMap, virtualInstances, childId, instance) + reifyInner(instanceMap, virtualInstances, childId, instance, unappliedPatch, deferredRefs) end instance.Parent = parentInstance @@ -126,7 +135,7 @@ function applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) }) end - for _, entry in deferredRefs do + for _, entry in ipairs(deferredRefs) do local _, refId = next(entry.virtualValue) if refId == nil then @@ -134,20 +143,16 @@ function applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) end local targetInstance = instanceMap.fromIds[refId] - if targetInstance == nil then markFailed(entry.id, entry.propertyName, entry.virtualValue) continue end - local setPropertySuccess = setProperty(entry.instance, entry.propertyName, targetInstance) - if not setPropertySuccess then + local ok = setProperty(entry.instance, entry.propertyName, targetInstance) + if not ok then markFailed(entry.id, entry.propertyName, entry.virtualValue) end end end -return { - reifyInstance = reifyInstance, - applyDeferredRefs = applyDeferredRefs, -} +return reify diff --git a/plugin/src/Reconciler/reify.spec.lua b/plugin/src/Reconciler/reify.spec.lua index 20f363d7..a13b204a 100644 --- a/plugin/src/Reconciler/reify.spec.lua +++ b/plugin/src/Reconciler/reify.spec.lua @@ -1,9 +1,9 @@ return function() local reify = require(script.Parent.reify) - local reifyInstance, applyDeferredRefs = reify.reifyInstance, reify.applyDeferredRefs local PatchSet = require(script.Parent.Parent.PatchSet) local InstanceMap = require(script.Parent.Parent.InstanceMap) + local Error = require(script.Parent.Error) local function isEmpty(table) return next(table) == nil, "Table was not empty" @@ -12,7 +12,7 @@ return function() local function size(dict) local len = 0 - for _ in dict do + for _ in pairs(dict) do len = len + 1 end @@ -21,11 +21,7 @@ return function() it("should throw when given a bogus ID", function() expect(function() - local deferredRefs = {} - local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, {}, "Hi, mom!", game) - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + reify(InstanceMap.new(), {}, "Hi, mom!", game) end).to.throw() end) @@ -39,11 +35,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT", nil) - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT", nil) assert(instanceMap:size() == 0, "expected instanceMap to be empty") @@ -68,11 +61,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") assert(PatchSet.isEmpty(unappliedPatch), "expected remaining patch to be empty") @@ -90,7 +80,7 @@ return function() ClassName = "Folder", Name = "Parent", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -101,11 +91,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") assert(PatchSet.isEmpty(unappliedPatch), "expected remaining patch to be empty") @@ -125,7 +112,7 @@ return function() ClassName = "Folder", Name = "Parent", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -136,11 +123,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") expect(size(unappliedPatch.added)).to.equal(1) expect(unappliedPatch.added["CHILD"]).to.equal(virtualInstances["CHILD"]) @@ -163,18 +147,15 @@ return function() Properties = { Value = { Type = "Vector3", - Value = { 1, 2, 3 }, + Value = {1, 2, 3}, }, }, Children = {}, }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") local instance = instanceMap.fromIds["ROOT"] expect(instance.ClassName).to.equal("StringValue") @@ -201,7 +182,7 @@ return function() ClassName = "Folder", Name = "Root", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -216,11 +197,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") assert(PatchSet.isEmpty(unappliedPatch), "expected remaining patch to be empty") @@ -246,16 +224,13 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() local existing = Instance.new("Folder") existing.Name = "Existing" instanceMap:insert("EXISTING", existing) - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") assert(PatchSet.isEmpty(unappliedPatch), "expected remaining patch to be empty") @@ -272,7 +247,7 @@ return function() ClassName = "Folder", Name = "Root", Properties = {}, - Children = { "CHILD_A", "CHILD_B" }, + Children = {"CHILD_A", "CHILD_B"}, }, CHILD_A = { @@ -294,11 +269,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") assert(PatchSet.isEmpty(unappliedPatch), "expected remaining patch to be empty") @@ -325,7 +297,7 @@ return function() Ref = "CHILD", }, }, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -336,11 +308,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") assert(PatchSet.isEmpty(unappliedPatch), "expected remaining patch to be empty") @@ -364,11 +333,8 @@ return function() }, } - local deferredRefs = {} local instanceMap = InstanceMap.new() - local unappliedPatch = reifyInstance(deferredRefs, instanceMap, virtualInstances, "ROOT") - - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) + local unappliedPatch = reify(instanceMap, virtualInstances, "ROOT") assert(not PatchSet.hasRemoves(unappliedPatch), "expected no removes") assert(not PatchSet.hasAdditions(unappliedPatch), "expected no additions") diff --git a/plugin/src/Reconciler/setProperty.lua b/plugin/src/Reconciler/setProperty.lua index 11df6b54..316f920e 100644 --- a/plugin/src/Reconciler/setProperty.lua +++ b/plugin/src/Reconciler/setProperty.lua @@ -2,9 +2,8 @@ Attempts to set a property on the given instance. ]] -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) -local RbxDom = require(Packages.RbxDom) +local RbxDom = require(script.Parent.Parent.Parent.RbxDom) +local Log = require(script.Parent.Parent.Parent.Log) local Error = require(script.Parent.Error) local function setProperty(instance, propertyName, value) @@ -21,32 +20,29 @@ local function setProperty(instance, propertyName, value) end if descriptor.scriptability == "None" or descriptor.scriptability == "Read" then - return false, - Error.new(Error.UnwritableProperty, { - className = instance.ClassName, - propertyName = propertyName, - }) + return false, Error.new(Error.UnwritableProperty, { + className = instance.ClassName, + propertyName = propertyName, + }) end - local writeSuccess, err = descriptor:write(instance, value) + local ok, err = descriptor:write(instance, value) - if not writeSuccess then + if not ok then if err.kind == RbxDom.Error.Kind.Roblox and err.extra:find("lacking permission") then - return false, - Error.new(Error.LackingPropertyPermissions, { - className = instance.ClassName, - propertyName = propertyName, - }) - end - - return false, - Error.new(Error.OtherPropertyError, { + return false, Error.new(Error.LackingPropertyPermissions, { className = instance.ClassName, propertyName = propertyName, }) + end + + return false, Error.new(Error.OtherPropertyError, { + className = instance.ClassName, + propertyName = propertyName, + }) end return true end -return setProperty +return setProperty \ No newline at end of file diff --git a/plugin/src/Reconciler/trueEquals.lua b/plugin/src/Reconciler/trueEquals.lua deleted file mode 100644 index 7dadf476..00000000 --- a/plugin/src/Reconciler/trueEquals.lua +++ /dev/null @@ -1,100 +0,0 @@ ---[[ - Fuzzy value-equality used to compare a decoded virtual property value against - the live value read from a real instance. Shared by `diff` (to decide whether - a property changed) and `hydrate` (to score candidate instances). -]] - -local function fuzzyEq(a: number, b: number, epsilon: number): boolean - return math.abs(a - b) < epsilon -end - -local function trueEquals(a, b): boolean - -- Exit early for simple equality values - if a == b then - return true - end - - -- Treat nil and { Ref = "000...0" } as equal - if - (a == nil and type(b) == "table" and b.Ref == "00000000000000000000000000000000") - or (b == nil and type(a) == "table" and a.Ref == "00000000000000000000000000000000") - then - return true - end - - local typeA, typeB = typeof(a), typeof(b) - - -- For tables, try recursive deep equality - if typeA == "table" and typeB == "table" then - local checkedKeys = {} - for key, value in a do - checkedKeys[key] = true - if not trueEquals(value, b[key]) then - return false - end - end - for key, value in b do - if checkedKeys[key] then - continue - end - if not trueEquals(value, a[key]) then - return false - end - end - return true - - -- For NaN, check if both values are not equal to themselves - elseif a ~= a and b ~= b then - return true - - -- For numbers, compare with epsilon of 0.0001 to avoid floating point inequality - elseif typeA == "number" and typeB == "number" then - return fuzzyEq(a, b, 0.0001) - - -- For EnumItem->number, compare the EnumItem's value - elseif typeA == "number" and typeB == "EnumItem" then - return a == b.Value - elseif typeA == "EnumItem" and typeB == "number" then - return a.Value == b - - -- For Color3s, compare to RGB ints to avoid floating point inequality - elseif typeA == "Color3" and typeB == "Color3" then - local aR, aG, aB = math.floor(a.R * 255), math.floor(a.G * 255), math.floor(a.B * 255) - local bR, bG, bB = math.floor(b.R * 255), math.floor(b.G * 255), math.floor(b.B * 255) - return aR == bR and aG == bG and aB == bB - - -- For CFrames, compare to components with epsilon of 0.0001 to avoid floating point inequality - elseif typeA == "CFrame" and typeB == "CFrame" then - local aComponents, bComponents = { a:GetComponents() }, { b:GetComponents() } - for i, aComponent in aComponents do - if not fuzzyEq(aComponent, bComponents[i], 0.0001) then - return false - end - end - return true - - -- For Vector3s, compare to components with epsilon of 0.0001 to avoid floating point inequality - elseif typeA == "Vector3" and typeB == "Vector3" then - local aComponents, bComponents = { a.X, a.Y, a.Z }, { b.X, b.Y, b.Z } - for i, aComponent in aComponents do - if not fuzzyEq(aComponent, bComponents[i], 0.0001) then - return false - end - end - return true - - -- For Vector2s, compare to components with epsilon of 0.0001 to avoid floating point inequality - elseif typeA == "Vector2" and typeB == "Vector2" then - local aComponents, bComponents = { a.X, a.Y }, { b.X, b.Y } - for i, aComponent in aComponents do - if not fuzzyEq(aComponent, bComponents[i], 0.0001) then - return false - end - end - return true - end - - return false -end - -return trueEquals diff --git a/plugin/src/ServeSession.lua b/plugin/src/ServeSession.lua index 7e9fc742..f9a3bd9b 100644 --- a/plugin/src/ServeSession.lua +++ b/plugin/src/ServeSession.lua @@ -1,24 +1,15 @@ local StudioService = game:GetService("StudioService") local RunService = game:GetService("RunService") -local ChangeHistoryService = game:GetService("ChangeHistoryService") -local SerializationService = game:GetService("SerializationService") -local Selection = game:GetService("Selection") -local Packages = script.Parent.Parent.Packages -local Log = require(Packages.Log) -local Fmt = require(Packages.Fmt) -local t = require(Packages.t) -local Promise = require(Packages.Promise) -local Timer = require(script.Parent.Timer) +local Log = require(script.Parent.Parent.Log) +local Fmt = require(script.Parent.Parent.Fmt) +local t = require(script.Parent.Parent.t) local ChangeBatcher = require(script.Parent.ChangeBatcher) -local encodePatchUpdate = require(script.Parent.ChangeBatcher.encodePatchUpdate) local InstanceMap = require(script.Parent.InstanceMap) local PatchSet = require(script.Parent.PatchSet) local Reconciler = require(script.Parent.Reconciler) local strict = require(script.Parent.strict) -local Settings = require(script.Parent.Settings) -local orderSwaps = require(script.Parent.orderSwaps) local Status = strict("Session.Status", { NotStarted = "NotStarted", @@ -27,8 +18,8 @@ local Status = strict("Session.Status", { Disconnected = "Disconnected", }) -local function debugPatch(object) - return Fmt.debugify(object, function(patch, output) +local function debugPatch(patch) + return Fmt.debugify(patch, function(patch, output) output:writeLine("Patch {{") output:indent() @@ -49,12 +40,6 @@ local function debugPatch(object) end) end -local function attemptReparent(instance, parent) - return pcall(function() - instance.Parent = parent - end) -end - local ServeSession = {} ServeSession.__index = ServeSession @@ -62,6 +47,7 @@ ServeSession.Status = Status local validateServeOptions = t.strictInterface({ apiContext = t.table, + openScriptsExternally = t.boolean, twoWaySync = t.boolean, }) @@ -88,27 +74,27 @@ function ServeSession.new(options) local connections = {} - local connection = StudioService:GetPropertyChangedSignal("ActiveScript"):Connect(function() - local activeScript = StudioService.ActiveScript + local connection = StudioService + :GetPropertyChangedSignal("ActiveScript") + :Connect(function() + local activeScript = StudioService.ActiveScript - if activeScript ~= nil then - self:__onActiveScriptChanged(activeScript) - end - end) + if activeScript ~= nil then + self:__onActiveScriptChanged(activeScript) + end + end) table.insert(connections, connection) self = { __status = Status.NotStarted, __apiContext = options.apiContext, + __openScriptsExternally = options.openScriptsExternally, __twoWaySync = options.twoWaySync, __reconciler = reconciler, __instanceMap = instanceMap, __changeBatcher = changeBatcher, __statusChangedCallback = nil, __connections = connections, - __precommitCallbacks = {}, - __postcommitCallbacks = {}, - __updateLoadingText = function() end, } setmetatable(self, ServeSession) @@ -135,93 +121,23 @@ function ServeSession:onStatusChanged(callback) self.__statusChangedCallback = callback end -function ServeSession:setConfirmCallback(callback) - self.__userConfirmCallback = callback -end - -function ServeSession:setUpdateLoadingTextCallback(callback) - self.__updateLoadingText = callback -end - -function ServeSession:setLoadingText(text: string) - self.__updateLoadingText(text) -end - ---[=[ - Hooks a function to run before patch application. - The provided function is called with the incoming patch and an InstanceMap - as parameters. -]=] -function ServeSession:hookPrecommit(callback) - table.insert(self.__precommitCallbacks, callback) - Log.trace("Added precommit callback: {}", callback) - - return function() - -- Remove the callback from the list - for i, cb in self.__precommitCallbacks do - if cb == callback then - table.remove(self.__precommitCallbacks, i) - Log.trace("Removed precommit callback: {}", callback) - break - end - end - end -end - ---[=[ - Hooks a function to run after patch application. - The provided function is called with the applied patch, the current - InstanceMap, and a PatchSet containing any unapplied changes. -]=] -function ServeSession:hookPostcommit(callback) - table.insert(self.__postcommitCallbacks, callback) - Log.trace("Added postcommit callback: {}", callback) - - return function() - -- Remove the callback from the list - for i, cb in self.__postcommitCallbacks do - if cb == callback then - table.remove(self.__postcommitCallbacks, i) - Log.trace("Removed postcommit callback: {}", callback) - break - end - end - end -end - function ServeSession:start() self:__setStatus(Status.Connecting) - self:setLoadingText("Connecting to server...") - self.__apiContext - :connect() + self.__apiContext:connect() :andThen(function(serverInfo) - self:setLoadingText("Loading initial data from server...") - return self:__initialSync(serverInfo):andThen(function() - self:setLoadingText("Starting sync loop...") - self:__setStatus(Status.Connected, serverInfo.projectName) - self:__applyGameAndPlaceId(serverInfo) + self:__setStatus(Status.Connected, serverInfo.projectName) + self:__applyGameAndPlaceId(serverInfo) - return self.__apiContext:connectWebSocket({ - ["messages"] = function(messagesPacket) - if self.__status == Status.Disconnected then - return - end + local rootInstanceId = serverInfo.rootInstanceId - Log.debug("Received {} messages from Rojo server", #messagesPacket.messages) - - for _, message in messagesPacket.messages do - self:__applyPatch(message) - end - self.__apiContext:setMessageCursor(messagesPacket.messageCursor) - end, - }) - end) + return self:__initialSync(rootInstanceId) + :andThen(function() + return self:__mainSyncLoop() + end) end) :catch(function(err) - if self.__status ~= Status.Disconnected then - self:__stopInternal(err) - end + self:__stopInternal(err) end) end @@ -240,7 +156,7 @@ function ServeSession:__applyGameAndPlaceId(serverInfo) end function ServeSession:__onActiveScriptChanged(activeScript) - if not Settings:get("openScriptsExternally") then + if not self.__openScriptsExternally then Log.trace("Not opening script {} because feature not enabled.", activeScript) return @@ -267,7 +183,7 @@ function ServeSession:__onActiveScriptChanged(activeScript) local existingParent = activeScript.Parent activeScript.Parent = nil - for _ = 1, 3 do + for i = 1, 3 do RunService.Heartbeat:Wait() end @@ -278,294 +194,62 @@ function ServeSession:__onActiveScriptChanged(activeScript) self.__apiContext:open(scriptId) end -function ServeSession:__replaceInstances(idList) - if #idList == 0 then - return true, PatchSet.newEmpty() - end - -- It would be annoying if selection went away, so we try to preserve it. - local selection = Selection:Get() - local selectionMap = {} - for i, instance in selection do - selectionMap[instance] = i - end +function ServeSession:__initialSync(rootInstanceId) + return self.__apiContext:read({ rootInstanceId }) + :andThen(function(readResponseBody) + -- Tell the API Context that we're up-to-date with the version of + -- the tree defined in this response. + self.__apiContext:setMessageCursor(readResponseBody.messageCursor) - -- TODO: Should we do this in multiple requests so we can more granularly mark failures? - local modelSuccess, replacements = self.__apiContext - :serialize(idList) - :andThen(function(response) - Log.debug("Deserializing results from serialize endpoint") - local objects = SerializationService:DeserializeInstancesAsync(response.modelContents) - if not objects[1] then - return Promise.reject("Serialize endpoint did not deserialize into any Instances") - end - if #objects[1]:GetChildren() ~= #idList then - return Promise.reject("Serialize endpoint did not return the correct number of Instances") - end + -- For any instances that line up with the Rojo server's view, start + -- tracking them in the reconciler. + Log.trace("Matching existing Roblox instances to Rojo IDs") + self.__reconciler:hydrate(readResponseBody.instances, rootInstanceId, game) - local instanceMap = {} - for _, item in objects[1]:GetChildren() do - instanceMap[item.Name] = item.Value - end - return instanceMap - end) - :await() - - local refSuccess, refPatch = self.__apiContext - :refPatch(idList) - :andThen(function(response) - return response.patch - end) - :await() - - if not (modelSuccess and refSuccess) then - return false - end - - -- Roblox appends to GetChildren() on every reparent, so the order in which - -- we re-parent replacements determines their final sibling order. - -- We process ancestors before descendants (so each replacement's - -- parent already exists when we re-parent it) and siblings in their original - -- GetChildren() order. Because the loop below moves the old instance's - -- children into the replacement *before* re-parenting the replacement, this - -- rebuilds GetChildren() exactly as it was before the swap. - local swaps = {} - for id, replacement in replacements do - local oldInstance = self.__instanceMap.fromIds[id] - if not oldInstance then - -- TODO: Why would this happen? - Log.warn("Instance {} not found in InstanceMap during sync replacement", id) - continue - end - - table.insert(swaps, { - id = id, - replacement = replacement, - oldInstance = oldInstance, - }) - end - - for _, swap in orderSwaps(swaps) do - local id, replacement, oldInstance = swap.id, swap.replacement, swap.oldInstance - - self.__instanceMap:insert(id, replacement) - Log.trace("Swapping Instance {} out via api/models/ endpoint", id) - local oldParent = oldInstance.Parent - for _, child in oldInstance:GetChildren() do - -- Some children cannot be reparented, such as a TouchTransmitter - local reparentSuccess, reparentError = attemptReparent(child, replacement) - if not reparentSuccess then - Log.warn( - "Could not reparent child {} of instance {} during sync replacement: {}", - child.Name, - oldInstance.Name, - reparentError - ) - end - end - - -- ChangeHistoryService doesn't like it if an Instance has been - -- Destroyed. So, we have to accept the potential memory hit and - -- just set the parent to `nil`. - local deleteSuccess, deleteError = attemptReparent(oldInstance, nil) - local replaceSuccess, replaceError = attemptReparent(replacement, oldParent) - - if not (deleteSuccess and replaceSuccess) then - Log.warn( - "Could not swap instances {} and {} during sync replacement: {}", - oldInstance.Name, - replacement.Name, - (deleteError or "") .. "\n" .. (replaceError or "") + -- Calculate the initial patch to apply to the DataModel to catch us + -- up to what Rojo thinks the place should look like. + Log.trace("Computing changes that plugin needs to make to catch up to server...") + local success, catchUpPatch = self.__reconciler:diff( + readResponseBody.instances, + rootInstanceId, + game ) - -- We need to revert the failed swap to avoid losing the old instance and children. - for _, child in replacement:GetChildren() do - attemptReparent(child, oldInstance) - end - attemptReparent(oldInstance, oldParent) - - -- Our replacement should never have existed in the first place, so we can just destroy it. - replacement:Destroy() - continue - end - - if selectionMap[oldInstance] then - -- This is a bit funky, but it saves the order of Selection - -- which might matter for some use cases. - selection[selectionMap[oldInstance]] = replacement - end - end - - local patchApplySuccess, unappliedPatch = pcall(self.__reconciler.applyPatch, self.__reconciler, refPatch) - if patchApplySuccess then - Selection:Set(selection) - return true, unappliedPatch - else - error(unappliedPatch) - end -end - -function ServeSession:__applyPatch(patch) - local patchTimestamp = DateTime.now():FormatLocalTime("LTS", "en-us") - local historyRecording = ChangeHistoryService:TryBeginRecording("Rojo: Patch " .. patchTimestamp) - if not historyRecording then - -- There can only be one recording at a time - Log.debug("Failed to begin history recording for " .. patchTimestamp .. ". Another recording is in progress.") - end - - Timer.start("precommitCallbacks") - -- Precommit callbacks must be serial in order to obey the contract that - -- they execute before commit - for _, callback in self.__precommitCallbacks do - local success, err = pcall(callback, patch, self.__instanceMap) - if not success then - Log.warn("Precommit hook errored: {}", err) - end - end - Timer.stop() - - local patchApplySuccess, unappliedPatch = pcall(self.__reconciler.applyPatch, self.__reconciler, patch) - if not patchApplySuccess then - if historyRecording then - ChangeHistoryService:FinishRecording(historyRecording, Enum.FinishRecordingOperation.Commit) - end - -- This might make a weird stack trace but the only way applyPatch can - -- fail is if a bug occurs so it's probably fine. - error(unappliedPatch) - end - - if Settings:get("enableSyncFallback") and not PatchSet.isEmpty(unappliedPatch) then - -- Some changes did not apply, let's try replacing them instead - local addedIdList = PatchSet.addedIdList(unappliedPatch) - local updatedIdList = PatchSet.updatedIdList(unappliedPatch) - - Log.debug("ServeSession:__replaceInstances(unappliedPatch.added)") - Timer.start("ServeSession:__replaceInstances(unappliedPatch.added)") - local addSuccess, unappliedAddedRefs = self:__replaceInstances(addedIdList) - Timer.stop() - - Log.debug("ServeSession:__replaceInstances(unappliedPatch.updated)") - Timer.start("ServeSession:__replaceInstances(unappliedPatch.updated)") - local updateSuccess, unappliedUpdateRefs = self:__replaceInstances(updatedIdList) - Timer.stop() - - -- Update the unapplied patch to reflect which Instances were replaced successfully - if addSuccess then - table.clear(unappliedPatch.added) - PatchSet.assign(unappliedPatch, unappliedAddedRefs) - end - if updateSuccess then - table.clear(unappliedPatch.updated) - PatchSet.assign(unappliedPatch, unappliedUpdateRefs) - end - end - - if not PatchSet.isEmpty(unappliedPatch) then - Log.debug( - "Could not apply all changes requested by the Rojo server:\n{}", - PatchSet.humanSummary(self.__instanceMap, unappliedPatch) - ) - end - - Timer.start("postcommitCallbacks") - -- Postcommit callbacks can be called with spawn since regardless of firing order, they are - -- guaranteed to be called after the commit - for _, callback in self.__postcommitCallbacks do - task.spawn(function() - local success, err = pcall(callback, patch, self.__instanceMap, unappliedPatch) if not success then - Log.warn("Postcommit hook errored: {}", err) + Log.error("Could not compute a diff to catch up to the Rojo server: {:#?}", catchUpPatch) + end + + Log.trace("Computed hydration patch: {:#?}", debugPatch(catchUpPatch)) + + -- TODO: Prompt user to notify them of this patch, since it's + -- effectively a conflict between the Rojo server and the client. In + -- the future, we'll ask which changes the user wants to keep. + + local unappliedPatch = self.__reconciler:applyPatch(catchUpPatch) + + if not PatchSet.isEmpty(unappliedPatch) then + Log.warn("Could not apply all changes requested by the Rojo server:\n{}", + PatchSet.humanSummary(self.__instanceMap, unappliedPatch)) end end) - end - Timer.stop() - - if historyRecording then - ChangeHistoryService:FinishRecording(historyRecording, Enum.FinishRecordingOperation.Commit) - end end -function ServeSession:__initialSync(serverInfo) - return self.__apiContext:read({ serverInfo.rootInstanceId }):andThen(function(readResponseBody) - -- Tell the API Context that we're up-to-date with the version of - -- the tree defined in this response. - self.__apiContext:setMessageCursor(readResponseBody.messageCursor) +function ServeSession:__mainSyncLoop() + return self.__apiContext:retrieveMessages() + :andThen(function(messages) + for _, message in ipairs(messages) do + local unappliedPatch = self.__reconciler:applyPatch(message) - -- For any instances that line up with the Rojo server's view, start - -- tracking them in the reconciler. - Log.trace("Matching existing Roblox instances to Rojo IDs") - self:setLoadingText("Hydrating instance map...") - self.__reconciler:hydrate(readResponseBody.instances, serverInfo.rootInstanceId, game) - - -- Calculate the initial patch to apply to the DataModel to catch us - -- up to what Rojo thinks the place should look like. - Log.trace("Computing changes that plugin needs to make to catch up to server...") - self:setLoadingText("Finding differences between server and Studio...") - local success, catchUpPatch = - self.__reconciler:diff(readResponseBody.instances, serverInfo.rootInstanceId, game) - - if not success then - Log.error("Could not compute a diff to catch up to the Rojo server: {:#?}", catchUpPatch) - end - - for _, update in catchUpPatch.updated do - if update.id == self.__instanceMap.fromInstances[game] and update.changedClassName ~= nil then - -- Non-place projects will try to update the classname of game from DataModel to - -- something like Folder, ModuleScript, etc. This would fail, so we exit with a clear - -- message instead of crashing. - return Promise.reject( - "Cannot sync a model as a place." - .. "\nEnsure Rojo is serving a project file that has a DataModel at the root of its tree and try again." - .. "\nSee project file docs: https://rojo.space/docs/v7/project-format/" - ) - end - end - - Log.trace("Computed hydration patch: {:#?}", debugPatch(catchUpPatch)) - - local userDecision = "Accept" - if self.__userConfirmCallback ~= nil then - userDecision = self.__userConfirmCallback(self.__instanceMap, catchUpPatch, serverInfo) - end - - if userDecision == "Abort" then - return Promise.reject("Aborted Rojo sync operation") - elseif userDecision == "Reject" then - if not self.__twoWaySync then - return Promise.reject("Cannot reject sync operation without two-way sync enabled") - end - -- The user wants their studio DOM to write back to their Rojo DOM - -- so we will reverse the patch and send it back - - local inversePatch = PatchSet.newEmpty() - - -- Send back the current properties - for _, change in catchUpPatch.updated do - local instance = self.__instanceMap.fromIds[change.id] - if not instance then - continue + if not PatchSet.isEmpty(unappliedPatch) then + Log.warn("Could not apply all changes requested by the Rojo server:\n{}", + PatchSet.humanSummary(self.__instanceMap, unappliedPatch)) end - - local update = encodePatchUpdate(instance, change.id, change.changedProperties) - table.insert(inversePatch.updated, update) - end - -- Add the removed instances back to Rojo - -- selene:allow(empty_if, unused_variable, empty_loop) - for _, instance in catchUpPatch.removed do - -- TODO: Generate ID for our instance and add it to inversePatch.added - end - -- Remove the additions we've rejected - for id, _change in catchUpPatch.added do - table.insert(inversePatch.removed, id) end - return self.__apiContext:write(inversePatch) - elseif userDecision == "Accept" then - self:__applyPatch(catchUpPatch) - return Promise.resolve() - else - return Promise.reject("Invalid user decision: " .. userDecision) - end - end) + if self.__status ~= Status.Disconnected then + return self:__mainSyncLoop() + end + end) end function ServeSession:__stopInternal(err) diff --git a/plugin/src/Settings.lua b/plugin/src/Settings.lua deleted file mode 100644 index 64f32241..00000000 --- a/plugin/src/Settings.lua +++ /dev/null @@ -1,124 +0,0 @@ ---[[ - Persistent plugin settings. -]] - -local plugin = plugin or script:FindFirstAncestorWhichIsA("Plugin") -local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages - -local Log = require(Packages.Log) -local Roact = require(Packages.Roact) - -local defaultSettings = { - openScriptsExternally = false, - twoWaySync = false, - autoReconnect = false, - showNotifications = true, - enableSyncFallback = true, - syncReminderMode = "Notify" :: "None" | "Notify" | "Fullscreen", - syncReminderPolling = true, - checkForUpdates = true, - checkForPrereleases = false, - autoConnectPlaytestServer = false, - confirmationBehavior = "Initial" :: "Never" | "Initial" | "Large Changes" | "Unlisted PlaceId", - largeChangesConfirmationThreshold = 5, - playSounds = true, - typecheckingEnabled = false, - logLevel = "Info", - timingLogsEnabled = false, - priorEndpoints = {}, -} - -local Settings = {} - -Settings._values = table.clone(defaultSettings) -Settings._updateListeners = {} -Settings._bindings = {} - -if plugin then - for name, defaultValue in pairs(Settings._values) do - local savedValue = plugin:GetSetting("Rojo_" .. name) - - if savedValue == nil then - -- plugin:SetSetting hits disc instead of memory, so it can be slow. Spawn so we don't hang. - task.spawn(plugin.SetSetting, plugin, "Rojo_" .. name, defaultValue) - Settings._values[name] = defaultValue - else - Settings._values[name] = savedValue - end - end - Log.trace("Loaded settings from plugin store") -end - -function Settings:get(name) - if defaultSettings[name] == nil then - error("Invalid setings name " .. tostring(name), 2) - end - - return self._values[name] -end - -function Settings:set(name, value) - self._values[name] = value - if self._bindings[name] then - self._bindings[name].set(value) - end - - if plugin then - -- plugin:SetSetting hits disc instead of memory, so it can be slow. Spawn so we don't hang. - task.spawn(plugin.SetSetting, plugin, "Rojo_" .. name, value) - end - - if self._updateListeners[name] then - for callback in pairs(self._updateListeners[name]) do - task.spawn(callback, value) - end - end - - Log.trace(string.format("Set setting '%s' to '%s'", name, tostring(value))) -end - -function Settings:onChanged(name, callback) - local listeners = self._updateListeners[name] - if listeners == nil then - listeners = {} - self._updateListeners[name] = listeners - end - listeners[callback] = true - - Log.trace(string.format("Added listener for setting '%s' changes", name)) - - return function() - listeners[callback] = nil - Log.trace(string.format("Removed listener for setting '%s' changes", name)) - end -end - -function Settings:getBinding(name) - local cached = self._bindings[name] - if cached then - return cached.bind - end - - local bind, set = Roact.createBinding(self._values[name]) - self._bindings[name] = { - bind = bind, - set = set, - } - - Log.trace(string.format("Created binding for setting '%s'", name)) - - return bind -end - -function Settings:getBindings(...: string) - local bindings = {} - for i = 1, select("#", ...) do - local source = select(i, ...) - bindings[source] = self:getBinding(source) - end - - return Roact.joinBindings(bindings) -end - -return Settings diff --git a/plugin/src/Timer.lua b/plugin/src/Timer.lua deleted file mode 100644 index 9a5bbbd0..00000000 --- a/plugin/src/Timer.lua +++ /dev/null @@ -1,57 +0,0 @@ -local Settings = require(script.Parent.Settings) - -local clock = os.clock - -local Timer = { - _entries = {}, -} - -function Timer._start(label) - local start = clock() - if not label then - error("[Rojo-Timer] Timer.start: label is required", 2) - return - end - - table.insert(Timer._entries, { label, start }) -end - -function Timer._stop() - local stop = clock() - - local entry = table.remove(Timer._entries) - if not entry then - error("[Rojo-Timer] Timer.stop: no label to stop", 2) - return - end - - local label = entry[1] - if #Timer._entries > 0 then - local priorLabels = {} - for _, priorEntry in ipairs(Timer._entries) do - table.insert(priorLabels, priorEntry[1]) - end - label = table.concat(priorLabels, "/") .. "/" .. label - end - - local start = entry[2] - local duration = stop - start - print(string.format("[Rojo-Timer] %s took %.3f ms", label, duration * 1000)) -end - --- Replace functions with no-op if not in debug mode -local function no_op() end -local function setFunctions(enabled) - if enabled then - Timer.start = Timer._start - Timer.stop = Timer._stop - else - Timer.start = no_op - Timer.stop = no_op - end -end - -Settings:onChanged("timingLogsEnabled", setFunctions) -setFunctions(Settings:get("timingLogsEnabled")) - -return Timer diff --git a/plugin/src/Types.lua b/plugin/src/Types.lua index fd04bed2..ebd8efe1 100644 --- a/plugin/src/Types.lua +++ b/plugin/src/Types.lua @@ -1,6 +1,6 @@ -local Packages = script.Parent.Parent.Packages -local t = require(Packages.t) -local Settings = require(script.Parent.Settings) +local t = require(script.Parent.Parent.t) + +local DevSettings = require(script.Parent.DevSettings) local strict = require(script.Parent.strict) local RbxId = t.string @@ -49,39 +49,24 @@ local ApiReadResponse = t.interface({ instances = t.map(RbxId, ApiInstance), }) -local SocketPacketType = t.union(t.literal("messages")) - -local MessagesPacket = t.interface({ +local ApiSubscribeResponse = t.interface({ + sessionId = t.string, messageCursor = t.number, messages = t.array(ApiSubscribeMessage), }) -local SocketPacketBody = t.union(MessagesPacket) - -local ApiSocketPacket = t.interface({ - sessionId = t.string, - packetType = SocketPacketType, - body = SocketPacketBody, -}) - -local ApiSerializeResponse = t.interface({ - sessionId = t.string, - modelContents = t.buffer, -}) - -local ApiRefPatchResponse = t.interface({ - sessionId = t.string, - patch = ApiSubscribeMessage, -}) - local ApiError = t.interface({ - kind = t.union(t.literal("NotFound"), t.literal("BadRequest"), t.literal("InternalError")), + kind = t.union( + t.literal("NotFound"), + t.literal("BadRequest"), + t.literal("InternalError") + ), details = t.string, }) local function ifEnabled(innerCheck) return function(...) - if Settings:get("typecheckingEnabled") then + if DevSettings:shouldTypecheck() then return innerCheck(...) else return true @@ -94,15 +79,13 @@ return strict("Types", { ApiInfoResponse = ApiInfoResponse, ApiReadResponse = ApiReadResponse, - ApiSocketPacket = ApiSocketPacket, + ApiSubscribeResponse = ApiSubscribeResponse, ApiError = ApiError, ApiInstance = ApiInstance, ApiInstanceUpdate = ApiInstanceUpdate, ApiInstanceMetadata = ApiInstanceMetadata, ApiSubscribeMessage = ApiSubscribeMessage, - ApiSerializeResponse = ApiSerializeResponse, - ApiRefPatchResponse = ApiRefPatchResponse, ApiValue = ApiValue, RbxId = RbxId, diff --git a/plugin/src/Version.lua b/plugin/src/Version.lua index 40b4870c..f7dd88f3 100644 --- a/plugin/src/Version.lua +++ b/plugin/src/Version.lua @@ -1,21 +1,3 @@ -local Rojo = script:FindFirstAncestor("Rojo") -local Plugin = Rojo.Plugin -local Packages = Rojo.Packages - -local Http = require(Packages.Http) -local Promise = require(Packages.Promise) -local Log = require(Packages.Log) - -local Config = require(Plugin.Config) -local Settings = require(Plugin.Settings) -local timeUtil = require(Plugin.timeUtil) - -type LatestReleaseInfo = { - version: { number }, - prerelease: boolean, - publishedUnixTimestamp: number, -} - local function compare(a, b) if a > b then return 1 @@ -48,48 +30,7 @@ function Version.compare(a, b) return minor end - if revision ~= 0 then - return revision - end - - local aPrerelease = if a[4] == "" then nil else a[4] - local bPrerelease = if b[4] == "" then nil else b[4] - - -- If neither are prerelease, they are the same - if aPrerelease == nil and bPrerelease == nil then - return 0 - end - - -- If one is prerelease it is older - if aPrerelease ~= nil and bPrerelease == nil then - return -1 - end - if aPrerelease == nil and bPrerelease ~= nil then - return 1 - end - - -- If they are both prereleases, compare those based on number - local aPrereleaseNumeric = string.match(aPrerelease, "(%d+).*$") - local bPrereleaseNumeric = string.match(bPrerelease, "(%d+).*$") - - if aPrereleaseNumeric == nil or bPrereleaseNumeric == nil then - -- If one or both lack a number, comparing isn't meaningful - return 0 - end - return compare(tonumber(aPrereleaseNumeric) or 0, tonumber(bPrereleaseNumeric) or 0) -end - -function Version.parse(versionString: string) - local version = { string.match(versionString, "^v?(%d+)%.(%d+)%.(%d+)(.*)$") } - for i, v in version do - version[i] = tonumber(v) or v - end - - if version[4] == "" then - version[4] = nil - end - - return version + return revision end function Version.display(version) @@ -102,132 +43,4 @@ function Version.display(version) return output end ---[[ - The GitHub API rate limit for unauthenticated requests is rather low, - and we don't release often enough to warrant checking it more than once a day. ---]] -Version._cachedLatestCompatible = nil :: { - value: LatestReleaseInfo?, - timestamp: number, -}? - ---[[ - A user may choose to reject requests to api.github.com. If they do, we want - to disable the setting for checking for updates to indicate that it does - nothing. -]] -Version._apiBlocked = nil :: boolean? - -function Version.isApiBlocked(): boolean - if Version._apiBlocked == nil then - local isLocalInstall = string.find(debug.traceback(), "\n[^\n]-user_.-$") ~= nil - Version.retrieveLatestCompatible({ - version = Config.version, - includePrereleases = isLocalInstall and Settings:get("checkForPrereleases"), - }) - end - return Version._apiBlocked -end - -function Version.retrieveLatestCompatible(options: { - version: { number }, - includePrereleases: boolean?, -}): LatestReleaseInfo? - if Version._cachedLatestCompatible and os.clock() - Version._cachedLatestCompatible.timestamp < 60 * 60 * 24 then - Log.debug("Using cached latest compatible version") - return Version._cachedLatestCompatible.value - end - - Log.debug("Retrieving latest compatible version from GitHub") - - local success, releases = Http.get("https://api.github.com/repos/rojo-rbx/rojo/releases?per_page=10") - :andThen(function(response) - if response.code >= 400 then - local message = string.format("HTTP %s:\n%s", tostring(response.code), response.body) - - return Promise.reject(message) - end - - return response - end) - :andThen(Http.Response.json) - :await() - - if success == false or type(releases) ~= "table" or next(releases) ~= 1 then - -- Roblox's HTTP errors are weird! - if string.find(tostring(releases), "^Unknown HTTP error: HttpService permission denied") then - Version._apiBlocked = true - end - return nil - end - Version._apiBlocked = false - - -- Iterate through releases, looking for the latest compatible version - local latestCompatible: LatestReleaseInfo? = nil - for _, release in releases do - -- Skip prereleases if they are not requested - if (not options.includePrereleases) and release.prerelease then - continue - end - - local releaseVersion = Version.parse(release.tag_name) - - -- Skip releases that are potentially incompatible - if releaseVersion[1] > options.version[1] then - continue - end - - -- Skip releases that are older than the latest compatible version - if latestCompatible ~= nil and Version.compare(releaseVersion, latestCompatible.version) <= 0 then - continue - end - - latestCompatible = { - version = releaseVersion, - prerelease = release.prerelease, - publishedUnixTimestamp = DateTime.fromIsoDate(release.published_at).UnixTimestamp, - } - end - - -- Don't return anything if the latest found is not newer than the current version - if latestCompatible == nil or Version.compare(latestCompatible.version, options.version) <= 0 then - -- Cache as nil so we don't try again for a day - Version._cachedLatestCompatible = { - value = nil, - timestamp = os.clock(), - } - - return nil - end - - -- Cache the latest compatible version - Version._cachedLatestCompatible = { - value = latestCompatible, - timestamp = os.clock(), - } - - return latestCompatible -end - -function Version.getUpdateMessage(): string? - if not Settings:get("checkForUpdates") then - return - end - - local isLocalInstall = string.find(debug.traceback(), "\n[^\n]-user_.-$") ~= nil - local latestCompatibleVersion = Version.retrieveLatestCompatible({ - version = Config.version, - includePrereleases = isLocalInstall and Settings:get("checkForPrereleases"), - }) - if not latestCompatibleVersion then - return - end - - return string.format( - "A newer compatible version of Rojo, %s, was published %s! Go to the Rojo releases page to learn more.", - Version.display(latestCompatibleVersion.version), - timeUtil.elapsedToText(DateTime.now().UnixTimestamp - latestCompatibleVersion.publishedUnixTimestamp) - ) -end - -return Version +return Version \ No newline at end of file diff --git a/plugin/src/Version.spec.lua b/plugin/src/Version.spec.lua index f1e9eba2..7be002e9 100644 --- a/plugin/src/Version.spec.lua +++ b/plugin/src/Version.spec.lua @@ -2,62 +2,27 @@ return function() local Version = require(script.Parent.Version) it("should compare equal versions", function() - expect(Version.compare({ 1, 2, 3 }, { 1, 2, 3 })).to.equal(0) - expect(Version.compare({ 1, 2, 3, "rc1" }, { 1, 2, 3, "rc1" })).to.equal(0) - expect(Version.compare({ 0, 4, 0 }, { 0, 4 })).to.equal(0) - expect(Version.compare({ 0, 0, 123 }, { 0, 0, 123 })).to.equal(0) - expect(Version.compare({ 26 }, { 26 })).to.equal(0) - expect(Version.compare({ 26, 42 }, { 26, 42 })).to.equal(0) - expect(Version.compare({ 1, 0, 0 }, { 1 })).to.equal(0) + expect(Version.compare({1, 2, 3}, {1, 2, 3})).to.equal(0) + expect(Version.compare({0, 4, 0}, {0, 4})).to.equal(0) + expect(Version.compare({0, 0, 123}, {0, 0, 123})).to.equal(0) + expect(Version.compare({26}, {26})).to.equal(0) + expect(Version.compare({26, 42}, {26, 42})).to.equal(0) + expect(Version.compare({1, 0, 0}, {1})).to.equal(0) end) it("should compare newer, older versions", function() - expect(Version.compare({ 1 }, { 0 })).to.equal(1) - expect(Version.compare({ 1, 1 }, { 1, 0 })).to.equal(1) - expect(Version.compare({ 1, 2, 3 }, { 1, 2, 0 })).to.equal(1) + expect(Version.compare({1}, {0})).to.equal(1) + expect(Version.compare({1, 1}, {1, 0})).to.equal(1) end) it("should compare different major versions", function() - expect(Version.compare({ 1, 3, 2 }, { 2, 2, 1 })).to.equal(-1) - expect(Version.compare({ 1, 2 }, { 2, 1 })).to.equal(-1) - expect(Version.compare({ 1 }, { 2 })).to.equal(-1) + expect(Version.compare({1, 3, 2}, {2, 2, 1})).to.equal(-1) + expect(Version.compare({1, 2}, {2, 1})).to.equal(-1) + expect(Version.compare({1}, {2})).to.equal(-1) end) it("should compare different minor versions", function() - expect(Version.compare({ 1, 2, 3 }, { 1, 3, 2 })).to.equal(-1) - expect(Version.compare({ 50, 1 }, { 50, 2 })).to.equal(-1) - end) - - it("should compare different patch versions", function() - expect(Version.compare({ 1, 1, 3 }, { 1, 1, 2 })).to.equal(1) - expect(Version.compare({ 1, 1, 2 }, { 1, 1, 3 })).to.equal(-1) - expect(Version.compare({ 1, 1, 3, "-rc1" }, { 1, 1, 2, "-rc2" })).to.equal(1) - expect(Version.compare({ 1, 1, 2, "-rc5" }, { 1, 1, 3, "-alpha" })).to.equal(-1) - end) - - it("should compare prerelease tags", function() - expect(Version.compare({ 1, 0, 0, "-alpha" }, { 1, 0, 0 })).to.equal(-1) - expect(Version.compare({ 1, 0, 0 }, { 1, 0, 0, "-alpha" })).to.equal(1) - expect(Version.compare({ 1, 0, 0, "-rc1" }, { 1, 0, 0, "-rc2" })).to.equal(-1) - expect(Version.compare({ 1, 0, 0, "-rc2" }, { 1, 0, 0, "-rc1" })).to.equal(1) - - -- Non number prereleases are not compared since that isn't meaningful - expect(Version.compare({ 1, 0, 0, "-alpha" }, { 1, 0, 0, "-beta" })).to.equal(0) - end) - - it("should parse version from strings", function() - local a = Version.parse("v1.0.0") - expect(a).to.be.ok() - expect(a[1]).to.equal(1) - expect(a[2]).to.equal(0) - expect(a[3]).to.equal(0) - expect(a[4]).to.equal(nil) - - local b = Version.parse("7.3.1-rc1") - expect(b).to.be.ok() - expect(b[1]).to.equal(7) - expect(b[2]).to.equal(3) - expect(b[3]).to.equal(1) - expect(b[4]).to.equal("-rc1") + expect(Version.compare({1, 2, 3}, {1, 3, 2})).to.equal(-1) + expect(Version.compare({50, 1}, {50, 2})).to.equal(-1) end) end diff --git a/plugin/src/createSignal.lua b/plugin/src/createSignal.lua new file mode 100644 index 00000000..965a452d --- /dev/null +++ b/plugin/src/createSignal.lua @@ -0,0 +1,53 @@ +--[[ + Create a new signal that can be connected to, disconnected from, and fired. + + Usage: + + local signal = createSignal() + local disconnect = signal:connect(function(...) + print("fired:", ...) + end) + + signal:fire("a", "b", "c") + disconnect() + + Avoids mutating listeners list directly to prevent iterator invalidation if + a listener is disconnected while the signal is firing. +]] +local function createSignal() + local listeners = {} + + local function connect(newListener) + local nextListeners = {} + for listener in pairs(listeners) do + nextListeners[listener] = true + end + + nextListeners[newListener] = true + listeners = nextListeners + + return function() + local nextListeners = {} + for listener in pairs(listeners) do + if listener ~= newListener then + nextListeners[listener] = true + end + end + + listeners = nextListeners + end + end + + local function fire(...) + for listener in pairs(listeners) do + listener(...) + end + end + + return { + connect = connect, + fire = fire, + } +end + +return createSignal \ No newline at end of file diff --git a/plugin/src/ignorePlaceIds.lua b/plugin/src/ignorePlaceIds.lua deleted file mode 100644 index cc3d1c28..00000000 --- a/plugin/src/ignorePlaceIds.lua +++ /dev/null @@ -1,27 +0,0 @@ ---[[ - These are place ids that will not have metadata saved for them, - such as last sync address or time. This is because they are not unique - so storing metadata for them does not make sense as these ids are reused. ---]] - -return { - ["0"] = true, -- Local file - ["95206881"] = true, -- Baseplate - ["6560363541"] = true, -- Classic Baseplate - ["95206192"] = true, -- Flat Terrain - ["13165709401"] = true, -- Modern City - ["520390648"] = true, -- Village - ["203810088"] = true, -- Castle - ["366130569"] = true, -- Suburban - ["215383192"] = true, -- Racing - ["264719325"] = true, -- Pirate Island - ["203812057"] = true, -- Obby - ["379736082"] = true, -- Starting Place - ["301530843"] = true, -- Line Runner - ["92721754"] = true, -- Capture The Flag - ["301529772"] = true, -- Team/FFA Arena - ["203885589"] = true, -- Combat - ["10275826693"] = true, -- Concert - ["5353920686"] = true, -- Move It Simulator - ["6936227200"] = true, -- Mansion Of Wonder -} diff --git a/plugin/src/init.server.lua b/plugin/src/init.server.lua index c14487ff..79e2b51a 100644 --- a/plugin/src/init.server.lua +++ b/plugin/src/init.server.lua @@ -2,24 +2,23 @@ if not plugin then return end -local Rojo = script:FindFirstAncestor("Rojo") -local Packages = Rojo.Packages +local Log = require(script.Parent.Log) -local Log = require(Packages.Log) -local Roact = require(Packages.Roact) +local DevSettings = require(script.DevSettings) + +Log.setLogLevelThunk(function() + return DevSettings:getLogLevel() +end) + +local Roact = require(script.Parent.Roact) -local Settings = require(script.Settings) local Config = require(script.Config) local App = require(script.App) -Log.setLogLevelThunk(function() - return Log.Level[Settings:get("logLevel")] or Log.Level.Info -end) - local app = Roact.createElement(App, { - plugin = plugin, + plugin = plugin }) -local tree = Roact.mount(app, game:GetService("CoreGui"), "Rojo UI") +local tree = Roact.mount(app, nil, "Rojo UI") plugin.Unloading:Connect(function() Roact.unmount(tree) @@ -29,4 +28,4 @@ if Config.isDevBuild then local TestEZ = require(script.Parent.TestEZ) require(script.runTests)(TestEZ) -end +end \ No newline at end of file diff --git a/plugin/src/init.spec.lua b/plugin/src/init.spec.lua index 4cf8947c..ad474338 100644 --- a/plugin/src/init.spec.lua +++ b/plugin/src/init.spec.lua @@ -2,10 +2,7 @@ return function() it("should load all submodules", function() local function loadRecursive(container) if container:IsA("ModuleScript") and not container.Name:find("%.spec$") then - local success, err = pcall(require, container) - if not success then - error(string.format("Failed to load '%s': %s", container.Name, err)) - end + require(container) end for _, child in ipairs(container:GetChildren()) do @@ -15,4 +12,4 @@ return function() loadRecursive(script.Parent) end) -end +end \ No newline at end of file diff --git a/plugin/src/invariant.lua b/plugin/src/invariant.lua index d1b7ccc8..7cb813b4 100644 --- a/plugin/src/invariant.lua +++ b/plugin/src/invariant.lua @@ -1,5 +1,4 @@ -local Packages = script.Parent.Parent.Packages -local Fmt = require(Packages.Fmt) +local Fmt = require(script.Parent.Parent.Fmt) local Config = require(script.Parent.Config) @@ -16,10 +15,10 @@ else message = Fmt.fmt(message, ...) local fullMessage = string.format( - "Rojo detected an invariant violation within itself:\n" - .. "%s\n\n" - .. "This is a bug in Rojo. Please file an issue:\n" - .. "https://github.com/rojo-rbx/rojo/issues", + "Rojo detected an invariant violation within itself:\n" .. + "%s\n\n" .. + "This is a bug in Rojo. Please file an issue:\n" .. + "https://github.com/rojo-rbx/rojo/issues", message ) @@ -27,4 +26,4 @@ else end end -return invariant +return invariant \ No newline at end of file diff --git a/plugin/src/orderSwaps.lua b/plugin/src/orderSwaps.lua deleted file mode 100644 index aa4a438e..00000000 --- a/plugin/src/orderSwaps.lua +++ /dev/null @@ -1,44 +0,0 @@ ---[[ - Determines the order in which `ServeSession:__replaceInstances` should swap - instances so that sibling order is preserved. - - Roblox appends to `GetChildren()` on every reparent, so the order in which we - re-parent replacements determines their final sibling order. To rebuild - `GetChildren()` exactly as it was before the swap we must: - - * process ancestors before descendants, so each replacement's parent already - exists when we re-parent the replacement, and - * process siblings in their original `GetChildren()` order. - - `swaps` is an array of `{ id, replacement, oldInstance }` entries. This sorts - the array in place (annotating each entry with `depth`/`siblingIndex`) and - returns it. -]] -local function orderSwaps(swaps) - for _, swap in swaps do - local depth = 0 - local ancestor = swap.oldInstance.Parent - while ancestor ~= nil do - depth += 1 - ancestor = ancestor.Parent - end - swap.depth = depth - - local siblingIndex = 0 - if swap.oldInstance.Parent ~= nil then - siblingIndex = table.find(swap.oldInstance.Parent:GetChildren(), swap.oldInstance) or 0 - end - swap.siblingIndex = siblingIndex - end - - table.sort(swaps, function(a, b) - if a.depth ~= b.depth then - return a.depth < b.depth - end - return a.siblingIndex < b.siblingIndex - end) - - return swaps -end - -return orderSwaps diff --git a/plugin/src/orderSwaps.spec.lua b/plugin/src/orderSwaps.spec.lua deleted file mode 100644 index 04c730fd..00000000 --- a/plugin/src/orderSwaps.spec.lua +++ /dev/null @@ -1,57 +0,0 @@ -return function() - local orderSwaps = require(script.Parent.orderSwaps) - - it("orders same-named siblings by their original GetChildren order", function() - local parent = Instance.new("Model") - local a1 = Instance.new("Part") - a1.Name = "a" - a1.Parent = parent - local a2 = Instance.new("Part") - a2.Name = "a" - a2.Parent = parent - local a3 = Instance.new("Part") - a3.Name = "a" - a3.Parent = parent - - -- Input deliberately out of sibling order. - -- orderSwaps must restore the GetChildren() order. - local ordered = orderSwaps({ - { id = "3", oldInstance = a3 }, - { id = "1", oldInstance = a1 }, - { id = "2", oldInstance = a2 }, - }) - - expect(ordered[1].oldInstance).to.equal(a1) - expect(ordered[2].oldInstance).to.equal(a2) - expect(ordered[3].oldInstance).to.equal(a3) - end) - - it("orders ancestors before descendants", function() - local root = Instance.new("Model") - local child = Instance.new("Folder") - child.Parent = root - local grandchild = Instance.new("Part") - grandchild.Parent = child - - local ordered = orderSwaps({ - { id = "grandchild", oldInstance = grandchild }, - { id = "child", oldInstance = child }, - { id = "root", oldInstance = root }, - }) - - expect(ordered[1].oldInstance).to.equal(root) - expect(ordered[2].oldInstance).to.equal(child) - expect(ordered[3].oldInstance).to.equal(grandchild) - end) - - it("returns a single swap unchanged", function() - local part = Instance.new("Part") - - local ordered = orderSwaps({ - { id = "1", oldInstance = part }, - }) - - expect(#ordered).to.equal(1) - expect(ordered[1].oldInstance).to.equal(part) - end) -end diff --git a/plugin/src/preloadAssets.lua b/plugin/src/preloadAssets.lua index 47c6d40b..edbc37d7 100644 --- a/plugin/src/preloadAssets.lua +++ b/plugin/src/preloadAssets.lua @@ -1,7 +1,6 @@ local ContentProvider = game:GetService("ContentProvider") -local Packages = script.Parent.Parent.Packages -local Log = require(Packages.Log) +local Log = require(script.Parent.Parent.Log) local Assets = require(script.Parent.Assets) @@ -9,11 +8,11 @@ local gatherAssetUrlsRecursive function gatherAssetUrlsRecursive(currentTable, currentUrls) currentUrls = currentUrls or {} - for _, value in currentTable do + for _, value in pairs(currentTable) do if typeof(value) == "string" then table.insert(currentUrls, value) elseif typeof(value) == "table" then - gatherAssetUrlsRecursive(value, currentUrls) + gatherAssetUrlsRecursive(value) end end @@ -30,4 +29,4 @@ local function preloadAssets() end)() end -return preloadAssets +return preloadAssets \ No newline at end of file diff --git a/plugin/src/runTests.lua b/plugin/src/runTests.lua index b2c7e231..ea6172c2 100644 --- a/plugin/src/runTests.lua +++ b/plugin/src/runTests.lua @@ -1,6 +1,5 @@ return function(TestEZ) local Rojo = script.Parent.Parent - local Packages = Rojo.Packages - TestEZ.TestBootstrap:run({ Rojo.Plugin, Packages.Http, Packages.Log, Packages.RbxDom }) -end + TestEZ.TestBootstrap:run({ Rojo.Plugin, Rojo.Http, Rojo.Log }) +end \ No newline at end of file diff --git a/plugin/src/soundPlayer.lua b/plugin/src/soundPlayer.lua deleted file mode 100644 index 32592720..00000000 --- a/plugin/src/soundPlayer.lua +++ /dev/null @@ -1,38 +0,0 @@ --- Sounds only play in Edit mode when parented to a plugin widget, for some reason -local plugin = plugin or script:FindFirstAncestorWhichIsA("Plugin") -local widget = nil -if plugin then - widget = plugin:CreateDockWidgetPluginGui( - "Rojo_soundPlayer", - DockWidgetPluginGuiInfo.new(Enum.InitialDockState.Float, false, true, 10, 10, 10, 10) - ) - widget.Name = "Rojo_soundPlayer" - widget.Title = "Rojo Sound Player" -end - -local SoundPlayer = {} -SoundPlayer.__index = SoundPlayer - -function SoundPlayer.new(settings) - return setmetatable({ - settings = settings, - }, SoundPlayer) -end - -function SoundPlayer:play(soundId) - if self.settings and self.settings:get("playSounds") == false then - return - end - - local sound = Instance.new("Sound") - sound.SoundId = soundId - sound.Parent = widget - - sound.Ended:Connect(function() - sound:Destroy() - end) - - sound:Play() -end - -return SoundPlayer diff --git a/plugin/src/strict.lua b/plugin/src/strict.lua index f50ea740..239c84a2 100644 --- a/plugin/src/strict.lua +++ b/plugin/src/strict.lua @@ -21,4 +21,4 @@ return function(nameOrTarget, target) else return strictInner("", target) end -end +end \ No newline at end of file diff --git a/plugin/src/timeUtil.lua b/plugin/src/timeUtil.lua deleted file mode 100644 index 280f72ef..00000000 --- a/plugin/src/timeUtil.lua +++ /dev/null @@ -1,31 +0,0 @@ -local timeUtil = {} - -timeUtil.AGE_UNITS = table.freeze({ - { 31556909, "year" }, - { 2629743, "month" }, - { 604800, "week" }, - { 86400, "day" }, - { 3600, "hour" }, - { 60, "minute" }, -}) - -function timeUtil.elapsedToText(elapsed: number): string - if elapsed < 3 then - return "just now" - end - - local ageText = string.format("%d seconds ago", elapsed) - - for _, UnitData in timeUtil.AGE_UNITS do - local UnitSeconds, UnitName = UnitData[1], UnitData[2] - if elapsed > UnitSeconds then - local c = math.floor(elapsed / UnitSeconds) - ageText = string.format("%d %s%s ago", c, UnitName, c > 1 and "s" or "") - break - end - end - - return ageText -end - -return timeUtil diff --git a/plugin/test b/plugin/test new file mode 100644 index 00000000..caeb8874 --- /dev/null +++ b/plugin/test @@ -0,0 +1,4 @@ +#!/bin/sh + +rojo build test-place.project.json -o TestPlace.rbxlx +run-in-roblox --script run-tests.server.lua --place TestPlace.rbxlx \ No newline at end of file diff --git a/plugin/test-place.project.json b/plugin/test-place.project.json index f4da9815..b75fcaae 100644 --- a/plugin/test-place.project.json +++ b/plugin/test-place.project.json @@ -5,11 +5,11 @@ "ReplicatedStorage": { "Rojo": { - "$path": "../plugin.project.json" + "$path": "default.project.json" }, - "Packages": { - "$path": "Packages" + "TestEZ": { + "$path": "modules/testez" } }, diff --git a/crates/rojo-insta-ext/Cargo.toml b/rojo-insta-ext/Cargo.toml similarity index 79% rename from crates/rojo-insta-ext/Cargo.toml rename to rojo-insta-ext/Cargo.toml index 55a86499..4471c4ac 100644 --- a/crates/rojo-insta-ext/Cargo.toml +++ b/rojo-insta-ext/Cargo.toml @@ -6,5 +6,5 @@ edition = "2018" publish = false [dependencies] -serde = "1.0.197" -serde_yaml = "0.8.26" +serde = "1.0.99" +serde_yaml = "0.8.9" diff --git a/crates/rojo-insta-ext/README.md b/rojo-insta-ext/README.md similarity index 100% rename from crates/rojo-insta-ext/README.md rename to rojo-insta-ext/README.md diff --git a/crates/rojo-insta-ext/src/lib.rs b/rojo-insta-ext/src/lib.rs similarity index 100% rename from crates/rojo-insta-ext/src/lib.rs rename to rojo-insta-ext/src/lib.rs diff --git a/crates/rojo-insta-ext/src/redaction_map.rs b/rojo-insta-ext/src/redaction_map.rs similarity index 90% rename from crates/rojo-insta-ext/src/redaction_map.rs rename to rojo-insta-ext/src/redaction_map.rs index 7f51775e..22574704 100644 --- a/crates/rojo-insta-ext/src/redaction_map.rs +++ b/rojo-insta-ext/src/redaction_map.rs @@ -5,13 +5,19 @@ use serde::Serialize; /// Enables redacting any value that serializes as a string. /// /// Used for transforming Rojo instance IDs into something deterministic. -#[derive(Default)] pub struct RedactionMap { ids: HashMap, last_id: usize, } impl RedactionMap { + pub fn new() -> Self { + Self { + ids: HashMap::new(), + last_id: 0, + } + } + pub fn get_redacted_value(&self, id: impl ToString) -> Option { let id = id.to_string(); @@ -22,12 +28,6 @@ impl RedactionMap { } } - /// Returns the numeric ID that was assigned to the provided value, - /// if one exists. - pub fn get_id_for_value(&self, value: impl ToString) -> Option { - self.ids.get(&value.to_string()).cloned() - } - pub fn intern(&mut self, id: impl ToString) { let last_id = &mut self.last_id; diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__attributes.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__attributes.snap deleted file mode 100644 index 04296e4e..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__attributes.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents ---- - - - - attributes - - - - Explicit - DQAAAAQAAABCb29sAwEKAAAAQnJpY2tDb2xvcg4BAAAABgAAAENvbG9yMw8AAAAAAAAAAAAAAAANAAAAQ29sb3JTZXF1ZW5jZRkCAAAAAAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAACAPwAAgD8AAIA/AACAPwcAAABGbG9hdDMyBQAAAAAHAAAARmxvYXQ2NAYAAAAAAAAAAAsAAABOdW1iZXJSYW5nZRsAAAAAAAAAAA4AAABOdW1iZXJTZXF1ZW5jZRcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD8AAAAABAAAAFJlY3QcAAAAAAAAAAAAAAAAAAAAAAQAAABVRGltCQAAAAAAAAAABQAAAFVEaW0yCgAAAAAAAAAAAAAAAAAAAAAHAAAAVmVjdG9yMhAAAAAAAAAAAAcAAABWZWN0b3IzEQAAAAAAAAAAAAAAAA== - - - - - Implicit - AwAAAAQAAABCb29sAwEGAAAATnVtYmVyBgAAAAAAAOA/BgAAAFN0cmluZwIEAAAAVGVzdA== - - - - - LegacyExplicit - AgAAAAUAAABIZWxsbwIFAAAAV29ybGQGAAAAVmVjdG9yEQAAgD8AAABAAABAQA== - - - - - LegacyImplicit - AgAAAAMAAABIZXkCBwAAAEdyYW5kbWEGAAAAVmVjdG9yEQAAgEAAAKBAAADAQA== - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_145.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_145.snap index 96cdc002..ab7470b3 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_145.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_145.snap @@ -10,7 +10,7 @@ expression: contents normal - [{"example":"A number demonstrating issue 145","key":"Count","source":"3","values":{"es":"7"}}] + [{"key":"Count","example":"A number demonstrating issue 145","source":"3","values":{"es":"7"}}] diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_147.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_147.snap index 8a668402..d16de20f 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_147.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_bug_147.snap @@ -10,7 +10,7 @@ expression: contents normal - [{"key":"Label.Opacity","source":"Opacity","values":{}},{"key":"Label.Thickness","source":"Thickness","values":{}},{"key":"Language.Name","source":"English","values":{}},{"key":"Language.Region","source":"United States","values":{}},{"key":"Toolbar.Camera","source":"Top-down camera","values":{}},{"key":"Toolbar.Mode.Pixel","source":"Pixel mode","values":{}},{"key":"Toolbar.Mode.Vector","source":"Vector mode","values":{}},{"key":"Toolbar.Preferences","source":"Settings","values":{}},{"key":"Toolbar.Redo","source":"Redo","values":{}},{"key":"Toolbar.Saves","source":"Saved drawings","values":{}},{"key":"Toolbar.Undo","source":"Undo","values":{}}] + [{"key":"Language.Name","source":"English","values":{}},{"key":"Language.Region","source":"United States","values":{}},{"key":"Label.Thickness","source":"Thickness","values":{}},{"key":"Label.Opacity","source":"Opacity","values":{}},{"key":"Toolbar.Undo","source":"Undo","values":{}},{"key":"Toolbar.Redo","source":"Redo","values":{}},{"key":"Toolbar.Camera","source":"Top-down camera","values":{}},{"key":"Toolbar.Saves","source":"Saved drawings","values":{}},{"key":"Toolbar.Preferences","source":"Settings","values":{}},{"key":"Toolbar.Mode.Vector","source":"Vector mode","values":{}},{"key":"Toolbar.Mode.Pixel","source":"Pixel mode","values":{}}] diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_in_folder.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_in_folder.snap index 40bc7ce5..d60fca02 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_in_folder.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__csv_in_folder.snap @@ -10,7 +10,7 @@ expression: contents normal - [{"example":"An exclamation of despair","key":"Ack","source":"Ack!","values":{"es":"¡Ay!"}}] + [{"key":"Ack","example":"An exclamation of despair","source":"Ack!","values":{"es":"¡Ay!"}}] diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__init_csv_with_children.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__init_csv_with_children.snap deleted file mode 100644 index c089ebb2..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__init_csv_with_children.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: tests/tests/build.rs -assertion_line: 100 -expression: contents ---- - - - - init_csv_with_children - [{"key":"init.csv","values":{}}] - - - - other - [{"key":"other.csv","values":{}}] - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__init_meta_class_name.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__init_meta_class_name.snap index cf9c2d2a..889fca12 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__init_meta_class_name.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__init_meta_class_name.snap @@ -6,7 +6,6 @@ expression: contents init_meta_class_name - false diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__issue_546.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__issue_546.snap deleted file mode 100644 index 3107344a..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__issue_546.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/tests/build.rs -assertion_line: 98 -expression: contents ---- - - - - issue_546 - true - print("Hello, world!") - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__nested_runcontext.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__nested_runcontext.snap deleted file mode 100644 index 0ddc3051..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__nested_runcontext.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents ---- - - - - nested_runcontext - - - - folder1 - - - - test - 1 - - - - - - - folder2 - - - - test - 0 - - - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_default_project.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_default_project.snap deleted file mode 100644 index fbbd4911..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_default_project.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents ---- - - - - top-level - - - - second-level - - - - third-level - 1337 - - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_project.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_project.snap deleted file mode 100644 index 58897933..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_project.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents ---- - - - - no_name_project - - - - second-level - - - - bool_value - true - - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_top_level_project.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_top_level_project.snap deleted file mode 100644 index 2f2e3d6a..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__no_name_top_level_project.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/build.rs -assertion_line: 107 -expression: contents ---- - - - - no_name_top_level_project - If this isn't named `no_name_top_level_project`, something went wrong! - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__plugin_init.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__plugin_init.snap deleted file mode 100644 index 40def8cd..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__plugin_init.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents ---- - - - - plugin_init - - - - lua - 3 - - - - - - luau - 3 - - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_in_folder.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_in_folder.snap index 5518a83d..db602853 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_in_folder.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_in_folder.snap @@ -1,6 +1,7 @@ --- source: tests/tests/build.rs expression: contents + --- @@ -24,7 +25,6 @@ expression: contents 0 1 - false null diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__script_meta_disabled.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__script_meta_disabled.snap index 28354bd6..0876056e 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__script_meta_disabled.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__script_meta_disabled.snap @@ -11,7 +11,6 @@ expression: contents hello true - 0 -- This script should be marked 'Disabled' diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__server_in_folder.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__server_in_folder.snap index c9806d00..282889d0 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__server_in_folder.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__server_in_folder.snap @@ -10,7 +10,6 @@ expression: contents serverScript - 0 -- This is a Lua server script diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__server_init.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__server_init.snap index 2bbda073..070b7012 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__server_init.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__server_init.snap @@ -6,8 +6,7 @@ expression: contents server_init - 0 - return "From folder/init.server.luau" + return "From folder/init.server.lua" diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_alone.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_alone.snap deleted file mode 100644 index 53e329cc..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_alone.snap +++ /dev/null @@ -1,18 +0,0 @@ ---- -source: tests/tests/build.rs -assertion_line: 102 -expression: contents ---- - - - - sync_rule_alone - - - - foo - Hello, world! - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_complex.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_complex.snap deleted file mode 100644 index e38050d8..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_complex.snap +++ /dev/null @@ -1,43 +0,0 @@ ---- -source: tests/tests/build.rs -assertion_line: 104 -expression: contents ---- - - - - sync_rule_complex - - - - bar - 0 - -- Hello, from bar (a Script)! - - - - - baz - -- Hello, from baz (a LocalScript)! - - - - - cat - Hello, from cat (a StringValue)! - - - - - foo - -- Hello, from foo (a ModuleScript)! - - - - - qux - Hello, from qux (a .rojo file that's turned into a StringValue)! - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_nested_projects.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_nested_projects.snap deleted file mode 100644 index 6867ac37..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__sync_rule_nested_projects.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/tests/build.rs -assertion_line: 104 -expression: contents ---- - - - - sync_rule_nested_projects - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__unresolved_values.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__unresolved_values.snap index 805b1d50..8b9eac0e 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__unresolved_values.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__unresolved_values.snap @@ -1,6 +1,7 @@ --- source: tests/tests/build.rs expression: contents + --- @@ -21,7 +22,6 @@ expression: contents Workspace - false diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__weldconstraint.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__weldconstraint.snap index 37819274..7a87112a 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__weldconstraint.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__weldconstraint.snap @@ -1,13 +1,14 @@ --- source: tests/tests/build.rs -assertion_line: 99 expression: contents + --- weldconstraint - + + -1 @@ -15,7 +16,8 @@ expression: contents A false - + + -0.5 0.5 0 @@ -106,7 +108,8 @@ expression: contents WeldConstraint - + + 7 0.000001013279 @@ -133,7 +136,8 @@ expression: contents B false - + + -0.5 0.5 0 diff --git a/rojo-test/build-tests/attributes/default.project.json b/rojo-test/build-tests/attributes/default.project.json deleted file mode 100644 index b9bb2d95..00000000 --- a/rojo-test/build-tests/attributes/default.project.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "name": "attributes", - "tree": { - "$className": "Folder", - - "Implicit": { - "$className": "Folder", - "$attributes": { - "Bool": true, - "Number": 0.5, - "String": "Test" - } - }, - - "Explicit": { - "$className": "Folder", - "$attributes": { - "Bool": { - "Bool": true - }, - "Float32": { - "Float32": 0 - }, - "Float64": { - "Float64": 0 - }, - "UDim": { - "UDim": [0, 0] - }, - "UDim2": { - "UDim2": [[0, 0], [0, 0]] - }, - "BrickColor": { - "BrickColor": 1 - }, - "Color3": { - "Color3": [0, 0, 0] - }, - "Vector2": { - "Vector2": [0, 0] - }, - "Vector3": { - "Vector3": [0, 0, 0] - }, - "NumberSequence": { - "NumberSequence": { - "keypoints": [ - { - "time": 0, - "value": 0, - "envelope": 0 - }, - { - "time": 1, - "value": 0, - "envelope": 0 - } - ] - } - }, - "ColorSequence": { - "ColorSequence": { - "keypoints": [ - { - "time": 0, - "color": [1, 1, 1] - }, - { - "time": 1, - "color": [1, 1, 1] - } - ] - } - }, - "NumberRange": { - "NumberRange": [0, 0] - }, - "Rect": { - "Rect": [[0, 0], [0, 0]] - } - } - }, - - "LegacyExplicit": { - "$className": "Folder", - "$properties": { - "Attributes": { - "Attributes": { - "Hello": { - "String": "World" - }, - "Vector": { - "Vector3": [1, 2, 3] - } - } - } - } - }, - - "LegacyImplicit": { - "$className": "Folder", - "$properties": { - "Attributes": { - "Hey": { - "String": "Grandma" - }, - "Vector": { - "Vector3": [4, 5, 6] - } - } - } - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/client_in_folder/folder/localScript.client.luau b/rojo-test/build-tests/client_in_folder/folder/localScript.client.lua similarity index 100% rename from rojo-test/build-tests/client_in_folder/folder/localScript.client.luau rename to rojo-test/build-tests/client_in_folder/folder/localScript.client.lua diff --git a/rojo-test/build-tests/init_csv_with_children/default.project.json b/rojo-test/build-tests/init_csv_with_children/default.project.json deleted file mode 100644 index 9b77db50..00000000 --- a/rojo-test/build-tests/init_csv_with_children/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "init_csv_with_children", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/init_csv_with_children/src/init.csv b/rojo-test/build-tests/init_csv_with_children/src/init.csv deleted file mode 100644 index a6bc3e7c..00000000 --- a/rojo-test/build-tests/init_csv_with_children/src/init.csv +++ /dev/null @@ -1,2 +0,0 @@ -Key -init.csv \ No newline at end of file diff --git a/rojo-test/build-tests/init_csv_with_children/src/other.csv b/rojo-test/build-tests/init_csv_with_children/src/other.csv deleted file mode 100644 index 0fc62b49..00000000 --- a/rojo-test/build-tests/init_csv_with_children/src/other.csv +++ /dev/null @@ -1,2 +0,0 @@ -Key -other.csv \ No newline at end of file diff --git a/rojo-test/build-tests/issue_546/README.md b/rojo-test/build-tests/issue_546/README.md deleted file mode 100644 index 7ccd95fa..00000000 --- a/rojo-test/build-tests/issue_546/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Issue #546 (https://github.com/rojo-rbx/rojo/issues/546) -Regression from Rojo 6.2.0 to Rojo 7.0.0. Meta files named as init.meta.json should apply after init.client.lua and other init files. \ No newline at end of file diff --git a/rojo-test/build-tests/issue_546/default.project.json b/rojo-test/build-tests/issue_546/default.project.json deleted file mode 100644 index 65c91a52..00000000 --- a/rojo-test/build-tests/issue_546/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "issue_546", - "tree": { - "$path": "hello" - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/issue_546/hello/init.client.lua b/rojo-test/build-tests/issue_546/hello/init.client.lua deleted file mode 100644 index 1385fe3e..00000000 --- a/rojo-test/build-tests/issue_546/hello/init.client.lua +++ /dev/null @@ -1 +0,0 @@ -print("Hello, world!") \ No newline at end of file diff --git a/rojo-test/build-tests/issue_546/hello/init.meta.json b/rojo-test/build-tests/issue_546/hello/init.meta.json deleted file mode 100644 index 54f46925..00000000 --- a/rojo-test/build-tests/issue_546/hello/init.meta.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "properties": { - "Disabled": true - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/nested_runcontext/default.project.json b/rojo-test/build-tests/nested_runcontext/default.project.json deleted file mode 100644 index 5327be9a..00000000 --- a/rojo-test/build-tests/nested_runcontext/default.project.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "nested_runcontext", - "emitLegacyScripts": false, - "tree": { - "$className": "Folder", - "folder1": { - "$path": "folder1" - }, - "folder2": { - "$path": "folder2" - } - } -} diff --git a/rojo-test/build-tests/nested_runcontext/folder1/test.server.luau b/rojo-test/build-tests/nested_runcontext/folder1/test.server.luau deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/build-tests/nested_runcontext/folder2/default.project.json b/rojo-test/build-tests/nested_runcontext/folder2/default.project.json deleted file mode 100644 index 67feff44..00000000 --- a/rojo-test/build-tests/nested_runcontext/folder2/default.project.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "nested_runcontext", - "emitLegacyScripts": true, - "tree": { - "$path": "folder3" - } -} diff --git a/rojo-test/build-tests/nested_runcontext/folder2/folder3/test.server.luau b/rojo-test/build-tests/nested_runcontext/folder2/folder3/test.server.luau deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/build-tests/no_name_default_project/default.project.json b/rojo-test/build-tests/no_name_default_project/default.project.json deleted file mode 100644 index 1c2a1400..00000000 --- a/rojo-test/build-tests/no_name_default_project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "top-level", - "tree": { - "$className": "Folder", - "second-level": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/no_name_default_project/src/third-level/default.project.json b/rojo-test/build-tests/no_name_default_project/src/third-level/default.project.json deleted file mode 100644 index e7b87be1..00000000 --- a/rojo-test/build-tests/no_name_default_project/src/third-level/default.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tree": { - "$className": "IntValue", - "$properties": { - "Value": 1337 - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/no_name_project/default.project.json b/rojo-test/build-tests/no_name_project/default.project.json deleted file mode 100644 index 93ef2e8c..00000000 --- a/rojo-test/build-tests/no_name_project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "no_name_project", - "tree": { - "$className": "Folder", - "second-level": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/no_name_project/src/bool_value.project.json b/rojo-test/build-tests/no_name_project/src/bool_value.project.json deleted file mode 100644 index 6be58a3c..00000000 --- a/rojo-test/build-tests/no_name_project/src/bool_value.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tree": { - "$className": "BoolValue", - "$properties": { - "Value": true - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/no_name_top_level_project/default.project.json b/rojo-test/build-tests/no_name_top_level_project/default.project.json deleted file mode 100644 index 845ae372..00000000 --- a/rojo-test/build-tests/no_name_top_level_project/default.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tree": { - "$className": "StringValue", - "$properties": { - "Value": "If this isn't named `no_name_top_level_project`, something went wrong!" - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/plugin_init/default.project.json b/rojo-test/build-tests/plugin_init/default.project.json deleted file mode 100644 index c683b506..00000000 --- a/rojo-test/build-tests/plugin_init/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "plugin_init", - "tree": { - "$path": "folder" - } -} diff --git a/rojo-test/build-tests/plugin_init/folder/lua/init.plugin.lua b/rojo-test/build-tests/plugin_init/folder/lua/init.plugin.lua deleted file mode 100644 index 9761a96d..00000000 --- a/rojo-test/build-tests/plugin_init/folder/lua/init.plugin.lua +++ /dev/null @@ -1 +0,0 @@ -return "From folder/lua/init.plugin.lua" diff --git a/rojo-test/build-tests/plugin_init/folder/luau/init.plugin.luau b/rojo-test/build-tests/plugin_init/folder/luau/init.plugin.luau deleted file mode 100644 index f5de5239..00000000 --- a/rojo-test/build-tests/plugin_init/folder/luau/init.plugin.luau +++ /dev/null @@ -1 +0,0 @@ -return "From folder/luau/init.plugin.luau" diff --git a/rojo-test/build-tests/script_meta_disabled/folder/hello.server.luau b/rojo-test/build-tests/script_meta_disabled/folder/hello.server.lua similarity index 100% rename from rojo-test/build-tests/script_meta_disabled/folder/hello.server.luau rename to rojo-test/build-tests/script_meta_disabled/folder/hello.server.lua diff --git a/rojo-test/build-tests/server_in_folder/folder/serverScript.server.luau b/rojo-test/build-tests/server_in_folder/folder/serverScript.server.lua similarity index 100% rename from rojo-test/build-tests/server_in_folder/folder/serverScript.server.luau rename to rojo-test/build-tests/server_in_folder/folder/serverScript.server.lua diff --git a/rojo-test/build-tests/server_init/folder/init.server.lua b/rojo-test/build-tests/server_init/folder/init.server.lua new file mode 100644 index 00000000..30d3d49a --- /dev/null +++ b/rojo-test/build-tests/server_init/folder/init.server.lua @@ -0,0 +1 @@ +return "From folder/init.server.lua" \ No newline at end of file diff --git a/rojo-test/build-tests/server_init/folder/init.server.luau b/rojo-test/build-tests/server_init/folder/init.server.luau deleted file mode 100644 index 196105d7..00000000 --- a/rojo-test/build-tests/server_init/folder/init.server.luau +++ /dev/null @@ -1 +0,0 @@ -return "From folder/init.server.luau" \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_alone/default.project.json b/rojo-test/build-tests/sync_rule_alone/default.project.json deleted file mode 100644 index f3a5aa34..00000000 --- a/rojo-test/build-tests/sync_rule_alone/default.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "sync_rule_alone", - "tree": { - "$path": "src" - }, - "syncRules": [ - { - "pattern": "*.nothing", - "use": "text" - } - ] -} \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_alone/src/foo.nothing b/rojo-test/build-tests/sync_rule_alone/src/foo.nothing deleted file mode 100644 index 5dd01c17..00000000 --- a/rojo-test/build-tests/sync_rule_alone/src/foo.nothing +++ /dev/null @@ -1 +0,0 @@ -Hello, world! \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_complex/default.project.json b/rojo-test/build-tests/sync_rule_complex/default.project.json deleted file mode 100644 index 62764bb4..00000000 --- a/rojo-test/build-tests/sync_rule_complex/default.project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "sync_rule_complex", - "tree": { - "$path": "src" - }, - "syncRules": [ - { - "pattern": "*.module", - "use": "moduleScript" - }, - { - "pattern": "*.server", - "use": "serverScript" - }, - { - "pattern": "*.client", - "use": "clientScript" - }, - { - "pattern": "*.rojo", - "exclude": "*.ignore.rojo", - "use": "project" - }, - { - "pattern": "*.dog.rojo2", - "use": "text", - "suffix": ".dog.rojo2" - } - ] -} \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_complex/src/bar.server b/rojo-test/build-tests/sync_rule_complex/src/bar.server deleted file mode 100644 index e860bd77..00000000 --- a/rojo-test/build-tests/sync_rule_complex/src/bar.server +++ /dev/null @@ -1 +0,0 @@ --- Hello, from bar (a Script)! \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_complex/src/baz.client b/rojo-test/build-tests/sync_rule_complex/src/baz.client deleted file mode 100644 index 4326a2a4..00000000 --- a/rojo-test/build-tests/sync_rule_complex/src/baz.client +++ /dev/null @@ -1 +0,0 @@ --- Hello, from baz (a LocalScript)! \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_complex/src/cat.dog.rojo2 b/rojo-test/build-tests/sync_rule_complex/src/cat.dog.rojo2 deleted file mode 100644 index e185da86..00000000 --- a/rojo-test/build-tests/sync_rule_complex/src/cat.dog.rojo2 +++ /dev/null @@ -1 +0,0 @@ -Hello, from cat (a StringValue)! \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_complex/src/foo.module b/rojo-test/build-tests/sync_rule_complex/src/foo.module deleted file mode 100644 index 3a55f9b2..00000000 --- a/rojo-test/build-tests/sync_rule_complex/src/foo.module +++ /dev/null @@ -1 +0,0 @@ --- Hello, from foo (a ModuleScript)! \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_complex/src/qux.rojo b/rojo-test/build-tests/sync_rule_complex/src/qux.rojo deleted file mode 100644 index 7153477d..00000000 --- a/rojo-test/build-tests/sync_rule_complex/src/qux.rojo +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "qux", - "tree": { - "$className": "StringValue", - "$properties": { - "Value": "Hello, from qux (a .rojo file that's turned into a StringValue)!" - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_complex/src/rat.ignore.rojo b/rojo-test/build-tests/sync_rule_complex/src/rat.ignore.rojo deleted file mode 100644 index d80a8cc8..00000000 --- a/rojo-test/build-tests/sync_rule_complex/src/rat.ignore.rojo +++ /dev/null @@ -1 +0,0 @@ -This file should be ignored! \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_nested_projects/default.project.json b/rojo-test/build-tests/sync_rule_nested_projects/default.project.json deleted file mode 100644 index 1b6193bb..00000000 --- a/rojo-test/build-tests/sync_rule_nested_projects/default.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "sync_rule_nested_projects", - "tree": { - "$path": "nested.project.json" - }, - "syncRules": [ - { - "pattern": "*.rojo", - "use": "text" - } - ] -} \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_nested_projects/nested.project.json b/rojo-test/build-tests/sync_rule_nested_projects/nested.project.json deleted file mode 100644 index 3c5fea2c..00000000 --- a/rojo-test/build-tests/sync_rule_nested_projects/nested.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "nested", - "tree": { - "$path": "src" - }, - "syncRules": [ - { - "pattern": "*.txt", - "use": "ignore" - } - ] -} \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_nested_projects/src/ignored.rojo b/rojo-test/build-tests/sync_rule_nested_projects/src/ignored.rojo deleted file mode 100644 index d7ed8b4f..00000000 --- a/rojo-test/build-tests/sync_rule_nested_projects/src/ignored.rojo +++ /dev/null @@ -1 +0,0 @@ -This shouldn't be in the built file. If it is, something is wrong. \ No newline at end of file diff --git a/rojo-test/build-tests/sync_rule_nested_projects/src/ignored.txt b/rojo-test/build-tests/sync_rule_nested_projects/src/ignored.txt deleted file mode 100644 index d7ed8b4f..00000000 --- a/rojo-test/build-tests/sync_rule_nested_projects/src/ignored.txt +++ /dev/null @@ -1 +0,0 @@ -This shouldn't be in the built file. If it is, something is wrong. \ No newline at end of file diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap index 4de31360..95be56ed 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_info.snap @@ -1,13 +1,14 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: add_folder -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap index 4a724f1e..09d4512c 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_subscribe.snap @@ -1,21 +1,19 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" --- -body: - messageCursor: 1 - messages: - - added: - id-3: - Children: [] - ClassName: Folder - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: my-new-folder - Parent: id-2 - Properties: {} - removed: [] - updated: [] -packetType: messages +messageCursor: 1 +messages: + - added: + id-3: + Children: [] + ClassName: Folder + Id: id-3 + Metadata: + ignoreUnknownInstances: false + Name: my-new-folder + Parent: id-2 + Properties: {} + removed: [] + updated: [] sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder.snap index 4107de74..42a31374 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder.snap @@ -7,7 +7,7 @@ expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: optional -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap index 97f5fc9c..53400451 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_info.snap @@ -1,13 +1,14 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: edit_init -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_subscribe.snap index 32a266ea..cef27f2c 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_subscribe.snap @@ -1,19 +1,19 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" + --- -body: - messageCursor: 1 - messages: - - added: {} - removed: [] - updated: - - changedClassName: ~ - changedMetadata: ~ - changedName: ~ - changedProperties: - Source: - String: "-- Edited contents" - id: id-2 -packetType: messages +messageCursor: 1 +messages: + - added: {} + removed: [] + updated: + - changedClassName: ~ + changedMetadata: ~ + changedName: ~ + changedProperties: + Source: + String: "-- Edited contents" + id: id-2 sessionId: id-1 + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap index bb9159c5..dd97da1a 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_info.snap @@ -1,13 +1,14 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: empty -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all-2.snap index b6ccce20..6f02d667 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all-2.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all-2.snap @@ -1,6 +1,7 @@ --- source: tests/tests/serve.rs expression: "read_response.intern_and_redact(&mut redactions, root_id)" + --- instances: id-2: @@ -21,8 +22,7 @@ instances: ignoreUnknownInstances: false Name: test Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false + Properties: {} messageCursor: 1 sessionId: id-1 + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap index 0e5958ac..70168b53 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap @@ -1,13 +1,14 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: empty_folder -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_subscribe.snap index 74ce73a2..bb747b86 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_subscribe.snap @@ -1,23 +1,21 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" + --- -body: - messageCursor: 1 - messages: - - added: - id-3: - Children: [] - ClassName: Model - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: test - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - removed: [] - updated: [] -packetType: messages +messageCursor: 1 +messages: + - added: + id-3: + Children: [] + ClassName: Model + Id: id-3 + Metadata: + ignoreUnknownInstances: false + Name: test + Parent: id-2 + Properties: {} + removed: [] + updated: [] sessionId: id-1 + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_all.snap deleted file mode 100644 index 1f5d934b..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_all.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: [] - ClassName: Attachment - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: forced_parent - Parent: "00000000000000000000000000000000" - Properties: {} -messageCursor: 0 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_info.snap deleted file mode 100644 index 91712fcc..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(&info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: forced_parent -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_serialize_model.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_serialize_model.snap deleted file mode 100644 index a0a17963..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__forced_parent_serialize_model.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: model ---- - - - - Folder - - - - id-2 - 2 - - - - Part - - - - forced_parent - - - - - - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_all.snap deleted file mode 100644 index b264882c..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_all.snap +++ /dev/null @@ -1,58 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: DataModel - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: meshpart - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - ClassName: Workspace - Id: id-3 - Metadata: - ignoreUnknownInstances: true - Name: Workspace - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - id-4: - Children: [] - ClassName: ObjectValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: ObjectValue - Parent: id-3 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: sword - Value: - Ref: id-5 - id-5: - Children: [] - ClassName: MeshPart - Id: id-5 - Metadata: - ignoreUnknownInstances: true - Name: Sword - Parent: id-3 - Properties: - MeshId: - ContentId: "rbxasset://fonts/sword.mesh" - TextureID: - ContentId: "rbxasset://textures/SwordTexture.png" -messageCursor: 0 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_info.snap deleted file mode 100644 index 0de57dcb..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(&info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: meshpart -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_serialize_model.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_serialize_model.snap deleted file mode 100644 index dae16506..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__meshpart_with_id_serialize_model.snap +++ /dev/null @@ -1,43 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: model ---- - - - - Folder - - - - id-5 - - 2 - - - - Sword - - rbxasset://fonts/sword.mesh - - - rbxasset://textures/SwordTexture.png - - - - - - - id-4 - - 4 - - - - ObjectValue - AQAAABEAAABSb2pvX1RhcmdldF9WYWx1ZQIFAAAAc3dvcmQ= - null - - - - - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__model_pivot_migration_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__model_pivot_migration_all-2.snap deleted file mode 100644 index e69d71f4..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__model_pivot_migration_all-2.snap +++ /dev/null @@ -1,64 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: DataModel - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: pivot_migration - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - - id-6 - ClassName: Workspace - Id: id-3 - Metadata: - ignoreUnknownInstances: true - Name: Workspace - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - id-4: - Children: [] - ClassName: Model - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: Model - Parent: id-3 - Properties: - NeedsPivotMigration: - Bool: false - id-5: - Children: [] - ClassName: Tool - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: Tool - Parent: id-3 - Properties: - NeedsPivotMigration: - Bool: false - id-6: - Children: [] - ClassName: Actor - Id: id-6 - Metadata: - ignoreUnknownInstances: true - Name: Actor - Parent: id-3 - Properties: - NeedsPivotMigration: - Bool: false -messageCursor: 1 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__model_pivot_migration_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__model_pivot_migration_all.snap deleted file mode 100644 index 9b7a6045..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__model_pivot_migration_all.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" ---- -body: - messageCursor: 1 - messages: - - added: - id-6: - Children: [] - ClassName: Actor - Id: id-6 - Metadata: - ignoreUnknownInstances: true - Name: Actor - Parent: id-3 - Properties: - NeedsPivotMigration: - Bool: false - removed: [] - updated: - - changedClassName: ~ - changedMetadata: - ignoreUnknownInstances: true - changedName: ~ - changedProperties: {} - id: id-3 -packetType: messages -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap index 692bae6f..9aefc12e 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_info.snap @@ -1,13 +1,14 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: move_folder_of_stuff -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_subscribe.snap index 547ddd58..40afc888 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_subscribe.snap @@ -1,141 +1,141 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" + --- -body: - messageCursor: 1 - messages: - - added: - id-10: - Children: [] - ClassName: StringValue - Id: id-10 - Metadata: - ignoreUnknownInstances: false - Name: "6" - Parent: id-3 - Properties: - Value: - String: "File #6" - id-11: - Children: [] - ClassName: StringValue - Id: id-11 - Metadata: - ignoreUnknownInstances: false - Name: "7" - Parent: id-3 - Properties: - Value: - String: "File #7" - id-12: - Children: [] - ClassName: StringValue - Id: id-12 - Metadata: - ignoreUnknownInstances: false - Name: "8" - Parent: id-3 - Properties: - Value: - String: "File #8" - id-13: - Children: [] - ClassName: StringValue - Id: id-13 - Metadata: - ignoreUnknownInstances: false - Name: "9" - Parent: id-3 - Properties: - Value: - String: "File #9" - id-3: - Children: - - id-4 - - id-5 - - id-6 - - id-7 - - id-8 - - id-9 - - id-10 - - id-11 - - id-12 - - id-13 - ClassName: Folder - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: new-stuff - Parent: id-2 - Properties: {} - id-4: - Children: [] - ClassName: StringValue - Id: id-4 - Metadata: - ignoreUnknownInstances: false - Name: "0" - Parent: id-3 - Properties: - Value: - String: "File #0" - id-5: - Children: [] - ClassName: StringValue - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: "1" - Parent: id-3 - Properties: - Value: - String: "File #1" - id-6: - Children: [] - ClassName: StringValue - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: "2" - Parent: id-3 - Properties: - Value: - String: "File #2" - id-7: - Children: [] - ClassName: StringValue - Id: id-7 - Metadata: - ignoreUnknownInstances: false - Name: "3" - Parent: id-3 - Properties: - Value: - String: "File #3" - id-8: - Children: [] - ClassName: StringValue - Id: id-8 - Metadata: - ignoreUnknownInstances: false - Name: "4" - Parent: id-3 - Properties: - Value: - String: "File #4" - id-9: - Children: [] - ClassName: StringValue - Id: id-9 - Metadata: - ignoreUnknownInstances: false - Name: "5" - Parent: id-3 - Properties: - Value: - String: "File #5" - removed: [] - updated: [] -packetType: messages +messageCursor: 1 +messages: + - added: + id-10: + Children: [] + ClassName: StringValue + Id: id-10 + Metadata: + ignoreUnknownInstances: false + Name: "6" + Parent: id-3 + Properties: + Value: + String: "File #6" + id-11: + Children: [] + ClassName: StringValue + Id: id-11 + Metadata: + ignoreUnknownInstances: false + Name: "7" + Parent: id-3 + Properties: + Value: + String: "File #7" + id-12: + Children: [] + ClassName: StringValue + Id: id-12 + Metadata: + ignoreUnknownInstances: false + Name: "8" + Parent: id-3 + Properties: + Value: + String: "File #8" + id-13: + Children: [] + ClassName: StringValue + Id: id-13 + Metadata: + ignoreUnknownInstances: false + Name: "9" + Parent: id-3 + Properties: + Value: + String: "File #9" + id-3: + Children: + - id-4 + - id-5 + - id-6 + - id-7 + - id-8 + - id-9 + - id-10 + - id-11 + - id-12 + - id-13 + ClassName: Folder + Id: id-3 + Metadata: + ignoreUnknownInstances: false + Name: new-stuff + Parent: id-2 + Properties: {} + id-4: + Children: [] + ClassName: StringValue + Id: id-4 + Metadata: + ignoreUnknownInstances: false + Name: "0" + Parent: id-3 + Properties: + Value: + String: "File #0" + id-5: + Children: [] + ClassName: StringValue + Id: id-5 + Metadata: + ignoreUnknownInstances: false + Name: "1" + Parent: id-3 + Properties: + Value: + String: "File #1" + id-6: + Children: [] + ClassName: StringValue + Id: id-6 + Metadata: + ignoreUnknownInstances: false + Name: "2" + Parent: id-3 + Properties: + Value: + String: "File #2" + id-7: + Children: [] + ClassName: StringValue + Id: id-7 + Metadata: + ignoreUnknownInstances: false + Name: "3" + Parent: id-3 + Properties: + Value: + String: "File #3" + id-8: + Children: [] + ClassName: StringValue + Id: id-8 + Metadata: + ignoreUnknownInstances: false + Name: "4" + Parent: id-3 + Properties: + Value: + String: "File #4" + id-9: + Children: [] + ClassName: StringValue + Id: id-9 + Metadata: + ignoreUnknownInstances: false + Name: "5" + Parent: id-3 + Properties: + Value: + String: "File #5" + removed: [] + updated: [] sessionId: id-1 + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_all.snap deleted file mode 100644 index a8179a91..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_all.snap +++ /dev/null @@ -1,39 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: top-level - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - ClassName: Folder - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: second-level - Parent: id-2 - Properties: {} - id-4: - Children: [] - ClassName: IntValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: third-level - Parent: id-3 - Properties: - Value: - Int64: 1337 -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_info.snap deleted file mode 100644 index f8f2e14e..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_default_project_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: top-level -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_all.snap deleted file mode 100644 index 1b398a92..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_all.snap +++ /dev/null @@ -1,40 +0,0 @@ ---- -source: tests/tests/serve.rs -assertion_line: 338 -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: no_name_project - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - ClassName: Folder - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: second-level - Parent: id-2 - Properties: {} - id-4: - Children: [] - ClassName: BoolValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: bool_value - Parent: id-3 - Properties: - Value: - Bool: true -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_info.snap deleted file mode 100644 index f7018efe..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_project_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: no_name_project -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_all-2.snap deleted file mode 100644 index 2941eea8..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_all-2.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: tests/tests/serve.rs -assertion_line: 370 -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: [] - ClassName: StringValue - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: no_name_top_level_project - Parent: "00000000000000000000000000000000" - Properties: - Value: - String: "If this isn't named `no_name_top_level_project`, something went wrong!" -messageCursor: 0 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_all.snap deleted file mode 100644 index ea52fe4b..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_all.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: tests/tests/serve.rs -assertion_line: 357 -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: [] - ClassName: StringValue - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: no_name_top_level_project - Parent: "00000000000000000000000000000000" - Properties: - Value: - String: "If this isn't named `no_name_top_level_project`, something went wrong!" -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_info.snap deleted file mode 100644 index 040c02f2..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__no_name_top_level_project_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: no_name_top_level_project -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__pivot_migration_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__pivot_migration_all.snap deleted file mode 100644 index 7e47619d..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__pivot_migration_all.snap +++ /dev/null @@ -1,52 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: DataModel - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: pivot_migration - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - ClassName: Workspace - Id: id-3 - Metadata: - ignoreUnknownInstances: true - Name: Workspace - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - id-4: - Children: [] - ClassName: Model - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: Model - Parent: id-3 - Properties: - NeedsPivotMigration: - Bool: false - id-5: - Children: [] - ClassName: Tool - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: Tool - Parent: id-3 - Properties: - NeedsPivotMigration: - Bool: false -messageCursor: 0 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__pivot_migration_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__pivot_migration_info.snap deleted file mode 100644 index a7e293b7..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__pivot_migration_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: pivot_migration -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_all-2.snap deleted file mode 100644 index 7f895b96..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_all-2.snap +++ /dev/null @@ -1,146 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-10: - Children: [] - ClassName: ObjectValue - Id: id-10 - Metadata: - ignoreUnknownInstances: true - Name: ProjectPointer - Parent: id-9 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: project target - Value: - Ref: id-9 - id-11: - Children: [] - ClassName: Model - Id: id-11 - Metadata: - ignoreUnknownInstances: false - Name: ProjectPointer - Parent: id-7 - Properties: - Attributes: - Attributes: - Rojo_Target_PrimaryPart: - String: project target - NeedsPivotMigration: - Bool: false - PrimaryPart: - Ref: id-9 - id-2: - Children: - - id-3 - ClassName: DataModel - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: ref_properties - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - - id-7 - - id-9 - ClassName: Workspace - Id: id-3 - Metadata: - ignoreUnknownInstances: true - Name: Workspace - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - id-4: - Children: [] - ClassName: ObjectValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: CrossFormatPointer - Parent: id-3 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-5: - Children: - - id-6 - ClassName: Folder - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: FolderTarget - Parent: id-3 - Properties: {} - id-6: - Children: [] - ClassName: ObjectValue - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: FolderPointer - Parent: id-5 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-7: - Children: - - id-8 - - id-11 - ClassName: Folder - Id: id-7 - Metadata: - ignoreUnknownInstances: false - Name: ModelTarget - Parent: id-3 - Properties: - Attributes: - Attributes: - Rojo_Id: - String: model target 2 - id-8: - Children: [] - ClassName: Model - Id: id-8 - Metadata: - ignoreUnknownInstances: false - Name: ModelPointer - Parent: id-7 - Properties: - Attributes: - Attributes: - Rojo_Target_PrimaryPart: - String: model target 2 - NeedsPivotMigration: - Bool: false - PrimaryPart: - Ref: id-7 - id-9: - Children: - - id-10 - ClassName: Folder - Id: id-9 - Metadata: - ignoreUnknownInstances: true - Name: ProjectTarget - Parent: id-3 - Properties: {} -messageCursor: 1 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_all.snap deleted file mode 100644 index 26e1914d..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_all.snap +++ /dev/null @@ -1,124 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-10: - Children: [] - ClassName: ObjectValue - Id: id-10 - Metadata: - ignoreUnknownInstances: true - Name: ProjectPointer - Parent: id-9 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: project target - Value: - Ref: id-9 - id-2: - Children: - - id-3 - ClassName: DataModel - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: ref_properties - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - - id-7 - - id-9 - ClassName: Workspace - Id: id-3 - Metadata: - ignoreUnknownInstances: true - Name: Workspace - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - id-4: - Children: [] - ClassName: ObjectValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: CrossFormatPointer - Parent: id-3 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-5: - Children: - - id-6 - ClassName: Folder - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: FolderTarget - Parent: id-3 - Properties: {} - id-6: - Children: [] - ClassName: ObjectValue - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: FolderPointer - Parent: id-5 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-7: - Children: - - id-8 - ClassName: Folder - Id: id-7 - Metadata: - ignoreUnknownInstances: false - Name: ModelTarget - Parent: id-3 - Properties: {} - id-8: - Children: [] - ClassName: Model - Id: id-8 - Metadata: - ignoreUnknownInstances: false - Name: ModelPointer - Parent: id-7 - Properties: - Attributes: - Attributes: - Rojo_Target_PrimaryPart: - String: model target - NeedsPivotMigration: - Bool: false - PrimaryPart: - Ref: id-7 - id-9: - Children: - - id-10 - ClassName: Folder - Id: id-9 - Metadata: - ignoreUnknownInstances: true - Name: ProjectTarget - Parent: id-3 - Properties: {} -messageCursor: 0 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_info.snap deleted file mode 100644 index 8777473c..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: ref_properties -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_all-2.snap deleted file mode 100644 index da499167..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_all-2.snap +++ /dev/null @@ -1,126 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-10: - Children: [] - ClassName: ObjectValue - Id: id-10 - Metadata: - ignoreUnknownInstances: true - Name: ProjectPointer - Parent: id-9 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: project target - Value: - Ref: id-9 - id-2: - Children: - - id-3 - ClassName: DataModel - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: ref_properties - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - - id-7 - - id-9 - ClassName: Workspace - Id: id-3 - Metadata: - ignoreUnknownInstances: true - Name: Workspace - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - id-4: - Children: [] - ClassName: ObjectValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: CrossFormatPointer - Parent: id-3 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-5: - Children: - - id-6 - ClassName: Folder - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: FolderTarget - Parent: id-3 - Properties: {} - id-6: - Children: [] - ClassName: ObjectValue - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: FolderPointer - Parent: id-5 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-7: - Children: - - id-8 - ClassName: Folder - Id: id-7 - Metadata: - ignoreUnknownInstances: false - Name: ModelTarget - Parent: id-3 - Properties: {} - id-8: - Children: [] - ClassName: Model - Id: id-8 - Metadata: - ignoreUnknownInstances: false - Name: ModelPointer - Parent: id-7 - Properties: - Attributes: - Attributes: - Rojo_Target_PrimaryPart: - String: model target - NeedsPivotMigration: - Bool: false - PrimaryPart: - Ref: id-7 - Scale: - Float32: 1 - id-9: - Children: - - id-10 - ClassName: Folder - Id: id-9 - Metadata: - ignoreUnknownInstances: true - Name: ProjectTarget - Parent: id-3 - Properties: {} -messageCursor: 1 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_all.snap deleted file mode 100644 index 26e1914d..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_all.snap +++ /dev/null @@ -1,124 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-10: - Children: [] - ClassName: ObjectValue - Id: id-10 - Metadata: - ignoreUnknownInstances: true - Name: ProjectPointer - Parent: id-9 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: project target - Value: - Ref: id-9 - id-2: - Children: - - id-3 - ClassName: DataModel - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: ref_properties - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - - id-7 - - id-9 - ClassName: Workspace - Id: id-3 - Metadata: - ignoreUnknownInstances: true - Name: Workspace - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false - id-4: - Children: [] - ClassName: ObjectValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: CrossFormatPointer - Parent: id-3 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-5: - Children: - - id-6 - ClassName: Folder - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: FolderTarget - Parent: id-3 - Properties: {} - id-6: - Children: [] - ClassName: ObjectValue - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: FolderPointer - Parent: id-5 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: folder target - Value: - Ref: id-5 - id-7: - Children: - - id-8 - ClassName: Folder - Id: id-7 - Metadata: - ignoreUnknownInstances: false - Name: ModelTarget - Parent: id-3 - Properties: {} - id-8: - Children: [] - ClassName: Model - Id: id-8 - Metadata: - ignoreUnknownInstances: false - Name: ModelPointer - Parent: id-7 - Properties: - Attributes: - Attributes: - Rojo_Target_PrimaryPart: - String: model target - NeedsPivotMigration: - Bool: false - PrimaryPart: - Ref: id-7 - id-9: - Children: - - id-10 - ClassName: Folder - Id: id-9 - Metadata: - ignoreUnknownInstances: true - Name: ProjectTarget - Parent: id-3 - Properties: {} -messageCursor: 0 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_info.snap deleted file mode 100644 index 8777473c..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: ref_properties -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_subscribe.snap deleted file mode 100644 index 1aac7624..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_patch_update_subscribe.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" ---- -body: - messageCursor: 1 - messages: - - added: {} - removed: [] - updated: - - changedClassName: ~ - changedMetadata: ~ - changedName: ~ - changedProperties: - Scale: - Float32: 1 - id: id-8 -packetType: messages -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_all-2.snap deleted file mode 100644 index e548f010..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_all-2.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: false - Name: ref_properties_remove - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: [] - ClassName: ObjectValue - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: pointer - Parent: id-2 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: test pointer - Value: - Ref: id-4 -messageCursor: 1 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_all.snap deleted file mode 100644 index 407670da..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_all.snap +++ /dev/null @@ -1,47 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - - id-4 - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: false - Name: ref_properties_remove - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: [] - ClassName: ObjectValue - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: pointer - Parent: id-2 - Properties: - Attributes: - Attributes: - Rojo_Target_Value: - String: test pointer - Value: - Ref: id-4 - id-4: - Children: [] - ClassName: ObjectValue - Id: id-4 - Metadata: - ignoreUnknownInstances: false - Name: target - Parent: id-2 - Properties: - Attributes: - Attributes: - Rojo_Id: - String: test pointer -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_info.snap deleted file mode 100644 index bb598446..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: ref_properties_remove -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_subscribe.snap deleted file mode 100644 index b03e68dc..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_remove_subscribe.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" ---- -body: - messageCursor: 1 - messages: - - added: {} - removed: - - id-4 - updated: [] -packetType: messages -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_subscribe.snap deleted file mode 100644 index b601ae47..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__ref_properties_subscribe.snap +++ /dev/null @@ -1,49 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" ---- -body: - messageCursor: 1 - messages: - - added: - id-11: - Children: [] - ClassName: Model - Id: id-11 - Metadata: - ignoreUnknownInstances: false - Name: ProjectPointer - Parent: id-7 - Properties: - Attributes: - Attributes: - Rojo_Target_PrimaryPart: - String: project target - NeedsPivotMigration: - Bool: false - PrimaryPart: - Ref: id-9 - removed: [] - updated: - - changedClassName: ~ - changedMetadata: - ignoreUnknownInstances: false - changedName: ~ - changedProperties: - Attributes: - Attributes: - Rojo_Id: - String: model target 2 - id: id-7 - - changedClassName: ~ - changedMetadata: ~ - changedName: ~ - changedProperties: - Attributes: - Attributes: - Rojo_Target_PrimaryPart: - String: model target 2 - PrimaryPart: ~ - id: id-8 -packetType: messages -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap index a1a8a801..29404cd8 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_info.snap @@ -1,13 +1,14 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: remove_file -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap index e9e39e04..e70d17f9 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_subscribe.snap @@ -1,13 +1,11 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" --- -body: - messageCursor: 1 - messages: - - added: {} - removed: - - id-3 - updated: [] -packetType: messages +messageCursor: 1 +messages: + - added: {} + removed: + - id-3 + updated: [] sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all-2.snap index 49d8148b..78dcebea 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all-2.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all-2.snap @@ -24,8 +24,6 @@ instances: Name: bar Parent: id-2 Properties: - RunContext: - Enum: 0 Source: String: "-- Hello, from bar!" id-4: diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all.snap index 62e5ceef..52efebac 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_all.snap @@ -24,8 +24,6 @@ instances: Name: bar Parent: id-2 Properties: - RunContext: - Enum: 0 Source: String: "-- Hello, from bar!" id-4: diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap index cead5d7f..19bc473f 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_info.snap @@ -1,13 +1,14 @@ --- source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) + --- expectedPlaceIds: ~ gameId: ~ placeId: ~ projectName: scripts -protocolVersion: 5 +protocolVersion: 4 rootInstanceId: id-2 serverVersion: "[server-version]" sessionId: id-1 -unexpectedPlaceIds: ~ + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_subscribe.snap index d4050101..19bea59e 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_subscribe.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__scripts_subscribe.snap @@ -1,19 +1,19 @@ --- source: tests/tests/serve.rs -expression: "socket_packet.intern_and_redact(&mut redactions, ())" +expression: "subscribe_response.intern_and_redact(&mut redactions, ())" + --- -body: - messageCursor: 1 - messages: - - added: {} - removed: [] - updated: - - changedClassName: ~ - changedMetadata: ~ - changedName: ~ - changedProperties: - Source: - String: Updated foo! - id: id-4 -packetType: messages +messageCursor: 1 +messages: + - added: {} + removed: [] + updated: + - changedClassName: ~ + changedMetadata: ~ + changedName: ~ + changedProperties: + Source: + String: Updated foo! + id: id-4 sessionId: id-1 + diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_all.snap deleted file mode 100644 index e4fa4adf..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_all.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: tests/tests/serve.rs -assertion_line: 268 -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: false - Name: sync_rule_alone - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: [] - ClassName: StringValue - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: foo - Parent: id-2 - Properties: - Value: - String: "Hello, world!" -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_info.snap deleted file mode 100644 index 920f7b22..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_alone_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: sync_rule_alone -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_all.snap deleted file mode 100644 index 80cd76f6..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_all.snap +++ /dev/null @@ -1,80 +0,0 @@ ---- -source: tests/tests/serve.rs -assertion_line: 284 -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - - id-4 - - id-5 - - id-6 - - id-7 - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: false - Name: sync_rule_complex - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: [] - ClassName: Script - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: bar - Parent: id-2 - Properties: - RunContext: - Enum: 0 - Source: - String: "-- Hello, from bar (a Script)!" - id-4: - Children: [] - ClassName: LocalScript - Id: id-4 - Metadata: - ignoreUnknownInstances: false - Name: baz - Parent: id-2 - Properties: - Source: - String: "-- Hello, from baz (a LocalScript)!" - id-5: - Children: [] - ClassName: StringValue - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: cat - Parent: id-2 - Properties: - Value: - String: "Hello, from cat (a StringValue)!" - id-6: - Children: [] - ClassName: ModuleScript - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: foo - Parent: id-2 - Properties: - Source: - String: "-- Hello, from foo (a ModuleScript)!" - id-7: - Children: [] - ClassName: StringValue - Id: id-7 - Metadata: - ignoreUnknownInstances: true - Name: qux - Parent: id-2 - Properties: - Value: - String: "Hello, from qux (a .rojo file that's turned into a StringValue)!" -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_info.snap deleted file mode 100644 index 2961cc7b..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_complex_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: sync_rule_complex -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_all.snap deleted file mode 100644 index f3210d3c..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_all.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: tests/tests/serve.rs -assertion_line: 303 -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: false - Name: sync_rule_no_extension - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: [] - ClassName: ModuleScript - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: no_extension - Parent: id-2 - Properties: - Source: - String: "return {\"This file has no extension but should be a ModuleScript named `no_extension`\"}" -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_info.snap deleted file mode 100644 index 54915213..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_extension_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: sync_rule_no_extension -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_all.snap deleted file mode 100644 index 0b25468a..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_all.snap +++ /dev/null @@ -1,41 +0,0 @@ ---- -source: tests/tests/serve.rs -assertion_line: 389 -expression: "read_response.intern_and_redact(&mut redactions, root_id)" ---- -instances: - id-2: - Children: - - id-3 - ClassName: StringValue - Id: id-2 - Metadata: - ignoreUnknownInstances: true - Name: sync_rule_no_name_project - Parent: "00000000000000000000000000000000" - Properties: - Value: - String: "This should be named `sync_rule_no_name_project` and have a child at `src/not_a_project`" - id-3: - Children: - - id-4 - ClassName: Folder - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: src - Parent: id-2 - Properties: {} - id-4: - Children: [] - ClassName: StringValue - Id: id-4 - Metadata: - ignoreUnknownInstances: true - Name: not_a_project - Parent: id-3 - Properties: - Value: - String: "If this isn't named `not_a_project`, something has gone wrong!" -messageCursor: 0 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_info.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_info.snap deleted file mode 100644 index b8fcc474..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__sync_rule_no_name_project_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: sync_rule_no_name_project -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 -unexpectedPlaceIds: ~ diff --git a/rojo-test/serve-tests/forced_parent/default.project.json b/rojo-test/serve-tests/forced_parent/default.project.json deleted file mode 100644 index bcca1bde..00000000 --- a/rojo-test/serve-tests/forced_parent/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "forced_parent", - "tree": { - "$className": "Attachment" - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/meshpart_with_id/default.project.json b/rojo-test/serve-tests/meshpart_with_id/default.project.json deleted file mode 100644 index 4ec9f170..00000000 --- a/rojo-test/serve-tests/meshpart_with_id/default.project.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "meshpart", - "tree": { - "$className": "DataModel", - "Workspace": { - "Sword": { - "$id": "sword", - "$className": "MeshPart", - "$properties": { - "MeshId": "rbxasset://fonts/sword.mesh", - "TextureID": "rbxasset://textures/SwordTexture.png" - } - }, - "ObjectValue": { - "$className": "ObjectValue", - "$attributes": { - "Rojo_Target_Value": "sword" - } - } - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/no_name_default_project/default.project.json b/rojo-test/serve-tests/no_name_default_project/default.project.json deleted file mode 100644 index 1c2a1400..00000000 --- a/rojo-test/serve-tests/no_name_default_project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "top-level", - "tree": { - "$className": "Folder", - "second-level": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/no_name_default_project/src/third-level/default.project.json b/rojo-test/serve-tests/no_name_default_project/src/third-level/default.project.json deleted file mode 100644 index e7b87be1..00000000 --- a/rojo-test/serve-tests/no_name_default_project/src/third-level/default.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tree": { - "$className": "IntValue", - "$properties": { - "Value": 1337 - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/no_name_project/default.project.json b/rojo-test/serve-tests/no_name_project/default.project.json deleted file mode 100644 index 93ef2e8c..00000000 --- a/rojo-test/serve-tests/no_name_project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "no_name_project", - "tree": { - "$className": "Folder", - "second-level": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/no_name_project/src/bool_value.project.json b/rojo-test/serve-tests/no_name_project/src/bool_value.project.json deleted file mode 100644 index 6be58a3c..00000000 --- a/rojo-test/serve-tests/no_name_project/src/bool_value.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tree": { - "$className": "BoolValue", - "$properties": { - "Value": true - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/no_name_top_level_project/default.project.json b/rojo-test/serve-tests/no_name_top_level_project/default.project.json deleted file mode 100644 index 845ae372..00000000 --- a/rojo-test/serve-tests/no_name_top_level_project/default.project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tree": { - "$className": "StringValue", - "$properties": { - "Value": "If this isn't named `no_name_top_level_project`, something went wrong!" - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/pivot_migration/Tool.model.json b/rojo-test/serve-tests/pivot_migration/Tool.model.json deleted file mode 100644 index 683e403c..00000000 --- a/rojo-test/serve-tests/pivot_migration/Tool.model.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "className": "Tool" -} \ No newline at end of file diff --git a/rojo-test/serve-tests/pivot_migration/default.project.json b/rojo-test/serve-tests/pivot_migration/default.project.json deleted file mode 100644 index 7a2c548f..00000000 --- a/rojo-test/serve-tests/pivot_migration/default.project.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "pivot_migration", - "tree": { - "$className": "DataModel", - "Workspace": { - "Model": { - "$className": "Model" - }, - "Tool": { - "$path": "Tool.model.json" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/ref_properties/FolderTarget/FolderPointer.model.json b/rojo-test/serve-tests/ref_properties/FolderTarget/FolderPointer.model.json deleted file mode 100644 index a4543ff4..00000000 --- a/rojo-test/serve-tests/ref_properties/FolderTarget/FolderPointer.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "folder target" - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/ref_properties/FolderTarget/init.meta.json b/rojo-test/serve-tests/ref_properties/FolderTarget/init.meta.json deleted file mode 100644 index 1705a7be..00000000 --- a/rojo-test/serve-tests/ref_properties/FolderTarget/init.meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "id": "folder target" -} \ No newline at end of file diff --git a/rojo-test/serve-tests/ref_properties/ModelTarget.model.json b/rojo-test/serve-tests/ref_properties/ModelTarget.model.json deleted file mode 100644 index 36710365..00000000 --- a/rojo-test/serve-tests/ref_properties/ModelTarget.model.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "model target", - "className": "Folder", - "children": [ - { - "name": "ModelPointer", - "className": "Model", - "attributes": { - "Rojo_Target_PrimaryPart": "model target" - } - } - ] -} \ No newline at end of file diff --git a/rojo-test/serve-tests/ref_properties/default.project.json b/rojo-test/serve-tests/ref_properties/default.project.json deleted file mode 100644 index 8ffa1908..00000000 --- a/rojo-test/serve-tests/ref_properties/default.project.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "ref_properties", - "tree": { - "$className": "DataModel", - "Workspace": { - "ProjectTarget": { - "$className": "Folder", - "$id": "project target", - "ProjectPointer": { - "$className": "ObjectValue", - "$attributes": { - "Rojo_Target_Value": { - "String": "project target" - } - } - } - }, - "ModelTarget": { - "$path": "ModelTarget.model.json" - }, - "FolderTarget": { - "$path": "FolderTarget" - }, - "CrossFormatPointer": { - "$className": "ObjectValue", - "$attributes": { - "Rojo_Target_Value": "folder target" - } - } - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/ref_properties_remove/default.project.json b/rojo-test/serve-tests/ref_properties_remove/default.project.json deleted file mode 100644 index 43f94765..00000000 --- a/rojo-test/serve-tests/ref_properties_remove/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ref_properties_remove", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/ref_properties_remove/src/pointer.model.json b/rojo-test/serve-tests/ref_properties_remove/src/pointer.model.json deleted file mode 100644 index 4add638b..00000000 --- a/rojo-test/serve-tests/ref_properties_remove/src/pointer.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "test pointer" - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/ref_properties_remove/src/target.model.json b/rojo-test/serve-tests/ref_properties_remove/src/target.model.json deleted file mode 100644 index 8069631e..00000000 --- a/rojo-test/serve-tests/ref_properties_remove/src/target.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Id": "test pointer" - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_alone/default.project.json b/rojo-test/serve-tests/sync_rule_alone/default.project.json deleted file mode 100644 index f3a5aa34..00000000 --- a/rojo-test/serve-tests/sync_rule_alone/default.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "sync_rule_alone", - "tree": { - "$path": "src" - }, - "syncRules": [ - { - "pattern": "*.nothing", - "use": "text" - } - ] -} \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_alone/src/foo.nothing b/rojo-test/serve-tests/sync_rule_alone/src/foo.nothing deleted file mode 100644 index 5dd01c17..00000000 --- a/rojo-test/serve-tests/sync_rule_alone/src/foo.nothing +++ /dev/null @@ -1 +0,0 @@ -Hello, world! \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_complex/default.project.json b/rojo-test/serve-tests/sync_rule_complex/default.project.json deleted file mode 100644 index 62764bb4..00000000 --- a/rojo-test/serve-tests/sync_rule_complex/default.project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "sync_rule_complex", - "tree": { - "$path": "src" - }, - "syncRules": [ - { - "pattern": "*.module", - "use": "moduleScript" - }, - { - "pattern": "*.server", - "use": "serverScript" - }, - { - "pattern": "*.client", - "use": "clientScript" - }, - { - "pattern": "*.rojo", - "exclude": "*.ignore.rojo", - "use": "project" - }, - { - "pattern": "*.dog.rojo2", - "use": "text", - "suffix": ".dog.rojo2" - } - ] -} \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_complex/src/bar.server b/rojo-test/serve-tests/sync_rule_complex/src/bar.server deleted file mode 100644 index e860bd77..00000000 --- a/rojo-test/serve-tests/sync_rule_complex/src/bar.server +++ /dev/null @@ -1 +0,0 @@ --- Hello, from bar (a Script)! \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_complex/src/baz.client b/rojo-test/serve-tests/sync_rule_complex/src/baz.client deleted file mode 100644 index 4326a2a4..00000000 --- a/rojo-test/serve-tests/sync_rule_complex/src/baz.client +++ /dev/null @@ -1 +0,0 @@ --- Hello, from baz (a LocalScript)! \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_complex/src/cat.dog.rojo2 b/rojo-test/serve-tests/sync_rule_complex/src/cat.dog.rojo2 deleted file mode 100644 index e185da86..00000000 --- a/rojo-test/serve-tests/sync_rule_complex/src/cat.dog.rojo2 +++ /dev/null @@ -1 +0,0 @@ -Hello, from cat (a StringValue)! \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_complex/src/foo.module b/rojo-test/serve-tests/sync_rule_complex/src/foo.module deleted file mode 100644 index 3a55f9b2..00000000 --- a/rojo-test/serve-tests/sync_rule_complex/src/foo.module +++ /dev/null @@ -1 +0,0 @@ --- Hello, from foo (a ModuleScript)! \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_complex/src/qux.rojo b/rojo-test/serve-tests/sync_rule_complex/src/qux.rojo deleted file mode 100644 index 7153477d..00000000 --- a/rojo-test/serve-tests/sync_rule_complex/src/qux.rojo +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "qux", - "tree": { - "$className": "StringValue", - "$properties": { - "Value": "Hello, from qux (a .rojo file that's turned into a StringValue)!" - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_complex/src/rat.ignore.rojo b/rojo-test/serve-tests/sync_rule_complex/src/rat.ignore.rojo deleted file mode 100644 index d80a8cc8..00000000 --- a/rojo-test/serve-tests/sync_rule_complex/src/rat.ignore.rojo +++ /dev/null @@ -1 +0,0 @@ -This file should be ignored! \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_no_extension/default.project.json b/rojo-test/serve-tests/sync_rule_no_extension/default.project.json deleted file mode 100644 index 185c6633..00000000 --- a/rojo-test/serve-tests/sync_rule_no_extension/default.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "sync_rule_no_extension", - "tree": { - "$path": "src" - }, - "syncRules": [ - { - "pattern": "src/**", - "use": "json" - } - ] -} \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_no_extension/src/no_extension b/rojo-test/serve-tests/sync_rule_no_extension/src/no_extension deleted file mode 100644 index 41c705c4..00000000 --- a/rojo-test/serve-tests/sync_rule_no_extension/src/no_extension +++ /dev/null @@ -1 +0,0 @@ -["This file has no extension but should be a ModuleScript named `no_extension`"] \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_no_name_project/default.project.json b/rojo-test/serve-tests/sync_rule_no_name_project/default.project.json deleted file mode 100644 index 647c0adb..00000000 --- a/rojo-test/serve-tests/sync_rule_no_name_project/default.project.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "tree": { - "$className": "StringValue", - "$properties": { - "Value": "This should be named `sync_rule_no_name_project` and have a child at `src/not_a_project`" - }, - "src": { - "$path": "src" - } - }, - "syncRules": [ - { - "use": "project", - "pattern": "*.rojo" - } - ] -} \ No newline at end of file diff --git a/rojo-test/serve-tests/sync_rule_no_name_project/src/not_a_project.rojo b/rojo-test/serve-tests/sync_rule_no_name_project/src/not_a_project.rojo deleted file mode 100644 index 83b08b77..00000000 --- a/rojo-test/serve-tests/sync_rule_no_name_project/src/not_a_project.rojo +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tree": { - "$className": "StringValue", - "$properties": { - "Value": "If this isn't named `not_a_project`, something has gone wrong!" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__child_but_not-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__child_but_not-stdout.snap deleted file mode 100644 index 7495dc1f..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__child_but_not-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing OnlyOneCopy/child_of_one.luau -Writing ReplicatedStorage/child_replicated_storage.luau diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__csv-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__csv-stdout.snap deleted file mode 100644 index 61fc2288..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__csv-stdout.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/csv.csv -Writing src/csv_init/init.csv -Writing src/csv_init diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__duplicate_rojo_id-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__duplicate_rojo_id-stdout.snap deleted file mode 100644 index 11b5f72c..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__duplicate_rojo_id-stdout.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing container.model.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_adding-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_adding-stdout.snap deleted file mode 100644 index 3fc6b6b0..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_adding-stdout.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/int_value.model.json -Writing src/subfolder/string_value.txt -Writing src/subfolder diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_init-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_init-stdout.snap deleted file mode 100644 index 6222321f..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_init-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/non-init.luau -Writing src/init-file diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_removing-src__Message.rbxm.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_removing-src__Message.rbxm.snap deleted file mode 100644 index 6f480488..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_removing-src__Message.rbxm.snap +++ /dev/null @@ -1,73 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: src/Message.rbxm ---- -num_types: 1 -num_instances: 1 -chunks: - - Inst: - type_id: 0 - type_name: Message - object_format: 0 - referents: - - 0 - - Prop: - type_id: 0 - prop_name: AttributesSerialize - prop_type: String - values: - - "" - - Prop: - type_id: 0 - prop_name: Capabilities - prop_type: SecurityCapabilities - values: - - 0 - - Prop: - type_id: 0 - prop_name: HistoryId - prop_type: UniqueId - values: - - "00000000000000000000000000000000" - - Prop: - type_id: 0 - prop_name: Name - prop_type: String - values: - - Message - - Prop: - type_id: 0 - prop_name: DefinesCapabilities - prop_type: Bool - values: - - false - - Prop: - type_id: 0 - prop_name: SourceAssetId - prop_type: Int64 - values: - - -1 - - Prop: - type_id: 0 - prop_name: Tags - prop_type: String - values: - - "" - - Prop: - type_id: 0 - prop_name: Text - prop_type: String - values: - - This message should be written to the disk. - - Prop: - type_id: 0 - prop_name: UniqueId - prop_type: UniqueId - values: - - 2030b7775c30713f085b9d4800005a8b - - Prnt: - version: 0 - links: - - - 0 - - -1 - - End diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_removing-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_removing-stdout.snap deleted file mode 100644 index 7449e6b1..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_paths_removing-stdout.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/Message.rbxm diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_trees_adding-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_trees_adding-stdout.snap deleted file mode 100644 index f1f8c02c..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_trees_adding-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/IncludeMe/.gitkeep -Writing src/IncludeMe diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_trees_removing-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_trees_removing-stdout.snap deleted file mode 100644 index b6b9aaa0..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ignore_trees_removing-stdout.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- - diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__json_middlewares-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__json_middlewares-stdout.snap deleted file mode 100644 index f6e609d1..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__json_middlewares-stdout.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/dir_with_meta/init.meta.json -Writing src/model_json.model.json -Writing src/project_json.project.json -Writing src/dir_with_meta diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__nested_projects-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__nested_projects-stdout.snap deleted file mode 100644 index eab1bd54..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__nested_projects-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing nested.project.json -Writing string_value.txt diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__nested_projects_weird-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__nested_projects_weird-stdout.snap deleted file mode 100644 index 1f97ad7e..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__nested_projects_weird-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/modules/ClientModule.luau -Writing src/modules/ServerModule.luau diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_default_properties_remove-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_default_properties_remove-stdout.snap deleted file mode 100644 index 3ef76951..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_default_properties_remove-stdout.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing default.project.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_init-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_init-stdout.snap deleted file mode 100644 index 409b4d57..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_init-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/init.luau -Writing src diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_reserialize-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_reserialize-stdout.snap deleted file mode 100644 index d6e4238a..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__project_reserialize-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing attribute_mismatch.luau -Writing property_mismatch.project.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__rbxm_fallback-src__ChildWithDuplicates.rbxm.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__rbxm_fallback-src__ChildWithDuplicates.rbxm.snap deleted file mode 100644 index 7fe594f1..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__rbxm_fallback-src__ChildWithDuplicates.rbxm.snap +++ /dev/null @@ -1,73 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: src/ChildWithDuplicates.rbxm ---- -num_types: 1 -num_instances: 3 -chunks: - - Inst: - type_id: 0 - type_name: Folder - object_format: 0 - referents: - - 0 - - 1 - - 2 - - Prop: - type_id: 0 - prop_name: AttributesSerialize - prop_type: String - values: - - "" - - "" - - "" - - Prop: - type_id: 0 - prop_name: Capabilities - prop_type: SecurityCapabilities - values: - - 0 - - 0 - - 0 - - Prop: - type_id: 0 - prop_name: Name - prop_type: String - values: - - DuplicateChild - - DuplicateChild - - ChildWithDuplicates - - Prop: - type_id: 0 - prop_name: DefinesCapabilities - prop_type: Bool - values: - - false - - false - - false - - Prop: - type_id: 0 - prop_name: SourceAssetId - prop_type: Int64 - values: - - -1 - - -1 - - -1 - - Prop: - type_id: 0 - prop_name: Tags - prop_type: String - values: - - "" - - "" - - "" - - Prnt: - version: 0 - links: - - - 0 - - 2 - - - 1 - - 2 - - - 2 - - -1 - - End diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__rbxm_fallback-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__rbxm_fallback-stdout.snap deleted file mode 100644 index ecf33548..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__rbxm_fallback-stdout.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/ChildWithDuplicates.rbxm -Writing src/ChildWithoutDuplicates/Child/.gitkeep -Writing src/ChildWithoutDuplicates -Writing src/ChildWithoutDuplicates/Child -Removing src/ChildWithDuplicates diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties-stdout.snap deleted file mode 100644 index 774fe9d6..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/pointer.model.json -Writing src/target.model.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_blank-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_blank-stdout.snap deleted file mode 100644 index a2cadfb2..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_blank-stdout.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/pointer.model.json -Writing src/target.meta.json -Writing src/target.txt diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_conflict-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_conflict-stdout.snap deleted file mode 100644 index 0942314d..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_conflict-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/Pointer_2.model.json -Writing src/Target_2.model.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_duplicate-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_duplicate-stdout.snap deleted file mode 100644 index b6b9aaa0..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_duplicate-stdout.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- - diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_pruned-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_pruned-stdout.snap deleted file mode 100644 index 3a9c2502..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__ref_properties_pruned-stdout.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/Pointer1.model.json -Writing src/Pointer2.model.json -Writing src/Pointer3.model.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__respect_old_middleware-src__rbxm.rbxm.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__respect_old_middleware-src__rbxm.rbxm.snap deleted file mode 100644 index 0c748692..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__respect_old_middleware-src__rbxm.rbxm.snap +++ /dev/null @@ -1,55 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: src/rbxm.rbxm ---- -num_types: 1 -num_instances: 1 -chunks: - - Inst: - type_id: 0 - type_name: Folder - object_format: 0 - referents: - - 0 - - Prop: - type_id: 0 - prop_name: AttributesSerialize - prop_type: String - values: - - "" - - Prop: - type_id: 0 - prop_name: Capabilities - prop_type: SecurityCapabilities - values: - - 0 - - Prop: - type_id: 0 - prop_name: Name - prop_type: String - values: - - rbxm - - Prop: - type_id: 0 - prop_name: DefinesCapabilities - prop_type: Bool - values: - - false - - Prop: - type_id: 0 - prop_name: SourceAssetId - prop_type: Int64 - values: - - -1 - - Prop: - type_id: 0 - prop_name: Tags - prop_type: String - values: - - rbxmx - - Prnt: - version: 0 - links: - - - 0 - - -1 - - End diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__respect_old_middleware-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__respect_old_middleware-stdout.snap deleted file mode 100644 index 05dbd817..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__respect_old_middleware-stdout.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing default.project.json -Writing src/model_json.model.json -Writing src/rbxm.rbxm -Writing src/rbxmx.rbxmx diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__schema_roundtrip-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__schema_roundtrip-stdout.snap deleted file mode 100644 index dfbdabd6..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__schema_roundtrip-stdout.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing default.project.json -Writing src/adjacent.luau -Writing src/adjacent.meta.json -Writing src/init/init.meta.json -Writing src/model.model.json -Writing src/init diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__string_value_project-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__string_value_project-stdout.snap deleted file mode 100644 index fc49a162..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__string_value_project-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing default.project.json -Writing string_value.txt diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__sync_rules-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__sync_rules-stdout.snap deleted file mode 100644 index 00045825..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__sync_rules-stdout.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing src/module.modulescript -Writing src/text.text diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__unscriptable_properties-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__unscriptable_properties-stdout.snap deleted file mode 100644 index 3ef76951..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__unscriptable_properties-stdout.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/rojo_test/syncback_util.rs -expression: "String::from_utf8_lossy(&output.stdout)" ---- -Writing default.project.json diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__child_but_not-OnlyOneCopy__child_of_one.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__child_but_not-OnlyOneCopy__child_of_one.luau.snap deleted file mode 100644 index b37618ce..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__child_but_not-OnlyOneCopy__child_of_one.luau.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: OnlyOneCopy/child_of_one.luau ---- --- this should be in OnlyOneCopy/child_of_one diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__child_but_not-ReplicatedStorage__child_replicated_storage.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__child_but_not-ReplicatedStorage__child_replicated_storage.luau.snap deleted file mode 100644 index 8d7939df..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__child_but_not-ReplicatedStorage__child_replicated_storage.luau.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: ReplicatedStorage/child_replicated_storage.luau ---- --- -- this should be in child_replicated_storage diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__csv-src__csv.csv.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__csv-src__csv.csv.snap deleted file mode 100644 index 313f4c7e..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__csv-src__csv.csv.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/csv.csv ---- -Key,Source,Context,Example,es -Ack,Ack!,,An exclamation of despair,¡Ay! diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__csv-src__csv_init__init.csv.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__csv-src__csv_init__init.csv.snap deleted file mode 100644 index 22266002..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__csv-src__csv_init__init.csv.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/csv_init/init.csv ---- -Key,Source,Context,Example,en -Rojo,Rojo,,Rojo is a really cool program,Red diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__duplicate_rojo_id-container.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__duplicate_rojo_id-container.model.json.snap deleted file mode 100644 index b15329a2..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__duplicate_rojo_id-container.model.json.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: container.model.json ---- -{ - "className": "Folder", - "children": [ - { - "name": "value_1", - "className": "ObjectValue", - "attributes": { - "Rojo_Id": "value_1", - "Rojo_Target_Value": "value_1" - } - }, - { - "name": "value_2", - "className": "ObjectValue", - "attributes": { - "Rojo_Id": "72bc28150ada2e6206442ee300004084", - "Rojo_Target_Value": "72bc28150ada2e6206442ee300004084" - } - } - ] -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_adding-src__int_value.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_adding-src__int_value.model.json.snap deleted file mode 100644 index 85e75bdc..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_adding-src__int_value.model.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/int_value.model.json ---- -{ - "className": "IntValue", - "properties": { - "Value": 1337.0 - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_adding-src__subfolder__string_value.txt.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_adding-src__subfolder__string_value.txt.snap deleted file mode 100644 index 869aefb8..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_adding-src__subfolder__string_value.txt.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/subfolder/string_value.txt ---- -This memorial dedicated to Club Penguin. diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_init-src__init-file__init.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_init-src__init-file__init.luau.snap deleted file mode 100644 index 48375888..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_init-src__init-file__init.luau.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/init-file/init.luau ---- --- This file SHOULD NOT be updated diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_init-src__non-init.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_init-src__non-init.luau.snap deleted file mode 100644 index 343aed6f..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ignore_paths_init-src__non-init.luau.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/non-init.luau ---- --- This module SHOULD be updated --- This text is new. diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__dir_with_meta__init.meta.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__dir_with_meta__init.meta.json.snap deleted file mode 100644 index 8c56c92c..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__dir_with_meta__init.meta.json.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/dir_with_meta/init.meta.json ---- -{ - "properties": { - "Tags": [ - "This tag on dir_with_meta" - ] - }, - "className": "Configuration" -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__model_json.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__model_json.model.json.snap deleted file mode 100644 index 7e9aacf9..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__model_json.model.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/model_json.model.json ---- -{ - "className": "StringValue", - "properties": { - "Value": "This text is model_json" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__project_json.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__project_json.project.json.snap deleted file mode 100644 index 00bba2f3..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__json_middlewares-src__project_json.project.json.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/project_json.project.json ---- -{ - "name": "project_json", - "tree": { - "$className": "Color3Value", - "$properties": { - "Value": [ - 1337.0, - -1337.0, - 1337.0 - ] - } - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects-nested.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects-nested.project.json.snap deleted file mode 100644 index 5a2ebb8d..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects-nested.project.json.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: nested.project.json ---- -{ - "name": "Nested", - "tree": { - "$className": "Configuration", - "BoolValue": { - "$className": "BoolValue", - "$properties": { - "Value": true - } - }, - "StringValue": { - "$path": "string_value.txt" - } - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects-string_value.txt.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects-string_value.txt.snap deleted file mode 100644 index 7ed1790d..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects-string_value.txt.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: string_value.txt ---- -Nested project string value :-) diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects_weird-src__modules__ClientModule.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects_weird-src__modules__ClientModule.luau.snap deleted file mode 100644 index e070784a..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects_weird-src__modules__ClientModule.luau.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/modules/ClientModule.luau ---- --- Client module diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects_weird-src__modules__ServerModule.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects_weird-src__modules__ServerModule.luau.snap deleted file mode 100644 index cae56ba2..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__nested_projects_weird-src__modules__ServerModule.luau.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/modules/ServerModule.luau ---- --- Server module diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_default_properties_remove-default.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_default_properties_remove-default.project.json.snap deleted file mode 100644 index baa0be44..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_default_properties_remove-default.project.json.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: default.project.json ---- -{ - "name": "SyncbackTest", - "tree": { - "$className": "DataModel", - "Workspace": { - "$className": "Workspace", - "TestPart": { - "$className": "Part", - "$properties": { - "Anchored": true, - "Color": { - "Color3uint8": [ - 0, - 0, - 255 - ] - } - } - }, - "$properties": { - "PhysicsImprovedSleep": { - "Enum": 0 - }, - "UseNewLuauTypeSolver": "Disabled" - }, - "$attributes": { - "Rojo_Target_CurrentCamera": "302d573157260ee80a3baa32000003b5" - } - } - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_init-src__init.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_init-src__init.luau.snap deleted file mode 100644 index 6c7428fb..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_init-src__init.luau.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/init.luau ---- --- Project init script diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_reserialize-attribute_mismatch.luau.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_reserialize-attribute_mismatch.luau.snap deleted file mode 100644 index b59d4f60..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_reserialize-attribute_mismatch.luau.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: attribute_mismatch.luau ---- --- This script is a part of project_reserialize diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_reserialize-property_mismatch.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_reserialize-property_mismatch.project.json.snap deleted file mode 100644 index a06e7f36..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__project_reserialize-property_mismatch.project.json.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: property_mismatch.project.json ---- -{ - "name": "property_mismatch", - "tree": { - "$className": "BrickColorValue", - "$properties": { - "Value": { - "BrickColor": 345 - } - } - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties-src__pointer.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties-src__pointer.model.json.snap deleted file mode 100644 index 3108d5c0..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties-src__pointer.model.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/pointer.model.json ---- -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "test referent id" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties-src__target.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties-src__target.model.json.snap deleted file mode 100644 index a3aa961b..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties-src__target.model.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/target.model.json ---- -{ - "className": "Folder", - "attributes": { - "Rojo_Id": "test referent id" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__pointer.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__pointer.model.json.snap deleted file mode 100644 index 76186e98..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__pointer.model.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/pointer.model.json ---- -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "62e89c49e4f800c20629c71b00003fc0" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__target.meta.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__target.meta.json.snap deleted file mode 100644 index 83d77426..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__target.meta.json.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/target.meta.json ---- -{ - "attributes": { - "Rojo_Id": "62e89c49e4f800c20629c71b00003fc0" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__target.txt.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__target.txt.snap deleted file mode 100644 index 3d35ac47..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_blank-src__target.txt.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/target.txt ---- -This is a target. diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_conflict-src__Pointer_2.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_conflict-src__Pointer_2.model.json.snap deleted file mode 100644 index 555c1851..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_conflict-src__Pointer_2.model.json.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tests/tests/syncback.rs -assertion_line: 28 -expression: src/Pointer_2.model.json ---- -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "0bd3e9e11879191708a2bc4a00000c20" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_conflict-src__Target_2.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_conflict-src__Target_2.model.json.snap deleted file mode 100644 index 2314c3d3..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_conflict-src__Target_2.model.json.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tests/tests/syncback.rs -assertion_line: 28 -expression: src/Target_2.model.json ---- -{ - "className": "Folder", - "attributes": { - "Rojo_Id": "0bd3e9e11879191708a2bc4a00000c20" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer1.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer1.model.json.snap deleted file mode 100644 index aeee8256..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer1.model.json.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/Pointer1.model.json ---- -{ - "className": "ObjectValue" -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer2.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer2.model.json.snap deleted file mode 100644 index 87da5680..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer2.model.json.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/Pointer2.model.json ---- -{ - "className": "ObjectValue" -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer3.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer3.model.json.snap deleted file mode 100644 index 9c5e3b94..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__ref_properties_pruned-src__Pointer3.model.json.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/Pointer3.model.json ---- -{ - "className": "ObjectValue" -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-default.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-default.project.json.snap deleted file mode 100644 index 315941cd..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-default.project.json.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: default.project.json ---- -{ - "name": "respect_old_middleware", - "tree": { - "project_node": { - "$className": "BoolValue", - "$properties": { - "Value": true - } - }, - "$path": "src" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-src__model_json.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-src__model_json.model.json.snap deleted file mode 100644 index 2c77ad07..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-src__model_json.model.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/model_json.model.json ---- -{ - "className": "StringValue", - "properties": { - "Value": "This should be a .model.json file" - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-src__rbxmx.rbxmx.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-src__rbxmx.rbxmx.snap deleted file mode 100644 index 14c517cc..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__respect_old_middleware-src__rbxmx.rbxmx.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/rbxmx.rbxmx ---- - - - - rbxmx - - 0 - false - -1 - cmJ4bXg= - - - diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-default.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-default.project.json.snap deleted file mode 100644 index 3fb7e5c2..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-default.project.json.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: default.project.json ---- -{ - "$schema": "rojo/project-schema", - "name": "schema_roundtrip", - "tree": { - "$className": "Folder", - "src": { - "$path": "src" - }, - "trigger_reserialization": { - "$className": "BoolValue", - "$properties": { - "Value": true - } - } - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__adjacent.meta.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__adjacent.meta.json.snap deleted file mode 100644 index 9633f1e6..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__adjacent.meta.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/adjacent.meta.json ---- -{ - "$schema": "rojo/adjacent-meta", - "attributes": { - "trigger_reserialization": true - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__init__init.meta.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__init__init.meta.json.snap deleted file mode 100644 index dd89fc90..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__init__init.meta.json.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/init/init.meta.json ---- -{ - "$schema": "rojo/init-meta", - "attributes": { - "trigger_reserialization": true - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__model.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__model.model.json.snap deleted file mode 100644 index 65f0d725..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__schema_roundtrip-src__model.model.json.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/model.model.json ---- -{ - "$schema": "rojo/model.json", - "className": "BoolValue" -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__string_value_project-default.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__string_value_project-default.project.json.snap deleted file mode 100644 index 4e62a0c8..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__string_value_project-default.project.json.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: default.project.json ---- -{ - "name": "string_value_project", - "tree": { - "$className": "Folder", - "inside_project_file": { - "$className": "StringValue", - "$properties": { - "Value": "imgettingverytiredofwritingthesetests2" - } - }, - "on_file_system": { - "$attributes": { - "imgettingverytiredofwritingthesetests": "person299 was ahead of his time" - }, - "$path": "string_value.txt" - } - } -} diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__sync_rules-src__module.modulescript.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__sync_rules-src__module.modulescript.snap deleted file mode 100644 index 7d01aac4..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__sync_rules-src__module.modulescript.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/module.modulescript ---- --- This should be a in the file 'module.modulescript'. It should be updated to have a second line. --- This is the second line in 'module.modulescript'. diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__sync_rules-src__text.text.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__sync_rules-src__text.text.snap deleted file mode 100644 index dc196fc9..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__sync_rules-src__text.text.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: src/text.text ---- --- This should be a in the file 'text.text'. It should be updated to have a second line. --- This is the second line in 'text.text'. diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__unscriptable_properties-default.project.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__unscriptable_properties-default.project.json.snap deleted file mode 100644 index 236064e3..00000000 --- a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__unscriptable_properties-default.project.json.snap +++ /dev/null @@ -1,18 +0,0 @@ ---- -source: tests/tests/syncback.rs -expression: default.project.json ---- -{ - "name": "unscriptable_properties", - "tree": { - "$className": "BinaryStringValue", - "$properties": { - "Value": { - "BinaryString": "Rojo/is/cool" - } - } - }, - "syncbackRules": { - "syncUnscriptable": true - } -} diff --git a/rojo-test/syncback-tests/child_but_not/input-project/OnlyOneCopy/.gitkeep b/rojo-test/syncback-tests/child_but_not/input-project/OnlyOneCopy/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/child_but_not/input-project/ReplicatedStorage/.gitkeep b/rojo-test/syncback-tests/child_but_not/input-project/ReplicatedStorage/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/child_but_not/input-project/default.project.json b/rojo-test/syncback-tests/child_but_not/input-project/default.project.json deleted file mode 100644 index d23f524c..00000000 --- a/rojo-test/syncback-tests/child_but_not/input-project/default.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "child_but_not", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "$path": "ReplicatedStorage", - "OnlyOneCopy": { - "$path": "OnlyOneCopy" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/child_but_not/input.rbxl b/rojo-test/syncback-tests/child_but_not/input.rbxl deleted file mode 100644 index 6a10886d..00000000 Binary files a/rojo-test/syncback-tests/child_but_not/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/csv/input-project/default.project.json b/rojo-test/syncback-tests/csv/input-project/default.project.json deleted file mode 100644 index da44ea35..00000000 --- a/rojo-test/syncback-tests/csv/input-project/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "csv", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/csv/input-project/src/csv_init/init.csv b/rojo-test/syncback-tests/csv/input-project/src/csv_init/init.csv deleted file mode 100644 index 24244d6c..00000000 --- a/rojo-test/syncback-tests/csv/input-project/src/csv_init/init.csv +++ /dev/null @@ -1,2 +0,0 @@ -Key,Source,Context,Example,en -,,,, diff --git a/rojo-test/syncback-tests/csv/input.rbxm b/rojo-test/syncback-tests/csv/input.rbxm deleted file mode 100644 index d42d3ef5..00000000 Binary files a/rojo-test/syncback-tests/csv/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/duplicate_rojo_id/input-project/container.model.json b/rojo-test/syncback-tests/duplicate_rojo_id/input-project/container.model.json deleted file mode 100644 index 9c551865..00000000 --- a/rojo-test/syncback-tests/duplicate_rojo_id/input-project/container.model.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "className": "Folder", - "children": [ - { - "name": "value_1", - "className": "ObjectValue" - }, - { - "name": "value_2", - "className": "ObjectValue" - } - ] -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/duplicate_rojo_id/input-project/default.project.json b/rojo-test/syncback-tests/duplicate_rojo_id/input-project/default.project.json deleted file mode 100644 index 3343677a..00000000 --- a/rojo-test/syncback-tests/duplicate_rojo_id/input-project/default.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "duplicate_rojo_id", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "container": { - "$path": "container.model.json" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/duplicate_rojo_id/input.rbxl b/rojo-test/syncback-tests/duplicate_rojo_id/input.rbxl deleted file mode 100644 index 8e3e8369..00000000 Binary files a/rojo-test/syncback-tests/duplicate_rojo_id/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/ignore_paths_adding/input-project/default.project.json b/rojo-test/syncback-tests/ignore_paths_adding/input-project/default.project.json deleted file mode 100644 index 01e24a7a..00000000 --- a/rojo-test/syncback-tests/ignore_paths_adding/input-project/default.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "ignore_paths_adding", - "tree": { - "$path": "src" - }, - "syncbackRules": { - "ignorePaths": [ - "src/*.rbxm" - ] - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ignore_paths_adding/input-project/src/.gitkeep b/rojo-test/syncback-tests/ignore_paths_adding/input-project/src/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/ignore_paths_adding/input.rbxm b/rojo-test/syncback-tests/ignore_paths_adding/input.rbxm deleted file mode 100644 index 93331ba0..00000000 Binary files a/rojo-test/syncback-tests/ignore_paths_adding/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/ignore_paths_init/input-project/default.project.json b/rojo-test/syncback-tests/ignore_paths_init/input-project/default.project.json deleted file mode 100644 index dabd1116..00000000 --- a/rojo-test/syncback-tests/ignore_paths_init/input-project/default.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "ignore_paths_init", - "tree": { - "$path": "src" - }, - "syncbackRules": { - "ignorePaths": [ - "**/init-file/*.luau" - ] - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ignore_paths_init/input-project/src/init-file/init.luau b/rojo-test/syncback-tests/ignore_paths_init/input-project/src/init-file/init.luau deleted file mode 100644 index 2879cb9b..00000000 --- a/rojo-test/syncback-tests/ignore_paths_init/input-project/src/init-file/init.luau +++ /dev/null @@ -1 +0,0 @@ --- This file SHOULD NOT be updated diff --git a/rojo-test/syncback-tests/ignore_paths_init/input-project/src/non-init.luau b/rojo-test/syncback-tests/ignore_paths_init/input-project/src/non-init.luau deleted file mode 100644 index ddce6ce5..00000000 --- a/rojo-test/syncback-tests/ignore_paths_init/input-project/src/non-init.luau +++ /dev/null @@ -1 +0,0 @@ --- This module SHOULD be updated diff --git a/rojo-test/syncback-tests/ignore_paths_init/input.rbxm b/rojo-test/syncback-tests/ignore_paths_init/input.rbxm deleted file mode 100644 index 1cc07ef2..00000000 Binary files a/rojo-test/syncback-tests/ignore_paths_init/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/ignore_paths_removing/input-project/default.project.json b/rojo-test/syncback-tests/ignore_paths_removing/input-project/default.project.json deleted file mode 100644 index ee27ba53..00000000 --- a/rojo-test/syncback-tests/ignore_paths_removing/input-project/default.project.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "ignore_paths_removing", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "$path": "src" - } - }, - "syncbackRules": { - "ignorePaths": [ - "*.luau" - ] - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ignore_paths_removing/input-project/src/not_in_place.luau b/rojo-test/syncback-tests/ignore_paths_removing/input-project/src/not_in_place.luau deleted file mode 100644 index 1ba9bedc..00000000 --- a/rojo-test/syncback-tests/ignore_paths_removing/input-project/src/not_in_place.luau +++ /dev/null @@ -1 +0,0 @@ --- This script is not in the input place file. diff --git a/rojo-test/syncback-tests/ignore_paths_removing/input.rbxl b/rojo-test/syncback-tests/ignore_paths_removing/input.rbxl deleted file mode 100644 index b19b0fba..00000000 Binary files a/rojo-test/syncback-tests/ignore_paths_removing/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/ignore_trees_adding/input-project/default.project.json b/rojo-test/syncback-tests/ignore_trees_adding/input-project/default.project.json deleted file mode 100644 index 30c2ad9e..00000000 --- a/rojo-test/syncback-tests/ignore_trees_adding/input-project/default.project.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "ignore_trees_adding", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "$path": "src" - } - }, - "syncbackRules": { - "ignoreTrees": [ - "ReplicatedStorage/IgnoreMe" - ] - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ignore_trees_adding/input-project/src/.gitkeep b/rojo-test/syncback-tests/ignore_trees_adding/input-project/src/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/ignore_trees_adding/input.rbxl b/rojo-test/syncback-tests/ignore_trees_adding/input.rbxl deleted file mode 100644 index afab040a..00000000 Binary files a/rojo-test/syncback-tests/ignore_trees_adding/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/ignore_trees_removing/input-project/default.project.json b/rojo-test/syncback-tests/ignore_trees_removing/input-project/default.project.json deleted file mode 100644 index ec17e8f7..00000000 --- a/rojo-test/syncback-tests/ignore_trees_removing/input-project/default.project.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "ignore_trees_removing", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "$path": "src" - } - }, - "syncbackRules": { - "ignoreTrees": [ - "ReplicatedStorage/KeepMe" - ] - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ignore_trees_removing/input-project/src/KeepMe/.gitkeep b/rojo-test/syncback-tests/ignore_trees_removing/input-project/src/KeepMe/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/ignore_trees_removing/input.rbxl b/rojo-test/syncback-tests/ignore_trees_removing/input.rbxl deleted file mode 100644 index 422bbf35..00000000 Binary files a/rojo-test/syncback-tests/ignore_trees_removing/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/json_middlewares/input-project/default.project.json b/rojo-test/syncback-tests/json_middlewares/input-project/default.project.json deleted file mode 100644 index 75b25839..00000000 --- a/rojo-test/syncback-tests/json_middlewares/input-project/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "json_middleware", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/json_middlewares/input-project/src/dir_with_meta/init.meta.json b/rojo-test/syncback-tests/json_middlewares/input-project/src/dir_with_meta/init.meta.json deleted file mode 100644 index d6202957..00000000 --- a/rojo-test/syncback-tests/json_middlewares/input-project/src/dir_with_meta/init.meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "className": "Configuration" -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/json_middlewares/input-project/src/model_json.model.json b/rojo-test/syncback-tests/json_middlewares/input-project/src/model_json.model.json deleted file mode 100644 index a095016a..00000000 --- a/rojo-test/syncback-tests/json_middlewares/input-project/src/model_json.model.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "className": "StringValue" -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/json_middlewares/input-project/src/project_json.project.json b/rojo-test/syncback-tests/json_middlewares/input-project/src/project_json.project.json deleted file mode 100644 index ed845205..00000000 --- a/rojo-test/syncback-tests/json_middlewares/input-project/src/project_json.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "project_json", - "tree": { - "$className": "Color3Value" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/json_middlewares/input.rbxm b/rojo-test/syncback-tests/json_middlewares/input.rbxm deleted file mode 100644 index ef4d7d78..00000000 Binary files a/rojo-test/syncback-tests/json_middlewares/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/nested_projects/expected/default.project.json b/rojo-test/syncback-tests/nested_projects/expected/default.project.json deleted file mode 100644 index edb89e3c..00000000 --- a/rojo-test/syncback-tests/nested_projects/expected/default.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "nested_projects", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "Nested": { - "$path": "nested.project.json" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects/expected/nested.project.json b/rojo-test/syncback-tests/nested_projects/expected/nested.project.json deleted file mode 100644 index c71f3be9..00000000 --- a/rojo-test/syncback-tests/nested_projects/expected/nested.project.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "Nested", - "tree": { - "$className": "Configuration", - "BoolValue": { - "$className": "BoolValue", - "$properties": { - "Value": true - } - }, - "StringValue": { - "$path": "string_value.txt" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects/expected/string_value.txt b/rojo-test/syncback-tests/nested_projects/expected/string_value.txt deleted file mode 100644 index cb6a6af2..00000000 --- a/rojo-test/syncback-tests/nested_projects/expected/string_value.txt +++ /dev/null @@ -1 +0,0 @@ -effective cover predict pawn south \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects/input-project/default.project.json b/rojo-test/syncback-tests/nested_projects/input-project/default.project.json deleted file mode 100644 index edb89e3c..00000000 --- a/rojo-test/syncback-tests/nested_projects/input-project/default.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "nested_projects", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "Nested": { - "$path": "nested.project.json" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects/input-project/nested.project.json b/rojo-test/syncback-tests/nested_projects/input-project/nested.project.json deleted file mode 100644 index 8cc8ad1e..00000000 --- a/rojo-test/syncback-tests/nested_projects/input-project/nested.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Nested", - "tree": { - "$className": "Configuration", - "StringValue": { - "$path": "string_value.txt" - }, - "BoolValue": { - "$className": "BoolValue" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects/input-project/string_value.txt b/rojo-test/syncback-tests/nested_projects/input-project/string_value.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/nested_projects/input.rbxl b/rojo-test/syncback-tests/nested_projects/input.rbxl deleted file mode 100644 index 4b471172..00000000 Binary files a/rojo-test/syncback-tests/nested_projects/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/nested_projects_weird/input-project/client-only.project.json b/rojo-test/syncback-tests/nested_projects_weird/input-project/client-only.project.json deleted file mode 100644 index 28468e74..00000000 --- a/rojo-test/syncback-tests/nested_projects_weird/input-project/client-only.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "client_only", - "tree": { - "$path": "src/modules" - }, - "globIgnorePaths": [ - "**Server**" - ] -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects_weird/input-project/default.project.json b/rojo-test/syncback-tests/nested_projects_weird/input-project/default.project.json deleted file mode 100644 index 9fb46e6f..00000000 --- a/rojo-test/syncback-tests/nested_projects_weird/input-project/default.project.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "nested_projects_but_weird", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "modules": { - "$path": "client-only.project.json" - } - }, - "ServerStorage": { - "modules": { - "$path": "server-only.project.json" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects_weird/input-project/server-only.project.json b/rojo-test/syncback-tests/nested_projects_weird/input-project/server-only.project.json deleted file mode 100644 index 44532ba5..00000000 --- a/rojo-test/syncback-tests/nested_projects_weird/input-project/server-only.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "server_only", - "tree": { - "$path": "src/modules" - }, - "globIgnorePaths": [ - "**Client**" - ] -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/nested_projects_weird/input-project/src/modules/.gitkeep b/rojo-test/syncback-tests/nested_projects_weird/input-project/src/modules/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/nested_projects_weird/input.rbxl b/rojo-test/syncback-tests/nested_projects_weird/input.rbxl deleted file mode 100644 index c4fad004..00000000 Binary files a/rojo-test/syncback-tests/nested_projects_weird/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/project_default_properties_remove/input-project/default.project.json b/rojo-test/syncback-tests/project_default_properties_remove/input-project/default.project.json deleted file mode 100644 index 6f0b1ade..00000000 --- a/rojo-test/syncback-tests/project_default_properties_remove/input-project/default.project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "SyncbackTest", - "tree": { - "$className": "DataModel", - "Workspace": { - "$className": "Workspace", - "TestPart": { - "$className": "Part", - "$properties": { - "Transparency": 1.0, - "Anchored": true, - "Color": [ - 1.0, - 0.0, - 0.0 - ] - } - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/project_default_properties_remove/input.rbxl b/rojo-test/syncback-tests/project_default_properties_remove/input.rbxl deleted file mode 100644 index 7ca3700a..00000000 Binary files a/rojo-test/syncback-tests/project_default_properties_remove/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/project_init/input-project/default.project.json b/rojo-test/syncback-tests/project_init/input-project/default.project.json deleted file mode 100644 index 34530a84..00000000 --- a/rojo-test/syncback-tests/project_init/input-project/default.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "project_init", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "script": { - "$path": "src" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/project_init/input-project/src/init.luau b/rojo-test/syncback-tests/project_init/input-project/src/init.luau deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/project_init/input.rbxl b/rojo-test/syncback-tests/project_init/input.rbxl deleted file mode 100644 index f1e146c9..00000000 Binary files a/rojo-test/syncback-tests/project_init/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/project_reserialize/expected/attribute_mismatch.luau b/rojo-test/syncback-tests/project_reserialize/expected/attribute_mismatch.luau deleted file mode 100644 index b6c5da36..00000000 --- a/rojo-test/syncback-tests/project_reserialize/expected/attribute_mismatch.luau +++ /dev/null @@ -1 +0,0 @@ --- satellite beef psychology response supply \ No newline at end of file diff --git a/rojo-test/syncback-tests/project_reserialize/expected/default.project.json b/rojo-test/syncback-tests/project_reserialize/expected/default.project.json deleted file mode 100644 index 60605da2..00000000 --- a/rojo-test/syncback-tests/project_reserialize/expected/default.project.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "project_reserialize", - "tree": { - "$className": "DataModel", - "Workspace": { - "attribute_mismatch": { - "$attributes": { - "foo": "bar" - }, - "$path": "attribute_mismatch.luau" - }, - "property_mismatch": { - "$path": "property_mismatch.project.json" - }, - "$properties": { - "EditorLiveScripting": { - "Enum": 0 - }, - "SignalBehavior": "Deferred", - "StreamOutBehavior": "Opportunistic", - "StreamingEnabled": true, - "StreamingIntegrityMode": "PauseOutsideLoadedArea" - }, - "$attributes": { - "Rojo_Target_CurrentCamera": "6d6ae1d713c82fae0620aa1300000375" - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/project_reserialize/expected/property_mismatch.project.json b/rojo-test/syncback-tests/project_reserialize/expected/property_mismatch.project.json deleted file mode 100644 index 1ca8b303..00000000 --- a/rojo-test/syncback-tests/project_reserialize/expected/property_mismatch.project.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "property_mismatch", - "tree": { - "$className": "BrickColorValue", - "$properties": { - "Value": { - "BrickColor": 345 - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/project_reserialize/input-project/attribute_mismatch.luau b/rojo-test/syncback-tests/project_reserialize/input-project/attribute_mismatch.luau deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/project_reserialize/input-project/default.project.json b/rojo-test/syncback-tests/project_reserialize/input-project/default.project.json deleted file mode 100644 index 1991bb91..00000000 --- a/rojo-test/syncback-tests/project_reserialize/input-project/default.project.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "project_reserialize", - "tree": { - "$className": "Folder", - "attribute_mismatch": { - "$attributes": { - "foo": "bar" - }, - "$path": "attribute_mismatch.luau" - }, - "property_mismatch": { - "$path": "property_mismatch.project.json" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/project_reserialize/input-project/property_mismatch.project.json b/rojo-test/syncback-tests/project_reserialize/input-project/property_mismatch.project.json deleted file mode 100644 index cb34ee96..00000000 --- a/rojo-test/syncback-tests/project_reserialize/input-project/property_mismatch.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "property_mismatch", - "tree": { - "$className": "BrickColorValue" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/project_reserialize/input.rbxm b/rojo-test/syncback-tests/project_reserialize/input.rbxm deleted file mode 100644 index ae955999..00000000 Binary files a/rojo-test/syncback-tests/project_reserialize/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/rbxm_fallback/input-project/default.project.json b/rojo-test/syncback-tests/rbxm_fallback/input-project/default.project.json deleted file mode 100644 index 9c390105..00000000 --- a/rojo-test/syncback-tests/rbxm_fallback/input-project/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "rbxm_fallback", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/rbxm_fallback/input-project/src/ChildWithDuplicates/.gitkeep b/rojo-test/syncback-tests/rbxm_fallback/input-project/src/ChildWithDuplicates/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/rbxm_fallback/input.rbxm b/rojo-test/syncback-tests/rbxm_fallback/input.rbxm deleted file mode 100644 index 37659d94..00000000 Binary files a/rojo-test/syncback-tests/rbxm_fallback/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/ref_properties/input-project/default.project.json b/rojo-test/syncback-tests/ref_properties/input-project/default.project.json deleted file mode 100644 index c2dd62c3..00000000 --- a/rojo-test/syncback-tests/ref_properties/input-project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "ref_properties", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties/input-project/src/pointer.model.json b/rojo-test/syncback-tests/ref_properties/input-project/src/pointer.model.json deleted file mode 100644 index 54160c22..00000000 --- a/rojo-test/syncback-tests/ref_properties/input-project/src/pointer.model.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "className": "ObjectValue" -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties/input-project/src/target.model.json b/rojo-test/syncback-tests/ref_properties/input-project/src/target.model.json deleted file mode 100644 index f450e412..00000000 --- a/rojo-test/syncback-tests/ref_properties/input-project/src/target.model.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "className": "Folder" -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties/input.rbxl b/rojo-test/syncback-tests/ref_properties/input.rbxl deleted file mode 100644 index af3e1ac0..00000000 Binary files a/rojo-test/syncback-tests/ref_properties/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/ref_properties_blank/input-project/default.project.json b/rojo-test/syncback-tests/ref_properties_blank/input-project/default.project.json deleted file mode 100644 index dd721ce7..00000000 --- a/rojo-test/syncback-tests/ref_properties_blank/input-project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "ref_properties_blank", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_blank/input-project/src/.gitkeep b/rojo-test/syncback-tests/ref_properties_blank/input-project/src/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/ref_properties_blank/input.rbxl b/rojo-test/syncback-tests/ref_properties_blank/input.rbxl deleted file mode 100644 index 3675729e..00000000 Binary files a/rojo-test/syncback-tests/ref_properties_blank/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/ref_properties_conflict/input-project/default.project.json b/rojo-test/syncback-tests/ref_properties_conflict/input-project/default.project.json deleted file mode 100644 index 765340a2..00000000 --- a/rojo-test/syncback-tests/ref_properties_conflict/input-project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "ref_properties_conflict", - "tree": { - "$className": "DataModel", - "ReplicatedStorage": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Pointer_1.model.json b/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Pointer_1.model.json deleted file mode 100644 index c39022dc..00000000 --- a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Pointer_1.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "identical ID" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Pointer_2.model.json b/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Pointer_2.model.json deleted file mode 100644 index c39022dc..00000000 --- a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Pointer_2.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "identical ID" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Target_1.model.json b/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Target_1.model.json deleted file mode 100644 index 0e54f027..00000000 --- a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Target_1.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "Folder", - "attributes": { - "Rojo_Id": "identical ID" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Target_2.model.json b/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Target_2.model.json deleted file mode 100644 index 0e54f027..00000000 --- a/rojo-test/syncback-tests/ref_properties_conflict/input-project/src/Target_2.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "Folder", - "attributes": { - "Rojo_Id": "identical ID" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_conflict/input.rbxl b/rojo-test/syncback-tests/ref_properties_conflict/input.rbxl deleted file mode 100644 index 0aee7958..00000000 Binary files a/rojo-test/syncback-tests/ref_properties_conflict/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/default.project.json b/rojo-test/syncback-tests/ref_properties_duplicate/input-project/default.project.json deleted file mode 100644 index 968375e9..00000000 --- a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ref_properties_duplicate", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Pointer_1.model.json b/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Pointer_1.model.json deleted file mode 100644 index 3d078bc0..00000000 --- a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Pointer_1.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "an ID that should not change" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Pointer_2.model.json b/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Pointer_2.model.json deleted file mode 100644 index 3d078bc0..00000000 --- a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Pointer_2.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "ObjectValue", - "attributes": { - "Rojo_Target_Value": "an ID that should not change" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Target.model.json b/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Target.model.json deleted file mode 100644 index 8b47ff0c..00000000 --- a/rojo-test/syncback-tests/ref_properties_duplicate/input-project/src/Target.model.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "className": "Folder", - "attributes": { - "Rojo_Id": "an ID that should not change" - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_duplicate/input.rbxm b/rojo-test/syncback-tests/ref_properties_duplicate/input.rbxm deleted file mode 100644 index f26cc347..00000000 Binary files a/rojo-test/syncback-tests/ref_properties_duplicate/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/ref_properties_pruned/input-project/default.project.json b/rojo-test/syncback-tests/ref_properties_pruned/input-project/default.project.json deleted file mode 100644 index 9656479a..00000000 --- a/rojo-test/syncback-tests/ref_properties_pruned/input-project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "ref_properties_pruned", - "tree": { - "$className": "DataModel", - "ServerScriptService": { - "$path": "src" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/ref_properties_pruned/input-project/src/.gitkeep b/rojo-test/syncback-tests/ref_properties_pruned/input-project/src/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/ref_properties_pruned/input.rbxl b/rojo-test/syncback-tests/ref_properties_pruned/input.rbxl deleted file mode 100644 index 1513ff11..00000000 Binary files a/rojo-test/syncback-tests/ref_properties_pruned/input.rbxl and /dev/null differ diff --git a/rojo-test/syncback-tests/respect_old_middleware/input-project/default.project.json b/rojo-test/syncback-tests/respect_old_middleware/input-project/default.project.json deleted file mode 100644 index bac8234a..00000000 --- a/rojo-test/syncback-tests/respect_old_middleware/input-project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "respect_old_middleware", - "tree": { - "$path": "src", - "project_node": { - "$className": "BoolValue" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/respect_old_middleware/input-project/src/model_json.model.json b/rojo-test/syncback-tests/respect_old_middleware/input-project/src/model_json.model.json deleted file mode 100644 index a095016a..00000000 --- a/rojo-test/syncback-tests/respect_old_middleware/input-project/src/model_json.model.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "className": "StringValue" -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/respect_old_middleware/input-project/src/rbxm.rbxm b/rojo-test/syncback-tests/respect_old_middleware/input-project/src/rbxm.rbxm deleted file mode 100644 index c29baaaf..00000000 Binary files a/rojo-test/syncback-tests/respect_old_middleware/input-project/src/rbxm.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/respect_old_middleware/input-project/src/rbxmx.rbxmx b/rojo-test/syncback-tests/respect_old_middleware/input-project/src/rbxmx.rbxmx deleted file mode 100644 index 19d4451d..00000000 --- a/rojo-test/syncback-tests/respect_old_middleware/input-project/src/rbxmx.rbxmx +++ /dev/null @@ -1,15 +0,0 @@ - - true - null - nil - - - - 0 - false - rbxmx - -1 - - - - \ No newline at end of file diff --git a/rojo-test/syncback-tests/respect_old_middleware/input.rbxm b/rojo-test/syncback-tests/respect_old_middleware/input.rbxm deleted file mode 100644 index 6bee5530..00000000 Binary files a/rojo-test/syncback-tests/respect_old_middleware/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/schema_roundtrip/input-project/default.project.json b/rojo-test/syncback-tests/schema_roundtrip/input-project/default.project.json deleted file mode 100644 index 11afd6a1..00000000 --- a/rojo-test/syncback-tests/schema_roundtrip/input-project/default.project.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "rojo/project-schema", - "name": "schema_roundtrip", - "tree": { - "$className": "Folder", - "src": { - "$path": "src" - }, - "trigger_reserialization": { - "$className": "BoolValue" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/adjacent.luau b/rojo-test/syncback-tests/schema_roundtrip/input-project/src/adjacent.luau deleted file mode 100644 index e6a3e324..00000000 --- a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/adjacent.luau +++ /dev/null @@ -1 +0,0 @@ --- This file should be ignored. diff --git a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/adjacent.meta.json b/rojo-test/syncback-tests/schema_roundtrip/input-project/src/adjacent.meta.json deleted file mode 100644 index dfb24cd3..00000000 --- a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/adjacent.meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "$schema": "rojo/adjacent-meta" -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/init/init.meta.json b/rojo-test/syncback-tests/schema_roundtrip/input-project/src/init/init.meta.json deleted file mode 100644 index 4c03d42f..00000000 --- a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/init/init.meta.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "$schema": "rojo/init-meta" -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/model.model.json b/rojo-test/syncback-tests/schema_roundtrip/input-project/src/model.model.json deleted file mode 100644 index 41bf34ce..00000000 --- a/rojo-test/syncback-tests/schema_roundtrip/input-project/src/model.model.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "rojo/model.json", - "className": "BoolValue", - "properties": { - "Value": true - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/schema_roundtrip/input.rbxm b/rojo-test/syncback-tests/schema_roundtrip/input.rbxm deleted file mode 100644 index e8bbc388..00000000 Binary files a/rojo-test/syncback-tests/schema_roundtrip/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/string_value_project/input-project/default.project.json b/rojo-test/syncback-tests/string_value_project/input-project/default.project.json deleted file mode 100644 index 13871dd2..00000000 --- a/rojo-test/syncback-tests/string_value_project/input-project/default.project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "string_value_project", - "tree": { - "$className": "Folder", - "on_file_system": { - "$path": "string_value.txt" - }, - "inside_project_file": { - "$className": "StringValue" - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/string_value_project/input-project/string_value.txt b/rojo-test/syncback-tests/string_value_project/input-project/string_value.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/rojo-test/syncback-tests/string_value_project/input.rbxm b/rojo-test/syncback-tests/string_value_project/input.rbxm deleted file mode 100644 index 7cafbe93..00000000 Binary files a/rojo-test/syncback-tests/string_value_project/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/sync_rules/input-project/default.project.json b/rojo-test/syncback-tests/sync_rules/input-project/default.project.json deleted file mode 100644 index c6f08c56..00000000 --- a/rojo-test/syncback-tests/sync_rules/input-project/default.project.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "sync_rules", - "tree": { - "$path": "src" - }, - "syncRules": [ - { - "use": "text", - "pattern": "*.text" - }, - { - "use": "moduleScript", - "pattern": "*.modulescript" - } - ] -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/sync_rules/input-project/src/module.modulescript b/rojo-test/syncback-tests/sync_rules/input-project/src/module.modulescript deleted file mode 100644 index ef32f608..00000000 --- a/rojo-test/syncback-tests/sync_rules/input-project/src/module.modulescript +++ /dev/null @@ -1 +0,0 @@ --- This should be a in the file 'module.modulescript'. It should be updated to have a second line. \ No newline at end of file diff --git a/rojo-test/syncback-tests/sync_rules/input-project/src/text.text b/rojo-test/syncback-tests/sync_rules/input-project/src/text.text deleted file mode 100644 index 0bbe8d4f..00000000 --- a/rojo-test/syncback-tests/sync_rules/input-project/src/text.text +++ /dev/null @@ -1 +0,0 @@ --- This should be a in the file 'text.text'. It should be updated to have a second line. \ No newline at end of file diff --git a/rojo-test/syncback-tests/sync_rules/input.rbxm b/rojo-test/syncback-tests/sync_rules/input.rbxm deleted file mode 100644 index c6f3beef..00000000 Binary files a/rojo-test/syncback-tests/sync_rules/input.rbxm and /dev/null differ diff --git a/rojo-test/syncback-tests/unscriptable_properties/input-project/default.project.json b/rojo-test/syncback-tests/unscriptable_properties/input-project/default.project.json deleted file mode 100644 index 08a4e829..00000000 --- a/rojo-test/syncback-tests/unscriptable_properties/input-project/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "unscriptable_properties", - "tree": { - "$className": "BinaryStringValue" - }, - "syncbackRules": { - "syncUnscriptable": true - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/unscriptable_properties/input.rbxm b/rojo-test/syncback-tests/unscriptable_properties/input.rbxm deleted file mode 100644 index b4fb42c6..00000000 Binary files a/rojo-test/syncback-tests/unscriptable_properties/input.rbxm and /dev/null differ diff --git a/rokit.toml b/rokit.toml deleted file mode 100644 index 67dafa12..00000000 --- a/rokit.toml +++ /dev/null @@ -1,6 +0,0 @@ -[tools] -rojo = "rojo-rbx/rojo@7.5.1" -selene = "Kampfkarren/selene@0.29.0" -stylua = "JohnnyMorganz/stylua@2.1.0" -run-in-roblox = "rojo-rbx/run-in-roblox@0.3.0" -lune = "lune-org/lune@0.10.4" diff --git a/scripts/unit-test-plugin.sh b/scripts/unit-test-plugin.sh deleted file mode 100644 index c7ff7c79..00000000 --- a/scripts/unit-test-plugin.sh +++ /dev/null @@ -1,2 +0,0 @@ -rojo build plugin/test-place.project.json -o TestPlace.rbxl -run-in-roblox --script plugin/run-tests.server.lua --place TestPlace.rbxl \ No newline at end of file diff --git a/scripts/watch-build-plugin.sh b/scripts/watch-build-plugin.sh deleted file mode 100644 index c21397f2..00000000 --- a/scripts/watch-build-plugin.sh +++ /dev/null @@ -1 +0,0 @@ -rojo build plugin.project.json --plugin Rojo.rbxm --watch \ No newline at end of file diff --git a/selene.toml b/selene.toml index 857227a4..16c0939f 100644 --- a/selene.toml +++ b/selene.toml @@ -2,6 +2,3 @@ std = "roblox+testez" [config] unused_variable = { allow_unused_self = true } - -[lints] -roblox_manual_fromscale_or_fromoffset = "allow" diff --git a/src/change_processor.rs b/src/change_processor.rs index c1f245f2..7082a687 100644 --- a/src/change_processor.rs +++ b/src/change_processor.rs @@ -1,13 +1,13 @@ -use crossbeam_channel::{select, Receiver, RecvError, Sender}; -use jod_thread::JoinHandle; -use memofs::{IoResultExt, Vfs, VfsEvent}; -use rbx_dom_weak::types::{Ref, Variant}; -use std::path::PathBuf; use std::{ fs, sync::{Arc, Mutex}, }; +use crossbeam_channel::{select, Receiver, RecvError, Sender}; +use jod_thread::JoinHandle; +use memofs::{IoResultExt, Vfs, VfsEvent}; +use rbx_dom_weak::types::{Ref, Variant}; + use crate::{ message_queue::MessageQueue, snapshot::{ @@ -114,49 +114,6 @@ struct JobThreadContext { } impl JobThreadContext { - /// Computes and applies patches to the DOM for a given file path. - /// - /// This function finds the nearest ancestor to the given path that has associated instances - /// in the tree. - /// It then computes and applies changes for each affected instance ID and - /// returns a vector of applied patch sets. - fn apply_patches(&self, path: PathBuf) -> Vec { - let mut tree = self.tree.lock().unwrap(); - let mut applied_patches = Vec::new(); - - // Find the nearest ancestor to this path that has - // associated instances in the tree. This helps make sure - // that we handle additions correctly, especially if we - // receive events for descendants of a large tree being - // created all at once. - let mut current_path = path.as_path(); - let affected_ids = loop { - let ids = tree.get_ids_at_path(current_path); - - log::trace!("Path {} affects IDs {:?}", current_path.display(), ids); - - if !ids.is_empty() { - break ids.to_vec(); - } - - log::trace!("Trying parent path..."); - match current_path.parent() { - Some(parent) => current_path = parent, - None => break Vec::new(), - } - }; - - for id in affected_ids { - if let Some(patch) = compute_and_apply_changes(&mut tree, &self.vfs, id) { - if !patch.is_empty() { - applied_patches.push(patch); - } - } - } - - applied_patches - } - fn handle_vfs_event(&self, event: VfsEvent) { log::trace!("Vfs event: {:?}", event); @@ -167,22 +124,44 @@ impl JobThreadContext { // For a given VFS event, we might have many changes to different parts // of the tree. Calculate and apply all of these changes. - let applied_patches = match event { - VfsEvent::Create(path) | VfsEvent::Write(path) => { - self.apply_patches(self.vfs.canonicalize(&path).unwrap()) - } - VfsEvent::Remove(path) => { - // MemoFS does not track parent removals yet, so we can canonicalize - // the parent path safely and then append the removed path's file name. - let parent = path.parent().unwrap(); - let file_name = path.file_name().unwrap(); - let parent_normalized = self.vfs.canonicalize(parent).unwrap(); - self.apply_patches(parent_normalized.join(file_name)) - } - _ => { - log::warn!("Unhandled VFS event: {:?}", event); - Vec::new() + let applied_patches = { + let mut tree = self.tree.lock().unwrap(); + let mut applied_patches = Vec::new(); + + match event { + VfsEvent::Create(path) | VfsEvent::Write(path) | VfsEvent::Remove(path) => { + // Find the nearest ancestor to this path that has + // associated instances in the tree. This helps make sure + // that we handle additions correctly, especially if we + // receive events for descendants of a large tree being + // created all at once. + let mut current_path = path.as_path(); + let affected_ids = loop { + let ids = tree.get_ids_at_path(¤t_path); + + log::trace!("Path {} affects IDs {:?}", current_path.display(), ids); + + if !ids.is_empty() { + break ids.to_vec(); + } + + log::trace!("Trying parent path..."); + match current_path.parent() { + Some(parent) => current_path = parent, + None => break Vec::new(), + } + }; + + for id in affected_ids { + if let Some(patch) = compute_and_apply_changes(&mut tree, &self.vfs, id) { + applied_patches.push(patch); + } + } + } + _ => log::warn!("Unhandled VFS event: {:?}", event), } + + applied_patches }; // Notify anyone listening to the message queue about the changes we @@ -200,16 +179,8 @@ impl JobThreadContext { if let Some(instance) = tree.get_instance(id) { if let Some(instigating_source) = &instance.metadata().instigating_source { match instigating_source { - InstigatingSource::Path(path) => { - if let Err(err) = fs::remove_file(path) { - log::error!( - "Failed to remove file {}: {}", - path.display(), - err - ); - } - } - InstigatingSource::ProjectNode { .. } => { + InstigatingSource::Path(path) => fs::remove_file(path).unwrap(), + InstigatingSource::ProjectNode(_, _, _, _) => { log::warn!( "Cannot remove instance {:?}, it's from a project file", id @@ -252,18 +223,12 @@ impl JobThreadContext { match instigating_source { InstigatingSource::Path(path) => { if let Some(Variant::String(value)) = changed_value { - if let Err(err) = fs::write(path, value) { - log::error!( - "Failed to write file {}: {}", - path.display(), - err - ); - } + fs::write(path, value).unwrap(); } else { log::warn!("Cannot change Source to non-string value."); } } - InstigatingSource::ProjectNode { .. } => { + InstigatingSource::ProjectNode(_, _, _, _) => { log::warn!( "Cannot remove instance {:?}, it's from a project file", id @@ -288,9 +253,7 @@ impl JobThreadContext { apply_patch_set(&mut tree, patch_set) }; - if !applied_patch.is_empty() { - self.message_queue.push_messages(&[applied_patch]); - } + self.message_queue.push_messages(&[applied_patch]); } } @@ -320,7 +283,7 @@ fn compute_and_apply_changes(tree: &mut RojoTree, vfs: &Vfs, id: Ref) -> Option< // path still exists. We can generate a snapshot starting at // that path and use it as the source for our patch. - let snapshot = match snapshot_from_vfs(&metadata.context, vfs, path) { + let snapshot = match snapshot_from_vfs(&metadata.context, &vfs, &path) { Ok(snapshot) => snapshot, Err(err) => { log::error!("Snapshot error: {:?}", err); @@ -328,7 +291,7 @@ fn compute_and_apply_changes(tree: &mut RojoTree, vfs: &Vfs, id: Ref) -> Option< } }; - let patch_set = compute_patch_set(snapshot, tree, id); + let patch_set = compute_patch_set(snapshot.as_ref(), &tree, id); apply_patch_set(tree, patch_set) } Ok(None) => { @@ -349,22 +312,17 @@ fn compute_and_apply_changes(tree: &mut RojoTree, vfs: &Vfs, id: Ref) -> Option< } }, - InstigatingSource::ProjectNode { - path, - name, - node, - parent_class, - } => { + InstigatingSource::ProjectNode(project_path, instance_name, project_node, parent_class) => { // This instance is the direct subject of a project node. Since // there might be information associated with our instance from // the project file, we snapshot the entire project node again. let snapshot_result = snapshot_project_node( &metadata.context, - path, - name, - node, - vfs, + &project_path, + instance_name, + project_node, + &vfs, parent_class.as_ref().map(|name| name.as_str()), ); @@ -376,7 +334,7 @@ fn compute_and_apply_changes(tree: &mut RojoTree, vfs: &Vfs, id: Ref) -> Option< } }; - let patch_set = compute_patch_set(snapshot, tree, id); + let patch_set = compute_patch_set(snapshot.as_ref(), &tree, id); apply_patch_set(tree, patch_set) } }; diff --git a/src/cli/build.rs b/src/cli/build.rs index 82e81387..38273f82 100644 --- a/src/cli/build.rs +++ b/src/cli/build.rs @@ -1,14 +1,12 @@ use std::{ io::{BufWriter, Write}, - mem::forget, path::{Path, PathBuf}, }; -use anyhow::{bail, Context}; -use clap::{CommandFactory, Parser}; +use anyhow::Context; use fs_err::File; use memofs::Vfs; -use roblox_install::RobloxStudio; +use structopt::StructOpt; use tokio::runtime::Runtime; use crate::serve_session::ServeSession; @@ -17,96 +15,52 @@ use super::resolve_path; const UNKNOWN_OUTPUT_KIND_ERR: &str = "Could not detect what kind of file to build. \ Expected output file to end in .rbxl, .rbxlx, .rbxm, or .rbxmx."; -const UNKNOWN_PLUGIN_KIND_ERR: &str = "Could not detect what kind of file to build. \ - Expected plugin file to end in .rbxm or .rbxmx."; /// Generates a model or place file from the Rojo project. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct BuildCommand { - /// Path to the project to build. Defaults to the current directory. - #[clap(default_value = "")] + /// Path to the project to serve. Defaults to the current directory. + #[structopt(default_value = "")] pub project: PathBuf, /// Where to output the result. /// /// Should end in .rbxm, .rbxl, .rbxmx, or .rbxlx. - #[clap(long, short, conflicts_with = "plugin")] - pub output: Option, - - /// Alternative to the output flag that outputs the result in the local plugins folder. - /// - /// Should end in .rbxm or .rbxl. - #[clap(long, short, conflicts_with = "output")] - pub plugin: Option, + #[structopt(long, short)] + pub output: PathBuf, /// Whether to automatically rebuild when any input files change. - #[clap(long)] + #[structopt(long)] pub watch: bool, } impl BuildCommand { pub fn run(self) -> anyhow::Result<()> { - let (output_path, output_kind) = match (self.output, self.plugin) { - (None, None) => { - BuildCommand::command() - .error( - clap::ErrorKind::MissingRequiredArgument, - "one of the following arguments must be provided: \n --output \n --plugin ", - ) - .exit(); - } - (Some(output), None) => { - let output_kind = - OutputKind::from_output_path(&output).context(UNKNOWN_OUTPUT_KIND_ERR)?; + let project_path = resolve_path(&self.project); - (output, output_kind) - } - (None, Some(plugin)) => { - if plugin.is_absolute() { - bail!("plugin flag path cannot be absolute.") - } - - let output_kind = - OutputKind::from_plugin_path(&plugin).context(UNKNOWN_PLUGIN_KIND_ERR)?; - let studio = RobloxStudio::locate()?; - - (studio.plugins_path().join(&plugin), output_kind) - } - _ => unreachable!(), - }; - - let project_path = resolve_path(&self.project)?; + let output_kind = detect_output_kind(&self.output).context(UNKNOWN_OUTPUT_KIND_ERR)?; log::trace!("Constructing in-memory filesystem"); - let vfs = Vfs::new_default()?; + let vfs = Vfs::new_default(); vfs.set_watch_enabled(self.watch); - let session = ServeSession::new(vfs, project_path)?; + let session = ServeSession::new(vfs, &project_path)?; let mut cursor = session.message_queue().cursor(); - write_model(&session, &output_path, output_kind)?; + write_model(&session, &self.output, output_kind)?; if self.watch { - let rt = Runtime::new().context("Failed to start the async runtime for watch mode")?; + let rt = Runtime::new().unwrap(); loop { let receiver = session.message_queue().subscribe(cursor); - let (new_cursor, _patch_set) = match rt.block_on(receiver) { - Ok(message) => message, - // The message queue was dropped, so there is nothing left - // to watch. Stop watching gracefully. - Err(_) => break, - }; + let (new_cursor, _patch_set) = rt.block_on(receiver).unwrap(); cursor = new_cursor; - write_model(&session, &output_path, output_kind)?; + write_model(&session, &self.output, output_kind)?; } } - // Avoid dropping ServeSession: it's potentially VERY expensive to drop - // and we're about to exit anyways. - forget(session); - Ok(()) } } @@ -127,35 +81,22 @@ enum OutputKind { Rbxl, } -impl OutputKind { - fn from_output_path(output: &Path) -> Option { - let extension = output.extension()?.to_str()?; +fn detect_output_kind(output: &Path) -> Option { + let extension = output.extension()?.to_str()?; - match extension { - "rbxlx" => Some(OutputKind::Rbxlx), - "rbxmx" => Some(OutputKind::Rbxmx), - "rbxl" => Some(OutputKind::Rbxl), - "rbxm" => Some(OutputKind::Rbxm), - _ => None, - } - } - - fn from_plugin_path(output: &Path) -> Option { - let extension = output.extension()?.to_str()?; - - match extension { - "rbxmx" => Some(OutputKind::Rbxmx), - "rbxm" => Some(OutputKind::Rbxm), - _ => None, - } + match extension { + "rbxlx" => Some(OutputKind::Rbxlx), + "rbxmx" => Some(OutputKind::Rbxmx), + "rbxl" => Some(OutputKind::Rbxl), + "rbxm" => Some(OutputKind::Rbxm), + _ => None, } } -fn xml_encode_config() -> rbx_xml::EncodeOptions<'static> { +fn xml_encode_config() -> rbx_xml::EncodeOptions { rbx_xml::EncodeOptions::new().property_behavior(rbx_xml::EncodePropertyBehavior::WriteUnknown) } -#[profiling::function] fn write_model( session: &ServeSession, output: &Path, diff --git a/src/cli/doc.rs b/src/cli/doc.rs index 61a8d416..9a344997 100644 --- a/src/cli/doc.rs +++ b/src/cli/doc.rs @@ -1,7 +1,7 @@ -use clap::Parser; +use structopt::StructOpt; /// Open Rojo's documentation in your browser. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct DocCommand {} impl DocCommand { diff --git a/src/cli/fmt_project.rs b/src/cli/fmt_project.rs index e1c7adaa..e227fa44 100644 --- a/src/cli/fmt_project.rs +++ b/src/cli/fmt_project.rs @@ -1,34 +1,27 @@ use std::path::PathBuf; use anyhow::Context; -use clap::Parser; -use memofs::Vfs; +use structopt::StructOpt; use crate::project::Project; -use super::resolve_path; - /// Reformat a Rojo project using the standard JSON formatting rules. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct FmtProjectCommand { /// Path to the project to format. Defaults to the current directory. - #[clap(default_value = "")] + #[structopt(default_value = "")] pub project: PathBuf, } impl FmtProjectCommand { pub fn run(self) -> anyhow::Result<()> { - let vfs = Vfs::new_default()?; - vfs.set_watch_enabled(false); - - let base_path = resolve_path(&self.project)?; - let project = Project::load_fuzzy(&vfs, &base_path)? + let project = Project::load_fuzzy(&self.project)? .context("A project file is required to run 'rojo fmt-project'")?; let serialized = serde_json::to_string_pretty(&project) .context("could not re-encode project file as JSON")?; - fs_err::write(&project.file_location, serialized) + fs_err::write(&project.file_location, &serialized) .context("could not write back to project file")?; Ok(()) diff --git a/src/cli/init.rs b/src/cli/init.rs index 434c2e34..3117b61f 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -1,50 +1,41 @@ +use std::io::{self, Write}; +use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; use std::str::FromStr; -use std::{ - collections::VecDeque, - path::{Path, PathBuf}, -}; -use std::{ - ffi::OsStr, - io::{self, Write}, -}; -use anyhow::{bail, format_err, Context}; -use clap::Parser; +use anyhow::{bail, format_err}; use fs_err as fs; use fs_err::OpenOptions; -use memofs::{InMemoryFs, Vfs, VfsSnapshot}; +use structopt::StructOpt; use super::resolve_path; -const GIT_IGNORE_PLACEHOLDER: &str = "gitignore.txt"; +static MODEL_PROJECT: &str = + include_str!("../../assets/default-model-project/default.project.json"); +static MODEL_README: &str = include_str!("../../assets/default-model-project/README.md"); +static MODEL_INIT: &str = include_str!("../../assets/default-model-project/src-init.lua"); +static MODEL_GIT_IGNORE: &str = include_str!("../../assets/default-model-project/gitignore.txt"); -static TEMPLATE_BINCODE: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/templates.bincode")); +static PLACE_PROJECT: &str = + include_str!("../../assets/default-place-project/default.project.json"); +static PLACE_README: &str = include_str!("../../assets/default-place-project/README.md"); +static PLACE_GIT_IGNORE: &str = include_str!("../../assets/default-place-project/gitignore.txt"); /// Initializes a new Rojo project. -/// -/// By default, this will attempt to initialize a 'git' repository in the -/// project directory if `git` is installed. To avoid this, pass `--skip-git`. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct InitCommand { /// Path to the place to create the project. Defaults to the current directory. - #[clap(default_value = "")] + #[structopt(default_value = "")] pub path: PathBuf, - /// The kind of project to create, 'place', 'plugin', or 'model'. - #[clap(long, default_value = "place")] + /// The kind of project to create, 'place' or 'model'. Defaults to place. + #[structopt(long, default_value = "place")] pub kind: InitKind, - - /// Skips the initialization of a git repository. - #[clap(long)] - pub skip_git: bool, } impl InitCommand { pub fn run(self) -> anyhow::Result<()> { - let template = self.kind.template()?; - - let base_path = resolve_path(&self.path)?; + let base_path = resolve_path(&self.path); fs::create_dir_all(&base_path)?; let canonical = fs::canonicalize(&base_path)?; @@ -57,55 +48,9 @@ impl InitCommand { name: project_name.to_owned(), }; - println!( - "Creating new {:?} project '{}'", - self.kind, project_params.name - ); - - let vfs = Vfs::new(template); - vfs.set_watch_enabled(false); - - let mut queue = VecDeque::with_capacity(8); - for entry in vfs.read_dir("")? { - queue.push_back(entry?.path().to_path_buf()) - } - - while let Some(mut path) = queue.pop_front() { - let metadata = vfs.metadata(&path)?; - if metadata.is_dir() { - fs_err::create_dir(base_path.join(&path))?; - for entry in vfs.read_dir(&path)? { - queue.push_back(entry?.path().to_path_buf()); - } - } else { - let content = vfs.read_to_string_lf_normalized(&path)?; - if let Some(file_stem) = path.file_name().and_then(OsStr::to_str) { - if file_stem == GIT_IGNORE_PLACEHOLDER { - if self.skip_git { - continue; - } else { - path.set_file_name(".gitignore"); - } - } - } - write_if_not_exists( - &base_path.join(&path), - &project_params.render_template(&content), - )?; - } - } - - if !self.skip_git && should_git_init(&base_path) { - log::debug!("Initializing Git repository..."); - - let status = Command::new("git") - .arg("init") - .current_dir(&base_path) - .status()?; - - if !status.success() { - bail!("git init failed: status code {:?}", status.code()); - } + match self.kind { + InitKind::Place => init_place(&base_path, project_params)?, + InitKind::Model => init_model(&base_path, project_params)?, } println!("Created project successfully."); @@ -120,41 +65,8 @@ pub enum InitKind { /// A place that contains a baseplate. Place, - /// An empty model, suitable for a library. + /// An empty model, suitable for a library or plugin. Model, - - /// An empty plugin. - Plugin, -} - -impl InitKind { - fn template(&self) -> anyhow::Result { - let template_path = match self { - Self::Place => "place", - Self::Model => "model", - Self::Plugin => "plugin", - }; - - let snapshot: VfsSnapshot = bincode::deserialize(TEMPLATE_BINCODE) - .context("Rojo's templates were not properly packed into Rojo's binary. This is a bug in Rojo; please file an issue.")?; - - let VfsSnapshot::Dir { mut children } = snapshot else { - bail!("Rojo's templates were packed as a file instead of a directory. This is a bug in Rojo; please file an issue."); - }; - - let template = children.remove(template_path).ok_or_else(|| { - format_err!( - "The template for project type {:?} is missing. This is a bug in Rojo; please file an issue.", - self - ) - })?; - - let mut fs = InMemoryFs::new(); - fs.load_snapshot("", template) - .context("Failed to load Rojo's bundled template into memory")?; - - Ok(fs) - } } impl FromStr for InitKind { @@ -164,15 +76,77 @@ impl FromStr for InitKind { match source { "place" => Ok(InitKind::Place), "model" => Ok(InitKind::Model), - "plugin" => Ok(InitKind::Plugin), _ => Err(format_err!( - "Invalid init kind '{}'. Valid kinds are: place, model, plugin", + "Invalid init kind '{}'. Valid kinds are: place, model", source )), } } } +fn init_place(base_path: &Path, project_params: ProjectParams) -> anyhow::Result<()> { + println!("Creating new place project '{}'", project_params.name); + + let project_file = project_params.render_template(PLACE_PROJECT); + try_create_project(base_path, &project_file)?; + + let readme = project_params.render_template(PLACE_README); + write_if_not_exists(&base_path.join("README.md"), &readme)?; + + let src = base_path.join("src"); + fs::create_dir_all(&src)?; + + let src_shared = src.join("shared"); + fs::create_dir_all(src.join(&src_shared))?; + + let src_server = src.join("server"); + fs::create_dir_all(src.join(&src_server))?; + + let src_client = src.join("client"); + fs::create_dir_all(src.join(&src_client))?; + + write_if_not_exists( + &src_shared.join("Hello.lua"), + "return function()\n\tprint(\"Hello, world!\")\nend", + )?; + + write_if_not_exists( + &src_server.join("init.server.lua"), + "print(\"Hello world, from server!\")", + )?; + + write_if_not_exists( + &src_client.join("init.client.lua"), + "print(\"Hello world, from client!\")", + )?; + + let git_ignore = project_params.render_template(PLACE_GIT_IGNORE); + try_git_init(base_path, &git_ignore)?; + + Ok(()) +} + +fn init_model(base_path: &Path, project_params: ProjectParams) -> anyhow::Result<()> { + println!("Creating new model project '{}'", project_params.name); + + let project_file = project_params.render_template(MODEL_PROJECT); + try_create_project(base_path, &project_file)?; + + let readme = project_params.render_template(MODEL_README); + write_if_not_exists(&base_path.join("README.md"), &readme)?; + + let src = base_path.join("src"); + fs::create_dir_all(&src)?; + + let init = project_params.render_template(MODEL_INIT); + write_if_not_exists(&src.join("init.lua"), &init)?; + + let git_ignore = project_params.render_template(MODEL_GIT_IGNORE); + try_git_init(base_path, &git_ignore)?; + + Ok(()) +} + /// Contains parameters used in templates to create a project. struct ProjectParams { name: String, @@ -187,13 +161,30 @@ impl ProjectParams { } } +/// Attempt to initialize a Git repository if necessary, and create .gitignore. +fn try_git_init(path: &Path, git_ignore: &str) -> Result<(), anyhow::Error> { + if should_git_init(path) { + log::debug!("Initializing Git repository..."); + + let status = Command::new("git").arg("init").current_dir(path).status()?; + + if !status.success() { + bail!("git init failed: status code {:?}", status.code()); + } + } + + write_if_not_exists(&path.join(".gitignore"), git_ignore)?; + + Ok(()) +} + /// Tells whether we should initialize a Git repository inside the given path. /// /// Will return false if the user doesn't have Git installed or if the path is /// already inside a Git repository. fn should_git_init(path: &Path) -> bool { let result = Command::new("git") - .args(["rev-parse", "--is-inside-work-tree"]) + .args(&["rev-parse", "--is-inside-work-tree"]) .stdout(Stdio::null()) .stderr(Stdio::null()) .current_dir(path) @@ -227,3 +218,29 @@ fn write_if_not_exists(path: &Path, contents: &str) -> Result<(), anyhow::Error> Ok(()) } + +/// Try to create a project file and fail if it already exists. +fn try_create_project(base_path: &Path, contents: &str) -> Result<(), anyhow::Error> { + let project_path = base_path.join("default.project.json"); + + let file_res = OpenOptions::new() + .write(true) + .create_new(true) + .open(&project_path); + + let mut file = match file_res { + Ok(file) => file, + Err(err) => { + return match err.kind() { + io::ErrorKind::AlreadyExists => { + bail!("Project file already exists: {}", project_path.display()) + } + _ => Err(err.into()), + } + } + }; + + file.write_all(contents.as_bytes())?; + + Ok(()) +} diff --git a/src/cli/mod.rs b/src/cli/mod.rs index caef95aa..2d498b4a 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -1,4 +1,4 @@ -//! Defines Rojo's CLI through clap types. +//! Defines Rojo's CLI through structopt types. mod build; mod doc; @@ -7,13 +7,11 @@ mod init; mod plugin; mod serve; mod sourcemap; -mod syncback; mod upload; use std::{borrow::Cow, env, path::Path, str::FromStr}; -use anyhow::Context; -use clap::Parser; +use structopt::StructOpt; use thiserror::Error; pub use self::build::BuildCommand; @@ -23,18 +21,17 @@ pub use self::init::{InitCommand, InitKind}; pub use self::plugin::{PluginCommand, PluginSubcommand}; pub use self::serve::ServeCommand; pub use self::sourcemap::SourcemapCommand; -pub use self::syncback::SyncbackCommand; pub use self::upload::UploadCommand; -/// Command line options that Rojo accepts, defined using the clap crate. -#[derive(Debug, Parser)] -#[clap(name = "Rojo", version, about)] +/// Command line options that Rojo accepts, defined using the structopt crate. +#[derive(Debug, StructOpt)] +#[structopt(name = "Rojo", about, author)] pub struct Options { - #[clap(flatten)] + #[structopt(flatten)] pub global: GlobalOptions, /// Subcommand to run in this invocation. - #[clap(subcommand)] + #[structopt(subcommand)] pub subcommand: Subcommand, } @@ -49,19 +46,18 @@ impl Options { Subcommand::FmtProject(subcommand) => subcommand.run(), Subcommand::Doc(subcommand) => subcommand.run(), Subcommand::Plugin(subcommand) => subcommand.run(), - Subcommand::Syncback(subcommand) => subcommand.run(self.global), } } } -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct GlobalOptions { /// Sets verbosity level. Can be specified multiple times. - #[clap(long("verbose"), short, global(true), parse(from_occurrences))] + #[structopt(long("verbose"), short, global(true), parse(from_occurrences))] pub verbosity: u8, /// Set color behavior. Valid values are auto, always, and never. - #[clap(long("color"), global(true), default_value("auto"))] + #[structopt(long("color"), global(true), default_value("auto"))] pub color: ColorChoice, } @@ -113,7 +109,7 @@ pub struct ColorChoiceParseError { attempted: String, } -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub enum Subcommand { Init(InitCommand), Serve(ServeCommand), @@ -123,17 +119,12 @@ pub enum Subcommand { FmtProject(FmtProjectCommand), Doc(DocCommand), Plugin(PluginCommand), - Syncback(SyncbackCommand), } -pub(super) fn resolve_path(path: &Path) -> anyhow::Result> { +pub(super) fn resolve_path(path: &Path) -> Cow<'_, Path> { if path.is_absolute() { - Ok(Cow::Borrowed(path)) + Cow::Borrowed(path) } else { - let current_dir = env::current_dir().context( - "Could not determine the current working directory. \ - It may have been deleted, or Rojo may not have permission to access it.", - )?; - Ok(Cow::Owned(current_dir.join(path))) + Cow::Owned(env::current_dir().unwrap().join(path)) } } diff --git a/src/cli/plugin.rs b/src/cli/plugin.rs index af7025ca..5ab98e07 100644 --- a/src/cli/plugin.rs +++ b/src/cli/plugin.rs @@ -3,9 +3,9 @@ use std::{ io::BufWriter, }; -use clap::Parser; use memofs::{InMemoryFs, Vfs, VfsSnapshot}; use roblox_install::RobloxStudio; +use structopt::StructOpt; use crate::serve_session::ServeSession; @@ -13,14 +13,14 @@ static PLUGIN_BINCODE: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/plugin. static PLUGIN_FILE_NAME: &str = "RojoManagedPlugin.rbxm"; /// Install Rojo's plugin. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct PluginCommand { - #[clap(subcommand)] + #[structopt(subcommand)] subcommand: PluginSubcommand, } /// Manages Rojo's Roblox Studio plugin. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub enum PluginSubcommand { /// Install the plugin in Roblox Studio's plugins folder. If the plugin is /// already installed, installing it again will overwrite the current plugin @@ -46,18 +46,10 @@ impl PluginSubcommand { } } -fn initialize_plugin() -> anyhow::Result { +fn install_plugin() -> anyhow::Result<()> { let plugin_snapshot: VfsSnapshot = bincode::deserialize(PLUGIN_BINCODE) .expect("Rojo's plugin was not properly packed into Rojo's binary"); - let mut in_memory_fs = InMemoryFs::new(); - in_memory_fs.load_snapshot("/plugin", plugin_snapshot)?; - - let vfs = Vfs::new(in_memory_fs); - Ok(ServeSession::new(vfs, "/plugin")?) -} - -fn install_plugin() -> anyhow::Result<()> { let studio = RobloxStudio::locate()?; let plugins_folder_path = studio.plugins_path(); @@ -67,12 +59,17 @@ fn install_plugin() -> anyhow::Result<()> { fs::create_dir(plugins_folder_path)?; } + let mut in_memory_fs = InMemoryFs::new(); + in_memory_fs.load_snapshot("/plugin", plugin_snapshot)?; + + let vfs = Vfs::new(in_memory_fs); + let session = ServeSession::new(vfs, "/plugin")?; + let plugin_path = plugins_folder_path.join(PLUGIN_FILE_NAME); log::debug!("Writing plugin to {}", plugin_path.display()); let mut file = BufWriter::new(File::create(plugin_path)?); - let session = initialize_plugin()?; let tree = session.tree(); let root_id = tree.get_root_id(); @@ -95,8 +92,3 @@ fn uninstall_plugin() -> anyhow::Result<()> { Ok(()) } - -#[test] -fn plugin_initialize() { - let _ = initialize_plugin().unwrap(); -} diff --git a/src/cli/serve.rs b/src/cli/serve.rs index b22beb69..56b46121 100644 --- a/src/cli/serve.rs +++ b/src/cli/serve.rs @@ -5,8 +5,8 @@ use std::{ sync::Arc, }; -use clap::Parser; use memofs::Vfs; +use structopt::StructOpt; use termcolor::{BufferWriter, Color, ColorChoice, ColorSpec, WriteColor}; use crate::{serve_session::ServeSession, web::LiveServer}; @@ -17,37 +17,29 @@ const DEFAULT_BIND_ADDRESS: Ipv4Addr = Ipv4Addr::new(127, 0, 0, 1); const DEFAULT_PORT: u16 = 34872; /// Expose a Rojo project to the Rojo Studio plugin. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct ServeCommand { /// Path to the project to serve. Defaults to the current directory. - #[clap(default_value = "")] + #[structopt(default_value = "")] pub project: PathBuf, /// The IP address to listen on. Defaults to `127.0.0.1`. - #[clap(long)] + #[structopt(long)] pub address: Option, /// The port to listen on. Defaults to the project's preference, or `34872` if /// it has none. - #[clap(long)] + #[structopt(long)] pub port: Option, - - /// Extra `Host`/`Origin` values the server will accept, beyond localhost and - /// the bind address (for example a hostname like `mypc.lan`). Repeat the - /// option or comma-separate to allow several. When given, this overrides the - /// project's `serveAllowedHosts`. Listing any host also turns on Host/Origin - /// validation for binds where it is otherwise off (such as `0.0.0.0`). - #[clap(long, value_delimiter = ',')] - pub allowed_hosts: Vec, } impl ServeCommand { pub fn run(self, global: GlobalOptions) -> anyhow::Result<()> { - let project_path = resolve_path(&self.project)?; + let project_path = resolve_path(&self.project); - let vfs = Vfs::new_default()?; + let vfs = Vfs::new_default(); - let session = Arc::new(ServeSession::new(vfs, project_path)?); + let session = Arc::new(ServeSession::new(vfs, &project_path)?); let ip = self .address @@ -59,19 +51,10 @@ impl ServeCommand { .or_else(|| session.project_port()) .unwrap_or(DEFAULT_PORT); - // The CLI flag, when given, replaces the project's list rather than - // merging with it, matching how --address and --port override theirs. - let allowed_hosts = if self.allowed_hosts.is_empty() { - session.serve_allowed_hosts().to_vec() - } else { - self.allowed_hosts - }; - let server = LiveServer::new(session); - server.start((ip, port).into(), allowed_hosts, || { - let _ = show_start_message(ip, port, global.color.into()); - })?; + let _ = show_start_message(ip, port, global.color.into()); + server.start((ip, port).into()); Ok(()) } @@ -84,17 +67,15 @@ fn show_start_message(bind_address: IpAddr, port: u16, color: ColorChoice) -> io let writer = BufferWriter::stdout(color); let mut buffer = writer.buffer(); - let address_string = if bind_address.is_loopback() { - "localhost".to_owned() - } else { - bind_address.to_string() - }; - writeln!(&mut buffer, "Rojo server listening:")?; write!(&mut buffer, " Address: ")?; buffer.set_color(&green)?; - writeln!(&mut buffer, "{}", address_string)?; + if bind_address.is_loopback() { + writeln!(&mut buffer, "localhost")?; + } else { + writeln!(&mut buffer, "{}", bind_address)?; + } buffer.set_color(&ColorSpec::new())?; write!(&mut buffer, " Port: ")?; @@ -103,30 +84,11 @@ fn show_start_message(bind_address: IpAddr, port: u16, color: ColorChoice) -> io writeln!(&mut buffer)?; - if !bind_address.is_loopback() { - let mut warning = ColorSpec::new(); - warning.set_fg(Some(Color::Yellow)).set_bold(true); - - buffer.set_color(&warning)?; - writeln!( - &mut buffer, - "WARNING: This server is bound to {address_string}, which is reachable from the \ - network.\n\ - The serve API is unauthenticated, so anyone who can reach {address_string}:{port} \ - can read\n\ - and modify your project's source. Prefer binding to localhost and tunneling (e.g. \ - SSH,\n\ - Tailscale, or WireGuard) when you need remote access." - )?; - buffer.set_color(&ColorSpec::new())?; - writeln!(&mut buffer)?; - } - buffer.set_color(&ColorSpec::new())?; write!(&mut buffer, "Visit ")?; buffer.set_color(&green)?; - write!(&mut buffer, "http://{}:{}/", address_string, port)?; + write!(&mut buffer, "http://localhost:{}/", port)?; buffer.set_color(&ColorSpec::new())?; writeln!(&mut buffer, " in your browser for more information.")?; diff --git a/src/cli/snapshots/librojo__cli__sourcemap__test__maps_absolute_paths.snap b/src/cli/snapshots/librojo__cli__sourcemap__test__maps_absolute_paths.snap deleted file mode 100644 index 33e9cf31..00000000 --- a/src/cli/snapshots/librojo__cli__sourcemap__test__maps_absolute_paths.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: src/cli/sourcemap.rs -expression: sourcemap_contents ---- -{ - "name": "default", - "className": "DataModel", - "filePaths": "[...1 path omitted...]", - "children": [ - { - "name": "ReplicatedStorage", - "className": "ReplicatedStorage", - "children": [ - { - "name": "Project", - "className": "ModuleScript", - "filePaths": "[...1 path omitted...]", - "children": [ - { - "name": "Module", - "className": "Folder", - "children": [ - { - "name": "module", - "className": "ModuleScript", - "filePaths": "[...1 path omitted...]" - } - ] - } - ] - } - ] - } - ] -} diff --git a/src/cli/snapshots/librojo__cli__sourcemap__test__maps_relative_paths.snap b/src/cli/snapshots/librojo__cli__sourcemap__test__maps_relative_paths.snap deleted file mode 100644 index 7a314b8c..00000000 --- a/src/cli/snapshots/librojo__cli__sourcemap__test__maps_relative_paths.snap +++ /dev/null @@ -1,41 +0,0 @@ ---- -source: src/cli/sourcemap.rs -expression: sourcemap_contents ---- -{ - "name": "default", - "className": "DataModel", - "filePaths": [ - "default.project.json" - ], - "children": [ - { - "name": "ReplicatedStorage", - "className": "ReplicatedStorage", - "children": [ - { - "name": "Project", - "className": "ModuleScript", - "filePaths": [ - "src/init.luau" - ], - "children": [ - { - "name": "Module", - "className": "Folder", - "children": [ - { - "name": "module", - "className": "ModuleScript", - "filePaths": [ - "../module/module.luau" - ] - } - ] - } - ] - } - ] - } - ] -} diff --git a/src/cli/sourcemap.rs b/src/cli/sourcemap.rs index 2e4a7ce9..8cda48ff 100644 --- a/src/cli/sourcemap.rs +++ b/src/cli/sourcemap.rs @@ -1,86 +1,66 @@ use std::{ - borrow::Cow, io::{BufWriter, Write}, - mem::forget, - path::{self, Path, PathBuf}, + path::{Path, PathBuf}, }; -use anyhow::Context; -use clap::Parser; use fs_err::File; use memofs::Vfs; -use rayon::prelude::*; -use rbx_dom_weak::{types::Ref, Ustr}; -use serde::{Deserialize, Serialize}; -use tokio::runtime::Runtime; +use rbx_dom_weak::types::Ref; +use serde::Serialize; +use structopt::StructOpt; use crate::{ serve_session::ServeSession, - snapshot::{AppliedPatchSet, InstanceWithMeta, RojoTree}, + snapshot::{InstanceWithMeta, RojoTree}, }; use super::resolve_path; const PATH_STRIP_FAILED_ERR: &str = "Failed to create relative paths for project file!"; -const ABSOLUTE_PATH_FAILED_ERR: &str = "Failed to turn relative path into absolute path!"; /// Representation of a node in the generated sourcemap tree. -#[derive(Serialize, Deserialize)] +#[derive(Serialize)] #[serde(rename_all = "camelCase")] -struct SourcemapNode<'a> { - name: &'a str, - class_name: Ustr, +struct SourcemapNode { + name: String, + class_name: String, - #[serde( - default, - skip_serializing_if = "Vec::is_empty", - serialize_with = "crate::path_serializer::serialize_vec_absolute" - )] - file_paths: Vec>, + #[serde(skip_serializing_if = "Vec::is_empty")] + file_paths: Vec, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - children: Vec>, + #[serde(skip_serializing_if = "Vec::is_empty")] + children: Vec, } /// Generates a sourcemap file from the Rojo project. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct SourcemapCommand { /// Path to the project to use for the sourcemap. Defaults to the current /// directory. - #[clap(default_value = "")] + #[structopt(default_value = "")] pub project: PathBuf, /// Where to output the sourcemap. Omit this to use stdout instead of /// writing to a file. /// /// Should end in .json. - #[clap(long, short)] + #[structopt(long, short)] pub output: Option, /// If non-script files should be included or not. Defaults to false. - #[clap(long)] + #[structopt(long)] pub include_non_scripts: bool, - - /// Whether to automatically recreate a snapshot when any input files change. - #[clap(long)] - pub watch: bool, - - /// Whether the sourcemap should use absolute paths instead of relative paths. - #[clap(long)] - pub absolute: bool, } impl SourcemapCommand { pub fn run(self) -> anyhow::Result<()> { - let project_path = dunce::canonicalize(resolve_path(&self.project)?)?; + let project_path = resolve_path(&self.project); - log::trace!("Constructing filesystem with StdBackend"); - let vfs = Vfs::new_default()?; - vfs.set_watch_enabled(self.watch); + log::trace!("Constructing in-memory filesystem"); + let vfs = Vfs::new_default(); - log::trace!("Setting up session for sourcemap generation"); - let session = ServeSession::new(vfs, project_path)?; - let mut cursor = session.message_queue().cursor(); + let session = ServeSession::new(vfs, &project_path)?; + let tree = session.tree(); let filter = if self.include_non_scripts { filter_nothing @@ -88,41 +68,19 @@ impl SourcemapCommand { filter_non_scripts }; - // Pre-build a rayon threadpool with a low number of threads to avoid - // dynamic creation overhead on systems with a high number of cpus. - log::trace!("Setting rayon global threadpool"); - rayon::ThreadPoolBuilder::new() - .num_threads(num_cpus::get().min(6)) - .build_global() - .ok(); + let root_node = recurse_create_node(&tree, tree.get_root_id(), session.root_dir(), filter); - log::trace!("Writing initial sourcemap"); - write_sourcemap(&session, self.output.as_deref(), filter, self.absolute)?; + if let Some(output_path) = self.output { + let mut file = BufWriter::new(File::create(&output_path)?); + serde_json::to_writer(&mut file, &root_node)?; + file.flush()?; - if self.watch { - log::trace!("Setting up runtime for watch mode"); - let rt = Runtime::new().context("Failed to start the async runtime for watch mode")?; - - loop { - let receiver = session.message_queue().subscribe(cursor); - let (new_cursor, patch_set) = match rt.block_on(receiver) { - Ok(message) => message, - // The message queue was dropped, so there is nothing left - // to watch. Stop watching gracefully. - Err(_) => break, - }; - cursor = new_cursor; - - if patch_set_affects_sourcemap(&session, &patch_set, filter) { - write_sourcemap(&session, self.output.as_deref(), filter, self.absolute)?; - } - } + println!("Created sourcemap at {}", output_path.display()); + } else { + let output = serde_json::to_string(&root_node)?; + println!("{}", output); } - // Avoid dropping ServeSession: it's potentially VERY expensive to drop - // and we're about to exit anyways. - forget(session); - Ok(()) } } @@ -132,65 +90,26 @@ fn filter_nothing(_instance: &InstanceWithMeta) -> bool { } fn filter_non_scripts(instance: &InstanceWithMeta) -> bool { - matches!( - instance.class_name().as_str(), - "Script" | "LocalScript" | "ModuleScript" - ) + match instance.class_name() { + "Script" | "LocalScript" | "ModuleScript" => true, + _ => false, + } } -fn patch_set_affects_sourcemap( - session: &ServeSession, - patch_set: &[AppliedPatchSet], - filter: fn(&InstanceWithMeta) -> bool, -) -> bool { - let tree = session.tree(); - - // A sourcemap has probably changed when: - patch_set.par_iter().any(|set| { - // 1. An instance was removed, in which case it will no - // longer exist in the tree and we cant check the filter - !set.removed.is_empty() - // 2. A newly added instance passes the filter - || set.added.iter().any(|referent| { - let instance = tree - .get_instance(*referent) - .expect("instance did not exist when updating sourcemap"); - filter(&instance) - }) - // 3. An existing instance has its class name, name, - // or file paths changed, and passes the filter - || set.updated.iter().any(|updated| { - let changed = updated.changed_class_name.is_some() - || updated.changed_name.is_some() - || updated.changed_metadata.is_some(); - if changed { - let instance = tree - .get_instance(updated.id) - .expect("instance did not exist when updating sourcemap"); - filter(&instance) - } else { - false - } - }) - }) -} - -fn recurse_create_node<'a>( - tree: &'a RojoTree, +fn recurse_create_node( + tree: &RojoTree, referent: Ref, project_dir: &Path, filter: fn(&InstanceWithMeta) -> bool, - use_absolute_paths: bool, -) -> Option> { +) -> Option { let instance = tree.get_instance(referent).expect("instance did not exist"); - let children: Vec<_> = instance - .children() - .par_iter() - .filter_map(|&child_id| { - recurse_create_node(tree, child_id, project_dir, filter, use_absolute_paths) - }) - .collect(); + let mut children = Vec::new(); + for &child_id in instance.children() { + if let Some(child_node) = recurse_create_node(tree, child_id, &project_dir, filter) { + children.push(child_node); + } + } // If this object has no children and doesn't pass the filter, it doesn't // contain any information we're looking for. @@ -204,137 +123,14 @@ fn recurse_create_node<'a>( .iter() // Not all paths listed as relevant are guaranteed to exist. .filter(|path| path.is_file()) - .map(|path| path.as_path()); - - let mut output_file_paths: Vec> = - Vec::with_capacity(instance.metadata().relevant_paths.len()); - - if use_absolute_paths { - // It's somewhat important to note here that `path::absolute` takes in a Path and returns a PathBuf - for val in file_paths { - output_file_paths.push(Cow::Owned( - path::absolute(val).expect(ABSOLUTE_PATH_FAILED_ERR), - )); - } - } else { - for val in file_paths { - output_file_paths.push(Cow::from( - pathdiff::diff_paths(val, project_dir).expect(PATH_STRIP_FAILED_ERR), - )); - } - }; + .map(|path| path.strip_prefix(project_dir).expect(PATH_STRIP_FAILED_ERR)) + .map(|path| path.to_path_buf()) + .collect(); Some(SourcemapNode { - name: instance.name(), - class_name: instance.class_name(), - file_paths: output_file_paths, + name: instance.name().to_string(), + class_name: instance.class_name().to_string(), + file_paths, children, }) } - -fn write_sourcemap( - session: &ServeSession, - output: Option<&Path>, - filter: fn(&InstanceWithMeta) -> bool, - use_absolute_paths: bool, -) -> anyhow::Result<()> { - let tree = session.tree(); - - let root_node = recurse_create_node( - &tree, - tree.get_root_id(), - session.root_dir(), - filter, - use_absolute_paths, - ); - - if let Some(output_path) = output { - let mut file = BufWriter::new(File::create(output_path)?); - serde_json::to_writer(&mut file, &root_node)?; - file.flush()?; - - println!("Created sourcemap at {}", output_path.display()); - } else { - let output = serde_json::to_string(&root_node)?; - println!("{}", output); - } - - Ok(()) -} - -#[cfg(test)] -mod test { - use crate::cli::sourcemap::SourcemapNode; - use crate::cli::SourcemapCommand; - use insta::internals::Content; - use std::path::Path; - - #[test] - fn maps_relative_paths() { - let sourcemap_dir = tempfile::tempdir().unwrap(); - let sourcemap_output = sourcemap_dir.path().join("sourcemap.json"); - let project_path = fs_err::canonicalize( - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("test-projects") - .join("relative_paths") - .join("project"), - ) - .unwrap(); - let sourcemap_command = SourcemapCommand { - project: project_path, - output: Some(sourcemap_output.clone()), - include_non_scripts: false, - watch: false, - absolute: false, - }; - assert!(sourcemap_command.run().is_ok()); - - let raw_sourcemap_contents = fs_err::read_to_string(sourcemap_output.as_path()).unwrap(); - let sourcemap_contents = - serde_json::from_str::(&raw_sourcemap_contents).unwrap(); - insta::assert_json_snapshot!(sourcemap_contents); - } - - #[test] - fn maps_absolute_paths() { - let sourcemap_dir = tempfile::tempdir().unwrap(); - let sourcemap_output = sourcemap_dir.path().join("sourcemap.json"); - let project_path = fs_err::canonicalize( - Path::new(env!("CARGO_MANIFEST_DIR")) - .join("test-projects") - .join("relative_paths") - .join("project"), - ) - .unwrap(); - let sourcemap_command = SourcemapCommand { - project: project_path, - output: Some(sourcemap_output.clone()), - include_non_scripts: false, - watch: false, - absolute: true, - }; - assert!(sourcemap_command.run().is_ok()); - - let raw_sourcemap_contents = fs_err::read_to_string(sourcemap_output.as_path()).unwrap(); - let sourcemap_contents = - serde_json::from_str::(&raw_sourcemap_contents).unwrap(); - insta::assert_json_snapshot!(sourcemap_contents, { - ".**.filePaths" => insta::dynamic_redaction(|mut value, _path| { - let mut paths_count = 0; - - match value { - Content::Seq(ref mut vec) => { - for path in vec.iter().map(|i| i.as_str().unwrap()) { - assert_eq!(fs_err::canonicalize(path).is_ok(), true, "path was not valid"); - assert_eq!(Path::new(path).is_absolute(), true, "path was not absolute"); - - paths_count += 1; - } - } - _ => panic!("Expected filePaths to be a sequence"), - } - format!("[...{} path{} omitted...]", paths_count, if paths_count != 1 { "s" } else { "" } ) - }) - }); - } -} diff --git a/src/cli/syncback.rs b/src/cli/syncback.rs deleted file mode 100644 index 7bb274fb..00000000 --- a/src/cli/syncback.rs +++ /dev/null @@ -1,282 +0,0 @@ -use std::{ - io::{self, BufReader, Write as _}, - mem::forget, - path::{Path, PathBuf}, - time::Instant, -}; - -use anyhow::Context; -use clap::Parser; -use fs_err::File; -use memofs::Vfs; -use rbx_dom_weak::{InstanceBuilder, WeakDom}; -use termcolor::{BufferWriter, Color, ColorChoice, ColorSpec, WriteColor}; - -use crate::{ - path_serializer::display_absolute, - serve_session::ServeSession, - syncback::{syncback_loop, FsSnapshot}, -}; - -use super::{resolve_path, GlobalOptions}; - -const UNKNOWN_INPUT_KIND_ERR: &str = "Could not detect what kind of file was inputted. \ - Expected input file to end in .rbxl, .rbxlx, .rbxm, or .rbxmx."; - -/// Performs 'syncback' for the provided project, using the `input` file -/// given. -/// -/// Syncback exists to convert Roblox files into a Rojo project automatically. -/// It uses the project.json file provided to traverse the Roblox file passed as -/// to serialize Instances to the file system in a format that Rojo understands. -/// -/// To ease programmatic use, this command pipes all normal output to stderr. -#[derive(Debug, Parser)] -pub struct SyncbackCommand { - /// Path to the project to sync back to. - #[clap(default_value = "")] - pub project: PathBuf, - - /// Path to the Roblox file to pull Instances from. - #[clap(long, short)] - pub input: PathBuf, - - /// If provided, a list all of the files and directories that will be - /// added or removed is emitted into stdout. - #[clap(long, short)] - pub list: bool, - - /// If provided, syncback will not actually write anything to the file - /// system. The command will otherwise run normally. - #[clap(long)] - pub dry_run: bool, - - /// If provided, the prompt for writing to the file system is skipped. - #[clap(long, short = 'y')] - pub non_interactive: bool, -} - -impl SyncbackCommand { - pub fn run(&self, global: GlobalOptions) -> anyhow::Result<()> { - let path_old = resolve_path(&self.project)?; - let path_new = resolve_path(&self.input)?; - - let input_kind = FileKind::from_path(&path_new).context(UNKNOWN_INPUT_KIND_ERR)?; - let dom_start_timer = Instant::now(); - let dom_new = read_dom(&path_new, input_kind)?; - log::debug!( - "Finished opening file in {:0.02}s", - dom_start_timer.elapsed().as_secs_f32() - ); - - let vfs = Vfs::new_default()?; - vfs.set_watch_enabled(false); - - let project_start_timer = Instant::now(); - let session_old = ServeSession::new(vfs, path_old.clone())?; - log::debug!( - "Finished opening project in {:0.02}s", - project_start_timer.elapsed().as_secs_f32() - ); - - let mut dom_old = session_old.tree(); - - log::debug!("Old root: {}", dom_old.inner().root().class); - log::debug!("New root: {}", dom_new.root().class); - - if log::log_enabled!(log::Level::Trace) { - log::trace!("Children of old root:"); - for child in dom_old.inner().root().children() { - let inst = dom_old.get_instance(*child).unwrap(); - log::trace!("{} (class: {})", inst.name(), inst.class_name()); - } - log::trace!("Children of new root:"); - for child in dom_new.root().children() { - let inst = dom_new.get_by_ref(*child).unwrap(); - log::trace!("{} (class: {})", inst.name, inst.class); - } - } - - let syncback_timer = Instant::now(); - eprintln!("Beginning syncback..."); - let snapshot = syncback_loop( - session_old.vfs(), - &mut dom_old, - dom_new, - session_old.root_project(), - )?; - log::debug!( - "Syncback finished in {:.02}s!", - syncback_timer.elapsed().as_secs_f32() - ); - - let base_path = session_old.root_project().folder_location(); - if self.list { - list_files(&snapshot, global.color.into(), base_path)?; - } - - if !self.dry_run { - if !self.non_interactive { - eprintln!( - "Would write {} files/folders and remove {} files/folders.", - snapshot.added_paths().len(), - snapshot.removed_paths().len() - ); - eprint!("Is this okay? (Y/N): "); - io::stderr().flush()?; - let mut line = String::with_capacity(1); - io::stdin().read_line(&mut line)?; - line = line.trim().to_lowercase(); - if line != "y" { - eprintln!("Aborting due to user input!"); - return Ok(()); - } - } - eprintln!("Writing to the file system..."); - snapshot.write_to_vfs(base_path, session_old.vfs())?; - eprintln!("Finished syncback.") - } else { - eprintln!( - "Would write {} files/folders and remove {} files/folders.", - snapshot.added_paths().len(), - snapshot.removed_paths().len() - ); - eprintln!("Aborting before writing to file system due to `--dry-run`"); - } - - // It is potentially prohibitively expensive to drop a ServeSession, - // and the program is about to exit anyway so we're just going to forget - // about it. - drop(dom_old); - forget(session_old); - - Ok(()) - } -} - -fn read_dom(path: &Path, file_kind: FileKind) -> anyhow::Result { - let content = BufReader::new(File::open(path)?); - match file_kind { - FileKind::Rbxl => rbx_binary::from_reader(content).with_context(|| { - format!( - "Could not deserialize binary place file at {}", - path.display() - ) - }), - FileKind::Rbxlx => rbx_xml::from_reader(content, xml_decode_config()) - .with_context(|| format!("Could not deserialize XML place file at {}", path.display())), - FileKind::Rbxm => { - let temp_tree = rbx_binary::from_reader(content).with_context(|| { - format!( - "Could not deserialize binary place file at {}", - path.display() - ) - })?; - - process_model_dom(temp_tree) - } - FileKind::Rbxmx => { - let temp_tree = - rbx_xml::from_reader(content, xml_decode_config()).with_context(|| { - format!("Could not deserialize XML model file at {}", path.display()) - })?; - process_model_dom(temp_tree) - } - } -} - -fn process_model_dom(dom: WeakDom) -> anyhow::Result { - let temp_children = dom.root().children(); - if temp_children.len() == 1 { - let real_root = dom.get_by_ref(temp_children[0]).unwrap(); - let mut new_tree = WeakDom::new(InstanceBuilder::new(real_root.class)); - for (name, property) in &real_root.properties { - new_tree - .root_mut() - .properties - .insert(*name, property.to_owned()); - } - - let children = dom.clone_multiple_into_external(real_root.children(), &mut new_tree); - for child in children { - new_tree.transfer_within(child, new_tree.root_ref()); - } - Ok(new_tree) - } else { - anyhow::bail!( - "Rojo does not currently support models with more \ - than one Instance at the Root!" - ); - } -} - -fn xml_decode_config() -> rbx_xml::DecodeOptions<'static> { - rbx_xml::DecodeOptions::new().property_behavior(rbx_xml::DecodePropertyBehavior::ReadUnknown) -} - -/// The different kinds of input that Rojo can syncback. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -enum FileKind { - /// An XML model file. - Rbxmx, - - /// An XML place file. - Rbxlx, - - /// A binary model file. - Rbxm, - - /// A binary place file. - Rbxl, -} - -impl FileKind { - fn from_path(output: &Path) -> Option { - let extension = output.extension()?.to_str()?; - - match extension { - "rbxlx" => Some(FileKind::Rbxlx), - "rbxmx" => Some(FileKind::Rbxmx), - "rbxl" => Some(FileKind::Rbxl), - "rbxm" => Some(FileKind::Rbxm), - _ => None, - } - } -} - -fn list_files(snapshot: &FsSnapshot, color: ColorChoice, base_path: &Path) -> io::Result<()> { - let no_color = ColorSpec::new(); - let mut add_color = ColorSpec::new(); - add_color.set_fg(Some(Color::Green)); - let mut remove_color = ColorSpec::new(); - remove_color.set_fg(Some(Color::Red)); - - let writer = BufferWriter::stdout(color); - let mut buffer = writer.buffer(); - - let added = snapshot.added_paths(); - if !added.is_empty() { - buffer.set_color(&add_color)?; - for path in added { - writeln!( - &mut buffer, - "Writing {}", - display_absolute(path.strip_prefix(base_path).unwrap_or(path)) - )?; - } - } - let removed = snapshot.removed_paths(); - if !removed.is_empty() { - buffer.set_color(&remove_color)?; - for path in removed { - writeln!( - &mut buffer, - "Removing {}", - display_absolute(path.strip_prefix(base_path).unwrap_or(path)) - )?; - } - } - buffer.set_color(&no_color)?; - - writer.print(&buffer) -} diff --git a/src/cli/upload.rs b/src/cli/upload.rs index bc9d427e..2f4d2d63 100644 --- a/src/cli/upload.rs +++ b/src/cli/upload.rs @@ -1,46 +1,47 @@ use std::path::PathBuf; +use std::str::FromStr; -use anyhow::{bail, Context}; -use clap::Parser; +use anyhow::{bail, format_err, Context}; use memofs::Vfs; use reqwest::{ header::{ACCEPT, CONTENT_TYPE, COOKIE, USER_AGENT}, StatusCode, }; +use structopt::StructOpt; use crate::{auth_cookie::get_auth_cookie, serve_session::ServeSession}; use super::resolve_path; /// Builds the project and uploads it to Roblox. -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub struct UploadCommand { /// Path to the project to upload. Defaults to the current directory. - #[clap(default_value = "")] + #[structopt(default_value = "")] pub project: PathBuf, /// Authenication cookie to use. If not specified, Rojo will attempt to find one from the system automatically. - #[clap(long)] + #[structopt(long)] pub cookie: Option, /// API key obtained from create.roblox.com/credentials. Rojo will use the Open Cloud API when this is provided. Only supports uploading to a place. - #[clap(long = "api_key")] + #[structopt(long = "api_key")] pub api_key: Option, /// The Universe ID of the given place. Required when using the Open Cloud API. - #[clap(long = "universe_id")] + #[structopt(long = "universe_id")] pub universe_id: Option, /// Asset ID to upload to. - #[clap(long = "asset_id")] + #[structopt(long = "asset_id")] pub asset_id: u64, } impl UploadCommand { pub fn run(self) -> Result<(), anyhow::Error> { - let project_path = resolve_path(&self.project)?; + let project_path = resolve_path(&self.project); - let vfs = Vfs::new_default()?; + let vfs = Vfs::new_default(); let session = ServeSession::new(vfs, project_path)?; @@ -90,6 +91,32 @@ impl UploadCommand { } } +/// The kind of asset to upload to the website. Affects what endpoints Rojo uses +/// and changes how the asset is built. +#[derive(Debug, Clone, Copy)] +enum UploadKind { + /// Upload to a place. + Place, + + /// Upload to a model-like asset, like a Model, Plugin, or Package. + Model, +} + +impl FromStr for UploadKind { + type Err = anyhow::Error; + + fn from_str(source: &str) -> Result { + match source { + "place" => Ok(UploadKind::Place), + "model" => Ok(UploadKind::Model), + attempted => Err(format_err!( + "Invalid upload kind '{}'. Valid kinds are: place, model", + attempted + )), + } + } +} + fn do_upload(buffer: Vec, asset_id: u64, cookie: &str) -> anyhow::Result<()> { let url = format!( "https://data.roblox.com/Data/Upload.ashx?assetid={}", @@ -149,7 +176,7 @@ fn do_upload_open_cloud( log::debug!("Uploading to Roblox..."); let response = client - .post(url) + .post(&url) .header("x-api-key", api_key) .header(CONTENT_TYPE, "application/xml") .header(ACCEPT, "application/json") diff --git a/src/glob.rs b/src/glob.rs index c0146863..7b17286a 100644 --- a/src/glob.rs +++ b/src/glob.rs @@ -43,66 +43,8 @@ impl Serialize for Glob { impl<'de> Deserialize<'de> for Glob { fn deserialize>(deserializer: D) -> Result { - let glob = String::deserialize(deserializer)?; + let glob = <&str as Deserialize>::deserialize(deserializer)?; - Glob::new(&glob).map_err(D::Error::custom) - } -} - -/// A glob with optional gitignore-style negation. A leading `!` marks the -/// pattern as a negation (re-includes paths that an earlier rule excluded). -/// To match a literal `!` at the start of a pattern, escape it with `\!`. -#[derive(Debug, Clone)] -pub struct IgnorableGlob { - glob: Glob, - negated: bool, - raw: String, -} - -impl IgnorableGlob { - pub fn new(pattern: &str) -> Result { - let (negated, body) = if let Some(rest) = pattern.strip_prefix('!') { - (true, rest) - } else if pattern.starts_with(r"\!") { - (false, &pattern[1..]) - } else { - (false, pattern) - }; - - Ok(IgnorableGlob { - glob: Glob::new(body)?, - negated, - raw: pattern.to_owned(), - }) - } - - pub fn is_match>(&self, path: P) -> bool { - self.glob.is_match(path) - } - - pub fn is_negation(&self) -> bool { - self.negated - } -} - -impl PartialEq for IgnorableGlob { - fn eq(&self, other: &Self) -> bool { - self.negated == other.negated && self.glob == other.glob - } -} - -impl Eq for IgnorableGlob {} - -impl Serialize for IgnorableGlob { - fn serialize(&self, serializer: S) -> Result { - serializer.serialize_str(&self.raw) - } -} - -impl<'de> Deserialize<'de> for IgnorableGlob { - fn deserialize>(deserializer: D) -> Result { - let pattern = String::deserialize(deserializer)?; - - IgnorableGlob::new(&pattern).map_err(D::Error::custom) + Glob::new(glob).map_err(D::Error::custom) } } diff --git a/src/json.rs b/src/json.rs deleted file mode 100644 index 5a48cfc4..00000000 --- a/src/json.rs +++ /dev/null @@ -1,313 +0,0 @@ -//! Utilities for parsing JSON with comments (JSONC) and deserializing to Rust types. -//! -//! This module provides convenient wrappers around `jsonc_parser` and `serde_json` -//! to reduce boilerplate and improve ergonomics when working with JSONC files. - -use anyhow::Context as _; -use serde::de::DeserializeOwned; - -/// Parse JSONC text into a `serde_json::Value`. -/// -/// This handles the common pattern of calling `jsonc_parser::parse_to_serde_value` -/// and unwrapping the `Option` with a clear error message. -/// -/// # Errors -/// -/// Returns an error if: -/// - The text is not valid JSONC -/// - The text contains no JSON value -pub fn parse_value(text: &str) -> anyhow::Result { - jsonc_parser::parse_to_serde_value(text, &Default::default()) - .context("Failed to parse JSONC")? - .ok_or_else(|| anyhow::anyhow!("File contains no JSON value")) -} - -/// Parse JSONC text into a `serde_json::Value` with a custom context message. -/// -/// This is useful when you want to provide a specific error message that includes -/// additional information like the file path. -/// -/// # Errors -/// -/// Returns an error if: -/// - The text is not valid JSONC -/// - The text contains no JSON value -pub fn parse_value_with_context( - text: &str, - context: impl Fn() -> String, -) -> anyhow::Result { - jsonc_parser::parse_to_serde_value(text, &Default::default()) - .with_context(|| format!("{}: JSONC parse error", context()))? - .ok_or_else(|| anyhow::anyhow!("{}: File contains no JSON value", context())) -} - -/// Parse JSONC text and deserialize it into a specific type. -/// -/// This combines parsing JSONC and deserializing into a single operation, -/// eliminating the need to manually chain `parse_to_serde_value` and `from_value`. -/// -/// # Errors -/// -/// Returns an error if: -/// - The text is not valid JSONC -/// - The text contains no JSON value -/// - The value cannot be deserialized into type `T` -pub fn from_str(text: &str) -> anyhow::Result { - let value = parse_value(text)?; - serde_json::from_value(value).context("Failed to deserialize JSON") -} - -/// Parse JSONC text and deserialize it into a specific type with a custom context message. -/// -/// This is useful when you want to provide a specific error message that includes -/// additional information like the file path. -/// -/// # Errors -/// -/// Returns an error if: -/// - The text is not valid JSONC -/// - The text contains no JSON value -/// - The value cannot be deserialized into type `T` -pub fn from_str_with_context( - text: &str, - context: impl Fn() -> String, -) -> anyhow::Result { - let value = parse_value_with_context(text, &context)?; - serde_json::from_value(value).with_context(|| format!("{}: Invalid JSON structure", context())) -} - -/// Parse JSONC bytes into a `serde_json::Value` with a custom context message. -/// -/// This handles UTF-8 conversion and JSONC parsing in one step. -/// -/// # Errors -/// -/// Returns an error if: -/// - The bytes are not valid UTF-8 -/// - The text is not valid JSONC -/// - The text contains no JSON value -pub fn parse_value_from_slice_with_context( - slice: &[u8], - context: impl Fn() -> String, -) -> anyhow::Result { - let text = std::str::from_utf8(slice) - .with_context(|| format!("{}: File is not valid UTF-8", context()))?; - parse_value_with_context(text, context) -} - -/// Parse JSONC bytes and deserialize it into a specific type. -/// -/// This handles UTF-8 conversion, JSONC parsing, and deserialization in one step. -/// -/// # Errors -/// -/// Returns an error if: -/// - The bytes are not valid UTF-8 -/// - The text is not valid JSONC -/// - The text contains no JSON value -/// - The value cannot be deserialized into type `T` -pub fn from_slice(slice: &[u8]) -> anyhow::Result { - let text = std::str::from_utf8(slice).context("File is not valid UTF-8")?; - from_str(text) -} - -/// Parse JSONC bytes and deserialize it into a specific type with a custom context message. -/// -/// This handles UTF-8 conversion, JSONC parsing, and deserialization in one step. -/// -/// # Errors -/// -/// Returns an error if: -/// - The bytes are not valid UTF-8 -/// - The text is not valid JSONC -/// - The text contains no JSON value -/// - The value cannot be deserialized into type `T` -pub fn from_slice_with_context( - slice: &[u8], - context: impl Fn() -> String, -) -> anyhow::Result { - let text = std::str::from_utf8(slice) - .with_context(|| format!("{}: File is not valid UTF-8", context()))?; - from_str_with_context(text, context) -} - -#[cfg(test)] -mod tests { - use super::*; - use serde::Deserialize; - - #[test] - fn test_parse_value() { - let value = parse_value(r#"{"foo": "bar"}"#).unwrap(); - assert_eq!(value["foo"], "bar"); - } - - #[test] - fn test_parse_value_with_comments() { - let value = parse_value( - r#"{ - // This is a comment - "foo": "bar" // Inline comment - }"#, - ) - .unwrap(); - assert_eq!(value["foo"], "bar"); - } - - #[test] - fn test_parse_value_with_trailing_comma() { - let value = parse_value( - r#"{ - "foo": "bar", - "baz": 123, - }"#, - ) - .unwrap(); - assert_eq!(value["foo"], "bar"); - assert_eq!(value["baz"], 123); - } - - #[test] - fn test_parse_value_empty() { - let err = parse_value("").unwrap_err(); - assert!(err.to_string().contains("no JSON value")); - } - - #[test] - fn test_parse_value_invalid() { - let err = parse_value("{invalid}").unwrap_err(); - assert!(err.to_string().contains("parse")); - } - - #[test] - fn test_parse_value_with_context() { - let err = parse_value_with_context("{invalid}", || "test.json".to_string()).unwrap_err(); - assert!(err.to_string().contains("test.json")); - assert!(err.to_string().contains("parse")); - } - - #[derive(Debug, Deserialize, PartialEq)] - struct TestStruct { - foo: String, - bar: i32, - } - - #[test] - fn test_from_str() { - let result: TestStruct = from_str(r#"{"foo": "hello", "bar": 42}"#).unwrap(); - assert_eq!( - result, - TestStruct { - foo: "hello".to_string(), - bar: 42 - } - ); - } - - #[test] - fn test_from_str_with_comments() { - let result: TestStruct = from_str( - r#"{ - // Comment - "foo": "hello", - "bar": 42, // Trailing comma is fine - }"#, - ) - .unwrap(); - assert_eq!( - result, - TestStruct { - foo: "hello".to_string(), - bar: 42 - } - ); - } - - #[test] - fn test_from_str_invalid_type() { - let err = from_str::(r#"{"foo": "hello"}"#).unwrap_err(); - assert!(err.to_string().contains("deserialize")); - } - - #[test] - fn test_from_str_with_context() { - let err = from_str_with_context::(r#"{"foo": "hello"}"#, || { - "config.json".to_string() - }) - .unwrap_err(); - assert!(err.to_string().contains("config.json")); - assert!(err.to_string().contains("Invalid JSON structure")); - } - - #[test] - fn test_parse_value_from_slice_with_context() { - let err = parse_value_from_slice_with_context(b"{invalid}", || "test.json".to_string()) - .unwrap_err(); - assert!(err.to_string().contains("test.json")); - assert!(err.to_string().contains("parse")); - } - - #[test] - fn test_parse_value_from_slice_with_context_invalid_utf8() { - let err = parse_value_from_slice_with_context(&[0xFF, 0xFF], || "test.json".to_string()) - .unwrap_err(); - assert!(err.to_string().contains("test.json")); - assert!(err.to_string().contains("UTF-8")); - } - - #[test] - fn test_from_slice() { - let result: TestStruct = from_slice(br#"{"foo": "hello", "bar": 42}"#).unwrap(); - assert_eq!( - result, - TestStruct { - foo: "hello".to_string(), - bar: 42 - } - ); - } - - #[test] - fn test_from_slice_with_comments() { - let result: TestStruct = from_slice( - br#"{ - // Comment - "foo": "hello", - "bar": 42, // Trailing comma is fine - }"#, - ) - .unwrap(); - assert_eq!( - result, - TestStruct { - foo: "hello".to_string(), - bar: 42 - } - ); - } - - #[test] - fn test_from_slice_invalid_utf8() { - let err = from_slice::(&[0xFF, 0xFF]).unwrap_err(); - assert!(err.to_string().contains("UTF-8")); - } - - #[test] - fn test_from_slice_with_context() { - let err = from_slice_with_context::(br#"{"foo": "hello"}"#, || { - "config.json".to_string() - }) - .unwrap_err(); - assert!(err.to_string().contains("config.json")); - assert!(err.to_string().contains("Invalid JSON structure")); - } - - #[test] - fn test_from_slice_with_context_invalid_utf8() { - let err = - from_slice_with_context::(&[0xFF, 0xFF], || "config.json".to_string()) - .unwrap_err(); - assert!(err.to_string().contains("config.json")); - assert!(err.to_string().contains("UTF-8")); - } -} diff --git a/src/lib.rs b/src/lib.rs index f1947eaa..51195b6c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,31 +10,18 @@ mod tree_view; mod auth_cookie; mod change_processor; mod glob; -mod json; mod lua_ast; mod message_queue; mod multimap; mod path_serializer; mod project; mod resolution; -mod rojo_ref; mod serve_session; mod session_id; mod snapshot; mod snapshot_middleware; -mod syncback; -mod variant_eq; mod web; -// TODO: Work out what we should expose publicly - pub use project::*; -pub use rojo_ref::*; pub use session_id::SessionId; -pub use snapshot::{ - InstanceContext, InstanceMetadata, InstanceSnapshot, InstanceWithMeta, InstanceWithMetaMut, - RojoDescendants, RojoTree, -}; -pub use snapshot_middleware::{snapshot_from_vfs, Middleware, ScriptType}; -pub use syncback::{syncback_loop, FsSnapshot, SyncbackData, SyncbackSnapshot}; pub use web::interface as web_api; diff --git a/src/lua_ast.rs b/src/lua_ast.rs index 6734e8c6..c31b609f 100644 --- a/src/lua_ast.rs +++ b/src/lua_ast.rs @@ -22,7 +22,6 @@ trait FmtLua { } } -#[allow(dead_code)] struct DisplayLua(T); impl fmt::Display for DisplayLua @@ -220,30 +219,12 @@ fn is_valid_ident_char(value: char) -> bool { } fn is_keyword(value: &str) -> bool { - matches!( - value, - "and" - | "break" - | "do" - | "else" - | "elseif" - | "end" - | "false" - | "for" - | "function" - | "if" - | "in" - | "local" - | "nil" - | "not" - | "or" - | "repeat" - | "return" - | "then" - | "true" - | "until" - | "while" - ) + match value { + "and" | "break" | "do" | "else" | "elseif" | "end" | "false" | "for" | "function" + | "if" | "in" | "local" | "nil" | "not" | "or" | "repeat" | "return" | "then" | "true" + | "until" | "while" => true, + _ => false, + } } /// Tells whether the given string is a valid Lua identifier. diff --git a/src/main.rs b/src/main.rs index 357c27cb..34d89d8a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,11 @@ use std::{env, panic, process}; use backtrace::Backtrace; -use clap::Parser; +use structopt::StructOpt; use librojo::cli::Options; fn main() { - #[cfg(feature = "profile-with-tracy")] - profiling::tracy_client::Client::start(); - panic::set_hook(Box::new(|panic_info| { // PanicInfo's payload is usually a &'static str or String. // See: https://doc.rust-lang.org/beta/std/panic/struct.PanicInfo.html#method.payload @@ -20,10 +17,7 @@ fn main() { }, }; - log::error!( - "Rojo crashed! You are running Rojo {}.", - env!("CARGO_PKG_VERSION") - ); + log::error!("Rojo crashed!"); log::error!("This is probably a Rojo bug."); log::error!(""); log::error!( @@ -55,7 +49,7 @@ fn main() { process::exit(1); })); - let options = Options::parse(); + let options = Options::from_args(); let log_filter = match options.global.verbosity { 0 => "info", diff --git a/src/multimap.rs b/src/multimap.rs index fae6cff5..02191e6a 100644 --- a/src/multimap.rs +++ b/src/multimap.rs @@ -1,6 +1,6 @@ use std::{ borrow::Borrow, - collections::{hash_map, HashMap}, + collections::HashMap, fmt::{self, Debug}, hash::Hash, }; @@ -19,12 +19,12 @@ impl MultiMap { } } - pub fn get(&self, k: &Q) -> &[V] + pub fn get(&self, k: &Q) -> &[V] where K: Borrow, - Q: Hash + Eq + ?Sized, + Q: Hash + Eq, { - self.inner.get(k).map(Vec::as_slice).unwrap_or(&[]) + self.inner.get(k.borrow()).map(Vec::as_slice).unwrap_or(&[]) } pub fn insert(&mut self, k: K, v: V) { @@ -71,33 +71,3 @@ impl PartialEq for MultiMap { self.inner == other.inner } } - -impl Default for MultiMap { - fn default() -> Self { - Self { - inner: Default::default(), - } - } -} - -impl IntoIterator for MultiMap { - type IntoIter = MultiMapIntoIter; - type Item = (K, Vec); - fn into_iter(self) -> Self::IntoIter { - Self::IntoIter { - inner: self.inner.into_iter(), - } - } -} - -pub struct MultiMapIntoIter { - inner: hash_map::IntoIter>, -} - -impl Iterator for MultiMapIntoIter { - type Item = (K, Vec); - - fn next(&mut self) -> Option { - self.inner.next() - } -} diff --git a/src/path_serializer.rs b/src/path_serializer.rs index 2ddd3a4e..74eb9534 100644 --- a/src/path_serializer.rs +++ b/src/path_serializer.rs @@ -5,32 +5,24 @@ use std::path::Path; use serde::{ser::SerializeSeq, Serialize, Serializer}; -/// Converts the provided value into a String with all directory separators -/// converted into `/`. -pub fn display_absolute>(path: T) -> String { - let as_str = path - .as_ref() - .as_os_str() - .to_str() - .expect("Invalid Unicode in file path, cannot serialize"); - as_str.replace('\\', "/") -} - -/// A serializer for serde that serialize a value with all directory separators -/// converted into `/`. pub fn serialize_absolute(path: T, serializer: S) -> Result where S: Serializer, T: AsRef, { - serializer.serialize_str(&display_absolute(path)) + let as_str = path + .as_ref() + .as_os_str() + .to_str() + .expect("Invalid Unicode in file path, cannot serialize"); + let replaced = as_str.replace("\\", "/"); + + serializer.serialize_str(&replaced) } #[derive(Serialize)] struct WithAbsolute<'a>(#[serde(serialize_with = "serialize_absolute")] &'a Path); -/// A serializer for serde that serialize a list of values with all directory -/// separators converted into `/`. pub fn serialize_vec_absolute(paths: &[T], serializer: S) -> Result where S: Serializer, diff --git a/src/project.rs b/src/project.rs index 093529b1..53d52808 100644 --- a/src/project.rs +++ b/src/project.rs @@ -1,23 +1,16 @@ use std::{ - collections::{BTreeMap, HashSet}, - ffi::OsStr, + collections::{BTreeMap, HashMap, HashSet}, fs, io, net::IpAddr, path::{Path, PathBuf}, }; -use memofs::Vfs; -use rbx_dom_weak::Ustr; use serde::{Deserialize, Serialize}; use thiserror::Error; -use crate::{ - glob::IgnorableGlob, json, resolution::UnresolvedValue, snapshot::SyncRule, - syncback::SyncbackRules, -}; +use crate::{glob::Glob, resolution::UnresolvedValue}; -/// Represents 'default' project names that act as `init` files -pub static DEFAULT_PROJECT_NAMES: [&str; 2] = ["default.project.json", "default.project.jsonc"]; +static PROJECT_FILENAME: &str = "default.project.json"; /// Error type returned by any function that handles projects. #[derive(Debug, Error)] @@ -26,21 +19,6 @@ pub struct ProjectError(#[from] Error); #[derive(Debug, Error)] enum Error { - #[error( - "Rojo requires a project file, but no project file was found in path {}\n\ - See https://rojo.space/docs/ for guides and documentation.", - .path.display() - )] - NoProjectFound { path: PathBuf }, - - #[error("The folder for the provided project cannot be used as a project name: {}\n\ - Consider setting the `name` field on this project.", .path.display())] - FolderNameInvalid { path: PathBuf }, - - #[error("The file name of the provided project cannot be used as a project name: {}.\n\ - Consider setting the `name` field on this project.", .path.display())] - ProjectNameInvalid { path: PathBuf }, - #[error(transparent)] Io { #[from] @@ -60,11 +38,8 @@ enum Error { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields, rename_all = "camelCase")] pub struct Project { - #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] - schema: Option, - /// The name of the top-level instance described by the project. - pub name: Option, + pub name: String, /// The tree of instances described by this project. Projects always /// describe at least one instance. @@ -83,14 +58,6 @@ pub struct Project { #[serde(skip_serializing_if = "Option::is_none")] pub serve_place_ids: Option>, - /// If specified, contains a set of place IDs that this project is - /// not compatible with when doing live sync. - /// - /// This setting is intended to help prevent syncing a Rojo project into the - /// wrong Roblox place. - #[serde(skip_serializing_if = "Option::is_none")] - pub blocked_place_ids: Option>, - /// If specified, sets the current place's place ID when connecting to the /// Rojo server from Roblox Studio. #[serde(skip_serializing_if = "Option::is_none")] @@ -106,35 +73,10 @@ pub struct Project { #[serde(skip_serializing_if = "Option::is_none")] pub serve_address: Option, - /// Additional `Host`/`Origin` header values that `rojo serve` will accept - /// beyond `localhost` and the bind address, such as a hostname like - /// `mypc.lan` used to reach a network-exposed server by name. Listing any - /// host also turns on `Host`/`Origin` validation for binds where it is - /// otherwise off (such as `0.0.0.0`). The `--allowed-hosts` CLI option - /// overrides this field when provided. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub serve_allowed_hosts: Vec, - - /// Determines if Rojo should emit scripts with the appropriate `RunContext` - /// for `*.client.lua` and `*.server.lua` files in the project instead of - /// using `Script` and `LocalScript` Instances. - #[serde(skip_serializing_if = "Option::is_none")] - pub emit_legacy_scripts: Option, - /// A list of globs, relative to the folder the project file is in, that /// match files that should be excluded if Rojo encounters them. #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub glob_ignore_paths: Vec, - - /// A list of rules for syncback with this project file. - #[serde(skip_serializing_if = "Option::is_none")] - pub syncback_rules: Option, - - /// A list of mappings of globs to syncing rules. If a file matches a glob, - /// it will be 'transformed' into an Instance following the rule provided. - /// Globs are relative to the folder the project file is in. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub sync_rules: Vec, + pub glob_ignore_paths: Vec, /// The path to the file that this project came from. Relative paths in the /// project should be considered relative to the parent of this field, also @@ -148,7 +90,7 @@ impl Project { pub fn is_project_file(path: &Path) -> bool { path.file_name() .and_then(|name| name.to_str()) - .map(|name| name.ends_with(".project.json") || name.ends_with(".project.jsonc")) + .map(|name| name.ends_with(".project.json")) .unwrap_or(false) } @@ -166,154 +108,59 @@ impl Project { None } } else { - for filename in DEFAULT_PROJECT_NAMES { - let child_path = path.join(filename); - let child_meta = fs::metadata(&child_path).ok()?; + let child_path = path.join(PROJECT_FILENAME); + let child_meta = fs::metadata(&child_path).ok()?; - if child_meta.is_file() { - return Some(child_path); - } + if child_meta.is_file() { + Some(child_path) + } else { + // This is a folder with the same name as a Rojo default project + // file. + // + // That's pretty weird, but we can roll with it. + None } - // This is a folder with the same name as a Rojo default project - // file. - // - // That's pretty weird, but we can roll with it. - None } } - /// Sets the name of a project. The order it handles is as follows: - /// - /// - If the project is a `default.project.json`, uses the folder's name - /// - If a fallback is specified, uses that blindly - /// - Otherwise, loops through sync rules (including the default ones!) and - /// uses the name of the first one that matches and is a project file - fn set_file_name(&mut self, fallback: Option<&str>) -> Result<(), Error> { - let file_name = self - .file_location - .file_name() - .and_then(OsStr::to_str) - .ok_or_else(|| Error::ProjectNameInvalid { - path: self.file_location.clone(), + pub fn load_from_slice( + contents: &[u8], + project_file_location: &Path, + ) -> Result { + let mut project: Self = + serde_json::from_slice(&contents).map_err(|source| Error::Json { + source, + path: project_file_location.to_owned(), })?; - // If you're editing this to be generic, make sure you also alter the - // snapshot middleware to support generic init paths. - for default_file_name in DEFAULT_PROJECT_NAMES { - if file_name == default_file_name { - let folder_name = self.folder_location().file_name().and_then(OsStr::to_str); - if let Some(folder_name) = folder_name { - self.name = Some(folder_name.to_string()); - return Ok(()); - } else { - return Err(Error::FolderNameInvalid { - path: self.file_location.clone(), - }); - } - } - } - if let Some(fallback) = fallback { - self.name = Some(fallback.to_string()); - } else { - // As of the time of writing (July 10, 2024) there is no way for - // this code path to be reachable. It can in theory be reached from - // both `load_fuzzy` and `load_exact` but in practice it's never - // invoked. - // If you're adding this codepath, make sure a test for it exists - // and that it handles sync rules appropriately. - todo!( - "set_file_name doesn't support loading project files that aren't default.project.json without a fallback provided" - ); - } - - Ok(()) - } - - /// Loads a Project file from the provided contents with its source set as - /// the provided location. - fn load_from_slice( - contents: &[u8], - project_file_location: PathBuf, - fallback_name: Option<&str>, - ) -> Result { - let mut project: Self = json::from_slice(contents).map_err(|e| Error::Json { - source: serde_json::Error::io(std::io::Error::new( - std::io::ErrorKind::InvalidData, - e.to_string(), - )), - path: project_file_location.clone(), - })?; - project.file_location = project_file_location; + project.file_location = project_file_location.to_path_buf(); project.check_compatibility(); - if project.name.is_none() { - project.set_file_name(fallback_name)?; - } - Ok(project) } - /// Loads a Project from a path. This will find the project if it refers to - /// a `.project.json` file or if it refers to a directory that contains a - /// file named `default.project.json`. - pub fn load_fuzzy( - vfs: &Vfs, - fuzzy_project_location: &Path, - ) -> Result, ProjectError> { + pub fn load_fuzzy(fuzzy_project_location: &Path) -> Result, ProjectError> { if let Some(project_path) = Self::locate(fuzzy_project_location) { - let contents = vfs.read(&project_path).map_err(|e| match e.kind() { - io::ErrorKind::NotFound => Error::NoProjectFound { - path: project_path.to_path_buf(), - }, - _ => e.into(), - })?; + let project = Self::load_exact(&project_path)?; - Ok(Some(Self::load_from_slice(&contents, project_path, None)?)) + Ok(Some(project)) } else { Ok(None) } } - /// Loads a Project from a path. - pub fn load_exact( - vfs: &Vfs, - project_file_location: &Path, - fallback_name: Option<&str>, - ) -> Result { - log::debug!( - "Loading project file from {}", - project_file_location.display() - ); - let project_path = project_file_location.to_path_buf(); - let contents = vfs.read(&project_path).map_err(|e| match e.kind() { - io::ErrorKind::NotFound => Error::NoProjectFound { - path: project_path.to_path_buf(), - }, - _ => e.into(), - })?; + fn load_exact(project_file_location: &Path) -> Result { + let contents = fs::read_to_string(project_file_location)?; - Ok(Self::load_from_slice( - &contents, - project_path, - fallback_name, - )?) - } + let mut project: Project = + serde_json::from_str(&contents).map_err(|source| Error::Json { + source, + path: project_file_location.to_owned(), + })?; - pub(crate) fn load_initial_project(vfs: &Vfs, path: &Path) -> Result { - if Self::is_project_file(path) { - Self::load_exact(vfs, path, None) - } else { - // Check for default projects. - for default_project_name in DEFAULT_PROJECT_NAMES { - let project_path = path.join(default_project_name); - if let Ok(true) = vfs.exists(&project_path) { - return Self::load_exact(vfs, &project_path, None); - } - } - Err(Error::NoProjectFound { - path: path.to_path_buf(), - } - .into()) - } + project.file_location = project_file_location.to_path_buf(); + project.check_compatibility(); + + Ok(project) } /// Checks if there are any compatibility issues with this project file and @@ -348,21 +195,12 @@ pub enum PathNode { } impl PathNode { - /// Returns the path of the `PathNode`, without regard for if it's optional - // or not. - #[inline] pub fn path(&self) -> &Path { match self { - PathNode::Required(pathbuf) => pathbuf, - PathNode::Optional(OptionalPathNode { optional }) => optional, + PathNode::Required(pathbuf) => &pathbuf, + PathNode::Optional(OptionalPathNode { optional }) => &optional, } } - - /// Returns whether this `PathNode` is optional or not. - #[inline] - pub fn is_optional(&self) -> bool { - matches!(self, PathNode::Optional(_)) - } } /// Describes an instance and its descendants in a project. @@ -375,12 +213,7 @@ pub struct ProjectNode { /// `$className` CANNOT be set if `$path` is set and the instance described /// by that path has a ClassName other than Folder. #[serde(rename = "$className", skip_serializing_if = "Option::is_none")] - pub class_name: Option, - - /// If set, defines an ID for the described Instance that can be used - /// to refer to it for the purpose of referent properties. - #[serde(rename = "$id", skip_serializing_if = "Option::is_none")] - pub id: Option, + pub class_name: Option, /// Contains all of the children of the described instance. #[serde(flatten)] @@ -392,16 +225,9 @@ pub struct ProjectNode { #[serde( rename = "$properties", default, - skip_serializing_if = "BTreeMap::is_empty" + skip_serializing_if = "HashMap::is_empty" )] - pub properties: BTreeMap, - - #[serde( - rename = "$attributes", - default, - skip_serializing_if = "BTreeMap::is_empty" - )] - pub attributes: BTreeMap, + pub properties: HashMap, /// Defines the behavior when Rojo encounters unknown instances in Roblox /// Studio during live sync. `$ignoreUnknownInstances` should be considered @@ -455,13 +281,13 @@ mod test { #[test] fn path_node_required() { - let path_node: PathNode = json::from_str(r#""src""#).unwrap(); + let path_node: PathNode = serde_json::from_str(r#""src""#).unwrap(); assert_eq!(path_node, PathNode::Required(PathBuf::from("src"))); } #[test] fn path_node_optional() { - let path_node: PathNode = json::from_str(r#"{ "optional": "src" }"#).unwrap(); + let path_node: PathNode = serde_json::from_str(r#"{ "optional": "src" }"#).unwrap(); assert_eq!( path_node, PathNode::Optional(OptionalPathNode::new(PathBuf::from("src"))) @@ -470,7 +296,7 @@ mod test { #[test] fn project_node_required() { - let project_node: ProjectNode = json::from_str( + let project_node: ProjectNode = serde_json::from_str( r#"{ "$path": "src" }"#, @@ -485,7 +311,7 @@ mod test { #[test] fn project_node_optional() { - let project_node: ProjectNode = json::from_str( + let project_node: ProjectNode = serde_json::from_str( r#"{ "$path": { "optional": "src" } }"#, @@ -502,7 +328,7 @@ mod test { #[test] fn project_node_none() { - let project_node: ProjectNode = json::from_str( + let project_node: ProjectNode = serde_json::from_str( r#"{ "$className": "Folder" }"#, @@ -514,7 +340,7 @@ mod test { #[test] fn project_node_optional_serialize_absolute() { - let project_node: ProjectNode = json::from_str( + let project_node: ProjectNode = serde_json::from_str( r#"{ "$path": { "optional": "..\\src" } }"#, @@ -527,7 +353,7 @@ mod test { #[test] fn project_node_optional_serialize_absolute_no_change() { - let project_node: ProjectNode = json::from_str( + let project_node: ProjectNode = serde_json::from_str( r#"{ "$path": { "optional": "../src" } }"#, @@ -540,7 +366,7 @@ mod test { #[test] fn project_node_optional_serialize_optional() { - let project_node: ProjectNode = json::from_str( + let project_node: ProjectNode = serde_json::from_str( r#"{ "$path": "..\\src" }"#, @@ -550,143 +376,4 @@ mod test { let serialized = serde_json::to_string(&project_node).unwrap(); assert_eq!(serialized, r#"{"$path":"../src"}"#); } - - #[test] - fn project_with_jsonc_features() { - // Test that JSONC features (comments and trailing commas) are properly handled - let project_json = r#"{ - // This is a single-line comment - "name": "TestProject", - /* This is a - multi-line comment */ - "tree": { - "$path": "src", // Comment after value - }, - "servePort": 34567, - "emitLegacyScripts": false, - // Test glob parsing with comments - "globIgnorePaths": [ - "**/*.spec.lua", // Ignore test files - "**/*.test.lua", - ], - "syncRules": [ - { - "pattern": "*.data.json", - "use": "json", // Trailing comma in object - }, - { - "pattern": "*.module.lua", - "use": "moduleScript", - }, // Trailing comma in array - ], // Another trailing comma - }"#; - - let project = Project::load_from_slice( - project_json.as_bytes(), - PathBuf::from("/test/default.project.jsonc"), - None, - ) - .expect("Failed to parse project with JSONC features"); - - // Verify the parsed values - assert_eq!(project.name, Some("TestProject".to_string())); - assert_eq!(project.serve_port, Some(34567)); - assert_eq!(project.emit_legacy_scripts, Some(false)); - - // Verify glob_ignore_paths were parsed correctly - assert_eq!(project.glob_ignore_paths.len(), 2); - assert!(project.glob_ignore_paths[0].is_match("test/foo.spec.lua")); - assert!(project.glob_ignore_paths[1].is_match("test/bar.test.lua")); - - // Verify sync_rules were parsed correctly - assert_eq!(project.sync_rules.len(), 2); - assert!(project.sync_rules[0].include.is_match("data.data.json")); - assert!(project.sync_rules[1].include.is_match("init.module.lua")); - } - - #[test] - fn project_with_serve_allowed_hosts() { - let project_json = r#"{ - "name": "TestProject", - "tree": { "$path": "src" }, - "serveAllowedHosts": ["mypc.lan", "192.168.1.5"] - }"#; - - let project = Project::load_from_slice( - project_json.as_bytes(), - PathBuf::from("/test/default.project.json"), - None, - ) - .expect("Failed to parse project with serveAllowedHosts"); - - assert_eq!(project.serve_allowed_hosts, vec!["mypc.lan", "192.168.1.5"]); - } - - #[test] - fn project_without_serve_allowed_hosts_defaults_to_empty() { - let project_json = r#"{ - "name": "TestProject", - "tree": { "$path": "src" } - }"#; - - let project = Project::load_from_slice( - project_json.as_bytes(), - PathBuf::from("/test/default.project.json"), - None, - ) - .expect("Failed to parse project"); - - assert!(project.serve_allowed_hosts.is_empty()); - } - - #[test] - fn glob_ignore_paths_negation() { - let project_json = r#"{ - "name": "TestProject", - "tree": { "$path": "src" }, - "globIgnorePaths": [ - "**/*.spec.lua", - "!keep.spec.lua", - "\\!literal.lua" - ] - }"#; - - let project = Project::load_from_slice( - project_json.as_bytes(), - PathBuf::from("/test/default.project.json"), - None, - ) - .expect("project should parse"); - - let paths = &project.glob_ignore_paths; - assert_eq!(paths.len(), 3); - - assert!(!paths[0].is_negation()); - assert!(paths[0].is_match("foo.spec.lua")); - - assert!(paths[1].is_negation()); - assert!(paths[1].is_match("keep.spec.lua")); - - // `\!literal.lua` should match a file literally named `!literal.lua`, - // not be parsed as a negation. - assert!(!paths[2].is_negation()); - assert!(paths[2].is_match("!literal.lua")); - - let rules: Vec<_> = paths - .iter() - .map(|g| crate::snapshot::PathIgnoreRule { - base_path: PathBuf::from("/test"), - glob: g.clone(), - }) - .collect(); - assert!(crate::snapshot::is_path_ignored( - &rules, - "/test/foo.spec.lua" - )); - assert!(!crate::snapshot::is_path_ignored( - &rules, - "/test/keep.spec.lua" - )); - assert!(!crate::snapshot::is_path_ignored(&rules, "/test/plain.lua")); - } } diff --git a/src/resolution.rs b/src/resolution.rs index 47fbac7e..8f25d992 100644 --- a/src/resolution.rs +++ b/src/resolution.rs @@ -1,15 +1,12 @@ use std::borrow::Borrow; -use anyhow::{bail, format_err}; +use anyhow::format_err; use rbx_dom_weak::types::{ - Attributes, CFrame, Color3, Content, ContentId, ContentType, Enum, Font, MaterialColors, - Matrix3, Tags, Variant, VariantType, Vector2, Vector3, + CFrame, Color3, Content, Enum, Matrix3, Tags, Variant, VariantType, Vector2, Vector3, }; use rbx_reflection::{DataType, PropertyDescriptor}; use serde::{Deserialize, Serialize}; -use crate::REF_POINTER_ATTRIBUTE_PREFIX; - /// A user-friendly version of `Variant` that supports specifying ambiguous /// values. Ambiguous values need a reflection database to be resolved to a /// usable value. @@ -30,105 +27,6 @@ impl UnresolvedValue { UnresolvedValue::Ambiguous(partial) => partial.resolve(class_name, prop_name), } } - - pub fn resolve_unambiguous(self) -> anyhow::Result { - match self { - UnresolvedValue::FullyQualified(full) => Ok(full), - UnresolvedValue::Ambiguous(partial) => partial.resolve_unambiguous(), - } - } - - /// Creates an `UnresolvedValue` from a variant, using a class and property - /// name to potentially allow for ambiguous Enum variants. - pub fn from_variant(variant: Variant, class_name: &str, prop_name: &str) -> Self { - let descriptor = find_descriptor(class_name, prop_name); - if descriptor.is_some() { - // We can only use an ambiguous syntax if the property is known - // to the reflection database. - Self::Ambiguous(match variant { - Variant::Enum(rbx_enum) => { - if let Some(property) = descriptor { - if let DataType::Enum(enum_name) = &property.data_type { - let database = rbx_reflection_database::get().unwrap(); - if let Some(enum_descriptor) = database.enums.get(enum_name) { - for (variant_name, id) in &enum_descriptor.items { - if *id == rbx_enum.to_u32() { - return Self::Ambiguous(AmbiguousValue::String( - variant_name.to_string(), - )); - } - } - } - } - } - return Self::FullyQualified(variant); - } - Variant::Bool(bool) => AmbiguousValue::Bool(bool), - Variant::Float32(n) => AmbiguousValue::Number(n as f64), - Variant::Float64(n) => AmbiguousValue::Number(n), - Variant::Int32(n) => AmbiguousValue::Number(n as f64), - Variant::Int64(n) => AmbiguousValue::Number(n as f64), - Variant::String(str) => AmbiguousValue::String(str), - Variant::Tags(tags) => { - AmbiguousValue::StringArray(tags.iter().map(|s| s.to_string()).collect()) - } - Variant::Content(ref content) => match content.value() { - ContentType::None => AmbiguousValue::String(String::new()), - ContentType::Uri(uri) => AmbiguousValue::String(uri.clone()), - _ => return Self::FullyQualified(variant), - }, - Variant::ContentId(content) => AmbiguousValue::String(content.into_string()), - Variant::Vector2(vector) => { - AmbiguousValue::Array2([vector.x as f64, vector.y as f64]) - } - Variant::Vector3(vector) => { - AmbiguousValue::Array3([vector.x as f64, vector.y as f64, vector.z as f64]) - } - Variant::Color3(color) => { - AmbiguousValue::Array3([color.r as f64, color.g as f64, color.b as f64]) - } - Variant::CFrame(cf) => AmbiguousValue::Array12([ - cf.position.x as f64, - cf.position.y as f64, - cf.position.z as f64, - cf.orientation.x.x as f64, - cf.orientation.x.y as f64, - cf.orientation.x.z as f64, - cf.orientation.y.x as f64, - cf.orientation.y.y as f64, - cf.orientation.y.z as f64, - cf.orientation.z.x as f64, - cf.orientation.z.y as f64, - cf.orientation.z.z as f64, - ]), - Variant::Attributes(attr) => AmbiguousValue::Attributes(attr), - Variant::Font(font) => AmbiguousValue::Font(font), - Variant::MaterialColors(colors) => AmbiguousValue::MaterialColors(colors), - _ => { - return Self::FullyQualified(variant); - } - }) - } else { - Self::FullyQualified(variant) - } - } - - /// Creates an `UnresolvedValue` from a variant, only returning ambiguous - /// values if they're able to be resolved in a context-free environment. - pub fn from_variant_unambiguous(variant: Variant) -> Self { - match variant { - Variant::String(str) => Self::Ambiguous(AmbiguousValue::String(str)), - Variant::Float64(number) => Self::Ambiguous(AmbiguousValue::Number(number)), - Variant::Bool(bool) => Self::Ambiguous(AmbiguousValue::Bool(bool)), - Variant::BinaryString(bstr) => match std::str::from_utf8(bstr.as_ref()) { - Ok(_) => Self::Ambiguous(AmbiguousValue::String( - String::from_utf8(bstr.into_vec()).unwrap(), - )), - Err(_) => Self::FullyQualified(Variant::BinaryString(bstr)), - }, - _ => Self::FullyQualified(variant), - } - } } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] @@ -142,9 +40,6 @@ pub enum AmbiguousValue { Array3([f64; 3]), Array4([f64; 4]), Array12([f64; 12]), - Attributes(Attributes), - Font(Font), - MaterialColors(MaterialColors), } impl AmbiguousValue { @@ -154,7 +49,7 @@ impl AmbiguousValue { match &property.data_type { DataType::Enum(enum_name) => { - let database = rbx_reflection_database::get().unwrap(); + let database = rbx_reflection_database::get(); let enum_descriptor = database.enums.get(enum_name).ok_or_else(|| { format_err!("Unknown enum {}. This is a Rojo bug!", enum_name) @@ -208,9 +103,6 @@ impl AmbiguousValue { (VariantType::Content, AmbiguousValue::String(value)) => { Ok(Content::from(value).into()) } - (VariantType::ContentId, AmbiguousValue::String(value)) => { - Ok(ContentId::from(value).into()) - } (VariantType::Vector2, AmbiguousValue::Array2(value)) => { Ok(Vector2::new(value[0] as f32, value[1] as f32).into()) @@ -236,18 +128,6 @@ impl AmbiguousValue { Ok(CFrame::new(pos, orientation).into()) } - (VariantType::Attributes, AmbiguousValue::Attributes(value)) => Ok(value.into()), - - (VariantType::Font, AmbiguousValue::Font(value)) => Ok(value.into()), - - (VariantType::MaterialColors, AmbiguousValue::MaterialColors(value)) => { - Ok(value.into()) - } - - (VariantType::Ref, AmbiguousValue::String(_)) => Err(format_err!( - "Cannot resolve Ref properties as a String.\ - Use an attribute named `{REF_POINTER_ATTRIBUTE_PREFIX}{prop_name}" - )), (_, unresolved) => Err(format_err!( "Wrong type of value for property {}.{}. Expected {:?}, got {}", class_name, @@ -264,16 +144,6 @@ impl AmbiguousValue { } } - pub fn resolve_unambiguous(self) -> anyhow::Result { - match self { - AmbiguousValue::Bool(value) => Ok(value.into()), - AmbiguousValue::Number(value) => Ok(value.into()), - AmbiguousValue::String(value) => Ok(value.into()), - - other => bail!("Cannot unambiguously resolve the value {other:?}"), - } - } - fn describe(&self) -> &'static str { match self { AmbiguousValue::Bool(_) => "a bool", @@ -284,9 +154,6 @@ impl AmbiguousValue { AmbiguousValue::Array3(_) => "an array of three numbers", AmbiguousValue::Array4(_) => "an array of four numbers", AmbiguousValue::Array12(_) => "an array of twelve numbers", - AmbiguousValue::Attributes(_) => "an object containing attributes", - AmbiguousValue::Font(_) => "an object describing a Font", - AmbiguousValue::MaterialColors(_) => "an object describing MaterialColors", } } } @@ -295,7 +162,7 @@ fn find_descriptor( class_name: &str, prop_name: &str, ) -> Option<&'static PropertyDescriptor<'static>> { - let database = rbx_reflection_database::get().unwrap(); + let database = rbx_reflection_database::get(); let mut current_class_name = class_name; loop { @@ -304,7 +171,7 @@ fn find_descriptor( return Some(descriptor); } - current_class_name = class.superclass?; + current_class_name = class.superclass.as_deref()?; } } @@ -340,27 +207,18 @@ fn nonexhaustive_list(values: &[&str]) -> String { #[cfg(test)] mod test { use super::*; - use crate::json; fn resolve(class: &str, prop: &str, json_value: &str) -> Variant { - let unresolved: UnresolvedValue = json::from_str(json_value).unwrap(); + let unresolved: UnresolvedValue = serde_json::from_str(json_value).unwrap(); unresolved.resolve(class, prop).unwrap() } - fn resolve_unambiguous(json_value: &str) -> Variant { - let unresolved: UnresolvedValue = json::from_str(json_value).unwrap(); - unresolved.resolve_unambiguous().unwrap() - } - #[test] fn bools() { assert_eq!(resolve("BoolValue", "Value", "false"), Variant::Bool(false)); // Script.Disabled is inherited from BaseScript assert_eq!(resolve("Script", "Disabled", "true"), Variant::Bool(true)); - - assert_eq!(resolve_unambiguous("false"), Variant::Bool(false)); - assert_eq!(resolve_unambiguous("true"), Variant::Bool(true)); } #[test] @@ -371,20 +229,10 @@ mod test { Variant::String("Hello!".into()), ); - // String literals can also turn into ContentId + // String literals can also turn into Content assert_eq!( resolve("Sky", "MoonTextureId", "\"rbxassetid://12345\""), - Variant::ContentId("rbxassetid://12345".into()), - ); - - // String literals can turn into Content! - assert_eq!( - resolve( - "MeshPart", - "MeshContent", - "\"rbxasset://totally-a-real-uri.tiff\"" - ), - Variant::Content("rbxasset://totally-a-real-uri.tiff".into()) + Variant::Content("rbxassetid://12345".into()), ); // What about BinaryString values? For forward-compatibility reasons, we @@ -394,11 +242,6 @@ mod test { // resolve("Folder", "Tags", "\"a\\u0000b\\u0000c\""), // Variant::BinaryString(b"a\0b\0c".to_vec().into()), // ); - - assert_eq!( - resolve_unambiguous("\"Hello world!\""), - Variant::String("Hello world!".into()), - ); } #[test] @@ -409,14 +252,12 @@ mod test { ); assert_eq!( - resolve("IntValue", "Value", "532413"), + resolve("Folder", "SourceAssetId", "532413"), Variant::Int64(532413), ); assert_eq!(resolve("Part", "Transparency", "1"), Variant::Float32(1.0)); assert_eq!(resolve("NumberValue", "Value", "1"), Variant::Float64(1.0)); - - assert_eq!(resolve_unambiguous("12.5"), Variant::Float64(12.5)); } #[test] @@ -450,46 +291,4 @@ mod test { Variant::Enum(Enum::from_u32(1)), ); } - - #[test] - fn font() { - use rbx_dom_weak::types::{FontStyle, FontWeight}; - - assert_eq!( - resolve( - "TextLabel", - "FontFace", - r#"{"family": "rbxasset://fonts/families/RobotoMono.json", "weight": "Thin", "style": "Normal"}"# - ), - Variant::Font(Font { - family: "rbxasset://fonts/families/RobotoMono.json".into(), - weight: FontWeight::Thin, - style: FontStyle::Normal, - cached_face_id: None, - }) - ) - } - - #[test] - fn material_colors() { - use rbx_dom_weak::types::{Color3uint8, TerrainMaterials}; - - let mut material_colors = MaterialColors::new(); - material_colors.set_color(TerrainMaterials::Grass, Color3uint8::new(10, 20, 30)); - material_colors.set_color(TerrainMaterials::Asphalt, Color3uint8::new(40, 50, 60)); - material_colors.set_color(TerrainMaterials::LeafyGrass, Color3uint8::new(255, 155, 55)); - - assert_eq!( - resolve( - "Terrain", - "MaterialColors", - r#"{ - "Grass": [10, 20, 30], - "Asphalt": [40, 50, 60], - "LeafyGrass": [255, 155, 55] - }"# - ), - Variant::MaterialColors(material_colors) - ) - } } diff --git a/src/rojo_ref.rs b/src/rojo_ref.rs deleted file mode 100644 index fbbf997e..00000000 --- a/src/rojo_ref.rs +++ /dev/null @@ -1,30 +0,0 @@ -use std::{fmt, sync::Arc}; - -use serde::{Deserialize, Serialize}; - -pub const REF_ID_ATTRIBUTE_NAME: &str = "Rojo_Id"; -pub const REF_POINTER_ATTRIBUTE_PREFIX: &str = "Rojo_Target_"; - -// TODO add an internment strategy for RojoRefs -// Something like what rbx-dom does for SharedStrings probably works - -#[derive(Debug, Default, PartialEq, Hash, Clone, Serialize, Deserialize, Eq)] -pub struct RojoRef(Arc); - -impl RojoRef { - #[inline] - pub fn new(id: String) -> Self { - Self(Arc::from(id)) - } - - #[inline] - pub fn as_str(&self) -> &str { - self.0.as_str() - } -} - -impl fmt::Display for RojoRef { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.as_str()) - } -} diff --git a/src/serve_session.rs b/src/serve_session.rs index 6cffb0d2..a4eced44 100644 --- a/src/serve_session.rs +++ b/src/serve_session.rs @@ -1,13 +1,15 @@ use std::{ + borrow::Cow, collections::HashSet, io, net::IpAddr, - path::Path, + path::{Path, PathBuf}, sync::{Arc, Mutex, MutexGuard}, time::Instant, }; use crossbeam_channel::Sender; +use memofs::IoResultExt; use memofs::Vfs; use thiserror::Error; @@ -95,26 +97,40 @@ impl ServeSession { /// currently loaded from the filesystem directly instead of through the /// in-memory filesystem layer. pub fn new>(vfs: Vfs, start_path: P) -> Result { + let start_path = start_path.as_ref(); let start_time = Instant::now(); - let start_path = vfs.canonicalize(start_path.as_ref())?; - let start_path = start_path.as_path(); log::trace!("Starting new ServeSession at path {}", start_path.display()); - let root_project = Project::load_initial_project(&vfs, start_path)?; + let project_path; + if Project::is_project_file(start_path) { + project_path = Cow::Borrowed(start_path); + } else { + project_path = Cow::Owned(start_path.join("default.project.json")); + } + + log::debug!("Loading project file from {}", project_path.display()); + + let root_project = match vfs.read(&project_path).with_not_found()? { + Some(contents) => Project::load_from_slice(&contents, &project_path)?, + None => { + return Err(ServeSessionError::NoProjectFound { + path: project_path.to_path_buf(), + }); + } + }; let mut tree = RojoTree::new(InstanceSnapshot::new()); let root_id = tree.get_root_id(); - let instance_context = - InstanceContext::with_emit_legacy_scripts(root_project.emit_legacy_scripts); + let instance_context = InstanceContext::default(); log::trace!("Generating snapshot of instances from VFS"); - let snapshot = snapshot_from_vfs(&instance_context, &vfs, start_path)?; + let snapshot = snapshot_from_vfs(&instance_context, &vfs, &start_path)?; log::trace!("Computing initial patch set"); - let patch_set = compute_patch_set(snapshot, &tree, root_id); + let patch_set = compute_patch_set(snapshot.as_ref(), &tree, root_id); log::trace!("Applying initial patch set"); apply_patch_set(&mut tree, patch_set); @@ -174,10 +190,7 @@ impl ServeSession { } pub fn project_name(&self) -> &str { - self.root_project - .name - .as_ref() - .expect("all top-level projects must have their name set") + &self.root_project.name } pub fn project_port(&self) -> Option { @@ -200,29 +213,24 @@ impl ServeSession { self.root_project.serve_place_ids.as_ref() } - pub fn blocked_place_ids(&self) -> Option<&HashSet> { - self.root_project.blocked_place_ids.as_ref() - } - pub fn serve_address(&self) -> Option { self.root_project.serve_address } - pub fn serve_allowed_hosts(&self) -> &[String] { - &self.root_project.serve_allowed_hosts - } - pub fn root_dir(&self) -> &Path { self.root_project.folder_location() } - - pub fn root_project(&self) -> &Project { - &self.root_project - } } #[derive(Debug, Error)] pub enum ServeSessionError { + #[error( + "Rojo requires a project file, but no project file was found in path {}\n\ + See https://rojo.space/docs/ for guides and documentation.", + .path.display() + )] + NoProjectFound { path: PathBuf }, + #[error(transparent)] Io { #[from] @@ -241,39 +249,3 @@ pub enum ServeSessionError { source: anyhow::Error, }, } - -#[cfg(test)] -mod test { - use super::*; - - use memofs::StdBackend; - - #[test] - fn tree_is_keyed_by_canonical_paths() { - let dir = tempfile::tempdir().unwrap(); - std::fs::write( - dir.path().join("default.project.json"), - r#"{ "name": "test", "tree": { "$className": "Folder" } }"#, - ) - .unwrap(); - - // `std::fs::canonicalize` yields a verbatim path on Windows. - // On other platforms it simply resolves the path (e.g. symlinks), - // which the session must also handle. - let start_path = std::fs::canonicalize(dir.path()).unwrap(); - - let vfs = Vfs::new(StdBackend::new().unwrap()); - let session = ServeSession::new(vfs, &start_path).unwrap(); - - let project_file = start_path.join("default.project.json"); - let canonical = session.vfs().canonicalize(&project_file).unwrap(); - - assert!( - !session.tree().get_ids_at_path(&canonical).is_empty(), - "project file {} should be tracked in the tree under its canonical \ - path {}, matching what the watcher reports", - project_file.display(), - canonical.display(), - ); - } -} diff --git a/src/snapshot/instance_snapshot.rs b/src/snapshot/instance_snapshot.rs index 6a9331fd..050dc067 100644 --- a/src/snapshot/instance_snapshot.rs +++ b/src/snapshot/instance_snapshot.rs @@ -1,10 +1,10 @@ //! Defines the structure of an instance snapshot. -use std::borrow::Cow; +use std::{borrow::Cow, collections::HashMap}; use rbx_dom_weak::{ types::{Ref, Variant}, - ustr, AHashMap, HashMapExt as _, Instance, Ustr, UstrMap, WeakDom, + WeakDom, }; use serde::{Deserialize, Serialize}; @@ -17,8 +17,9 @@ use super::InstanceMetadata; // - Replace use of Variant with a sum of Variant + borrowed value #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct InstanceSnapshot { + // FIXME: Don't use Option anymore! /// A temporary ID applied to the snapshot that's used for Ref properties. - pub snapshot_id: Ref, + pub snapshot_id: Option, /// Rojo-specific metadata associated with the instance. pub metadata: InstanceMetadata, @@ -27,10 +28,10 @@ pub struct InstanceSnapshot { pub name: Cow<'static, str>, /// Corresponds to the ClassName property of the instance. - pub class_name: Ustr, + pub class_name: Cow<'static, str>, /// All other properties of the instance, weakly-typed. - pub properties: UstrMap, + pub properties: HashMap, /// The children of the instance represented as more snapshots. /// @@ -41,11 +42,11 @@ pub struct InstanceSnapshot { impl InstanceSnapshot { pub fn new() -> Self { Self { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: InstanceMetadata::default(), name: Cow::Borrowed("DEFAULT"), - class_name: ustr("DEFAULT"), - properties: UstrMap::new(), + class_name: Cow::Borrowed("DEFAULT"), + properties: HashMap::new(), children: Vec::new(), } } @@ -57,23 +58,23 @@ impl InstanceSnapshot { } } - pub fn class_name>(self, class_name: S) -> Self { + pub fn class_name(self, class_name: impl Into) -> Self { Self { - class_name: class_name.into(), + class_name: Cow::Owned(class_name.into()), ..self } } pub fn property(mut self, key: K, value: V) -> Self where - K: Into, + K: Into, V: Into, { self.properties.insert(key.into(), value.into()); self } - pub fn properties(self, properties: impl Into>) -> Self { + pub fn properties(self, properties: impl Into>) -> Self { Self { properties: properties.into(), ..self @@ -87,7 +88,7 @@ impl InstanceSnapshot { } } - pub fn snapshot_id(self, snapshot_id: Ref) -> Self { + pub fn snapshot_id(self, snapshot_id: Option) -> Self { Self { snapshot_id, ..self @@ -101,29 +102,22 @@ impl InstanceSnapshot { } } - #[profiling::function] - pub fn from_tree(tree: WeakDom, id: Ref) -> Self { - let (_, mut raw_tree) = tree.into_raw(); - Self::from_raw_tree(&mut raw_tree, id) - } - - fn from_raw_tree(raw_tree: &mut AHashMap, id: Ref) -> Self { - let instance = raw_tree - .remove(&id) - .expect("instance did not exist in tree"); + pub fn from_tree(tree: &WeakDom, id: Ref) -> Self { + let instance = tree.get_by_ref(id).expect("instance did not exist in tree"); let children = instance .children() .iter() - .map(|&id| Self::from_raw_tree(raw_tree, id)) + .copied() + .map(|id| Self::from_tree(tree, id)) .collect(); Self { - snapshot_id: id, + snapshot_id: Some(id), metadata: InstanceMetadata::default(), - name: Cow::Owned(instance.name), - class_name: instance.class, - properties: instance.properties, + name: Cow::Owned(instance.name.clone()), + class_name: Cow::Owned(instance.class.clone()), + properties: instance.properties.clone(), children, } } diff --git a/src/snapshot/metadata.rs b/src/snapshot/metadata.rs index a1bf0afe..192a0001 100644 --- a/src/snapshot/metadata.rs +++ b/src/snapshot/metadata.rs @@ -4,16 +4,9 @@ use std::{ sync::Arc, }; -use anyhow::Context; use serde::{Deserialize, Serialize}; -use crate::{ - glob::{Glob, IgnorableGlob}, - path_serializer, - project::ProjectNode, - snapshot_middleware::{emit_legacy_scripts_default, Middleware}, - RojoRef, -}; +use crate::{glob::Glob, path_serializer, project::ProjectNode}; /// Rojo-specific metadata that can be associated with an instance or a snapshot /// of an instance. @@ -59,17 +52,6 @@ pub struct InstanceMetadata { /// that instance's instigating source is snapshotted directly, the same /// context will be passed into it. pub context: InstanceContext, - - /// Indicates the ID used for Ref properties pointing to this Instance. - pub specified_id: Option, - - /// The Middleware that was used to create this Instance. Should generally - /// not be `None` except if the snapshotting process is not completed. - pub middleware: Option, - - /// A schema provided via a JSON file, if one exists. Will be `None` for - /// all non-JSON middleware. - pub schema: Option, } impl InstanceMetadata { @@ -79,9 +61,6 @@ impl InstanceMetadata { instigating_source: None, relevant_paths: Vec::new(), context: InstanceContext::default(), - specified_id: None, - middleware: None, - schema: None, } } @@ -112,24 +91,6 @@ impl InstanceMetadata { ..self } } - - pub fn specified_id(self, id: Option) -> Self { - Self { - specified_id: id, - ..self - } - } - - pub fn middleware(self, middleware: Middleware) -> Self { - Self { - middleware: Some(middleware), - ..self - } - } - - pub fn schema(self, schema: Option) -> Self { - Self { schema, ..self } - } } impl Default for InstanceMetadata { @@ -142,29 +103,9 @@ impl Default for InstanceMetadata { pub struct InstanceContext { #[serde(skip_serializing_if = "Vec::is_empty")] pub path_ignore_rules: Arc>, - pub emit_legacy_scripts: bool, - #[serde(skip_serializing_if = "Vec::is_empty")] - pub sync_rules: Vec, } impl InstanceContext { - pub fn new() -> Self { - Self { - path_ignore_rules: Arc::new(Vec::new()), - emit_legacy_scripts: emit_legacy_scripts_default().unwrap(), - sync_rules: Vec::new(), - } - } - - pub fn with_emit_legacy_scripts(emit_legacy_scripts: Option) -> Self { - Self { - emit_legacy_scripts: emit_legacy_scripts - .or_else(emit_legacy_scripts_default) - .unwrap(), - ..Self::new() - } - } - /// Extend the list of ignore rules in the context with the given new rules. pub fn add_path_ignore_rules(&mut self, new_rules: I) where @@ -182,34 +123,13 @@ impl InstanceContext { let rules = Arc::make_mut(&mut self.path_ignore_rules); rules.extend(new_rules); } - - /// Extend the list of syncing rules in the context with the given new rules. - pub fn add_sync_rules(&mut self, new_rules: I) - where - I: IntoIterator, - { - self.sync_rules.extend(new_rules); - } - - /// Clears all sync rules for this InstanceContext - pub fn clear_sync_rules(&mut self) { - self.sync_rules.clear(); - } - - pub fn set_emit_legacy_scripts(&mut self, emit_legacy_scripts: bool) { - self.emit_legacy_scripts = emit_legacy_scripts; - } - - /// Returns the middleware specified by the first sync rule that - /// matches the provided path. This does not handle default syncing rules. - pub fn get_user_sync_rule(&self, path: &Path) -> Option<&SyncRule> { - self.sync_rules.iter().find(|&rule| rule.matches(path)) - } } impl Default for InstanceContext { fn default() -> Self { - Self::new() + InstanceContext { + path_ignore_rules: Arc::new(Vec::new()), + } } } @@ -222,73 +142,36 @@ pub struct PathIgnoreRule { pub base_path: PathBuf, /// The actual glob that can be matched against the input path. - pub glob: IgnorableGlob, + pub glob: Glob, } impl PathIgnoreRule { - pub fn matches>(&self, path: P) -> bool { + pub fn passes>(&self, path: P) -> bool { let path = path.as_ref(); match path.strip_prefix(&self.base_path) { - Ok(suffix) => self.glob.is_match(suffix), - Err(_) => false, + Ok(suffix) => !self.glob.is_match(suffix), + Err(_) => true, } } - - pub fn is_negation(&self) -> bool { - self.glob.is_negation() - } } -/// Evaluates an ordered list of [`PathIgnoreRule`]s against a path using -/// gitignore-style "last match wins" semantics: a path is ignored if the last -/// rule whose pattern matches it is non-negated. Paths matched by no rule are -/// not ignored. -pub fn is_path_ignored>(rules: &[PathIgnoreRule], path: P) -> bool { - let path = path.as_ref(); - let mut ignored = false; - for rule in rules { - if rule.matches(path) { - ignored = !rule.is_negation(); - } - } - ignored -} - -/// Represents where a particular Instance or InstanceSnapshot came from. #[derive(Clone, PartialEq, Serialize, Deserialize)] pub enum InstigatingSource { - /// The path the Instance was made from. Path(#[serde(serialize_with = "path_serializer::serialize_absolute")] PathBuf), - /// The node in a Project that the Instance was made from. - ProjectNode { - #[serde(serialize_with = "path_serializer::serialize_absolute")] - path: PathBuf, - name: String, - node: ProjectNode, - parent_class: Option, - }, -} - -impl InstigatingSource { - pub fn path(&self) -> &Path { - match self { - Self::Path(path) => path.as_path(), - Self::ProjectNode { path, .. } => path.as_path(), - } - } + ProjectNode( + #[serde(serialize_with = "path_serializer::serialize_absolute")] PathBuf, + String, + ProjectNode, + Option, + ), } impl fmt::Debug for InstigatingSource { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { match self { InstigatingSource::Path(path) => write!(formatter, "Path({})", path.display()), - InstigatingSource::ProjectNode { - name, - node, - path, - parent_class, - } => write!( + InstigatingSource::ProjectNode(path, name, node, parent_class) => write!( formatter, "ProjectNode({}: {:?}) from path {} and parent class {:?}", name, @@ -311,64 +194,3 @@ impl From<&Path> for InstigatingSource { InstigatingSource::Path(path.to_path_buf()) } } - -/// Represents an user-specified rule for transforming files -/// into Instances using a given middleware. -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] -pub struct SyncRule { - /// A pattern used to determine if a file is included in this SyncRule - #[serde(rename = "pattern")] - pub include: Glob, - /// A pattern used to determine if a file is excluded from this SyncRule. - #[serde(skip_serializing_if = "Option::is_none")] - pub exclude: Option, - /// The middleware specified by the user for this SyncRule - #[serde(rename = "use")] - pub middleware: Middleware, - /// A suffix to trim off of file names, including the file extension. - /// If not specified, the file extension is the only thing cut off. - #[serde(skip_serializing_if = "Option::is_none")] - pub suffix: Option, - /// The 'base' of the glob above, allowing it to be used - /// relative to a path instead of absolute. - #[serde(skip)] - pub base_path: PathBuf, -} - -impl SyncRule { - /// Returns whether the given path matches this rule. - pub fn matches(&self, path: &Path) -> bool { - match path.strip_prefix(&self.base_path) { - Ok(suffix) => { - if let Some(pattern) = &self.exclude { - if pattern.is_match(suffix) { - return false; - } - } - self.include.is_match(suffix) - } - Err(_) => false, - } - } - - pub fn file_name_for_path<'a>(&self, path: &'a Path) -> anyhow::Result<&'a str> { - if let Some(suffix) = &self.suffix { - let file_name = path - .file_name() - .and_then(|s| s.to_str()) - .with_context(|| format!("file name of {} is invalid", path.display()))?; - if file_name.ends_with(suffix) { - let end = file_name.len().saturating_sub(suffix.len()); - Ok(&file_name[..end]) - } else { - Ok(file_name) - } - } else { - // If the user doesn't specify a suffix, we assume they just want - // the name of the file (the file_stem) - path.file_stem() - .and_then(|s| s.to_str()) - .with_context(|| format!("file name of {} is invalid", path.display())) - } - } -} diff --git a/src/snapshot/patch.rs b/src/snapshot/patch.rs index e8899357..1d320a2c 100644 --- a/src/snapshot/patch.rs +++ b/src/snapshot/patch.rs @@ -1,9 +1,8 @@ //! Defines the data structures used for describing instance patches. -use rbx_dom_weak::{ - types::{Ref, Variant}, - HashMapExt as _, Ustr, UstrMap, -}; +use std::collections::HashMap; + +use rbx_dom_weak::types::{Ref, Variant}; use serde::{Deserialize, Serialize}; use super::{InstanceMetadata, InstanceSnapshot}; @@ -20,7 +19,7 @@ pub struct PatchSet { pub updated_instances: Vec, } -impl PatchSet { +impl<'a> PatchSet { pub fn new() -> Self { PatchSet { removed_instances: Vec::new(), @@ -42,11 +41,11 @@ pub struct PatchAdd { pub struct PatchUpdate { pub id: Ref, pub changed_name: Option, - pub changed_class_name: Option, + pub changed_class_name: Option, /// Contains all changed properties. If a property is assigned to `None`, /// then that property has been removed. - pub changed_properties: UstrMap>, + pub changed_properties: HashMap>, /// Changed Rojo-specific metadata, if any of it changed. pub changed_metadata: Option, @@ -77,10 +76,6 @@ impl AppliedPatchSet { updated: Vec::new(), } } - - pub fn is_empty(&self) -> bool { - self.removed.is_empty() && self.added.is_empty() && self.updated.is_empty() - } } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -89,8 +84,8 @@ pub struct AppliedPatchUpdate { // TODO: Store previous values in order to detect application conflicts pub changed_name: Option, - pub changed_class_name: Option, - pub changed_properties: UstrMap>, + pub changed_class_name: Option, + pub changed_properties: HashMap>, pub changed_metadata: Option, } @@ -100,7 +95,7 @@ impl AppliedPatchUpdate { id, changed_name: None, changed_class_name: None, - changed_properties: UstrMap::new(), + changed_properties: HashMap::new(), changed_metadata: None, } } diff --git a/src/snapshot/patch_apply.rs b/src/snapshot/patch_apply.rs index 8427c1a1..4e40061c 100644 --- a/src/snapshot/patch_apply.rs +++ b/src/snapshot/patch_apply.rs @@ -1,49 +1,32 @@ //! Defines the algorithm for applying generated patches. -use std::{ - collections::{HashMap, HashSet}, - mem::take, -}; +use std::collections::HashMap; -use rbx_dom_weak::{ - types::{Ref, Variant}, - ustr, Ustr, -}; +use rbx_dom_weak::types::{Ref, Variant}; use super::{ patch::{AppliedPatchSet, AppliedPatchUpdate, PatchSet, PatchUpdate}, InstanceSnapshot, RojoTree, }; -use crate::{multimap::MultiMap, RojoRef, REF_ID_ATTRIBUTE_NAME, REF_POINTER_ATTRIBUTE_PREFIX}; /// Consumes the input `PatchSet`, applying all of its prescribed changes to the /// tree and returns an `AppliedPatchSet`, which can be used to keep another /// tree in sync with Rojo's. -#[profiling::function] pub fn apply_patch_set(tree: &mut RojoTree, patch_set: PatchSet) -> AppliedPatchSet { let mut context = PatchApplyContext::default(); - { - profiling::scope!("removals"); - for removed_id in patch_set.removed_instances { - apply_remove_instance(&mut context, tree, removed_id); - } + for removed_id in patch_set.removed_instances { + apply_remove_instance(&mut context, tree, removed_id); } - { - profiling::scope!("additions"); - for add_patch in patch_set.added_instances { - apply_add_child(&mut context, tree, add_patch.parent_id, add_patch.instance); - } + for add_patch in patch_set.added_instances { + apply_add_child(&mut context, tree, add_patch.parent_id, add_patch.instance); } - { - profiling::scope!("updates"); - // Updates need to be applied after additions, which reduces the complexity - // of updates significantly. - for update_patch in patch_set.updated_instances { - apply_update_child(&mut context, tree, update_patch); - } + // Updates need to be applied after additions, which reduces the complexity + // of updates significantly. + for update_patch in patch_set.updated_instances { + apply_update_child(&mut context, tree, update_patch); } finalize_patch_application(context, tree) @@ -72,14 +55,20 @@ struct PatchApplyContext { /// eachother. snapshot_id_to_instance_id: HashMap, - /// Tracks all of the instances added by this patch that have refs that need - /// to be rewritten. - has_refs_to_rewrite: HashSet, - - /// Tracks all ref properties that were specified using attributes. This has - /// to be handled after everything else is done just like normal referent - /// properties. - attribute_refs_to_rewrite: MultiMap, + /// The properties of instances added by the current `PatchSet`. + /// + /// Instances added to the tree can refer to eachother via Ref properties, + /// but we need to make sure they're correctly transformed from snapshot + /// space into tree space (via `snapshot_id_to_instance_id`). + /// + /// It's not possible to do that transformation for refs that refer to added + /// instances until all the instances have actually been inserted into the + /// tree. For simplicity, we defer application of _all_ properties on added + /// instances instead of just Refs. + /// + /// This doesn't affect updated instances, since they're always applied + /// after we've added all the instances from the patch. + added_instance_properties: HashMap>, /// The current applied patch result, describing changes made to the tree. applied_patch_set: AppliedPatchSet, @@ -95,38 +84,24 @@ struct PatchApplyContext { /// The remaining Ref properties need to be handled during patch application, /// where we build up a map of snapshot IDs to instance IDs as they're created, /// then apply properties all at once at the end. -#[profiling::function] fn finalize_patch_application(context: PatchApplyContext, tree: &mut RojoTree) -> AppliedPatchSet { - for id in context.has_refs_to_rewrite { + for (id, properties) in context.added_instance_properties { // This should always succeed since instances marked as added in our // patch should be added without fail. let mut instance = tree .get_instance_mut(id) .expect("Invalid instance ID in deferred property map"); - for value in instance.properties_mut().values_mut() { - if let Variant::Ref(referent) = value { - if let Some(&instance_referent) = context.snapshot_id_to_instance_id.get(referent) { - *value = Variant::Ref(instance_referent); + for (key, mut property_value) in properties { + if let Variant::Ref(referent) = property_value { + if let Some(&instance_referent) = context.snapshot_id_to_instance_id.get(&referent) + { + property_value = Variant::Ref(instance_referent); } } - } - } - // This is to get around the fact that `RojoTre::get_specified_id` borrows - // the tree as immutable, but we need to hold a mutable reference to it. - // Not exactly elegant, but it does the job. - let mut real_rewrites = Vec::new(); - for (id, map) in context.attribute_refs_to_rewrite { - for (prop_name, prop_value) in map { - if let Some(target) = tree.get_specified_id(&RojoRef::new(prop_value)) { - real_rewrites.push((prop_name, Variant::Ref(target))) - } + instance.properties_mut().insert(key, property_value); } - let mut instance = tree - .get_instance_mut(id) - .expect("Invalid instance ID in deferred attribute ref map"); - instance.properties_mut().extend(real_rewrites.drain(..)); } context.applied_patch_set @@ -141,34 +116,32 @@ fn apply_add_child( context: &mut PatchApplyContext, tree: &mut RojoTree, parent_id: Ref, - mut snapshot: InstanceSnapshot, + snapshot: InstanceSnapshot, ) { let snapshot_id = snapshot.snapshot_id; - let children = take(&mut snapshot.children); + let properties = snapshot.properties; + let children = snapshot.children; - // If an object we're adding has a non-null referent, we'll note this - // instance down as needing to be revisited later. - let has_refs = snapshot.properties.values().any(|value| match value { - Variant::Ref(value) => value.is_some(), - _ => false, - }); + // Property application is deferred until after all children + // are constructed. This helps apply referents correctly. + let remaining_snapshot = InstanceSnapshot::new() + .name(snapshot.name) + .class_name(snapshot.class_name) + .metadata(snapshot.metadata) + .snapshot_id(snapshot.snapshot_id); - let id = tree.insert_instance(parent_id, snapshot); + let id = tree.insert_instance(parent_id, remaining_snapshot); context.applied_patch_set.added.push(id); - if has_refs { - context.has_refs_to_rewrite.insert(id); - } + context.added_instance_properties.insert(id, properties); - if snapshot_id.is_some() { + if let Some(snapshot_id) = snapshot_id { context.snapshot_id_to_instance_id.insert(snapshot_id, id); } for child in children { apply_add_child(context, tree, id, child); } - - defer_ref_properties(tree, id, context); } fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patch: PatchUpdate) { @@ -196,7 +169,7 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc } if let Some(class_name) = patch.changed_class_name { - instance.set_class_name(class_name); + *instance.class_name_mut() = class_name.clone(); applied_patch.changed_class_name = Some(class_name); } @@ -222,10 +195,10 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc instance .properties_mut() - .insert(key, Variant::Ref(new_referent)); + .insert(key.clone(), Variant::Ref(new_referent)); } Some(ref value) => { - instance.properties_mut().insert(key, value.clone()); + instance.properties_mut().insert(key.clone(), value.clone()); } None => { instance.properties_mut().remove(&key); @@ -235,79 +208,17 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc applied_patch.changed_properties.insert(key, property_entry); } - defer_ref_properties(tree, patch.id, context); - context.applied_patch_set.updated.push(applied_patch) } -/// Calculates manually-specified Ref properties and marks them in the provided -/// `PatchApplyContext` to be rewritten at the end of the patch application -/// process. -/// -/// Currently, this only uses attributes but it can easily handle rewriting -/// referents in other ways too! -fn defer_ref_properties(tree: &mut RojoTree, id: Ref, context: &mut PatchApplyContext) { - let instance = tree - .get_instance(id) - .expect("Instances should exist when calculating deferred refs"); - let attributes = match instance.properties().get(&ustr("Attributes")) { - Some(Variant::Attributes(attrs)) => attrs, - _ => return, - }; - - let mut attr_id = None; - for (attr_name, attr_value) in attributes.iter() { - if attr_name == REF_ID_ATTRIBUTE_NAME { - if let Variant::String(specified_id) = attr_value { - attr_id = Some(RojoRef::new(specified_id.clone())); - } else if let Variant::BinaryString(specified_id) = attr_value { - if let Ok(str) = std::str::from_utf8(specified_id.as_ref()) { - attr_id = Some(RojoRef::new(str.to_string())) - } else { - log::error!("Specified IDs must be valid UTF-8 strings.") - } - } else { - log::warn!( - "Attribute {attr_name} is of type {:?} when it was \ - expected to be a String", - attr_value.ty() - ) - } - } - if let Some(prop_name) = attr_name.strip_prefix(REF_POINTER_ATTRIBUTE_PREFIX) { - if let Variant::String(prop_value) = attr_value { - context - .attribute_refs_to_rewrite - .insert(id, (ustr(prop_name), prop_value.clone())); - } else if let Variant::BinaryString(prop_value) = attr_value { - if let Ok(str) = std::str::from_utf8(prop_value.as_ref()) { - context - .attribute_refs_to_rewrite - .insert(id, (ustr(prop_name), str.to_string())); - } else { - log::error!("IDs specified by referent property attributes must be valid UTF-8 strings.") - } - } else { - log::warn!( - "Attribute {attr_name} is of type {:?} when it was \ - expected to be a String", - attr_value.ty() - ) - } - } - } - if let Some(specified_id) = attr_id { - tree.set_specified_id(id, specified_id); - } -} - #[cfg(test)] mod test { use super::*; use std::borrow::Cow; - use rbx_dom_weak::{types::Variant, UstrMap}; + use maplit::hashmap; + use rbx_dom_weak::types::Variant; use super::super::PatchAdd; @@ -320,11 +231,13 @@ mod test { let root_id = tree.get_root_id(); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("Foo"), - class_name: ustr("Bar"), - properties: UstrMap::from_iter([(ustr("Baz"), Variant::Int32(5))]), + class_name: Cow::Borrowed("Bar"), + properties: hashmap! { + "Baz".to_owned() => Variant::Int32(5), + }, children: Vec::new(), }; @@ -343,7 +256,7 @@ mod test { let child_instance = tree.get_instance(child_id).unwrap(); assert_eq!(child_instance.name(), &snapshot.name); - assert_eq!(child_instance.class_name(), snapshot.class_name); + assert_eq!(child_instance.class_name(), &snapshot.class_name); assert_eq!(child_instance.properties(), &snapshot.properties); assert!(child_instance.children().is_empty()); } @@ -366,15 +279,17 @@ mod test { let patch = PatchUpdate { id: root_id, changed_name: Some("Foo".to_owned()), - changed_class_name: Some(ustr("NewClassName")), - changed_properties: UstrMap::from_iter([ + changed_class_name: Some("NewClassName".to_owned()), + changed_properties: hashmap! { // The value of Foo has changed - (ustr("Foo"), Some(Variant::Int32(8))), + "Foo".to_owned() => Some(Variant::Int32(8)), + // Bar has been deleted - (ustr("Bar"), None), + "Bar".to_owned() => None, + // Baz has been added - (ustr("Baz"), Some(Variant::Int32(10))), - ]), + "Baz".to_owned() => Some(Variant::Int32(10)), + }, changed_metadata: None, }; @@ -385,11 +300,11 @@ mod test { apply_patch_set(&mut tree, patch_set); - let expected_properties = UstrMap::from_iter([ - (ustr("Foo"), Variant::Int32(8)), - (ustr("Baz"), Variant::Int32(10)), - (ustr("Unchanged"), Variant::Int32(-5)), - ]); + let expected_properties = hashmap! { + "Foo".to_owned() => Variant::Int32(8), + "Baz".to_owned() => Variant::Int32(10), + "Unchanged".to_owned() => Variant::Int32(-5), + }; let root_instance = tree.get_instance(root_id).unwrap(); assert_eq!(root_instance.name(), "Foo"); diff --git a/src/snapshot/patch_compute.rs b/src/snapshot/patch_compute.rs index 412c677a..76f0b26c 100644 --- a/src/snapshot/patch_compute.rs +++ b/src/snapshot/patch_compute.rs @@ -1,22 +1,20 @@ //! Defines the algorithm for computing a roughly-minimal patch set given an //! existing instance tree and an instance snapshot. -use std::{collections::HashMap, mem::take}; +use std::collections::{HashMap, HashSet}; -use rbx_dom_weak::{ - types::{Ref, Variant}, - ustr, HashMapExt as _, UstrMap, UstrSet, -}; - -use crate::{variant_eq::variant_eq, RojoRef, REF_POINTER_ATTRIBUTE_PREFIX}; +use rbx_dom_weak::types::{Ref, Variant}; use super::{ patch::{PatchAdd, PatchSet, PatchUpdate}, InstanceSnapshot, InstanceWithMeta, RojoTree, }; -#[profiling::function] -pub fn compute_patch_set(snapshot: Option, tree: &RojoTree, id: Ref) -> PatchSet { +pub fn compute_patch_set( + snapshot: Option<&InstanceSnapshot>, + tree: &RojoTree, + id: Ref, +) -> PatchSet { let mut patch_set = PatchSet::new(); if let Some(snapshot) = snapshot { @@ -28,8 +26,10 @@ pub fn compute_patch_set(snapshot: Option, tree: &RojoTree, id // for all of the IDs that we know about so far. rewrite_refs_in_updates(&context, &mut patch_set.updated_instances); rewrite_refs_in_additions(&context, &mut patch_set.added_instances); - } else if id != tree.get_root_id() { - patch_set.removed_instances.push(id); + } else { + if id != tree.get_root_id() { + patch_set.removed_instances.push(id); + } } patch_set @@ -74,123 +74,72 @@ fn rewrite_refs_in_snapshot(context: &ComputePatchContext, snapshot: &mut Instan fn compute_patch_set_internal( context: &mut ComputePatchContext, - mut snapshot: InstanceSnapshot, + snapshot: &InstanceSnapshot, tree: &RojoTree, id: Ref, patch_set: &mut PatchSet, ) { - if snapshot.snapshot_id.is_some() { - context - .snapshot_id_to_instance_id - .insert(snapshot.snapshot_id, id); + if let Some(snapshot_id) = snapshot.snapshot_id { + context.snapshot_id_to_instance_id.insert(snapshot_id, id); } let instance = tree .get_instance(id) .expect("Instance did not exist in tree"); - compute_property_patches(&mut snapshot, &instance, patch_set, tree); - compute_children_patches(context, &mut snapshot, tree, id, patch_set); + compute_property_patches(snapshot, &instance, patch_set); + compute_children_patches(context, snapshot, tree, id, patch_set); } fn compute_property_patches( - snapshot: &mut InstanceSnapshot, + snapshot: &InstanceSnapshot, instance: &InstanceWithMeta, patch_set: &mut PatchSet, - tree: &RojoTree, ) { - let mut visited_properties = UstrSet::default(); - let mut changed_properties = UstrMap::new(); - - let attribute_ref_properties = compute_ref_properties(snapshot, tree); + let mut visited_properties = HashSet::new(); + let mut changed_properties = HashMap::new(); let changed_name = if snapshot.name == instance.name() { None } else { - Some(take(&mut snapshot.name).into_owned()) + Some(snapshot.name.clone().into_owned()) }; let changed_class_name = if snapshot.class_name == instance.class_name() { None } else { - Some(take(&mut snapshot.class_name)) + Some(snapshot.class_name.clone().into_owned()) }; let changed_metadata = if &snapshot.metadata == instance.metadata() { None } else { - Some(take(&mut snapshot.metadata)) + Some(snapshot.metadata.clone()) }; - for (name, snapshot_value) in take(&mut snapshot.properties) { - visited_properties.insert(name); + for (name, snapshot_value) in &snapshot.properties { + visited_properties.insert(name.as_str()); - match instance.properties().get(&name) { + match instance.properties().get(name) { Some(instance_value) => { - if !variant_eq(&snapshot_value, instance_value) { - changed_properties.insert(name, Some(snapshot_value)); + if snapshot_value != instance_value { + changed_properties.insert(name.clone(), Some(snapshot_value.clone())); } } None => { - changed_properties.insert(name, Some(snapshot_value)); + changed_properties.insert(name.clone(), Some(snapshot_value.clone())); } } } for name in instance.properties().keys() { - if visited_properties.contains(name) { + if visited_properties.contains(name.as_str()) { continue; } - changed_properties.insert(*name, None); + changed_properties.insert(name.clone(), None); } - for (name, ref_value) in attribute_ref_properties { - match (&ref_value, instance.properties().get(&name)) { - (Some(referent), Some(instance_value)) => { - if referent != instance_value { - changed_properties.insert(name, ref_value); - } else { - changed_properties.remove(&name); - } - } - (Some(_), None) | (None, Some(_)) => { - changed_properties.insert(name, ref_value); - } - (None, None) => { - changed_properties.remove(&name); - } - } - } - - // !!!!!!!!!! UGLY HACK !!!!!!!!!! - // - // See RojoTree::insert_instance. Adjust that code also if you are touching this. - let actual_class = changed_class_name.unwrap_or(instance.class_name()); - match actual_class.as_str() { - "Model" | "Actor" | "Tool" | "HopperBin" | "Flag" | "WorldModel" | "Workspace" - | "Status" => { - let migration_prop = ustr("NeedsPivotMigration"); - // We want to just ignore this if it's being removed by a patch. - // Normally this would not matter because serving != building but - // if we start syncing models using SerializationService - // (or GetObjects) it will affect how Studio deserializes things. - if !instance.properties().contains_key(&migration_prop) { - changed_properties.insert(migration_prop, Some(Variant::Bool(false))); - } - match changed_properties.get(&migration_prop) { - Some(Some(Variant::Bool(_))) => {} - Some(None) => { - changed_properties.remove(&migration_prop); - } - _ => { - changed_properties.insert(migration_prop, Some(Variant::Bool(false))); - } - } - } - _ => {} - }; - if changed_properties.is_empty() && changed_name.is_none() && changed_class_name.is_none() @@ -210,7 +159,7 @@ fn compute_property_patches( fn compute_children_patches( context: &mut ComputePatchContext, - snapshot: &mut InstanceSnapshot, + snapshot: &InstanceSnapshot, tree: &RojoTree, id: Ref, patch_set: &mut PatchSet, @@ -223,7 +172,7 @@ fn compute_children_patches( let mut paired_instances = vec![false; instance_children.len()]; - for snapshot_child in take(&mut snapshot.children) { + for snapshot_child in snapshot.children.iter() { let matching_instance = instance_children .iter() @@ -260,7 +209,7 @@ fn compute_children_patches( None => { patch_set.added_instances.push(PatchAdd { parent_id: id, - instance: snapshot_child, + instance: snapshot_child.clone(), }); } } @@ -275,58 +224,14 @@ fn compute_children_patches( } } -fn compute_ref_properties( - snapshot: &InstanceSnapshot, - tree: &RojoTree, -) -> UstrMap> { - let mut map = UstrMap::new(); - let attributes = match snapshot.properties.get(&ustr("Attributes")) { - Some(Variant::Attributes(attrs)) => attrs, - _ => return map, - }; - - for (attr_name, attr_value) in attributes.iter() { - let prop_name = match attr_name.strip_prefix(REF_POINTER_ATTRIBUTE_PREFIX) { - Some(str) => str, - None => continue, - }; - let rojo_ref = match attr_value { - Variant::String(str) => RojoRef::new(str.clone()), - Variant::BinaryString(bytes) => { - if let Ok(str) = std::str::from_utf8(bytes.as_ref()) { - RojoRef::new(str.to_string()) - } else { - log::warn!( - "IDs specified by referent property attributes must be valid UTF-8 strings" - ); - continue; - } - } - _ => { - log::warn!( - "Attribute {attr_name} is of type {:?} when it was \ - expected to be a String", - attr_value.ty() - ); - continue; - } - }; - if let Some(target_id) = tree.get_specified_id(&rojo_ref) { - map.insert(ustr(prop_name), Some(Variant::Ref(target_id))); - } else { - map.insert(ustr(prop_name), None); - } - } - - map -} - #[cfg(test)] mod test { use super::*; use std::borrow::Cow; + use maplit::hashmap; + /// This test makes sure that rewriting refs in instance update patches to /// instances that already exists works. We should be able to correlate the /// snapshot ID and instance ID during patch computation and replace the @@ -341,26 +246,27 @@ mod test { // addition of a prop named Self, which is a self-referential Ref. let snapshot_id = Ref::new(); let snapshot = InstanceSnapshot { - snapshot_id, - properties: UstrMap::from_iter([(ustr("Self"), Variant::Ref(snapshot_id))]), + snapshot_id: Some(snapshot_id), + properties: hashmap! { + "Self".to_owned() => Variant::Ref(snapshot_id), + }, metadata: Default::default(), name: Cow::Borrowed("foo"), - class_name: ustr("foo"), + class_name: Cow::Borrowed("foo"), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, root_id); + let patch_set = compute_patch_set(Some(&snapshot), &tree, root_id); let expected_patch_set = PatchSet { updated_instances: vec![PatchUpdate { id: root_id, changed_name: None, changed_class_name: None, - changed_properties: UstrMap::from_iter([( - ustr("Self"), - Some(Variant::Ref(root_id)), - )]), + changed_properties: hashmap! { + "Self".to_owned() => Some(Variant::Ref(root_id)), + }, changed_metadata: None, }], added_instances: Vec::new(), @@ -382,34 +288,38 @@ mod test { // This patch describes the existing instance with a new child added. let snapshot_id = Ref::new(); let snapshot = InstanceSnapshot { - snapshot_id, + snapshot_id: Some(snapshot_id), children: vec![InstanceSnapshot { - properties: UstrMap::from_iter([(ustr("Self"), Variant::Ref(snapshot_id))]), + properties: hashmap! { + "Self".to_owned() => Variant::Ref(snapshot_id), + }, - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("child"), - class_name: ustr("child"), + class_name: Cow::Borrowed("child"), children: Vec::new(), }], metadata: Default::default(), - properties: UstrMap::new(), + properties: HashMap::new(), name: Cow::Borrowed("foo"), - class_name: ustr("foo"), + class_name: Cow::Borrowed("foo"), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, root_id); + let patch_set = compute_patch_set(Some(&snapshot), &tree, root_id); let expected_patch_set = PatchSet { added_instances: vec![PatchAdd { parent_id: root_id, instance: InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), - properties: UstrMap::from_iter([(ustr("Self"), Variant::Ref(root_id))]), + properties: hashmap! { + "Self".to_owned() => Variant::Ref(root_id), + }, name: Cow::Borrowed("child"), - class_name: ustr("child"), + class_name: Cow::Borrowed("child"), children: Vec::new(), }, }], diff --git a/src/snapshot/tests/apply.rs b/src/snapshot/tests/apply.rs index 4c3f7f38..96a365ac 100644 --- a/src/snapshot/tests/apply.rs +++ b/src/snapshot/tests/apply.rs @@ -1,6 +1,6 @@ use insta::assert_yaml_snapshot; +use maplit::hashmap; -use rbx_dom_weak::{ustr, UstrMap}; use rojo_insta_ext::RedactionMap; use crate::{ @@ -10,7 +10,7 @@ use crate::{ #[test] fn set_name_and_class_name() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -19,7 +19,7 @@ fn set_name_and_class_name() { updated_instances: vec![PatchUpdate { id: tree.get_root_id(), changed_name: Some("Hello, world!".to_owned()), - changed_class_name: Some(ustr("Folder")), + changed_class_name: Some("Folder".to_owned()), changed_properties: Default::default(), changed_metadata: None, }], @@ -37,7 +37,7 @@ fn set_name_and_class_name() { #[test] fn add_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -47,7 +47,9 @@ fn add_property() { id: tree.get_root_id(), changed_name: None, changed_class_name: None, - changed_properties: UstrMap::from_iter([(ustr("Foo"), Some("Value of Foo".into()))]), + changed_properties: hashmap! { + "Foo".to_owned() => Some("Value of Foo".into()), + }, changed_metadata: None, }], ..Default::default() @@ -64,7 +66,7 @@ fn add_property() { #[test] fn remove_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); intern_tree(&tree, &mut redactions); @@ -75,7 +77,7 @@ fn remove_property() { root_instance .properties_mut() - .insert(ustr("Foo"), "Should be removed".into()); + .insert("Foo".to_owned(), "Should be removed".into()); } let tree_view = view_tree(&tree, &mut redactions); @@ -86,7 +88,9 @@ fn remove_property() { id: tree.get_root_id(), changed_name: None, changed_class_name: None, - changed_properties: UstrMap::from_iter([(ustr("Foo"), None)]), + changed_properties: hashmap! { + "Foo".to_owned() => None, + }, changed_metadata: None, }], ..Default::default() diff --git a/src/snapshot/tests/compute.rs b/src/snapshot/tests/compute.rs index 2888a94d..7b15d378 100644 --- a/src/snapshot/tests/compute.rs +++ b/src/snapshot/tests/compute.rs @@ -1,29 +1,29 @@ use std::borrow::Cow; use insta::assert_yaml_snapshot; +use maplit::hashmap; -use rbx_dom_weak::{types::Ref, ustr, UstrMap}; use rojo_insta_ext::RedactionMap; use crate::snapshot::{compute_patch_set, InstanceSnapshot, RojoTree}; #[test] fn set_name_and_class_name() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("Some Folder"), - class_name: ustr("Folder"), + class_name: Cow::Borrowed("Folder"), properties: Default::default(), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(Some(&snapshot), &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -31,21 +31,23 @@ fn set_name_and_class_name() { #[test] fn set_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), - properties: UstrMap::from_iter([(ustr("PropertyName"), "Hello, world!".into())]), + class_name: Cow::Borrowed("ROOT"), + properties: hashmap! { + "PropertyName".to_owned() => "Hello, world!".into(), + }, children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(Some(&snapshot), &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -53,7 +55,7 @@ fn set_property() { #[test] fn remove_property() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -61,21 +63,22 @@ fn remove_property() { { let root_id = tree.get_root_id(); let mut root_instance = tree.get_instance_mut(root_id).unwrap(); - root_instance - .properties_mut() - .insert(ustr("Foo"), "This should be removed by the patch.".into()); + root_instance.properties_mut().insert( + "Foo".to_owned(), + "This should be removed by the patch.".into(), + ); } let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), + class_name: Cow::Borrowed("ROOT"), properties: Default::default(), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(Some(&snapshot), &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -83,28 +86,28 @@ fn remove_property() { #[test] fn add_child() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let tree = empty_tree(); redactions.intern(tree.get_root_id()); let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), + class_name: Cow::Borrowed("ROOT"), properties: Default::default(), children: vec![InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("New"), - class_name: ustr("Folder"), + class_name: Cow::Borrowed("Folder"), properties: Default::default(), children: Vec::new(), }], }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(Some(&snapshot), &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -112,7 +115,7 @@ fn add_child() { #[test] fn remove_child() { - let mut redactions = RedactionMap::default(); + let mut redactions = RedactionMap::new(); let mut tree = empty_tree(); redactions.intern(tree.get_root_id()); @@ -128,15 +131,15 @@ fn remove_child() { } let snapshot = InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Borrowed("ROOT"), - class_name: ustr("ROOT"), + class_name: Cow::Borrowed("ROOT"), properties: Default::default(), children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(Some(&snapshot), &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); diff --git a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property.snap b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property.snap index 930119b4..9d5e9d77 100644 --- a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property.snap +++ b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property.snap @@ -1,6 +1,7 @@ --- source: src/snapshot/tests/apply.rs expression: tree_view + --- id: id-1 name: ROOT @@ -11,9 +12,6 @@ properties: metadata: ignore_unknown_instances: false relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} children: [] + diff --git a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_after_patch.snap b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_after_patch.snap index fdf5ecd6..f8706912 100644 --- a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_after_patch.snap +++ b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_after_patch.snap @@ -9,9 +9,5 @@ properties: {} metadata: ignore_unknown_instances: false relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} children: [] diff --git a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_initial.snap b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_initial.snap index b2111922..936658f1 100644 --- a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_initial.snap +++ b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__remove_property_initial.snap @@ -1,6 +1,7 @@ --- source: src/snapshot/tests/apply.rs expression: tree_view + --- id: id-1 name: ROOT @@ -11,9 +12,6 @@ properties: metadata: ignore_unknown_instances: false relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} children: [] + diff --git a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__set_name_and_class_name.snap b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__set_name_and_class_name.snap index 9209a554..634b4d64 100644 --- a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__set_name_and_class_name.snap +++ b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__set_name_and_class_name.snap @@ -9,9 +9,5 @@ properties: {} metadata: ignore_unknown_instances: false relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} children: [] diff --git a/src/snapshot/tests/snapshots/librojo__snapshot__tests__compute__add_child.snap b/src/snapshot/tests/snapshots/librojo__snapshot__tests__compute__add_child.snap index 64541974..97bd639e 100644 --- a/src/snapshot/tests/snapshots/librojo__snapshot__tests__compute__add_child.snap +++ b/src/snapshot/tests/snapshots/librojo__snapshot__tests__compute__add_child.snap @@ -6,15 +6,11 @@ removed_instances: [] added_instances: - parent_id: id-1 instance: - snapshot_id: "00000000000000000000000000000000" + snapshot_id: ~ metadata: ignore_unknown_instances: false relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: New class_name: Folder properties: {} diff --git a/src/snapshot/tree.rs b/src/snapshot/tree.rs index 9e891f2c..b0f12b69 100644 --- a/src/snapshot/tree.rs +++ b/src/snapshot/tree.rs @@ -5,10 +5,10 @@ use std::{ use rbx_dom_weak::{ types::{Ref, Variant}, - ustr, Instance, InstanceBuilder, Ustr, UstrMap, WeakDom, + Instance, InstanceBuilder, WeakDom, }; -use crate::{multimap::MultiMap, RojoRef}; +use crate::multimap::MultiMap; use super::{InstanceMetadata, InstanceSnapshot}; @@ -33,25 +33,18 @@ pub struct RojoTree { /// appearing multiple times in the same Rojo project. This is sometimes /// called "path aliasing" in various Rojo documentation. path_to_ids: MultiMap, - - /// A map of specified RojoRefs to underlying Refs they represent. - /// This field is a MultiMap to allow for the possibility of the user specifying - /// the same RojoRef for multiple different instances. An entry containing - /// multiple elements is an error condition that should be raised to the user. - specified_id_to_refs: MultiMap, } impl RojoTree { pub fn new(snapshot: InstanceSnapshot) -> RojoTree { - let root_builder = InstanceBuilder::new(snapshot.class_name) - .with_name(snapshot.name) + let root_builder = InstanceBuilder::new(snapshot.class_name.to_owned()) + .with_name(snapshot.name.to_owned()) .with_properties(snapshot.properties); let mut tree = RojoTree { inner: WeakDom::new(root_builder), metadata_map: HashMap::new(), path_to_ids: MultiMap::new(), - specified_id_to_refs: MultiMap::new(), }; let root_ref = tree.inner.root_ref(); @@ -73,14 +66,7 @@ impl RojoTree { self.inner.root_ref() } - /// Returns the root Instance of this tree. - #[inline] - pub fn root(&self) -> InstanceWithMeta<'_> { - self.get_instance(self.get_root_id()) - .expect("RojoTrees should have a root") - } - - pub fn get_instance(&self, id: Ref) -> Option> { + pub fn get_instance(&self, id: Ref) -> Option { if let Some(instance) = self.inner.get_by_ref(id) { let metadata = self.metadata_map.get(&id).unwrap(); @@ -90,7 +76,7 @@ impl RojoTree { } } - pub fn get_instance_mut(&mut self, id: Ref) -> Option> { + pub fn get_instance_mut(&mut self, id: Ref) -> Option { if let Some(instance) = self.inner.get_by_ref_mut(id) { let metadata = self.metadata_map.get_mut(&id).unwrap(); @@ -101,33 +87,8 @@ impl RojoTree { } pub fn insert_instance(&mut self, parent_ref: Ref, snapshot: InstanceSnapshot) -> Ref { - // !!!!!!!!!! UGLY HACK !!!!!!!!!! - // ! If you are going to change this, go change it in patch_compute/compute_property_patches too - // - // This is a set of special cases working around a more general problem upstream - // in rbx-dom that causes pivots to not build to file correctly, described in - // github.com/rojo-rbx/rojo/issues/628 and github.com/rojo-rbx/rbx-dom/issues/385 - // - // We need to insert the NeedsPivotMigration property with a value of false on - // every instance that inherits from Model for pivots to build correctly. - let hack_needs_pivot_migration = match snapshot.class_name.as_ref() { - // This is not a future proof way to do this but the last time a - // descendant of Model was added was in 2020 so it's probably fine. - "Model" | "Actor" | "Tool" | "HopperBin" | "Flag" | "WorldModel" | "Workspace" - | "Status" - if !snapshot - .properties - .contains_key(&ustr("NeedsPivotMigration")) => - { - vec![("NeedsPivotMigration", Variant::Bool(false))] - } - _ => Vec::new(), - }; - - let builder = InstanceBuilder::empty() - .with_class(snapshot.class_name) - .with_name(snapshot.name.into_owned()) - .with_properties(hack_needs_pivot_migration) + let builder = InstanceBuilder::new(snapshot.class_name.to_owned()) + .with_name(snapshot.name.to_owned()) .with_properties(snapshot.properties); let referent = self.inner.insert(parent_ref, builder); @@ -175,20 +136,6 @@ impl RojoTree { self.path_to_ids.insert(new_path.clone(), id); } } - if existing_metadata.specified_id != metadata.specified_id { - // We need to uphold the invariant that each ID can only map - // to one referent. - if let Some(new) = &metadata.specified_id { - if !self.specified_id_to_refs.get(new).is_empty() { - log::error!("Duplicate user-specified referent '{new}'"); - } - - self.specified_id_to_refs.insert(new.clone(), id); - } - if let Some(old) = &existing_metadata.specified_id { - self.specified_id_to_refs.remove(old, id); - } - } entry.insert(metadata); } @@ -213,37 +160,11 @@ impl RojoTree { self.metadata_map.get(&id) } - /// Get the backing Ref of the given RojoRef. If the RojoRef maps to exactly - /// one Ref, this method returns Some. Otherwise, it returns None. - pub fn get_specified_id(&self, specified: &RojoRef) -> Option { - match self.specified_id_to_refs.get(specified)[..] { - [referent] => Some(referent), - _ => None, - } - } - - pub fn set_specified_id(&mut self, id: Ref, specified: RojoRef) { - if let Some(metadata) = self.metadata_map.get_mut(&id) { - if let Some(old) = metadata.specified_id.replace(specified.clone()) { - self.specified_id_to_refs.remove(&old, id); - } - } - self.specified_id_to_refs.insert(specified, id); - } - fn insert_metadata(&mut self, id: Ref, metadata: InstanceMetadata) { for path in &metadata.relevant_paths { self.path_to_ids.insert(path.clone(), id); } - if let Some(specified_id) = &metadata.specified_id { - if !self.specified_id_to_refs.get(specified_id).is_empty() { - log::error!("Duplicate user-specified referent '{specified_id}'"); - } - - self.set_specified_id(id, specified_id.clone()); - } - self.metadata_map.insert(id, metadata); } @@ -252,10 +173,6 @@ impl RojoTree { fn remove_metadata(&mut self, id: Ref) { let metadata = self.metadata_map.remove(&id).unwrap(); - if let Some(specified) = metadata.specified_id { - self.specified_id_to_refs.remove(&specified, id); - } - for path in &metadata.relevant_paths { self.path_to_ids.remove(path, id); } @@ -314,11 +231,11 @@ impl<'a> InstanceWithMeta<'a> { &self.instance.name } - pub fn class_name(&self) -> Ustr { - self.instance.class + pub fn class_name(&self) -> &'a str { + &self.instance.class } - pub fn properties(&self) -> &'a UstrMap { + pub fn properties(&self) -> &'a HashMap { &self.instance.properties } @@ -327,11 +244,7 @@ impl<'a> InstanceWithMeta<'a> { } pub fn metadata(&self) -> &'a InstanceMetadata { - self.metadata - } - - pub fn inner(&self) -> &Instance { - self.instance + &self.metadata } } @@ -363,15 +276,15 @@ impl InstanceWithMetaMut<'_> { &self.instance.class } - pub fn set_class_name<'a, S: Into<&'a str>>(&mut self, new_class: S) { - self.instance.class = ustr(new_class.into()); + pub fn class_name_mut(&mut self) -> &mut String { + &mut self.instance.class } - pub fn properties(&self) -> &UstrMap { + pub fn properties(&self) -> &HashMap { &self.instance.properties } - pub fn properties_mut(&mut self) -> &mut UstrMap { + pub fn properties_mut(&mut self) -> &mut HashMap { &mut self.instance.properties } @@ -380,41 +293,6 @@ impl InstanceWithMetaMut<'_> { } pub fn metadata(&self) -> &InstanceMetadata { - self.metadata - } - - pub fn inner(&self) -> &Instance { - self.instance - } - - pub fn inner_mut(&mut self) -> &mut Instance { - self.instance - } -} - -#[cfg(test)] -mod test { - use crate::{ - snapshot::{InstanceMetadata, InstanceSnapshot}, - RojoRef, - }; - - use super::RojoTree; - - #[test] - fn swap_duped_specified_ids() { - let custom_ref = RojoRef::new("MyCoolRef".into()); - let snapshot = InstanceSnapshot::new() - .metadata(InstanceMetadata::new().specified_id(Some(custom_ref.clone()))); - let mut tree = RojoTree::new(InstanceSnapshot::new()); - - let original = tree.insert_instance(tree.get_root_id(), snapshot.clone()); - assert_eq!(tree.get_specified_id(&custom_ref.clone()), Some(original)); - - let duped = tree.insert_instance(tree.get_root_id(), snapshot.clone()); - assert_eq!(tree.get_specified_id(&custom_ref.clone()), None); - - tree.remove(original); - assert_eq!(tree.get_specified_id(&custom_ref.clone()), Some(duped)); + &self.metadata } } diff --git a/src/snapshot_middleware/csv.rs b/src/snapshot_middleware/csv.rs index 8cea9b81..a8f27180 100644 --- a/src/snapshot_middleware/csv.rs +++ b/src/snapshot_middleware/csv.rs @@ -1,31 +1,22 @@ -use std::{ - borrow::Cow, - collections::{BTreeMap, BTreeSet}, - path::Path, -}; +use std::{collections::BTreeMap, path::Path}; use anyhow::Context; -use memofs::Vfs; -use rbx_dom_weak::{types::Variant, ustr}; -use serde::{Deserialize, Serialize}; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; +use serde::Serialize; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; -use super::{ - dir::{snapshot_dir_no_meta, syncback_dir_no_meta}, - meta_file::{AdjacentMetadata, DirectoryMetadata}, - PathExt as _, -}; +use super::{meta_file::AdjacentMetadata, util::PathExt}; pub fn snapshot_csv( _context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { + let name = path.file_name_trim_end(".csv")?; + + let meta_path = path.with_file_name(format!("{}.meta.json", name)); let contents = vfs.read(path)?; let table_contents = convert_localization_csv(&contents).with_context(|| { @@ -38,211 +29,44 @@ pub fn snapshot_csv( let mut snapshot = InstanceSnapshot::new() .name(name) .class_name("LocalizationTable") - .property(ustr("Contents"), table_contents) + .properties(hashmap! { + "Contents".to_owned() => table_contents.into(), + }) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]), + .relevant_paths(vec![path.to_path_buf(), meta_path.clone()]), ); - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; + metadata.apply_all(&mut snapshot)?; + } Ok(Some(snapshot)) } -/// Attempts to snapshot an 'init' csv contained inside of a folder with -/// the given name. -/// -/// csv named `init.csv` -/// their parents, which acts similarly to `__init__.py` from the Python world. -pub fn snapshot_csv_init( - context: &InstanceContext, - vfs: &Vfs, - init_path: &Path, - name: &str, -) -> anyhow::Result> { - let folder_path = init_path.parent().unwrap(); - let dir_snapshot = snapshot_dir_no_meta(context, vfs, folder_path, name)?.unwrap(); - - if dir_snapshot.class_name != "Folder" { - anyhow::bail!( - "init.csv can only be used if the instance produced by \ - the containing directory would be a Folder.\n\ - \n\ - The directory {} turned into an instance of class {}.", - folder_path.display(), - dir_snapshot.class_name - ); - } - - let mut init_snapshot = snapshot_csv(context, vfs, init_path, &dir_snapshot.name)?.unwrap(); - - init_snapshot.children = dir_snapshot.children; - init_snapshot.metadata = dir_snapshot.metadata; - // The directory snapshot middleware includes all possible init paths - // so we don't need to add it here. - - DirectoryMetadata::read_and_apply_all(vfs, folder_path, &mut init_snapshot)?; - - Ok(Some(init_snapshot)) -} - -pub fn syncback_csv<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let contents = - if let Some(Variant::String(content)) = new_inst.properties.get(&ustr("Contents")) { - content.as_str() - } else { - anyhow::bail!("LocalizationTables must have a `Contents` property that is a String") - }; - let mut fs_snapshot = FsSnapshot::new(); - fs_snapshot.add_file(&snapshot.path, localization_to_csv(contents)?); - - let meta = AdjacentMetadata::from_syncback_snapshot(snapshot, snapshot.path.clone())?; - if let Some(mut meta) = meta { - // LocalizationTables have relatively few properties that we care - // about, so shifting is fine. - meta.properties.shift_remove(&ustr("Contents")); - - if !meta.is_empty() { - let parent = snapshot.path.parent_err()?; - fs_snapshot.add_file( - parent.join(format!("{}.meta.json", new_inst.name)), - serde_json::to_vec_pretty(&meta).context("cannot serialize metadata")?, - ) - } - } - - Ok(SyncbackReturn { - fs_snapshot, - children: Vec::new(), - removed_children: Vec::new(), - }) -} - -pub fn syncback_csv_init<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let contents = - if let Some(Variant::String(content)) = new_inst.properties.get(&ustr("Contents")) { - content.as_str() - } else { - anyhow::bail!("LocalizationTables must have a `Contents` property that is a String") - }; - - let mut dir_syncback = syncback_dir_no_meta(snapshot)?; - dir_syncback.fs_snapshot.add_file( - snapshot.path.join("init.csv"), - localization_to_csv(contents)?, - ); - - let meta = DirectoryMetadata::from_syncback_snapshot(snapshot, snapshot.path.clone())?; - if let Some(mut meta) = meta { - // LocalizationTables have relatively few properties that we care - // about, so shifting is fine. - meta.properties.shift_remove(&ustr("Contents")); - if !meta.is_empty() { - dir_syncback.fs_snapshot.add_file( - snapshot.path.join("init.meta.json"), - serde_json::to_vec_pretty(&meta) - .context("could not serialize new init.meta.json")?, - ); - } - } - - Ok(dir_syncback) -} - /// Struct that holds any valid row from a Roblox CSV translation table. /// /// We manually deserialize into this table from CSV, but let serde_json handle /// serialization. -#[derive(Debug, Default, Deserialize)] +#[derive(Debug, Default, Serialize)] #[serde(rename_all = "camelCase")] struct LocalizationEntry<'a> { - key: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + key: Option<&'a str>, - context: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + context: Option<&'a str>, - // Roblox writes `examples` for LocalizationTable's Content property, which - // causes it to not roundtrip correctly. - // This is reported here: https://devforum.roblox.com/t/2908720. - // - // To support their mistake, we support an alias named `examples`. - #[serde(alias = "examples")] - example: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + example: Option<&'a str>, - source: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + source: Option<&'a str>, // We use a BTreeMap here to get deterministic output order. - values: BTreeMap, Cow<'a, str>>, -} - -// Guarantee a specific order of both fields and entries so that diff always match up -impl<'a> Serialize for LocalizationEntry<'a> { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - let mut btree = BTreeMap::new(); - - if let Some(key) = &self.key { - btree.insert( - "key", - serde_json::to_value(key).map_err(serde::ser::Error::custom)?, - ); - } - - if let Some(context) = &self.context { - btree.insert( - "context", - serde_json::to_value(context).map_err(serde::ser::Error::custom)?, - ); - } - - if let Some(example) = &self.example { - btree.insert( - "example", - serde_json::to_value(example).map_err(serde::ser::Error::custom)?, - ); - } - - if let Some(source) = &self.source { - btree.insert( - "source", - serde_json::to_value(source).map_err(serde::ser::Error::custom)?, - ); - } - - btree.insert( - "values", - serde_json::to_value(&self.values).map_err(serde::ser::Error::custom)?, - ); - - btree.serialize(serializer) - } -} - -fn sort_localization_entries(mut entries: Vec) -> Vec { - entries.sort_by(|a, b| { - a.key - .as_deref() - .unwrap_or_default() - .cmp(&b.key.as_deref().unwrap_or_default()) - .then_with(|| { - a.source - .as_deref() - .unwrap_or_default() - .cmp(&b.source.as_deref().unwrap_or_default()) - }) - }); - - entries + values: BTreeMap<&'a str, &'a str>, } /// Normally, we'd be able to let the csv crate construct our struct for us. @@ -254,7 +78,7 @@ fn sort_localization_entries(mut entries: Vec) -> Vec anyhow::Result { +fn convert_localization_csv(contents: &[u8]) -> Result { let mut reader = csv::Reader::from_reader(contents); let headers = reader.headers()?.clone(); @@ -276,14 +100,12 @@ fn convert_localization_csv(contents: &[u8]) -> anyhow::Result { } match header { - "Key" => entry.key = Some(Cow::Borrowed(value)), - "Source" => entry.source = Some(Cow::Borrowed(value)), - "Context" => entry.context = Some(Cow::Borrowed(value)), - "Example" => entry.example = Some(Cow::Borrowed(value)), + "Key" => entry.key = Some(value), + "Source" => entry.source = Some(value), + "Context" => entry.context = Some(value), + "Example" => entry.example = Some(value), _ => { - entry - .values - .insert(Cow::Borrowed(header), Cow::Borrowed(value)); + entry.values.insert(header, value); } } } @@ -295,61 +117,12 @@ fn convert_localization_csv(contents: &[u8]) -> anyhow::Result { entries.push(entry); } - let encoded = serde_json::to_string(&sort_localization_entries(entries)) - .context("Could not encode JSON for localization table")?; + let encoded = + serde_json::to_string(&entries).expect("Could not encode JSON for localization table"); Ok(encoded) } -/// Takes a localization table (as a string) and converts it into a CSV file. -/// -/// The CSV file is ordered, so it should be deterministic. -fn localization_to_csv(csv_contents: &str) -> anyhow::Result> { - let mut out = Vec::new(); - let mut writer = csv::Writer::from_writer(&mut out); - - let csv: Vec = sort_localization_entries( - serde_json::from_str(csv_contents).context("cannot decode JSON from localization table")?, - ); - - let mut headers = vec!["Key", "Source", "Context", "Example"]; - // We want both order and a lack of duplicates, so we use a BTreeSet. - let mut extra_headers = BTreeSet::new(); - for entry in &csv { - for lang in entry.values.keys() { - extra_headers.insert(lang.as_ref()); - } - } - headers.extend(extra_headers.iter()); - - writer - .write_record(&headers) - .context("could not write headers for localization table")?; - - let mut record: Vec<&str> = Vec::with_capacity(headers.len()); - for entry in &csv { - record.push(entry.key.as_deref().unwrap_or_default()); - record.push(entry.source.as_deref().unwrap_or_default()); - record.push(entry.context.as_deref().unwrap_or_default()); - record.push(entry.example.as_deref().unwrap_or_default()); - - let values = &entry.values; - for header in &extra_headers { - record.push(values.get(*header).map(AsRef::as_ref).unwrap_or_default()); - } - - writer - .write_record(&record) - .context("cannot write record for localization table")?; - record.clear(); - } - - // We must drop `writer` here to regain access to `out`. - drop(writer); - - Ok(out) -} - #[cfg(test)] mod test { use super::*; @@ -369,16 +142,12 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#, ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); - let instance_snapshot = snapshot_csv( - &InstanceContext::default(), - &vfs, - Path::new("/foo.csv"), - "foo", - ) - .unwrap() - .unwrap(); + let instance_snapshot = + snapshot_csv(&InstanceContext::default(), &mut vfs, Path::new("/foo.csv")) + .unwrap() + .unwrap(); insta::assert_yaml_snapshot!(instance_snapshot); } @@ -401,87 +170,13 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#, ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); - let instance_snapshot = snapshot_csv( - &InstanceContext::default(), - &vfs, - Path::new("/foo.csv"), - "foo", - ) - .unwrap() - .unwrap(); + let instance_snapshot = + snapshot_csv(&InstanceContext::default(), &mut vfs, Path::new("/foo.csv")) + .unwrap() + .unwrap(); insta::assert_yaml_snapshot!(instance_snapshot); } - - #[test] - fn csv_init() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/root", - VfsSnapshot::dir([( - "init.csv", - VfsSnapshot::file( - r#" -Key,Source,Context,Example,es -Ack,Ack!,,An exclamation of despair,¡Ay!"#, - ), - )]), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_csv_init( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, - Path::new("/root/init.csv"), - "root", - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn csv_init_with_meta() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/root", - VfsSnapshot::dir([ - ( - "init.csv", - VfsSnapshot::file( - r#" -Key,Source,Context,Example,es -Ack,Ack!,,An exclamation of despair,¡Ay!"#, - ), - ), - ( - "init.meta.json", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ), - ]), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_csv_init( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, - Path::new("/root/init.csv"), - "root", - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } } diff --git a/src/snapshot_middleware/dir.rs b/src/snapshot_middleware/dir.rs index b9f62743..bad35c81 100644 --- a/src/snapshot_middleware/dir.rs +++ b/src/snapshot_middleware/dir.rs @@ -1,51 +1,23 @@ -use std::{ - collections::{HashMap, HashSet}, - path::Path, -}; +use std::path::Path; -use anyhow::Context; -use memofs::{DirEntry, Vfs}; +use memofs::{DirEntry, IoResultExt, Vfs}; -use crate::{ - snapshot::{ - is_path_ignored, InstanceContext, InstanceMetadata, InstanceSnapshot, InstigatingSource, - }, - syncback::{hash_instance, FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; use super::{meta_file::DirectoryMetadata, snapshot_from_vfs}; -const EMPTY_DIR_KEEP_NAME: &str = ".gitkeep"; - pub fn snapshot_dir( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { - let mut snapshot = match snapshot_dir_no_meta(context, vfs, path, name)? { - Some(snapshot) => snapshot, - None => return Ok(None), + let passes_filter_rules = |child: &DirEntry| { + context + .path_ignore_rules + .iter() + .all(|rule| rule.passes(child.path())) }; - DirectoryMetadata::read_and_apply_all(vfs, path, &mut snapshot)?; - - Ok(Some(snapshot)) -} - -/// Snapshot a directory without applying meta files; useful for if the -/// directory's ClassName will change before metadata should be applied. For -/// example, this can happen if the directory contains an `init.client.lua` -/// file. -pub fn snapshot_dir_no_meta( - context: &InstanceContext, - vfs: &Vfs, - path: &Path, - name: &str, -) -> anyhow::Result> { - let passes_filter_rules = - |child: &DirEntry| !is_path_ignored(&context.path_ignore_rules, child.path()); - let mut snapshot_children = Vec::new(); for entry in vfs.read_dir(path)? { @@ -60,25 +32,28 @@ pub fn snapshot_dir_no_meta( } } - let normalized_path = vfs.canonicalize(path)?; + let instance_name = path + .file_name() + .expect("Could not extract file name") + .to_str() + .ok_or_else(|| anyhow::anyhow!("File name was not valid UTF-8: {}", path.display()))? + .to_string(); + + let meta_path = path.join("init.meta.json"); + let relevant_paths = vec![ - normalized_path.clone(), + path.to_path_buf(), + meta_path.clone(), // TODO: We shouldn't need to know about Lua existing in this // middleware. Should we figure out a way for that function to add // relevant paths to this middleware? - normalized_path.join("init.lua"), - normalized_path.join("init.luau"), - normalized_path.join("init.server.lua"), - normalized_path.join("init.server.luau"), - normalized_path.join("init.client.lua"), - normalized_path.join("init.client.luau"), - normalized_path.join("init.plugin.lua"), - normalized_path.join("init.plugin.luau"), - normalized_path.join("init.csv"), + path.join("init.lua"), + path.join("init.server.lua"), + path.join("init.client.lua"), ]; - let snapshot = InstanceSnapshot::new() - .name(name) + let mut snapshot = InstanceSnapshot::new() + .name(instance_name) .class_name("Folder") .children(snapshot_children) .metadata( @@ -88,143 +63,19 @@ pub fn snapshot_dir_no_meta( .context(context), ); + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = DirectoryMetadata::from_slice(&meta_contents, meta_path)?; + metadata.apply_all(&mut snapshot)?; + } + Ok(Some(snapshot)) } -pub fn syncback_dir<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let mut dir_syncback = syncback_dir_no_meta(snapshot)?; - - let mut meta = DirectoryMetadata::from_syncback_snapshot(snapshot, snapshot.path.clone())?; - if let Some(meta) = &mut meta { - if new_inst.class != "Folder" { - meta.class_name = Some(new_inst.class); - } - - if !meta.is_empty() { - dir_syncback.fs_snapshot.add_file( - snapshot.path.join("init.meta.json"), - serde_json::to_vec_pretty(&meta) - .context("could not serialize new init.meta.json")?, - ); - } - } - - let metadata_empty = meta - .as_ref() - .map(DirectoryMetadata::is_empty) - .unwrap_or_default(); - if new_inst.children().is_empty() && metadata_empty { - dir_syncback - .fs_snapshot - .add_file(snapshot.path.join(EMPTY_DIR_KEEP_NAME), Vec::new()) - } - - Ok(dir_syncback) -} - -pub fn syncback_dir_no_meta<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let mut children = Vec::new(); - let mut removed_children = Vec::new(); - - // We have to enforce unique child names for the file system. - let mut child_names = HashSet::with_capacity(new_inst.children().len()); - let mut duplicate_set = HashSet::new(); - for child_ref in new_inst.children() { - let child = snapshot.get_new_instance(*child_ref).unwrap(); - if !child_names.insert(child.name.to_lowercase()) { - duplicate_set.insert(child.name.as_str()); - } - } - if !duplicate_set.is_empty() { - if duplicate_set.len() <= 25 { - anyhow::bail!( - "Instance has children with duplicate name (case may not exactly match):\n {}", - duplicate_set.into_iter().collect::>().join(", ") - ); - } - anyhow::bail!("Instance has more than 25 children with duplicate names"); - } - - if let Some(old_inst) = snapshot.old_inst() { - let mut old_child_map = HashMap::with_capacity(old_inst.children().len()); - for child in old_inst.children() { - let inst = snapshot.get_old_instance(*child).unwrap(); - old_child_map.insert(inst.name(), inst); - } - - for new_child_ref in new_inst.children() { - let new_child = snapshot.get_new_instance(*new_child_ref).unwrap(); - if let Some(old_child) = old_child_map.remove(new_child.name.as_str()) { - if old_child.metadata().relevant_paths.is_empty() { - log::debug!( - "Skipping instance {} because it doesn't exist on the disk", - old_child.name() - ); - continue; - } else if matches!( - old_child.metadata().instigating_source, - Some(InstigatingSource::ProjectNode { .. }) - ) { - log::debug!( - "Skipping instance {} because it originates in a project file", - old_child.name() - ); - continue; - } - // This child exists in both doms. Pass it on. - children.push(snapshot.with_joined_path(*new_child_ref, Some(old_child.id()))?); - } else { - // The child only exists in the the new dom - children.push(snapshot.with_joined_path(*new_child_ref, None)?); - } - } - // Any children that are in the old dom but not the new one are removed. - removed_children.extend(old_child_map.into_values()); - } else { - // There is no old instance. Just add every child. - for new_child_ref in new_inst.children() { - children.push(snapshot.with_joined_path(*new_child_ref, None)?); - } - } - let mut fs_snapshot = FsSnapshot::new(); - - if let Some(old_ref) = snapshot.old { - let new_hash = hash_instance(snapshot.project(), snapshot.new_tree(), snapshot.new) - .expect("new Instance should be hashable"); - let old_hash = hash_instance(snapshot.project(), snapshot.old_tree(), old_ref) - .expect("old Instance should be hashable"); - - if old_hash != new_hash { - fs_snapshot.add_dir(&snapshot.path); - } else { - log::debug!( - "Skipping reserializing directory {} because old and new tree hash the same", - new_inst.name - ); - } - } else { - fs_snapshot.add_dir(&snapshot.path); - } - - Ok(SyncbackReturn { - fs_snapshot, - children, - removed_children, - }) -} - #[cfg(test)] mod test { use super::*; + use maplit::hashmap; use memofs::{InMemoryFs, VfsSnapshot}; #[test] @@ -233,10 +84,10 @@ mod test { imfs.load_snapshot("/foo", VfsSnapshot::empty_dir()) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = - snapshot_dir(&InstanceContext::default(), &vfs, Path::new("/foo"), "foo") + snapshot_dir(&InstanceContext::default(), &mut vfs, Path::new("/foo")) .unwrap() .unwrap(); @@ -248,14 +99,16 @@ mod test { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/foo", - VfsSnapshot::dir([("Child", VfsSnapshot::empty_dir())]), + VfsSnapshot::dir(hashmap! { + "Child" => VfsSnapshot::empty_dir(), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = - snapshot_dir(&InstanceContext::default(), &vfs, Path::new("/foo"), "foo") + snapshot_dir(&InstanceContext::default(), &mut vfs, Path::new("/foo")) .unwrap() .unwrap(); diff --git a/src/snapshot_middleware/json.rs b/src/snapshot_middleware/json.rs index 1a9537ad..8c7f369e 100644 --- a/src/snapshot_middleware/json.rs +++ b/src/snapshot_middleware/json.rs @@ -1,42 +1,50 @@ use std::path::Path; -use memofs::Vfs; -use rbx_dom_weak::ustr; +use anyhow::Context; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; use crate::{ - json, lua_ast::{Expression, Statement}, snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, }; -use super::meta_file::AdjacentMetadata; +use super::{meta_file::AdjacentMetadata, util::PathExt}; pub fn snapshot_json( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { + let name = path.file_name_trim_end(".json")?; let contents = vfs.read(path)?; - let value = json::parse_value_from_slice_with_context(&contents, || { - format!("File contains malformed JSON: {}", path.display()) - })?; + let value: serde_json::Value = serde_json::from_slice(&contents) + .with_context(|| format!("File contains malformed JSON: {}", path.display()))?; let as_lua = json_to_lua(value).to_string(); + let properties = hashmap! { + "Source".to_owned() => as_lua.into(), + }; + + let meta_path = path.with_file_name(format!("{}.meta.json", name)); + let mut snapshot = InstanceSnapshot::new() .name(name) .class_name("ModuleScript") - .property(ustr("Source"), as_lua) + .properties(properties) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf(), meta_path.clone()]) .context(context), ); - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; + metadata.apply_all(&mut snapshot)?; + } Ok(Some(snapshot)) } @@ -93,51 +101,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs.clone()); + let mut vfs = Vfs::new(imfs.clone()); let instance_snapshot = snapshot_json( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo.json"), - "foo", - ) - .unwrap() - .unwrap(); - - insta::assert_yaml_snapshot!(instance_snapshot); - } - - #[test] - fn with_metadata() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo.json", - VfsSnapshot::file( - r#"{ - "array": [1, 2, 3], - "int": 1234, - "float": 1234.5452, - }"#, - ), - ) - .unwrap(); - imfs.load_snapshot( - "/foo.meta.json", - VfsSnapshot::file( - r#"{ - "id": "manually specified" - }"#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs.clone()); - - let instance_snapshot = snapshot_json( - &InstanceContext::default(), - &vfs, - Path::new("/foo.json"), - "foo", ) .unwrap() .unwrap(); diff --git a/src/snapshot_middleware/json_model.rs b/src/snapshot_middleware/json_model.rs index fdc2069e..52071031 100644 --- a/src/snapshot_middleware/json_model.rs +++ b/src/snapshot_middleware/json_model.rs @@ -1,28 +1,23 @@ -use std::{borrow::Cow, path::Path, str}; +use std::{borrow::Cow, collections::HashMap, path::Path, str}; use anyhow::Context; -use indexmap::IndexMap; use memofs::Vfs; -use rbx_dom_weak::{ - types::{Attributes, Ref, Variant}, - HashMapExt as _, Ustr, UstrMap, -}; -use serde::{Deserialize, Serialize}; +use serde::Deserialize; use crate::{ - json, resolution::UnresolvedValue, snapshot::{InstanceContext, InstanceSnapshot}, - syncback::{filter_properties_preallocated, FsSnapshot, SyncbackReturn, SyncbackSnapshot}, - RojoRef, }; +use super::util::PathExt; + pub fn snapshot_json_model( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { + let name = path.file_name_trim_end(".model.json")?; + let contents = vfs.read(path)?; let contents_str = str::from_utf8(&contents) .with_context(|| format!("File was not valid UTF-8: {}", path.display()))?; @@ -31,187 +26,73 @@ pub fn snapshot_json_model( return Ok(None); } - let mut instance: JsonModel = json::from_str_with_context(contents_str, || { - format!("File is not a valid JSON model: {}", path.display()) - })?; - - if let Some(top_level_name) = &instance.name { - let new_name = format!("{}.model.json", top_level_name); - - log::warn!( - "Model at path {} had a top-level Name field. \ - This field has been ignored since Rojo 6.0.\n\ - Consider removing this field and renaming the file to {}.", - new_name, - path.display() - ); - } - - instance.name = Some(name.to_owned()); - - let id = instance.id.take().map(RojoRef::new); - let schema = instance.schema.take(); + let instance: JsonModel = serde_json::from_str(contents_str) + .with_context(|| format!("File is not a valid JSON model: {}", path.display()))?; let mut snapshot = instance - .into_snapshot() + .core + .into_snapshot(name.to_owned()) .with_context(|| format!("Could not load JSON model: {}", path.display()))?; snapshot.metadata = snapshot .metadata .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) - .context(context) - .specified_id(id) - .schema(schema); + .relevant_paths(vec![path.to_path_buf()]) + .context(context); Ok(Some(snapshot)) } -pub fn syncback_json_model<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let mut property_buffer = Vec::with_capacity(snapshot.new_inst().properties.len()); - - let mut model = json_model_from_pair(snapshot, &mut property_buffer, snapshot.new); - // We don't need the name on the root, but we do for children. - model.name = None; - - if let Some(old_inst) = snapshot.old_inst() { - // TODO: Is it worth this being an Arc or Rc? I doubt that enough - // schemas will ever exist in one project for it to matter, but it - // could have a performance cost. - model.schema = old_inst.metadata().schema.clone(); - } - - Ok(SyncbackReturn { - fs_snapshot: FsSnapshot::new().with_added_file( - &snapshot.path, - serde_json::to_vec_pretty(&model).context("failed to serialize new JSON Model")?, - ), - children: Vec::new(), - removed_children: Vec::new(), - }) -} - -fn json_model_from_pair<'sync>( - snapshot: &SyncbackSnapshot<'sync>, - prop_buffer: &mut Vec<(Ustr, &'sync Variant)>, - new: Ref, -) -> JsonModel { - let new_inst = snapshot - .get_new_instance(new) - .expect("all new referents passed to json_model_from_pair should exist"); - - filter_properties_preallocated(snapshot.project(), new_inst, prop_buffer); - - let mut properties = IndexMap::new(); - let mut attributes = IndexMap::new(); - for (name, value) in prop_buffer.drain(..) { - match value { - Variant::Attributes(attrs) => { - for (attr_name, attr_value) in attrs.iter() { - // We (probably) don't want to preserve internal attributes, - // only user defined ones. - if attr_name.starts_with("RBX") { - continue; - } - attributes.insert( - attr_name.clone(), - UnresolvedValue::from_variant_unambiguous(attr_value.clone()), - ); - } - } - _ => { - properties.insert( - name, - UnresolvedValue::from_variant(value.clone(), &new_inst.class, &name), - ); - } - } - } - - let mut children = Vec::with_capacity(new_inst.children().len()); - - for new_child_ref in new_inst.children() { - children.push(json_model_from_pair(snapshot, prop_buffer, *new_child_ref)) - } - - JsonModel { - name: Some(new_inst.name.clone()), - class_name: new_inst.class, - children, - properties, - attributes, - id: None, - schema: None, - } -} - -#[derive(Debug, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] struct JsonModel { - #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] - schema: Option, - - #[serde(alias = "Name", skip_serializing_if = "Option::is_none")] name: Option, - #[serde(alias = "ClassName")] - class_name: Ustr, - - #[serde(skip_serializing_if = "Option::is_none")] - id: Option, - - #[serde( - alias = "Children", - default = "Vec::new", - skip_serializing_if = "Vec::is_empty" - )] - children: Vec, - - #[serde( - alias = "Properties", - default, - skip_serializing_if = "IndexMap::is_empty" - )] - properties: IndexMap, - - #[serde(default = "IndexMap::new", skip_serializing_if = "IndexMap::is_empty")] - attributes: IndexMap, + #[serde(flatten)] + core: JsonModelCore, } -impl JsonModel { - fn into_snapshot(self) -> anyhow::Result { - let name = self.name.unwrap_or_else(|| self.class_name.to_owned()); +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +struct JsonModelInstance { + name: String, + + #[serde(flatten)] + core: JsonModelCore, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "PascalCase")] +struct JsonModelCore { + class_name: String, + + #[serde(default = "Vec::new", skip_serializing_if = "Vec::is_empty")] + children: Vec, + + #[serde(default = "HashMap::new", skip_serializing_if = "HashMap::is_empty")] + properties: HashMap, +} + +impl JsonModelCore { + fn into_snapshot(self, name: String) -> anyhow::Result { let class_name = self.class_name; let mut children = Vec::with_capacity(self.children.len()); for child in self.children { - children.push(child.into_snapshot()?); + children.push(child.core.into_snapshot(child.name)?); } - let mut properties = UstrMap::with_capacity(self.properties.len()); + let mut properties = HashMap::with_capacity(self.properties.len()); for (key, unresolved) in self.properties { let value = unresolved.resolve(&class_name, &key)?; properties.insert(key, value); } - if !self.attributes.is_empty() { - let mut attributes = Attributes::new(); - - for (key, unresolved) in self.attributes { - let value = unresolved.resolve_unambiguous()?; - attributes.insert(key, value); - } - - properties.insert("Attributes".into(), attributes.into()); - } - Ok(InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, metadata: Default::default(), name: Cow::Owned(name), - class_name, + class_name: Cow::Owned(class_name), properties, children, }) @@ -232,44 +113,7 @@ mod test { VfsSnapshot::file( r#" { - "className": "IntValue", - "properties": { - "Value": 5 - }, - "children": [ - { - "name": "The Child", - "className": "StringValue" - } - ] - } - "#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_json_model( - &InstanceContext::default(), - &vfs, - Path::new("/foo.model.json"), - "foo", - ) - .unwrap() - .unwrap(); - - insta::assert_yaml_snapshot!(instance_snapshot); - } - - #[test] - fn model_from_vfs_legacy() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo.model.json", - VfsSnapshot::file( - r#" - { + "Name": "children", "ClassName": "IntValue", "Properties": { "Value": 5 @@ -286,13 +130,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_json_model( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo.model.json"), - "foo", ) .unwrap() .unwrap(); diff --git a/src/snapshot_middleware/lua.rs b/src/snapshot_middleware/lua.rs index 98f43e40..02bbc51d 100644 --- a/src/snapshot_middleware/lua.rs +++ b/src/snapshot_middleware/lua.rs @@ -1,98 +1,56 @@ use std::{path::Path, str}; -use anyhow::Context as _; -use memofs::Vfs; -use rbx_dom_weak::{ - types::{Enum, Variant}, - ustr, HashMapExt as _, UstrMap, -}; +use anyhow::Context; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; -use super::{ - dir::{snapshot_dir_no_meta, syncback_dir_no_meta}, - meta_file::{AdjacentMetadata, DirectoryMetadata}, - PathExt as _, -}; - -#[derive(Debug)] -pub enum ScriptType { - Server, - Client, - Module, - Plugin, - LegacyServer, - LegacyClient, - RunContextServer, - RunContextClient, -} +use super::{dir::snapshot_dir, meta_file::AdjacentMetadata, util::match_trailing}; /// Core routine for turning Lua files into snapshots. pub fn snapshot_lua( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, - script_type: ScriptType, ) -> anyhow::Result> { - let run_context_enums = &rbx_reflection_database::get() - .unwrap() - .enums - .get("RunContext") - .expect("Unable to get RunContext enums!") - .items; + let file_name = path.file_name().unwrap().to_string_lossy(); - let (class_name, run_context) = match script_type { - ScriptType::Server => { - if context.emit_legacy_scripts { - ("Script", run_context_enums.get("Legacy")) - } else { - ("Script", run_context_enums.get("Server")) - } - } - ScriptType::Client => { - if context.emit_legacy_scripts { - ("LocalScript", None) - } else { - ("Script", run_context_enums.get("Client")) - } - } - ScriptType::Module => ("ModuleScript", None), - ScriptType::Plugin => ("Script", run_context_enums.get("Plugin")), - ScriptType::LegacyServer => ("Script", run_context_enums.get("Legacy")), - ScriptType::LegacyClient => ("LocalScript", None), - ScriptType::RunContextServer => ("Script", run_context_enums.get("Server")), - ScriptType::RunContextClient => ("Script", run_context_enums.get("Client")), + let (class_name, instance_name) = if let Some(name) = match_trailing(&file_name, ".server.lua") + { + ("Script", name) + } else if let Some(name) = match_trailing(&file_name, ".client.lua") { + ("LocalScript", name) + } else if let Some(name) = match_trailing(&file_name, ".lua") { + ("ModuleScript", name) + } else { + return Ok(None); }; - let contents = vfs.read_to_string_lf_normalized(path)?; - let contents_str = contents.as_str(); + let contents = vfs.read(path)?; + let contents_str = str::from_utf8(&contents) + .with_context(|| format!("File was not valid UTF-8: {}", path.display()))? + .to_owned(); - let mut properties = UstrMap::with_capacity(2); - properties.insert(ustr("Source"), contents_str.into()); - - if let Some(run_context) = run_context { - properties.insert( - ustr("RunContext"), - Enum::from_u32(run_context.to_owned()).into(), - ); - } + let meta_path = path.with_file_name(format!("{}.meta.json", instance_name)); let mut snapshot = InstanceSnapshot::new() - .name(name) + .name(instance_name) .class_name(class_name) - .properties(properties) + .properties(hashmap! { + "Source".to_owned() => contents_str.into(), + }) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf(), meta_path.clone()]) .context(context), ); - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; + metadata.apply_all(&mut snapshot)?; + } Ok(Some(snapshot)) } @@ -106,11 +64,9 @@ pub fn snapshot_lua_init( context: &InstanceContext, vfs: &Vfs, init_path: &Path, - name: &str, - script_type: ScriptType, ) -> anyhow::Result> { let folder_path = init_path.parent().unwrap(); - let dir_snapshot = snapshot_dir_no_meta(context, vfs, folder_path, name)?.unwrap(); + let dir_snapshot = snapshot_dir(context, vfs, folder_path)?.unwrap(); if dir_snapshot.class_name != "Folder" { anyhow::bail!( @@ -124,95 +80,15 @@ pub fn snapshot_lua_init( ); } - let mut init_snapshot = - snapshot_lua(context, vfs, init_path, &dir_snapshot.name, script_type)?.unwrap(); + let mut init_snapshot = snapshot_lua(context, vfs, init_path)?.unwrap(); + init_snapshot.name = dir_snapshot.name; init_snapshot.children = dir_snapshot.children; init_snapshot.metadata = dir_snapshot.metadata; - // The directory snapshot middleware includes all possible init paths - // so we don't need to add it here. - - DirectoryMetadata::read_and_apply_all(vfs, folder_path, &mut init_snapshot)?; Ok(Some(init_snapshot)) } -pub fn syncback_lua<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let contents = if let Some(Variant::String(source)) = new_inst.properties.get(&ustr("Source")) { - source.as_bytes().to_vec() - } else { - anyhow::bail!("Scripts must have a `Source` property that is a String") - }; - let mut fs_snapshot = FsSnapshot::new(); - fs_snapshot.add_file(&snapshot.path, contents); - - let meta = AdjacentMetadata::from_syncback_snapshot(snapshot, snapshot.path.clone())?; - if let Some(mut meta) = meta { - // Scripts have relatively few properties that we care about, so shifting - // is fine. - meta.properties.shift_remove(&ustr("Source")); - - if !meta.is_empty() { - let parent_location = snapshot.path.parent_err()?; - fs_snapshot.add_file( - parent_location.join(format!("{}.meta.json", new_inst.name)), - serde_json::to_vec_pretty(&meta).context("cannot serialize metadata")?, - ); - } - } - - Ok(SyncbackReturn { - fs_snapshot, - // Scripts don't have a child! - children: Vec::new(), - removed_children: Vec::new(), - }) -} - -pub fn syncback_lua_init<'sync>( - script_type: ScriptType, - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - let path = snapshot.path.join(match script_type { - ScriptType::Server => "init.server.luau", - ScriptType::Client => "init.client.luau", - ScriptType::Module => "init.luau", - ScriptType::Plugin => "init.plugin.luau", - _ => anyhow::bail!("syncback is not yet implemented for {script_type:?}"), - }); - - let contents = if let Some(Variant::String(source)) = new_inst.properties.get(&ustr("Source")) { - source.as_bytes().to_vec() - } else { - anyhow::bail!("Scripts must have a `Source` property that is a String") - }; - - let mut dir_syncback = syncback_dir_no_meta(snapshot)?; - dir_syncback.fs_snapshot.add_file(&path, contents); - - let meta = DirectoryMetadata::from_syncback_snapshot(snapshot, path.clone())?; - if let Some(mut meta) = meta { - // Scripts have relatively few properties that we care about, so shifting - // is fine. - meta.properties.shift_remove(&ustr("Source")); - - if !meta.is_empty() { - dir_syncback.fs_snapshot.add_file( - snapshot.path.join("init.meta.json"), - serde_json::to_vec_pretty(&meta) - .context("could not serialize new init.meta.json")?, - ); - } - } - - Ok(dir_syncback) -} - #[cfg(test)] mod test { use super::*; @@ -220,226 +96,83 @@ mod test { use memofs::{InMemoryFs, VfsSnapshot}; #[test] - fn class_module_from_vfs() { + fn module_from_vfs() { let mut imfs = InMemoryFs::new(); imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, - Path::new("/foo.lua"), - "foo", - ScriptType::Module, - ) - .unwrap() - .unwrap(); + let instance_snapshot = + snapshot_lua(&InstanceContext::default(), &mut vfs, Path::new("/foo.lua")) + .unwrap() + .unwrap(); - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); + insta::assert_yaml_snapshot!(instance_snapshot); } #[test] - fn runcontext_module_from_vfs() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/foo.lua"), - "foo", - ScriptType::Module, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn plugin_module_from_vfs() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/foo.plugin.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/foo.plugin.lua"), - "foo", - ScriptType::Plugin, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn class_server_from_vfs() { + fn server_from_vfs() { let mut imfs = InMemoryFs::new(); imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, + &InstanceContext::default(), + &mut vfs, Path::new("/foo.server.lua"), - "foo", - ScriptType::Server, ) .unwrap() .unwrap(); - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); + insta::assert_yaml_snapshot!(instance_snapshot); } #[test] - fn runcontext_server_from_vfs() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/foo.server.lua"), - "foo", - ScriptType::Server, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn class_client_from_vfs() { + fn client_from_vfs() { let mut imfs = InMemoryFs::new(); imfs.load_snapshot("/foo.client.lua", VfsSnapshot::file("Hello there!")) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, + &InstanceContext::default(), + &mut vfs, Path::new("/foo.client.lua"), - "foo", - ScriptType::Client, ) .unwrap() .unwrap(); - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn runcontext_client_from_vfs() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/foo.client.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/foo.client.lua"), - "foo", - ScriptType::Client, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); + insta::assert_yaml_snapshot!(instance_snapshot); } + #[ignore = "init.lua functionality has moved to the root snapshot function"] #[test] fn init_module_from_vfs() { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/root", - VfsSnapshot::dir([("init.lua", VfsSnapshot::file("Hello!"))]), + VfsSnapshot::dir(hashmap! { + "init.lua" => VfsSnapshot::file("Hello!"), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); - let instance_snapshot = snapshot_lua_init( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, - Path::new("/root/init.lua"), - "root", - ScriptType::Module, - ) - .unwrap() - .unwrap(); + let instance_snapshot = + snapshot_lua(&InstanceContext::default(), &mut vfs, Path::new("/root")) + .unwrap() + .unwrap(); - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); + insta::assert_yaml_snapshot!(instance_snapshot); } #[test] - fn init_module_from_vfs_with_meta() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/root", - VfsSnapshot::dir([ - ("init.lua", VfsSnapshot::file("Hello!")), - ( - "init.meta.json", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ), - ]), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua_init( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, - Path::new("/root/init.lua"), - "root", - ScriptType::Module, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn class_module_with_meta() { + fn module_with_meta() { let mut imfs = InMemoryFs::new(); imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!")) .unwrap(); @@ -455,59 +188,18 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, - Path::new("/foo.lua"), - "foo", - ScriptType::Module, - ) - .unwrap() - .unwrap(); + let instance_snapshot = + snapshot_lua(&InstanceContext::default(), &mut vfs, Path::new("/foo.lua")) + .unwrap() + .unwrap(); - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); + insta::assert_yaml_snapshot!(instance_snapshot); } #[test] - fn runcontext_module_with_meta() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/foo.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - imfs.load_snapshot( - "/foo.meta.json", - VfsSnapshot::file( - r#" - { - "ignoreUnknownInstances": true - } - "#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/foo.lua"), - "foo", - ScriptType::Module, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn class_script_with_meta() { + fn script_with_meta() { let mut imfs = InMemoryFs::new(); imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!")) .unwrap(); @@ -523,59 +215,21 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, + &InstanceContext::default(), + &mut vfs, Path::new("/foo.server.lua"), - "foo", - ScriptType::Server, ) .unwrap() .unwrap(); - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); + insta::assert_yaml_snapshot!(instance_snapshot); } #[test] - fn runcontext_script_with_meta() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/foo.server.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - imfs.load_snapshot( - "/foo.meta.json", - VfsSnapshot::file( - r#" - { - "ignoreUnknownInstances": true - } - "#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/foo.server.lua"), - "foo", - ScriptType::Server, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn class_script_disabled() { + fn script_disabled() { let mut imfs = InMemoryFs::new(); imfs.load_snapshot("/bar.server.lua", VfsSnapshot::file("Hello there!")) .unwrap(); @@ -593,50 +247,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(true)), - &vfs, + &InstanceContext::default(), + &mut vfs, Path::new("/bar.server.lua"), - "bar", - ScriptType::Server, - ) - .unwrap() - .unwrap(); - - insta::with_settings!({ sort_maps => true }, { - insta::assert_yaml_snapshot!(instance_snapshot); - }); - } - - #[test] - fn runcontext_script_disabled() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/bar.server.lua", VfsSnapshot::file("Hello there!")) - .unwrap(); - imfs.load_snapshot( - "/bar.meta.json", - VfsSnapshot::file( - r#" - { - "properties": { - "Disabled": true - } - } - "#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_lua( - &InstanceContext::with_emit_legacy_scripts(Some(false)), - &vfs, - Path::new("/bar.server.lua"), - "bar", - ScriptType::Server, ) .unwrap() .unwrap(); diff --git a/src/snapshot_middleware/meta_file.rs b/src/snapshot_middleware/meta_file.rs index 84ca9a80..2715dbbe 100644 --- a/src/snapshot_middleware/meta_file.rs +++ b/src/snapshot_middleware/meta_file.rs @@ -1,18 +1,9 @@ -use std::path::{Path, PathBuf}; +use std::{borrow::Cow, collections::HashMap, path::PathBuf}; use anyhow::{format_err, Context}; -use indexmap::IndexMap; -use memofs::{IoResultExt as _, Vfs}; -use rbx_dom_weak::{ - types::{Attributes, Variant}, - Ustr, -}; use serde::{Deserialize, Serialize}; -use crate::{ - json, resolution::UnresolvedValue, snapshot::InstanceSnapshot, syncback::SyncbackSnapshot, - RojoRef, -}; +use crate::{resolution::UnresolvedValue, snapshot::InstanceSnapshot}; /// Represents metadata in a sibling file with the same basename. /// @@ -21,59 +12,19 @@ use crate::{ #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct AdjacentMetadata { - #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] - schema: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub id: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub ignore_unknown_instances: Option, - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub properties: IndexMap, - - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub attributes: IndexMap, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub properties: HashMap, #[serde(skip)] pub path: PathBuf, } impl AdjacentMetadata { - /// Attempts to read a meta file for the provided path and name, and if - /// one exists applies it. - /// - /// Also inserts the potential metadata paths into the snapshot's relevant - /// paths for convenience purposes. - pub fn read_and_apply_all( - vfs: &Vfs, - path: &Path, - name: &str, - snapshot: &mut InstanceSnapshot, - ) -> anyhow::Result<()> { - let meta_path_json = path.with_file_name(format!("{name}.meta.json")); - let meta_path_jsonc = path.with_file_name(format!("{name}.meta.jsonc")); - - if let Some(meta_contents) = vfs.read(&meta_path_json).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?; - metadata.apply_all(snapshot)?; - } - - if let Some(meta_contents) = vfs.read(&meta_path_jsonc).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?; - metadata.apply_all(snapshot)?; - } - - // Rather than pushing these in the snapshot middleware, we can just do it here. - snapshot.metadata.relevant_paths.push(meta_path_json); - snapshot.metadata.relevant_paths.push(meta_path_jsonc); - - Ok(()) - } - - fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { - let mut meta: Self = json::from_slice_with_context(slice, || { + pub fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { + let mut meta: Self = serde_json::from_slice(slice).with_context(|| { format!( "File contained malformed .meta.json data: {}", path.display() @@ -84,80 +35,6 @@ impl AdjacentMetadata { Ok(meta) } - /// Constructs an `AdjacentMetadata` from the provided snapshot, assuming it - /// will be at the provided path. - pub fn from_syncback_snapshot( - snapshot: &SyncbackSnapshot, - path: PathBuf, - ) -> anyhow::Result> { - let mut properties = IndexMap::new(); - let mut attributes = IndexMap::new(); - // TODO make this more granular. - // I am breaking the cycle of bad TODOs. This is in reference to the fact - // that right now, this will just not write any metadata at all for - // project nodes, which is not always desirable. We should try to be - // smarter about it. - if let Some(old_inst) = snapshot.old_inst() { - if let Some(source) = &old_inst.metadata().instigating_source { - let source = source.path(); - if source != path { - log::debug!( - "Instigating source for Instance is mismatched so its metadata is being skipped.\nPath: {}", - path.display() - ); - return Ok(None); - } - } - } - - let ignore_unknown_instances = snapshot - .old_inst() - .map(|inst| inst.metadata().ignore_unknown_instances) - .unwrap_or_default(); - - let schema = snapshot - .old_inst() - .and_then(|inst| inst.metadata().schema.clone()); - - let class = &snapshot.new_inst().class; - for (name, value) in snapshot.get_path_filtered_properties(snapshot.new).unwrap() { - match value { - Variant::Attributes(attrs) => { - for (attr_name, attr_value) in attrs.iter() { - // We (probably) don't want to preserve internal - // attributes, only user defined ones. - if attr_name.starts_with("RBX") { - continue; - } - attributes.insert( - attr_name.clone(), - UnresolvedValue::from_variant_unambiguous(attr_value.clone()), - ); - } - } - _ => { - properties.insert( - name, - UnresolvedValue::from_variant(value.clone(), class, &name), - ); - } - } - } - - Ok(Some(Self { - ignore_unknown_instances: if ignore_unknown_instances { - Some(true) - } else { - None - }, - properties, - attributes, - path, - id: None, - schema, - })) - } - pub fn apply_ignore_unknown_instances(&mut self, snapshot: &mut InstanceSnapshot) { if let Some(ignore) = self.ignore_unknown_instances.take() { snapshot.metadata.ignore_unknown_instances = ignore; @@ -167,10 +44,7 @@ impl AdjacentMetadata { pub fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { let path = &self.path; - // BTreeMaps don't have an equivalent to HashMap::drain, so the next - // best option is to take ownership of the entire map. Not free, but - // very cheap. - for (key, unresolved) in std::mem::take(&mut self.properties) { + for (key, unresolved) in self.properties.drain() { let value = unresolved .resolve(&snapshot.class_name, &key) .with_context(|| format!("error applying meta file {}", path.display()))?; @@ -178,61 +52,15 @@ impl AdjacentMetadata { snapshot.properties.insert(key, value); } - if !self.attributes.is_empty() { - let mut attributes = Attributes::new(); - - for (key, unresolved) in std::mem::take(&mut self.attributes) { - let value = unresolved.resolve_unambiguous()?; - attributes.insert(key, value); - } - - snapshot - .properties - .insert("Attributes".into(), attributes.into()); - } - - Ok(()) - } - - fn apply_id(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.id.is_some() && snapshot.metadata.specified_id.is_some() { - anyhow::bail!( - "cannot specify an ID using {} (instance has an ID from somewhere else)", - self.path.display() - ); - } - snapshot.metadata.specified_id = self.id.take().map(RojoRef::new); - Ok(()) - } - - fn apply_schema(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.schema.is_some() && snapshot.metadata.schema.is_some() { - anyhow::bail!("cannot specify a schema using {} (instance has a schema from somewhere else. how did we get here?)", self.path.display()); - } - snapshot.metadata.schema = self.schema.take(); Ok(()) } pub fn apply_all(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { self.apply_ignore_unknown_instances(snapshot); self.apply_properties(snapshot)?; - self.apply_id(snapshot)?; - self.apply_schema(snapshot)?; Ok(()) } - /// Returns whether the metadata is 'empty', meaning it doesn't have anything - /// worth persisting in it. Specifically: - /// - /// - The number of properties and attributes is 0 - /// - `ignore_unknown_instances` is None - #[inline] - pub fn is_empty(&self) -> bool { - self.attributes.is_empty() - && self.properties.is_empty() - && self.ignore_unknown_instances.is_none() - } - // TODO: Add method to allow selectively applying parts of metadata and // throwing errors if invalid parts are specified. } @@ -244,61 +72,22 @@ impl AdjacentMetadata { #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct DirectoryMetadata { - #[serde(rename = "$schema", skip_serializing_if = "Option::is_none")] - schema: Option, - - #[serde(skip_serializing_if = "Option::is_none")] - pub id: Option, - #[serde(skip_serializing_if = "Option::is_none")] pub ignore_unknown_instances: Option, - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub properties: IndexMap, - - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - pub attributes: IndexMap, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub properties: HashMap, #[serde(skip_serializing_if = "Option::is_none")] - pub class_name: Option, + pub class_name: Option, #[serde(skip)] pub path: PathBuf, } impl DirectoryMetadata { - /// Attempts to read an `init.meta`` file for the provided path, and if - /// one exists applies it. - /// - /// Also inserts the potential metadata paths into the snapshot's relevant - /// paths for convenience purposes. - pub fn read_and_apply_all( - vfs: &Vfs, - path: &Path, - snapshot: &mut InstanceSnapshot, - ) -> anyhow::Result<()> { - let meta_path_json = path.join("init.meta.json"); - let meta_path_jsonc = path.join("init.meta.jsonc"); - - if let Some(meta_contents) = vfs.read(&meta_path_json).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_json.clone())?; - metadata.apply_all(snapshot)?; - } - - if let Some(meta_contents) = vfs.read(&meta_path_jsonc).with_not_found()? { - let mut metadata = Self::from_slice(&meta_contents, meta_path_jsonc.clone())?; - metadata.apply_all(snapshot)?; - } - - // Rather than pushing these in the snapshot middleware, we can just do it here. - snapshot.metadata.relevant_paths.push(meta_path_json); - snapshot.metadata.relevant_paths.push(meta_path_jsonc); - - Ok(()) - } - - fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { - let mut meta: Self = json::from_slice_with_context(slice, || { + pub fn from_slice(slice: &[u8], path: PathBuf) -> anyhow::Result { + let mut meta: Self = serde_json::from_slice(slice).with_context(|| { format!( "File contained malformed init.meta.json data: {}", path.display() @@ -309,90 +98,10 @@ impl DirectoryMetadata { Ok(meta) } - /// Constructs a `DirectoryMetadata` from the provided snapshot, assuming it - /// will be at the provided path. - /// - /// This function does not set `ClassName` manually as most uses won't - /// want it set. - pub fn from_syncback_snapshot( - snapshot: &SyncbackSnapshot, - path: PathBuf, - ) -> anyhow::Result> { - let mut properties = IndexMap::new(); - let mut attributes = IndexMap::new(); - // TODO make this more granular. - // I am breaking the cycle of bad TODOs. This is in reference to the fact - // that right now, this will just not write any metadata at all for - // project nodes, which is not always desirable. We should try to be - // smarter about it. - if let Some(old_inst) = snapshot.old_inst() { - if let Some(source) = &old_inst.metadata().instigating_source { - let source = source.path(); - if source != path { - log::debug!( - "Instigating source for Instance is mismatched so its metadata is being skipped.\nPath: {}", - path.display() - ); - return Ok(None); - } - } - } - - let ignore_unknown_instances = snapshot - .old_inst() - .map(|inst| inst.metadata().ignore_unknown_instances) - .unwrap_or_default(); - - let schema = snapshot - .old_inst() - .and_then(|inst| inst.metadata().schema.clone()); - - let class = &snapshot.new_inst().class; - for (name, value) in snapshot.get_path_filtered_properties(snapshot.new).unwrap() { - match value { - Variant::Attributes(attrs) => { - for (name, value) in attrs.iter() { - // We (probably) don't want to preserve internal - // attributes, only user defined ones. - if name.starts_with("RBX") { - continue; - } - attributes.insert( - name.to_owned(), - UnresolvedValue::from_variant_unambiguous(value.clone()), - ); - } - } - _ => { - properties.insert( - name, - UnresolvedValue::from_variant(value.clone(), class, &name), - ); - } - } - } - - Ok(Some(Self { - ignore_unknown_instances: if ignore_unknown_instances { - Some(true) - } else { - None - }, - properties, - attributes, - class_name: None, - path, - id: None, - schema, - })) - } - pub fn apply_all(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { self.apply_ignore_unknown_instances(snapshot); self.apply_class_name(snapshot)?; self.apply_properties(snapshot)?; - self.apply_id(snapshot)?; - self.apply_schema(snapshot)?; Ok(()) } @@ -407,7 +116,7 @@ impl DirectoryMetadata { )); } - snapshot.class_name = class_name; + snapshot.class_name = Cow::Owned(class_name); } Ok(()) @@ -422,7 +131,7 @@ impl DirectoryMetadata { fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { let path = &self.path; - for (key, unresolved) in std::mem::take(&mut self.properties) { + for (key, unresolved) in self.properties.drain() { let value = unresolved .resolve(&snapshot.class_name, &key) .with_context(|| format!("error applying meta file {}", path.display()))?; @@ -430,163 +139,6 @@ impl DirectoryMetadata { snapshot.properties.insert(key, value); } - if !self.attributes.is_empty() { - let mut attributes = Attributes::new(); - - for (key, unresolved) in std::mem::take(&mut self.attributes) { - let value = unresolved.resolve_unambiguous()?; - attributes.insert(key, value); - } - - snapshot - .properties - .insert("Attributes".into(), attributes.into()); - } - Ok(()) } - - fn apply_id(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.id.is_some() && snapshot.metadata.specified_id.is_some() { - anyhow::bail!( - "cannot specify an ID using {} (instance has an ID from somewhere else)", - self.path.display() - ); - } - snapshot.metadata.specified_id = self.id.take().map(RojoRef::new); - Ok(()) - } - - fn apply_schema(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - if self.schema.is_some() && snapshot.metadata.schema.is_some() { - anyhow::bail!("cannot specify a schema using {} (instance has a schema from somewhere else. how did we get here?)", self.path.display()); - } - snapshot.metadata.schema = self.schema.take(); - Ok(()) - } - /// Returns whether the metadata is 'empty', meaning it doesn't have anything - /// worth persisting in it. Specifically: - /// - /// - The number of properties and attributes is 0 - /// - `ignore_unknown_instances` is None - /// - `class_name` is either None or not Some("Folder") - #[inline] - pub fn is_empty(&self) -> bool { - self.attributes.is_empty() - && self.properties.is_empty() - && self.ignore_unknown_instances.is_none() - && if let Some(class) = &self.class_name { - class == "Folder" - } else { - true - } - } -} - -/// Retrieves the meta file that should be applied for the provided directory, -/// if it exists. -pub fn dir_meta(vfs: &Vfs, path: &Path) -> anyhow::Result> { - let meta_path = path.join("init.meta.json"); - - if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { - let metadata = DirectoryMetadata::from_slice(&meta_contents, meta_path)?; - Ok(Some(metadata)) - } else { - Ok(None) - } -} - -/// Retrieves the meta file that should be applied for the provided file, -/// if it exists. -/// -/// The `name` field should be the name the metadata should have. -pub fn file_meta(vfs: &Vfs, path: &Path, name: &str) -> anyhow::Result> { - let mut meta_path = path.with_file_name(name); - meta_path.set_extension("meta.json"); - - if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { - let metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; - Ok(Some(metadata)) - } else { - Ok(None) - } -} - -#[cfg(test)] -mod test { - use memofs::{InMemoryFs, VfsSnapshot}; - - use super::*; - - #[test] - fn adjacent_read_json() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/bar.meta.json", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/bar.rojo"); - let mut snapshot = InstanceSnapshot::new(); - - AdjacentMetadata::read_and_apply_all(&vfs, path, "bar", &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } - - #[test] - fn adjacent_read_jsonc() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/bar.meta.jsonc", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/bar.rojo"); - let mut snapshot = InstanceSnapshot::new(); - - AdjacentMetadata::read_and_apply_all(&vfs, path, "bar", &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } - - #[test] - fn directory_read_json() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/init.meta.json", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/"); - let mut snapshot = InstanceSnapshot::new(); - - DirectoryMetadata::read_and_apply_all(&vfs, path, &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } - - #[test] - fn directory_read_jsonc() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo/init.meta.jsonc", - VfsSnapshot::file(r#"{"id": "manually specified"}"#), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - let path = Path::new("/foo/"); - let mut snapshot = InstanceSnapshot::new(); - - DirectoryMetadata::read_and_apply_all(&vfs, path, &mut snapshot).unwrap(); - - insta::assert_yaml_snapshot!(snapshot); - } } diff --git a/src/snapshot_middleware/mod.rs b/src/snapshot_middleware/mod.rs index fadce5f6..36729f8f 100644 --- a/src/snapshot_middleware/mod.rs +++ b/src/snapshot_middleware/mod.rs @@ -14,54 +14,32 @@ mod meta_file; mod project; mod rbxm; mod rbxmx; -mod toml; mod txt; mod util; -mod yaml; -use std::{ - path::{Path, PathBuf}, - sync::OnceLock, -}; +use std::path::Path; -use anyhow::Context; use memofs::{IoResultExt, Vfs}; -use serde::{Deserialize, Serialize}; -use crate::{ - glob::Glob, - project::DEFAULT_PROJECT_NAMES, - syncback::{SyncbackReturn, SyncbackSnapshot}, -}; -use crate::{ - snapshot::{InstanceContext, InstanceSnapshot, SyncRule}, - syncback::validate_file_name, -}; +use crate::snapshot::{InstanceContext, InstanceSnapshot}; use self::{ - csv::{snapshot_csv, snapshot_csv_init, syncback_csv, syncback_csv_init}, - dir::{snapshot_dir, syncback_dir}, + csv::snapshot_csv, + dir::snapshot_dir, json::snapshot_json, - json_model::{snapshot_json_model, syncback_json_model}, - lua::{snapshot_lua, snapshot_lua_init, syncback_lua, syncback_lua_init}, - project::{snapshot_project, syncback_project}, - rbxm::{snapshot_rbxm, syncback_rbxm}, - rbxmx::{snapshot_rbxmx, syncback_rbxmx}, - toml::snapshot_toml, - txt::{snapshot_txt, syncback_txt}, - yaml::snapshot_yaml, -}; - -pub use self::{ - lua::ScriptType, project::snapshot_project_node, util::emit_legacy_scripts_default, + json_model::snapshot_json_model, + lua::{snapshot_lua, snapshot_lua_init}, + project::snapshot_project, + rbxm::snapshot_rbxm, + rbxmx::snapshot_rbxmx, + txt::snapshot_txt, util::PathExt, }; -/// Returns an `InstanceSnapshot` for the provided path. -/// This will inspect the path and find the appropriate middleware for it, -/// taking user-written rules into account. Then, it will attempt to convert -/// the path into an InstanceSnapshot using that middleware. -#[profiling::function] +pub use self::project::snapshot_project_node; + +/// The main entrypoint to the snapshot function. This function can be pointed +/// at any path and will return something if Rojo knows how to deal with it. pub fn snapshot_from_vfs( context: &InstanceContext, vfs: &Vfs, @@ -73,373 +51,55 @@ pub fn snapshot_from_vfs( }; if meta.is_dir() { - let (middleware, dir_name, init_path) = get_dir_middleware(vfs, path)?; - // TODO: Support user defined init paths - // If and when we do, make sure to go support it in - // `Project::set_file_name`, as right now it special-cases - // `default.project.json` as an `init` path. - match middleware { - Middleware::Dir => middleware.snapshot(context, vfs, path, dir_name), - _ => middleware.snapshot(context, vfs, &init_path, dir_name), - } - } else { - let file_name = path - .file_name() - .and_then(|n| n.to_str()) - .with_context(|| format!("file name of {} is invalid", path.display()))?; - - // TODO: Is this even necessary anymore? - match file_name { - "init.server.luau" | "init.server.lua" | "init.client.luau" | "init.client.lua" - | "init.plugin.luau" | "init.plugin.lua" | "init.luau" | "init.lua" | "init.csv" => { - return Ok(None) - } - _ => {} - } - - snapshot_from_path(context, vfs, path) - } -} - -/// Gets the appropriate middleware for a directory by checking for `init` -/// files. This uses an intrinsic priority list and for compatibility, -/// that order should be left unchanged. -/// -/// Returns the middleware, the name of the directory, and the path to -/// the init location. -fn get_dir_middleware<'path>( - vfs: &Vfs, - dir_path: &'path Path, -) -> anyhow::Result<(Middleware, &'path str, PathBuf)> { - let dir_name = dir_path - .file_name() - .expect("Could not extract directory name") - .to_str() - .ok_or_else(|| anyhow::anyhow!("File name was not valid UTF-8: {}", dir_path.display()))?; - - static INIT_PATHS: OnceLock> = OnceLock::new(); - let order = INIT_PATHS.get_or_init(|| { - vec![ - (Middleware::ModuleScriptDir, "init.luau"), - (Middleware::ModuleScriptDir, "init.lua"), - (Middleware::ServerScriptDir, "init.server.luau"), - (Middleware::ServerScriptDir, "init.server.lua"), - (Middleware::ClientScriptDir, "init.client.luau"), - (Middleware::ClientScriptDir, "init.client.lua"), - (Middleware::PluginScriptDir, "init.plugin.lua"), - (Middleware::PluginScriptDir, "init.plugin.luau"), - (Middleware::CsvDir, "init.csv"), - ] - }); - - for default_project_name in DEFAULT_PROJECT_NAMES { - let project_path = dir_path.join(default_project_name); + let project_path = path.join("default.project.json"); if vfs.metadata(&project_path).with_not_found()?.is_some() { - return Ok((Middleware::Project, dir_name, project_path)); + return snapshot_project(context, vfs, &project_path); } - } - for (middleware, name) in order { - let test_path = dir_path.join(name); - if vfs.metadata(&test_path).with_not_found()?.is_some() { - return Ok((*middleware, dir_name, test_path)); + let init_path = path.join("init.lua"); + if vfs.metadata(&init_path).with_not_found()?.is_some() { + return snapshot_lua_init(context, vfs, &init_path); } - } - Ok((Middleware::Dir, dir_name, dir_path.to_path_buf())) -} + let init_path = path.join("init.server.lua"); + if vfs.metadata(&init_path).with_not_found()?.is_some() { + return snapshot_lua_init(context, vfs, &init_path); + } -/// Gets a snapshot for a path given an InstanceContext and Vfs, taking -/// user specified sync rules into account. -fn snapshot_from_path( - context: &InstanceContext, - vfs: &Vfs, - path: &Path, -) -> anyhow::Result> { - if let Some(rule) = context.get_user_sync_rule(path) { - return rule - .middleware - .snapshot(context, vfs, path, rule.file_name_for_path(path)?); + let init_path = path.join("init.client.lua"); + if vfs.metadata(&init_path).with_not_found()?.is_some() { + return snapshot_lua_init(context, vfs, &init_path); + } + + snapshot_dir(context, vfs, path) } else { - for rule in default_sync_rules() { - if rule.matches(path) { - return rule.middleware.snapshot( - context, - vfs, - path, - rule.file_name_for_path(path)?, - ); + if let Ok(name) = path.file_name_trim_end(".lua") { + match name { + // init scripts are handled elsewhere and should not turn into + // their own children. + "init" | "init.client" | "init.server" => return Ok(None), + + _ => return snapshot_lua(context, vfs, path), } + } else if path.file_name_ends_with(".project.json") { + return snapshot_project(context, vfs, path); + } else if path.file_name_ends_with(".model.json") { + return snapshot_json_model(context, vfs, path); + } else if path.file_name_ends_with(".meta.json") { + // .meta.json files do not turn into their own instances. + return Ok(None); + } else if path.file_name_ends_with(".json") { + return snapshot_json(context, vfs, path); + } else if path.file_name_ends_with(".csv") { + return snapshot_csv(context, vfs, path); + } else if path.file_name_ends_with(".txt") { + return snapshot_txt(context, vfs, path); + } else if path.file_name_ends_with(".rbxmx") { + return snapshot_rbxmx(context, vfs, path); + } else if path.file_name_ends_with(".rbxm") { + return snapshot_rbxm(context, vfs, path); } - } - Ok(None) -} -/// Represents a possible 'transformer' used by Rojo to turn a file system -/// item into a Roblox Instance. Missing from this list is metadata. -/// This is deliberate, as metadata is not a snapshot middleware. -/// -/// Directories cannot be used for sync rules so they're ignored by Serde. -#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub enum Middleware { - Csv, - JsonModel, - Json, - ServerScript, - ClientScript, - ModuleScript, - PluginScript, - LegacyClientScript, - LegacyServerScript, - RunContextServerScript, - RunContextClientScript, - Project, - Rbxm, - Rbxmx, - Toml, - Text, - Yaml, - Ignore, - - #[serde(skip_deserializing)] - Dir, - #[serde(skip_deserializing)] - ServerScriptDir, - #[serde(skip_deserializing)] - ClientScriptDir, - #[serde(skip_deserializing)] - PluginScriptDir, - #[serde(skip_deserializing)] - ModuleScriptDir, - #[serde(skip_deserializing)] - CsvDir, -} - -impl Middleware { - /// Creates a snapshot for the given path from the Middleware with - /// the provided name. - fn snapshot( - &self, - context: &InstanceContext, - vfs: &Vfs, - path: &Path, - name: &str, - ) -> anyhow::Result> { - let mut output = match self { - Self::Csv => snapshot_csv(context, vfs, path, name), - Self::JsonModel => snapshot_json_model(context, vfs, path, name), - Self::Json => snapshot_json(context, vfs, path, name), - Self::ServerScript => snapshot_lua(context, vfs, path, name, ScriptType::Server), - Self::ClientScript => snapshot_lua(context, vfs, path, name, ScriptType::Client), - Self::ModuleScript => snapshot_lua(context, vfs, path, name, ScriptType::Module), - Self::PluginScript => snapshot_lua(context, vfs, path, name, ScriptType::Plugin), - Self::LegacyClientScript => { - snapshot_lua(context, vfs, path, name, ScriptType::LegacyClient) - } - Self::LegacyServerScript => { - snapshot_lua(context, vfs, path, name, ScriptType::LegacyServer) - } - Self::RunContextClientScript => { - snapshot_lua(context, vfs, path, name, ScriptType::RunContextClient) - } - Self::RunContextServerScript => { - snapshot_lua(context, vfs, path, name, ScriptType::RunContextServer) - } - Self::Project => snapshot_project(context, vfs, path, name), - Self::Rbxm => snapshot_rbxm(context, vfs, path, name), - Self::Rbxmx => snapshot_rbxmx(context, vfs, path, name), - Self::Toml => snapshot_toml(context, vfs, path, name), - Self::Text => snapshot_txt(context, vfs, path, name), - Self::Yaml => snapshot_yaml(context, vfs, path, name), - Self::Ignore => Ok(None), - - Self::Dir => snapshot_dir(context, vfs, path, name), - Self::ServerScriptDir => { - snapshot_lua_init(context, vfs, path, name, ScriptType::Server) - } - Self::ClientScriptDir => { - snapshot_lua_init(context, vfs, path, name, ScriptType::Client) - } - Self::PluginScriptDir => { - snapshot_lua_init(context, vfs, path, name, ScriptType::Plugin) - } - Self::ModuleScriptDir => { - snapshot_lua_init(context, vfs, path, name, ScriptType::Module) - } - Self::CsvDir => snapshot_csv_init(context, vfs, path, name), - }; - if let Ok(Some(ref mut snapshot)) = output { - snapshot.metadata.middleware = Some(*self); - } - output - } - - /// Runs the syncback mechanism for the provided middleware given a - /// SyncbackSnapshot. - pub fn syncback<'sync>( - &self, - snapshot: &SyncbackSnapshot<'sync>, - ) -> anyhow::Result> { - let file_name = snapshot.path.file_name().and_then(|s| s.to_str()); - if let Some(file_name) = file_name { - validate_file_name(file_name).with_context(|| { - format!("cannot create a file or directory with name {file_name}") - })?; - } - match self { - Middleware::Csv => syncback_csv(snapshot), - Middleware::JsonModel => syncback_json_model(snapshot), - Middleware::Json => anyhow::bail!("cannot syncback Json middleware"), - // Projects are only generated from files that already exist on the - // file system, so we don't need to pass a file name. - Middleware::Project => syncback_project(snapshot), - Middleware::ServerScript => syncback_lua(snapshot), - Middleware::ClientScript => syncback_lua(snapshot), - Middleware::ModuleScript => syncback_lua(snapshot), - Middleware::Rbxm => syncback_rbxm(snapshot), - Middleware::Rbxmx => syncback_rbxmx(snapshot), - Middleware::Toml => anyhow::bail!("cannot syncback Toml middleware"), - Middleware::Text => syncback_txt(snapshot), - Middleware::Yaml => anyhow::bail!("cannot syncback Yaml middleware"), - Middleware::Ignore => anyhow::bail!("cannot syncback Ignore middleware"), - Middleware::Dir => syncback_dir(snapshot), - Middleware::ServerScriptDir => syncback_lua_init(ScriptType::Server, snapshot), - Middleware::ClientScriptDir => syncback_lua_init(ScriptType::Client, snapshot), - Middleware::PluginScriptDir => syncback_lua_init(ScriptType::Plugin, snapshot), - Middleware::ModuleScriptDir => syncback_lua_init(ScriptType::Module, snapshot), - Middleware::CsvDir => syncback_csv_init(snapshot), - - Middleware::PluginScript - | Middleware::LegacyServerScript - | Middleware::LegacyClientScript - | Middleware::RunContextServerScript - | Middleware::RunContextClientScript => { - anyhow::bail!("syncback is not implemented for {self:?} yet") - } - } - } - - /// Returns whether this particular middleware would become a directory. - #[inline] - pub fn is_dir(&self) -> bool { - matches!( - self, - Middleware::Dir - | Middleware::ServerScriptDir - | Middleware::ClientScriptDir - | Middleware::PluginScriptDir - | Middleware::ModuleScriptDir - | Middleware::CsvDir - ) - } - - /// Returns whether this particular middleware sets its own properties. - /// This applies to things like `JsonModel` and `Project`, since they - /// set properties without needing a meta.json file. - /// - /// It does not cover middleware like `ServerScript` or `Csv` because they - /// need a meta.json file to set properties that aren't their designated - /// 'special' properties. - #[inline] - pub fn handles_own_properties(&self) -> bool { - matches!( - self, - Middleware::JsonModel | Middleware::Project | Middleware::Rbxm | Middleware::Rbxmx - ) - } - - /// Attempts to return a middleware that should be used for the given path. - /// - /// Returns `Err` only if the Vfs cannot read information about the path. - pub fn middleware_for_path( - vfs: &Vfs, - sync_rules: &[SyncRule], - path: &Path, - ) -> anyhow::Result> { - let meta = match vfs.metadata(path).with_not_found()? { - Some(meta) => meta, - None => return Ok(None), - }; - - if meta.is_dir() { - let (middleware, _, _) = get_dir_middleware(vfs, path)?; - Ok(Some(middleware)) - } else { - for rule in sync_rules.iter().chain(default_sync_rules()) { - if rule.matches(path) { - return Ok(Some(rule.middleware)); - } - } - Ok(None) - } + Ok(None) } } - -/// A helper for easily defining a SyncRule. Arguments are passed literally -/// to this macro in the order `include`, `middleware`, `suffix`, -/// and `exclude`. Both `suffix` and `exclude` are optional. -/// -/// All arguments except `middleware` are expected to be strings. -/// The `middleware` parameter is expected to be a variant of `Middleware`, -/// not including the enum name itself. -macro_rules! sync_rule { - ($pattern:expr, $middleware:ident) => { - SyncRule { - middleware: Middleware::$middleware, - include: Glob::new($pattern).unwrap(), - exclude: None, - suffix: None, - base_path: PathBuf::new(), - } - }; - ($pattern:expr, $middleware:ident, $suffix:expr) => { - SyncRule { - middleware: Middleware::$middleware, - include: Glob::new($pattern).unwrap(), - exclude: None, - suffix: Some($suffix.into()), - base_path: PathBuf::new(), - } - }; - ($pattern:expr, $middleware:ident, $suffix:expr, $exclude:expr) => { - SyncRule { - middleware: Middleware::$middleware, - include: Glob::new($pattern).unwrap(), - exclude: Some(Glob::new($exclude).unwrap()), - suffix: Some($suffix.into()), - base_path: PathBuf::new(), - } - }; -} - -/// Defines the 'default' syncing rules that Rojo uses. -/// These do not broadly overlap, but the order matters for some in the case of -/// e.g. JSON models. -pub fn default_sync_rules() -> &'static [SyncRule] { - static DEFAULT_SYNC_RULES: OnceLock> = OnceLock::new(); - - DEFAULT_SYNC_RULES.get_or_init(|| { - vec![ - sync_rule!("*.server.lua", ServerScript, ".server.lua"), - sync_rule!("*.server.luau", ServerScript, ".server.luau"), - sync_rule!("*.client.lua", ClientScript, ".client.lua"), - sync_rule!("*.client.luau", ClientScript, ".client.luau"), - sync_rule!("*.plugin.lua", PluginScript, ".plugin.lua"), - sync_rule!("*.plugin.luau", PluginScript, ".plugin.luau"), - sync_rule!("*.{lua,luau}", ModuleScript), - sync_rule!("*.project.json", Project, ".project.json"), - sync_rule!("*.project.jsonc", Project, ".project.jsonc"), - sync_rule!("*.model.json", JsonModel, ".model.json"), - sync_rule!("*.model.jsonc", JsonModel, ".model.jsonc"), - sync_rule!("*.json", Json, ".json", "*.meta.json"), - sync_rule!("*.jsonc", Json, ".jsonc", "*.meta.jsonc"), - sync_rule!("*.toml", Toml), - sync_rule!("*.csv", Csv), - sync_rule!("*.txt", Text), - sync_rule!("*.rbxmx", Rbxmx), - sync_rule!("*.rbxm", Rbxm), - sync_rule!("*.{yml,yaml}", Yaml), - ] - }) -} diff --git a/src/snapshot_middleware/project.rs b/src/snapshot_middleware/project.rs index 09d286de..5650c99a 100644 --- a/src/snapshot_middleware/project.rs +++ b/src/snapshot_middleware/project.rs @@ -1,68 +1,36 @@ -use std::{ - borrow::Cow, - collections::{BTreeMap, HashMap, VecDeque}, - path::Path, -}; +use std::{borrow::Cow, collections::HashMap, path::Path}; use anyhow::{bail, Context}; use memofs::Vfs; -use rbx_dom_weak::{ - types::{Attributes, Ref, Variant}, - ustr, HashMapExt as _, Instance, Ustr, UstrMap, -}; use rbx_reflection::ClassTag; use crate::{ project::{PathNode, Project, ProjectNode}, - resolution::UnresolvedValue, snapshot::{ - InstanceContext, InstanceMetadata, InstanceSnapshot, InstanceWithMeta, InstigatingSource, - PathIgnoreRule, SyncRule, + InstanceContext, InstanceMetadata, InstanceSnapshot, InstigatingSource, PathIgnoreRule, }, - snapshot_middleware::Middleware, - syncback::{filter_properties, FsSnapshot, SyncbackReturn, SyncbackSnapshot}, - variant_eq::variant_eq, - RojoRef, }; -use super::{emit_legacy_scripts_default, snapshot_from_vfs}; +use super::snapshot_from_vfs; pub fn snapshot_project( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { - let project = Project::load_exact(vfs, path, Some(name)) + let project = Project::load_from_slice(&vfs.read(path)?, path) .with_context(|| format!("File was not a valid Rojo project: {}", path.display()))?; - let project_name = match project.name.as_deref() { - Some(name) => name, - None => panic!("Project is missing a name"), - }; let mut context = context.clone(); - context.clear_sync_rules(); let rules = project.glob_ignore_paths.iter().map(|glob| PathIgnoreRule { glob: glob.clone(), base_path: project.folder_location().to_path_buf(), }); - let sync_rules = project.sync_rules.iter().map(|rule| SyncRule { - base_path: project.folder_location().to_path_buf(), - ..rule.clone() - }); - - context.add_sync_rules(sync_rules); context.add_path_ignore_rules(rules); - context.set_emit_legacy_scripts( - project - .emit_legacy_scripts - .or_else(emit_legacy_scripts_default) - .unwrap(), - ); - match snapshot_project_node(&context, path, project_name, &project.tree, vfs, None)? { + match snapshot_project_node(&context, path, &project.name, &project.tree, vfs, None)? { Some(found_snapshot) => { let mut snapshot = found_snapshot; // Setting the instigating source to the project file path is a little @@ -99,12 +67,16 @@ pub fn snapshot_project_node( ) -> anyhow::Result> { let project_folder = project_path.parent().unwrap(); + let class_name_from_project = node + .class_name + .as_ref() + .map(|name| Cow::Owned(name.clone())); let mut class_name_from_path = None; let name = Cow::Owned(instance_name.to_owned()); - let mut properties = UstrMap::new(); + let mut properties = HashMap::new(); let mut children = Vec::new(); - let mut metadata = InstanceMetadata::new().context(context); + let mut metadata = InstanceMetadata::default(); if let Some(path_node) = &node.path { let path = path_node.path(); @@ -143,7 +115,7 @@ pub fn snapshot_project_node( let class_name_from_inference = infer_class_name(&name, parent_class); let class_name = match ( - node.class_name, + class_name_from_project, class_name_from_path, class_name_from_inference, &node.path, @@ -256,24 +228,7 @@ pub fn snapshot_project_node( _ => {} } - properties.insert(*key, value); - } - - if !node.attributes.is_empty() { - let mut attributes = Attributes::new(); - - for (key, unresolved) in &node.attributes { - let value = unresolved.clone().resolve_unambiguous().with_context(|| { - format!( - "Unresolvable attribute in project at path {}", - project_path.display() - ) - })?; - - attributes.insert(key.clone(), value); - } - - properties.insert("Attributes".into(), attributes.into()); + properties.insert(key.clone(), value); } // If the user specified $ignoreUnknownInstances, overwrite the existing @@ -290,19 +245,15 @@ pub fn snapshot_project_node( metadata.ignore_unknown_instances = true; } - if let Some(id) = &node.id { - metadata.specified_id = Some(RojoRef::new(id.clone())) - } - - metadata.instigating_source = Some(InstigatingSource::ProjectNode { - path: project_path.to_path_buf(), - name: instance_name.to_string(), - node: node.clone(), - parent_class: parent_class.map(|name| name.to_owned()), - }); + metadata.instigating_source = Some(InstigatingSource::ProjectNode( + project_path.to_path_buf(), + instance_name.to_string(), + node.clone(), + parent_class.map(|name| name.to_owned()), + )); Ok(Some(InstanceSnapshot { - snapshot_id: Ref::none(), + snapshot_id: None, name, class_name, properties, @@ -311,369 +262,7 @@ pub fn snapshot_project_node( })) } -pub fn syncback_project<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let old_inst = snapshot - .old_inst() - .expect("projects should always exist in both trees"); - // Generally, the path of a project is the first thing added to the relevant - // paths. So, we take the last one. - let project_path = old_inst - .metadata() - .relevant_paths - .last() - .expect("all projects should have a relevant path"); - let vfs = snapshot.vfs(); - - log::debug!("Reloading project {} from vfs", project_path.display(),); - let mut project = Project::load_exact(vfs, project_path, None)?; - let base_path = project.folder_location().to_path_buf(); - - // Sync rules for this project do not have their base rule set but it is - // important when performing syncback on other projects. - for rule in &mut project.sync_rules { - rule.base_path.clone_from(&base_path) - } - - let mut descendant_snapshots = Vec::new(); - let mut removed_descendants = Vec::new(); - - let mut ref_to_path_map = HashMap::new(); - let mut old_child_map = HashMap::new(); - let mut new_child_map = HashMap::new(); - - let mut node_changed_map = Vec::new(); - // Tracks whether any stale default-valued properties were removed from - // project nodes. If so, we must reserialize even if - // project_node_should_reserialize wouldn't otherwise detect a change - // (it only compares node properties forward, not in reverse). - let mut removed_stale_properties = false; - let mut node_queue = VecDeque::with_capacity(1); - node_queue.push_back((&mut project.tree, old_inst, snapshot.new_inst())); - - while let Some((node, old_inst, new_inst)) = node_queue.pop_front() { - log::debug!("Processing node {}", old_inst.name()); - if old_inst.class_name() != new_inst.class { - anyhow::bail!( - "Cannot change the class of {} in project file {}.\n\ - Current class is {}, it is a {} in the input file.", - old_inst.name(), - project_path.display(), - old_inst.class_name(), - new_inst.class - ); - } - - // TODO handle meta.json files in this branch. Right now, we perform - // syncback if a node has `$path` set but the Middleware aren't aware - // that the Instances they're running on originate in a project.json. - // As a result, the `meta.json` syncback code is hardcoded to not work - // if the Instance originates from a project file. However, we should - // ideally use a .meta.json over the project node if it exists already. - if node.path.is_some() { - // Since the node has a path, we have to run syncback on it. - let node_path = node.path.as_ref().map(PathNode::path).expect( - "Project nodes with a path must have a path \ - If you see this message, something went seriously wrong. Please report it.", - ); - let full_path = if node_path.is_absolute() { - node_path.to_path_buf() - } else { - base_path.join(node_path) - }; - - let middleware = match Middleware::middleware_for_path( - snapshot.vfs(), - &project.sync_rules, - &full_path, - )? { - Some(middleware) => middleware, - // The only way this can happen at this point is if the path does - // not exist on the file system or there's no middleware for it. - None => anyhow::bail!( - "path does not exist or could not be turned into a file Rojo understands: {}", - full_path.display() - ), - }; - - descendant_snapshots.push( - snapshot - .with_new_path(full_path.clone(), new_inst.referent(), Some(old_inst.id())) - .middleware(middleware), - ); - - ref_to_path_map.insert(new_inst.referent(), full_path); - - // We only want to set properties if it needs it. - if !middleware.handles_own_properties() { - removed_stale_properties |= - project_node_property_syncback_path(snapshot, new_inst, node); - } - } else { - removed_stale_properties |= - project_node_property_syncback_no_path(snapshot, new_inst, node); - } - - for child_ref in new_inst.children() { - let child = snapshot - .get_new_instance(*child_ref) - .expect("all children of Instances should be in new DOM"); - if new_child_map.insert(&child.name, child).is_some() { - anyhow::bail!( - "Instances that are direct children of an Instance that is made by a project file \ - must have a unique name.\nThe child '{}' of '{}' is duplicated in the place file.", child.name, old_inst.name() - ); - } - } - for child_ref in old_inst.children() { - let child = snapshot - .get_old_instance(*child_ref) - .expect("all children of Instances should be in old DOM"); - if old_child_map.insert(child.name(), child).is_some() { - anyhow::bail!( - "Instances that are direct children of an Instance that is made by a project file \ - must have a unique name.\nThe child '{}' of '{}' is duplicated on the file system.", child.name(), old_inst.name() - ); - } - } - - // This loop does basic matching of Instance children to the node's - // children. It ensures that `new_child_map` and `old_child_map` will - // only contain Instances that don't belong to the project after this. - for (child_name, child_node) in &mut node.children { - // If a node's path is optional, we want to skip it if the path - // doesn't exist since it isn't in the current old DOM. - if let Some(path) = &child_node.path { - if path.is_optional() { - let real_path = if path.path().is_absolute() { - path.path().to_path_buf() - } else { - base_path.join(path.path()) - }; - if !real_path.exists() { - log::warn!( - "Skipping node '{child_name}' of project because it is optional and not present on the disk.\n\ - If this is not deliberate, please create a file or directory at {}", real_path.display() - ); - continue; - } - } - } - let new_equivalent = new_child_map.remove(child_name); - let old_equivalent = old_child_map.remove(child_name.as_str()); - match (new_equivalent, old_equivalent) { - (Some(new), Some(old)) => node_queue.push_back((child_node, old, new)), - (_, None) => anyhow::bail!( - "The child '{child_name}' of Instance '{}' would be removed.\n\ - Syncback cannot add or remove Instances from project {}", - old_inst.name(), - project_path.display() - ), - (None, _) => anyhow::bail!( - "The child '{child_name}' of Instance '{}' is present only in a project file,\n\ - and not the provided file. Syncback cannot add or remove Instances from project:\n{}.", - old_inst.name(), project_path.display(), - ) - } - } - - // All of the children in this loop are by their nature not in the - // project, so we just need to run syncback on them. - for (name, new_child) in new_child_map.drain() { - let parent_path = match ref_to_path_map.get(&new_child.parent()) { - Some(path) => path.clone(), - None => { - log::debug!("Skipping child {name} of node because it has no parent_path"); - continue; - } - }; - - // If a child also exists in the old tree, it will be caught in the - // syncback on the project node path above (or is itself a node). - // So the only things we need to run seperately is new children. - if old_child_map.remove(name.as_str()).is_none() { - let parent_middleware = - Middleware::middleware_for_path(vfs, &project.sync_rules, &parent_path)? - .expect("project nodes should have a middleware if they have children."); - // If this node points directly to a project, it may still have - // children but they'll be handled by syncback. This isn't a - // concern with directories because they're singular things, - // files that contain their own children. - if parent_middleware != Middleware::Project { - descendant_snapshots.push(snapshot.with_base_path( - &parent_path, - new_child.referent(), - None, - )?); - } - } - } - removed_descendants.extend(old_child_map.drain().map(|(_, v)| v)); - node_changed_map.push((&node.properties, &node.attributes, old_inst)) - } - let mut fs_snapshot = FsSnapshot::new(); - - let mut needs_reserialize = removed_stale_properties; - if !needs_reserialize { - for (node_properties, node_attributes, old_inst) in node_changed_map { - if project_node_should_reserialize(node_properties, node_attributes, old_inst)? { - needs_reserialize = true; - break; - } - } - } - if needs_reserialize { - fs_snapshot.add_file(project_path, serde_json::to_vec_pretty(&project)?); - } - - Ok(SyncbackReturn { - fs_snapshot, - children: descendant_snapshots, - removed_children: removed_descendants, - }) -} - -/// Syncs properties from the new instance into the project node. -/// Returns `true` if any stale properties were removed (i.e. properties -/// that existed in the project node but are now at their engine default). -fn project_node_property_syncback( - _snapshot: &SyncbackSnapshot, - filtered_properties: UstrMap<&Variant>, - new_inst: &Instance, - node: &mut ProjectNode, -) -> bool { - let properties = &mut node.properties; - let mut attributes = BTreeMap::new(); - for (&name, &value) in &filtered_properties { - match value { - Variant::Attributes(attrs) => { - for (attr_name, attr_value) in attrs.iter() { - // We (probably) don't want to preserve internal attributes, - // only user defined ones. - if attr_name.starts_with("RBX") { - continue; - } - attributes.insert( - attr_name.clone(), - UnresolvedValue::from_variant_unambiguous(attr_value.clone()), - ); - } - } - _ => { - properties.insert( - name, - UnresolvedValue::from_variant(value.clone(), &new_inst.class, &name), - ); - } - } - } - - // Remove stale properties: entries that exist in the project node's - // $properties but are no longer in the filtered (non-default) properties - // from the instance. This handles the case where Studio resets a property - // to its engine default — filter_properties won't include it, so we need - // to clean up the now-stale project entry. - let class_data = rbx_reflection_database::get() - .ok() - .and_then(|db| db.classes.get(new_inst.class.as_str())); - let len_before = properties.len(); - properties.retain(|prop_name, _| { - if filtered_properties.contains_key(prop_name) { - return true; - } - // Only remove if the property has a known default value in the - // reflection database. If there's no default, the property might be - // absent from the instance for other reasons (e.g. unknown property), - // so we conservatively keep it. - if let Some(data) = &class_data { - if data.default_properties.contains_key(prop_name.as_str()) { - log::debug!( - "Removing stale property '{}' from project node for class '{}': \ - value has been reset to engine default", - prop_name, - new_inst.class - ); - return false; - } - } - true - }); - let removed_stale = properties.len() < len_before; - - node.attributes = attributes; - removed_stale -} - -fn project_node_property_syncback_path( - snapshot: &SyncbackSnapshot, - new_inst: &Instance, - node: &mut ProjectNode, -) -> bool { - let filtered_properties = snapshot - .get_path_filtered_properties(new_inst.referent()) - .unwrap(); - project_node_property_syncback(snapshot, filtered_properties, new_inst, node) -} - -fn project_node_property_syncback_no_path( - snapshot: &SyncbackSnapshot, - new_inst: &Instance, - node: &mut ProjectNode, -) -> bool { - let filtered_properties = filter_properties(snapshot.project(), new_inst); - project_node_property_syncback(snapshot, filtered_properties, new_inst, node) -} - -fn project_node_should_reserialize( - node_properties: &BTreeMap, - node_attributes: &BTreeMap, - instance: InstanceWithMeta, -) -> anyhow::Result { - for (prop_name, unresolved_node_value) in node_properties { - if let Some(inst_value) = instance.properties().get(prop_name) { - let node_value = unresolved_node_value - .clone() - .resolve(&instance.class_name(), prop_name)?; - if !variant_eq(inst_value, &node_value) { - return Ok(true); - } - } else { - return Ok(true); - } - } - - match instance.properties().get(&ustr("Attributes")) { - Some(Variant::Attributes(inst_attributes)) => { - // This will also catch if one is empty but the other isn't - if node_attributes.len() != inst_attributes.len() { - Ok(true) - } else { - for (attr_name, unresolved_node_value) in node_attributes { - if let Some(inst_value) = inst_attributes.get(attr_name.as_str()) { - let node_value = unresolved_node_value.clone().resolve_unambiguous()?; - if !variant_eq(inst_value, &node_value) { - return Ok(true); - } - } else { - return Ok(true); - } - } - Ok(false) - } - } - Some(_) => Ok(true), - None => { - if !node_attributes.is_empty() { - Ok(true) - } else { - Ok(false) - } - } - } -} - -fn infer_class_name(name: &str, parent_class: Option<&str>) -> Option { +fn infer_class_name(name: &str, parent_class: Option<&str>) -> Option> { // If className wasn't defined from another source, we may be able // to infer one. @@ -683,21 +272,16 @@ fn infer_class_name(name: &str, parent_class: Option<&str>) -> Option { // Members of DataModel with names that match known services are // probably supposed to be those services. - let descriptor = rbx_reflection_database::get().unwrap().classes.get(name)?; + let descriptor = rbx_reflection_database::get().classes.get(name)?; if descriptor.tags.contains(&ClassTag::Service) { - return Some(ustr(name)); + return Some(Cow::Owned(name.to_owned())); } } else if parent_class == "StarterPlayer" { // StarterPlayer has two special members with their own classes. if name == "StarterPlayerScripts" || name == "StarterCharacterScripts" { - return Some(ustr(name)); - } - } else if parent_class == "Workspace" { - // Workspace has a special Terrain class inside it - if name == "Terrain" { - return Some(ustr(name)); + return Some(Cow::Owned(name.to_owned())); } } @@ -709,6 +293,7 @@ fn infer_class_name(name: &str, parent_class: Option<&str>) -> Option { mod test { use super::*; + use maplit::hashmap; use memofs::{InMemoryFs, VfsSnapshot}; #[ignore = "Functionality moved to root snapshot middleware"] @@ -719,32 +304,25 @@ mod test { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/foo", - VfsSnapshot::dir([( - "default.project.json", - VfsSnapshot::file( - r#" + VfsSnapshot::dir(hashmap! { + "default.project.json" => VfsSnapshot::file(r#" { "name": "indirect-project", "tree": { "$className": "Folder" } } - "#, - ), - )]), + "#), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); - let instance_snapshot = snapshot_project( - &InstanceContext::default(), - &vfs, - Path::new("/foo"), - "NOT_IN_SNAPSHOT", - ) - .expect("snapshot error") - .expect("snapshot returned no instances"); + let instance_snapshot = + snapshot_project(&InstanceContext::default(), &mut vfs, Path::new("/foo")) + .expect("snapshot error") + .expect("snapshot returned no instances"); insta::assert_yaml_snapshot!(instance_snapshot); } @@ -756,29 +334,25 @@ mod test { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/foo", - VfsSnapshot::dir([( - "hello.project.json", - VfsSnapshot::file( - r#" + VfsSnapshot::dir(hashmap! { + "hello.project.json" => VfsSnapshot::file(r#" { "name": "direct-project", "tree": { "$className": "Model" } } - "#, - ), - )]), + "#), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo/hello.project.json"), - "NOT_IN_SNAPSHOT", ) .expect("snapshot error") .expect("snapshot returned no instances"); @@ -811,13 +385,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo.project.json"), - "NOT_IN_SNAPSHOT", ) .expect("snapshot error") .expect("snapshot returned no instances"); @@ -848,13 +421,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo.project.json"), - "NOT_IN_SNAPSHOT", ) .expect("snapshot error") .expect("snapshot returned no instances"); @@ -886,13 +458,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo.project.json"), - "NOT_IN_SNAPSHOT", ) .expect("snapshot error") .expect("snapshot returned no instances"); @@ -907,32 +478,26 @@ mod test { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/foo", - VfsSnapshot::dir([ - ( - "default.project.json", - VfsSnapshot::file( - r#" + VfsSnapshot::dir(hashmap! { + "default.project.json" => VfsSnapshot::file(r#" { "name": "path-project", "tree": { "$path": "other.txt" } } - "#, - ), - ), - ("other.txt", VfsSnapshot::file("Hello, world!")), - ]), + "#), + "other.txt" => VfsSnapshot::file("Hello, world!"), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo/default.project.json"), - "NOT_IN_SNAPSHOT", ) .expect("snapshot error") .expect("snapshot returned no instances"); @@ -947,44 +512,33 @@ mod test { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/foo", - VfsSnapshot::dir([ - ( - "default.project.json", - VfsSnapshot::file( - r#" + VfsSnapshot::dir(hashmap! { + "default.project.json" => VfsSnapshot::file(r#" { "name": "path-project", "tree": { "$path": "other.project.json" } } - "#, - ), - ), - ( - "other.project.json", - VfsSnapshot::file( - r#" + "#), + "other.project.json" => VfsSnapshot::file(r#" { "name": "other-project", "tree": { "$className": "Model" } } - "#, - ), - ), - ]), + "#), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo/default.project.json"), - "NOT_IN_SNAPSHOT", ) .expect("snapshot error") .expect("snapshot returned no instances"); @@ -999,24 +553,16 @@ mod test { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/foo", - VfsSnapshot::dir([ - ( - "default.project.json", - VfsSnapshot::file( - r#" + VfsSnapshot::dir(hashmap! { + "default.project.json" => VfsSnapshot::file(r#" { "name": "path-child-project", "tree": { "$path": "other.project.json" } } - "#, - ), - ), - ( - "other.project.json", - VfsSnapshot::file( - r#" + "#), + "other.project.json" => VfsSnapshot::file(r#" { "name": "other-project", "tree": { @@ -1027,20 +573,17 @@ mod test { } } } - "#, - ), - ), - ]), + "#), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo/default.project.json"), - "NOT_IN_SNAPSHOT", ) .expect("snapshot error") .expect("snapshot returned no instances"); @@ -1058,11 +601,8 @@ mod test { let mut imfs = InMemoryFs::new(); imfs.load_snapshot( "/foo", - VfsSnapshot::dir([ - ( - "default.project.json", - VfsSnapshot::file( - r#" + VfsSnapshot::dir(hashmap! { + "default.project.json" => VfsSnapshot::file(r#" { "name": "path-property-override", "tree": { @@ -1072,13 +612,8 @@ mod test { } } } - "#, - ), - ), - ( - "other.project.json", - VfsSnapshot::file( - r#" + "#), + "other.project.json" => VfsSnapshot::file(r#" { "name": "other-project", "tree": { @@ -1088,56 +623,17 @@ mod test { } } } - "#, - ), - ), - ]), + "#), + }), ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_project( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo/default.project.json"), - "NOT_IN_SNAPSHOT", - ) - .expect("snapshot error") - .expect("snapshot returned no instances"); - - insta::assert_yaml_snapshot!(instance_snapshot); - } - - #[test] - fn no_name_project() { - let _ = env_logger::try_init(); - - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo", - VfsSnapshot::dir([( - "default.project.json", - VfsSnapshot::file( - r#" - { - "tree": { - "$className": "Model" - } - } - "#, - ), - )]), - ) - .unwrap(); - - let vfs = Vfs::new(imfs); - - let instance_snapshot = snapshot_project( - &InstanceContext::default(), - &vfs, - Path::new("/foo/default.project.json"), - "no_name_project", ) .expect("snapshot error") .expect("snapshot returned no instances"); diff --git a/src/snapshot_middleware/rbxm.rs b/src/snapshot_middleware/rbxm.rs index 6518be6a..b1d61313 100644 --- a/src/snapshot_middleware/rbxm.rs +++ b/src/snapshot_middleware/rbxm.rs @@ -3,18 +3,17 @@ use std::path::Path; use anyhow::Context; use memofs::Vfs; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; + +use super::util::PathExt; -#[profiling::function] pub fn snapshot_rbxm( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { + let name = path.file_name_trim_end(".rbxm")?; + let temp_tree = rbx_binary::from_reader(vfs.read(path)?.as_slice()) .with_context(|| format!("Malformed rbxm file: {}", path.display()))?; @@ -22,13 +21,12 @@ pub fn snapshot_rbxm( let children = root_instance.children(); if children.len() == 1 { - let child = children[0]; - let snapshot = InstanceSnapshot::from_tree(temp_tree, child) + let snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]) .name(name) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf()]) .context(context), ); @@ -42,24 +40,6 @@ pub fn snapshot_rbxm( } } -pub fn syncback_rbxm<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let inst = snapshot.new_inst(); - - // Long-term, we probably want to have some logic for if this contains a - // script. That's a future endeavor though. - let mut serialized = Vec::new(); - rbx_binary::to_writer(&mut serialized, snapshot.new_tree(), &[inst.referent()]) - .context("failed to serialize new rbxm")?; - - Ok(SyncbackReturn { - fs_snapshot: FsSnapshot::new().with_added_file(&snapshot.path, serialized), - children: Vec::new(), - removed_children: Vec::new(), - }) -} - #[cfg(test)] mod test { use super::*; @@ -75,13 +55,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_rbxm( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo.rbxm"), - "foo", ) .unwrap() .unwrap(); diff --git a/src/snapshot_middleware/rbxmx.rs b/src/snapshot_middleware/rbxmx.rs index 8f122324..3cdd52e4 100644 --- a/src/snapshot_middleware/rbxmx.rs +++ b/src/snapshot_middleware/rbxmx.rs @@ -2,36 +2,34 @@ use std::path::Path; use anyhow::Context; use memofs::Vfs; -use rbx_xml::EncodeOptions; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; + +use super::util::PathExt; pub fn snapshot_rbxmx( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { + let name = path.file_name_trim_end(".rbxmx")?; + let options = rbx_xml::DecodeOptions::new() .property_behavior(rbx_xml::DecodePropertyBehavior::ReadUnknown); let temp_tree = rbx_xml::from_reader(vfs.read(path)?.as_slice(), options) - .with_context(|| format!("Malformed rbxmx file: {}", path.display()))?; + .with_context(|| format!("Malformed rbxm file: {}", path.display()))?; let root_instance = temp_tree.root(); let children = root_instance.children(); if children.len() == 1 { - let child = children[0]; - let snapshot = InstanceSnapshot::from_tree(temp_tree, child) + let snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]) .name(name) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf()]) .context(context), ); @@ -45,32 +43,6 @@ pub fn snapshot_rbxmx( } } -pub fn syncback_rbxmx<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let inst = snapshot.new_inst(); - - let options = - EncodeOptions::new().property_behavior(rbx_xml::EncodePropertyBehavior::WriteUnknown); - - // Long-term, we probably want to have some logic for if this contains a - // script. That's a future endeavor though. - let mut serialized = Vec::new(); - rbx_xml::to_writer( - &mut serialized, - snapshot.new_tree(), - &[inst.referent()], - options, - ) - .context("failed to serialize new rbxmx")?; - - Ok(SyncbackReturn { - fs_snapshot: FsSnapshot::new().with_added_file(&snapshot.path, serialized), - children: Vec::new(), - removed_children: Vec::new(), - }) -} - #[cfg(test)] mod test { use super::*; @@ -96,13 +68,12 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs); + let mut vfs = Vfs::new(imfs); let instance_snapshot = snapshot_rbxmx( &InstanceContext::default(), - &vfs, + &mut vfs, Path::new("/foo.rbxmx"), - "foo", ) .unwrap() .unwrap(); diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_from_vfs.snap index aa4c18c8..7a685efb 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_from_vfs.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/csv.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +11,11 @@ metadata: relevant_paths: - /foo.csv - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: LocalizationTable properties: Contents: - String: "[{\"example\":\"An exclamation of despair\",\"key\":\"Ack\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]" + String: "[{\"key\":\"Ack\",\"example\":\"An exclamation of despair\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]" children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_init.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_init.snap deleted file mode 100644 index 385666a8..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_init.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/snapshot_middleware/csv.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /root - relevant_paths: - - /root - - /root/init.lua - - /root/init.luau - - /root/init.server.lua - - /root/init.server.luau - - /root/init.client.lua - - /root/init.client.luau - - /root/init.plugin.lua - - /root/init.plugin.luau - - /root/init.csv - - /root/init.meta.json - - /root/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ -name: root -class_name: LocalizationTable -properties: - Contents: - String: "[{\"example\":\"An exclamation of despair\",\"key\":\"Ack\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]" -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_init_with_meta.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_init_with_meta.snap deleted file mode 100644 index 81fe3351..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_init_with_meta.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/snapshot_middleware/csv.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /root - relevant_paths: - - /root - - /root/init.lua - - /root/init.luau - - /root/init.server.lua - - /root/init.server.luau - - /root/init.client.lua - - /root/init.client.luau - - /root/init.plugin.lua - - /root/init.plugin.luau - - /root/init.csv - - /root/init.meta.json - - /root/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: root -class_name: LocalizationTable -properties: - Contents: - String: "[{\"example\":\"An exclamation of despair\",\"key\":\"Ack\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]" -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_with_meta.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_with_meta.snap index b02dee1c..70bae90d 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_with_meta.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__csv__test__csv_with_meta.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/csv.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,15 +11,11 @@ metadata: relevant_paths: - /foo.csv - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: LocalizationTable properties: Contents: - String: "[{\"example\":\"An exclamation of despair\",\"key\":\"Ack\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]" + String: "[{\"key\":\"Ack\",\"example\":\"An exclamation of despair\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]" children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__empty_folder.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__empty_folder.snap index 865c3c27..f24a53a8 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__empty_folder.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__empty_folder.snap @@ -2,29 +2,18 @@ source: src/snapshot_middleware/dir.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: Path: /foo relevant_paths: - /foo - - /foo/init.lua - - /foo/init.luau - - /foo/init.server.lua - - /foo/init.server.luau - - /foo/init.client.lua - - /foo/init.client.luau - - /foo/init.plugin.lua - - /foo/init.plugin.luau - - /foo/init.csv - /foo/init.meta.json - - /foo/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + - /foo/init.lua + - /foo/init.server.lua + - /foo/init.client.lua + context: {} name: foo class_name: Folder properties: {} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__folder_in_folder.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__folder_in_folder.snap index 00a4bdf0..e9bd5b92 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__folder_in_folder.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__dir__test__folder_in_folder.snap @@ -2,56 +2,34 @@ source: src/snapshot_middleware/dir.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: Path: /foo relevant_paths: - /foo - - /foo/init.lua - - /foo/init.luau - - /foo/init.server.lua - - /foo/init.server.luau - - /foo/init.client.lua - - /foo/init.client.luau - - /foo/init.plugin.lua - - /foo/init.plugin.luau - - /foo/init.csv - /foo/init.meta.json - - /foo/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + - /foo/init.lua + - /foo/init.server.lua + - /foo/init.client.lua + context: {} name: foo class_name: Folder properties: {} children: - - snapshot_id: "00000000000000000000000000000000" + - snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: Path: /foo/Child relevant_paths: - /foo/Child - - /foo/Child/init.lua - - /foo/Child/init.luau - - /foo/Child/init.server.lua - - /foo/Child/init.server.luau - - /foo/Child/init.client.lua - - /foo/Child/init.client.luau - - /foo/Child/init.plugin.lua - - /foo/Child/init.plugin.luau - - /foo/Child/init.csv - /foo/Child/init.meta.json - - /foo/Child/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: dir - schema: ~ + - /foo/Child/init.lua + - /foo/Child/init.server.lua + - /foo/Child/init.client.lua + context: {} name: Child class_name: Folder properties: {} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json__test__instance_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json__test__instance_from_vfs.snap index 0803eed1..75329b85 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json__test__instance_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json__test__instance_from_vfs.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/json.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +11,11 @@ metadata: relevant_paths: - /foo.json - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: ModuleScript properties: Source: String: "return {\n\t[\"1invalidident\"] = \"nice\",\n\tarray = {1, 2, 3},\n\t[\"false\"] = false,\n\tfloat = 1234.5452,\n\tint = 1234,\n\tnull = nil,\n\tobject = {\n\t\thello = \"world\",\n\t},\n\t[\"true\"] = true,\n}" children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json__test__with_metadata.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json__test__with_metadata.snap deleted file mode 100644 index 7e6c260d..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json__test__with_metadata.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/json.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.json - relevant_paths: - - /foo.json - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: foo -class_name: ModuleScript -properties: - Source: - String: "return {\n\tarray = {1, 2, 3},\n\tfloat = 1234.5452,\n\tint = 1234,\n}" -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json_model__test__model_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json_model__test__model_from_vfs.snap index f579d015..a6a0743e 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json_model__test__model_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json_model__test__model_from_vfs.snap @@ -1,35 +1,29 @@ --- source: src/snapshot_middleware/json_model.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: Path: /foo.model.json relevant_paths: - /foo.model.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: IntValue properties: Value: Int64: 5 children: - - snapshot_id: "00000000000000000000000000000000" + - snapshot_id: ~ metadata: ignore_unknown_instances: false relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: The Child class_name: StringValue properties: {} children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json_model__test__model_from_vfs_legacy.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json_model__test__model_from_vfs_legacy.snap deleted file mode 100644 index f579d015..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__json_model__test__model_from_vfs_legacy.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: src/snapshot_middleware/json_model.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.model.json - relevant_paths: - - /foo.model.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: IntValue -properties: - Value: - Int64: 5 -children: - - snapshot_id: "00000000000000000000000000000000" - metadata: - ignore_unknown_instances: false - relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ - name: The Child - class_name: StringValue - properties: {} - children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_client_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__client_from_vfs.snap similarity index 67% rename from src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_client_from_vfs.snap rename to src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__client_from_vfs.snap index 37fdec4e..f774f561 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_client_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__client_from_vfs.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/lua.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +11,11 @@ metadata: relevant_paths: - /foo.client.lua - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: LocalScript properties: Source: String: Hello there! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__init_module_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__init_module_from_vfs.snap index f5de8064..47340789 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__init_module_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__init_module_from_vfs.snap @@ -2,32 +2,22 @@ source: src/snapshot_middleware/lua.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: Path: /root relevant_paths: - /root - - /root/init.lua - - /root/init.luau - - /root/init.server.lua - - /root/init.server.luau - - /root/init.client.lua - - /root/init.client.luau - - /root/init.plugin.lua - - /root/init.plugin.luau - - /root/init.csv - /root/init.meta.json - - /root/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + - /root/init.lua + - /root/init.server.lua + - /root/init.client.lua + context: {} name: root class_name: ModuleScript properties: Source: - String: Hello! + Type: String + Value: Hello! children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__init_module_from_vfs_with_meta.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__init_module_from_vfs_with_meta.snap deleted file mode 100644 index 60b43c20..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__init_module_from_vfs_with_meta.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /root - relevant_paths: - - /root - - /root/init.lua - - /root/init.luau - - /root/init.server.lua - - /root/init.server.luau - - /root/init.client.lua - - /root/init.client.luau - - /root/init.plugin.lua - - /root/init.plugin.luau - - /root/init.csv - - /root/init.meta.json - - /root/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: root -class_name: ModuleScript -properties: - Source: - String: Hello! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_module_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__module_from_vfs.snap similarity index 66% rename from src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_module_from_vfs.snap rename to src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__module_from_vfs.snap index e898dfbd..ac9ac72a 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_module_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__module_from_vfs.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/lua.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +11,11 @@ metadata: relevant_paths: - /foo.lua - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: ModuleScript properties: Source: String: Hello there! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_module_with_meta.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__module_with_meta.snap similarity index 66% rename from src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_module_with_meta.snap rename to src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__module_with_meta.snap index a9facd2d..f623955f 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_module_with_meta.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__module_with_meta.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/lua.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,15 +11,11 @@ metadata: relevant_paths: - /foo.lua - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: ModuleScript properties: Source: String: Hello there! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__plugin_module_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__plugin_module_from_vfs.snap deleted file mode 100644 index 91535701..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__plugin_module_from_vfs.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.plugin.lua - relevant_paths: - - /foo.plugin.lua - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: false - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: Script -properties: - RunContext: - Enum: 3 - Source: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_client_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_client_from_vfs.snap deleted file mode 100644 index abe11f93..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_client_from_vfs.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.client.lua - relevant_paths: - - /foo.client.lua - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: false - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: Script -properties: - RunContext: - Enum: 2 - Source: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_module_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_module_from_vfs.snap deleted file mode 100644 index 0d1ecd32..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_module_from_vfs.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.lua - relevant_paths: - - /foo.lua - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: false - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: ModuleScript -properties: - Source: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_module_with_meta.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_module_with_meta.snap deleted file mode 100644 index 03ac12e5..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_module_with_meta.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: true - instigating_source: - Path: /foo.lua - relevant_paths: - - /foo.lua - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: false - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: ModuleScript -properties: - Source: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_script_disabled.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_script_disabled.snap deleted file mode 100644 index 706b6ff5..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_script_disabled.snap +++ /dev/null @@ -1,28 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /bar.server.lua - relevant_paths: - - /bar.server.lua - - /bar.meta.json - - /bar.meta.jsonc - context: - emit_legacy_scripts: false - specified_id: ~ - middleware: ~ - schema: ~ -name: bar -class_name: Script -properties: - Disabled: - Bool: true - RunContext: - Enum: 1 - Source: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_script_with_meta.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_script_with_meta.snap deleted file mode 100644 index 64a697d4..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_script_with_meta.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: true - instigating_source: - Path: /foo.server.lua - relevant_paths: - - /foo.server.lua - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: false - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: Script -properties: - RunContext: - Enum: 1 - Source: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_server_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_server_from_vfs.snap deleted file mode 100644 index 1b972cf2..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__runcontext_server_from_vfs.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: src/snapshot_middleware/lua.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.server.lua - relevant_paths: - - /foo.server.lua - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: false - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: Script -properties: - RunContext: - Enum: 1 - Source: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_script_disabled.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__script_disabled.snap similarity index 65% rename from src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_script_disabled.snap rename to src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__script_disabled.snap index ae7e22db..8a9b4776 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_script_disabled.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__script_disabled.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/lua.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,19 +11,13 @@ metadata: relevant_paths: - /bar.server.lua - /bar.meta.json - - /bar.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: bar class_name: Script properties: Disabled: Bool: true - RunContext: - Enum: 0 Source: String: Hello there! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_script_with_meta.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__script_with_meta.snap similarity index 63% rename from src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_script_with_meta.snap rename to src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__script_with_meta.snap index ce577d1e..1234b48a 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_script_with_meta.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__script_with_meta.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/lua.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,17 +11,11 @@ metadata: relevant_paths: - /foo.server.lua - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: Script properties: - RunContext: - Enum: 0 Source: String: Hello there! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_server_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__server_from_vfs.snap similarity index 63% rename from src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_server_from_vfs.snap rename to src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__server_from_vfs.snap index 9ce4624c..76473c75 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__class_server_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__lua__test__server_from_vfs.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/lua.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,17 +11,11 @@ metadata: relevant_paths: - /foo.server.lua - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: Script properties: - RunContext: - Enum: 0 Source: String: Hello there! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__adjacent_read_json.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__adjacent_read_json.snap deleted file mode 100644 index 44c2123b..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__adjacent_read_json.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: src/snapshot_middleware/meta_file.rs -expression: snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - relevant_paths: - - /foo/bar.meta.json - - /foo/bar.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: DEFAULT -class_name: DEFAULT -properties: {} -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__adjacent_read_jsonc.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__adjacent_read_jsonc.snap deleted file mode 100644 index 44c2123b..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__adjacent_read_jsonc.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: src/snapshot_middleware/meta_file.rs -expression: snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - relevant_paths: - - /foo/bar.meta.json - - /foo/bar.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: DEFAULT -class_name: DEFAULT -properties: {} -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__directory_read_json.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__directory_read_json.snap deleted file mode 100644 index 6d819bfb..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__directory_read_json.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: src/snapshot_middleware/meta_file.rs -expression: snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - relevant_paths: - - /foo/init.meta.json - - /foo/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: DEFAULT -class_name: DEFAULT -properties: {} -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__directory_read_jsonc.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__directory_read_jsonc.snap deleted file mode 100644 index 6d819bfb..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__meta_file__test__directory_read_jsonc.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: src/snapshot_middleware/meta_file.rs -expression: snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - relevant_paths: - - /foo/init.meta.json - - /foo/init.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: DEFAULT -class_name: DEFAULT -properties: {} -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__no_name_project.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__no_name_project.snap deleted file mode 100644 index dc817e76..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__no_name_project.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: src/snapshot_middleware/project.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: true - instigating_source: - Path: /foo/default.project.json - relevant_paths: - - /foo/default.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: Model -properties: {} -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_direct_file.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_direct_file.snap index 1d739949..42393420 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_direct_file.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_direct_file.snap @@ -2,18 +2,14 @@ source: src/snapshot_middleware/project.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: Path: /foo/hello.project.json relevant_paths: - /foo/hello.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: direct-project class_name: Model properties: {} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_folder.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_folder.snap index 87aead09..d3a91f3c 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_folder.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_from_folder.snap @@ -9,8 +9,7 @@ metadata: Path: /foo/default.project.json relevant_paths: - /foo/default.project.json - context: - script_type: Class + context: {} name: indirect-project class_name: Folder properties: {} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_path_property_overrides.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_path_property_overrides.snap index 5b787c2a..49b3b506 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_path_property_overrides.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_path_property_overrides.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/project.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,14 +11,11 @@ metadata: relevant_paths: - /foo/other.project.json - /foo/default.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: project - schema: ~ + context: {} name: path-property-override class_name: StringValue properties: Value: String: Changed children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_children.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_children.snap index 779afb4e..ccf6b535 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_children.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_children.snap @@ -2,38 +2,29 @@ source: src/snapshot_middleware/project.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: Path: /foo.project.json relevant_paths: - /foo.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: children class_name: Folder properties: {} children: - - snapshot_id: "00000000000000000000000000000000" + - snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: ProjectNode: - path: /foo.project.json - name: Child - node: - $className: Model - parent_class: Folder + - /foo.project.json + - Child + - $className: Model + - Folder relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: Child class_name: Model properties: {} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project.snap index 99432ea0..a520b7c7 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project.snap @@ -2,7 +2,7 @@ source: src/snapshot_middleware/project.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,11 +10,7 @@ metadata: relevant_paths: - /foo/other.project.json - /foo/default.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: project - schema: ~ + context: {} name: path-project class_name: Model properties: {} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project_with_children.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project_with_children.snap index 88f8e479..c71b4d2d 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project_with_children.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_project_with_children.snap @@ -2,7 +2,7 @@ source: src/snapshot_middleware/project.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,31 +10,22 @@ metadata: relevant_paths: - /foo/other.project.json - /foo/default.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: project - schema: ~ + context: {} name: path-child-project class_name: Folder properties: {} children: - - snapshot_id: "00000000000000000000000000000000" + - snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: ProjectNode: - path: /foo/other.project.json - name: SomeChild - node: - $className: Model - parent_class: Folder + - /foo/other.project.json + - SomeChild + - $className: Model + - Folder relevant_paths: [] - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: SomeChild class_name: Model properties: {} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_txt.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_txt.snap index dea385ac..38b797c3 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_txt.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_path_to_txt.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/project.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,16 +11,12 @@ metadata: relevant_paths: - /foo/other.txt - /foo/other.meta.json - - /foo/other.meta.jsonc - /foo/default.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: text - schema: ~ + context: {} name: path-project class_name: StringValue properties: Value: String: "Hello, world!" children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_resolved_properties.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_resolved_properties.snap index ae95e39b..29a23a07 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_resolved_properties.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_resolved_properties.snap @@ -1,22 +1,20 @@ --- source: src/snapshot_middleware/project.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: Path: /foo.project.json relevant_paths: - /foo.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: resolved-properties class_name: StringValue properties: Value: String: "Hello, world!" children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_unresolved_properties.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_unresolved_properties.snap index 589ef207..a422e9f8 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_unresolved_properties.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__project__test__project_with_unresolved_properties.snap @@ -1,22 +1,20 @@ --- source: src/snapshot_middleware/project.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: Path: /foo.project.json relevant_paths: - /foo.project.json - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: unresolved-properties class_name: StringValue properties: Value: String: Hi! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__toml__test__instance_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__toml__test__instance_from_vfs.snap deleted file mode 100644 index ce112886..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__toml__test__instance_from_vfs.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/toml.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.toml - relevant_paths: - - /foo.toml - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: ModuleScript -properties: - Source: - String: "return {\n\t[\"1invalidident\"] = \"nice\",\n\tarray = {1, 2, 3},\n\tdates = {\n\t\tlocaldate = \"1979-05-27\",\n\t\tlocaldatetime = \"1979-05-27T07:32:00\",\n\t\tlocaltime = \"00:32:00.999999\",\n\t\toffset1 = \"1979-05-27T00:32:00.999999-07:00\",\n\t\toffset2 = \"1979-05-27T07:32:00Z\",\n\t},\n\t[\"false\"] = false,\n\tfloat = 1234.5452,\n\tint = 1234,\n\tobject = {\n\t\thello = \"world\",\n\t},\n\t[\"true\"] = true,\n}" -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__toml__test__with_metadata.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__toml__test__with_metadata.snap deleted file mode 100644 index 8c8aef67..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__toml__test__with_metadata.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/toml.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: foo.toml - relevant_paths: - - foo.toml - - foo.meta.json - - foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: foo -class_name: ModuleScript -properties: - Source: - String: "return {\n\tarray = {1, 2, 3},\n\tbool = false,\n\tint = 123,\n}" -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__txt__test__instance_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__txt__test__instance_from_vfs.snap index bde4798e..ad469490 100644 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__txt__test__instance_from_vfs.snap +++ b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__txt__test__instance_from_vfs.snap @@ -1,8 +1,9 @@ --- source: src/snapshot_middleware/txt.rs expression: instance_snapshot + --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +11,11 @@ metadata: relevant_paths: - /foo.txt - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ + context: {} name: foo class_name: StringValue properties: Value: String: Hello there! children: [] + diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__txt__test__with_metadata.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__txt__test__with_metadata.snap deleted file mode 100644 index a5047bc3..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__txt__test__with_metadata.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/txt.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.txt - relevant_paths: - - /foo.txt - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: foo -class_name: StringValue -properties: - Value: - String: Hello there! -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__instance_from_vfs-2.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__instance_from_vfs-2.snap deleted file mode 100644 index f38291b6..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__instance_from_vfs-2.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: src/snapshot_middleware/yaml.rs -expression: source ---- -return { - string = "this is a string", - boolean = true, - integer = 1337, - float = 123456789.5, - ["value-with-hypen"] = "it sure is", - sequence = {"wow", 8675309}, - map = { - key = "value", - key2 = "value 2", - key3 = "value 3", - }, - ["nested-map"] = {{ - key = "value", - }, { - key2 = "value 2", - }, { - key3 = "value 3", - }}, - whatever_this_is = {"i imagine", "it's", "a", "sequence?"}, - null1 = nil, - null2 = nil, -} diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__instance_from_vfs.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__instance_from_vfs.snap deleted file mode 100644 index ef749325..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__instance_from_vfs.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/yaml.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: /foo.yaml - relevant_paths: - - /foo.yaml - - /foo.meta.json - - /foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: ~ - middleware: ~ - schema: ~ -name: foo -class_name: ModuleScript -properties: - Source: - String: "return {\n\tstring = \"this is a string\",\n\tboolean = true,\n\tinteger = 1337,\n\tfloat = 123456789.5,\n\t[\"value-with-hypen\"] = \"it sure is\",\n\tsequence = {\"wow\", 8675309},\n\tmap = {\n\t\tkey = \"value\",\n\t\tkey2 = \"value 2\",\n\t\tkey3 = \"value 3\",\n\t},\n\t[\"nested-map\"] = {{\n\t\tkey = \"value\",\n\t}, {\n\t\tkey2 = \"value 2\",\n\t}, {\n\t\tkey3 = \"value 3\",\n\t}},\n\twhatever_this_is = {\"i imagine\", \"it's\", \"a\", \"sequence?\"},\n\tnull1 = nil,\n\tnull2 = nil,\n}" -children: [] diff --git a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__with_metadata.snap b/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__with_metadata.snap deleted file mode 100644 index 8a9e1778..00000000 --- a/src/snapshot_middleware/snapshots/librojo__snapshot_middleware__yaml__test__with_metadata.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/snapshot_middleware/yaml.rs -expression: instance_snapshot ---- -snapshot_id: "00000000000000000000000000000000" -metadata: - ignore_unknown_instances: false - instigating_source: - Path: foo.yaml - relevant_paths: - - foo.yaml - - foo.meta.json - - foo.meta.jsonc - context: - emit_legacy_scripts: true - specified_id: manually specified - middleware: ~ - schema: ~ -name: foo -class_name: ModuleScript -properties: - Source: - String: "return {\n\tvalue = 1234,\n}" -children: [] diff --git a/src/snapshot_middleware/toml.rs b/src/snapshot_middleware/toml.rs deleted file mode 100644 index 3c42de6c..00000000 --- a/src/snapshot_middleware/toml.rs +++ /dev/null @@ -1,153 +0,0 @@ -use std::path::Path; - -use anyhow::Context; -use memofs::Vfs; -use rbx_dom_weak::ustr; - -use crate::{ - lua_ast::{Expression, Statement}, - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, -}; - -use super::meta_file::AdjacentMetadata; - -pub fn snapshot_toml( - context: &InstanceContext, - vfs: &Vfs, - path: &Path, - name: &str, -) -> anyhow::Result> { - let contents = vfs.read(path)?; - - let value: toml::Value = toml::from_slice(&contents) - .with_context(|| format!("File contains malformed TOML: {}", path.display()))?; - - let as_lua = toml_to_lua(value).to_string(); - - let mut snapshot = InstanceSnapshot::new() - .name(name) - .class_name("ModuleScript") - .property(ustr("Source"), as_lua) - .metadata( - InstanceMetadata::new() - .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) - .context(context), - ); - - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; - - Ok(Some(snapshot)) -} - -fn toml_to_lua(value: toml::Value) -> Statement { - Statement::Return(toml_to_lua_value(value)) -} - -fn toml_to_lua_value(value: toml::Value) -> Expression { - use toml::Value; - - match value { - Value::Datetime(value) => Expression::String(value.to_string()), - Value::Boolean(value) => Expression::Bool(value), - Value::Float(value) => Expression::Number(value), - Value::Integer(value) => Expression::Number(value as f64), - Value::String(value) => Expression::String(value), - Value::Array(values) => { - Expression::Array(values.into_iter().map(toml_to_lua_value).collect()) - } - Value::Table(values) => Expression::table( - values - .into_iter() - .map(|(key, value)| (key.into(), toml_to_lua_value(value))) - .collect(), - ), - } -} - -#[cfg(test)] -mod test { - use super::*; - - use memofs::{InMemoryFs, VfsSnapshot}; - - #[test] - fn instance_from_vfs() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo.toml", - VfsSnapshot::file( - r#" - array = [1, 2, 3] - true = true - false = false - int = 1234 - float = 1234.5452 - "1invalidident" = "nice" - - [object] - hello = "world" - - [dates] - offset1 = 1979-05-27T00:32:00.999999-07:00 - offset2 = 1979-05-27 07:32:00Z - localdatetime = 1979-05-27T07:32:00 - localdate = 1979-05-27 - localtime = 00:32:00.999999 - "#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs.clone()); - - let instance_snapshot = snapshot_toml( - &InstanceContext::default(), - &vfs, - Path::new("/foo.toml"), - "foo", - ) - .unwrap() - .unwrap(); - - insta::assert_yaml_snapshot!(instance_snapshot); - } - - #[test] - fn with_metadata() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "foo.toml", - VfsSnapshot::file( - r#" - array = [1, 2, 3] - int = 123 - bool = false - "#, - ), - ) - .unwrap(); - imfs.load_snapshot( - "foo.meta.json", - VfsSnapshot::file( - r#"{ - "id": "manually specified" - }"#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs.clone()); - - let instance_snapshot = snapshot_toml( - &InstanceContext::default(), - &vfs, - Path::new("foo.toml"), - "foo", - ) - .unwrap() - .unwrap(); - - insta::assert_yaml_snapshot!(instance_snapshot); - } -} diff --git a/src/snapshot_middleware/txt.rs b/src/snapshot_middleware/txt.rs index c56aacdd..13d5b990 100644 --- a/src/snapshot_middleware/txt.rs +++ b/src/snapshot_middleware/txt.rs @@ -1,75 +1,48 @@ use std::{path::Path, str}; -use anyhow::Context as _; -use memofs::Vfs; -use rbx_dom_weak::types::Variant; -use rbx_dom_weak::ustr; +use anyhow::Context; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; -use super::{meta_file::AdjacentMetadata, PathExt as _}; +use super::{meta_file::AdjacentMetadata, util::PathExt}; pub fn snapshot_txt( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, ) -> anyhow::Result> { - let contents = vfs.read_to_string(path)?; - let contents_str = contents.as_str(); + let name = path.file_name_trim_end(".txt")?; + + let contents = vfs.read(path)?; + let contents_str = str::from_utf8(&contents) + .with_context(|| format!("File was not valid UTF-8: {}", path.display()))? + .to_owned(); + + let properties = hashmap! { + "Value".to_owned() => contents_str.into(), + }; + + let meta_path = path.with_file_name(format!("{}.meta.json", name)); let mut snapshot = InstanceSnapshot::new() .name(name) .class_name("StringValue") - .property(ustr("Value"), contents_str) + .properties(properties) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf(), meta_path.clone()]) .context(context), ); - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; - - Ok(Some(snapshot)) -} - -pub fn syncback_txt<'sync>( - snapshot: &SyncbackSnapshot<'sync>, -) -> anyhow::Result> { - let new_inst = snapshot.new_inst(); - - let contents = if let Some(Variant::String(source)) = new_inst.properties.get(&ustr("Value")) { - source.as_bytes().to_vec() - } else { - anyhow::bail!("StringValues must have a `Value` property that is a String"); - }; - let mut fs_snapshot = FsSnapshot::new(); - fs_snapshot.add_file(&snapshot.path, contents); - - let meta = AdjacentMetadata::from_syncback_snapshot(snapshot, snapshot.path.clone())?; - if let Some(mut meta) = meta { - // StringValues have relatively few properties that we care about, so - // shifting is fine. - meta.properties.shift_remove(&ustr("Value")); - - if !meta.is_empty() { - let parent = snapshot.path.parent_err()?; - fs_snapshot.add_file( - parent.join(format!("{}.meta.json", new_inst.name)), - serde_json::to_vec_pretty(&meta).context("could not serialize metadata")?, - ); - } + if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? { + let mut metadata = AdjacentMetadata::from_slice(&meta_contents, meta_path)?; + metadata.apply_all(&mut snapshot)?; } - Ok(SyncbackReturn { - fs_snapshot, - children: Vec::new(), - removed_children: Vec::new(), - }) + Ok(Some(snapshot)) } #[cfg(test)] @@ -84,44 +57,12 @@ mod test { imfs.load_snapshot("/foo.txt", VfsSnapshot::file("Hello there!")) .unwrap(); - let vfs = Vfs::new(imfs.clone()); + let mut vfs = Vfs::new(imfs.clone()); - let instance_snapshot = snapshot_txt( - &InstanceContext::default(), - &vfs, - Path::new("/foo.txt"), - "foo", - ) - .unwrap() - .unwrap(); - - insta::assert_yaml_snapshot!(instance_snapshot); - } - - #[test] - fn with_metadata() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot("/foo.txt", VfsSnapshot::file("Hello there!")) - .unwrap(); - imfs.load_snapshot( - "/foo.meta.json", - VfsSnapshot::file( - r#"{ - "id": "manually specified" - }"#, - ), - ) - .unwrap(); - let vfs = Vfs::new(imfs.clone()); - - let instance_snapshot = snapshot_txt( - &InstanceContext::default(), - &vfs, - Path::new("/foo.txt"), - "foo", - ) - .unwrap() - .unwrap(); + let instance_snapshot = + snapshot_txt(&InstanceContext::default(), &mut vfs, Path::new("/foo.txt")) + .unwrap() + .unwrap(); insta::assert_yaml_snapshot!(instance_snapshot); } diff --git a/src/snapshot_middleware/util.rs b/src/snapshot_middleware/util.rs index c16edcce..517cd606 100644 --- a/src/snapshot_middleware/util.rs +++ b/src/snapshot_middleware/util.rs @@ -16,7 +16,6 @@ pub fn match_trailing<'a>(input: &'a str, suffix: &str) -> Option<&'a str> { pub trait PathExt { fn file_name_ends_with(&self, suffix: &str) -> bool; fn file_name_trim_end<'a>(&'a self, suffix: &str) -> anyhow::Result<&'a str>; - fn parent_err(&self) -> anyhow::Result<&Path>; } impl

PathExt for P @@ -38,18 +37,7 @@ where .and_then(|name| name.to_str()) .with_context(|| format!("Path did not have a file name: {}", path.display()))?; - match_trailing(file_name, suffix) + match_trailing(&file_name, suffix) .with_context(|| format!("Path did not end in {}: {}", suffix, path.display())) } - - fn parent_err(&self) -> anyhow::Result<&Path> { - let path = self.as_ref(); - path.parent() - .with_context(|| format!("Path does not have a parent: {}", path.display())) - } -} - -// TEMP function until rojo 8.0, when it can be replaced with bool::default (aka false) -pub fn emit_legacy_scripts_default() -> Option { - Some(true) } diff --git a/src/snapshot_middleware/yaml.rs b/src/snapshot_middleware/yaml.rs deleted file mode 100644 index 10f744bc..00000000 --- a/src/snapshot_middleware/yaml.rs +++ /dev/null @@ -1,265 +0,0 @@ -use std::path::Path; - -use anyhow::Context as _; -use memofs::Vfs; -use rbx_dom_weak::ustr; -use yaml_rust2::{Yaml, YamlLoader}; - -use crate::{ - lua_ast::{Expression, Statement}, - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, -}; - -use super::meta_file::AdjacentMetadata; - -pub fn snapshot_yaml( - context: &InstanceContext, - vfs: &Vfs, - path: &Path, - name: &str, -) -> anyhow::Result> { - let contents = vfs.read_to_string(path)?; - - let mut values = YamlLoader::load_from_str(&contents)?; - let value = values - .pop() - .context("all YAML documents must contain a document")?; - if !values.is_empty() { - anyhow::bail!("Rojo does not currently support multiple documents in a YAML file") - } - - let as_lua = Statement::Return(yaml_to_luau(value)?); - - let mut snapshot = InstanceSnapshot::new() - .name(name) - .class_name("ModuleScript") - .property(ustr("Source"), as_lua.to_string()) - .metadata( - InstanceMetadata::new() - .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) - .context(context), - ); - - AdjacentMetadata::read_and_apply_all(vfs, path, name, &mut snapshot)?; - - Ok(Some(snapshot)) -} - -fn yaml_to_luau(value: Yaml) -> anyhow::Result { - const MAX_FLOAT_INT: i64 = 1 << 53; - - Ok(match value { - Yaml::String(str) => Expression::String(str), - Yaml::Boolean(bool) => Expression::Bool(bool), - Yaml::Integer(int) => { - if int <= MAX_FLOAT_INT { - Expression::Number(int as f64) - } else { - anyhow::bail!( - "the integer '{int}' cannot be losslessly converted into a Luau number" - ) - } - } - Yaml::Real(_) => { - let value = value.as_f64().expect("value should be a valid f64"); - Expression::Number(value) - } - Yaml::Null => Expression::Nil, - Yaml::Array(values) => { - let new_values: anyhow::Result> = - values.into_iter().map(yaml_to_luau).collect(); - Expression::Array(new_values?) - } - Yaml::Hash(map) => { - let new_values: anyhow::Result> = map - .into_iter() - .map(|(k, v)| { - let k = yaml_to_luau(k)?; - let v = yaml_to_luau(v)?; - Ok((k, v)) - }) - .collect(); - Expression::table(new_values?) - } - Yaml::Alias(_) => { - anyhow::bail!("Rojo cannot convert YAML aliases to Luau") - } - Yaml::BadValue => { - anyhow::bail!("Rojo cannot convert YAML to Luau because of a parsing error") - } - }) -} - -#[cfg(test)] -mod test { - use super::*; - - use memofs::{InMemoryFs, VfsSnapshot}; - use rbx_dom_weak::types::Variant; - - #[test] - fn instance_from_vfs() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo.yaml", - VfsSnapshot::file( - r#" ---- -string: this is a string -boolean: true -integer: 1337 -float: 123456789.5 -value-with-hypen: it sure is -sequence: - - wow - - 8675309 -map: - key: value - key2: "value 2" - key3: 'value 3' -nested-map: - - key: value - - key2: "value 2" - - key3: 'value 3' -whatever_this_is: [i imagine, it's, a, sequence?] -null1: ~ -null2: null"#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs.clone()); - - let instance_snapshot = snapshot_yaml( - &InstanceContext::default(), - &vfs, - Path::new("/foo.yaml"), - "foo", - ) - .unwrap() - .unwrap(); - - insta::assert_yaml_snapshot!(instance_snapshot); - - let source = instance_snapshot - .properties - .get(&ustr("Source")) - .expect("the result from snapshot_yaml should have a Source property"); - if let Variant::String(source) = source { - insta::assert_snapshot!(source) - } else { - panic!("the Source property from snapshot_yaml was not a String") - } - } - - #[test] - #[should_panic(expected = "multiple documents")] - fn multiple_documents() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/foo.yaml", - VfsSnapshot::file( - r#" ---- -document-1: this is a document ---- -document-2: this is also a document"#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs.clone()); - - snapshot_yaml( - &InstanceContext::default(), - &vfs, - Path::new("/foo.yaml"), - "foo", - ) - .unwrap() - .unwrap(); - } - - #[test] - #[should_panic = "cannot be losslessly converted into a Luau number"] - fn integer_border() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "/allowed.yaml", - VfsSnapshot::file( - r#" -value: 9007199254740992 -"#, - ), - ) - .unwrap(); - imfs.load_snapshot( - "/not-allowed.yaml", - VfsSnapshot::file( - r#" -value: 9007199254740993 -"#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs.clone()); - - assert!( - snapshot_yaml( - &InstanceContext::default(), - &vfs, - Path::new("/allowed.yaml"), - "allowed", - ) - .is_ok(), - "snapshot_yaml failed to snapshot document with integer '9007199254740992' in it" - ); - - snapshot_yaml( - &InstanceContext::default(), - &vfs, - Path::new("/not-allowed.yaml"), - "not-allowed", - ) - .unwrap() - .unwrap(); - } - - #[test] - fn with_metadata() { - let mut imfs = InMemoryFs::new(); - imfs.load_snapshot( - "foo.yaml", - VfsSnapshot::file( - r#" - value: 1234 - "#, - ), - ) - .unwrap(); - imfs.load_snapshot( - "foo.meta.json", - VfsSnapshot::file( - r#"{ - "id": "manually specified", - }"#, - ), - ) - .unwrap(); - - let vfs = Vfs::new(imfs.clone()); - - let instance_snapshot = snapshot_yaml( - &InstanceContext::default(), - &vfs, - Path::new("foo.yaml"), - "foo", - ) - .unwrap() - .unwrap(); - - insta::assert_yaml_snapshot!(instance_snapshot); - } -} diff --git a/src/syncback/file_names.rs b/src/syncback/file_names.rs deleted file mode 100644 index 7654fed8..00000000 --- a/src/syncback/file_names.rs +++ /dev/null @@ -1,130 +0,0 @@ -//! Contains logic for generating new file names for Instances based on their -//! middleware. - -use std::borrow::Cow; - -use anyhow::Context; -use rbx_dom_weak::Instance; - -use crate::{snapshot::InstanceWithMeta, snapshot_middleware::Middleware}; - -pub fn name_for_inst<'old>( - middleware: Middleware, - new_inst: &Instance, - old_inst: Option>, -) -> anyhow::Result> { - if let Some(old_inst) = old_inst { - if let Some(source) = old_inst.metadata().relevant_paths.first() { - source - .file_name() - .and_then(|s| s.to_str()) - .map(Cow::Borrowed) - .context("sources on the file system should be valid unicode and not be stubs") - } else { - // This is technically not /always/ true, but we want to avoid - // running syncback on anything that has no instigating source - // anyway. - anyhow::bail!( - "members of 'old' trees should have an instigating source. Somehow, {} did not.", - old_inst.name(), - ); - } - } else { - Ok(match middleware { - Middleware::Dir - | Middleware::CsvDir - | Middleware::ServerScriptDir - | Middleware::ClientScriptDir - | Middleware::PluginScriptDir - | Middleware::ModuleScriptDir => Cow::Owned(new_inst.name.clone()), - _ => { - let extension = extension_for_middleware(middleware); - let name = &new_inst.name; - validate_file_name(name).with_context(|| { - format!("name '{name}' is not legal to write to the file system") - })?; - Cow::Owned(format!("{name}.{extension}")) - } - }) - } -} - -/// Returns the extension a provided piece of middleware is supposed to use. -pub fn extension_for_middleware(middleware: Middleware) -> &'static str { - match middleware { - Middleware::Csv => "csv", - Middleware::JsonModel => "model.json", - Middleware::Json => "json", - Middleware::ServerScript => "server.luau", - Middleware::ClientScript => "client.luau", - Middleware::ModuleScript => "luau", - Middleware::PluginScript => "plugin.luau", - Middleware::Project => "project.json", - Middleware::Rbxm => "rbxm", - Middleware::Rbxmx => "rbxmx", - Middleware::Toml => "toml", - Middleware::Text => "txt", - Middleware::Yaml => "yml", - - Middleware::LegacyServerScript - | Middleware::LegacyClientScript - | Middleware::RunContextServerScript - | Middleware::RunContextClientScript => { - todo!("syncback does not work on the middleware {middleware:?} yet") - } - // These are manually specified and not `_` to guard against future - // middleware additions missing this function. - Middleware::Ignore => unimplemented!("syncback does not work on Ignore middleware"), - Middleware::Dir - | Middleware::CsvDir - | Middleware::ServerScriptDir - | Middleware::ClientScriptDir - | Middleware::PluginScriptDir - | Middleware::ModuleScriptDir => { - unimplemented!("directory middleware requires special treatment") - } - } -} - -/// A list of file names that are not valid on Windows. -const INVALID_WINDOWS_NAMES: [&str; 22] = [ - "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", - "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", -]; - -/// A list of all characters that are outright forbidden to be included -/// in a file's name. -const FORBIDDEN_CHARS: [char; 9] = ['<', '>', ':', '"', '/', '|', '?', '*', '\\']; - -/// Validates a provided file name to ensure it's allowed on the file system. An -/// error is returned if the name isn't allowed, indicating why. -/// This takes into account rules for Windows, MacOS, and Linux. -/// -/// In practice however, these broadly overlap so the only unexpected behavior -/// is Windows, where there are 22 reserved names. -pub fn validate_file_name>(name: S) -> anyhow::Result<()> { - let str = name.as_ref(); - - if str.ends_with(' ') { - anyhow::bail!("file names cannot end with a space") - } - if str.ends_with('.') { - anyhow::bail!("file names cannot end with '.'") - } - - for char in str.chars() { - if FORBIDDEN_CHARS.contains(&char) { - anyhow::bail!("file names cannot contain <, >, :, \", /, |, ?, *, or \\") - } else if char.is_control() { - anyhow::bail!("file names cannot contain control characters") - } - } - - for forbidden in INVALID_WINDOWS_NAMES { - if str == forbidden { - anyhow::bail!("files cannot be named {str}") - } - } - - Ok(()) -} diff --git a/src/syncback/fs_snapshot.rs b/src/syncback/fs_snapshot.rs deleted file mode 100644 index 6bca52e4..00000000 --- a/src/syncback/fs_snapshot.rs +++ /dev/null @@ -1,191 +0,0 @@ -use std::{ - collections::{HashMap, HashSet}, - io, - path::{Path, PathBuf}, -}; - -use memofs::Vfs; - -/// A simple representation of a subsection of a file system. -#[derive(Default)] -pub struct FsSnapshot { - /// Paths representing new files mapped to their contents. - added_files: HashMap>, - /// Paths representing new directories. - added_dirs: HashSet, - /// Paths representing removed files. - removed_files: HashSet, - /// Paths representing removed directories. - removed_dirs: HashSet, -} - -impl FsSnapshot { - /// Creates a new `FsSnapshot`. - pub fn new() -> Self { - Self { - added_files: HashMap::new(), - added_dirs: HashSet::new(), - removed_files: HashSet::new(), - removed_dirs: HashSet::new(), - } - } - - /// Adds the given path to the `FsSnapshot` as a file with the given - /// contents, then returns it. - pub fn with_added_file>(mut self, path: P, data: Vec) -> Self { - self.added_files.insert(path.as_ref().to_path_buf(), data); - self - } - - /// Adds the given path to the `FsSnapshot` as a file with the given - /// then returns it. - pub fn with_added_dir>(mut self, path: P) -> Self { - self.added_dirs.insert(path.as_ref().to_path_buf()); - self - } - - /// Merges two `FsSnapshot`s together. - #[inline] - pub fn merge(&mut self, other: Self) { - self.added_files.extend(other.added_files); - self.added_dirs.extend(other.added_dirs); - self.removed_files.extend(other.removed_files); - self.removed_dirs.extend(other.removed_dirs); - } - - /// Merges two `FsSnapshot`s together, with a filter applied to the paths. - #[inline] - pub fn merge_with_filter(&mut self, other: Self, mut predicate: F) - where - F: FnMut(&Path) -> bool, - { - self.added_files - .extend(other.added_files.into_iter().filter(|(k, _)| predicate(k))); - self.added_dirs - .extend(other.added_dirs.into_iter().filter(|p| predicate(p))); - self.removed_files - .extend(other.removed_files.into_iter().filter(|p| predicate(p))); - self.removed_dirs - .extend(other.removed_dirs.into_iter().filter(|p| predicate(p))); - } - - /// Adds the provided path as a file with the given contents. - pub fn add_file>(&mut self, path: P, data: Vec) { - self.added_files.insert(path.as_ref().to_path_buf(), data); - } - - /// Adds the provided path as a directory. - pub fn add_dir>(&mut self, path: P) { - self.added_dirs.insert(path.as_ref().to_path_buf()); - } - - /// Removes the provided path, as a file. - pub fn remove_file>(&mut self, path: P) { - self.removed_files.insert(path.as_ref().to_path_buf()); - } - - /// Removes the provided path, as a directory. - pub fn remove_dir>(&mut self, path: P) { - self.removed_dirs.insert(path.as_ref().to_path_buf()); - } - - /// Writes the `FsSnapshot` to the provided VFS, using the provided `base` - /// as a root for the other paths in the `FsSnapshot`. - /// - /// This includes removals, but makes no effort to minimize work done. - pub fn write_to_vfs>(&self, base: P, vfs: &Vfs) -> io::Result<()> { - let mut lock = vfs.lock(); - - let base_path = base.as_ref(); - for dir_path in &self.added_dirs { - match lock.create_dir_all(base_path.join(dir_path)) { - Ok(_) => (), - Err(err) if err.kind() == io::ErrorKind::AlreadyExists => (), - Err(err) => return Err(err), - }; - } - for (path, contents) in &self.added_files { - lock.write(base_path.join(path), contents)?; - } - for dir_path in &self.removed_dirs { - lock.remove_dir_all(base_path.join(dir_path))?; - } - for path in &self.removed_files { - lock.remove_file(base_path.join(path))?; - } - drop(lock); - - log::debug!( - "Wrote {} directories and {} files to the file system", - self.added_dirs.len(), - self.added_files.len() - ); - log::debug!( - "Removed {} directories and {} files from the file system", - self.removed_dirs.len(), - self.removed_files.len() - ); - Ok(()) - } - - /// Returns whether this `FsSnapshot` is empty or not. - #[inline] - pub fn is_empty(&self) -> bool { - self.added_files.is_empty() - && self.added_dirs.is_empty() - && self.removed_files.is_empty() - && self.removed_dirs.is_empty() - } - - /// Returns a list of paths that would be added by this `FsSnapshot`. - #[inline] - pub fn added_paths(&self) -> Vec<&Path> { - let mut list = Vec::with_capacity(self.added_files.len() + self.added_dirs.len()); - list.extend(self.added_files()); - list.extend(self.added_dirs()); - - list - } - - /// Returns a list of paths that would be removed by this `FsSnapshot`. - #[inline] - pub fn removed_paths(&self) -> Vec<&Path> { - let mut list = Vec::with_capacity(self.removed_files.len() + self.removed_dirs.len()); - list.extend(self.removed_files()); - list.extend(self.removed_dirs()); - - list - } - - /// Returns a list of file paths that would be added by this `FsSnapshot` - #[inline] - pub fn added_files(&self) -> Vec<&Path> { - let mut added_files: Vec<_> = self.added_files.keys().map(PathBuf::as_path).collect(); - added_files.sort_unstable(); - added_files - } - - /// Returns a list of directory paths that would be added by this `FsSnapshot` - #[inline] - pub fn added_dirs(&self) -> Vec<&Path> { - let mut added_dirs: Vec<_> = self.added_dirs.iter().map(PathBuf::as_path).collect(); - added_dirs.sort_unstable(); - added_dirs - } - - /// Returns a list of file paths that would be removed by this `FsSnapshot` - #[inline] - pub fn removed_files(&self) -> Vec<&Path> { - let mut removed_files: Vec<_> = self.removed_files.iter().map(PathBuf::as_path).collect(); - removed_files.sort_unstable(); - removed_files - } - - /// Returns a list of directory paths that would be removed by this `FsSnapshot` - #[inline] - pub fn removed_dirs(&self) -> Vec<&Path> { - let mut removed_dirs: Vec<_> = self.removed_dirs.iter().map(PathBuf::as_path).collect(); - removed_dirs.sort_unstable(); - removed_dirs - } -} diff --git a/src/syncback/hash/mod.rs b/src/syncback/hash/mod.rs deleted file mode 100644 index 5bc16b9f..00000000 --- a/src/syncback/hash/mod.rs +++ /dev/null @@ -1,122 +0,0 @@ -//! Hashing utilities for a WeakDom. -mod variant; - -pub use variant::*; - -use blake3::{Hash, Hasher}; -use rbx_dom_weak::{ - types::{Ref, Variant}, - Instance, Ustr, WeakDom, -}; -use std::collections::HashMap; - -use crate::{variant_eq::variant_eq, Project}; - -use super::{descendants, filter_properties_preallocated}; - -/// Returns a map of every `Ref` in the `WeakDom` to a hashed version of the -/// `Instance` it points to, including the properties and descendants of the -/// `Instance`. -/// -/// The hashes **do** include the descendants of the Instances in them, -/// so they should only be used for comparing subtrees directly. -pub fn hash_tree(project: &Project, dom: &WeakDom, root_ref: Ref) -> HashMap { - let mut order = descendants(dom, root_ref); - let mut map: HashMap = HashMap::with_capacity(order.len()); - - let mut prop_list = Vec::with_capacity(2); - let mut child_hashes = Vec::new(); - - while let Some(referent) = order.pop() { - let inst = dom.get_by_ref(referent).unwrap(); - let mut hasher = hash_inst_filtered(project, inst, &mut prop_list); - add_children(inst, &map, &mut child_hashes, &mut hasher); - - map.insert(referent, hasher.finalize()); - } - - map -} - -/// Hashes a single Instance from the provided WeakDom, if it exists. -/// -/// This function filters properties using user-provided syncing rules from -/// the passed project. -#[inline] -pub fn hash_instance(project: &Project, dom: &WeakDom, referent: Ref) -> Option { - let mut prop_list = Vec::with_capacity(2); - let inst = dom.get_by_ref(referent)?; - - Some(hash_inst_filtered(project, inst, &mut prop_list).finalize()) -} - -/// Adds the hashes of children for an Instance to the provided Hasher. -fn add_children( - inst: &Instance, - map: &HashMap, - child_hashes: &mut Vec<[u8; 32]>, - hasher: &mut Hasher, -) { - for child_ref in inst.children() { - if let Some(hash) = map.get(child_ref) { - child_hashes.push(*hash.as_bytes()) - } else { - panic!("Invariant violated: child not hashed before parent") - } - } - child_hashes.sort_unstable(); - - for hash in child_hashes.drain(..) { - hasher.update(&hash); - } -} - -/// Performs hashing on an Instance using a filtered property list. -/// Does not include the hashes of any children. -fn hash_inst_filtered<'inst>( - project: &Project, - inst: &'inst Instance, - prop_list: &mut Vec<(Ustr, &'inst Variant)>, -) -> Hasher { - filter_properties_preallocated(project, inst, prop_list); - - hash_inst_prefilled(inst, prop_list) -} - -/// Performs hashing on an Instance using a pre-filled list of properties. -/// It is assumed the property list is **not** sorted, so it is sorted in-line. -fn hash_inst_prefilled<'inst>( - inst: &'inst Instance, - prop_list: &mut Vec<(Ustr, &'inst Variant)>, -) -> Hasher { - let mut hasher = Hasher::new(); - hasher.update(inst.name.as_bytes()); - hasher.update(inst.class.as_bytes()); - - prop_list.sort_unstable_by_key(|(name, _)| *name); - - let descriptor = rbx_reflection_database::get() - .unwrap() - .classes - .get(inst.class.as_str()); - - if let Some(descriptor) = descriptor { - for (name, value) in prop_list.drain(..) { - hasher.update(name.as_bytes()); - if let Some(default) = descriptor.default_properties.get(name.as_str()) { - if !variant_eq(default, value) { - hash_variant(&mut hasher, value) - } - } else { - hash_variant(&mut hasher, value) - } - } - } else { - for (name, value) in prop_list.drain(..) { - hasher.update(name.as_bytes()); - hash_variant(&mut hasher, value) - } - } - - hasher -} diff --git a/src/syncback/hash/variant.rs b/src/syncback/hash/variant.rs deleted file mode 100644 index 3457beac..00000000 --- a/src/syncback/hash/variant.rs +++ /dev/null @@ -1,216 +0,0 @@ -use blake3::Hasher; -use rbx_dom_weak::types::{ContentType, PhysicalProperties, Variant, Vector3}; - -macro_rules! round { - ($value:expr) => { - (($value * 10.0).round() / 10.0) - }; -} - -macro_rules! n_hash { - ($hash:ident, $($num:expr),*) => { - {$( - $hash.update(&($num).to_le_bytes()); - )*} - }; -} - -macro_rules! hash { - ($hash:ident, $value:expr) => {{ - $hash.update($value); - }}; -} - -/// Places `value` into the provided hasher. -pub fn hash_variant(hasher: &mut Hasher, value: &Variant) { - // We need to round floats, though I'm not sure to what degree we can - // realistically do that. - match value { - Variant::Attributes(attrs) => { - let mut sorted: Vec<(&String, &Variant)> = attrs.iter().collect(); - sorted.sort_unstable_by_key(|(name, _)| *name); - for (name, attribute) in sorted { - hasher.update(name.as_bytes()); - hash_variant(hasher, attribute); - } - } - Variant::Axes(a) => hash!(hasher, &[a.bits()]), - Variant::BinaryString(bytes) => hash!(hasher, bytes.as_ref()), - Variant::Bool(bool) => hash!(hasher, &[*bool as u8]), - Variant::BrickColor(color) => n_hash!(hasher, *color as u16), - Variant::CFrame(cf) => { - vector_hash(hasher, cf.position); - vector_hash(hasher, cf.orientation.x); - vector_hash(hasher, cf.orientation.y); - vector_hash(hasher, cf.orientation.z); - } - Variant::Color3(color) => { - n_hash!(hasher, round!(color.r), round!(color.g), round!(color.b)) - } - Variant::Color3uint8(color) => hash!(hasher, &[color.r, color.b, color.g]), - Variant::ColorSequence(seq) => { - let mut new = Vec::with_capacity(seq.keypoints.len()); - for keypoint in &seq.keypoints { - new.push(keypoint); - } - new.sort_unstable_by(|a, b| round!(a.time).partial_cmp(&round!(b.time)).unwrap()); - for keypoint in new { - n_hash!( - hasher, - round!(keypoint.time), - round!(keypoint.color.r), - round!(keypoint.color.g), - round!(keypoint.color.b) - ) - } - } - Variant::Content(content) => match content.value() { - ContentType::None => { - hash!(hasher, &[0]); - } - ContentType::Uri(uri) => { - hash!(hasher, &[1]); - hash!(hasher, uri.as_bytes()); - } - ContentType::Object(referent) => { - hash!(hasher, &[2]); - hash!(hasher, referent.to_string().as_bytes()) - } - other => { - panic!("the ContentType {other:?} cannot be hashed as a Variant") - } - }, - Variant::ContentId(content) => { - let s: &str = content.as_ref(); - hash!(hasher, s.as_bytes()) - } - Variant::Enum(e) => n_hash!(hasher, e.to_u32()), - Variant::EnumItem(e) => { - hash!(hasher, e.ty.as_bytes()); - n_hash!(hasher, e.value); - } - Variant::Faces(f) => hash!(hasher, &[f.bits()]), - Variant::Float32(n) => n_hash!(hasher, round!(*n)), - Variant::Float64(n) => n_hash!(hasher, round!(n)), - Variant::Font(f) => { - n_hash!(hasher, f.weight as u16); - n_hash!(hasher, f.style as u8); - hash!(hasher, f.family.as_bytes()); - if let Some(cache) = &f.cached_face_id { - hash!(hasher, &[0x01]); - hash!(hasher, cache.as_bytes()); - } else { - hash!(hasher, &[0x00]); - } - } - Variant::Int32(n) => n_hash!(hasher, n), - Variant::Int64(n) => n_hash!(hasher, n), - Variant::MaterialColors(n) => hash!(hasher, n.encode().as_slice()), - Variant::NetAssetRef(net_asset) => hash!(hasher, net_asset.hash().as_bytes()), - Variant::NumberRange(nr) => n_hash!(hasher, round!(nr.max), round!(nr.min)), - Variant::NumberSequence(seq) => { - let mut new = Vec::with_capacity(seq.keypoints.len()); - for keypoint in &seq.keypoints { - new.push(keypoint); - } - new.sort_unstable_by(|a, b| round!(a.time).partial_cmp(&round!(b.time)).unwrap()); - for keypoint in new { - n_hash!( - hasher, - round!(keypoint.time), - round!(keypoint.value), - round!(keypoint.envelope) - ) - } - } - Variant::OptionalCFrame(maybe_cf) => { - if let Some(cf) = maybe_cf { - hash!(hasher, &[0x01]); - vector_hash(hasher, cf.position); - vector_hash(hasher, cf.orientation.x); - vector_hash(hasher, cf.orientation.y); - vector_hash(hasher, cf.orientation.z); - } else { - hash!(hasher, &[0x00]); - } - } - Variant::PhysicalProperties(properties) => match properties { - PhysicalProperties::Default => hash!(hasher, &[0x00]), - PhysicalProperties::Custom(custom) => { - hash!(hasher, &[0x00]); - n_hash!( - hasher, - round!(custom.density()), - round!(custom.friction()), - round!(custom.elasticity()), - round!(custom.friction_weight()), - round!(custom.elasticity_weight()), - round!(custom.acoustic_absorption()) - ) - } - }, - Variant::Ray(ray) => { - vector_hash(hasher, ray.origin); - vector_hash(hasher, ray.direction); - } - Variant::Rect(rect) => n_hash!( - hasher, - round!(rect.max.x), - round!(rect.max.y), - round!(rect.min.x), - round!(rect.min.y) - ), - Variant::Ref(referent) => hash!(hasher, referent.to_string().as_bytes()), - Variant::Region3(region) => { - vector_hash(hasher, region.max); - vector_hash(hasher, region.min); - } - Variant::Region3int16(region) => { - n_hash!( - hasher, - region.max.x, - region.max.y, - region.max.z, - region.min.x, - region.min.y, - region.min.z - ) - } - Variant::SecurityCapabilities(capabilities) => n_hash!(hasher, capabilities.bits()), - Variant::SharedString(sstr) => hash!(hasher, sstr.hash().as_bytes()), - Variant::String(str) => hash!(hasher, str.as_bytes()), - Variant::Tags(tags) => { - let mut dupe: Vec<&str> = tags.iter().collect(); - dupe.sort_unstable(); - for tag in dupe { - hash!(hasher, tag.as_bytes()) - } - } - Variant::UDim(udim) => n_hash!(hasher, round!(udim.scale), udim.offset), - Variant::UDim2(udim) => n_hash!( - hasher, - round!(udim.y.scale), - udim.y.offset, - round!(udim.x.scale), - udim.x.offset - ), - Variant::Vector2(v2) => n_hash!(hasher, round!(v2.x), round!(v2.y)), - Variant::Vector2int16(v2) => n_hash!(hasher, v2.x, v2.y), - Variant::Vector3(v3) => vector_hash(hasher, *v3), - Variant::Vector3int16(v3) => n_hash!(hasher, v3.x, v3.y, v3.z), - - // Hashing UniqueId properties doesn't make sense - Variant::UniqueId(_) => (), - - unknown => { - log::warn!( - "Encountered unknown Variant {:?} while hashing", - unknown.ty() - ) - } - } -} - -fn vector_hash(hasher: &mut Hasher, vector: Vector3) { - n_hash!(hasher, round!(vector.x), round!(vector.y), round!(vector.z)) -} diff --git a/src/syncback/mod.rs b/src/syncback/mod.rs deleted file mode 100644 index 3949786d..00000000 --- a/src/syncback/mod.rs +++ /dev/null @@ -1,614 +0,0 @@ -mod file_names; -mod fs_snapshot; -mod hash; -mod property_filter; -mod ref_properties; -mod snapshot; - -use anyhow::Context; -use indexmap::IndexMap; -use memofs::Vfs; -use rbx_dom_weak::{ - types::{Ref, Variant}, - ustr, Instance, Ustr, UstrSet, WeakDom, -}; -use serde::{Deserialize, Serialize}; -use std::{ - collections::{HashMap, HashSet, VecDeque}, - env, - path::Path, - sync::OnceLock, -}; - -use crate::{ - glob::{Glob, IgnorableGlob}, - snapshot::{InstanceWithMeta, RojoTree}, - snapshot_middleware::Middleware, - syncback::ref_properties::{collect_referents, link_referents}, - Project, -}; - -pub use file_names::{extension_for_middleware, name_for_inst, validate_file_name}; -pub use fs_snapshot::FsSnapshot; -pub use hash::*; -pub use property_filter::{filter_properties, filter_properties_preallocated}; -pub use snapshot::{SyncbackData, SyncbackSnapshot}; - -/// The name of an enviroment variable to use to override the behavior of -/// syncback on model files. -/// By default, syncback will use `Rbxm` for model files. -/// If this is set to `1`, it will instead use `Rbxmx`. If it is set to `2`, -/// it will use `JsonModel`. -/// -/// This will **not** override existing `Rbxm` middleware. It will only impact -/// new files. -const DEBUG_MODEL_FORMAT_VAR: &str = "ROJO_SYNCBACK_DEBUG"; - -/// A glob that can be used to tell if a path contains a `.git` folder. -static GIT_IGNORE_GLOB: OnceLock = OnceLock::new(); - -pub fn syncback_loop( - vfs: &Vfs, - old_tree: &mut RojoTree, - mut new_tree: WeakDom, - project: &Project, -) -> anyhow::Result { - let ignore_patterns = project - .syncback_rules - .as_ref() - .map(|rules| rules.compile_globs()) - .transpose()?; - - // TODO: Add a better way to tell if the root of a project is a directory - let skip_pruning = if let Some(path) = &project.tree.path { - let middleware = - Middleware::middleware_for_path(vfs, &project.sync_rules, path.path()).unwrap(); - if let Some(middleware) = middleware { - middleware.is_dir() - } else { - false - } - } else { - false - }; - if !skip_pruning { - // Strip out any objects from the new tree that aren't in the old tree. This - // is necessary so that hashing the roots of each tree won't always result - // in different hashes. Shout out to Roblox for serializing a bunch of - // Services nobody cares about. - log::debug!("Pruning new tree"); - strip_unknown_root_children(&mut new_tree, old_tree); - } - - log::debug!("Collecting referents for new DOM..."); - let deferred_referents = collect_referents(&new_tree); - - // Remove any properties that are manually blocked from syncback via the - // project file. - log::debug!("Pre-filtering properties on DOMs"); - for referent in descendants(&new_tree, new_tree.root_ref()) { - let new_inst = new_tree.get_by_ref_mut(referent).unwrap(); - if let Some(filter) = get_property_filter(project, new_inst) { - for prop in filter { - new_inst.properties.remove(&prop); - } - } - } - for referent in descendants(old_tree.inner(), old_tree.get_root_id()) { - let mut old_inst_rojo = old_tree.get_instance_mut(referent).unwrap(); - let old_inst = old_inst_rojo.inner_mut(); - if let Some(filter) = get_property_filter(project, old_inst) { - for prop in filter { - old_inst.properties.remove(&prop); - } - } - } - - // Handle removing the current camera. - if let Some(syncback_rules) = &project.syncback_rules { - if !syncback_rules.sync_current_camera.unwrap_or_default() { - log::debug!("Removing CurrentCamera from new DOM"); - let mut camera_ref = None; - for child_ref in new_tree.root().children() { - let inst = new_tree.get_by_ref(*child_ref).unwrap(); - if inst.class == "Workspace" { - camera_ref = inst.properties.get(&ustr("CurrentCamera")); - break; - } - } - if let Some(Variant::Ref(camera_ref)) = camera_ref { - if new_tree.get_by_ref(*camera_ref).is_some() { - new_tree.destroy(*camera_ref); - } - } - } - } - - let ignore_referents = project - .syncback_rules - .as_ref() - .and_then(|s| s.ignore_referents) - .unwrap_or_default(); - if !ignore_referents { - log::debug!("Linking referents for new DOM"); - link_referents(deferred_referents, &mut new_tree)?; - } else { - log::debug!("Skipping referent linking as per project syncback rules"); - } - - // As with pruning the children of the new root, we need to ensure the roots - // for both DOMs have the same name otherwise their hashes will always be - // different. - new_tree.root_mut().name = old_tree.root().name().to_string(); - - log::debug!("Hashing project DOM"); - let old_hashes = hash_tree(project, old_tree.inner(), old_tree.get_root_id()); - log::debug!("Hashing file DOM"); - let new_hashes = hash_tree(project, &new_tree, new_tree.root_ref()); - - let project_path = project.folder_location(); - - let syncback_data = SyncbackData { - vfs, - old_tree, - new_tree: &new_tree, - project, - }; - - let mut snapshots = vec![SyncbackSnapshot { - data: syncback_data, - old: Some(old_tree.get_root_id()), - new: new_tree.root_ref(), - path: project.file_location.clone(), - middleware: Some(Middleware::Project), - }]; - - let mut fs_snapshot = FsSnapshot::new(); - - 'syncback: while let Some(snapshot) = snapshots.pop() { - let inst_path = snapshot.get_new_inst_path(snapshot.new); - // We can quickly check that two subtrees are identical and if they are, - // skip reconciling them. - if let Some(old_ref) = snapshot.old { - match (old_hashes.get(&old_ref), new_hashes.get(&snapshot.new)) { - (Some(old), Some(new)) => { - if old == new { - log::trace!( - "Skipping {inst_path} due to it being identically hashed as {old:?}" - ); - continue; - } - } - _ => unreachable!("All Instances in both DOMs should have hashes"), - } - } - - if !is_valid_path(&ignore_patterns, project_path, &snapshot.path) { - log::debug!("Skipping {inst_path} because its path matches ignore pattern"); - continue; - } - if let Some(syncback_rules) = &project.syncback_rules { - // Ignore trees; - for ignored in &syncback_rules.ignore_trees { - if inst_path.starts_with(ignored.as_str()) { - log::debug!("Tree {inst_path} is blocked by project"); - continue 'syncback; - } - } - } - - let middleware = get_best_middleware(&snapshot); - - log::trace!( - "Middleware for {inst_path} is {:?} (path is {})", - middleware, - snapshot.path.display() - ); - - if matches!(middleware, Middleware::Json | Middleware::Toml) { - log::warn!("Cannot syncback {middleware:?} at {inst_path}, skipping"); - continue; - } - - let syncback = match middleware.syncback(&snapshot) { - Ok(syncback) => syncback, - Err(err) if middleware == Middleware::Dir => { - let new_middleware = match env::var(DEBUG_MODEL_FORMAT_VAR) { - Ok(value) if value == "1" => Middleware::Rbxmx, - Ok(value) if value == "2" => Middleware::JsonModel, - _ => Middleware::Rbxm, - }; - let file_name = snapshot - .path - .file_name() - .and_then(|s| s.to_str()) - .context("Directory middleware should have a name in its path")?; - let mut path = snapshot.path.clone(); - path.set_file_name(format!( - "{file_name}.{}", - extension_for_middleware(new_middleware) - )); - let new_snapshot = snapshot.with_new_path(path, snapshot.new, snapshot.old); - log::warn!( - "Could not syncback {inst_path} as a Directory because: {err}.\n\ - It will instead be synced back as a {new_middleware:?}." - ); - let new_syncback_result = new_middleware - .syncback(&new_snapshot) - .with_context(|| format!("Failed to syncback {inst_path}")); - if new_syncback_result.is_ok() && snapshot.old_inst().is_some() { - // We need to remove the old FS representation if we're - // reserializing it as an rbxm. - fs_snapshot.remove_dir(&snapshot.path); - } - new_syncback_result? - } - Err(err) => anyhow::bail!("Failed to syncback {inst_path} because {err}"), - }; - - if !syncback.removed_children.is_empty() { - log::debug!( - "removed children for {inst_path}: {}", - syncback.removed_children.len() - ); - 'remove: for inst in &syncback.removed_children { - let path = inst.metadata().instigating_source.as_ref().unwrap().path(); - let inst_path = snapshot.get_old_inst_path(inst.id()); - if !is_valid_path(&ignore_patterns, project_path, path) { - log::debug!( - "Skipping removing {} because its matches an ignore pattern", - path.display() - ); - continue; - } - if let Some(syncback_rules) = &project.syncback_rules { - for ignored in &syncback_rules.ignore_trees { - if inst_path.starts_with(ignored.as_str()) { - log::debug!("Skipping removing {inst_path} because its path is blocked by project"); - continue 'remove; - } - } - } - if path.is_dir() { - fs_snapshot.remove_dir(path) - } else { - fs_snapshot.remove_file(path) - } - } - } - - // TODO provide replacement snapshots for e.g. two way sync - - fs_snapshot.merge_with_filter(syncback.fs_snapshot, |path| { - is_valid_path(&ignore_patterns, project_path, path) - }); - - snapshots.extend(syncback.children); - } - - Ok(fs_snapshot) -} - -pub struct SyncbackReturn<'sync> { - pub fs_snapshot: FsSnapshot, - pub children: Vec>, - pub removed_children: Vec>, -} - -pub fn get_best_middleware(snapshot: &SyncbackSnapshot) -> Middleware { - // At some point, we're better off using an O(1) method for checking - // equality for classes like this. - static JSON_MODEL_CLASSES: OnceLock> = OnceLock::new(); - let json_model_classes = JSON_MODEL_CLASSES.get_or_init(|| { - [ - "Actor", - "Sound", - "SoundGroup", - "Sky", - "Atmosphere", - "BloomEffect", - "BlurEffect", - "ColorCorrectionEffect", - "DepthOfFieldEffect", - "SunRaysEffect", - "ParticleEmitter", - "TextChannel", - "TextChatCommand", - // TODO: Implement a way to use inheritance for this - "ChatWindowConfiguration", - "ChatInputBarConfiguration", - "BubbleChatConfiguration", - "ChannelTabsConfiguration", - "RemoteEvent", - "UnreliableRemoteEvent", - "RemoteFunction", - "BindableEvent", - "BindableFunction", - ] - .into() - }); - - let old_middleware = snapshot - .old_inst() - .and_then(|inst| inst.metadata().middleware); - let inst = snapshot.new_inst(); - - let mut middleware; - - if let Some(override_middleware) = snapshot.middleware { - return override_middleware; - } else if let Some(old_middleware) = old_middleware { - return old_middleware; - } else if json_model_classes.contains(inst.class.as_str()) { - middleware = Middleware::JsonModel; - } else { - middleware = match inst.class.as_str() { - "Folder" | "Configuration" | "Tool" => Middleware::Dir, - "StringValue" => Middleware::Text, - "Script" => Middleware::ServerScript, - "LocalScript" => Middleware::ClientScript, - "ModuleScript" => Middleware::ModuleScript, - "LocalizationTable" => Middleware::Csv, - // This isn't the ideal way to handle this but it works. - name if name.ends_with("Value") => Middleware::JsonModel, - _ => Middleware::Rbxm, - } - } - - if !inst.children().is_empty() { - middleware = match middleware { - Middleware::ServerScript => Middleware::ServerScriptDir, - Middleware::ClientScript => Middleware::ClientScriptDir, - Middleware::PluginScript => Middleware::PluginScriptDir, - Middleware::ModuleScript => Middleware::ModuleScriptDir, - Middleware::Csv => Middleware::CsvDir, - Middleware::JsonModel | Middleware::Text => Middleware::Dir, - _ => middleware, - } - } - - if middleware == Middleware::Rbxm { - middleware = match env::var(DEBUG_MODEL_FORMAT_VAR) { - Ok(value) if value == "1" => Middleware::Rbxmx, - Ok(value) if value == "2" => Middleware::JsonModel, - _ => Middleware::Rbxm, - } - } - - middleware -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct SyncbackRules { - /// A list of subtrees in a file that will be ignored by Syncback. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - ignore_trees: Vec, - /// A list of patterns to check against the path an Instance would serialize - /// to. If a path matches one of these, the Instance won't be syncbacked. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - ignore_paths: Vec, - /// A map of classes to properties to ignore for that class when doing - /// syncback. - #[serde(default, skip_serializing_if = "IndexMap::is_empty")] - ignore_properties: IndexMap>, - /// Whether or not the `CurrentCamera` of `Workspace` is included in the - /// syncback or not. Defaults to `false`. - #[serde(skip_serializing_if = "Option::is_none")] - sync_current_camera: Option, - /// Whether or not to sync properties that cannot be modified via scripts. - /// Defaults to `true`. - #[serde(skip_serializing_if = "Option::is_none")] - sync_unscriptable: Option, - /// Whether to skip serializing referent properties like `Model.PrimaryPart` - /// during syncback. Defaults to `false`. - #[serde(skip_serializing_if = "Option::is_none")] - ignore_referents: Option, - /// Whether the globs specified in `ignore_paths` should be modified to also - /// match directories. Defaults to `true`. - /// - /// If this is `true`, it'll take ignore globs that end in `/**` and convert - /// them to also handle the directory they're referring to. This is - /// generally a better UX. - #[serde(skip_serializing_if = "Option::is_none")] - create_ignore_dir_paths: Option, -} - -impl SyncbackRules { - pub fn compile_globs(&self) -> anyhow::Result> { - let mut globs = Vec::with_capacity(self.ignore_paths.len()); - let dir_ignore_paths = self.create_ignore_dir_paths.unwrap_or(true); - - for pattern in &self.ignore_paths { - let glob = IgnorableGlob::new(pattern) - .with_context(|| format!("the pattern '{pattern}' is not a valid glob"))?; - globs.push(glob); - - if dir_ignore_paths { - if let Some(dir_pattern) = pattern.strip_suffix("/**") { - if let Ok(glob) = IgnorableGlob::new(dir_pattern) { - globs.push(glob) - } - } - } - } - - Ok(globs) - } -} - -fn is_valid_path(globs: &Option>, base_path: &Path, path: &Path) -> bool { - let git_glob = GIT_IGNORE_GLOB.get_or_init(|| Glob::new(".git/**").unwrap()); - let test_path = match path.strip_prefix(base_path) { - Ok(suffix) => suffix, - Err(_) => path, - }; - if git_glob.is_match(test_path) { - return false; - } - if let Some(ref ignore_paths) = globs { - // Gitignore-style "last match wins" - let mut ignored = false; - for glob in ignore_paths { - if glob.is_match(test_path) { - ignored = !glob.is_negation(); - } - } - if ignored { - return false; - } - } - true -} - -/// Returns a set of properties that should not be written with syncback if -/// one exists. This list is read directly from the Project and takes -/// inheritance into effect. -/// -/// It **does not** handle properties that should not serialize for other -/// reasons, such as being defaults or being marked as not serializing in the -/// ReflectionDatabase. -fn get_property_filter(project: &Project, new_inst: &Instance) -> Option { - let filter = &project.syncback_rules.as_ref()?.ignore_properties; - let mut set = UstrSet::default(); - - let database = rbx_reflection_database::get().unwrap(); - let mut current_class_name = new_inst.class.as_str(); - - loop { - if let Some(list) = filter.get(&ustr(current_class_name)) { - set.extend(list) - } - - let class = database.classes.get(current_class_name)?; - if let Some(super_class) = class.superclass { - current_class_name = super_class; - } else { - break; - } - } - - Some(set) -} - -/// Produces a list of descendants in the WeakDom such that all children come -/// before their parents. -fn descendants(dom: &WeakDom, root_ref: Ref) -> Vec { - let mut queue = VecDeque::new(); - let mut ordered = Vec::new(); - queue.push_front(root_ref); - - while let Some(referent) = queue.pop_front() { - let inst = dom - .get_by_ref(referent) - .expect("Invariant: WeakDom had a Ref that wasn't inside it"); - ordered.push(referent); - for child in inst.children() { - queue.push_back(*child) - } - } - - ordered -} - -/// Removes the children of `new`'s root that are not also children of `old`'s -/// root. -/// -/// This does not care about duplicates, and only filters based on names and -/// class names. -fn strip_unknown_root_children(new: &mut WeakDom, old: &RojoTree) { - let old_root = old.root(); - let old_root_children: HashMap<&str, InstanceWithMeta> = old_root - .children() - .iter() - .map(|referent| { - let inst = old - .get_instance(*referent) - .expect("all children of a DOM's root should exist"); - (inst.name(), inst) - }) - .collect(); - - let root_children = new.root().children().to_vec(); - - for child_ref in root_children { - let child = new - .get_by_ref(child_ref) - .expect("all children of the root should exist in the DOM"); - if let Some(old) = old_root_children.get(child.name.as_str()) { - if old.class_name() == child.class { - continue; - } - } - log::trace!("Pruning root child {} of class {}", child.name, child.class); - new.destroy(child_ref); - } -} - -#[cfg(test)] -mod test { - use super::*; - - fn rules(ignore_paths: &[&str], create_ignore_dir_paths: Option) -> SyncbackRules { - SyncbackRules { - ignore_trees: Vec::new(), - ignore_paths: ignore_paths.iter().map(|s| s.to_string()).collect(), - ignore_properties: IndexMap::new(), - sync_current_camera: None, - sync_unscriptable: None, - ignore_referents: None, - create_ignore_dir_paths, - } - } - - #[test] - fn ignore_paths_negation() { - let globs = Some( - rules(&["**/*.lua", "!keep.lua"], Some(false)) - .compile_globs() - .unwrap(), - ); - let base = Path::new("/test"); - - // A later negation re-includes a path matched by an earlier pattern. - assert!(!is_valid_path(&globs, base, Path::new("/test/foo.lua"))); - assert!(is_valid_path(&globs, base, Path::new("/test/keep.lua"))); - // Paths matched by no rule are valid. - assert!(is_valid_path(&globs, base, Path::new("/test/plain.txt"))); - } - - #[test] - fn ignore_paths_negation_with_dir_expansion() { - // With `create_ignore_dir_paths`, a negated `foo/**` pattern should also - // re-include the `foo` directory itself, mirroring the file rule. - let globs = Some( - rules(&["**/*", "!keep/**"], Some(true)) - .compile_globs() - .unwrap(), - ); - let base = Path::new("/test"); - - assert!(!is_valid_path(&globs, base, Path::new("/test/drop/a.lua"))); - assert!(is_valid_path(&globs, base, Path::new("/test/keep"))); - assert!(is_valid_path(&globs, base, Path::new("/test/keep/a.lua"))); - } - - #[test] - fn ignore_paths_escaped_bang_is_literal() { - // `\!literal.lua` should ignore a file literally named `!literal.lua` - // rather than being parsed as a negation. - let globs = Some( - rules(&[r"\!literal.lua"], Some(false)) - .compile_globs() - .unwrap(), - ); - let base = Path::new("/test"); - - assert!(!globs.as_ref().unwrap()[0].is_negation()); - assert!(!is_valid_path( - &globs, - base, - Path::new("/test/!literal.lua") - )); - } -} diff --git a/src/syncback/property_filter.rs b/src/syncback/property_filter.rs deleted file mode 100644 index 359e3f30..00000000 --- a/src/syncback/property_filter.rs +++ /dev/null @@ -1,111 +0,0 @@ -use rbx_dom_weak::{types::Variant, Instance, Ustr, UstrMap}; -use rbx_reflection::{PropertyKind, PropertySerialization, Scriptability}; - -use crate::{variant_eq::variant_eq, Project}; - -/// Returns a map of properties from `inst` that are both allowed under the -/// user-provided settings, are not their default value, and serialize. -pub fn filter_properties<'inst>( - project: &Project, - inst: &'inst Instance, -) -> UstrMap<&'inst Variant> { - let mut map: Vec<(Ustr, &Variant)> = Vec::with_capacity(inst.properties.len()); - filter_properties_preallocated(project, inst, &mut map); - - map.into_iter().collect() -} - -/// Fills `allocation` with a list of properties from `inst` that are -/// user-provided settings, are not their default value, and serialize. -pub fn filter_properties_preallocated<'inst>( - project: &Project, - inst: &'inst Instance, - allocation: &mut Vec<(Ustr, &'inst Variant)>, -) { - let sync_unscriptable = project - .syncback_rules - .as_ref() - .and_then(|s| s.sync_unscriptable) - .unwrap_or(true); - - let class_data = rbx_reflection_database::get() - .unwrap() - .classes - .get(inst.class.as_str()); - - let predicate = |prop_name: &Ustr, prop_value: &Variant| { - // We don't want to serialize Ref or UniqueId properties in JSON files - if matches!(prop_value, Variant::Ref(_) | Variant::UniqueId(_)) { - return true; - } - if !should_property_serialize(&inst.class, prop_name) { - return true; - } - if !sync_unscriptable { - if let Some(data) = class_data { - if let Some(prop_data) = data.properties.get(prop_name.as_str()) { - if matches!(prop_data.scriptability, Scriptability::None) { - return true; - } - } - } - } - false - }; - - if let Some(class_data) = class_data { - let defaults = &class_data.default_properties; - for (name, value) in &inst.properties { - if predicate(name, value) { - continue; - } - if let Some(default) = defaults.get(name.as_str()) { - if !variant_eq(value, default) { - allocation.push((*name, value)); - } - } else { - allocation.push((*name, value)); - } - } - } else { - for (name, value) in &inst.properties { - if predicate(name, value) { - continue; - } - allocation.push((*name, value)); - } - } -} - -fn should_property_serialize(class_name: &str, prop_name: &str) -> bool { - let database = rbx_reflection_database::get().unwrap(); - let mut current_class_name = class_name; - - loop { - let class_data = match database.classes.get(current_class_name) { - Some(data) => data, - None => return true, - }; - if let Some(data) = class_data.properties.get(prop_name) { - log::trace!("found {class_name}.{prop_name} on {current_class_name}"); - return match &data.kind { - // It's not really clear if this can ever happen but I want to - // support it just in case! - PropertyKind::Alias { alias_for } => { - should_property_serialize(current_class_name, alias_for) - } - // Migrations and aliases are happily handled for us by parsers - // so we don't really need to handle them. - PropertyKind::Canonical { serialization } => { - !matches!(serialization, PropertySerialization::DoesNotSerialize) - } - kind => unimplemented!("unknown property kind {kind:?}"), - }; - } else if let Some(super_class) = class_data.superclass { - current_class_name = super_class; - } else { - break; - } - } - true -} diff --git a/src/syncback/ref_properties.rs b/src/syncback/ref_properties.rs deleted file mode 100644 index 94d7ffdf..00000000 --- a/src/syncback/ref_properties.rs +++ /dev/null @@ -1,205 +0,0 @@ -//! Implements iterating through an entire WeakDom and linking all Ref -//! properties using attributes. - -use std::collections::{HashMap, HashSet, VecDeque}; - -use rbx_dom_weak::{ - types::{Attributes, Ref, UniqueId, Variant}, - ustr, Instance, Ustr, WeakDom, -}; - -use crate::syncback::snapshot::inst_path; -use crate::{multimap::MultiMap, REF_ID_ATTRIBUTE_NAME, REF_POINTER_ATTRIBUTE_PREFIX}; - -pub struct RefLinks { - /// A map of referents to each of their Ref properties. - prop_links: MultiMap, - /// A set of referents that need their ID rewritten. This includes - /// Instances that have no existing ID. - need_rewrite: HashSet, -} - -#[derive(PartialEq, Eq)] -struct RefLink { - /// The name of a property - name: Ustr, - /// The value of the property. - value: Ref, -} - -/// Iterates through a WeakDom and collects referent properties. -/// -/// They can be linked to a dom later using `link_referents`. -pub fn collect_referents(dom: &WeakDom) -> RefLinks { - let mut ids = HashMap::new(); - let mut need_rewrite = HashSet::new(); - let mut links = MultiMap::new(); - - // Note that this is back-in, front-out. This is important because - // VecDeque::extend is the equivalent to using push_back. - let mut queue = VecDeque::new(); - queue.push_back(dom.root_ref()); - while let Some(inst_ref) = queue.pop_front() { - let pointer = dom.get_by_ref(inst_ref).unwrap(); - queue.extend(pointer.children().iter().copied()); - - for (prop_name, prop_value) in &pointer.properties { - let Variant::Ref(prop_value) = prop_value else { - continue; - }; - if prop_value.is_none() { - continue; - } - - let target = match dom.get_by_ref(*prop_value) { - Some(inst) => inst, - None => { - // Properties that are Some but point to nothing may as - // well be `nil`. Roblox and us never produce these values - // but syncback prunes trees without adjusting ref - // properties for performance reasons. - log::warn!( - "Property {}.{} will be `nil` on the disk because the actual value is not being included in syncback", - inst_path(dom, inst_ref), - prop_name - ); - continue; - } - }; - - links.insert( - inst_ref, - RefLink { - name: *prop_name, - value: *prop_value, - }, - ); - - // 1. Check if target has an ID - if let Some(id) = get_existing_id(target) { - // If it does, we need to check whether that ID is a duplicate - if let Some(id_ref) = ids.get(id) { - // If the same ID points to a new Instance, rewrite it. - if id_ref != prop_value { - if log::log_enabled!(log::Level::Trace) { - log::trace!( - "{} needs an id rewritten because it has the same id as {}", - target.name, - dom.get_by_ref(*id_ref).unwrap().name - ); - } - need_rewrite.insert(*prop_value); - } - } - ids.insert(id, *prop_value); - } else { - log::trace!("{} needs an id rewritten because it has no id but is referred to by {}.{prop_name}", target.name, pointer.name); - // If it does not, it needs one. - need_rewrite.insert(*prop_value); - } - } - } - - RefLinks { - need_rewrite, - prop_links: links, - } -} - -pub fn link_referents(links: RefLinks, dom: &mut WeakDom) -> anyhow::Result<()> { - write_id_attributes(&links, dom)?; - - let mut prop_list = Vec::new(); - - for (inst_id, properties) in links.prop_links { - for ref_link in properties { - let prop_inst = match dom.get_by_ref(ref_link.value) { - Some(inst) => inst, - None => continue, - }; - let id = get_existing_id(prop_inst) - .expect("all Instances that are pointed to should have an ID"); - prop_list.push((ref_link.name, Variant::String(id.to_owned()))); - } - let inst = match dom.get_by_ref_mut(inst_id) { - Some(inst) => inst, - None => continue, - }; - - let mut attributes: Attributes = match inst.properties.remove(&ustr("Attributes")) { - Some(Variant::Attributes(attrs)) => attrs, - None => Attributes::new(), - Some(value) => { - anyhow::bail!( - "expected Attributes to be of type 'Attributes' but it was of type '{:?}'", - value.ty() - ); - } - } - .into_iter() - .filter(|(name, _)| !name.starts_with(REF_POINTER_ATTRIBUTE_PREFIX)) - .collect(); - - for (prop_name, prop_value) in prop_list.drain(..) { - attributes.insert( - format!("{REF_POINTER_ATTRIBUTE_PREFIX}{prop_name}"), - prop_value, - ); - } - - inst.properties - .insert("Attributes".into(), attributes.into()); - } - - Ok(()) -} - -fn write_id_attributes(links: &RefLinks, dom: &mut WeakDom) -> anyhow::Result<()> { - for referent in &links.need_rewrite { - let inst = match dom.get_by_ref_mut(*referent) { - Some(inst) => inst, - None => continue, - }; - let unique_id = match inst.properties.get(&ustr("UniqueId")) { - Some(Variant::UniqueId(id)) => Some(*id), - _ => None, - } - .unwrap_or_else(|| UniqueId::now().unwrap()); - - let attributes = match inst.properties.get_mut(&ustr("Attributes")) { - Some(Variant::Attributes(attrs)) => attrs, - None => { - inst.properties - .insert("Attributes".into(), Attributes::new().into()); - match inst.properties.get_mut(&ustr("Attributes")) { - Some(Variant::Attributes(attrs)) => attrs, - _ => unreachable!(), - } - } - Some(value) => { - anyhow::bail!( - "expected Attributes to be of type 'Attributes' but it was of type '{:?}'", - value.ty() - ); - } - }; - attributes.insert( - REF_ID_ATTRIBUTE_NAME.into(), - Variant::String(unique_id.to_string()), - ); - } - Ok(()) -} - -fn get_existing_id(inst: &Instance) -> Option<&str> { - if let Variant::Attributes(attrs) = inst.properties.get(&ustr("Attributes"))? { - let id = attrs.get(REF_ID_ATTRIBUTE_NAME)?; - match id { - Variant::String(str) => Some(str), - Variant::BinaryString(bstr) => std::str::from_utf8(bstr.as_ref()).ok(), - _ => None, - } - } else { - None - } -} diff --git a/src/syncback/snapshot.rs b/src/syncback/snapshot.rs deleted file mode 100644 index bc10e76a..00000000 --- a/src/syncback/snapshot.rs +++ /dev/null @@ -1,247 +0,0 @@ -use indexmap::IndexMap; -use memofs::Vfs; -use std::path::{Path, PathBuf}; - -use crate::{ - snapshot::{InstanceWithMeta, RojoTree}, - snapshot_middleware::Middleware, - Project, -}; -use rbx_dom_weak::{ - types::{Ref, Variant}, - Instance, Ustr, UstrMap, WeakDom, -}; - -use super::{get_best_middleware, name_for_inst, property_filter::filter_properties}; - -#[derive(Clone, Copy)] -pub struct SyncbackData<'sync> { - pub(super) vfs: &'sync Vfs, - pub(super) old_tree: &'sync RojoTree, - pub(super) new_tree: &'sync WeakDom, - pub(super) project: &'sync Project, -} - -pub struct SyncbackSnapshot<'sync> { - pub data: SyncbackData<'sync>, - pub old: Option, - pub new: Ref, - pub path: PathBuf, - pub middleware: Option, -} - -impl<'sync> SyncbackSnapshot<'sync> { - /// Constructs a SyncbackSnapshot from the provided refs - /// while inheriting this snapshot's path and data. This should be used for - /// directories. - #[inline] - pub fn with_joined_path(&self, new_ref: Ref, old_ref: Option) -> anyhow::Result { - let mut snapshot = Self { - data: self.data, - old: old_ref, - new: new_ref, - path: PathBuf::new(), - middleware: None, - }; - let middleware = get_best_middleware(&snapshot); - let name = name_for_inst(middleware, snapshot.new_inst(), snapshot.old_inst())?; - snapshot.path = self.path.join(name.as_ref()); - - Ok(snapshot) - } - - /// Constructs a SyncbackSnapshot from the provided refs and a base path, - /// while inheriting this snapshot's data. - /// - /// The actual path of the snapshot is made by getting a file name for the - /// snapshot and then appending it to the provided base path. - #[inline] - pub fn with_base_path( - &self, - base_path: &Path, - new_ref: Ref, - old_ref: Option, - ) -> anyhow::Result { - let mut snapshot = Self { - data: self.data, - old: old_ref, - new: new_ref, - path: PathBuf::new(), - middleware: None, - }; - let middleware = get_best_middleware(&snapshot); - let name = name_for_inst(middleware, snapshot.new_inst(), snapshot.old_inst())?; - snapshot.path = base_path.join(name.as_ref()); - - Ok(snapshot) - } - - /// Constructs a SyncbackSnapshot with the provided path and refs while - /// inheriting the data of the this snapshot. - #[inline] - pub fn with_new_path(&self, path: PathBuf, new_ref: Ref, old_ref: Option) -> Self { - Self { - data: self.data, - old: old_ref, - new: new_ref, - path, - middleware: None, - } - } - - /// Allows a middleware to be 'forced' onto a SyncbackSnapshot to override - /// the attempts to derive it. - #[inline] - pub fn middleware(mut self, middleware: Middleware) -> Self { - self.middleware = Some(middleware); - self - } - - /// Returns a map of properties for an Instance from the 'new' tree - /// with filtering done to avoid noise. This method filters out properties - /// that are not meant to be present in Instances that are represented - /// specially by a path, like `LocalScript.Source` and `StringValue.Value`. - /// - /// This method is not necessary or desired for blobs like Rbxm or non-path - /// middlewares like JsonModel. - #[inline] - #[must_use] - pub fn get_path_filtered_properties(&self, new_ref: Ref) -> Option> { - let inst = self.get_new_instance(new_ref)?; - - // The only filtering we have to do is filter out properties that are - // special-cased in some capacity. - let properties = filter_properties(self.data.project, inst) - .into_iter() - .filter(|(name, _)| !filter_out_property(inst, name)) - .collect(); - - Some(properties) - } - - /// Returns a path to the provided Instance in the new DOM. This path is - /// where you would look for the object in Roblox Studio. - #[inline] - pub fn get_new_inst_path(&self, referent: Ref) -> String { - inst_path(self.new_tree(), referent) - } - - /// Returns a path to the provided Instance in the old DOM. This path is - /// where you would look for the object in Roblox Studio. - #[inline] - pub fn get_old_inst_path(&self, referent: Ref) -> String { - inst_path(self.old_tree(), referent) - } - - /// Returns an Instance from the old tree with the provided referent, if it - /// exists. - #[inline] - pub fn get_old_instance(&self, referent: Ref) -> Option> { - self.data.old_tree.get_instance(referent) - } - - /// Returns an Instance from the new tree with the provided referent, if it - /// exists. - #[inline] - pub fn get_new_instance(&self, referent: Ref) -> Option<&'sync Instance> { - self.data.new_tree.get_by_ref(referent) - } - - /// The 'old' Instance this snapshot is for, if it exists. - #[inline] - pub fn old_inst(&self) -> Option> { - self.old - .and_then(|old| self.data.old_tree.get_instance(old)) - } - - /// The 'new' Instance this snapshot is for. - #[inline] - pub fn new_inst(&self) -> &'sync Instance { - self.data - .new_tree - .get_by_ref(self.new) - .expect("SyncbackSnapshot should not contain invalid referents") - } - - /// Returns the root Project that was used to make this snapshot. - #[inline] - pub fn project(&self) -> &'sync Project { - self.data.project - } - - /// Returns the underlying VFS being used for syncback. - #[inline] - pub fn vfs(&self) -> &'sync Vfs { - self.data.vfs - } - - /// Returns the WeakDom used for the 'new' tree. - #[inline] - pub fn new_tree(&self) -> &'sync WeakDom { - self.data.new_tree - } - - /// Returns the WeakDom used for the 'old' tree. - #[inline] - pub fn old_tree(&self) -> &'sync WeakDom { - self.data.old_tree.inner() - } - - /// Returns user-specified property ignore rules. - #[inline] - pub fn ignore_props(&self) -> Option<&IndexMap>> { - self.data - .project - .syncback_rules - .as_ref() - .map(|rules| &rules.ignore_properties) - } - - /// Returns user-specified ignore tree. - #[inline] - pub fn ignore_tree(&self) -> Option<&[String]> { - self.data - .project - .syncback_rules - .as_ref() - .map(|rules| rules.ignore_trees.as_slice()) - } -} - -pub fn filter_out_property(inst: &Instance, prop_name: &str) -> bool { - match inst.class.as_str() { - "Script" | "LocalScript" | "ModuleScript" => { - // These properties shouldn't be set by scripts that are created via - // `$path` or via being on the file system. - prop_name == "Source" || prop_name == "ScriptGuid" - } - "LocalizationTable" => prop_name == "Contents", - "StringValue" => prop_name == "Value", - _ => false, - } -} - -pub fn inst_path(dom: &WeakDom, referent: Ref) -> String { - dom.full_path_of(referent, "/") -} - -#[cfg(test)] -mod test { - use rbx_dom_weak::{InstanceBuilder, WeakDom}; - - use super::inst_path as inst_path_outer; - - #[test] - fn inst_path() { - let mut new_tree = WeakDom::new(InstanceBuilder::new("ROOT")); - - let child_1 = new_tree.insert(new_tree.root_ref(), InstanceBuilder::new("Child1")); - let child_2 = new_tree.insert(child_1, InstanceBuilder::new("Child2")); - let child_3 = new_tree.insert(child_2, InstanceBuilder::new("Child3")); - - assert_eq!(inst_path_outer(&new_tree, new_tree.root_ref()), ""); - assert_eq!(inst_path_outer(&new_tree, child_1), "Child1"); - assert_eq!(inst_path_outer(&new_tree, child_2), "Child1/Child2"); - assert_eq!(inst_path_outer(&new_tree, child_3), "Child1/Child2/Child3"); - } -} diff --git a/src/tree_view.rs b/src/tree_view.rs index e2ff9077..f6f05ad6 100644 --- a/src/tree_view.rs +++ b/src/tree_view.rs @@ -1,10 +1,9 @@ //! Utiilty that helps redact nondeterministic information from trees so that //! they can be part of snapshot tests. -use rbx_dom_weak::{ - types::{Ref, Variant}, - Ustr, UstrMap, -}; +use std::collections::HashMap; + +use rbx_dom_weak::types::{Ref, Variant}; use rojo_insta_ext::RedactionMap; use serde::Serialize; @@ -35,8 +34,8 @@ pub fn intern_tree(tree: &RojoTree, redactions: &mut RedactionMap) { struct InstanceView { id: Ref, name: String, - class_name: Ustr, - properties: UstrMap, + class_name: String, + properties: HashMap, metadata: InstanceMetadata, children: Vec, } @@ -47,7 +46,7 @@ fn extract_instance_view(tree: &RojoTree, id: Ref) -> InstanceView { InstanceView { id: instance.id(), name: instance.name().to_owned(), - class_name: instance.class_name(), + class_name: instance.class_name().to_owned(), properties: instance.properties().clone(), metadata: instance.metadata().clone(), children: instance diff --git a/src/variant_eq.rs b/src/variant_eq.rs deleted file mode 100644 index ae3ca20d..00000000 --- a/src/variant_eq.rs +++ /dev/null @@ -1,192 +0,0 @@ -use rbx_dom_weak::types::{PhysicalProperties, Variant, Vector3}; - -/// Accepts three argumets: a float type and two values to compare. -/// -/// Returns a bool indicating whether they're equal. This accounts for NaN such -/// that `approx_eq!(f32, f32::NAN, f32::NAN)` is `true`. -macro_rules! approx_eq { - ($Ty:ty, $a:expr, $b:expr) => { - float_cmp::approx_eq!($Ty, $a, $b) || $a.is_nan() && $b.is_nan() - }; -} - -/// Compares two variants to determine if they're equal. This correctly takes -/// float comparisons into account. -pub fn variant_eq(variant_a: &Variant, variant_b: &Variant) -> bool { - if variant_a.ty() != variant_b.ty() { - return false; - } - - match (variant_a, variant_b) { - (Variant::Attributes(a), Variant::Attributes(b)) => { - // If they're not the same size, we can just abort - if a.len() != b.len() { - return false; - } - - // Since Attributes are stored with a BTreeMap, the keys are sorted - // and we can compare each map's keys in order. - for ((a_name, a_value), (b_name, b_value)) in a.iter().zip(b.iter()) { - if !(a_name == b_name && variant_eq(a_value, b_value)) { - return false; - } - } - - true - } - (Variant::Axes(a), Variant::Axes(b)) => a == b, - (Variant::BinaryString(a), Variant::BinaryString(b)) => a == b, - (Variant::Bool(a), Variant::Bool(b)) => a == b, - (Variant::BrickColor(a), Variant::BrickColor(b)) => a == b, - (Variant::CFrame(a), Variant::CFrame(b)) => { - vector_eq(&a.position, &b.position) - && vector_eq(&a.orientation.x, &b.orientation.x) - && vector_eq(&a.orientation.y, &b.orientation.y) - && vector_eq(&a.orientation.z, &b.orientation.z) - } - (Variant::Color3(a), Variant::Color3(b)) => { - approx_eq!(f32, a.r, b.r) && approx_eq!(f32, a.g, b.g) && approx_eq!(f32, a.b, b.b) - } - (Variant::Color3uint8(a), Variant::Color3uint8(b)) => a == b, - (Variant::ColorSequence(a), Variant::ColorSequence(b)) => { - if a.keypoints.len() != b.keypoints.len() { - return false; - } - let mut a_keypoints: Vec<_> = a.keypoints.iter().collect(); - let mut b_keypoints: Vec<_> = b.keypoints.iter().collect(); - a_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - b_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - - for (a_kp, b_kp) in a_keypoints.iter().zip(b_keypoints) { - if !(approx_eq!(f32, a_kp.time, b_kp.time) - && approx_eq!(f32, a_kp.color.r, b_kp.color.r) - && approx_eq!(f32, a_kp.color.g, b_kp.color.g) - && approx_eq!(f32, a_kp.color.b, b_kp.color.b)) - { - return false; - } - } - true - } - (Variant::Content(a), Variant::Content(b)) => a == b, - (Variant::ContentId(a), Variant::ContentId(b)) => a == b, - (Variant::Enum(a), Variant::Enum(b)) => a == b, - (Variant::EnumItem(a), Variant::EnumItem(b)) => a == b, - (Variant::Faces(a), Variant::Faces(b)) => a == b, - (Variant::Float32(a), Variant::Float32(b)) => approx_eq!(f32, *a, *b), - (Variant::Float64(a), Variant::Float64(b)) => approx_eq!(f64, *a, *b), - (Variant::Font(a), Variant::Font(b)) => { - a.weight == b.weight - && a.style == b.style - && a.family == b.family - && a.cached_face_id == b.cached_face_id - } - (Variant::Int32(a), Variant::Int32(b)) => a == b, - (Variant::Int64(a), Variant::Int64(b)) => a == b, - (Variant::MaterialColors(a), Variant::MaterialColors(b)) => a.encode() == b.encode(), - (Variant::NetAssetRef(a), Variant::NetAssetRef(b)) => a == b, - (Variant::NumberRange(a), Variant::NumberRange(b)) => { - approx_eq!(f32, a.max, b.max) && approx_eq!(f32, a.min, b.min) - } - (Variant::NumberSequence(a), Variant::NumberSequence(b)) => { - if a.keypoints.len() != b.keypoints.len() { - return false; - } - let mut a_keypoints: Vec<_> = a.keypoints.iter().collect(); - let mut b_keypoints: Vec<_> = b.keypoints.iter().collect(); - a_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - b_keypoints.sort_unstable_by(|k1, k2| k1.time.partial_cmp(&k2.time).unwrap()); - - for (a_kp, b_kp) in a_keypoints.iter().zip(b_keypoints) { - if !(approx_eq!(f32, a_kp.time, b_kp.time) - && approx_eq!(f32, a_kp.value, b_kp.value) - && approx_eq!(f32, a_kp.envelope, b_kp.envelope)) - { - return false; - } - } - true - } - (Variant::OptionalCFrame(a), Variant::OptionalCFrame(b)) => match (a, b) { - (Some(a), Some(b)) => { - vector_eq(&a.position, &b.position) - && vector_eq(&a.orientation.x, &b.orientation.x) - && vector_eq(&a.orientation.y, &b.orientation.y) - && vector_eq(&a.orientation.z, &b.orientation.z) - } - (None, None) => true, - _ => false, - }, - (Variant::PhysicalProperties(a), Variant::PhysicalProperties(b)) => match (a, b) { - (PhysicalProperties::Default, PhysicalProperties::Default) => true, - (PhysicalProperties::Custom(a2), PhysicalProperties::Custom(b2)) => { - approx_eq!(f32, a2.density(), b2.density()) - && approx_eq!(f32, a2.elasticity(), b2.elasticity()) - && approx_eq!(f32, a2.friction(), b2.friction()) - && approx_eq!(f32, a2.elasticity_weight(), b2.elasticity_weight()) - && approx_eq!(f32, a2.friction_weight(), b2.friction_weight()) - && approx_eq!(f32, a2.acoustic_absorption(), b2.acoustic_absorption()) - } - _ => false, - }, - (Variant::Ray(a), Variant::Ray(b)) => { - vector_eq(&a.direction, &b.direction) && vector_eq(&a.origin, &b.origin) - } - (Variant::Rect(a), Variant::Rect(b)) => { - approx_eq!(f32, a.max.x, b.max.x) - && approx_eq!(f32, a.max.y, b.max.y) - && approx_eq!(f32, a.min.x, b.min.x) - && approx_eq!(f32, a.min.y, b.min.y) - } - (Variant::Ref(a), Variant::Ref(b)) => a == b, - (Variant::Region3(a), Variant::Region3(b)) => { - vector_eq(&a.max, &b.max) && vector_eq(&a.min, &b.min) - } - (Variant::Region3int16(a), Variant::Region3int16(b)) => a == b, - (Variant::SecurityCapabilities(a), Variant::SecurityCapabilities(b)) => a == b, - (Variant::SharedString(a), Variant::SharedString(b)) => a == b, - (Variant::Tags(a), Variant::Tags(b)) => { - let mut a_sorted: Vec<&str> = a.iter().collect(); - let mut b_sorted: Vec<&str> = b.iter().collect(); - if a_sorted.len() == b_sorted.len() { - a_sorted.sort_unstable(); - b_sorted.sort_unstable(); - for (a_tag, b_tag) in a_sorted.into_iter().zip(b_sorted) { - if a_tag != b_tag { - return false; - } - } - true - } else { - false - } - } - (Variant::UDim(a), Variant::UDim(b)) => { - approx_eq!(f32, a.scale, b.scale) && a.offset == b.offset - } - (Variant::UDim2(a), Variant::UDim2(b)) => { - approx_eq!(f32, a.x.scale, b.x.scale) - && a.x.offset == b.x.offset - && approx_eq!(f32, a.y.scale, b.y.scale) - && a.y.offset == b.y.offset - } - (Variant::UniqueId(a), Variant::UniqueId(b)) => a == b, - (Variant::String(a), Variant::String(b)) => a == b, - (Variant::Vector2(a), Variant::Vector2(b)) => { - approx_eq!(f32, a.x, b.x) && approx_eq!(f32, a.y, b.y) - } - (Variant::Vector2int16(a), Variant::Vector2int16(b)) => a == b, - (Variant::Vector3(a), Variant::Vector3(b)) => vector_eq(a, b), - (Variant::Vector3int16(a), Variant::Vector3int16(b)) => a == b, - (a, b) => panic!( - "unsupport variant comparison: {:?} and {:?}", - a.ty(), - b.ty() - ), - } -} - -#[inline(always)] -fn vector_eq(a: &Vector3, b: &Vector3) -> bool { - approx_eq!(f32, a.x, b.x) && approx_eq!(f32, a.y, b.y) && approx_eq!(f32, a.z, b.z) -} diff --git a/src/web/api.rs b/src/web/api.rs index 4fd21c0a..93b1ccb0 100644 --- a/src/web/api.rs +++ b/src/web/api.rs @@ -1,67 +1,42 @@ //! Defines Rojo's HTTP API, all under /api. These endpoints generally return //! JSON. -use std::{collections::HashMap, fs, net::SocketAddr, path::PathBuf, str::FromStr, sync::Arc}; +use std::{collections::HashMap, fs, path::PathBuf, str::FromStr, sync::Arc}; -use futures::{sink::SinkExt, stream::StreamExt}; use hyper::{body, Body, Method, Request, Response, StatusCode}; -use hyper_tungstenite::{is_upgrade_request, tungstenite::Message, upgrade, HyperWebsocket}; -use opener::OpenError; -use rbx_dom_weak::{ - types::{Ref, Variant}, - InstanceBuilder, UstrMap, WeakDom, -}; +use rbx_dom_weak::types::Ref; use crate::{ serve_session::ServeSession, snapshot::{InstanceWithMeta, PatchSet, PatchUpdate}, web::{ interface::{ - ErrorResponse, Instance, MessagesPacket, OpenResponse, ReadResponse, - ServerInfoResponse, SocketPacket, SocketPacketBody, SocketPacketType, SubscribeMessage, - WriteRequest, WriteResponse, PROTOCOL_VERSION, SERVER_VERSION, + ErrorResponse, Instance, OpenResponse, ReadResponse, ServerInfoResponse, + SubscribeMessage, SubscribeResponse, WriteRequest, WriteResponse, PROTOCOL_VERSION, + SERVER_VERSION, }, - origin::canonical, - util::{deserialize_msgpack, msgpack, msgpack_ok, serialize_msgpack}, - }, - web_api::{ - InstanceUpdate, RefPatchRequest, RefPatchResponse, SerializeRequest, SerializeResponse, + util::{json, json_ok}, }, }; -pub async fn call( - serve_session: Arc, - remote_addr: SocketAddr, - mut request: Request, -) -> Response { - let service = ApiService::new(serve_session, remote_addr); +pub async fn call(serve_session: Arc, request: Request) -> Response { + let service = ApiService::new(serve_session); match (request.method(), request.uri().path()) { (&Method::GET, "/api/rojo") => service.handle_api_rojo().await, (&Method::GET, path) if path.starts_with("/api/read/") => { service.handle_api_read(request).await } - (&Method::GET, path) if path.starts_with("/api/socket/") => { - if is_upgrade_request(&request) { - service.handle_api_socket(&mut request).await - } else { - msgpack( - ErrorResponse::bad_request( - "/api/socket must be called as a websocket upgrade request", - ), - StatusCode::BAD_REQUEST, - ) - } + (&Method::GET, path) if path.starts_with("/api/subscribe/") => { + service.handle_api_subscribe(request).await } - (&Method::POST, "/api/serialize") => service.handle_api_serialize(request).await, - (&Method::POST, "/api/ref-patch") => service.handle_api_ref_patch(request).await, - (&Method::POST, path) if path.starts_with("/api/open/") => { service.handle_api_open(request).await } + (&Method::POST, "/api/write") => service.handle_api_write(request).await, - (_method, path) => msgpack( + (_method, path) => json( ErrorResponse::not_found(format!("Route not found: {}", path)), StatusCode::NOT_FOUND, ), @@ -70,15 +45,11 @@ pub async fn call( pub struct ApiService { serve_session: Arc, - remote_addr: SocketAddr, } impl ApiService { - pub fn new(serve_session: Arc, remote_addr: SocketAddr) -> Self { - ApiService { - serve_session, - remote_addr, - } + pub fn new(serve_session: Arc) -> Self { + ApiService { serve_session } } /// Get a summary of information about the server @@ -86,55 +57,62 @@ impl ApiService { let tree = self.serve_session.tree(); let root_instance_id = tree.get_root_id(); - msgpack_ok(&ServerInfoResponse { + json_ok(&ServerInfoResponse { server_version: SERVER_VERSION.to_owned(), protocol_version: PROTOCOL_VERSION, session_id: self.serve_session.session_id(), project_name: self.serve_session.project_name().to_owned(), expected_place_ids: self.serve_session.serve_place_ids().cloned(), - unexpected_place_ids: self.serve_session.blocked_place_ids().cloned(), place_id: self.serve_session.place_id(), game_id: self.serve_session.game_id(), root_instance_id, }) } - /// Handle WebSocket upgrade for real-time message streaming - async fn handle_api_socket(&self, request: &mut Request) -> Response { - let argument = &request.uri().path()["/api/socket/".len()..]; + /// Retrieve any messages past the given cursor index, and if + /// there weren't any, subscribe to receive any new messages. + async fn handle_api_subscribe(&self, request: Request) -> Response { + let argument = &request.uri().path()["/api/subscribe/".len()..]; let input_cursor: u32 = match argument.parse() { Ok(v) => v, Err(err) => { - return msgpack( + return json( ErrorResponse::bad_request(format!("Malformed message cursor: {}", err)), StatusCode::BAD_REQUEST, ); } }; - // Upgrade the connection to WebSocket - let (response, websocket) = match upgrade(request, None) { - Ok(result) => result, - Err(err) => { - return msgpack( - ErrorResponse::internal_error(format!("WebSocket upgrade failed: {}", err)), - StatusCode::INTERNAL_SERVER_ERROR, - ); + let session_id = self.serve_session.session_id(); + + let result = self + .serve_session + .message_queue() + .subscribe(input_cursor) + .await; + + let tree_handle = self.serve_session.tree_handle(); + + match result { + Ok((message_cursor, messages)) => { + let tree = tree_handle.lock().unwrap(); + + let api_messages = messages + .into_iter() + .map(|patch| SubscribeMessage::from_patch_update(&tree, patch)) + .collect(); + + json_ok(SubscribeResponse { + session_id, + message_cursor, + messages: api_messages, + }) } - }; - - let serve_session = Arc::clone(&self.serve_session); - - // Spawn a task to handle the WebSocket connection - tokio::spawn(async move { - if let Err(e) = - handle_websocket_subscription(serve_session, websocket, input_cursor).await - { - log::error!("Error in websocket subscription: {}", e); - } - }); - - response + Err(_) => json( + ErrorResponse::internal_error("Message queue disconnected sender"), + StatusCode::INTERNAL_SERVER_ERROR, + ), + } } async fn handle_api_write(&self, request: Request) -> Response { @@ -143,10 +121,10 @@ impl ApiService { let body = body::to_bytes(request.into_body()).await.unwrap(); - let request: WriteRequest = match deserialize_msgpack(&body) { + let request: WriteRequest = match serde_json::from_slice(&body) { Ok(request) => request, Err(err) => { - return msgpack( + return json( ErrorResponse::bad_request(format!("Invalid body: {}", err)), StatusCode::BAD_REQUEST, ); @@ -154,7 +132,7 @@ impl ApiService { }; if request.session_id != session_id { - return msgpack( + return json( ErrorResponse::bad_request("Wrong session ID"), StatusCode::BAD_REQUEST, ); @@ -180,7 +158,7 @@ impl ApiService { }) .unwrap(); - msgpack_ok(WriteResponse { session_id }) + json_ok(&WriteResponse { session_id }) } async fn handle_api_read(&self, request: Request) -> Response { @@ -190,7 +168,7 @@ impl ApiService { let requested_ids = match requested_ids { Ok(ids) => ids, Err(_) => { - return msgpack( + return json( ErrorResponse::bad_request("Malformed ID list"), StatusCode::BAD_REQUEST, ); @@ -214,178 +192,20 @@ impl ApiService { } } - msgpack_ok(ReadResponse { + json_ok(ReadResponse { session_id: self.serve_session.session_id(), message_cursor, instances, }) } - /// Accepts a list of IDs and returns them serialized as a binary model. - /// The model is sent in a schema that causes Roblox to deserialize it as - /// a Luau `buffer`. - /// - /// The returned model is a folder that contains ObjectValues with names - /// that correspond to the requested Instances. These values have their - /// `Value` property set to point to the requested Instance. - async fn handle_api_serialize(&self, request: Request) -> Response { - let session_id = self.serve_session.session_id(); - let body = body::to_bytes(request.into_body()).await.unwrap(); - - let request: SerializeRequest = match deserialize_msgpack(&body) { - Ok(request) => request, - Err(err) => { - return msgpack( - ErrorResponse::bad_request(format!("Invalid body: {}", err)), - StatusCode::BAD_REQUEST, - ); - } - }; - - if request.session_id != session_id { - return msgpack( - ErrorResponse::bad_request("Wrong session ID"), - StatusCode::BAD_REQUEST, - ); - } - - let mut response_dom = WeakDom::new(InstanceBuilder::new("Folder")); - - let tree = self.serve_session.tree(); - for id in &request.ids { - if let Some(instance) = tree.get_instance(*id) { - let clone = response_dom.insert( - Ref::none(), - InstanceBuilder::new(instance.class_name()) - .with_name(instance.name()) - .with_properties(instance.properties().clone()), - ); - let object_value = response_dom.insert( - response_dom.root_ref(), - InstanceBuilder::new("ObjectValue") - .with_name(id.to_string()) - .with_property("Value", clone), - ); - - let mut child_ref = clone; - if let Some(parent_class) = parent_requirements(&instance.class_name()) { - child_ref = - response_dom.insert(object_value, InstanceBuilder::new(parent_class)); - response_dom.transfer_within(clone, child_ref); - } - - response_dom.transfer_within(child_ref, object_value); - } else { - return msgpack( - ErrorResponse::bad_request(format!("provided id {id} is not in the tree")), - StatusCode::BAD_REQUEST, - ); - } - } - drop(tree); - - let mut source = Vec::new(); - rbx_binary::to_writer(&mut source, &response_dom, &[response_dom.root_ref()]).unwrap(); - - msgpack_ok(SerializeResponse { - session_id: self.serve_session.session_id(), - model_contents: source, - }) - } - - /// Returns a list of all referent properties that point towards the - /// provided IDs. Used because the plugin does not store a RojoTree, - /// and referent properties need to be updated after the serialize - /// endpoint is used. - async fn handle_api_ref_patch(self, request: Request) -> Response { - let session_id = self.serve_session.session_id(); - let body = body::to_bytes(request.into_body()).await.unwrap(); - - let request: RefPatchRequest = match deserialize_msgpack(&body) { - Ok(request) => request, - Err(err) => { - return msgpack( - ErrorResponse::bad_request(format!("Invalid body: {}", err)), - StatusCode::BAD_REQUEST, - ); - } - }; - - if request.session_id != session_id { - return msgpack( - ErrorResponse::bad_request("Wrong session ID"), - StatusCode::BAD_REQUEST, - ); - } - - let mut instance_updates: HashMap = HashMap::new(); - - let tree = self.serve_session.tree(); - for instance in tree.descendants(tree.get_root_id()) { - for (prop_name, prop_value) in instance.properties() { - let Variant::Ref(prop_value) = prop_value else { - continue; - }; - if let Some(target_id) = request.ids.get(prop_value) { - let instance_id = instance.id(); - let update = - instance_updates - .entry(instance_id) - .or_insert_with(|| InstanceUpdate { - id: instance_id, - changed_class_name: None, - changed_name: None, - changed_metadata: None, - changed_properties: UstrMap::default(), - }); - update - .changed_properties - .insert(*prop_name, Some(Variant::Ref(*target_id))); - } - } - } - - msgpack_ok(RefPatchResponse { - session_id: self.serve_session.session_id(), - patch: SubscribeMessage { - added: HashMap::new(), - removed: Vec::new(), - updated: instance_updates.into_values().collect(), - }, - }) - } - /// Open a script with the given ID in the user's default text editor. async fn handle_api_open(&self, request: Request) -> Response { - // Opening a file launches a local program, so it must never be reachable - // by a remote client even when the server is bound to an exposed address. - // - // `remote_addr` is the immediate peer, which is the best locality signal - // we have: the legitimate caller is a sandboxed Roblox plugin whose only - // credential is being able to reach the port, so there is no secret to - // authenticate it with. A connection forwarded over loopback by an - // SSH/Tailscale tunnel or a local reverse proxy therefore appears local - // and is allowed. That is delegated trust rather than a bypass: by - // standing up that tunnel or proxy the user has decided the remote end is - // trusted, and reachability is bounded by that hop's own authentication - // (e.g. SSH keys or Tailscale ACLs). This gate only stops direct, - // unauthenticated peers. - // - // An IPv4 client reaching a dual-stack (`::`) bind appears as an - // IPv4-mapped IPv6 peer (`::ffff:127.0.0.1`), so canonicalize to the bare - // IPv4 form before the loopback test, matching `origin`'s handling. - if !canonical(self.remote_addr.ip()).is_loopback() { - return msgpack( - ErrorResponse::forbidden("/api/open is only available to local clients"), - StatusCode::FORBIDDEN, - ); - } - let argument = &request.uri().path()["/api/open/".len()..]; let requested_id = match Ref::from_str(argument) { Ok(id) => id, Err(_) => { - return msgpack( + return json( ErrorResponse::bad_request("Invalid instance ID"), StatusCode::BAD_REQUEST, ); @@ -397,7 +217,7 @@ impl ApiService { let instance = match tree.get_instance(requested_id) { Some(instance) => instance, None => { - return msgpack( + return json( ErrorResponse::bad_request("Instance not found"), StatusCode::NOT_FOUND, ); @@ -407,7 +227,7 @@ impl ApiService { let script_path = match pick_script_path(instance) { Some(path) => path, None => { - return msgpack( + return json( ErrorResponse::bad_request( "No appropriate file could be found to open this script", ), @@ -416,65 +236,32 @@ impl ApiService { } }; - match opener::open(&script_path) { - Ok(()) => {} - Err(error) => match error { - OpenError::Io(io_error) => { - return msgpack( - ErrorResponse::internal_error(format!( - "Attempting to open {} failed because of the following io error: {}", - script_path.display(), - io_error - )), - StatusCode::INTERNAL_SERVER_ERROR, - ) - } - OpenError::ExitStatus { - cmd, - status, - stderr, - } => { - return msgpack( - ErrorResponse::internal_error(format!( - r#"The command '{}' to open '{}' failed with the error code '{}'. - Error logs: - {}"#, - cmd, - script_path.display(), - status, - stderr - )), - StatusCode::INTERNAL_SERVER_ERROR, - ) - } - }, - }; + let _ = opener::open(script_path); - msgpack_ok(OpenResponse { + json_ok(&OpenResponse { session_id: self.serve_session.session_id(), }) } } -/// If this instance is represented by a script, try to find the correct .lua or .luau +/// If this instance is represented by a script, try to find the correct .lua /// file to open to edit it. fn pick_script_path(instance: InstanceWithMeta<'_>) -> Option { - match instance.class_name().as_str() { + match instance.class_name() { "Script" | "LocalScript" | "ModuleScript" => {} _ => return None, } - // Pick the first listed relevant path that has an extension of .lua or .luau that + // Pick the first listed relevant path that has an extension of .lua that // exists. instance .metadata() .relevant_paths .iter() .find(|path| { - // We should only ever open Lua or Luau files to be safe. + // We should only ever open Lua files to be safe. match path.extension().and_then(|ext| ext.to_str()) { Some("lua") => {} - Some("luau") => {} _ => return false, } @@ -484,124 +271,3 @@ fn pick_script_path(instance: InstanceWithMeta<'_>) -> Option { }) .map(|path| path.to_owned()) } - -/// Handle WebSocket connection for streaming subscription messages -async fn handle_websocket_subscription( - serve_session: Arc, - websocket: HyperWebsocket, - input_cursor: u32, -) -> anyhow::Result<()> { - let mut websocket = websocket.await?; - - let session_id = serve_session.session_id(); - let tree_handle = serve_session.tree_handle(); - let message_queue = serve_session.message_queue(); - - log::debug!( - "WebSocket subscription established for session {}", - session_id - ); - - // Now continuously listen for new messages using select to handle both incoming messages - // and WebSocket control messages concurrently - let mut cursor = input_cursor; - loop { - let receiver = message_queue.subscribe(cursor); - - tokio::select! { - // Handle new messages from the message queue - result = receiver => { - match result { - Ok((new_cursor, messages)) => { - if !messages.is_empty() { - let msgpack_message = { - let tree = tree_handle.lock().unwrap(); - let api_messages = messages - .into_iter() - .map(|patch| SubscribeMessage::from_patch_update(&tree, patch)) - .collect(); - - let response = SocketPacket { - session_id, - packet_type: SocketPacketType::Messages, - body: SocketPacketBody::Messages(MessagesPacket { - message_cursor: new_cursor, - messages: api_messages, - }), - }; - - serialize_msgpack(response)? - }; - - log::debug!("Sending batch of messages over WebSocket subscription"); - - if websocket.send(Message::Binary(msgpack_message)).await.is_err() { - // Client disconnected - log::debug!("WebSocket subscription closed by client"); - break; - } - cursor = new_cursor; - } - } - Err(_) => { - // Message queue disconnected - log::debug!("Message queue disconnected; closing WebSocket subscription"); - let _ = websocket.send(Message::Close(None)).await; - break; - } - } - } - - // Handle incoming WebSocket messages (ping/pong/close) - msg = websocket.next() => { - match msg { - Some(Ok(Message::Close(_))) => { - log::debug!("WebSocket subscription closed by client"); - break; - } - Some(Ok(Message::Ping(data))) => { - // tungstenite handles pong automatically - log::debug!("Received ping: {:?}", data); - } - Some(Ok(Message::Pong(data))) => { - log::debug!("Received pong: {:?}", data); - } - Some(Ok(Message::Text(_))) | Some(Ok(Message::Binary(_))) => { - // Ignore text/binary messages from client for subscription endpoint - // TODO: Use this for bidirectional sync or requesting fallbacks? - log::debug!("Ignoring message from client since we don't use it for anything yet: {:?}", msg); - } - Some(Ok(Message::Frame(_))) => { - // This should never happen according to tungstenite docs - unreachable!(); - } - Some(Err(e)) => { - log::error!("WebSocket error: {}", e); - break; - } - None => { - // WebSocket stream ended - log::debug!("WebSocket stream ended"); - break; - } - } - } - } - } - - Ok(()) -} - -/// Certain Instances MUST be a child of specific classes. This function -/// tracks that information for the Serialize endpoint. -/// -/// If a parent requirement exists, it will be returned. -/// Otherwise returns `None`. -fn parent_requirements(class: &str) -> Option<&str> { - Some(match class { - "Attachment" | "Bone" => "Part", - "Animator" => "Humanoid", - "BaseWrap" | "WrapLayer" | "WrapTarget" | "WrapDeformer" => "MeshPart", - _ => return None, - }) -} diff --git a/src/web/assets.rs b/src/web/assets.rs index 39f0958b..37adbe13 100644 --- a/src/web/assets.rs +++ b/src/web/assets.rs @@ -29,13 +29,13 @@ macro_rules! declare_asset { declare_asset!(css, "../../assets/index.css"); pub fn logo() -> &'static [u8] { - static LOGO: &[u8] = include_bytes!("../../assets/brand_images/logo-512.png"); + static LOGO: &[u8] = include_bytes!("../../assets/logo-512.png"); LOGO } pub fn icon() -> &'static [u8] { - static ICON: &[u8] = include_bytes!("../../assets/brand_images/icon-32.png"); + static ICON: &[u8] = include_bytes!("../../assets/icon-32.png"); ICON } diff --git a/src/web/interface.rs b/src/web/interface.rs index 8ec332ed..28005057 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -7,12 +7,8 @@ use std::{ collections::{HashMap, HashSet}, }; -use rbx_dom_weak::{ - types::{Ref, Variant, VariantType}, - Ustr, UstrMap, -}; +use rbx_dom_weak::types::{Ref, Variant, VariantType}; use serde::{Deserialize, Serialize}; -use strum::Display; use crate::{ session_id::SessionId, @@ -25,7 +21,7 @@ use crate::{ pub(crate) const SERVER_VERSION: &str = env!("CARGO_PKG_VERSION"); /// Current protocol version, which is required to match. -pub const PROTOCOL_VERSION: u64 = 5; +pub const PROTOCOL_VERSION: u64 = 4; /// Message returned by Rojo API when a change has occurred. #[derive(Debug, Serialize, Deserialize)] @@ -88,12 +84,12 @@ impl<'a> SubscribeMessage<'a> { pub struct InstanceUpdate { pub id: Ref, pub changed_name: Option, - pub changed_class_name: Option, + pub changed_class_name: Option, - // TODO: Transform from UstrMap> to something else, since + // TODO: Transform from HashMap> to something else, since // null will get lost when decoding from JSON in some languages. #[serde(default)] - pub changed_properties: UstrMap>, + pub changed_properties: HashMap>, pub changed_metadata: Option, } @@ -117,26 +113,26 @@ pub struct Instance<'a> { pub id: Ref, pub parent: Ref, pub name: Cow<'a, str>, - pub class_name: Ustr, - pub properties: UstrMap>, + pub class_name: Cow<'a, str>, + pub properties: HashMap>, pub children: Cow<'a, [Ref]>, pub metadata: Option, } -impl Instance<'_> { +impl<'a> Instance<'a> { pub(crate) fn from_rojo_instance(source: InstanceWithMeta<'_>) -> Instance<'_> { let properties = source .properties() .iter() .filter(|(_key, value)| property_filter(Some(value))) - .map(|(key, value)| (*key, Cow::Borrowed(value))) + .map(|(key, value)| (key.clone(), Cow::Borrowed(value))) .collect(); Instance { id: source.id(), parent: source.parent(), name: Cow::Borrowed(source.name()), - class_name: source.class_name(), + class_name: Cow::Borrowed(source.class_name()), properties, children: Cow::Borrowed(source.children()), metadata: Some(InstanceMetadata::from_rojo_metadata(source.metadata())), @@ -149,7 +145,11 @@ fn property_filter(value: Option<&Variant>) -> bool { // Lua can't do anything with SharedString values. They also can't be // serialized directly by Serde! - ty != Some(VariantType::SharedString) + if ty == Some(VariantType::SharedString) { + return false; + } + + return true; } /// Response body from /api/rojo @@ -161,7 +161,6 @@ pub struct ServerInfoResponse { pub protocol_version: u64, pub project_name: String, pub expected_place_ids: Option>, - pub unexpected_place_ids: Option>, pub game_id: Option, pub place_id: Option, pub root_instance_id: Ref, @@ -193,44 +192,15 @@ pub struct WriteResponse { pub session_id: SessionId, } -/// Packet type enum for different websocket message types -#[derive(Debug, Serialize, Deserialize, Display, Eq, PartialEq)] -#[serde(rename_all = "camelCase")] -#[strum(serialize_all = "camelCase")] -pub enum SocketPacketType { - Messages, - // TODO: Can we cleanly use the socket for all communication? - // Serialize, - // RefPatch, -} - -/// Body content for messages packet type +/// Response body from /api/subscribe/{cursor} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct MessagesPacket<'a> { +pub struct SubscribeResponse<'a> { + pub session_id: SessionId, pub message_cursor: u32, pub messages: Vec>, } -/// Body content for different packet types -#[derive(Debug, Serialize, Deserialize)] -#[serde(untagged)] -pub enum SocketPacketBody<'a> { - Messages(MessagesPacket<'a>), - // TODO: Can we cleanly use the socket for all communication? - // Serialize(SerializePacket), - // RefPatch(RefPatchPacket<'a>), -} - -/// Message content from /api/socket -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SocketPacket<'a> { - pub session_id: SessionId, - pub packet_type: SocketPacketType, - pub body: SocketPacketBody<'a>, -} - /// Response body from /api/open/{id} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -238,35 +208,6 @@ pub struct OpenResponse { pub session_id: SessionId, } -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SerializeRequest { - pub session_id: SessionId, - pub ids: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SerializeResponse { - pub session_id: SessionId, - #[serde(with = "serde_bytes")] - pub model_contents: Vec, -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RefPatchRequest { - pub session_id: SessionId, - pub ids: HashSet, -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct RefPatchResponse<'a> { - pub session_id: SessionId, - pub patch: SubscribeMessage<'a>, -} - /// General response type returned from all Rojo routes #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -290,13 +231,6 @@ impl ErrorResponse { } } - pub fn forbidden>(details: S) -> Self { - Self { - kind: ErrorResponseKind::Forbidden, - details: details.into(), - } - } - pub fn internal_error>(details: S) -> Self { Self { kind: ErrorResponseKind::InternalError, @@ -309,6 +243,5 @@ impl ErrorResponse { pub enum ErrorResponseKind { NotFound, BadRequest, - Forbidden, InternalError, } diff --git a/src/web/mod.rs b/src/web/mod.rs index 8a003285..d6df4b15 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -5,7 +5,6 @@ mod api; mod assets; pub mod interface; -mod origin; mod ui; mod util; @@ -13,9 +12,8 @@ use std::convert::Infallible; use std::net::SocketAddr; use std::sync::Arc; -use anyhow::Context; use hyper::{ - server::{conn::AddrStream, Server}, + server::Server, service::{make_service_fn, service_fn}, Body, Request, }; @@ -32,44 +30,19 @@ impl LiveServer { LiveServer { serve_session } } - /// Starts the server on the given address, blocking until it stops. - /// - /// `allowed_hosts` are extra `Host`/`Origin` values to accept in addition to - /// localhost and the bind address (see [`origin::allowed_hosts`]). - /// - /// `on_listening` is invoked once the server has successfully bound to the - /// address, so callers can defer printing any "listening" message until - /// after binding can no longer fail (e.g. due to the port being in use). - pub fn start( - self, - address: SocketAddr, - allowed_hosts: Vec, - on_listening: impl FnOnce(), - ) -> anyhow::Result<()> { + pub fn start(self, address: SocketAddr) { let serve_session = Arc::clone(&self.serve_session); - let allowed_hosts = origin::allowed_hosts(address.ip(), address.port(), &allowed_hosts); - let make_service = make_service_fn(move |conn: &AddrStream| { + let make_service = make_service_fn(move |_conn| { let serve_session = Arc::clone(&serve_session); - let allowed_hosts = allowed_hosts.clone(); - let remote_addr = conn.remote_addr(); - async move { + async { let service = move |req: Request| { let serve_session = Arc::clone(&serve_session); - let allowed_hosts = allowed_hosts.clone(); async move { - // Reject cross-origin requests before doing any work, to - // defend the local server against DNS rebinding. - if let Some(response) = - origin::check_request_origin(&req, allowed_hosts.as_ref()) - { - return Ok::<_, Infallible>(response); - } - if req.uri().path().starts_with("/api") { - Ok::<_, Infallible>(api::call(serve_session, remote_addr, req).await) + Ok::<_, Infallible>(api::call(serve_session, req).await) } else { Ok::<_, Infallible>(ui::call(serve_session, req).await) } @@ -80,25 +53,9 @@ impl LiveServer { } }); - let rt = Runtime::new().context("Failed to start the async runtime for the web server")?; + let rt = Runtime::new().unwrap(); let _guard = rt.enter(); - let server = Server::try_bind(&address) - .with_context(|| { - format!( - "Could not start the Rojo server on {address}.\n\ - The address may already be in use or reserved. Another Rojo server might already \ - be running, or another program may be using that port.\n\ - You can pick a different port with the --port option." - ) - })? - .serve(make_service); - - // Binding succeeded, so it's now safe to tell the user we're listening. - on_listening(); - - rt.block_on(server) - .context("The Rojo web server encountered a fatal error")?; - - Ok(()) + let server = Server::bind(&address).serve(make_service); + rt.block_on(server).unwrap(); } } diff --git a/src/web/origin.rs b/src/web/origin.rs deleted file mode 100644 index bb36a7e7..00000000 --- a/src/web/origin.rs +++ /dev/null @@ -1,589 +0,0 @@ -//! Host/Origin validation used to defend the local Rojo server against DNS -//! rebinding attacks. -//! -//! When Rojo is bound to a loopback address (the default), a malicious web page -//! the developer visits cannot read the API responses directly because of the -//! browser Same-Origin Policy. However, a DNS rebinding attack can defeat that: -//! the page points its own hostname at `127.0.0.1` after loading, so the browser -//! treats requests to the Rojo server as same-origin. Validating that the `Host` -//! (and, if present, `Origin`) header refers to an address we recognize blocks -//! this, because the rebound request still carries the attacker's hostname, which -//! is a domain name rather than one of the IP literals we accept. -//! -//! Enforcement covers two kinds of bind: -//! -//! * Loopback (the default): only `localhost` and loopback literals are -//! accepted. -//! * A specific private/LAN address: `localhost`, loopback literals, and that exact bind -//! IP are accepted. Because the defense works by rejecting any `Host` that -//! isn't a recognized IP literal, clients must connect to a private bind by -//! IP. A hostname (e.g. `mypc.local`) is indistinguishable from an attacker -//! domain and is rejected. -//! -//! Enforcement is disabled for unspecified (`0.0.0.0`/`::`) and public binds: the -//! user has asked for broad, possibly-public exposure where arbitrary hostnames -//! may legitimately resolve to the server, so we can't build a meaningful -//! allowlist. Those binds get a startup warning instead. Two consequences worth -//! being explicit about: such a bind has no rebinding protection even for a -//! browser on the same machine; and even on a protected private bind this check -//! does nothing against a hostile peer already on the LAN, who can reach the -//! unauthenticated API directly. Both are the network-exposure risk the startup -//! warning addresses, not something the `Host` check is meant to cover. -//! -//! The allowlist can be widened with extra hosts (the `--allowed-hosts` CLI -//! option or a project's `serveAllowedHosts`), for example a hostname like -//! `mypc.lan` for reaching a network-exposed server by name. Listing any extra -//! host also turns enforcement back on for an unspecified or public bind that -//! would otherwise disable it, restricting that bind to localhost, the bind IP, -//! and the listed hosts. - -use std::net::IpAddr; - -use hyper::{ - header::{HOST, ORIGIN}, - http::uri::{Authority, Uri}, - Body, Request, Response, StatusCode, -}; - -use crate::web::util::response; - -/// The set of `Host`/`Origin` values accepted while enforcement is active. -#[derive(Debug, Clone)] -pub struct AllowedHosts { - port: u16, - /// The bind IP accepted in addition to `localhost`/loopback, set only for a - /// private (LAN) bind or a specific public bind that has extra hosts. `None` - /// for a loopback or unspecified bind, which has no single address to add. - bind_ip: Option, - /// Extra `Host`/`Origin` values the user explicitly allowed, via the - /// `--allowed-hosts` option or a project's `serveAllowedHosts`. These are - /// hostnames such as `mypc.lan`, or IP literals, accepted in addition to - /// localhost and the bind IP. Each entry is already passed through - /// [`normalize_host`]. - extra_hosts: Vec, -} - -impl AllowedHosts { - /// Returns whether the given host and optional port are allowed. The host is - /// accepted if it is `localhost`, a loopback IP literal, (on a private or - /// specific public bind) the exact bind IP, or one of the explicitly allowed - /// extra hosts. A request with no explicit port is accepted (the host - /// already has to be one we recognize). - fn allows(&self, host: &str, port: Option) -> bool { - let host = normalize_host(host); - let host_ok = host.eq_ignore_ascii_case("localhost") - || host - .parse::() - .ok() - .map(canonical) - .is_some_and(|ip| ip.is_loopback() || self.bind_ip == Some(ip)) - || self.allows_extra(host); - - host_ok && port.is_none_or(|port| port == self.port) - } - - /// Returns whether `host` matches one of the explicitly allowed extra hosts. - /// Entries that are IP literals are compared as addresses, so equivalent - /// forms (such as an IPv4-mapped IPv6 literal) match; everything else is - /// compared as a case-insensitive hostname. - fn allows_extra(&self, host: &str) -> bool { - let host_ip = host.parse::().ok().map(canonical); - self.extra_hosts.iter().any(|allowed| { - match (host_ip, allowed.parse::().map(canonical)) { - (Some(host_ip), Ok(allowed_ip)) => host_ip == allowed_ip, - _ => host.eq_ignore_ascii_case(allowed), - } - }) - } -} - -/// Builds the allowlist for a given bind address and any extra allowed hosts. -/// Returns `None` (validation disabled) when bound to an unspecified -/// (`0.0.0.0`/`::`) or public address and no extra hosts were given, where -/// arbitrary hostnames may legitimately resolve to the server. Listing extra -/// hosts keeps validation on even for those binds. -pub fn allowed_hosts(bind: IpAddr, port: u16, extra: &[String]) -> Option { - let extra_hosts: Vec = extra - .iter() - .map(|host| normalize_host(host.trim()).to_owned()) - .filter(|host| !host.is_empty()) - .collect(); - - if bind.is_loopback() { - Some(AllowedHosts { - port, - bind_ip: None, - extra_hosts, - }) - } else if is_private_bind(bind) { - Some(AllowedHosts { - port, - bind_ip: Some(canonical(bind)), - extra_hosts, - }) - } else if !extra_hosts.is_empty() { - // The bind is unspecified or public, where validation is normally - // disabled. By listing explicit hosts the user has opted back into it, - // so we accept localhost, the bind IP (when it is a specific address), - // and those hosts. An unspecified bind (`0.0.0.0`/`::`) has no single - // address to add. - let bind_ip = (!bind.is_unspecified()).then(|| canonical(bind)); - Some(AllowedHosts { - port, - bind_ip, - extra_hosts, - }) - } else { - None - } -} - -/// Collapses an IPv4-mapped IPv6 address (`::ffff:192.168.0.1`) to its IPv4 form -/// so it classifies and compares consistently with the bare IPv4 address. Shared -/// with the `/api/open` peer check so it recognizes a mapped loopback peer too. -pub(crate) fn canonical(ip: IpAddr) -> IpAddr { - match ip { - IpAddr::V6(v6) => v6.to_ipv4_mapped().map(IpAddr::V4).unwrap_or(ip), - v4 => v4, - } -} - -/// Returns whether a bind address is a specific private/link-local address, the -/// case where enforcement stays on with the bind IP added to the allowlist. -/// Unspecified, loopback, and public addresses are excluded (loopback is handled -/// separately by [`allowed_hosts`]). -fn is_private_bind(ip: IpAddr) -> bool { - match canonical(ip) { - IpAddr::V4(v4) => v4.is_private() || v4.is_link_local(), - IpAddr::V6(v6) => { - let first = v6.segments()[0]; - // Unique local (fc00::/7) or link-local (fe80::/10). The std methods - // for these are still nightly-only, so test the prefix directly. - (first & 0xfe00) == 0xfc00 || (first & 0xffc0) == 0xfe80 - } - } -} - -/// Validates the `Host` and `Origin` headers of an incoming request against the -/// allowlist. Returns `Some` with a ready-to-send `404` response when the -/// request should be rejected, or `None` when it is allowed to proceed. When -/// `allowed` is `None` (unspecified or public bind) every request is accepted. -pub fn check_request_origin( - request: &Request, - allowed: Option<&AllowedHosts>, -) -> Option> { - let allowed = allowed?; - - // The Host header is mandatory and must refer to a local address. - let host_ok = request - .headers() - .get(HOST) - .and_then(|value| value.to_str().ok()) - .and_then(parse_authority) - .is_some_and(|(host, port)| allowed.allows(&host, port)); - - if !host_ok { - return Some(reject()); - } - - // The Origin header is optional: non-browser clients such as the Roblox - // plugin never send it. When it is present (i.e. a browser made the request) - // it must also be local, which rejects a rebound page whose origin is still - // its own non-local hostname. - if let Some(origin) = request.headers().get(ORIGIN) { - let origin_ok = origin - .to_str() - .ok() - .and_then(parse_origin) - .is_some_and(|(host, port)| allowed.allows(&host, port)); - - if !origin_ok { - return Some(reject()); - } - } - - None -} - -/// Normalizes a host literal for parsing/comparison: strips the surrounding -/// brackets from an IPv6 literal (e.g. `[::1]`) and drops any IPv6 zone id (e.g. -/// `fe80::1%eth0`), which `Ipv6Addr::from_str` would otherwise reject. -fn normalize_host(host: &str) -> &str { - let host = host - .strip_prefix('[') - .and_then(|host| host.strip_suffix(']')) - .unwrap_or(host); - - host.split('%').next().unwrap_or(host) -} - -/// Parses a `Host` header value (an authority such as `localhost:34872`) into -/// its host and optional port. Returns `None` if the authority carries userinfo -/// (e.g. `evil.com@localhost`), so a value whose host looks local only after the -/// userinfo is stripped can never sneak past the allowlist. -fn parse_authority(value: &str) -> Option<(String, Option)> { - let authority: Authority = value.parse().ok()?; - reject_userinfo(&authority)?; - Some((authority.host().to_owned(), authority.port_u16())) -} - -/// Parses an `Origin` header value (an absolute URI such as -/// `http://localhost:34872`) into its host and optional port. Returns `None` for -/// origins without a host, such as the opaque `null` origin, or for origins whose -/// authority carries userinfo (see [`parse_authority`]). -fn parse_origin(value: &str) -> Option<(String, Option)> { - let uri: Uri = value.parse().ok()?; - reject_userinfo(uri.authority()?)?; - Some((uri.host()?.to_owned(), uri.port_u16())) -} - -/// Returns `None` (rejecting the value) when an authority contains a userinfo -/// component, identified by the `@` separator. A bare host or `host:port` never -/// contains `@`, so this only fires on `userinfo@host` forms. -fn reject_userinfo(authority: &Authority) -> Option<()> { - if authority.as_str().contains('@') { - None - } else { - Some(()) - } -} - -/// Builds the response sent when a request fails Host/Origin validation. It is a -/// generic `404` with no Rojo-identifying body: a rejected request may be a -/// prober (or a DNS-rebound page's same-origin script, which could read the -/// body), so we reveal nothing rather than confirming a Rojo server is here. -fn reject() -> Response { - response(StatusCode::NOT_FOUND, "text/plain", "Not Found") -} - -#[cfg(test)] -mod test { - use super::*; - - use std::net::{Ipv4Addr, Ipv6Addr}; - - const PORT: u16 = 34872; - - fn loopback_allowlist() -> Option { - allowed_hosts(IpAddr::V4(Ipv4Addr::LOCALHOST), PORT, &[]) - } - - /// An allowlist for a server bound to a specific private (LAN) address. - fn private_allowlist() -> Option { - allowed_hosts(IpAddr::V4(Ipv4Addr::new(192, 168, 1, 5)), PORT, &[]) - } - - /// An allowlist for `bind` with the given extra allowed hosts. - fn allowlist_with_hosts(bind: IpAddr, hosts: &[&str]) -> Option { - let hosts: Vec = hosts.iter().map(|host| host.to_string()).collect(); - allowed_hosts(bind, PORT, &hosts) - } - - fn request_with(headers: &[(&'static str, &str)]) -> Request { - let mut builder = Request::builder().uri("/api/rojo"); - for (name, value) in headers { - builder = builder.header(*name, *value); - } - builder.body(Body::empty()).unwrap() - } - - #[test] - fn loopback_bind_enables_enforcement() { - assert!(allowed_hosts(IpAddr::V4(Ipv4Addr::LOCALHOST), PORT, &[]).is_some()); - assert!(allowed_hosts(IpAddr::V6(Ipv6Addr::LOCALHOST), PORT, &[]).is_some()); - } - - #[test] - fn private_bind_enables_enforcement() { - for bind in [ - IpAddr::V4(Ipv4Addr::new(192, 168, 1, 5)), // 192.168.0.0/16 - IpAddr::V4(Ipv4Addr::new(10, 0, 0, 1)), // 10.0.0.0/8 - IpAddr::V4(Ipv4Addr::new(172, 16, 0, 1)), // 172.16.0.0/12 - IpAddr::V4(Ipv4Addr::new(169, 254, 0, 1)), // link-local - IpAddr::V6(Ipv6Addr::new(0xfc00, 0, 0, 0, 0, 0, 0, 1)), // unique local - IpAddr::V6(Ipv6Addr::new(0xfe80, 0, 0, 0, 0, 0, 0, 1)), // link-local - ] { - assert!( - allowed_hosts(bind, PORT, &[]).is_some(), - "private bind {bind} should enable enforcement" - ); - } - } - - #[test] - fn unspecified_or_public_bind_disables_enforcement() { - for bind in [ - IpAddr::V4(Ipv4Addr::UNSPECIFIED), // 0.0.0.0 - IpAddr::V6(Ipv6Addr::UNSPECIFIED), // :: - IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8)), // public - IpAddr::V6(Ipv6Addr::new(0x2001, 0x4860, 0, 0, 0, 0, 0, 0x8888)), // public - ] { - assert!( - allowed_hosts(bind, PORT, &[]).is_none(), - "bind {bind} should disable enforcement" - ); - } - } - - #[test] - fn accepts_local_hosts() { - let allowed = loopback_allowlist(); - for host in [ - format!("localhost:{PORT}"), - format!("127.0.0.1:{PORT}"), - format!("[::1]:{PORT}"), - "localhost".to_owned(), - ] { - let request = request_with(&[("host", &host)]); - assert!( - check_request_origin(&request, allowed.as_ref()).is_none(), - "host {host} should be allowed" - ); - } - } - - #[test] - fn rejects_foreign_host() { - let allowed = loopback_allowlist(); - let request = request_with(&[("host", "evil.com")]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn rejects_wrong_port() { - let allowed = loopback_allowlist(); - let request = request_with(&[("host", "localhost:1234")]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn rejects_missing_host() { - let allowed = loopback_allowlist(); - let request = request_with(&[]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn rejects_host_with_userinfo() { - let allowed = loopback_allowlist(); - // The host parses to `localhost`, but the userinfo prefix must keep it - // from being treated as a local address. - let request = request_with(&[("host", &format!("evil.com@localhost:{PORT}"))]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn rejects_origin_with_userinfo() { - let allowed = loopback_allowlist(); - let request = request_with(&[ - ("host", &format!("localhost:{PORT}")), - ("origin", &format!("http://evil.com@localhost:{PORT}")), - ]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn rejects_foreign_origin_even_with_local_host() { - let allowed = loopback_allowlist(); - let request = request_with(&[ - ("host", &format!("localhost:{PORT}")), - ("origin", &format!("http://evil.com:{PORT}")), - ]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn rejects_null_origin() { - let allowed = loopback_allowlist(); - let request = request_with(&[("host", &format!("localhost:{PORT}")), ("origin", "null")]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn accepts_local_origin() { - let allowed = loopback_allowlist(); - let request = request_with(&[ - ("host", &format!("localhost:{PORT}")), - ("origin", &format!("http://localhost:{PORT}")), - ]); - assert!(check_request_origin(&request, allowed.as_ref()).is_none()); - } - - #[test] - fn private_bind_accepts_local_and_bind_ip_hosts() { - let allowed = private_allowlist(); - for host in [ - format!("192.168.1.5:{PORT}"), - format!("localhost:{PORT}"), - format!("127.0.0.1:{PORT}"), - format!("[::1]:{PORT}"), - "192.168.1.5".to_owned(), - ] { - let request = request_with(&[("host", &host)]); - assert!( - check_request_origin(&request, allowed.as_ref()).is_none(), - "host {host} should be allowed on a private bind" - ); - } - } - - #[test] - fn private_bind_rejects_other_hosts() { - let allowed = private_allowlist(); - for host in [ - "evil.com", // a rebound attacker domain - "192.168.1.6", // a different private IP - "8.8.8.8", // a public IP - ] { - let request = request_with(&[("host", host)]); - assert!( - check_request_origin(&request, allowed.as_ref()).is_some(), - "host {host} should be rejected on a private bind" - ); - } - } - - #[test] - fn private_bind_keeps_origin_strict() { - // A different private IP as Origin must be rejected even though the Host - // is the valid bind IP: the Origin check is not widened to arbitrary - // private addresses. - let allowed = private_allowlist(); - let request = request_with(&[ - ("host", &format!("192.168.1.5:{PORT}")), - ("origin", &format!("http://192.168.1.6:{PORT}")), - ]); - assert!(check_request_origin(&request, allowed.as_ref()).is_some()); - } - - #[test] - fn private_bind_accepts_bind_ip_origin() { - let allowed = private_allowlist(); - let request = request_with(&[ - ("host", &format!("192.168.1.5:{PORT}")), - ("origin", &format!("http://192.168.1.5:{PORT}")), - ]); - assert!(check_request_origin(&request, allowed.as_ref()).is_none()); - } - - #[test] - fn accepts_ipv4_mapped_bind_ip() { - // `::ffff:192.168.1.5` is the IPv4-mapped form of the bind IP and must - // be treated as equal to it. - let allowed = private_allowlist(); - let request = request_with(&[("host", &format!("[::ffff:192.168.1.5]:{PORT}"))]); - assert!(check_request_origin(&request, allowed.as_ref()).is_none()); - } - - #[test] - fn canonical_collapses_ipv4_mapped_loopback() { - // The `/api/open` peer gate relies on this: an IPv4 loopback client - // reaching a dual-stack (`::`) bind arrives as `::ffff:127.0.0.1`, which - // is only recognized as loopback after canonicalization. - let mapped: IpAddr = "::ffff:127.0.0.1".parse().unwrap(); - assert!(!mapped.is_loopback()); - assert!(canonical(mapped).is_loopback()); - } - - #[test] - fn normalize_host_strips_brackets_and_zone_id() { - // Brackets and an IPv6 zone id must be removed so the result parses as an - // `IpAddr` (`Ipv6Addr::from_str` rejects zone ids). - assert_eq!(normalize_host("[::1]"), "::1"); - assert_eq!(normalize_host("[fe80::1%eth0]"), "fe80::1"); - assert_eq!(normalize_host("localhost"), "localhost"); - assert!(normalize_host("[fe80::1%eth0]").parse::().is_ok()); - } - - #[test] - fn allowed_hosts_extend_the_allowlist() { - // A hostname listed as an allowed host is accepted on a loopback bind, - // with the usual port check still applied; an unlisted host is not. - let allowed = allowlist_with_hosts(IpAddr::V4(Ipv4Addr::LOCALHOST), &["mypc.lan"]); - - let ok = request_with(&[("host", &format!("mypc.lan:{PORT}"))]); - assert!(check_request_origin(&ok, allowed.as_ref()).is_none()); - - let wrong_port = request_with(&[("host", "mypc.lan:1234")]); - assert!(check_request_origin(&wrong_port, allowed.as_ref()).is_some()); - - let other = request_with(&[("host", &format!("other.lan:{PORT}"))]); - assert!(check_request_origin(&other, allowed.as_ref()).is_some()); - } - - #[test] - fn allowed_hosts_apply_to_origin() { - let allowed = allowlist_with_hosts(IpAddr::V4(Ipv4Addr::LOCALHOST), &["mypc.lan"]); - - let ok = request_with(&[ - ("host", &format!("mypc.lan:{PORT}")), - ("origin", &format!("http://mypc.lan:{PORT}")), - ]); - assert!(check_request_origin(&ok, allowed.as_ref()).is_none()); - - let foreign_origin = request_with(&[ - ("host", &format!("mypc.lan:{PORT}")), - ("origin", &format!("http://evil.com:{PORT}")), - ]); - assert!(check_request_origin(&foreign_origin, allowed.as_ref()).is_some()); - } - - #[test] - fn allowed_hosts_enable_enforcement_on_exposed_bind() { - // Binding to 0.0.0.0 normally disables validation, but listing a host - // turns it back on: localhost and the listed host are accepted while - // everything else is rejected. - let allowed = allowlist_with_hosts(IpAddr::V4(Ipv4Addr::UNSPECIFIED), &["mypc.lan"]); - assert!(allowed.is_some()); - - for host in [format!("mypc.lan:{PORT}"), format!("localhost:{PORT}")] { - let request = request_with(&[("host", &host)]); - assert!( - check_request_origin(&request, allowed.as_ref()).is_none(), - "host {host} should be allowed" - ); - } - - let evil = request_with(&[("host", "evil.com")]); - assert!(check_request_origin(&evil, allowed.as_ref()).is_some()); - } - - #[test] - fn allowed_hosts_on_public_bind_accept_the_bind_ip() { - // A specific public bind with an allowed host accepts localhost, the - // listed host, and the bind IP itself, but nothing else. (203.0.113.0/24 - // is the TEST-NET-3 documentation range, treated here as a public IP.) - let bind = IpAddr::V4(Ipv4Addr::new(203, 0, 113, 5)); - let allowed = allowlist_with_hosts(bind, &["mypc.lan"]); - - for host in [ - format!("203.0.113.5:{PORT}"), - format!("mypc.lan:{PORT}"), - format!("localhost:{PORT}"), - ] { - let request = request_with(&[("host", &host)]); - assert!( - check_request_origin(&request, allowed.as_ref()).is_none(), - "host {host} should be allowed" - ); - } - - let evil = request_with(&[("host", "evil.com")]); - assert!(check_request_origin(&evil, allowed.as_ref()).is_some()); - } - - #[test] - fn disabled_allowlist_accepts_foreign_host() { - for bind in [ - IpAddr::V4(Ipv4Addr::UNSPECIFIED), - IpAddr::V4(Ipv4Addr::new(8, 8, 8, 8)), - ] { - let allowed = allowed_hosts(bind, PORT, &[]); - let request = request_with(&[("host", "evil.com")]); - assert!( - check_request_origin(&request, allowed.as_ref()).is_none(), - "disabled allowlist for bind {bind} should accept any host" - ); - } - } -} diff --git a/src/web/ui.rs b/src/web/ui.rs index f6361b4f..0199d58d 100644 --- a/src/web/ui.rs +++ b/src/web/ui.rs @@ -6,7 +6,8 @@ use std::{borrow::Cow, sync::Arc, time::Duration}; -use hyper::{Body, Method, Request, Response, StatusCode}; +use hyper::{header, Body, Method, Request, Response, StatusCode}; +use maplit::hashmap; use rbx_dom_weak::types::{Ref, Variant}; use ritz::{html, Fragment, HtmlContent, HtmlSelfClosingTag}; @@ -16,7 +17,7 @@ use crate::{ web::{ assets, interface::{ErrorResponse, SERVER_VERSION}, - util::{json, response}, + util::json, }, }; @@ -45,11 +46,17 @@ impl UiService { } fn handle_logo(&self) -> Response { - response(StatusCode::OK, "image/png", assets::logo()) + Response::builder() + .header(header::CONTENT_TYPE, "image/png") + .body(Body::from(assets::logo())) + .unwrap() } fn handle_icon(&self) -> Response { - response(StatusCode::OK, "image/png", assets::icon()) + Response::builder() + .header(header::CONTENT_TYPE, "image/png") + .body(Body::from(assets::icon())) + .unwrap() } fn handle_home(&self) -> Response { @@ -60,11 +67,10 @@ impl UiService { }); - response( - StatusCode::OK, - "text/html", - format!("{}", page), - ) + Response::builder() + .header(header::CONTENT_TYPE, "text/html") + .body(Body::from(format!("{}", page))) + .unwrap() } fn handle_show_instances(&self) -> Response { @@ -75,11 +81,10 @@ impl UiService { { Self::instance(&tree, root_id) } }); - response( - StatusCode::OK, - "text/html", - format!("{}", page), - ) + Response::builder() + .header(header::CONTENT_TYPE, "text/html") + .body(Body::from(format!("{}", page))) + .unwrap() } fn instance(tree: &RojoTree, id: Ref) -> HtmlContent<'_> { @@ -115,7 +120,7 @@ impl UiService { .map(|(key, value)| { html! {

- { key.as_str() } ": " { format!("{:?}", value.ty()) } + { key.clone() } ": " { format!("{:?}", value.ty()) }
} }) @@ -158,10 +163,8 @@ impl UiService { let content = html! { <> -
"specified_id: " { format!("{:?}", metadata.specified_id) }
"ignore_unknown_instances: " { metadata.ignore_unknown_instances.to_string() }
"instigating source: " { format!("{:?}", metadata.instigating_source) }
-
"middleware: " { format!("{:?}", metadata.middleware) }
{ relevant_paths } }; @@ -189,7 +192,7 @@ impl UiService { html! {
-