diff --git a/.cargo/config.toml b/.cargo/config similarity index 100% rename from .cargo/config.toml rename to .cargo/config 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/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..02a6af3e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,123 +11,29 @@ 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.43.1"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v1 with: submodules: true - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - - - name: Restore Rust Cache - uses: actions/cache/restore@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Setup Rust toolchain + run: rustup default ${{ matrix.rust_version }} - name: Build run: cargo build --locked --verbose - - name: Test + - name: Run tests 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 - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - with: - 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') }} + - name: Rustfmt and Clippy + run: | + cargo fmt -- --check + cargo clippy + if: matrix.rust_version == 'stable' \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f0a6e9d7..bf43ed0f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,156 +2,65 @@ name: Release on: push: - tags: ["v*"] + tags: ["*"] jobs: - create-release: - name: Create Release + windows: + runs-on: windows-latest + + steps: + - uses: actions/checkout@v1 + with: + submodules: true + + - name: Build release binary + run: cargo build --verbose --locked --release + + - name: Upload artifacts + uses: actions/upload-artifact@v1 + with: + name: rojo-win64 + path: target/release/rojo.exe + + macos: + runs-on: macos-latest + + steps: + - uses: actions/checkout@v1 + with: + submodules: true + + - name: Install Rust + run: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + + - name: Build release binary + run: | + source $HOME/.cargo/env + cargo build --verbose --locked --release + env: + OPENSSL_STATIC: 1 + + - name: Upload artifacts + uses: actions/upload-artifact@v1 + with: + name: rojo-macos + path: target/release/rojo + + linux: runs-on: ubuntu-latest + steps: - - uses: actions/checkout@v4 - - name: Create Release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release create ${{ github.ref_name }} --draft --verify-tag --title ${{ github.ref_name }} + - uses: actions/checkout@v1 + with: + submodules: true - build-plugin: - needs: ["create-release"] - name: Build Roblox Studio Plugin - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: true + - name: Build + run: cargo build --locked --verbose --release + env: + OPENSSL_STATIC: 1 - - name: Setup Rokit - uses: CompeyDev/setup-rokit@v0.1.2 - with: - version: 'v1.1.0' - - - name: Build Plugin - run: rojo build plugin.project.json --output Rojo.rbxm - - - name: Upload Plugin to Release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release upload ${{ github.ref_name }} Rojo.rbxm - - - name: Upload Plugin to Artifacts - uses: actions/upload-artifact@v4 - 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"] - strategy: - fail-fast: false - matrix: - # https://doc.rust-lang.org/rustc/platform-support.html - include: - - host: linux - os: ubuntu-22.04 - 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 - - - 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 - - - host: macos - os: macos-latest - target: x86_64-apple-darwin - label: macos-x86_64 - - - host: macos - os: macos-latest - target: aarch64-apple-darwin - label: macos-aarch64 - - name: Build (${{ matrix.target }}) - runs-on: ${{ matrix.os }} - env: - BIN: rojo - steps: - - uses: actions/checkout@v4 - with: - submodules: true - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.target }} - - - name: Restore Rust Cache - uses: actions/cache/restore@v4 - with: - path: | - ~/.cargo/registry - ~/.cargo/git - target - key: ${{ matrix.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - 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 - env: - TAG_NAME: ${{ github.ref_name }} - run: | - echo "ARTIFACT_NAME=$BIN-${TAG_NAME#v}-${{ matrix.label }}.zip" >> "$GITHUB_ENV" - - - name: Create Archive and Upload to Release - shell: bash - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - mkdir staging - - if [ "${{ matrix.host }}" = "windows" ]; then - cp "target/${{ matrix.target }}/release/$BIN.exe" staging/ - cd staging - 7z a ../$ARTIFACT_NAME * - else - cp "target/${{ matrix.target }}/release/$BIN" staging/ - cd staging - zip ../$ARTIFACT_NAME * - fi - - gh release upload ${{ github.ref_name }} ../$ARTIFACT_NAME - - - name: Upload Archive to Artifacts - uses: actions/upload-artifact@v4 - with: - path: ${{ env.ARTIFACT_NAME }} - name: ${{ env.ARTIFACT_NAME }} + - name: Upload artifacts + uses: actions/upload-artifact@v1 + with: + name: rojo-linux + path: target/release/rojo \ 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..2a71ccc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,1001 +1,144 @@ # 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) - -* 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 - -## [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]) -* Added `sourcemap` command for generating sourcemaps to feed into other tools. ([#530]) -* 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.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-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! - -* Added support for writing `Tags` in project files, model files, and meta files. ([#484]) -* 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 - -## 7.0.0-rc.2 (October 19, 2021) - -(Botched release due to Git mishap, oops!) - -## [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 -{ - "className": "Part", - "properties": { - "Position": { - "Type": "Vector3", - "Value": [1, 2, 3] - } - } -} -``` - -For Rojo 7, this will need to be changed to: - -```json -{ - "className": "Part", - "properties": { - "Position": { - "Vector3": [1, 2, 3] - } - } -} -``` - -The shorthand property format that most users use is not impacted. For reference, it looks like this: - -```json -{ - "className": "Part", - "properties": { - "Position": [1, 2, 3] - } -} -``` - -* Major breaking change: changed property syntax for project files; shorthand syntax is unchanged. -* Added the `fmt-project` subcommand for formatting Rojo project files. -* Improved error output for many subcommands. -* Updated to stable versions of rbx-dom libraries. -* Updated async infrastructure, which should fix a handful of bugs. ([#459]) -* 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-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. -* 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]) -* Improved error messages for misconfigured projects. - -[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) - -* Updated dependencies, fixing `OptionalCoordinateFrame`-related issues. -* Added `--address` flag to `rojo serve` to allow for external connections. ([#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) - -* 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) - -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. -* **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. - -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) +## Unreleased Changes +## [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 +147,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..9eccac56 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. @@ -70,29 +29,25 @@ Sometimes there's something that Rojo doesn't do that it probably should. 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. -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 double-check 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 +6. Tag the commit with the version from `Cargo.toml` prepended with a v, like `v0.4.13` +7. Publish the CLI * `cargo publish` +8. Build and upload the plugin + * `rojo build plugin -o Rojo.rbxm` + * Upload `Rojo.rbxm` to Roblox.com, keep it for later +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 + * Attach release artifacts from GitHub Actions for each platform \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index d93a8fdc..b78491c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,67 +1,55 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 - [[package]] name = "addr2line" -version = "0.25.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423" dependencies = [ "gimli", ] [[package]] -name = "adler2" -version = "2.0.1" +name = "adler" +version = "0.2.3" 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 = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" [[package]] name = "aho-corasick" -version = "1.1.4" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" dependencies = [ "memchr", ] [[package]] -name = "anyhow" -version = "1.0.100" +name = "ansi_term" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.9", +] [[package]] -name = "arraydeque" -version = "0.5.1" +name = "anyhow" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +checksum = "2c0df63cb2955042487fad3aefd2c6e3ae7389ac5dc1beb28921de0b69f779d4" [[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,93 +57,113 @@ 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 = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.76" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" dependencies = [ "addr2line", - "cfg-if 1.0.4", + "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.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" +dependencies = [ + "byteorder", +] [[package]] name = "base64" -version = "0.21.7" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bincode" -version = "1.3.3" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" dependencies = [ + "byteorder", "serde", ] [[package]] name = "bitflags" -version = "1.3.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] -name = "bitflags" -version = "2.10.0" +name = "blake2b_simd" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" - -[[package]] -name = "blake3" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" dependencies = [ "arrayref", "arrayvec", - "cc", - "cfg-if 1.0.4", "constant_time_eq", ] [[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473fc6b38233f9af7baa94fb5852dca389e3d95b8e21c8e3719301462c5d9faf" +dependencies = [ + "lazy_static", "memchr", "regex-automata", "serde", @@ -163,39 +171,47 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" + +[[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.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" [[package]] name = "bytes" -version = "1.11.0" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +dependencies = [ + "byteorder", + "either", + "iovec", +] [[package]] name = "cast" -version = "0.3.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" +dependencies = [ + "rustc_version", +] [[package]] name = "cc" -version = "1.2.47" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] +checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" [[package]] name = "cfg-if" @@ -205,83 +221,93 @@ 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" -version = "2.34.0" +version = "2.33.3" 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" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" 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", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] -name = "clap_derive" -version = "3.2.25" +name = "cloudabi" +version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 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", + "bitflags", ] [[package]] name = "console" -version = "0.15.11" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +checksum = "c0b1aacfaffdbff75be81c15a399b4bedf78aaefe840e8af1d299ac2ade885d2" dependencies = [ "encode_unicode", + "lazy_static", "libc", - "once_cell", - "windows-sys 0.59.0", + "terminal_size", + "termios", + "winapi 0.3.9", ] [[package]] -name = "constant_time_eq" -version = "0.3.1" +name = "const_fn" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "cookie" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" +dependencies = [ + "time", + "url 1.7.2", +] + +[[package]] +name = "cookie_store" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" +dependencies = [ + "cookie", + "failure", + "idna 0.1.5", + "log", + "publicsuffix", + "serde", + "serde_json", + "time", + "try_from", + "url 1.7.2", +] [[package]] name = "core-foundation" -version = "0.9.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" dependencies = [ "core-foundation-sys", "libc", @@ -289,28 +315,28 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.7" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "crc32fast" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "libc", + "cfg-if 1.0.0", ] [[package]] name = "criterion" -version = "0.3.6" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" +checksum = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8" dependencies = [ "atty", "cast", - "clap 2.34.0", + "clap", "criterion-plot", "csv", "itertools", @@ -330,9 +356,9 @@ dependencies = [ [[package]] name = "criterion-plot" -version = "0.4.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" +checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" dependencies = [ "cast", "itertools", @@ -340,89 +366,153 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" dependencies = [ - "crossbeam-utils", + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.1", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "crossbeam-epoch 0.8.2", + "crossbeam-utils 0.7.2", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch 0.9.1", + "crossbeam-utils 0.8.1", ] [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "crossbeam-utils", + "autocfg 1.0.1", + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", + "lazy_static", + "maybe-uninit", + "memoffset 0.5.6", + "scopeguard", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +dependencies = [ + "cfg-if 1.0.0", + "const_fn", + "crossbeam-utils 0.8.1", + "lazy_static", + "memoffset 0.6.1", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" +dependencies = [ + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", + "maybe-uninit", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg 1.0.1", + "cfg-if 0.1.10", + "lazy_static", +] [[package]] -name = "crypto-common" -version = "0.1.7" +name = "crossbeam-utils" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" dependencies = [ - "generic-array", - "typenum", + "autocfg 1.0.1", + "cfg-if 1.0.0", + "lazy_static", ] [[package]] name = "csv" -version = "1.4.0" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +checksum = "f9d58633299b24b515ac72a3f869f8b91306a3cec616a602843a383acd6f9e97" dependencies = [ + "bstr", "csv-core", "itoa", "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.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484" +dependencies = [ + "quote 1.0.7", + "syn", +] [[package]] -name = "diff" -version = "0.1.13" +name = "difference" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" [[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,97 +522,58 @@ 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]] name = "dirs-sys" -version = "0.3.7" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" dependencies = [ "libc", - "redox_users 0.4.6", + "redox_users", "winapi 0.3.9", ] [[package]] -name = "dirs-sys" -version = "0.5.0" +name = "doc-comment" +version = "0.3.3" 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", -] +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] -name = "displaydoc" -version = "0.2.5" +name = "dtoa" +version = "0.4.6" 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" +checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" [[package]] name = "either" -version = "1.15.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "embed-resource" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e62abb876c07e4754fae5c14cafa77937841f01740637e17d78dc04352f32a5e" -dependencies = [ - "cc", - "rustc_version", - "toml", - "vswhom", - "winreg 0.10.1", -] +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[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.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "801bbab217d7f79c0062f4f7205b5d4427c6d1a7bd7aafdd1475f7c59d62b283" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", ] [[package]] name = "env_logger" -version = "0.9.3" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ "atty", "humantime", @@ -532,52 +583,64 @@ dependencies = [ ] [[package]] -name = "equivalent" -version = "1.0.2" +name = "error-chain" +version = "0.12.4" 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" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" dependencies = [ - "libc", - "windows-sys 0.61.2", + "version_check", ] [[package]] -name = "fastrand" -version = "2.3.0" +name = "failure" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", + "synstructure", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 1.0.0", "libc", - "libredox", - "windows-sys 0.60.2", + "redox_syscall", + "winapi 0.3.9", ] [[package]] -name = "find-msvc-tools" -version = "0.1.5" +name = "flate2" +version = "1.0.19" 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 = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129" dependencies = [ - "num-traits", + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide", ] [[package]] @@ -587,28 +650,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.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" dependencies = [ - "percent-encoding", + "matches", + "percent-encoding 2.1.0", ] [[package]] name = "fs-err" -version = "2.11.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] +checksum = "bcd1163ae48bda72a20ae26d66a04d3094135cadab911cff418ae5e33f253431" [[package]] name = "fsevent" @@ -616,7 +686,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", ] @@ -629,13 +699,19 @@ dependencies = [ "libc", ] +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "fuchsia-zircon" 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,241 +723,107 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futures" -version = "0.3.31" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "4c7e4c2612746b0df8fed4ce0c69156021b704c9aefa360311c04e6e9e002eed" + +[[package]] +name = "futures-cpupool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "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", + "futures", + "num_cpus", ] [[package]] name = "generic-array" -version = "0.14.7" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" dependencies = [ "typenum", - "version_check", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 0.1.10", "libc", - "wasi", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if 1.0.4", - "libc", - "r-efi", - "wasip2", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] name = "gimli" -version = "0.32.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" [[package]] name = "globset" -version = "0.4.18" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a" dependencies = [ "aho-corasick", "bstr", + "fnv", "log", - "regex-automata", - "regex-syntax", + "regex", ] [[package]] name = "h2" -version = "0.3.27" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" dependencies = [ + "byteorder", "bytes", "fnv", - "futures-core", - "futures-sink", - "futures-util", + "futures", "http", - "indexmap 2.12.1", + "indexmap", + "log", "slab", - "tokio", - "tokio-util", - "tracing", + "string", + "tokio-io", ] [[package]] name = "half" -version = "1.8.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" +checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.9.1" 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 = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" [[package]] name = "heck" -version = "0.4.1" +version = "0.3.1" 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 = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" 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,9 +832,9 @@ checksum = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" [[package]] name = "http" -version = "0.2.12" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" dependencies = [ "bytes", "fnv", @@ -901,206 +843,104 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" dependencies = [ "bytes", + "futures", "http", - "pin-project-lite", + "tokio-buf", ] [[package]] name = "httparse" -version = "1.10.1" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" [[package]] name = "humantime" -version = "2.3.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] [[package]] name = "hyper" -version = "0.14.32" +version = "0.12.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +checksum = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" dependencies = [ "bytes", - "futures-channel", - "futures-core", - "futures-util", + "futures", + "futures-cpupool", "h2", "http", "http-body", "httparse", - "httpdate", + "iovec", "itoa", - "pin-project-lite", - "socket2 0.5.10", + "log", + "net2", + "rustc_version", + "time", "tokio", - "tower-service", - "tracing", + "tokio-buf", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", "want", ] [[package]] -name = "hyper-rustls" -version = "0.24.2" +name = "hyper-tls" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" dependencies = [ - "futures-util", - "http", + "bytes", + "futures", "hyper", - "rustls", - "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", + "native-tls", + "tokio-io", ] [[package]] name = "idna" -version = "1.1.0" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "idna_adapter" -version = "1.2.1" +name = "idna" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" dependencies = [ - "icu_normalizer", - "icu_properties", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.9.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" 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", + "autocfg 1.0.1", + "hashbrown", ] [[package]] @@ -1109,32 +949,34 @@ 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", ] [[package]] name = "inotify-sys" -version = "0.1.5" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "c4563555856585ab3180a5bf0b2f9f8d301a728462afffc8195b3f5394229c55" dependencies = [ "libc", ] [[package]] name = "insta" -version = "1.44.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8732d3774162a0851e3f2b150eb98f31a9885dd75985099421d393385a01dfd" +checksum = "863bf97e7130bf788f29a99bc4073735af6b8ecc3da6a39c23b3a688d2d3109a" dependencies = [ "console", - "once_cell", + "difference", + "lazy_static", "pest", "pest_derive", "serde", - "similar", + "serde_json", + "serde_yaml", ] [[package]] @@ -1146,36 +988,20 @@ dependencies = [ "libc", ] -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - [[package]] name = "itertools" -version = "0.10.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.15" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" [[package]] name = "jod-thread" @@ -1185,23 +1011,13 @@ checksum = "8b23360e99b8717f20aaa4598f5a6541efbe30630039fbc7706cf954a87947ae" [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "cf3d7383929f7c9c7c2d0fa596f325832df98c3704f2c60553080f7127a58175" 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 +1030,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 +1042,52 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.81" 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 = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "linked-hash-map" -version = "0.5.6" +version = "0.5.3" 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" +checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" [[package]] name = "lock_api" -version = "0.4.14" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" dependencies = [ "scopeguard", ] [[package]] name = "log" -version = "0.4.28" +version = "0.4.11" 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 = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" dependencies = [ - "cfg-if 1.0.4", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", + "cfg-if 0.1.10", ] [[package]] -name = "lz4_flex" -version = "0.13.1" +name = "lz4" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" +checksum = "aac20ed6991e01bf6a2e68cc73df2b389707403662a8ba89f68511fb340f724c" dependencies = [ - "twox-hash", + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca79aa95d8b3226213ad454d328369853be3a1382d89532a854f4d69640acae" +dependencies = [ + "cc", + "libc", ] [[package]] @@ -1303,45 +1097,81 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] -name = "matchers" -version = "0.2.0" +name = "matches" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.7.6" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[package]] +name = "memoffset" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +dependencies = [ + "autocfg 1.0.1", +] + +[[package]] +name = "memoffset" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +dependencies = [ + "autocfg 1.0.1", +] [[package]] name = "memofs" -version = "0.4.0" +version = "0.1.3" dependencies = [ - "crossbeam-channel", - "dunce", + "crossbeam-channel 0.4.4", "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 = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +dependencies = [ + "mime", + "unicase", +] [[package]] name = "miniz_oxide" -version = "0.8.9" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" dependencies = [ - "adler2", + "adler", + "autocfg 1.0.1", ] [[package]] @@ -1363,17 +1193,6 @@ dependencies = [ "winapi 0.2.8", ] -[[package]] -name = "mio" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - [[package]] name = "mio-extras" version = "2.0.6" @@ -1382,10 +1201,21 @@ checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" dependencies = [ "lazycell", "log", - "mio 0.6.23", + "mio", "slab", ] +[[package]] +name = "mio-uds" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" +dependencies = [ + "iovec", + "libc", + "mio", +] + [[package]] name = "miow" version = "0.2.2" @@ -1399,10 +1229,28 @@ dependencies = [ ] [[package]] -name = "net2" -version = "0.2.39" +name = "native-tls" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +checksum = "6fcc7939b5edc4e4f86b1b4a04bb1498afaaf871b1a6691838ed06fcb48d3a3f" +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,149 +1259,181 @@ dependencies = [ [[package]] name = "notify" -version = "4.0.18" +version = "4.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72dd35279a5dc895a30965e247b0961ba36c233dc48454a2de8ccd459f1afd3" +checksum = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd" dependencies = [ - "bitflags 1.3.2", + "bitflags", "filetime", "fsevent", "fsevent-sys", "inotify", "libc", - "mio 0.6.23", + "mio", "mio-extras", "walkdir", "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.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ - "autocfg", + "autocfg 1.0.1", ] [[package]] name = "num_cpus" -version = "1.17.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ - "hermit-abi 0.5.2", + "hermit-abi", "libc", ] [[package]] name = "object" -version = "0.37.3" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[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.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293c15678e37254c15bd2f092314abb4e51d7fdde05c2021279c12631b54f005" +checksum = "13117407ca9d0caf3a0e74f97b490a7e64c0ae3aa90a8b7085544d0c37b6f3ae" dependencies = [ - "bstr", "winapi 0.3.9", ] [[package]] -name = "option-ext" -version = "0.2.0" +name = "openssl" +version = "0.10.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "8d008f51b1acffa0d3450a68606e6a51c123012edaacb0f4e1426bd978869187" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "foreign-types", + "lazy_static", + "libc", + "openssl-sys", +] [[package]] -name = "os_str_bytes" -version = "6.6.1" +name = "openssl-probe" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" +checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" + +[[package]] +name = "openssl-sys" +version = "0.9.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de52d8eabd217311538a39bba130d7dea1f1e118010fee7a033d966845e7d5fe" +dependencies = [ + "autocfg 1.0.1", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "output_vt100" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" +dependencies = [ + "winapi 0.3.9", +] [[package]] name = "parking_lot" -version = "0.12.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" dependencies = [ "lock_api", "parking_lot_core", + "rustc_version", ] [[package]] name = "parking_lot_core" -version = "0.9.12" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 0.1.10", + "cloudabi", "libc", "redox_syscall", + "rustc_version", "smallvec", - "windows-link 0.2.1", + "winapi 0.3.9", ] [[package]] name = "paste" -version = "1.0.15" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" +dependencies = [ + "paste-impl", + "proc-macro-hack", +] [[package]] -name = "pathdiff" -version = "0.2.3" +name = "paste-impl" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" +dependencies = [ + "proc-macro-hack", +] [[package]] name = "percent-encoding" -version = "2.3.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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,99 +1441,62 @@ 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.24", + "quote 1.0.7", + "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" [[package]] name = "plotters" -version = "0.3.7" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +checksum = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" dependencies = [ + "js-sys", "num-traits", - "plotters-backend", - "plotters-svg", "wasm-bindgen", "web-sys", ] -[[package]] -name = "plotters-backend" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" - -[[package]] -name = "plotters-svg" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" -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.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "pretty_assertions" -version = "1.4.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" dependencies = [ - "diff", - "yansi", + "ansi_term", + "ctor", + "difference", + "output_vt100", ] [[package]] @@ -1663,9 +1506,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.24", + "quote 1.0.7", + "syn", "version_check", ] @@ -1675,22 +1518,22 @@ 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.24", + "quote 1.0.7", "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" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" +checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a" [[package]] name = "proc-macro2" @@ -1698,37 +1541,36 @@ version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" dependencies = [ - "unicode-xid", + "unicode-xid 0.1.0", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" dependencies = [ - "unicode-ident", + "unicode-xid 0.2.1", ] [[package]] -name = "profiling" -version = "1.0.17" +name = "publicsuffix" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +checksum = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" dependencies = [ - "profiling-procmacros", - "tracy-client", + "error-chain", + "idna 0.2.0", + "lazy_static", + "regex", + "url 2.2.0", ] [[package]] -name = "profiling-procmacros" -version = "1.0.17" +name = "quick-error" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" -dependencies = [ - "quote 1.0.42", - "syn 2.0.111", -] +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" @@ -1741,266 +1583,333 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" dependencies = [ - "proc-macro2 1.0.103", + "proc-macro2 1.0.24", ] [[package]] -name = "r-efi" -version = "5.3.0" +name = "rand" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +dependencies = [ + "autocfg 0.1.7", + "libc", + "rand_chacha 0.1.1", + "rand_core 0.4.2", + "rand_hc 0.1.0", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg", + "rand_xorshift", + "winapi 0.3.9", +] [[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", "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.3.1", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", ] [[package]] name = "rand_core" -version = "0.6.4" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ - "getrandom 0.2.16", + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +dependencies = [ + "libc", + "rand_core 0.4.2", + "winapi 0.3.9", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +dependencies = [ + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "winapi 0.3.9", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.4.2", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +dependencies = [ + "rand_core 0.3.1", ] [[package]] name = "rayon" -version = "1.11.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" dependencies = [ + "autocfg 1.0.1", + "crossbeam-deque 0.8.0", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.13.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "crossbeam-channel 0.5.0", + "crossbeam-deque 0.8.0", + "crossbeam-utils 0.8.1", + "lazy_static", + "num_cpus", ] [[package]] name = "rbx_binary" -version = "3.0.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f57d390e10fc236919088e9d973774bf006dcab137b443d1341a39317ebee4a" +checksum = "5b1c0c2b715bb763be1e27e5118e1f1ce0381f6c396a9cc8dd2c4b818cfa247d" dependencies = [ - "ahash", + "byteorder", "log", - "lz4_flex", - "profiling", + "lz4", "rbx_dom_weak", "rbx_reflection", - "rbx_reflection_database", - "serde", - "thiserror 1.0.69", - "zstd", + "snafu", ] [[package]] name = "rbx_dom_weak" -version = "4.2.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63614f84aae649ff71ef6e693d4fc9e2184c6ef55852d48a29685ebd0470114f" +checksum = "978b65ce742f3cb38c0b64ca48601a5590e6be9a14d12025b9cba2fe553b78c4" dependencies = [ - "ahash", - "rbx_types", + "base64 0.11.0", + "lazy_static", + "md5", "serde", - "ustr", + "serde_derive", + "serde_repr", + "uuid 0.8.1", ] [[package]] name = "rbx_reflection" -version = "7.0.0" +version = "3.3.454" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f53e5c4cf136060f7c514bd4d6f02436a57e36754c544965a7840123bc662d7" +checksum = "e9ccdde2a675eb13a8ecfe1f60879bf11ab29e9a671459d833929298873eedc4" dependencies = [ - "rbx_types", - "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "rbx_reflection_database" -version = "3.0.1+roblox-741" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d54d92786425d3fd3e4ba8f006b17d83f5e93dad6eb4fccf6f1d9d86222a7b" -dependencies = [ - "dirs 6.0.0", - "log", - "rbx_reflection", - "rmp-serde", - "serde", -] - -[[package]] -name = "rbx_types" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b89eefdd71f5e2a25543b1ead9f6ea2ed3fdfba8b397cbdb0de053eb2463e" -dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", - "blake3", + "bitflags", "lazy_static", - "rand", + "rbx_dom_weak", "serde", - "thiserror 1.0.69", ] [[package]] name = "rbx_xml" -version = "3.0.1" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df4dba3154bef50fe1ba41cf06a066b9cd33bcfbf1c103e8db0818d8b4528b31" +checksum = "6431f38b84582ec4e4f40b525cdcc713d4a984dcc2e3eecd1a67ae4da1172fbd" dependencies = [ - "ahash", - "base64 0.13.1", + "base64 0.11.0", "log", "rbx_dom_weak", "rbx_reflection", - "rbx_reflection_database", "xml-rs", ] +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.10.0", -] +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_users" -version = "0.4.6" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" 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", + "redox_syscall", + "rust-argon2", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" dependencies = [ "aho-corasick", "memchr", - "regex-automata", "regex-syntax", + "thread_local", ] [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "byteorder", ] [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" [[package]] -name = "reqwest" -version = "0.11.27" +name = "remove_dir_all" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg 0.50.0", + "winapi 0.3.9", ] [[package]] -name = "ring" -version = "0.17.14" +name = "reqwest" +version = "0.9.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +checksum = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" dependencies = [ - "cc", - "cfg-if 1.0.4", - "getrandom 0.2.16", - "libc", - "untrusted", - "windows-sys 0.52.0", + "base64 0.10.1", + "bytes", + "cookie", + "cookie_store", + "encoding_rs", + "flate2", + "futures", + "http", + "hyper", + "hyper-tls", + "log", + "mime", + "mime_guess", + "native-tls", + "serde", + "serde_json", + "serde_urlencoded", + "time", + "tokio", + "tokio-executor", + "tokio-io", + "tokio-threadpool", + "tokio-timer", + "url 1.7.2", + "uuid 0.7.4", + "winreg", ] [[package]] @@ -2028,100 +1937,75 @@ dependencies = [ ] [[package]] -name = "rmp" -version = "0.8.14" +name = "rlua" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "25fa5b2c667bae0b6218361e96d365e414fe4a0fa80f476b9631aa2dea2c6881" dependencies = [ - "byteorder", + "bitflags", + "bstr", + "cc", + "libc", "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" -dependencies = [ - "byteorder", - "rmp", - "serde", ] [[package]] name = "roblox_install" -version = "1.0.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bb8c693a387f1ae8d2026d82d8b0c175cc4777b97c1f7b12fdb3be595bb13" +checksum = "f80edbbbcd67bce7ddaf754d94276b30ae0a72eedfdf034c0c987f4a535e4a54" dependencies = [ - "dirs 2.0.2", - "thiserror 1.0.69", - "winreg 0.6.2", + "dirs", + "winreg", ] [[package]] name = "rojo" -version = "7.7.1" +version = "6.0.2" dependencies = [ "anyhow", "backtrace", "bincode", - "blake3", - "clap 3.2.25", "criterion", - "crossbeam-channel", + "crossbeam-channel 0.4.4", "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", + "lazy_static", "log", "maplit", "memofs", - "num_cpus", + "notify", "opener", "paste", - "pathdiff", "pretty_assertions", - "profiling", - "rayon", "rbx_binary", "rbx_dom_weak", "rbx_reflection", - "rbx_reflection_database", "rbx_xml", + "regex", "reqwest", "ritz", - "rmp-serde", + "rlua", "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", + "uuid 0.8.1", "walkdir", - "winreg 0.10.1", - "yaml-rust2", + "winreg", ] [[package]] @@ -2133,75 +2017,37 @@ dependencies = [ ] [[package]] -name = "rustc-demangle" -version = "0.1.26" +name = "rust-argon2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" +dependencies = [ + "base64 0.13.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils 0.8.1", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" [[package]] name = "rustc_version" -version = "0.4.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 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.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "same-file" @@ -2213,174 +2059,182 @@ dependencies = [ ] [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "schannel" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi 0.3.9", +] [[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.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +checksum = "c1759c2e3c8580017a484a7ac56d3abc5a6c1feadf88db2f3633f12ae4268c69" dependencies = [ - "ring", - "untrusted", + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f99b9d5e26d2a71633cc4f2ebae7cc9f874044e0c351a27e17892d76dce5678b" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] name = "semver" -version = "1.0.27" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.228" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" 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" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" dependencies = [ "half", "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.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", ] [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "1500e84d27fe482ed1dc791a56eddc2f230046a040fa908c08bda1d9fb615779" dependencies = [ "itoa", - "memchr", "ryu", "serde", - "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc6b7951b17b051f3210b063f12cc17320e2fe30ae05b0fe2a3abb068551c76" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", ] [[package]] name = "serde_urlencoded" -version = "0.7.1" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" dependencies = [ - "form_urlencoded", + "dtoa", "itoa", - "ryu", "serde", + "url 1.7.2", ] [[package]] name = "serde_yaml" -version = "0.8.26" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +checksum = "f7baae0a99f1a324984bcdc5f0718384c1f69775f1c7eec8b859b71b443e3fd7" dependencies = [ - "indexmap 1.9.3", - "ryu", + "dtoa", + "linked-hash-map", "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" - [[package]] name = "slab" -version = "0.4.11" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" -version = "1.15.1" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" +dependencies = [ + "maybe-uninit", +] + +[[package]] +name = "snafu" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab12d3c261b2308b0d80c26fffb58d17eba81a4be97890101f416b478c79ca7" +dependencies = [ + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" +dependencies = [ + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", +] [[package]] name = "snax" @@ -2392,140 +2246,109 @@ dependencies = [ ] [[package]] -name = "socket2" -version = "0.5.10" +name = "string" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" dependencies = [ - "libc", - "windows-sys 0.52.0", + "bytes", ] -[[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.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c" dependencies = [ - "strum_macros", + "clap", + "lazy_static", + "structopt-derive", ] [[package]] -name = "strum_macros" -version = "0.27.2" +name = "structopt-derive" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" 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.24", + "quote 1.0.7", + "syn", ] [[package]] name = "syn" -version = "1.0.109" +version = "1.0.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44" dependencies = [ - "proc-macro2 1.0.103", - "quote 1.0.42", - "unicode-ident", + "proc-macro2 1.0.24", + "quote 1.0.7", + "unicode-xid 0.2.1", ] -[[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" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" 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", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", + "unicode-xid 0.2.1", ] [[package]] name = "tempfile" -version = "3.23.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", + "cfg-if 0.1.10", + "libc", + "rand 0.7.3", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.9", ] [[package]] name = "termcolor" -version = "1.4.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd2d183bd3fac5f5fe38ddbeb4dc9aec4a39a9d7d59e7491d900302da01cbe1" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "termios" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" +dependencies = [ + "libc", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -2535,281 +2358,329 @@ 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.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e" 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.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56" 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", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" dependencies = [ - "cfg-if 1.0.4", + "lazy_static", ] [[package]] -name = "tinystr" -version = "0.8.2" +name = "time" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ - "displaydoc", - "zerovec", + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi 0.3.9", ] [[package]] name = "tinytemplate" -version = "1.2.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +checksum = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" dependencies = [ "serde", "serde_json", ] +[[package]] +name = "tinyvec" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f" +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.48.0" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" dependencies = [ "bytes", + "futures", + "mio", + "num_cpus", + "tokio-codec", + "tokio-current-thread", + "tokio-executor", + "tokio-fs", + "tokio-io", + "tokio-reactor", + "tokio-sync", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "tokio-udp", + "tokio-uds", +] + +[[package]] +name = "tokio-buf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" +dependencies = [ + "bytes", + "either", + "futures", +] + +[[package]] +name = "tokio-codec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" +dependencies = [ + "bytes", + "futures", + "tokio-io", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" +dependencies = [ + "futures", + "tokio-executor", +] + +[[package]] +name = "tokio-executor" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures", +] + +[[package]] +name = "tokio-fs" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4" +dependencies = [ + "futures", + "tokio-io", + "tokio-threadpool", +] + +[[package]] +name = "tokio-io" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" +dependencies = [ + "bytes", + "futures", + "log", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures", + "lazy_static", + "log", + "mio", + "num_cpus", + "parking_lot", + "slab", + "tokio-executor", + "tokio-io", + "tokio-sync", +] + +[[package]] +name = "tokio-sync" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" +dependencies = [ + "fnv", + "futures", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" +dependencies = [ + "bytes", + "futures", + "iovec", + "mio", + "tokio-io", + "tokio-reactor", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" +dependencies = [ + "crossbeam-deque 0.7.3", + "crossbeam-queue", + "crossbeam-utils 0.7.2", + "futures", + "lazy_static", + "log", + "num_cpus", + "slab", + "tokio-executor", +] + +[[package]] +name = "tokio-timer" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +dependencies = [ + "crossbeam-utils 0.7.2", + "futures", + "slab", + "tokio-executor", +] + +[[package]] +name = "tokio-udp" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82" +dependencies = [ + "bytes", + "futures", + "log", + "mio", + "tokio-codec", + "tokio-io", + "tokio-reactor", +] + +[[package]] +name = "tokio-uds" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0" +dependencies = [ + "bytes", + "futures", + "iovec", "libc", - "mio 1.1.0", - "pin-project-lite", - "socket2 0.6.1", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -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", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" -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", + "mio", + "mio-uds", + "tokio-codec", + "tokio-io", + "tokio-reactor", ] [[package]] name = "try-lock" -version = "0.2.5" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "tungstenite" -version = "0.20.1" +name = "try_from" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", + "cfg-if 0.1.10", ] -[[package]] -name = "twox-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" - [[package]] name = "typenum" -version = "1.19.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" [[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-ident" -version = "1.0.22" +name = "unicase" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" @@ -2818,200 +2689,169 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] -name = "untrusted" -version = "0.9.0" +name = "unicode-xid" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "url" -version = "2.5.7" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +dependencies = [ + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", +] + +[[package]] +name = "url" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" dependencies = [ "form_urlencoded", - "idna", - "percent-encoding", - "serde", + "idna 0.2.0", + "matches", + "percent-encoding 2.1.0", ] -[[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 = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" dependencies = [ - "getrandom 0.3.4", - "js-sys", - "serde", - "wasm-bindgen", + "rand 0.6.5", ] [[package]] -name = "valuable" -version = "0.1.1" +name = "uuid" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11" +dependencies = [ + "rand 0.7.3", + "serde", +] + +[[package]] +name = "vcpkg" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" + +[[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.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" [[package]] name = "walkdir" -version = "2.5.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" dependencies = [ "same-file", + "winapi 0.3.9", "winapi-util", ] [[package]] name = "want" -version = "0.3.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" dependencies = [ + "futures", + "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 = "wasm-bindgen" -version = "0.2.105" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "3cd364751395ca0f68cafb17666eee36b63077fb5ecd972bbcd74c90c4bf736e" 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.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1114f89ab1f4106e5b55e688b828c0ab0ea593a1ea7c094b141b14cbaaec2d62" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", "wasm-bindgen-shared", ] -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" -dependencies = [ - "cfg-if 1.0.4", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "7a6ac8995ead1f084a8dea1e65f194d0973800c7f571f6edd70adf06ecf77084" dependencies = [ - "quote 1.0.42", + "quote 1.0.7", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "b5a48c72f299d80557c7c62e37e7225369ecc0c963964059509fbafe917c7549" dependencies = [ - "bumpalo", - "proc-macro2 1.0.103", - "quote 1.0.42", - "syn 2.0.111", + "proc-macro2 1.0.24", + "quote 1.0.7", + "syn", + "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" -dependencies = [ - "unicode-ident", -] +checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158" [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "222b1ef9334f92a21d3fb53dc3fd80f30836959a90f9274a626d7e06315ba3c3" 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 +2882,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,354 +2895,6 @@ 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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[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" -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" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -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" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -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" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -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" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -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" - [[package]] name = "winreg" version = "0.6.2" @@ -3412,37 +2904,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -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,168 +2914,17 @@ 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.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a56132a0d6ecbe77352edc10232f788fc4ceefefff4cab784a98e0e16b6b51" -dependencies = [ - "xml", -] +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" [[package]] name = "yaml-rust" -version = "0.4.5" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +checksum = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d" 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..fb1eeafc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,18 @@ [package] name = "rojo" -version = "7.7.1" -rust-version = "1.88" -authors = [ - "Lucien Greathouse ", - "Micah Reid ", - "Ken Loeffler ", -] +version = "6.0.2" +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" -build = "build.rs" +edition = "2018" -exclude = ["/test-projects/**"] +exclude = [ + "/test-projects/**", +] [profile.dev] panic = "abort" @@ -30,105 +26,80 @@ 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" path = "src/lib.rs" +[[bin]] +name = "rojo" +path = "src/bin.rs" + [[bench]] name = "build" harness = false [dependencies] -memofs = { version = "0.4.0", path = "crates/memofs" } +memofs = { version = "0.1.2", 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_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" - -anyhow = "1.0.80" -backtrace = "0.3.69" -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" -humantime = "2.1.0" -hyper = { version = "0.14.28", features = ["server", "tcp", "http1"] } -hyper-tungstenite = "0.11.0" -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", -] } +anyhow = "1.0.27" +backtrace = "0.3" +bincode = "1.2.1" +crossbeam-channel = "0.4.0" +csv = "1.1.1" +env_logger = "0.7.1" +fs-err = "2.2.0" +futures = "0.1.29" +globset = "0.4.4" +humantime = "1.3.0" +hyper = "0.12.35" +jod-thread = "0.1.0" +lazy_static = "1.4.0" +log = "0.4.8" +maplit = "1.0.1" +notify = "4.0.14" +opener = "0.4.1" +rbx_binary = "0.5.0" +rbx_dom_weak = "1.10.1" +rbx_reflection = "3.3.408" +rbx_xml = "0.11.3" +regex = "1.3.1" +reqwest = "0.9.20" 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" +rlua = "0.17.0" +roblox_install = "0.2.2" +serde = { version = "1.0", features = ["derive", "rc"] } +serde_json = "1.0" +structopt = "0.3.5" +termcolor = "1.0.5" +thiserror = "1.0.11" +tokio = "0.1.22" +uuid = { version = "0.8.1", features = ["v4", "serde"] } [target.'cfg(windows)'.dependencies] -winreg = "0.10.1" +winreg = "0.6.2" [build-dependencies] -memofs = { version = "0.4.0", path = "crates/memofs" } +memofs = { version = "0.1.3", path = "memofs" } -embed-resource = "1.8.0" -anyhow = "1.0.80" -bincode = "1.3.3" -fs-err = "2.11.0" -maplit = "1.0.2" -semver = "1.0.22" +anyhow = "1.0.27" +bincode = "1.2.1" +fs-err = "2.3.0" +maplit = "1.0.1" [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" +insta = { version = "1.3.0", features = ["redactions"] } +lazy_static = "1.2" +paste = "0.1" +pretty_assertions = "0.6.1" +serde_yaml = "0.8.9" +tempfile = "3.0" +walkdir = "2.1" diff --git a/README.md b/README.md index f3d1aeeb..edf89258 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,21 @@
- Rojo + + Rojo +
 
- Actions status - Latest server version - Rojo Documentation + + Actions status + + + Latest server version + + + Rojo Documentation +

@@ -25,11 +33,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 +48,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.43.1 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/brand_images/icon-link-32.png b/assets/brand_images/icon-link-32.png deleted file mode 100644 index a69bbf99..00000000 Binary files a/assets/brand_images/icon-link-32.png and /dev/null differ diff --git a/assets/brand_images/icon-warn-32.png b/assets/brand_images/icon-warn-32.png deleted file mode 100644 index 2a8af730..00000000 Binary files a/assets/brand_images/icon-warn-32.png 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/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..fe2a840a 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,44 +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)?; - - println!("cargo:rerun-if-changed=build/windows/rojo-manifest.rc"); - println!("cargo:rerun-if-changed=build/windows/rojo.manifest"); - embed_resource::compile("build/windows/rojo-manifest.rc"); + bincode::serialize_into(out_file, &snapshot)?; Ok(()) } diff --git a/build/windows/rojo-manifest.rc b/build/windows/rojo-manifest.rc deleted file mode 100644 index 2e362020..00000000 --- a/build/windows/rojo-manifest.rc +++ /dev/null @@ -1,2 +0,0 @@ -#define RT_MANIFEST 24 -1 RT_MANIFEST "rojo.manifest" \ No newline at end of file diff --git a/build/windows/rojo.manifest b/build/windows/rojo.manifest deleted file mode 100644 index 62ed2721..00000000 --- a/build/windows/rojo.manifest +++ /dev/null @@ -1,8 +0,0 @@ - - - - - true - - - \ No newline at end of file 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..7fb33cb9 --- /dev/null +++ b/foreman.toml @@ -0,0 +1,3 @@ +[tools] +rojo = { source = "rojo-rbx/rojo", version = "6.0.0-rc.3" } +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..6a6aecde --- /dev/null +++ b/memofs/CHANGELOG.md @@ -0,0 +1,15 @@ +# memofs Changelog + +## Unreleased Changes + +## 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..12c67caa --- /dev/null +++ b/memofs/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "memofs" +description = "Virtual filesystem with configurable backends." +version = "0.1.3" +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.4.0" +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..6e9157db --- /dev/null +++ b/plugin/modules/testez @@ -0,0 +1 @@ +Subproject commit 6e9157db3c1a8b1558c54c50065e3562cab362e1 diff --git a/plugin/rbx_dom_lua/.luacheckrc b/plugin/rbx_dom_lua/.luacheckrc new file mode 100644 index 00000000..f1447162 --- /dev/null +++ b/plugin/rbx_dom_lua/.luacheckrc @@ -0,0 +1,44 @@ +stds.roblox = { + read_globals = { + game = { + other_fields = true, + }, + + -- Roblox globals + "script", + + -- Extra functions + "tick", "warn", + "wait", "typeof", + + -- Types + "CFrame", + "Color3", + "Enum", + "Instance", + "NumberRange", + "Rect", + "UDim", "UDim2", + "Vector2", "Vector3", + "Vector2int16", "Vector3int16", + } +} + +stds.testez = { + read_globals = { + "describe", + "it", "itFOCUS", "itSKIP", + "FOCUS", "SKIP", "HACK_NO_XPCALL", + "expect", + } +} + +ignore = { + "212", -- unused arguments +} + +std = "lua51+roblox" + +files["**/*.spec.lua"] = { + std = "+testez", +} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/EncodedValue.lua b/plugin/rbx_dom_lua/EncodedValue.lua deleted file mode 100644 index cddff6a3..00000000 --- a/plugin/rbx_dom_lua/EncodedValue.lua +++ /dev/null @@ -1,622 +0,0 @@ -local base64 = require(script.Parent.base64) - -local function identity(...) - return ... -end - -local function unpackDecoder(f) - return function(value) - return f(unpack(value)) - end -end - -local function serializeFloat(value) - -- TODO: Figure out a better way to serialize infinity and NaN, neither of - -- which fit into JSON. - if value == math.huge or value == -math.huge then - return 999999999 * math.sign(value) - end - - return value -end - -local ALL_AXES = { "X", "Y", "Z" } -local ALL_FACES = { "Right", "Top", "Back", "Left", "Bottom", "Front" } - -local EncodedValue = {} - -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 = {} - - for index, axisName in ipairs(pod) do - axes[index] = Enum.Axis[axisName] - end - - return Axes.new(unpack(axes)) - end, - - toPod = function(roblox) - local json = {} - - for _, axis in ipairs(ALL_AXES) do - if roblox[axis] then - table.insert(json, axis) - end - end - - return json - end, - }, - - BinaryString = { - fromPod = base64.decode, - toPod = base64.encode, - }, - - Bool = { - fromPod = identity, - toPod = identity, - }, - - BrickColor = { - fromPod = function(pod) - return BrickColor.new(pod) - end, - - toPod = function(roblox) - return roblox.Number - end, - }, - - CFrame = { - fromPod = function(pod) - 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], - orient[2][1], orient[2][2], orient[2][3], - orient[3][1], orient[3][2], orient[3][3] - ) - end, - - toPod = function(roblox) - local x, y, z, r00, r01, r02, r10, r11, r12, r20, r21, r22 = roblox:GetComponents() - - return { - position = { x, y, z }, - orientation = { - { r00, r01, r02 }, - { r10, r11, r12 }, - { r20, r21, r22 }, - }, - } - end, - }, - - Color3 = { - fromPod = unpackDecoder(Color3.new), - - toPod = function(roblox) - return { roblox.r, roblox.g, roblox.b } - end, - }, - - Color3uint8 = { - fromPod = unpackDecoder(Color3.fromRGB), - - toPod = function(roblox) - return { - math.round(roblox.R * 255), - math.round(roblox.G * 255), - math.round(roblox.B * 255), - } - end, - }, - - ColorSequence = { - fromPod = function(pod) - local keypoints = {} - - for index, keypoint in ipairs(pod.keypoints) do - keypoints[index] = ColorSequenceKeypoint.new(keypoint.time, types.Color3.fromPod(keypoint.color)) - end - - return ColorSequence.new(keypoints) - end, - - toPod = function(roblox) - local keypoints = {} - - for index, keypoint in ipairs(roblox.Keypoints) do - keypoints[index] = { - time = keypoint.Time, - color = types.Color3.toPod(keypoint.Value), - } - end - - return { - keypoints = keypoints, - } - end, - }, - - 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, - }, - - Enum = { - fromPod = identity, - - toPod = function(roblox) - -- FIXME: More robust handling of enums - if typeof(roblox) == "number" then - return roblox - else - return roblox.Value - end - 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 = {} - - for index, faceName in ipairs(pod) do - faces[index] = Enum.NormalId[faceName] - end - - return Faces.new(unpack(faces)) - end, - - toPod = function(roblox) - local pod = {} - - for _, face in ipairs(ALL_FACES) do - if roblox[face] then - table.insert(pod, face) - end - end - - return pod - end, - }, - - Float32 = { - fromPod = identity, - toPod = serializeFloat, - }, - - Float64 = { - fromPod = identity, - 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, - }, - - Int64 = { - fromPod = identity, - 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 } - end, - }, - - NumberSequence = { - fromPod = function(pod) - 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) - end - - return NumberSequence.new(keypoints) - end, - - toPod = function(roblox) - local keypoints = {} - - for index, keypoint in ipairs(roblox.Keypoints) do - keypoints[index] = { - time = keypoint.Time, - value = keypoint.Value, - envelope = keypoint.Envelope, - } - end - - return { - keypoints = keypoints, - } - end, - }, - - PhysicalProperties = { - fromPod = function(pod) - 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 - end - end, - - toPod = function(roblox) - if roblox == nil then - return "Default" - else - return { - density = roblox.Density, - friction = roblox.Friction, - elasticity = roblox.Elasticity, - frictionWeight = roblox.FrictionWeight, - elasticityWeight = roblox.ElasticityWeight, - acousticAbsorption = roblox.AcousticAbsorption, - } - end - end, - }, - - Ray = { - fromPod = function(pod) - return Ray.new(types.Vector3.fromPod(pod.origin), types.Vector3.fromPod(pod.direction)) - end, - - toPod = function(roblox) - return { - origin = types.Vector3.toPod(roblox.Origin), - direction = types.Vector3.toPod(roblox.Direction), - } - end, - }, - - Rect = { - fromPod = function(pod) - return Rect.new(types.Vector2.fromPod(pod[1]), types.Vector2.fromPod(pod[2])) - end, - - toPod = function(roblox) - return { - types.Vector2.toPod(roblox.Min), - types.Vector2.toPod(roblox.Max), - } - end, - }, - - Ref = { - fromPod = function(_) - error("Ref cannot be decoded on its own") - end, - - toPod = function(_) - error("Ref can not be encoded on its own") - end, - }, - - Region3 = { - fromPod = function(_) - error("Region3 is not implemented") - end, - - toPod = function(_) - error("Region3 is not implemented") - end, - }, - - Region3int16 = { - fromPod = function(pod) - return Region3int16.new(types.Vector3int16.fromPod(pod[1]), types.Vector3int16.fromPod(pod[2])) - end, - - toPod = function(roblox) - return { - types.Vector3int16.toPod(roblox.Min), - types.Vector3int16.toPod(roblox.Max), - } - end, - }, - - SharedString = { - fromPod = function(_pod) - error("SharedString is not supported") - end, - - toPod = function(_roblox) - error("SharedString is not supported") - end, - }, - - String = { - fromPod = identity, - toPod = identity, - }, - - UDim = { - fromPod = unpackDecoder(UDim.new), - - toPod = function(roblox) - return { roblox.Scale, roblox.Offset } - end, - }, - - UDim2 = { - fromPod = function(pod) - return UDim2.new(types.UDim.fromPod(pod[1]), types.UDim.fromPod(pod[2])) - end, - - toPod = function(roblox) - return { - types.UDim.toPod(roblox.X), - types.UDim.toPod(roblox.Y), - } - end, - }, - - Tags = { - fromPod = identity, - toPod = identity, - }, - - Vector2 = { - fromPod = unpackDecoder(Vector2.new), - - toPod = function(roblox) - return { - serializeFloat(roblox.X), - serializeFloat(roblox.Y), - } - end, - }, - - Vector2int16 = { - fromPod = unpackDecoder(Vector2int16.new), - - toPod = function(roblox) - return { roblox.X, roblox.Y } - end, - }, - - Vector3 = { - fromPod = unpackDecoder(Vector3.new), - - toPod = function(roblox) - return { - serializeFloat(roblox.X), - serializeFloat(roblox.Y), - serializeFloat(roblox.Z), - } - end, - }, - - Vector3int16 = { - fromPod = unpackDecoder(Vector3int16.new), - - toPod = function(roblox) - 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, -} - -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) - end - - return true, typeImpl.fromPod(value) -end - -function EncodedValue.encode(rbxValue, propertyType) - assert(propertyType ~= nil, "Property type descriptor is required") - - local typeImpl = types[propertyType] - if typeImpl == nil then - return false, ("Missing encoder for property type %q"):format(propertyType) - end - - return true, { - [propertyType] = typeImpl.toPod(rbxValue), - } -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/README.md b/plugin/rbx_dom_lua/README.md new file mode 100644 index 00000000..437e37c1 --- /dev/null +++ b/plugin/rbx_dom_lua/README.md @@ -0,0 +1,2 @@ +# rbx_dom_lua +Roblox Lua implementation of rbx-dom mechanisms, intended to work with rbx_dom_weak and friends. \ No newline at end of file diff --git a/plugin/rbx_dom_lua/allValues.json b/plugin/rbx_dom_lua/allValues.json deleted file mode 100644 index 6c74956d..00000000 --- a/plugin/rbx_dom_lua/allValues.json +++ /dev/null @@ -1,583 +0,0 @@ -{ - "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": [ - "X", - "Y", - "Z" - ] - }, - "ty": "Axes" - }, - "BinaryString": { - "value": { - "BinaryString": "SGVsbG8h" - }, - "ty": "BinaryString" - }, - "Bool": { - "value": { - "Bool": true - }, - "ty": "Bool" - }, - "BrickColor": { - "value": { - "BrickColor": 1004 - }, - "ty": "BrickColor" - }, - "CFrame": { - "value": { - "CFrame": { - "position": [ - 1.0, - 2.0, - 3.0 - ], - "orientation": [ - [ - 4.0, - 5.0, - 6.0 - ], - [ - 7.0, - 8.0, - 9.0 - ], - [ - 10.0, - 11.0, - 12.0 - ] - ] - } - }, - "ty": "CFrame" - }, - "Color3": { - "value": { - "Color3": [ - 1.0, - 2.0, - 3.0 - ] - }, - "ty": "Color3" - }, - "Color3uint8": { - "value": { - "Color3uint8": [ - 0, - 128, - 255 - ] - }, - "ty": "Color3uint8" - }, - "ColorSequence": { - "value": { - "ColorSequence": { - "keypoints": [ - { - "time": 0.0, - "color": [ - 1.0, - 1.0, - 0.5 - ] - }, - { - "time": 1.0, - "color": [ - 0.0, - 0.0, - 0.0 - ] - } - ] - } - }, - "ty": "ColorSequence" - }, - "ContentId": { - "value": { - "ContentId": "rbxassetid://12345" - }, - "ty": "ContentId" - }, - "Content_None": { - "value": { - "Content": "None" - }, - "ty": "Content" - }, - "Content_Uri": { - "value": { - "Content": { - "Uri": "rbxasset://abc/123.rojo" - } - }, - "ty": "Content" - }, - "Enum": { - "value": { - "Enum": 1234 - }, - "ty": "Enum" - }, - "EnumItem": { - "value": { - "EnumItem": { - "type": "Material", - "value": 256 - } - }, - "ty": "EnumItem" - }, - "Faces": { - "value": { - "Faces": [ - "Right", - "Top", - "Back", - "Left", - "Bottom", - "Front" - ] - }, - "ty": "Faces" - }, - "Float32": { - "value": { - "Float32": 15.0 - }, - "ty": "Float32" - }, - "Float64": { - "value": { - "Float64": 15123.0 - }, - "ty": "Float64" - }, - "Font": { - "value": { - "Font": { - "family": "rbxasset://fonts/families/SourceSansPro.json", - "weight": "Regular", - "style": "Normal", - "cachedFaceId": null - } - }, - "ty": "Font" - }, - "Int32": { - "value": { - "Int32": 6014 - }, - "ty": "Int32" - }, - "Int64": { - "value": { - "Int64": 23491023 - }, - "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": [ - -36.0, - 94.0 - ] - }, - "ty": "NumberRange" - }, - "NumberSequence": { - "value": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 5.0, - "envelope": 2.0 - }, - { - "time": 1.0, - "value": 22.0, - "envelope": 0.0 - } - ] - } - }, - "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": { - "density": 0.5, - "friction": 1.0, - "elasticity": 0.0, - "frictionWeight": 50.0, - "elasticityWeight": 25.0, - "acousticAbsorption": 0.15625 - } - }, - "ty": "PhysicalProperties" - }, - "PhysicalProperties-Default": { - "value": { - "PhysicalProperties": "Default" - }, - "ty": "PhysicalProperties" - }, - "Ray": { - "value": { - "Ray": { - "origin": [ - 1.0, - 2.0, - 3.0 - ], - "direction": [ - 4.0, - 5.0, - 6.0 - ] - } - }, - "ty": "Ray" - }, - "Rect": { - "value": { - "Rect": [ - [ - 0.0, - 5.0 - ], - [ - 10.0, - 15.0 - ] - ] - }, - "ty": "Rect" - }, - "Region3int16": { - "value": { - "Region3int16": [ - [ - -10, - -5, - 0 - ], - [ - 5, - 10, - 15 - ] - ] - }, - "ty": "Region3int16" - }, - "String": { - "value": { - "String": "Hello, world!" - }, - "ty": "String" - }, - "Tags": { - "value": { - "Tags": [ - "foo", - "con'fusion?!", - "bar" - ] - }, - "ty": "Tags" - }, - "UDim": { - "value": { - "UDim": [ - 1.0, - 32 - ] - }, - "ty": "UDim" - }, - "UDim2": { - "value": { - "UDim2": [ - [ - -1.0, - 100 - ], - [ - 1.0, - -100 - ] - ] - }, - "ty": "UDim2" - }, - "Vector2": { - "value": { - "Vector2": [ - -50.0, - 50.0 - ] - }, - "ty": "Vector2" - }, - "Vector2int16": { - "value": { - "Vector2int16": [ - -300, - 300 - ] - }, - "ty": "Vector2int16" - }, - "Vector3": { - "value": { - "Vector3": [ - -300.0, - 0.0, - 1500.0 - ] - }, - "ty": "Vector3" - }, - "Vector3int16": { - "value": { - "Vector3int16": [ - 60, - 37, - -450 - ] - }, - "ty": "Vector3int16" - } -} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/base64.lua b/plugin/rbx_dom_lua/base64.lua deleted file mode 100644 index 0c6f2abc..00000000 --- a/plugin/rbx_dom_lua/base64.lua +++ /dev/null @@ -1,10 +0,0 @@ -local EncodingService = game:GetService("EncodingService") - -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, -} diff --git a/plugin/rbx_dom_lua/customProperties.lua b/plugin/rbx_dom_lua/customProperties.lua deleted file mode 100644 index 0df57c32..00000000 --- a/plugin/rbx_dom_lua/customProperties.lua +++ /dev/null @@ -1,235 +0,0 @@ -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) - end, - write = function(instance, _, value) - local existingTags = CollectionService:GetTags(instance) - - local unseenTags = {} - for _, tag in ipairs(existingTags) do - unseenTags[tag] = true - end - - for _, tag in ipairs(value) do - unseenTags[tag] = nil - CollectionService:AddTag(instance, tag) - end - - for tag in pairs(unseenTags) do - CollectionService:RemoveTag(instance, tag) - end - - return true - end, - }, - }, - LocalizationTable = { - Contents = { - read = function(instance, _) - return true, instance:GetContents() - end, - write = function(instance, _, 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 deleted file mode 100644 index 0b7ccb9c..00000000 --- a/plugin/rbx_dom_lua/database.json +++ /dev/null @@ -1,104617 +0,0 @@ -{ - "Version": [ - 0, - 741, - 19, - 7411056 - ], - "Classes": { - "Accessory": { - "Name": "Accessory", - "Tags": [], - "Superclass": "Accoutrement", - "Properties": { - "AccessoryType": { - "Name": "AccessoryType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AccessoryType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AccessoryType": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "AttachmentPoint": { - "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 - ] - ] - } - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "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" - } - } - }, - "Accoutrement": { - "Name": "Accoutrement", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AttachmentForward": { - "Name": "AttachmentForward", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AttachmentPoint": { - "Name": "AttachmentPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AttachmentPos": { - "Name": "AttachmentPos", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AttachmentRight": { - "Name": "AttachmentRight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AttachmentUp": { - "Name": "AttachmentUp", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BackendAccoutrementState": { - "Name": "BackendAccoutrementState", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "AttachmentPoint": { - "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 - ] - ] - } - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "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" - } - } - }, - "Actor": { - "Name": "Actor", - "Tags": [], - "Superclass": "Model", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "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": [] - }, - "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" - } - } - }, - "AdService": { - "Name": "AdService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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" - } - } - }, - "AlignOrientation": { - "Name": "AlignOrientation", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "AlignType": { - "Name": "AlignType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AlignType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LookAtPosition": { - "Name": "LookAtPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxAngularVelocity": { - "Name": "MaxAngularVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Mode": { - "Name": "Mode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "OrientationAlignmentMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrimaryAxis": { - "Name": "PrimaryAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PrimaryAxisOnly": { - "Name": "PrimaryAxisOnly", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReactionTorqueEnabled": { - "Name": "ReactionTorqueEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Responsiveness": { - "Name": "Responsiveness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RigidityEnabled": { - "Name": "RigidityEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondaryAxis": { - "Name": "SecondaryAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "AlignType": { - "Enum": 5 - }, - "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 - }, - "Color": { - "BrickColor": 23 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxAngularVelocity": { - "Float32": null - }, - "MaxTorque": { - "Float32": 10000.0 - }, - "Mode": { - "Enum": 1 - }, - "PrimaryAxisOnly": { - "Bool": false - }, - "ReactionTorqueEnabled": { - "Bool": false - }, - "Responsiveness": { - "Float32": 10.0 - }, - "RigidityEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "AlignPosition": { - "Name": "AlignPosition", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "ApplyAtCenterOfMass": { - "Name": "ApplyAtCenterOfMass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxVelocity": { - "Name": "MaxVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Mode": { - "Name": "Mode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PositionAlignmentMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReactionForceEnabled": { - "Name": "ReactionForceEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Responsiveness": { - "Name": "Responsiveness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RigidityEnabled": { - "Name": "RigidityEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "ApplyAtCenterOfMass": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 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 - }, - "MaxVelocity": { - "Float32": null - }, - "Mode": { - "Enum": 1 - }, - "Position": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ReactionForceEnabled": { - "Bool": false - }, - "Responsiveness": { - "Float32": 10.0 - }, - "RigidityEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "AnalyticsService": { - "Name": "AnalyticsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ApiKey": { - "Name": "ApiKey", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AngularVelocity": { - "Name": "AngularVelocity", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "AngularVelocity": { - "Name": "AngularVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReactionTorqueEnabled": { - "Name": "ReactionTorqueEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RelativeTo": { - "Name": "RelativeTo", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorRelativeTo" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AngularVelocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 23 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxTorque": { - "Float32": 0.0 - }, - "ReactionTorqueEnabled": { - "Bool": false - }, - "RelativeTo": { - "Enum": 2 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AnimationId": { - "Name": "AnimationId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "AnimationContent", - "Migration": "ContentIdToContent" - } - } - } - } - } - }, - "DefaultProperties": { - "AnimationContent": { - "Content": "None" - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationClip": { - "Name": "AnimationClip", - "Tags": [ - "NotCreatable" - ], - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AnimationPriority" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AnimationClipProvider": { - "Name": "AnimationClipProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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 - } - } - }, - "AnimationController": { - "Name": "AnimationController", - "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" - } - } - }, - "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" - } - } - }, - "AnimationRigData": { - "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" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Generic": { - "BinaryString": "/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAA==" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "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" - } - } - }, - "AnimationTrack": { - "Name": "AnimationTrack", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Animation": { - "Name": "Animation", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPlaying": { - "Name": "IsPlaying", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Length": { - "Name": "Length", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Looped": { - "Name": "Looped", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Priority": { - "Name": "Priority", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AnimationPriority" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Speed": { - "Name": "Speed", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimePosition": { - "Name": "TimePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WeightCurrent": { - "Name": "WeightCurrent", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WeightTarget": { - "Name": "WeightTarget", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "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" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PreferLodEnabled": { - "Bool": true - }, - "Sandboxed": { - "Bool": false - }, - "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" - } - } - }, - "AppStorageService": { - "Name": "AppStorageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "LocalStorageService", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AppUpdateService": { - "Name": "AppUpdateService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ArcHandles": { - "Name": "ArcHandles", - "Tags": [], - "Superclass": "HandlesBase", - "Properties": { - "Axes": { - "Name": "Axes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Axes" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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": {} - }, - "Axes": { - "Axes": [ - "X", - "Y", - "Z" - ] - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - } - } - }, - "AssetCounterService": { - "Name": "AssetCounterService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AssetDeliveryProxy": { - "Name": "AssetDeliveryProxy", - "Tags": [ - "NotCreatable", - "NotReplicated", - "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" - } - } - }, - "AssetImportService": { - "Name": "AssetImportService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "AssetManagerService": { - "Name": "AssetManagerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "AssetService": { - "Name": "AssetService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AllowInsertFreeAssets": { - "Name": "AllowInsertFreeAssets", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AllowInsertFreeAssets": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "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" - } - } - }, - "Atmosphere": { - "Name": "Atmosphere", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Decay": { - "Name": "Decay", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Density": { - "Name": "Density", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Glare": { - "Name": "Glare", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Haze": { - "Name": "Haze", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Offset": { - "Name": "Offset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 0.7843, - 0.6667, - 0.4235 - ] - }, - "Decay": { - "Color3": [ - 0.3608, - 0.2353, - 0.0549 - ] - }, - "Density": { - "Float32": 0.395 - }, - "Glare": { - "Float32": 0.0 - }, - "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 - } - } - }, - "Attachment": { - "Name": "Attachment", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Axis": { - "Name": "Axis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Orientation": { - "Name": "Orientation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Rotation": { - "Name": "Rotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SecondaryAxis": { - "Name": "SecondaryAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Visible": { - "Name": "Visible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WorldAxis": { - "Name": "WorldAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WorldCFrame": { - "Name": "WorldCFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WorldOrientation": { - "Name": "WorldOrientation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WorldPosition": { - "Name": "WorldPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WorldRotation": { - "Name": "WorldRotation", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WorldSecondaryAxis": { - "Name": "WorldSecondaryAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "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 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "AvatarImportService": { - "Name": "AvatarImportService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "Backpack": { - "Name": "Backpack", - "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" - } - } - }, - "BackpackItem": { - "Name": "BackpackItem", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Model", - "Properties": { - "TextureContent": { - "Name": "TextureContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - } - } - }, - "BadgeService": { - "Name": "BadgeService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxFrictionTorque": { - "Name": "MaxFrictionTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxFrictionTorqueXml": { - "Name": "MaxFrictionTorqueXml", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Restitution": { - "Name": "Restitution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TwistLimitsEnabled": { - "Name": "TwistLimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TwistLowerAngle": { - "Name": "TwistLowerAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TwistUpperAngle": { - "Name": "TwistUpperAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UpperAngle": { - "Name": "UpperAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 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": [] - }, - "TwistLimitsEnabled": { - "Bool": false - }, - "TwistLowerAngle": { - "Float32": -45.0 - }, - "TwistUpperAngle": { - "Float32": 45.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpperAngle": { - "Float32": 45.0 - }, - "Visible": { - "Bool": false - } - } - }, - "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": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "PVInstance", - "Properties": { - "Anchored": { - "Name": "Anchored", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AssemblyAngularVelocity": { - "Name": "AssemblyAngularVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AssemblyCenterOfMass": { - "Name": "AssemblyCenterOfMass", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AssemblyLinearVelocity": { - "Name": "AssemblyLinearVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AssemblyMass": { - "Name": "AssemblyMass", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AssemblyRootPart": { - "Name": "AssemblyRootPart", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AudioCanCollide": { - "Name": "AudioCanCollide", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackParamA": { - "Name": "BackParamA", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackParamB": { - "Name": "BackParamB", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackSurface": { - "Name": "BackSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SurfaceType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackSurfaceInput": { - "Name": "BackSurfaceInput", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputType" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BottomParamA": { - "Name": "BottomParamA", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BottomParamB": { - "Name": "BottomParamB", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BottomSurface": { - "Name": "BottomSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SurfaceType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BottomSurfaceInput": { - "Name": "BottomSurfaceInput", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputType" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BrickColor": { - "Name": "BrickColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "Color", - "Migration": "BrickColorToColor" - } - } - } - } - }, - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanCollide": { - "Name": "CanCollide", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanQuery": { - "Name": "CanQuery", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanTouch": { - "Name": "CanTouch", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CastShadow": { - "Name": "CastShadow", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CenterOfMass": { - "Name": "CenterOfMass", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGroupReplicate": { - "Name": "CollisionGroupReplicate", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "Color3uint8" - } - } - } - }, - "Color3uint8": { - "Name": "Color3uint8", - "Scriptability": "None", - "DataType": { - "Value": "Color3uint8" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Color" - } - } - }, - "CurrentPhysicalProperties": { - "Name": "CurrentPhysicalProperties", - "Scriptability": "Read", - "DataType": { - "Value": "PhysicalProperties" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CustomPhysicalProperties": { - "Name": "CustomPhysicalProperties", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "PhysicalProperties" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggingV1": { - "Name": "DraggingV1", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Elasticity": { - "Name": "Elasticity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FrontParamA": { - "Name": "FrontParamA", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FrontParamB": { - "Name": "FrontParamB", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FrontSurface": { - "Name": "FrontSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SurfaceType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FrontSurfaceInput": { - "Name": "FrontSurfaceInput", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputType" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftParamA": { - "Name": "LeftParamA", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftParamB": { - "Name": "LeftParamB", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftSurface": { - "Name": "LeftSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SurfaceType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftSurfaceInput": { - "Name": "LeftSurfaceInput", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputType" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Locked": { - "Name": "Locked", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Mass": { - "Name": "Mass", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Massless": { - "Name": "Massless", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Material": { - "Name": "Material", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "Material" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicsRepRootPart": { - "Name": "PhysicsRepRootPart", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PivotOffset": { - "Name": "PivotOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReceiveAge": { - "Name": "ReceiveAge", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Reflectance": { - "Name": "Reflectance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResizeIncrement": { - "Name": "ResizeIncrement", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ResizeableFaces": { - "Name": "ResizeableFaces", - "Scriptability": "Read", - "DataType": { - "Value": "Faces" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightParamA": { - "Name": "RightParamA", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightParamB": { - "Name": "RightParamB", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightSurface": { - "Name": "RightSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SurfaceType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightSurfaceInput": { - "Name": "RightSurfaceInput", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputType" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootPriority": { - "Name": "RootPriority", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RotVelocity": { - "Name": "RotVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rotation": { - "Name": "Rotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "size" - } - } - } - }, - "SpecificGravity": { - "Name": "SpecificGravity", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TopParamA": { - "Name": "TopParamA", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TopParamB": { - "Name": "TopParamB", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TopSurface": { - "Name": "TopSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SurfaceType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TopSurfaceInput": { - "Name": "TopSurfaceInput", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InputType" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Velocity": { - "Name": "Velocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "brickColor": { - "Name": "brickColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "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" - } - } - }, - "size": { - "Name": "size", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Size" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BasePlayerGui": { - "Name": "BasePlayerGui", - "Tags": [ - "NotCreatable" - ], - "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" - } - } - }, - "BaseScript": { - "Name": "BaseScript", - "Tags": [ - "NotCreatable" - ], - "Superclass": "LuaSourceContainer", - "Properties": { - "Disabled": { - "Name": "Disabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CageMeshId": { - "Name": "CageMeshId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "CageMeshContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "CageOrigin": { - "Name": "CageOrigin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CageOriginWorld": { - "Name": "CageOriginWorld", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImportOriginWorld": { - "Name": "ImportOriginWorld", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "Beam": { - "Name": "Beam", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Attachment0": { - "Name": "Attachment0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Attachment1": { - "Name": "Attachment1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ColorSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurveSize0": { - "Name": "CurveSize0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurveSize1": { - "Name": "CurveSize1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FaceCamera": { - "Name": "FaceCamera", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightEmission": { - "Name": "LightEmission", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightInfluence": { - "Name": "LightInfluence", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Segments": { - "Name": "Segments", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextureLength": { - "Name": "TextureLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextureMode": { - "Name": "TextureMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextureMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextureSpeed": { - "Name": "TextureSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Width0": { - "Name": "Width0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Width1": { - "Name": "Width1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZOffset": { - "Name": "ZOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Brightness": { - "Float32": 1.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "ColorSequence": { - "keypoints": [ - { - "time": 0.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - }, - { - "time": 1.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - } - ] - } - }, - "CurveSize0": { - "Float32": 0.0 - }, - "CurveSize1": { - "Float32": 0.0 - }, - "Enabled": { - "Bool": true - }, - "FaceCamera": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LightEmission": { - "Float32": 0.0 - }, - "LightInfluence": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "Segments": { - "Int32": 10 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "TextureLength": { - "Float32": 1.0 - }, - "TextureMode": { - "Enum": 0 - }, - "TextureSpeed": { - "Float32": 1.0 - }, - "Transparency": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 0.5, - "envelope": 0.0 - }, - { - "time": 1.0, - "value": 0.5, - "envelope": 0.0 - } - ] - } - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Width0": { - "Float32": 1.0 - }, - "Width1": { - "Float32": 1.0 - }, - "ZOffset": { - "Float32": 0.0 - } - } - }, - "BevelMesh": { - "Name": "BevelMesh", - "Tags": [ - "Deprecated", - "NotBrowsable", - "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" - } - } - }, - "BillboardGui": { - "Name": "BillboardGui", - "Tags": [], - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClipsDescendants": { - "Name": "ClipsDescendants", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentDistance": { - "Name": "CurrentDistance", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DistanceLowerLimit": { - "Name": "DistanceLowerLimit", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DistanceStep": { - "Name": "DistanceStep", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DistanceUpperLimit": { - "Name": "DistanceUpperLimit", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExtentsOffset": { - "Name": "ExtentsOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExtentsOffsetWorldSpace": { - "Name": "ExtentsOffsetWorldSpace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightInfluence": { - "Name": "LightInfluence", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDistance": { - "Name": "MaxDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerToHideFrom": { - "Name": "PlayerToHideFrom", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SizeOffset": { - "Name": "SizeOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudsOffset": { - "Name": "StudsOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudsOffsetWorldSpace": { - "Name": "StudsOffsetWorldSpace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": false - }, - "AlwaysOnTop": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Brightness": { - "Float32": 1.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendants": { - "Bool": false - }, - "DistanceLowerLimit": { - "Float32": 0.0 - }, - "DistanceUpperLimit": { - "Float32": -1.0 - }, - "Enabled": { - "Bool": true - }, - "ExtentsOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ExtentsOffsetWorldSpace": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LightInfluence": { - "Float32": 0.0 - }, - "MaxDistance": { - "Float32": null - }, - "ResetOnSpawn": { - "Bool": true - }, - "Sandboxed": { - "Bool": false - }, - "SelectionBehaviorDown": { - "Enum": 0 - }, - "SelectionBehaviorLeft": { - "Enum": 0 - }, - "SelectionBehaviorRight": { - "Enum": 0 - }, - "SelectionBehaviorUp": { - "Enum": 0 - }, - "SelectionGroup": { - "Bool": false - }, - "Size": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeOffset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "StudsOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "StudsOffsetWorldSpace": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ZIndexBehavior": { - "Enum": 0 - } - } - }, - "BinaryStringValue": { - "Name": "BinaryStringValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "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" - }, - "Value": { - "BinaryString": "" - } - } - }, - "BindableEvent": { - "Name": "BindableEvent", - "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" - } - } - }, - "BindableFunction": { - "Name": "BindableFunction", - "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" - } - } - }, - "BlockMesh": { - "Name": "BlockMesh", - "Tags": [], - "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" - }, - "Offset": { - "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" - }, - "VertexColor": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - } - } - }, - "BloomEffect": { - "Name": "BloomEffect", - "Tags": [], - "Superclass": "PostEffect", - "Properties": { - "Intensity": { - "Name": "Intensity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "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 - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Intensity": { - "Float32": 0.4 - }, - "Sandboxed": { - "Bool": false - }, - "Size": { - "Float32": 24.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Threshold": { - "Float32": 0.95 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BlurEffect": { - "Name": "BlurEffect", - "Tags": [], - "Superclass": "PostEffect", - "Properties": { - "Size": { - "Name": "Size", - "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" - }, - "Sandboxed": { - "Bool": false - }, - "Size": { - "Float32": 24.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BodyAngularVelocity": { - "Name": "BodyAngularVelocity", - "Tags": [ - "Deprecated" - ], - "Superclass": "BodyMover", - "Properties": { - "AngularVelocity": { - "Name": "AngularVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "P": { - "Name": "P", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "angularvelocity": { - "Name": "angularvelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "AngularVelocity" - } - } - }, - "maxTorque": { - "Name": "maxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "MaxTorque" - } - } - } - }, - "DefaultProperties": { - "AngularVelocity": { - "Vector3": [ - 0.0, - 2.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxTorque": { - "Vector3": [ - 4000.0, - 4000.0, - 4000.0 - ] - }, - "P": { - "Float32": 1250.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BodyColors": { - "Name": "BodyColors", - "Tags": [], - "Superclass": "CharacterAppearance", - "Properties": { - "HeadColor": { - "Name": "HeadColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HeadColor3": { - "Name": "HeadColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftArmColor": { - "Name": "LeftArmColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftArmColor3": { - "Name": "LeftArmColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftLegColor": { - "Name": "LeftLegColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLegColor3": { - "Name": "LeftLegColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightArmColor": { - "Name": "RightArmColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightArmColor3": { - "Name": "RightArmColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightLegColor": { - "Name": "RightLegColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightLegColor3": { - "Name": "RightLegColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TorsoColor": { - "Name": "TorsoColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TorsoColor3": { - "Name": "TorsoColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HeadColor3": { - "Color3": [ - 0.9921569, - 0.9176471, - 0.5529412 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LeftArmColor3": { - "Color3": [ - 0.9921569, - 0.9176471, - 0.5529412 - ] - }, - "LeftLegColor3": { - "Color3": [ - 0.050980397, - 0.41176474, - 0.6745098 - ] - }, - "RightArmColor3": { - "Color3": [ - 0.9921569, - 0.9176471, - 0.5529412 - ] - }, - "RightLegColor3": { - "Color3": [ - 0.050980397, - 0.41176474, - 0.6745098 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TorsoColor3": { - "Color3": [ - 0.15686275, - 0.49803925, - 0.2784314 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BodyForce": { - "Name": "BodyForce", - "Tags": [ - "Deprecated" - ], - "Superclass": "BodyMover", - "Properties": { - "Force": { - "Name": "Force", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "force": { - "Name": "force", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Force" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Force": { - "Vector3": [ - 0.0, - 1.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BodyGyro": { - "Name": "BodyGyro", - "Tags": [ - "Deprecated" - ], - "Superclass": "BodyMover", - "Properties": { - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "D": { - "Name": "D", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "P": { - "Name": "P", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "cframe": { - "Name": "cframe", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "CFrame" - } - } - }, - "maxTorque": { - "Name": "maxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "MaxTorque" - } - } - } - }, - "DefaultProperties": { - "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 - }, - "D": { - "Float32": 500.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxTorque": { - "Vector3": [ - 400000.0, - 0.0, - 400000.0 - ] - }, - "P": { - "Float32": 3000.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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" - } - } - }, - "BodyPosition": { - "Name": "BodyPosition", - "Tags": [ - "Deprecated" - ], - "Superclass": "BodyMover", - "Properties": { - "D": { - "Name": "D", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxForce": { - "Name": "MaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "P": { - "Name": "P", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "maxForce": { - "Name": "maxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "MaxForce" - } - } - }, - "position": { - "Name": "position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Position" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "D": { - "Float32": 1250.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxForce": { - "Vector3": [ - 4000.0, - 4000.0, - 4000.0 - ] - }, - "P": { - "Float32": 10000.0 - }, - "Position": { - "Vector3": [ - 0.0, - 50.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BodyThrust": { - "Name": "BodyThrust", - "Tags": [ - "Deprecated" - ], - "Superclass": "BodyMover", - "Properties": { - "Force": { - "Name": "Force", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Location": { - "Name": "Location", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "force": { - "Name": "force", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Force" - } - } - }, - "location": { - "Name": "location", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Location" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Force": { - "Vector3": [ - 0.0, - 1.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Location": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BodyVelocity": { - "Name": "BodyVelocity", - "Tags": [ - "Deprecated" - ], - "Superclass": "BodyMover", - "Properties": { - "MaxForce": { - "Name": "MaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "P": { - "Name": "P", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Velocity": { - "Name": "Velocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "maxForce": { - "Name": "maxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "MaxForce" - } - } - }, - "velocity": { - "Name": "velocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Velocity" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxForce": { - "Vector3": [ - 4000.0, - 4000.0, - 4000.0 - ] - }, - "P": { - "Float32": 1250.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 2.0, - 0.0 - ] - } - } - }, - "Bone": { - "Name": "Bone", - "Tags": [], - "Superclass": "Attachment", - "Properties": { - "Transform": { - "Name": "Transform", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TransformedCFrame": { - "Name": "TransformedCFrame", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TransformedWorldCFrame": { - "Name": "TransformedWorldCFrame", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "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 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "BoolValue": { - "Name": "BoolValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "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" - }, - "Value": { - "Bool": false - } - } - }, - "BoxHandleAdornment": { - "Name": "BoxHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "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 - }, - "Shading": { - "Enum": 0 - }, - "Size": { - "Vector3": [ - 1.0, - 1.0, - 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 - } - } - }, - "BranchService": { - "Name": "BranchService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Breakpoint": { - "Name": "Breakpoint", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Condition": { - "Name": "Condition", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ContinueExecution": { - "Name": "ContinueExecution", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Id": { - "Name": "Id", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Line": { - "Name": "Line", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LogMessage": { - "Name": "LogMessage", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Valid": { - "Name": "Valid", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Verified": { - "Name": "Verified", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "BrickColorValue": { - "Name": "BrickColorValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "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" - }, - "Value": { - "BrickColor": 194 - } - } - }, - "BrowserService": { - "Name": "BrowserService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "BulkImportService": { - "Name": "BulkImportService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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 - } - } - }, - "CFrameValue": { - "Name": "CFrameValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "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" - }, - "Value": { - "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 - ] - ] - } - } - } - }, - "CSGDictionaryService": { - "Name": "CSGDictionaryService", - "Tags": [ - "Service" - ], - "Superclass": "FlyweightService", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CacheableContentProvider": { - "Name": "CacheableContentProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "CalloutService": { - "Name": "CalloutService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Camera": { - "Name": "Camera", - "Tags": [ - "NotReplicated" - ], - "Superclass": "PVInstance", - "Properties": { - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraSubject": { - "Name": "CameraSubject", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraType": { - "Name": "CameraType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CameraType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CoordinateFrame": { - "Name": "CoordinateFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "CFrame" - } - } - }, - "DiagonalFieldOfView": { - "Name": "DiagonalFieldOfView", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FieldOfView": { - "Name": "FieldOfView", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FieldOfViewMode": { - "Name": "FieldOfViewMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FieldOfViewMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Focus": { - "Name": "Focus", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadLocked": { - "Name": "HeadLocked", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadScale": { - "Name": "HeadScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxAxisFieldOfView": { - "Name": "MaxAxisFieldOfView", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NearPlaneZ": { - "Name": "NearPlaneZ", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VRTiltAndRollEnabled": { - "Name": "VRTiltAndRollEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ViewportSize": { - "Name": "ViewportSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "focus": { - "Name": "focus", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Focus" - } - } - } - }, - "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 - } - } - }, - "CanvasGroup": { - "Name": "CanvasGroup", - "Tags": [], - "Superclass": "GuiObject", - "Properties": { - "GroupColor3": { - "Name": "GroupColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GroupTransparency": { - "Name": "GroupTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResolutionScale": { - "Name": "ResolutionScale", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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": true - }, - "Draggable": { - "Bool": false - }, - "GroupColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "GroupTransparency": { - "Float32": 0.0 - }, - "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" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "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": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ChangeHistoryService": { - "Name": "ChangeHistoryService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "ChannelSelectorSoundEffect": { - "Name": "ChannelSelectorSoundEffect", - "Tags": [ - "NotCreatable" - ], - "Superclass": "CustomSoundEffect", - "Properties": { - "Channel": { - "Name": "Channel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Channel": { - "Int32": 1 - }, - "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" - } - } - }, - "CharacterAppearance": { - "Name": "CharacterAppearance", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "BaseTextureContent", - "Migration": "Int64ToContent" - } - } - } - } - }, - "BodyPart": { - "Name": "BodyPart", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "BodyPart" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshContent": { - "Name": "MeshContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshId": { - "Name": "MeshId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "MeshContent", - "Migration": "Int64ToContent" - } - } - } - } - }, - "OverlayTextureContent": { - "Name": "OverlayTextureContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OverlayTextureId": { - "Name": "OverlayTextureId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "OverlayTextureContent", - "Migration": "Int64ToContent" - } - } - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BaseTextureContent": { - "Content": "None" - }, - "BodyPart": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshContent": { - "Content": "None" - }, - "OverlayTextureContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Chat": { - "Name": "Chat", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "BubbleChatEnabled": { - "Name": "BubbleChatEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsAutoMigrated": { - "Name": "IsAutoMigrated", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LoadDefaultChat": { - "Name": "LoadDefaultChat", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ModerationMode": { - "Name": "ModerationMode", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "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" - } - } - }, - "ChorusSoundEffect": { - "Name": "ChorusSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "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": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Depth": { - "Float32": 0.15 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Mix": { - "Float32": 0.5 - }, - "Priority": { - "Int32": 0 - }, - "Rate": { - "Float32": 0.5 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ClickDetector": { - "Name": "ClickDetector", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "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" - } - } - }, - "MaxActivationDistance": { - "Name": "MaxActivationDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CursorIconContent": { - "Content": "None" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxActivationDistance": { - "Float32": 32.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ClientReplicator": { - "Name": "ClientReplicator", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "Clothing": { - "Name": "Clothing", - "Tags": [ - "NotCreatable" - ], - "Superclass": "CharacterAppearance", - "Properties": { - "Color3": { - "Name": "Color3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - } - } - }, - "Clouds": { - "Name": "Clouds", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Cover": { - "Name": "Cover", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Density": { - "Name": "Density", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Cover": { - "Float32": 0.5 - }, - "Density": { - "Float32": 0.7 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ClusterPacketCache": { - "Name": "ClusterPacketCache", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "CollectionService": { - "Name": "CollectionService", - "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" - } - } - }, - "Color3Value": { - "Name": "Color3Value", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "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" - }, - "Value": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "ColorCorrectionEffect": { - "Name": "ColorCorrectionEffect", - "Tags": [], - "Superclass": "PostEffect", - "Properties": { - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Contrast": { - "Name": "Contrast", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Saturation": { - "Name": "Saturation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TintColor": { - "Name": "TintColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Brightness": { - "Float32": 0.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Contrast": { - "Float32": 0.0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "Saturation": { - "Float32": 0.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TintColor": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ColorGradingEffect": { - "Name": "ColorGradingEffect", - "Tags": [], - "Superclass": "PostEffect", - "Properties": { - "TonemapperPreset": { - "Name": "TonemapperPreset", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TonemapperPreset" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "CommerceService": { - "Name": "CommerceService", - "Tags": [ - "NotCreatable", - "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" - } - } - }, - "CompressorSoundEffect": { - "Name": "CompressorSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "Attack": { - "Name": "Attack", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GainMakeup": { - "Name": "GainMakeup", - "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" - } - } - }, - "SideChain": { - "Name": "SideChain", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "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": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "GainMakeup": { - "Float32": 0.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 0 - }, - "Ratio": { - "Float32": 40.0 - }, - "Release": { - "Float32": 0.1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Threshold": { - "Float32": -40.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ConeHandleAdornment": { - "Name": "ConeHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "Height": { - "Name": "Height", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Hollow": { - "Name": "Hollow", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "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" - }, - "Hollow": { - "Bool": false - }, - "Radius": { - "Float32": 0.5 - }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 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 - } - } - }, - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ConfigureServerService": { - "Name": "ConfigureServerService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "Constraint": { - "Name": "Constraint", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Attachment0": { - "Name": "Attachment0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Attachment1": { - "Name": "Attachment1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "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" - } - } - }, - "ContentProvider": { - "Name": "ContentProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "BaseUrl": { - "Name": "BaseUrl", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RequestQueueSize": { - "Name": "RequestQueueSize", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ContextActionService": { - "Name": "ContextActionService", - "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" - } - } - }, - "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": { - "BinaryString": "" - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Controller": { - "Name": "Controller", - "Tags": [ - "NotCreatable" - ], - "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" - } - } - }, - "ControllerService": { - "Name": "ControllerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CookiesService": { - "Name": "CookiesService", - "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" - } - } - }, - "CoreGui": { - "Name": "CoreGui", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "BasePlayerGui", - "Properties": { - "SelectionImageObject": { - "Name": "SelectionImageObject", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Version": { - "Name": "Version", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "CorePackages": { - "Name": "CorePackages", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CoreScript": { - "Name": "CoreScript", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "CoreScriptSyncService": { - "Name": "CoreScriptSyncService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CornerWedgePart": { - "Name": "CornerWedgePart", - "Tags": [], - "Superclass": "BasePart", - "Properties": {}, - "DefaultProperties": { - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "EnableFluidForces": { - "Bool": true - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "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 - }, - "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": [ - 2.0, - 2.0, - 2.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 0 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "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" - }, - "Loop": { - "Bool": true - }, - "Priority": { - "Enum": 2 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CustomEvent": { - "Name": "CustomEvent", - "Tags": [ - "Deprecated" - ], - "Superclass": "Instance", - "Properties": { - "PersistedCurrentValue": { - "Name": "PersistedCurrentValue", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PersistedCurrentValue": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "CustomEventReceiver": { - "Name": "CustomEventReceiver", - "Tags": [ - "Deprecated" - ], - "Superclass": "Instance", - "Properties": { - "Source": { - "Name": "Source", - "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" - } - } - }, - "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" - } - } - }, - "CylinderHandleAdornment": { - "Name": "CylinderHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "Angle": { - "Name": "Angle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Height": { - "Name": "Height", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InnerRadius": { - "Name": "InnerRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AdornCullingMode": { - "Enum": 0 - }, - "AlwaysOnTop": { - "Bool": false - }, - "Angle": { - "Float32": 360.0 - }, - "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": 1.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InnerRadius": { - "Float32": 0.0 - }, - "Radius": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 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 - } - } - }, - "CylinderMesh": { - "Name": "CylinderMesh", - "Tags": [ - "Deprecated" - ], - "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" - }, - "Offset": { - "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" - }, - "VertexColor": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - } - } - }, - "CylindricalConstraint": { - "Name": "CylindricalConstraint", - "Tags": [], - "Superclass": "SlidingBallConstraint", - "Properties": { - "AngularActuatorType": { - "Name": "AngularActuatorType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularLimitsEnabled": { - "Name": "AngularLimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularResponsiveness": { - "Name": "AngularResponsiveness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularRestitution": { - "Name": "AngularRestitution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularSpeed": { - "Name": "AngularSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularVelocity": { - "Name": "AngularVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentAngle": { - "Name": "CurrentAngle", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InclinationAngle": { - "Name": "InclinationAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LowerAngle": { - "Name": "LowerAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MotorMaxAngularAcceleration": { - "Name": "MotorMaxAngularAcceleration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MotorMaxTorque": { - "Name": "MotorMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RotationAxisVisible": { - "Name": "RotationAxisVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ServoMaxTorque": { - "Name": "ServoMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SoftlockAngularServoUponReachingTarget": { - "Name": "SoftlockAngularServoUponReachingTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetAngle": { - "Name": "TargetAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UpperAngle": { - "Name": "UpperAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WorldRotationAxis": { - "Name": "WorldRotationAxis", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "ActuatorType": { - "Enum": 0 - }, - "AngularActuatorType": { - "Enum": 0 - }, - "AngularLimitsEnabled": { - "Bool": false - }, - "AngularResponsiveness": { - "Float32": 45.0 - }, - "AngularRestitution": { - "Float32": 0.0 - }, - "AngularSpeed": { - "Float32": 0.0 - }, - "AngularVelocity": { - "Float32": 0.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 1009 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InclinationAngle": { - "Float32": 0.0 - }, - "LimitsEnabled": { - "Bool": false - }, - "LinearResponsiveness": { - "Float32": 45.0 - }, - "LowerAngle": { - "Float32": -45.0 - }, - "LowerLimit": { - "Float32": 0.0 - }, - "MotorMaxAcceleration": { - "Float32": null - }, - "MotorMaxAngularAcceleration": { - "Float32": 500000.0 - }, - "MotorMaxForce": { - "Float32": 0.0 - }, - "MotorMaxTorque": { - "Float32": 0.0 - }, - "Restitution": { - "Float32": 0.0 - }, - "RotationAxisVisible": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "ServoMaxForce": { - "Float32": 0.0 - }, - "ServoMaxTorque": { - "Float32": 0.0 - }, - "Size": { - "Float32": 0.15 - }, - "SoftlockAngularServoUponReachingTarget": { - "Bool": false - }, - "SoftlockServoUponReachingTarget": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Speed": { - "Float32": 0.0 - }, - "Tags": { - "Tags": [] - }, - "TargetAngle": { - "Float32": 0.0 - }, - "TargetPosition": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpperAngle": { - "Float32": 45.0 - }, - "UpperLimit": { - "Float32": 5.0 - }, - "Velocity": { - "Float32": 0.0 - }, - "Visible": { - "Bool": false - } - } - }, - "DataModel": { - "Name": "DataModel", - "Tags": [ - "NotCreatable" - ], - "Superclass": "ServiceProvider", - "Properties": { - "CreatorId": { - "Name": "CreatorId", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CreatorType": { - "Name": "CreatorType", - "Scriptability": "Read", - "DataType": { - "Enum": "CreatorType" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GearGenreSetting": { - "Name": "GearGenreSetting", - "Scriptability": "Read", - "DataType": { - "Enum": "GearGenreSetting" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Genre": { - "Name": "Genre", - "Scriptability": "Read", - "DataType": { - "Enum": "Genre" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPioneerBuild": { - "Name": "IsPioneerBuild", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsSFFlagsLoaded": { - "Name": "IsSFFlagsLoaded", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "JobId": { - "Name": "JobId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PlaceVersion": { - "Name": "PlaceVersion", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PrivateServerId": { - "Name": "PrivateServerId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PrivateServerOwnerId": { - "Name": "PrivateServerOwnerId", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VIPServerOwnerId": { - "Name": "VIPServerOwnerId", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Workspace": { - "Name": "Workspace", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "lighting": { - "Name": "lighting", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "workspace": { - "Name": "workspace", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataModelDiff": { - "Name": "DataModelDiff", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "DataModelMesh": { - "Name": "DataModelMesh", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Offset": { - "Name": "Offset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Scale": { - "Name": "Scale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VertexColor": { - "Name": "VertexColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataModelSession": { - "Name": "DataModelSession", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "CurrentDataModelType": { - "Name": "CurrentDataModelType", - "Scriptability": "None", - "DataType": { - "Enum": "StudioDataModelType" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SessionId": { - "Name": "SessionId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStore": { - "Name": "DataStore", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "DataStoreIncrementOptions": { - "Name": "DataStoreIncrementOptions", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreInfo": { - "Name": "DataStoreInfo", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "CreatedTime": { - "Name": "CreatedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DataStoreName": { - "Name": "DataStoreName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UpdatedTime": { - "Name": "UpdatedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreKey": { - "Name": "DataStoreKey", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "KeyName": { - "Name": "KeyName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreKeyInfo": { - "Name": "DataStoreKeyInfo", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "CreatedTime": { - "Name": "CreatedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UpdatedTime": { - "Name": "UpdatedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Version": { - "Name": "Version", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreKeyPages": { - "Name": "DataStoreKeyPages", - "Tags": [ - "NotCreatable", - "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" - } - } - }, - "DataStoreListingPages": { - "Name": "DataStoreListingPages", - "Tags": [ - "NotCreatable", - "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" - } - } - }, - "DataStoreObjectVersionInfo": { - "Name": "DataStoreObjectVersionInfo", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "CreatedTime": { - "Name": "CreatedTime", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsDeleted": { - "Name": "IsDeleted", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Version": { - "Name": "Version", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreOptions": { - "Name": "DataStoreOptions", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "AllScopes": { - "Name": "AllScopes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStorePages": { - "Name": "DataStorePages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreService": { - "Name": "DataStoreService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AutomaticRetry": { - "Name": "AutomaticRetry", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LegacyNamingScheme": { - "Name": "LegacyNamingScheme", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutomaticRetry": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LegacyNamingScheme": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreSetOptions": { - "Name": "DataStoreSetOptions", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DataStoreVersionPages": { - "Name": "DataStoreVersionPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Debris": { - "Name": "Debris", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "MaxItems": { - "Name": "MaxItems", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxItems": { - "Int32": 1000 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebugSettings": { - "Name": "DebugSettings", - "Tags": [ - "NotBrowsable", - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "DataModel": { - "Name": "DataModel", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InstanceCount": { - "Name": "InstanceCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsScriptStackTracingEnabled": { - "Name": "IsScriptStackTracingEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "JobCount": { - "Name": "JobCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PlayerCount": { - "Name": "PlayerCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReportSoundWarnings": { - "Name": "ReportSoundWarnings", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RobloxVersion": { - "Name": "RobloxVersion", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TickCountPreciseOverride": { - "Name": "TickCountPreciseOverride", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TickCountSampleMethod" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "DebuggerBreakpoint": { - "Name": "DebuggerBreakpoint", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Condition": { - "Name": "Condition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ContinueExecution": { - "Name": "ContinueExecution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsEnabled": { - "Name": "IsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Line": { - "Name": "Line", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LogExpression": { - "Name": "LogExpression", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "isContextDependentBreakpoint": { - "Name": "isContextDependentBreakpoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - } - } - }, - "DebuggerConnection": { - "Name": "DebuggerConnection", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "ErrorMessage": { - "Name": "ErrorMessage", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HasError": { - "Name": "HasError", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Id": { - "Name": "Id", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPaused": { - "Name": "IsPaused", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebuggerConnectionManager": { - "Name": "DebuggerConnectionManager", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "Timeout": { - "Name": "Timeout", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebuggerLuaResponse": { - "Name": "DebuggerLuaResponse", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "IsError": { - "Name": "IsError", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsSuccess": { - "Name": "IsSuccess", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Message": { - "Name": "Message", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RequestId": { - "Name": "RequestId", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Status": { - "Name": "Status", - "Scriptability": "None", - "DataType": { - "Enum": "DebuggerStatus" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebuggerManager": { - "Name": "DebuggerManager", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "DebuggingEnabled": { - "Name": "DebuggingEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebuggerUIService": { - "Name": "DebuggerUIService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebuggerVariable": { - "Name": "DebuggerVariable", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Name": { - "Name": "Name", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Populated": { - "Name": "Populated", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Type": { - "Name": "Type", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Value": { - "Name": "Value", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VariableId": { - "Name": "VariableId", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VariablesCount": { - "Name": "VariablesCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DebuggerWatch": { - "Name": "DebuggerWatch", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Expression": { - "Name": "Expression", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Specular": { - "Name": "Specular", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 1.0, - 1.0, - 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": [] - }, - "TextureContent": { - "Content": "None" - }, - "TexturePack": { - "ContentId": "" - }, - "TexturePackMetadata": { - "String": "" - }, - "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": [], - "Superclass": "PostEffect", - "Properties": { - "FarIntensity": { - "Name": "FarIntensity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FocusDistance": { - "Name": "FocusDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InFocusRadius": { - "Name": "InFocusRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NearIntensity": { - "Name": "NearIntensity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "FarIntensity": { - "Float32": 0.75 - }, - "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" - } - } - }, - "Dialog": { - "Name": "Dialog", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "BehaviorType": { - "Name": "BehaviorType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DialogBehaviorType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ConversationDistance": { - "Name": "ConversationDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GoodbyeChoiceActive": { - "Name": "GoodbyeChoiceActive", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GoodbyeDialog": { - "Name": "GoodbyeDialog", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InUse": { - "Name": "InUse", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InitialPrompt": { - "Name": "InitialPrompt", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Purpose": { - "Name": "Purpose", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DialogPurpose" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Tone": { - "Name": "Tone", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DialogTone" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TriggerDistance": { - "Name": "TriggerDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TriggerOffset": { - "Name": "TriggerOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BehaviorType": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ConversationDistance": { - "Float32": 25.0 - }, - "GoodbyeChoiceActive": { - "Bool": true - }, - "GoodbyeDialog": { - "String": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InitialPrompt": { - "String": "" - }, - "Purpose": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Tone": { - "Enum": 0 - }, - "TriggerDistance": { - "Float32": 0.0 - }, - "TriggerOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DialogChoice": { - "Name": "DialogChoice", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "GoodbyeChoiceActive": { - "Name": "GoodbyeChoiceActive", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GoodbyeDialog": { - "Name": "GoodbyeDialog", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResponseDialog": { - "Name": "ResponseDialog", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UserDialog": { - "Name": "UserDialog", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "GoodbyeChoiceActive": { - "Bool": true - }, - "GoodbyeDialog": { - "String": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ResponseDialog": { - "String": "" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": [], - "Superclass": "SoundEffect", - "Properties": { - "Level": { - "Name": "Level", - "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" - }, - "Level": { - "Float32": 0.75 - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DockWidgetPluginGui": { - "Name": "DockWidgetPluginGui", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "PluginGui", - "Properties": { - "HostWidgetWasRestored": { - "Name": "HostWidgetWasRestored", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DoubleConstrainedValue": { - "Name": "DoubleConstrainedValue", - "Tags": [ - "Deprecated" - ], - "Superclass": "ValueBase", - "Properties": { - "ConstrainedValue": { - "Name": "ConstrainedValue", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxValue": { - "Name": "MaxValue", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinValue": { - "Name": "MinValue", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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" - }, - "MaxValue": { - "Float64": 1.0 - }, - "MinValue": { - "Float64": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "value": { - "Float64": 0.0 - } - } - }, - "DraftsService": { - "Name": "DraftsService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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 - } - } - }, - "Dragger": { - "Name": "Dragger", - "Tags": [], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "DraggerService": { - "Name": "DraggerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AlignDraggedObjects": { - "Name": "AlignDraggedObjects", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AngleSnapEnabled": { - "Name": "AngleSnapEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AngleSnapIncrement": { - "Name": "AngleSnapIncrement", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AnimateHover": { - "Name": "AnimateHover", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CollisionsEnabled": { - "Name": "CollisionsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DraggerCoordinateSpace": { - "Name": "DraggerCoordinateSpace", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DraggerCoordinateSpace" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DraggerMovementMode": { - "Name": "DraggerMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DraggerMovementMode" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GeometrySnapColor": { - "Name": "GeometrySnapColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HoverAnimateFrequency": { - "Name": "HoverAnimateFrequency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HoverLineThickness": { - "Name": "HoverLineThickness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HoverThickness": { - "Name": "HoverThickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "JointsEnabled": { - "Name": "JointsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LinearSnapEnabled": { - "Name": "LinearSnapEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LinearSnapIncrement": { - "Name": "LinearSnapIncrement", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PartSnapEnabled": { - "Name": "PartSnapEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PivotSnapToGeometry": { - "Name": "PivotSnapToGeometry", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShowHover": { - "Name": "ShowHover", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShowPivotIndicator": { - "Name": "ShowPivotIndicator", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "DynamicRotate": { - "Name": "DynamicRotate", - "Tags": [ - "NotCreatable" - ], - "Superclass": "JointInstance", - "Properties": { - "BaseAngle": { - "Name": "BaseAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "EchoSoundEffect": { - "Name": "EchoSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "Delay": { - "Name": "Delay", - "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" - } - } - }, - "WetLevel": { - "Name": "WetLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Delay": { - "Float32": 1.0 - }, - "DryLevel": { - "Float32": 0.0 - }, - "Enabled": { - "Bool": true - }, - "Feedback": { - "Float32": 0.5 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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", - "Tags": [ - "NotCreatable", - "Service" - ], - "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", - "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" - } - } - }, - "EqualizerSoundEffect": { - "Name": "EqualizerSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "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" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "HighGain": { - "Float32": 0.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LowGain": { - "Float32": -20.0 - }, - "MidGain": { - "Float32": -10.0 - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "EulerRotationCurve": { - "Name": "EulerRotationCurve", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "RotationOrder": { - "Name": "RotationOrder", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RotationOrder" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "RotationOrder": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "EventIngestService": { - "Name": "EventIngestService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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": [], - "Superclass": "Instance", - "Properties": { - "BlastPressure": { - "Name": "BlastPressure", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BlastRadius": { - "Name": "BlastRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DestroyJointRadiusPercent": { - "Name": "DestroyJointRadiusPercent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExplosionType": { - "Name": "ExplosionType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ExplosionType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TimeScale": { - "Name": "TimeScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Visible": { - "Name": "Visible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BlastPressure": { - "Float32": 500000.0 - }, - "BlastRadius": { - "Float32": 4.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DestroyJointRadiusPercent": { - "Float32": 1.0 - }, - "ExplosionType": { - "Enum": 1 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Position": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TimeScale": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": [], - "Superclass": "Instance", - "Properties": { - "ChinRaiser": { - "Name": "ChinRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ChinRaiserUpperLip": { - "Name": "ChinRaiserUpperLip", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Corrugator": { - "Name": "Corrugator", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EyesLookDown": { - "Name": "EyesLookDown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EyesLookLeft": { - "Name": "EyesLookLeft", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EyesLookRight": { - "Name": "EyesLookRight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EyesLookUp": { - "Name": "EyesLookUp", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FlatPucker": { - "Name": "FlatPucker", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Funneler": { - "Name": "Funneler", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InternalOverrideFACSData": { - "Name": "InternalOverrideFACSData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "JawDrop": { - "Name": "JawDrop", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "JawLeft": { - "Name": "JawLeft", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "JawRight": { - "Name": "JawRight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftBrowLowerer": { - "Name": "LeftBrowLowerer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftCheekPuff": { - "Name": "LeftCheekPuff", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftCheekRaiser": { - "Name": "LeftCheekRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftDimpler": { - "Name": "LeftDimpler", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftEyeClosed": { - "Name": "LeftEyeClosed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftEyeUpperLidRaiser": { - "Name": "LeftEyeUpperLidRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftInnerBrowRaiser": { - "Name": "LeftInnerBrowRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLipCornerDown": { - "Name": "LeftLipCornerDown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLipCornerPuller": { - "Name": "LeftLipCornerPuller", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLipStretcher": { - "Name": "LeftLipStretcher", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLowerLipDepressor": { - "Name": "LeftLowerLipDepressor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftNoseWrinkler": { - "Name": "LeftNoseWrinkler", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftOuterBrowRaiser": { - "Name": "LeftOuterBrowRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftUpperLipRaiser": { - "Name": "LeftUpperLipRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LipPresser": { - "Name": "LipPresser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LipsTogether": { - "Name": "LipsTogether", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LowerLipSuck": { - "Name": "LowerLipSuck", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouthLeft": { - "Name": "MouthLeft", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouthRight": { - "Name": "MouthRight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Pucker": { - "Name": "Pucker", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightBrowLowerer": { - "Name": "RightBrowLowerer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightCheekPuff": { - "Name": "RightCheekPuff", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightCheekRaiser": { - "Name": "RightCheekRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightDimpler": { - "Name": "RightDimpler", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightEyeClosed": { - "Name": "RightEyeClosed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightEyeUpperLidRaiser": { - "Name": "RightEyeUpperLidRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightInnerBrowRaiser": { - "Name": "RightInnerBrowRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightLipCornerDown": { - "Name": "RightLipCornerDown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightLipCornerPuller": { - "Name": "RightLipCornerPuller", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightLipStretcher": { - "Name": "RightLipStretcher", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightLowerLipDepressor": { - "Name": "RightLowerLipDepressor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightNoseWrinkler": { - "Name": "RightNoseWrinkler", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightOuterBrowRaiser": { - "Name": "RightOuterBrowRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightUpperLipRaiser": { - "Name": "RightUpperLipRaiser", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TongueDown": { - "Name": "TongueDown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TongueOut": { - "Name": "TongueOut", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TongueUp": { - "Name": "TongueUp", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UpperLipSuck": { - "Name": "UpperLipSuck", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InternalOverrideFACSData": { - "BinaryString": "" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FaceInstance": { - "Name": "FaceInstance", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Face": { - "Name": "Face", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "Feature": { - "Name": "Feature", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "FaceId": { - "Name": "FaceId", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InOut": { - "Name": "InOut", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "InOut" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftRight": { - "Name": "LeftRight", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "LeftRight" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TopBottom": { - "Name": "TopBottom", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TopBottom" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "File": { - "Name": "File", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Size": { - "Name": "Size", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextureId": { - "Name": "TextureId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "TextureContent", - "Migration": "ContentIdToContent" - } - } - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshContent": { - "Content": "None" - }, - "Offset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VertexColor": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - } - } - }, - "FileSyncReplicationService": { - "Name": "FileSyncReplicationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Fire": { - "Name": "Fire", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "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" - } - } - }, - "Heat": { - "Name": "Heat", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "heat_xml" - } - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SecondaryColor": { - "Name": "SecondaryColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "size_xml" - } - } - } - }, - "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" - ], - "Kind": { - "Alias": { - "AliasFor": "Heat" - } - } - }, - "size": { - "Name": "size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Size" - } - } - }, - "size_xml": { - "Name": "size_xml", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Size" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 0.92549026, - 0.54509807, - 0.27450982 - ] - }, - "Enabled": { - "Bool": true - }, - "Heat": { - "Float32": 9.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SecondaryColor": { - "Color3": [ - 0.54509807, - 0.3137255, - 0.21568629 - ] - }, - "Size": { - "Float32": 5.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TimeScale": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Flag": { - "Name": "Flag", - "Tags": [ - "Deprecated" - ], - "Superclass": "Tool", - "Properties": { - "TeamColor": { - "Name": "TeamColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CanBeDropped": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "Grip": { - "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" - }, - "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": [] - }, - "TeamColor": { - "BrickColor": 194 - }, - "TextureContent": { - "Content": "None" - }, - "ToolTip": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "FlagStand": { - "Name": "FlagStand", - "Tags": [ - "Deprecated" - ], - "Superclass": "Part", - "Properties": { - "TeamColor": { - "Name": "TeamColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "EnableFluidForces": { - "Bool": true - }, - "FormFactor": { - "Enum": 1 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "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 - }, - "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 - }, - "Shape": { - "Enum": 1 - }, - "Size": { - "Vector3": [ - 4.0, - 1.2, - 2.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TeamColor": { - "BrickColor": 194 - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 3 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "FlagStandService": { - "Name": "FlagStandService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FlangeSoundEffect": { - "Name": "FlangeSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "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": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Depth": { - "Float32": 0.45 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Mix": { - "Float32": 0.85 - }, - "Priority": { - "Int32": 0 - }, - "Rate": { - "Float32": 5.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FloatCurve": { - "Name": "FloatCurve", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Length": { - "Name": "Length", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "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==" - } - } - }, - "FloorWire": { - "Name": "FloorWire", - "Tags": [ - "Deprecated" - ], - "Superclass": "GuiBase3d", - "Properties": { - "CycleOffset": { - "Name": "CycleOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "From": { - "Name": "From", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudsBetweenTextures": { - "Name": "StudsBetweenTextures", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Texture": { - "Name": "Texture", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextureSize": { - "Name": "TextureSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "To": { - "Name": "To", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Velocity": { - "Name": "Velocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WireRadius": { - "Name": "WireRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "CycleOffset": { - "Float32": 0.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "StudsBetweenTextures": { - "Float32": 4.0 - }, - "Tags": { - "Tags": [] - }, - "Texture": { - "ContentId": "" - }, - "TextureSize": { - "Vector2": [ - 1.0, - 1.0 - ] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Float32": 2.0 - }, - "Visible": { - "Bool": true - }, - "WireRadius": { - "Float32": 0.0625 - } - } - }, - "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": [ - "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" - } - } - }, - "Folder": { - "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" - } - } - } - }, - "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" - } - } - }, - "ForceField": { - "Name": "ForceField", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Visible": { - "Name": "Visible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "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" - }, - "Visible": { - "Bool": true - } - } - }, - "FormFactorPart": { - "Name": "FormFactorPart", - "Tags": [ - "NotCreatable" - ], - "Superclass": "BasePart", - "Properties": { - "FormFactor": { - "Name": "FormFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FormFactor" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "formFactorRaw" - } - } - } - }, - "formFactor": { - "Name": "formFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FormFactor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "FormFactor" - } - } - }, - "formFactorRaw": { - "Name": "formFactorRaw", - "Scriptability": "None", - "DataType": { - "Enum": "FormFactor" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "FormFactor" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Frame": { - "Name": "Frame", - "Tags": [], - "Superclass": "GuiObject", - "Properties": { - "Style": { - "Name": "Style", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FrameStyle" - }, - "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 - ] - ] - }, - "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 - }, - "Style": { - "Enum": 0 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "FriendPages": { - "Name": "FriendPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "FriendService": { - "Name": "FriendService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "FunctionalTest": { - "Name": "FunctionalTest", - "Tags": [ - "Deprecated" - ], - "Superclass": "Instance", - "Properties": { - "AllowSleep": { - "Name": "AllowSleep", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Description": { - "Name": "Description", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - }, - "Description": { - "String": "?" - }, - "HasMigratedSettingsToTestService": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GamePassService": { - "Name": "GamePassService", - "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" - } - } - }, - "GameSettings": { - "Name": "GameSettings", - "Tags": [ - "NotBrowsable", - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "VideoCaptureEnabled": { - "Name": "VideoCaptureEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GamepadService": { - "Name": "GamepadService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "GamepadCursorEnabled": { - "Name": "GamepadCursorEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "GenericSettings": { - "Name": "GenericSettings", - "Tags": [ - "NotCreatable" - ], - "Superclass": "ServiceProvider", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Geometry": { - "Name": "Geometry", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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" - } - } - }, - "GlobalDataStore": { - "Name": "GlobalDataStore", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GlobalSettings": { - "Name": "GlobalSettings", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "GenericSettings", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Glue": { - "Name": "Glue", - "Tags": [ - "Deprecated" - ], - "Superclass": "JointInstance", - "Properties": { - "F0": { - "Name": "F0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "F1": { - "Name": "F1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "F2": { - "Name": "F2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "F3": { - "Name": "F3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "F0": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "F1": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "F2": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "F3": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GongService": { - "Name": "GongService", - "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" - } - } - }, - "GroupService": { - "Name": "GroupService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GuiBase": { - "Name": "GuiBase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GuiBase2d": { - "Name": "GuiBase2d", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "GuiBase", - "Properties": { - "AbsolutePosition": { - "Name": "AbsolutePosition", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteRotation": { - "Name": "AbsoluteRotation", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteSize": { - "Name": "AbsoluteSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ActiveQueryNames": { - "Name": "ActiveQueryNames", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AutoLocalize": { - "Name": "AutoLocalize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClippedRect": { - "Name": "ClippedRect", - "Scriptability": "None", - "DataType": { - "Value": "Rect" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsNotOccluded": { - "Name": "IsNotOccluded", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Localize": { - "Name": "Localize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RawRect2D": { - "Name": "RawRect2D", - "Scriptability": "None", - "DataType": { - "Value": "Rect" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReplicatedInsertionOrder": { - "Name": "ReplicatedInsertionOrder", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RootLocalizationTable": { - "Name": "RootLocalizationTable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GuiBase3d": { - "Name": "GuiBase3d", - "Tags": [ - "NotCreatable" - ], - "Superclass": "GuiBase", - "Properties": { - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Color3": { - "Name": "Color3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "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" - } - } - }, - "GuiButton": { - "Name": "GuiButton", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "GuiObject", - "Properties": { - "AutoButtonColor": { - "Name": "AutoButtonColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HoverHapticEffect": { - "Name": "HoverHapticEffect", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Modal": { - "Name": "Modal", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Style": { - "Name": "Style", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ButtonStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GuiLabel": { - "Name": "GuiLabel", - "Tags": [ - "NotCreatable" - ], - "Superclass": "GuiObject", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GuiMain": { - "Name": "GuiMain", - "Tags": [ - "Deprecated" - ], - "Superclass": "ScreenGui", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipToDeviceSafeArea": { - "Bool": true - }, - "DisplayOrder": { - "Int32": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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" - }, - "ZIndexBehavior": { - "Enum": 0 - } - } - }, - "GuiObject": { - "Name": "GuiObject", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "GuiBase2d", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AnchorPoint": { - "Name": "AnchorPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutomaticSize": { - "Name": "AutomaticSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AutomaticSize" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundColor": { - "Name": "BackgroundColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BackgroundColor3": { - "Name": "BackgroundColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BackgroundTransparency": { - "Name": "BackgroundTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BorderColor": { - "Name": "BorderColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BorderColor3": { - "Name": "BorderColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BorderMode": { - "Name": "BorderMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "BorderMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BorderSizePixel": { - "Name": "BorderSizePixel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClipsDescendants": { - "Name": "ClipsDescendants", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NextSelectionLeft": { - "Name": "NextSelectionLeft", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NextSelectionRight": { - "Name": "NextSelectionRight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NextSelectionUp": { - "Name": "NextSelectionUp", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rotation": { - "Name": "Rotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Selectable": { - "Name": "Selectable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionImageObject": { - "Name": "SelectionImageObject", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SizeConstraint": { - "Name": "SizeConstraint", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SizeConstraint" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "GuiService": { - "Name": "GuiService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AutoSelectGuiEnabled": { - "Name": "AutoSelectGuiEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CoreEffectFolder": { - "Name": "CoreEffectFolder", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CoreGuiFolder": { - "Name": "CoreGuiFolder", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CoreGuiNavigationEnabled": { - "Name": "CoreGuiNavigationEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DisplayScalingMode": { - "Name": "DisplayScalingMode", - "Scriptability": "None", - "DataType": { - "Enum": "DisplayScalingMode" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GuiNavigationEnabled": { - "Name": "GuiNavigationEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsModalDialog": { - "Name": "IsModalDialog", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsWindows": { - "Name": "IsWindows", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MenuIsOpen": { - "Name": "MenuIsOpen", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SelectedObject": { - "Name": "SelectedObject", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TopbarInset": { - "Name": "TopbarInset", - "Scriptability": "Read", - "DataType": { - "Value": "Rect" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TouchControlsEnabled": { - "Name": "TouchControlsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - } - } - }, - "GuidRegistryService": { - "Name": "GuidRegistryService", - "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" - } - } - }, - "HSRDataContentProvider": { - "Name": "HSRDataContentProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "CacheableContentProvider", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HandleAdornment": { - "Name": "HandleAdornment", - "Tags": [ - "NotCreatable" - ], - "Superclass": "PVAdornment", - "Properties": { - "AdornCullingMode": { - "Name": "AdornCullingMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornCullingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AlwaysOnTop": { - "Name": "AlwaysOnTop", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GizmoReference": { - "Name": "GizmoReference", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SizeRelativeOffset": { - "Name": "SizeRelativeOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZIndex": { - "Name": "ZIndex", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Handles": { - "Name": "Handles", - "Tags": [], - "Superclass": "HandlesBase", - "Properties": { - "Faces": { - "Name": "Faces", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Faces" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - } - } - }, - "Style": { - "Name": "Style", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HandlesStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "Faces": { - "Faces": [ - "Right", - "Top", - "Back", - "Left", - "Bottom", - "Front" - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Style": { - "Enum": 0 - }, - "Tags": { - "Tags": [] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - } - } - }, - "HandlesBase": { - "Name": "HandlesBase", - "Tags": [ - "NotCreatable" - ], - "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": "" - } - } - }, - "HapticService": { - "Name": "HapticService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "Hat": { - "Name": "Hat", - "Tags": [ - "Deprecated" - ], - "Superclass": "Accoutrement", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "AttachmentPoint": { - "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 - ] - ] - } - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "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" - } - } - }, - "HeightmapImporterService": { - "Name": "HeightmapImporterService", - "Tags": [ - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "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", - "DataType": { - "Enum": "HighlightDepthMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FillColor": { - "Name": "FillColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FillTransparency": { - "Name": "FillTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LineThickness": { - "Name": "LineThickness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OutlineColor": { - "Name": "OutlineColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OutlineTransparency": { - "Name": "OutlineTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - }, - "DepthMode": { - "Enum": 0 - }, - "Enabled": { - "Bool": true - }, - "FillColor": { - "Color3": [ - 1.0, - 0.0, - 0.0 - ] - }, - "FillTransparency": { - "Float32": 0.5 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "OutlineColor": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "OutlineTransparency": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HingeConstraint": { - "Name": "HingeConstraint", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "ActuatorType": { - "Name": "ActuatorType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularResponsiveness": { - "Name": "AngularResponsiveness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularSpeed": { - "Name": "AngularSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AngularVelocity": { - "Name": "AngularVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentAngle": { - "Name": "CurrentAngle", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LimitsEnabled": { - "Name": "LimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LowerAngle": { - "Name": "LowerAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MotorMaxAcceleration": { - "Name": "MotorMaxAcceleration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MotorMaxTorque": { - "Name": "MotorMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Restitution": { - "Name": "Restitution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ServoMaxTorque": { - "Name": "ServoMaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SoftlockServoUponReachingTarget": { - "Name": "SoftlockServoUponReachingTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetAngle": { - "Name": "TargetAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UpperAngle": { - "Name": "UpperAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "ActuatorType": { - "Enum": 0 - }, - "AngularResponsiveness": { - "Float32": 45.0 - }, - "AngularSpeed": { - "Float32": 0.0 - }, - "AngularVelocity": { - "Float32": 0.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 1009 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LimitsEnabled": { - "Bool": false - }, - "LowerAngle": { - "Float32": -45.0 - }, - "MotorMaxAcceleration": { - "Float32": 500000.0 - }, - "MotorMaxTorque": { - "Float32": 0.0 - }, - "Radius": { - "Float32": 0.15 - }, - "Restitution": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "ServoMaxTorque": { - "Float32": 0.0 - }, - "SoftlockServoUponReachingTarget": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TargetAngle": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpperAngle": { - "Float32": 45.0 - }, - "Visible": { - "Bool": false - } - } - }, - "Hint": { - "Name": "Hint", - "Tags": [ - "Deprecated" - ], - "Superclass": "Message", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Text": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Hole": { - "Name": "Hole", - "Tags": [ - "Deprecated" - ], - "Superclass": "Feature", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FaceId": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InOut": { - "Enum": 2 - }, - "LeftRight": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopBottom": { - "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Hopper": { - "Name": "Hopper", - "Tags": [ - "Deprecated", - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HopperBin": { - "Name": "HopperBin", - "Tags": [ - "Deprecated" - ], - "Superclass": "BackpackItem", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BinType": { - "Name": "BinType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "BinType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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": {} - }, - "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": [] - }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "HttpRbxApiService": { - "Name": "HttpRbxApiService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HttpRequest": { - "Name": "HttpRequest", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HttpService": { - "Name": "HttpService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "HttpEnabled": { - "Name": "HttpEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HttpEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Humanoid": { - "Name": "Humanoid", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AutoJumpEnabled": { - "Name": "AutoJumpEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutoRotate": { - "Name": "AutoRotate", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutomaticScalingEnabled": { - "Name": "AutomaticScalingEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BreakJointsOnDeath": { - "Name": "BreakJointsOnDeath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CollisionType": { - "Name": "CollisionType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HumanoidCollisionType" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DisplayDistanceType": { - "Name": "DisplayDistanceType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HumanoidDisplayDistanceType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DisplayName": { - "Name": "DisplayName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "Material" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Health": { - "Name": "Health", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HealthDisplayDistance": { - "Name": "HealthDisplayDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HealthDisplayType": { - "Name": "HealthDisplayType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HumanoidHealthDisplayType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Health_XML": { - "Name": "Health_XML", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HipHeight": { - "Name": "HipHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "JumpHeight": { - "Name": "JumpHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "JumpPower": { - "Name": "JumpPower", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "JumpReplicate": { - "Name": "JumpReplicate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLeg": { - "Name": "LeftLeg", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxHealth": { - "Name": "MaxHealth", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxSlopeAngle": { - "Name": "MaxSlopeAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MoveDirection": { - "Name": "MoveDirection", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MoveDirectionInternal": { - "Name": "MoveDirectionInternal", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NameDisplayDistance": { - "Name": "NameDisplayDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NameOcclusion": { - "Name": "NameOcclusion", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NameOcclusion" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RequiresNeck": { - "Name": "RequiresNeck", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RigType": { - "Name": "RigType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HumanoidRigType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RightLeg": { - "Name": "RightLeg", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RootPart": { - "Name": "RootPart", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RotationType": { - "Name": "RotationType", - "Scriptability": "None", - "DataType": { - "Enum": "RotationType" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SeatPart": { - "Name": "SeatPart", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Sit": { - "Name": "Sit", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Strafe": { - "Name": "Strafe", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TargetPoint": { - "Name": "TargetPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimerState": { - "Name": "TimerState", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Torso": { - "Name": "Torso", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseJumpPower": { - "Name": "UseJumpPower", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WalkToPart": { - "Name": "WalkToPart", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WalkToPoint": { - "Name": "WalkToPoint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "maxHealth": { - "Name": "maxHealth", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoJumpEnabled": { - "Bool": true - }, - "AutoRotate": { - "Bool": true - }, - "AutomaticScalingEnabled": { - "Bool": true - }, - "BreakJointsOnDeath": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CollisionType": { - "Enum": 0 - }, - "DisplayDistanceType": { - "Enum": 0 - }, - "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 - }, - "JumpPower": { - "Float32": 50.0 - }, - "MaxHealth": { - "Float32": 100.0 - }, - "MaxSlopeAngle": { - "Float32": 89.0 - }, - "NameDisplayDistance": { - "Float32": 100.0 - }, - "NameOcclusion": { - "Enum": 2 - }, - "RequiresNeck": { - "Bool": true - }, - "RigType": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseJumpPower": { - "Bool": true - }, - "WalkSpeed": { - "Float32": 16.0 - } - } - }, - "HumanoidController": { - "Name": "HumanoidController", - "Tags": [], - "Superclass": "Controller", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "HumanoidDescription": { - "Name": "HumanoidDescription", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AccessoryBlob": { - "Name": "AccessoryBlob", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BackAccessory": { - "Name": "BackAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BodyTypeScale": { - "Name": "BodyTypeScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClimbAnimation": { - "Name": "ClimbAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DepthScale": { - "Name": "DepthScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FaceAccessory": { - "Name": "FaceAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FallAnimation": { - "Name": "FallAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FrontAccessory": { - "Name": "FrontAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GraphicTShirt": { - "Name": "GraphicTShirt", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HairAccessory": { - "Name": "HairAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HatAccessory": { - "Name": "HatAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Head": { - "Name": "Head", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HeadColor": { - "Name": "HeadColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HeadScale": { - "Name": "HeadScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeightScale": { - "Name": "HeightScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IdleAnimation": { - "Name": "IdleAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "JumpAnimation": { - "Name": "JumpAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LeftArm": { - "Name": "LeftArm", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftArmColor": { - "Name": "LeftArmColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLeg": { - "Name": "LeftLeg", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LeftLegColor": { - "Name": "LeftLegColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MoodAnimation": { - "Name": "MoodAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NeckAccessory": { - "Name": "NeckAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NumberEmotesLoaded": { - "Name": "NumberEmotesLoaded", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Pants": { - "Name": "Pants", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ProportionScale": { - "Name": "ProportionScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResetIncludesBodyParts": { - "Name": "ResetIncludesBodyParts", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightArm": { - "Name": "RightArm", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightArmColor": { - "Name": "RightArmColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightLeg": { - "Name": "RightLeg", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightLegColor": { - "Name": "RightLegColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RunAnimation": { - "Name": "RunAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shirt": { - "Name": "Shirt", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShouldersAccessory": { - "Name": "ShouldersAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StaticFacialAnimation": { - "Name": "StaticFacialAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SwimAnimation": { - "Name": "SwimAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Torso": { - "Name": "Torso", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TorsoColor": { - "Name": "TorsoColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseAvatarSettings": { - "Name": "UseAvatarSettings", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaistAccessory": { - "Name": "WaistAccessory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WalkAnimation": { - "Name": "WalkAnimation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WidthScale": { - "Name": "WidthScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BodyTypeScale": { - "Float32": 0.3 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClimbAnimation": { - "Int64": 0 - }, - "DepthScale": { - "Float32": 1.0 - }, - "EmotesDataInternal": { - "String": "" - }, - "EquippedEmotesDataInternal": { - "String": "" - }, - "Face": { - "Int64": 0 - }, - "FallAnimation": { - "Int64": 0 - }, - "GraphicTShirt": { - "Int64": 0 - }, - "HeadScale": { - "Float32": 1.0 - }, - "HeightScale": { - "Float32": 1.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IdleAnimation": { - "Int64": 0 - }, - "JumpAnimation": { - "Int64": 0 - }, - "MoodAnimation": { - "Int64": 0 - }, - "Pants": { - "Int64": 0 - }, - "ProportionScale": { - "Float32": 1.0 - }, - "RunAnimation": { - "Int64": 0 - }, - "Sandboxed": { - "Bool": false - }, - "Shirt": { - "Int64": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "StaticFacialAnimation": { - "Bool": false - }, - "SwimAnimation": { - "Int64": 0 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseAvatarSettings": { - "Bool": false - }, - "WalkAnimation": { - "Int64": 0 - }, - "WidthScale": { - "Float32": 1.0 - } - } - }, - "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": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "IXPService": { - "Name": "IXPService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ImageButton": { - "Name": "ImageButton", - "Tags": [], - "Superclass": "GuiButton", - "Properties": { - "ContentImageSize": { - "Name": "ContentImageSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Image": { - "Name": "Image", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ImageColor3": { - "Name": "ImageColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageContent": { - "Name": "ImageContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageRectOffset": { - "Name": "ImageRectOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageRectSize": { - "Name": "ImageRectSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageTransparency": { - "Name": "ImageTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsLoaded": { - "Name": "IsLoaded", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - } - } - }, - "SliceCenter": { - "Name": "SliceCenter", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Rect" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SliceScale": { - "Name": "SliceScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TileSize": { - "Name": "TileSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": true - }, - "AnchorPoint": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoButtonColor": { - "Bool": true - }, - "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" - }, - "HoverImageContent": { - "Content": "None" - }, - "ImageColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "ImageContent": { - "Content": "None" - }, - "ImageRectOffset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "ImageRectSize": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "ImageTransparency": { - "Float32": 0.0 - }, - "Interactable": { - "Bool": true - }, - "LayoutOrder": { - "Int32": 0 - }, - "Modal": { - "Bool": false - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "PressedImageContent": { - "Content": "None" - }, - "ResampleMode": { - "Enum": 0 - }, - "Rotation": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "ScaleType": { - "Enum": 0 - }, - "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": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SliceCenter": { - "Rect": [ - [ - 0.0, - 0.0 - ], - [ - 0.0, - 0.0 - ] - ] - }, - "SliceScale": { - "Float32": 1.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Style": { - "Enum": 0 - }, - "Tags": { - "Tags": [] - }, - "TileSize": { - "UDim2": [ - [ - 1.0, - 0 - ], - [ - 1.0, - 0 - ] - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "ImageHandleAdornment": { - "Name": "ImageHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "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.9490197, - 0.95294124, - 0.95294124 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ImageContent": { - "Content": { - "Uri": "rbxasset://textures/SurfacesDefault.png" - } - }, - "Sandboxed": { - "Bool": false - }, - "Size": { - "Vector2": [ - 1.0, - 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 - } - } - }, - "ImageLabel": { - "Name": "ImageLabel", - "Tags": [], - "Superclass": "GuiLabel", - "Properties": { - "ContentImageSize": { - "Name": "ContentImageSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Image": { - "Name": "Image", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ImageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ImageColor3": { - "Name": "ImageColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageContent": { - "Name": "ImageContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageRectOffset": { - "Name": "ImageRectOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageRectSize": { - "Name": "ImageRectSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ImageTransparency": { - "Name": "ImageTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsLoaded": { - "Name": "IsLoaded", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LocalizedImageContent": { - "Name": "LocalizedImageContent", - "Scriptability": "None", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - } - } - }, - "SliceCenter": { - "Name": "SliceCenter", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Rect" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SliceScale": { - "Name": "SliceScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TileSize": { - "Name": "TileSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "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" - }, - "ImageColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "ImageContent": { - "Content": "None" - }, - "ImageRectOffset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "ImageRectSize": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "ImageTransparency": { - "Float32": 0.0 - }, - "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 - }, - "SliceCenter": { - "Rect": [ - [ - 0.0, - 0.0 - ], - [ - 0.0, - 0.0 - ] - ] - }, - "SliceScale": { - "Float32": 1.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TileSize": { - "UDim2": [ - [ - 1.0, - 0 - ], - [ - 1.0, - 0 - ] - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "ImageScreenCaptureService": { - "Name": "ImageScreenCaptureService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ImportSession": { - "Name": "ImportSession", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "UploadSource": { - "Name": "UploadSource", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "IncrementalPatchBuilder": { - "Name": "IncrementalPatchBuilder", - "Tags": [ - "NotCreatable", - "NotReplicated", - "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" - } - } - }, - "InputObject": { - "Name": "InputObject", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Delta": { - "Name": "Delta", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "KeyCode": { - "Name": "KeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UserInputState": { - "Name": "UserInputState", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UserInputState" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UserInputType": { - "Name": "UserInputType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "UserInputType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InsertService": { - "Name": "InsertService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AllowInsertFreeModels": { - "Name": "AllowInsertFreeModels", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotBrowsable", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AllowInsertFreeModels": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Instance": { - "Name": "Instance", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Object", - "Properties": { - "Archivable": { - "Name": "Archivable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "archivable" - } - } - } - }, - "Attributes": { - "Name": "Attributes", - "Scriptability": "Custom", - "DataType": { - "Value": "Attributes" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "AttributesSerialize" - } - } - } - }, - "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": { - "Serialization": "Serializes" - } - } - }, - "DataCost": { - "Name": "DataCost", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Parent": { - "Name": "Parent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Tags": { - "Name": "Tags", - "Scriptability": "Custom", - "DataType": { - "Value": "Tags" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UniqueId": { - "Name": "UniqueId", - "Scriptability": "None", - "DataType": { - "Value": "UniqueId" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "archivable": { - "Name": "archivable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Archivable" - } - } - }, - "numExpectedDirectChildren": { - "Name": "numExpectedDirectChildren", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "InstanceAdornment": { - "Name": "InstanceAdornment", - "Tags": [ - "NotCreatable" - ], - "Superclass": "GuiBase3d", - "Properties": { - "Adornee": { - "Name": "Adornee", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "IntConstrainedValue": { - "Name": "IntConstrainedValue", - "Tags": [ - "Deprecated" - ], - "Superclass": "ValueBase", - "Properties": { - "ConstrainedValue": { - "Name": "ConstrainedValue", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxValue": { - "Name": "MaxValue", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinValue": { - "Name": "MinValue", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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" - }, - "MaxValue": { - "Int64": 10 - }, - "MinValue": { - "Int64": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "value": { - "Int64": 0 - } - } - }, - "IntValue": { - "Name": "IntValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "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" - }, - "Value": { - "Int64": 0 - } - } - }, - "IntentService": { - "Name": "IntentService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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 - ] - } - } - }, - "InventoryPages": { - "Name": "InventoryPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "JointInstance": { - "Name": "JointInstance", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "C0": { - "Name": "C0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "C1": { - "Name": "C1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Part0": { - "Name": "Part0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Part1": { - "Name": "Part1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "part1": { - "Name": "part1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Alias": { - "AliasFor": "Part1" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "JointsService": { - "Name": "JointsService", - "Tags": [ - "Deprecated", - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "KeyboardService": { - "Name": "KeyboardService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Keyframe": { - "Name": "Keyframe", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Time": { - "Name": "Time", - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Time": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "KeyframeMarker": { - "Name": "KeyframeMarker", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Value": { - "Name": "Value", - "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 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Value": { - "String": "" - } - } - }, - "KeyframeSequence": { - "Name": "KeyframeSequence", - "Tags": [], - "Superclass": "AnimationClip", - "Properties": { - "AuthoredHipHeight": { - "Name": "AuthoredHipHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "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" - } - } - }, - "KeyframeSequenceProvider": { - "Name": "KeyframeSequenceProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LanguageService": { - "Name": "LanguageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LayerCollector": { - "Name": "LayerCollector", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "GuiBase2d", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResetOnSpawn": { - "Name": "ResetOnSpawn", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TabKeyboardNavigation": { - "Name": "TabKeyboardNavigation", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ZIndexBehavior": { - "Name": "ZIndexBehavior", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ZIndexBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LegacyStudioBridge": { - "Name": "LegacyStudioBridge", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "ILegacyStudioBridge", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Light": { - "Name": "Light", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "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" - } - } - }, - "Shadows": { - "Name": "Shadows", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Lighting": { - "Name": "Lighting", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "Ambient": { - "Name": "Ambient", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClockTime": { - "Name": "ClockTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ColorShift_Bottom": { - "Name": "ColorShift_Bottom", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ColorShift_Top": { - "Name": "ColorShift_Top", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnvironmentDiffuseScale": { - "Name": "EnvironmentDiffuseScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnvironmentSpecularScale": { - "Name": "EnvironmentSpecularScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExposureCompensation": { - "Name": "ExposureCompensation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExtendLightRangeTo120": { - "Name": "ExtendLightRangeTo120", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FogColor": { - "Name": "FogColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FogEnd": { - "Name": "FogEnd", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FogStart": { - "Name": "FogStart", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GeographicLatitude": { - "Name": "GeographicLatitude", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GlobalShadows": { - "Name": "GlobalShadows", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightingStyle": { - "Name": "LightingStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "LightingStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OutdoorAmbient": { - "Name": "OutdoorAmbient", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Outlines": { - "Name": "Outlines", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrioritizeLightingQuality": { - "Name": "PrioritizeLightingQuality", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShadowColor": { - "Name": "ShadowColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShadowSoftness": { - "Name": "ShadowSoftness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Technology": { - "Name": "Technology", - "Scriptability": "None", - "DataType": { - "Enum": "Technology" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TimeOfDay": { - "Name": "TimeOfDay", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Ambient": { - "Color3": [ - 0.5, - 0.5, - 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 - } - } - }, - "Brightness": { - "Float32": 1.9812492 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ColorShift_Bottom": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "ColorShift_Top": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "EnvironmentDiffuseScale": { - "Float32": 0.0 - }, - "EnvironmentSpecularScale": { - "Float32": 0.0 - }, - "ExposureCompensation": { - "Float32": 0.0 - }, - "ExtendLightRangeTo120": { - "Enum": 0 - }, - "FogColor": { - "Color3": [ - 0.75, - 0.75, - 0.75 - ] - }, - "FogEnd": { - "Float32": 100000.0 - }, - "FogStart": { - "Float32": 0.0 - }, - "GeographicLatitude": { - "Float32": 41.7333 - }, - "GlobalShadows": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LightingStyle": { - "Enum": 1 - }, - "OutdoorAmbient": { - "Color3": [ - 0.5, - 0.5, - 0.5 - ] - }, - "Outlines": { - "Bool": true - }, - "PrioritizeLightingQuality": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "ShadowSoftness": { - "Float32": 0.5 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Technology": { - "Enum": 1 - }, - "TimeOfDay": { - "String": "14:00:00" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LineForce": { - "Name": "LineForce", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "ApplyAtCenterOfMass": { - "Name": "ApplyAtCenterOfMass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InverseSquareLaw": { - "Name": "InverseSquareLaw", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Magnitude": { - "Name": "Magnitude", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxForce": { - "Name": "MaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReactionForceEnabled": { - "Name": "ReactionForceEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "ApplyAtCenterOfMass": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 23 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InverseSquareLaw": { - "Bool": false - }, - "Magnitude": { - "Float32": 1000.0 - }, - "MaxForce": { - "Float32": null - }, - "ReactionForceEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "LineHandleAdornment": { - "Name": "LineHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "Length": { - "Name": "Length", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "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" - }, - "Length": { - "Float32": 5.0 - }, - "Sandboxed": { - "Bool": false - }, - "SizeRelativeOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Thickness": { - "Float32": 1.0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": -1 - } - } - }, - "LinearVelocity": { - "Name": "LinearVelocity", - "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", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LineVelocity": { - "Name": "LineVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxAxesForce": { - "Name": "MaxAxesForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxForce": { - "Name": "MaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxPlanarAxesForce": { - "Name": "MaxPlanarAxesForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaneVelocity": { - "Name": "PlaneVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrimaryTangentAxis": { - "Name": "PrimaryTangentAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReactionForceEnabled": { - "Name": "ReactionForceEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RelativeTo": { - "Name": "RelativeTo", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorRelativeTo" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SecondaryTangentAxis": { - "Name": "SecondaryTangentAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VectorVelocity": { - "Name": "VectorVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VelocityConstraintMode": { - "Name": "VelocityConstraintMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VelocityConstraintMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 26 - }, - "Enabled": { - "Bool": true - }, - "ForceLimitMode": { - "Enum": 0 - }, - "ForceLimitsEnabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LineDirection": { - "Vector3": [ - 1.0, - 0.0, - 0.0 - ] - }, - "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, - 0.0 - ] - }, - "PrimaryTangentAxis": { - "Vector3": [ - 1.0, - 0.0, - 0.0 - ] - }, - "ReactionForceEnabled": { - "Bool": true - }, - "RelativeTo": { - "Enum": 2 - }, - "Sandboxed": { - "Bool": false - }, - "SecondaryTangentAxis": { - "Vector3": [ - 0.0, - 1.0, - 0.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VectorVelocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "VelocityConstraintMode": { - "Enum": 2 - }, - "Visible": { - "Bool": false - } - } - }, - "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 - }, - "Disabled": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LinkedSource": { - "ContentId": "" - }, - "RunContext": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "ScriptGuid": { - "String": "" - }, - "Source": { - "String": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LocalStorageService": { - "Name": "LocalStorageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LocalizationService": { - "Name": "LocalizationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ForcePlayModeGameLocaleId": { - "Name": "ForcePlayModeGameLocaleId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ForcePlayModeRobloxLocaleId": { - "Name": "ForcePlayModeRobloxLocaleId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LocaleManifest": { - "Name": "LocaleManifest", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RobloxForcePlayModeGameLocaleId": { - "Name": "RobloxForcePlayModeGameLocaleId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RobloxForcePlayModeRobloxLocaleId": { - "Name": "RobloxForcePlayModeRobloxLocaleId", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RobloxLocaleId": { - "Name": "RobloxLocaleId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "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" - } - } - }, - "LocalizationTable": { - "Name": "LocalizationTable", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Contents": { - "Name": "Contents", - "Scriptability": "Custom", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevelopmentLanguage": { - "Name": "DevelopmentLanguage", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsExemptFromUGCAnalytics": { - "Name": "IsExemptFromUGCAnalytics", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Root": { - "Name": "Root", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SourceLocaleId": { - "Name": "SourceLocaleId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Contents": { - "String": "[]" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "SourceLocaleId": { - "String": "en-us" - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LodDataEntity": { - "Name": "LodDataEntity", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "EntityData": { - "Name": "EntityData", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EntityLodEnabled": { - "Name": "EntityLodEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "LodDataService": { - "Name": "LodDataService", - "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" - } - } - }, - "LogReporterService": { - "Name": "LogReporterService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LogService": { - "Name": "LogService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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": { - "Name": "LoginService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LuaSettings": { - "Name": "LuaSettings", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LuaSourceContainer": { - "Name": "LuaSourceContainer", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "CachedRemoteSource": { - "Name": "CachedRemoteSource", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "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": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ScriptGuid": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "LuaWebService": { - "Name": "LuaWebService", - "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" - } - } - }, - "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" - } - } - }, - "LuauScriptAnalyzerService": { - "Name": "LuauScriptAnalyzerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - ], - "Superclass": "ManualSurfaceJointInstance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ManualSurfaceJointInstance": { - "Name": "ManualSurfaceJointInstance", - "Tags": [ - "Deprecated", - "NotCreatable" - ], - "Superclass": "JointInstance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ManualWeld": { - "Name": "ManualWeld", - "Tags": [ - "Deprecated" - ], - "Superclass": "ManualSurfaceJointInstance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MarkerCurve": { - "Name": "MarkerCurve", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Length": { - "Name": "Length", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "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==" - } - } - }, - "MarketplaceService": { - "Name": "MarketplaceService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "MaterialService": { - "Name": "MaterialService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AsphaltName": { - "Name": "AsphaltName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BasaltName": { - "Name": "BasaltName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BrickName": { - "Name": "BrickName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CardboardName": { - "Name": "CardboardName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CarpetName": { - "Name": "CarpetName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CeramicTilesName": { - "Name": "CeramicTilesName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClayRoofTilesName": { - "Name": "ClayRoofTilesName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CobblestoneName": { - "Name": "CobblestoneName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ConcreteName": { - "Name": "ConcreteName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CorrodedMetalName": { - "Name": "CorrodedMetalName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CrackedLavaName": { - "Name": "CrackedLavaName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DiamondPlateName": { - "Name": "DiamondPlateName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FabricName": { - "Name": "FabricName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FoilName": { - "Name": "FoilName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GlacierName": { - "Name": "GlacierName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GraniteName": { - "Name": "GraniteName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GrassName": { - "Name": "GrassName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GroundName": { - "Name": "GroundName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IceName": { - "Name": "IceName", - "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" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Use2022MaterialsXml": { - "Bool": false - }, - "WoodName": { - "String": "Wood" - }, - "WoodPlanksName": { - "String": "WoodPlanks" - } - } - }, - "MaterialVariant": { - "Name": "MaterialVariant", - "Tags": [], - "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", - "DataType": { - "Enum": "Material" - }, - "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", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "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": { - "AlphaMode": { - "Enum": 3 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BaseMaterial": { - "Enum": 256 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ColorMapContent": { - "Content": "None" - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "StudsPerTile": { - "Float32": 10.0 - }, - "Tags": { - "Tags": [] - }, - "TexturePackContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MemStorageConnection": { - "Name": "MemStorageConnection", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MemStorageService": { - "Name": "MemStorageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "MemoryStoreQueue": { - "Name": "MemoryStoreQueue", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MemoryStoreService": { - "Name": "MemoryStoreService", - "Tags": [ - "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" - } - } - }, - "MemoryStoreSortedMap": { - "Name": "MemoryStoreSortedMap", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MeshContentProvider": { - "Name": "MeshContentProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HasJointOffset": { - "Name": "HasJointOffset", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HasSkinnedMesh": { - "Name": "HasSkinnedMesh", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "InitialSize": { - "Name": "InitialSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "JointOffset": { - "Name": "JointOffset", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshContent": { - "Name": "MeshContent", - "Scriptability": "Read", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshID": { - "Name": "MeshID", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Enum": "RenderFidelity" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "DoubleSided": { - "Bool": false - }, - "EnableFluidForces": { - "Bool": true - }, - "FluidFidelityInternal": { - "Enum": 0 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HasJointOffset": { - "Bool": false - }, - "HasSkinnedMesh": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InertiaMigrated": { - "Bool": true - }, - "InitialSize": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "JointOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.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": "" - }, - "MeshContent": { - "Content": "None" - }, - "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 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 0 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "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 - } - } - }, - "Message": { - "Name": "Message", - "Tags": [ - "Deprecated" - ], - "Superclass": "Instance", - "Properties": { - "Text": { - "Name": "Text", - "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 - }, - "Tags": { - "Tags": [] - }, - "Text": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MessageBusConnection": { - "Name": "MessageBusConnection", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MessageBusService": { - "Name": "MessageBusService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MessagingService": { - "Name": "MessagingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MetaBreakpoint": { - "Name": "MetaBreakpoint", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Condition": { - "Name": "Condition", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ContinueExecution": { - "Name": "ContinueExecution", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Id": { - "Name": "Id", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsLogpoint": { - "Name": "IsLogpoint", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Line": { - "Name": "Line", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LogMessage": { - "Name": "LogMessage", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RemoveOnHit": { - "Name": "RemoveOnHit", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Script": { - "Name": "Script", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Valid": { - "Name": "Valid", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "MetaBreakpointContext": { - "Name": "MetaBreakpointContext", - "Tags": [ - "NotCreatable", - "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" - } - } - }, - "Model": { - "Name": "Model", - "Tags": [], - "Superclass": "PVInstance", - "Properties": { - "LevelOfDetail": { - "Name": "LevelOfDetail", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ModelLevelOfDetail" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Scale": { - "Name": "Scale", - "Scriptability": "Custom", - "DataType": { - "Value": "Float32" - }, - "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", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WorldPivot": { - "Name": "WorldPivot", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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" - }, - "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" - } - } - }, - "ModuleScript": { - "Name": "ModuleScript", - "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" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Source": { - "Name": "Source", - "Scriptability": "Custom", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - }, - "LinkedSource": { - "ContentId": "" - }, - "Sandboxed": { - "Bool": false - }, - "ScriptGuid": { - "String": "" - }, - "Source": { - "String": "" - }, - "SourceAssetId": { - "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" - } - } - }, - "Motor": { - "Name": "Motor", - "Tags": [], - "Superclass": "JointInstance", - "Properties": { - "CurrentAngle": { - "Name": "CurrentAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DesiredAngle": { - "Name": "DesiredAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxVelocity": { - "Name": "MaxVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReplicateCurrentAngle": { - "Name": "ReplicateCurrentAngle", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "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" - } - } - }, - "Motor6D": { - "Name": "Motor6D", - "Tags": [], - "Superclass": "Motor", - "Properties": { - "ChildName": { - "Name": "ChildName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ParentName": { - "Name": "ParentName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "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" - } - } - }, - "MotorFeature": { - "Name": "MotorFeature", - "Tags": [ - "Deprecated" - ], - "Superclass": "Feature", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FaceId": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "InOut": { - "Enum": 2 - }, - "LeftRight": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopBottom": { - "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Mouse": { - "Name": "Mouse", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Hit": { - "Name": "Hit", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Origin": { - "Name": "Origin", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Target": { - "Name": "Target", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TargetFilter": { - "Name": "TargetFilter", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetSurface": { - "Name": "TargetSurface", - "Scriptability": "Read", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UnitRay": { - "Name": "UnitRay", - "Scriptability": "Read", - "DataType": { - "Value": "Ray" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ViewSizeX": { - "Name": "ViewSizeX", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ViewSizeY": { - "Name": "ViewSizeY", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "X": { - "Name": "X", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Y": { - "Name": "Y", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "hit": { - "Name": "hit", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "target": { - "Name": "target", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MouseService": { - "Name": "MouseService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "MultipleDocumentInterfaceInstance": { - "Name": "MultipleDocumentInterfaceInstance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "FocusedDataModelSession": { - "Name": "FocusedDataModelSession", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NegateOperation": { - "Name": "NegateOperation", - "Tags": [], - "Superclass": "PartOperation", - "Properties": { - "PreviousOperation": { - "Name": "PreviousOperation", - "Scriptability": "None", - "DataType": { - "Enum": "NegateOperationHiddenHistory" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AeroMeshData": { - "SharedString": "" - }, - "Anchored": { - "Bool": true - }, - "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": false - }, - "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 - ] - ] - } - }, - "PreviousOperation": { - "Enum": 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.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 - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "NetworkClient": { - "Name": "NetworkClient", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "NetworkPeer", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NetworkMarker": { - "Name": "NetworkMarker", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NetworkPeer": { - "Name": "NetworkPeer", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NetworkReplicator": { - "Name": "NetworkReplicator", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NetworkServer": { - "Name": "NetworkServer", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "NetworkPeer", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NetworkSettings": { - "Name": "NetworkSettings", - "Tags": [ - "NotBrowsable", - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "EmulatedTotalMemoryInMB": { - "Name": "EmulatedTotalMemoryInMB", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FreeMemoryMBytes": { - "Name": "FreeMemoryMBytes", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HttpProxyEnabled": { - "Name": "HttpProxyEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HttpProxyURL": { - "Name": "HttpProxyURL", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrintPhysicsErrors": { - "Name": "PrintPhysicsErrors", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PrintStreamInstanceQuota": { - "Name": "PrintStreamInstanceQuota", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RandomizeJoinInstanceOrder": { - "Name": "RandomizeJoinInstanceOrder", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RenderStreamedRegions": { - "Name": "RenderStreamedRegions", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowActiveAnimationAsset": { - "Name": "ShowActiveAnimationAsset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NoCollisionConstraint": { - "Name": "NoCollisionConstraint", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Part0": { - "Name": "Part0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Part1": { - "Name": "Part1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "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" - } - } - }, - "NonReplicatedCSGDictionaryService": { - "Name": "NonReplicatedCSGDictionaryService", - "Tags": [ - "Service" - ], - "Superclass": "FlyweightService", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NotificationService": { - "Name": "NotificationService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "IsConnected": { - "Name": "IsConnected", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsLuaChatEnabled": { - "Name": "IsLuaChatEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsLuaGameDetailsEnabled": { - "Name": "IsLuaGameDetailsEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SelectedTheme": { - "Name": "SelectedTheme", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "NumberPose": { - "Name": "NumberPose", - "Tags": [], - "Superclass": "PoseBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "EasingDirection": { - "Enum": 0 - }, - "EasingStyle": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Value": { - "Float64": 0.0 - }, - "Weight": { - "Float32": 1.0 - } - } - }, - "NumberValue": { - "Name": "NumberValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "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" - }, - "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": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "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" - } - } - }, - "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" - } - } - }, - "OrderedDataStore": { - "Name": "OrderedDataStore", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "GlobalDataStore", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "OutfitPages": { - "Name": "OutfitPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Pages", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "OutputLink": { - "Name": "OutputLink", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "PVAdornment": { - "Name": "PVAdornment", - "Tags": [ - "NotCreatable" - ], - "Superclass": "GuiBase3d", - "Properties": { - "Adornee": { - "Name": "Adornee", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PVInstance": { - "Name": "PVInstance", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Origin": { - "Name": "Origin", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Pivot Offset": { - "Name": "Pivot Offset", - "Scriptability": "None", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PackageLink": { - "Name": "PackageLink", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "AutoUpdate": { - "Name": "AutoUpdate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanAutoUpdate": { - "Name": "CanAutoUpdate", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Creator": { - "Name": "Creator", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "PackageContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "PackageIdSerialize": { - "Name": "PackageIdSerialize", - "Scriptability": "None", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "PackageId" - } - } - }, - "PermissionLevel": { - "Name": "PermissionLevel", - "Scriptability": "None", - "DataType": { - "Enum": "PackagePermission" - }, - "Tags": [ - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SerializedDefaultAttributes": { - "Name": "SerializedDefaultAttributes", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Status": { - "Name": "Status", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VersionIdSerialize": { - "Name": "VersionIdSerialize", - "Scriptability": "None", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VersionNumber": { - "Name": "VersionNumber", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PackageService": { - "Name": "PackageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PackageUIService": { - "Name": "PackageUIService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "Pages": { - "Name": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "IsFinished": { - "Name": "IsFinished", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Pants": { - "Name": "Pants", - "Tags": [], - "Superclass": "Clothing", - "Properties": { - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PantsTemplateContent": { - "Content": "None" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ParabolaAdornment": { - "Name": "ParabolaAdornment", - "Tags": [], - "Superclass": "PVAdornment", - "Properties": { - "A": { - "Name": "A", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "B": { - "Name": "B", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "C": { - "Name": "C", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Range": { - "Name": "Range", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Thickness": { - "Name": "Thickness", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.9490197, - 0.95294124, - 0.95294124 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - } - } - }, - "Part": { - "Name": "Part", - "Tags": [], - "Superclass": "FormFactorPart", - "Properties": { - "Shape": { - "Name": "Shape", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PartType" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "shape" - } - } - } - }, - "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" - ], - "Kind": { - "Alias": { - "AliasFor": "Shape" - } - } - } - }, - "DefaultProperties": { - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "EnableFluidForces": { - "Bool": true - }, - "FormFactor": { - "Enum": 1 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "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 - }, - "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 - }, - "Shape": { - "Enum": 1 - }, - "Size": { - "Vector3": [ - 4.0, - 1.2, - 2.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 3 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "PartAdornment": { - "Name": "PartAdornment", - "Tags": [ - "NotCreatable" - ], - "Superclass": "GuiBase3d", - "Properties": { - "Adornee": { - "Name": "Adornee", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PartOperation": { - "Name": "PartOperation", - "Tags": [], - "Superclass": "TriangleMeshPart", - "Properties": { - "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" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RenderFidelity": { - "Name": "RenderFidelity", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RenderFidelity" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SmoothingAngle": { - "Name": "SmoothingAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SolidMeshHolder": { - "Name": "SolidMeshHolder", - "Scriptability": "None", - "DataType": { - "Value": "NetAssetRef" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TriangleCount": { - "Name": "TriangleCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UsePartColor": { - "Name": "UsePartColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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 - ] - } - } - }, - "PartOperationAsset": { - "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" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ChildData": { - "BinaryString": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshData": { - "BinaryString": "" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ParticleEmitter": { - "Name": "ParticleEmitter", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Acceleration": { - "Name": "Acceleration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ColorSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Drag": { - "Name": "Drag", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmissionDirection": { - "Name": "EmissionDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightEmission": { - "Name": "LightEmission", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightInfluence": { - "Name": "LightInfluence", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LockedToPart": { - "Name": "LockedToPart", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Orientation": { - "Name": "Orientation", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ParticleOrientation" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rate": { - "Name": "Rate", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RotSpeed": { - "Name": "RotSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rotation": { - "Name": "Rotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shape": { - "Name": "Shape", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ParticleEmitterShape" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShapeInOut": { - "Name": "ShapeInOut", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ParticleEmitterShapeInOut" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShapePartial": { - "Name": "ShapePartial", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShapeStyle": { - "Name": "ShapeStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ParticleEmitterShapeStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Speed": { - "Name": "Speed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberRange" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SpreadAngle": { - "Name": "SpreadAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Squash": { - "Name": "Squash", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TimeScale": { - "Name": "TimeScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VelocityInheritance": { - "Name": "VelocityInheritance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VelocitySpread": { - "Name": "VelocitySpread", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "WindAffectsDrag": { - "Name": "WindAffectsDrag", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZOffset": { - "Name": "ZOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Acceleration": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Brightness": { - "Float32": 1.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "ColorSequence": { - "keypoints": [ - { - "time": 0.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - }, - { - "time": 1.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - } - ] - } - }, - "Drag": { - "Float32": 0.0 - }, - "EmissionDirection": { - "Enum": 1 - }, - "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, - 10.0 - ] - }, - "LightEmission": { - "Float32": 0.0 - }, - "LightInfluence": { - "Float32": 0.0 - }, - "LockedToPart": { - "Bool": false - }, - "Orientation": { - "Enum": 0 - }, - "Rate": { - "Float32": 20.0 - }, - "RotSpeed": { - "NumberRange": [ - 0.0, - 0.0 - ] - }, - "Rotation": { - "NumberRange": [ - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "Shape": { - "Enum": 0 - }, - "ShapeInOut": { - "Enum": 0 - }, - "ShapePartial": { - "Float32": 1.0 - }, - "ShapeStyle": { - "Enum": 0 - }, - "Size": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 1.0, - "envelope": 0.0 - }, - { - "time": 1.0, - "value": 1.0, - "envelope": 0.0 - } - ] - } - }, - "SourceAssetId": { - "Int64": -1 - }, - "Speed": { - "NumberRange": [ - 5.0, - 5.0 - ] - }, - "SpreadAngle": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Squash": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 0.0, - "envelope": 0.0 - }, - { - "time": 1.0, - "value": 0.0, - "envelope": 0.0 - } - ] - } - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": { - "Uri": "rbxasset://textures/particles/sparkles_main.dds" - } - }, - "TimeScale": { - "Float32": 1.0 - }, - "Transparency": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 0.0, - "envelope": 0.0 - }, - { - "time": 1.0, - "value": 0.0, - "envelope": 0.0 - } - ] - } - }, - "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": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Status": { - "Name": "Status", - "Scriptability": "Read", - "DataType": { - "Enum": "PathStatus" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "PathfindingLink": { - "Name": "PathfindingLink", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Attachment0": { - "Name": "Attachment0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Attachment1": { - "Name": "Attachment1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsBidirectional": { - "Name": "IsBidirectional", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Label": { - "Name": "Label", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsBidirectional": { - "Bool": true - }, - "Label": { - "String": "" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PathfindingModifier": { - "Name": "PathfindingModifier", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Label": { - "Name": "Label", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PassThrough": { - "Name": "PassThrough", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Label": { - "String": "" - }, - "PassThrough": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PathfindingService": { - "Name": "PathfindingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "EmptyCutoff": { - "Name": "EmptyCutoff", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PausedState": { - "Name": "PausedState", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "AllThreadsPaused": { - "Name": "AllThreadsPaused", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Reason": { - "Name": "Reason", - "Scriptability": "None", - "DataType": { - "Enum": "DebuggerPauseReason" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ThreadId": { - "Name": "ThreadId", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PausedStateBreakpoint": { - "Name": "PausedStateBreakpoint", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "PausedState", - "Properties": { - "Breakpoint": { - "Name": "Breakpoint", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PausedStateException": { - "Name": "PausedStateException", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "PausedState", - "Properties": { - "ExceptionText": { - "Name": "ExceptionText", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "PermissionsService": { - "Name": "PermissionsService", - "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" - } - } - }, - "PhysicsService": { - "Name": "PhysicsService", - "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" - } - } - }, - "PhysicsSettings": { - "Name": "PhysicsSettings", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AllowSleep": { - "Name": "AllowSleep", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreAnchorsShown": { - "Name": "AreAnchorsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreAssembliesShown": { - "Name": "AreAssembliesShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreAssemblyCentersOfMassShown": { - "Name": "AreAssemblyCentersOfMassShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreAwakePartsHighlighted": { - "Name": "AreAwakePartsHighlighted", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreBodyTypesShown": { - "Name": "AreBodyTypesShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreContactPointsShown": { - "Name": "AreContactPointsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreGravityForcesShownForSelectedOrHoveredAssemblies": { - "Name": "AreGravityForcesShownForSelectedOrHoveredAssemblies", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreJointCoordinatesShown": { - "Name": "AreJointCoordinatesShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreMagnitudesShownForDrawnForcesAndTorques": { - "Name": "AreMagnitudesShownForDrawnForcesAndTorques", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreMechanismsShown": { - "Name": "AreMechanismsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreModelCoordsShown": { - "Name": "AreModelCoordsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreNonAnchorsShown": { - "Name": "AreNonAnchorsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreOwnersShown": { - "Name": "AreOwnersShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ArePartCoordsShown": { - "Name": "ArePartCoordsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreRegionsShown": { - "Name": "AreRegionsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreSolverIslandsShown": { - "Name": "AreSolverIslandsShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreTerrainReplicationRegionsShown": { - "Name": "AreTerrainReplicationRegionsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreTimestepsShown": { - "Name": "AreTimestepsShown", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreUnalignedPartsShown": { - "Name": "AreUnalignedPartsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AreWorldCoordsShown": { - "Name": "AreWorldCoordsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsReceiveAgeShown": { - "Name": "IsReceiveAgeShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsTreeShown": { - "Name": "IsTreeShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PhysicsEnvironmentalThrottle": { - "Name": "PhysicsEnvironmentalThrottle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "EnviromentalPhysicsThrottle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowDecompositionGeometry": { - "Name": "ShowDecompositionGeometry", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TorqueDrawScale": { - "Name": "TorqueDrawScale", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UseCSGv2": { - "Name": "UseCSGv2", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "PitchShiftSoundEffect": { - "Name": "PitchShiftSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "Octave": { - "Name": "Octave", - "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" - }, - "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" - } - } - }, - "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 - }, - "Color": { - "BrickColor": 194 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "Platform": { - "Name": "Platform", - "Tags": [ - "NotCreatable" - ], - "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" - } - } - }, - "Player": { - "Name": "Player", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AccountAge": { - "Name": "AccountAge", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AutoJumpEnabled": { - "Name": "AutoJumpEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraMinZoomDistance": { - "Name": "CameraMinZoomDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraMode": { - "Name": "CameraMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CameraMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraViewportSize": { - "Name": "CameraViewportSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CanLoadCharacterAppearance": { - "Name": "CanLoadCharacterAppearance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Character": { - "Name": "Character", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterAppearance": { - "Name": "CharacterAppearance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Deprecated", - "NotBrowsable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterAppearanceId": { - "Name": "CharacterAppearanceId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "ChatMode" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DataComplexityLimit": { - "Name": "DataComplexityLimit", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DataReady": { - "Name": "DataReady", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DevCameraOcclusionMode": { - "Name": "DevCameraOcclusionMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevCameraOcclusionMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevComputerCameraMode": { - "Name": "DevComputerCameraMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevComputerCameraMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevComputerMovementMode": { - "Name": "DevComputerMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevComputerMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevEnableMouseLock": { - "Name": "DevEnableMouseLock", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevTouchCameraMode": { - "Name": "DevTouchCameraMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevTouchCameraMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevTouchMovementMode": { - "Name": "DevTouchMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevTouchMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DisplayName": { - "Name": "DisplayName", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FollowUserId": { - "Name": "FollowUserId", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Guest": { - "Name": "Guest", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxSimulationRadius": { - "Name": "MaxSimulationRadius", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaximumSimulationRadius": { - "Name": "MaximumSimulationRadius", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MembershipType": { - "Name": "MembershipType", - "Scriptability": "Read", - "DataType": { - "Enum": "MembershipType" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MembershipTypeReplicate": { - "Name": "MembershipTypeReplicate", - "Scriptability": "None", - "DataType": { - "Enum": "MembershipType" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "NameDisplayDistance": { - "Name": "NameDisplayDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NeedRegionalFallback": { - "Name": "NeedRegionalFallback", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Neutral": { - "Name": "Neutral", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OsPlatform": { - "Name": "OsPlatform", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RawJoinData": { - "Name": "RawJoinData", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReplicationFocus": { - "Name": "ReplicationFocus", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RespawnLocation": { - "Name": "RespawnLocation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SimulationRadius": { - "Name": "SimulationRadius", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TeamColor": { - "Name": "TeamColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Teleported": { - "Name": "Teleported", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TeleportedIn": { - "Name": "TeleportedIn", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Int64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UserIdModeReplicate": { - "Name": "UserIdModeReplicate", - "Scriptability": "None", - "DataType": { - "Enum": "UserIdMode" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VRDevice": { - "Name": "VRDevice", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "PlayerEmulatorService": { - "Name": "PlayerEmulatorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "CustomPoliciesEnabled": { - "Name": "CustomPoliciesEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmulatedCountryCode": { - "Name": "EmulatedCountryCode", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EmulatedGameLocale": { - "Name": "EmulatedGameLocale", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlayerEmulationEnabled": { - "Name": "PlayerEmulationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PseudolocalizationEnabled": { - "Name": "PseudolocalizationEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SerializedEmulatedPolicyInfo": { - "Name": "SerializedEmulatedPolicyInfo", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextElongationFactor": { - "Name": "TextElongationFactor", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CustomPoliciesEnabled": { - "Bool": false - }, - "EmulatedCountryCode": { - "String": "" - }, - "EmulatedGameLocale": { - "String": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PlayerEmulationEnabled": { - "Bool": false - }, - "PseudolocalizationEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SerializedEmulatedPolicyInfo": { - "BinaryString": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextElongationFactor": { - "Int32": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerGui": { - "Name": "PlayerGui", - "Tags": [ - "NotCreatable", - "PlayerReplicated" - ], - "Superclass": "BasePlayerGui", - "Properties": { - "CurrentScreenOrientation": { - "Name": "CurrentScreenOrientation", - "Scriptability": "Read", - "DataType": { - "Enum": "ScreenOrientation" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InputBindingMappingsRaw": { - "Name": "InputBindingMappingsRaw", - "Scriptability": "None", - "DataType": { - "Value": "BinaryString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ScreenOrientation": { - "Name": "ScreenOrientation", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ScreenOrientation" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionImageObject": { - "Name": "SelectionImageObject", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "PlayerMouse": { - "Name": "PlayerMouse", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Mouse", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PlayerScripts": { - "Name": "PlayerScripts", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "Players": { - "Name": "Players", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "BanningEnabled": { - "Name": "BanningEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BubbleChat": { - "Name": "BubbleChat", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CharacterAutoLoads": { - "Name": "CharacterAutoLoads", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClassicChat": { - "Name": "ClassicChat", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LocalPlayer": { - "Name": "LocalPlayer", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxPlayers": { - "Name": "MaxPlayers", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "MaxPlayersInternal" - } - } - } - }, - "MaxPlayersInternal": { - "Name": "MaxPlayersInternal", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Alias": { - "AliasFor": "MaxPlayers" - } - } - }, - "NumPlayers": { - "Name": "NumPlayers", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PreferredPlayers": { - "Name": "PreferredPlayers", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "PreferredPlayersInternal" - } - } - } - }, - "PreferredPlayersInternal": { - "Name": "PreferredPlayersInternal", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Alias": { - "AliasFor": "PreferredPlayers" - } - } - }, - "RespawnTime": { - "Name": "RespawnTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "numPlayers": { - "Name": "numPlayers", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BanningEnabled": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CharacterAutoLoads": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxPlayers": { - "Int32": 12 - }, - "PreferredPlayers": { - "Int32": 0 - }, - "RespawnTime": { - "Float32": 5.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseStrafingAnimations": { - "Bool": false - } - } - }, - "Plugin": { - "Name": "Plugin", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "CollisionEnabled": { - "Name": "CollisionEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DisableUIDragDetectorDrags": { - "Name": "DisableUIDragDetectorDrags", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GridSize": { - "Name": "GridSize", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HostDataModelType": { - "Name": "HostDataModelType", - "Scriptability": "None", - "DataType": { - "Enum": "StudioDataModelType" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HostDataModelTypeIsCurrent": { - "Name": "HostDataModelTypeIsCurrent", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsDebuggable": { - "Name": "IsDebuggable", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MultipleDocumentInterfaceInstance": { - "Name": "MultipleDocumentInterfaceInstance", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UsesAssetInsertionDrag": { - "Name": "UsesAssetInsertionDrag", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginAction": { - "Name": "PluginAction", - "Tags": [ - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "ActionId": { - "Name": "ActionId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AllowBinding": { - "Name": "AllowBinding", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Checked": { - "Name": "Checked", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DefaultShortcut": { - "Name": "DefaultShortcut", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StatusTip": { - "Name": "StatusTip", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "Read", - "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" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginDragEvent": { - "Name": "PluginDragEvent", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Data": { - "Name": "Data", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MimeType": { - "Name": "MimeType", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Sender": { - "Name": "Sender", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginGui": { - "Name": "PluginGui", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "LayerCollector", - "Properties": { - "Plugin": { - "Name": "Plugin", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Title": { - "Name": "Title", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginGuiService": { - "Name": "PluginGuiService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "PluginManager": { - "Name": "PluginManager", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginManagerInterface": { - "Name": "PluginManagerInterface", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginMenu": { - "Name": "PluginMenu", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "Icon": { - "Name": "Icon", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Title": { - "Name": "Title", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "PluginMouse": { - "Name": "PluginMouse", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Mouse", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginPolicyService": { - "Name": "PluginPolicyService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginToolbar": { - "Name": "PluginToolbar", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PluginToolbarButton": { - "Name": "PluginToolbarButton", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "ClickableWhenViewportHidden": { - "Name": "ClickableWhenViewportHidden", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Icon": { - "Name": "Icon", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IconContent": { - "Name": "IconContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PointLight": { - "Name": "PointLight", - "Tags": [], - "Superclass": "Light", - "Properties": { - "Range": { - "Name": "Range", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Brightness": { - "Float32": 1.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Range": { - "Float32": 8.0 - }, - "Sandboxed": { - "Bool": false - }, - "Shadows": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PointsService": { - "Name": "PointsService", - "Tags": [ - "Deprecated", - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PolicyService": { - "Name": "PolicyService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "IsLuobuServer": { - "Name": "IsLuobuServer", - "Scriptability": "None", - "DataType": { - "Enum": "TriStateBoolean" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LuobuWhitelisted": { - "Name": "LuobuWhitelisted", - "Scriptability": "None", - "DataType": { - "Enum": "TriStateBoolean" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "Pose": { - "Name": "Pose", - "Tags": [], - "Superclass": "PoseBase", - "Properties": { - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaskWeight": { - "Name": "MaskWeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "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 - }, - "EasingDirection": { - "Enum": 0 - }, - "EasingStyle": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Weight": { - "Float32": 1.0 - } - } - }, - "PoseBase": { - "Name": "PoseBase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "EasingDirection": { - "Name": "EasingDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PoseEasingDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EasingStyle": { - "Name": "EasingStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PoseEasingStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Weight": { - "Name": "Weight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PostEffect": { - "Name": "PostEffect", - "Tags": [ - "NotCreatable" - ], - "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" - } - } - }, - "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" - } - } - }, - "PrismaticConstraint": { - "Name": "PrismaticConstraint", - "Tags": [], - "Superclass": "SlidingBallConstraint", - "Properties": {}, - "DefaultProperties": { - "ActuatorType": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 1009 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LimitsEnabled": { - "Bool": false - }, - "LinearResponsiveness": { - "Float32": 45.0 - }, - "LowerLimit": { - "Float32": 0.0 - }, - "MotorMaxAcceleration": { - "Float32": null - }, - "MotorMaxForce": { - "Float32": 0.0 - }, - "Restitution": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "ServoMaxForce": { - "Float32": 0.0 - }, - "Size": { - "Float32": 0.15 - }, - "SoftlockServoUponReachingTarget": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Speed": { - "Float32": 0.0 - }, - "Tags": { - "Tags": [] - }, - "TargetPosition": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UpperLimit": { - "Float32": 5.0 - }, - "Velocity": { - "Float32": 0.0 - }, - "Visible": { - "Bool": false - } - } - }, - "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": [ - "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" - } - } - }, - "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" - } - } - }, - "ProximityPrompt": { - "Name": "ProximityPrompt", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ActionText": { - "Name": "ActionText", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutoLocalize": { - "Name": "AutoLocalize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClickablePrompt": { - "Name": "ClickablePrompt", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Exclusivity": { - "Name": "Exclusivity", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ProximityPromptExclusivity" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GamepadKeyCode": { - "Name": "GamepadKeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HoldDuration": { - "Name": "HoldDuration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "KeyboardKeyCode": { - "Name": "KeyboardKeyCode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "KeyCode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxActivationDistance": { - "Name": "MaxActivationDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxIndicatorDistance": { - "Name": "MaxIndicatorDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ObjectText": { - "Name": "ObjectText", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RequiresLineOfSight": { - "Name": "RequiresLineOfSight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RootLocalizationTable": { - "Name": "RootLocalizationTable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Style": { - "Name": "Style", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ProximityPromptStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UIOffset": { - "Name": "UIOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "ActionText": { - "String": "Interact" - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClickablePrompt": { - "Bool": true - }, - "Enabled": { - "Bool": true - }, - "Exclusivity": { - "Enum": 0 - }, - "GamepadKeyCode": { - "Enum": 1000 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HoldDuration": { - "Float32": 0.0 - }, - "KeyboardKeyCode": { - "Enum": 101 - }, - "MaxActivationDistance": { - "Float32": 10.0 - }, - "MaxIndicatorDistance": { - "Float32": 0.0 - }, - "ObjectText": { - "String": "" - }, - "RequiresLineOfSight": { - "Bool": true - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Style": { - "Enum": 0 - }, - "Tags": { - "Tags": [] - }, - "UIOffset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ProximityPromptService": { - "Name": "ProximityPromptService", - "Tags": [ - "NotBrowsable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxIndicatorsVisible": { - "Name": "MaxIndicatorsVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxPromptsVisible": { - "Name": "MaxPromptsVisible", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxIndicatorsVisible": { - "Int32": 16 - }, - "MaxPromptsVisible": { - "Int32": 16 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "PublishService": { - "Name": "PublishService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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 - } - } - }, - "QWidgetPluginGui": { - "Name": "QWidgetPluginGui", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "RayValue": { - "Name": "RayValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ray" - }, - "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" - }, - "Value": { - "Ray": { - "origin": [ - 0.0, - 0.0, - 0.0 - ], - "direction": [ - 0.0, - 0.0, - 0.0 - ] - } - } - } - }, - "RbxAnalyticsService": { - "Name": "RbxAnalyticsService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "ReflectionMetadata": { - "Name": "ReflectionMetadata", - "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" - } - } - }, - "ReflectionMetadataCallbacks": { - "Name": "ReflectionMetadataCallbacks", - "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" - } - } - }, - "ReflectionMetadataClass": { - "Name": "ReflectionMetadataClass", - "Tags": [], - "Superclass": "ReflectionMetadataItem", - "Properties": { - "ExplorerImageIndex": { - "Name": "ExplorerImageIndex", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ExplorerOrder": { - "Name": "ExplorerOrder", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Insertable": { - "Name": "Insertable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PreferredParent": { - "Name": "PreferredParent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ServiceVisibility": { - "Name": "ServiceVisibility", - "Scriptability": "None", - "DataType": { - "Enum": "ServiceVisibility" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Browsable": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClassCategory": { - "String": "" - }, - "ClientOnly": { - "Bool": false - }, - "Constraint": { - "String": "" - }, - "Deprecated": { - "Bool": false - }, - "EditingDisabled": { - "Bool": false - }, - "EditorType": { - "String": "" - }, - "ExplorerImageIndex": { - "Int32": 0 - }, - "ExplorerOrder": { - "Int32": 2147483647 - }, - "FFlag": { - "String": "" - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Insertable": { - "Bool": true - }, - "IsBackend": { - "Bool": false - }, - "PreferredParent": { - "String": "" - }, - "PropertyOrder": { - "Int32": 5000 - }, - "Sandboxed": { - "Bool": false - }, - "ScriptContext": { - "String": "" - }, - "ServerOnly": { - "Bool": false - }, - "ServiceVisibility": { - "Enum": 0 - }, - "SliderScaling": { - "String": "" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UIMaximum": { - "Float64": 0.0 - }, - "UIMinimum": { - "Float64": 0.0 - }, - "UINumTicks": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReflectionMetadataClasses": { - "Name": "ReflectionMetadataClasses", - "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" - } - } - }, - "ReflectionMetadataEnum": { - "Name": "ReflectionMetadataEnum", - "Tags": [], - "Superclass": "ReflectionMetadataItem", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Browsable": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClassCategory": { - "String": "" - }, - "ClientOnly": { - "Bool": false - }, - "Constraint": { - "String": "" - }, - "Deprecated": { - "Bool": false - }, - "EditingDisabled": { - "Bool": false - }, - "EditorType": { - "String": "" - }, - "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": [] - }, - "UIMaximum": { - "Float64": 0.0 - }, - "UIMinimum": { - "Float64": 0.0 - }, - "UINumTicks": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReflectionMetadataEnumItem": { - "Name": "ReflectionMetadataEnumItem", - "Tags": [], - "Superclass": "ReflectionMetadataItem", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Browsable": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClassCategory": { - "String": "" - }, - "ClientOnly": { - "Bool": false - }, - "Constraint": { - "String": "" - }, - "Deprecated": { - "Bool": false - }, - "EditingDisabled": { - "Bool": false - }, - "EditorType": { - "String": "" - }, - "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": [] - }, - "UIMaximum": { - "Float64": 0.0 - }, - "UIMinimum": { - "Float64": 0.0 - }, - "UINumTicks": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReflectionMetadataEnums": { - "Name": "ReflectionMetadataEnums", - "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" - } - } - }, - "ReflectionMetadataEvents": { - "Name": "ReflectionMetadataEvents", - "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" - } - } - }, - "ReflectionMetadataFunctions": { - "Name": "ReflectionMetadataFunctions", - "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" - } - } - }, - "ReflectionMetadataItem": { - "Name": "ReflectionMetadataItem", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "Browsable": { - "Name": "Browsable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClassCategory": { - "Name": "ClassCategory", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClientOnly": { - "Name": "ClientOnly", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Constraint": { - "Name": "Constraint", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Deprecated": { - "Name": "Deprecated", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EditingDisabled": { - "Name": "EditingDisabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EditorType": { - "Name": "EditorType", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FFlag": { - "Name": "FFlag", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsBackend": { - "Name": "IsBackend", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PropertyOrder": { - "Name": "PropertyOrder", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScriptContext": { - "Name": "ScriptContext", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ServerOnly": { - "Name": "ServerOnly", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SliderScaling": { - "Name": "SliderScaling", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UIMaximum": { - "Name": "UIMaximum", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UIMinimum": { - "Name": "UIMinimum", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UINumTicks": { - "Name": "UINumTicks", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReflectionMetadataMember": { - "Name": "ReflectionMetadataMember", - "Tags": [], - "Superclass": "ReflectionMetadataItem", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Browsable": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClassCategory": { - "String": "" - }, - "ClientOnly": { - "Bool": false - }, - "Constraint": { - "String": "" - }, - "Deprecated": { - "Bool": false - }, - "EditingDisabled": { - "Bool": false - }, - "EditorType": { - "String": "" - }, - "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": [] - }, - "UIMaximum": { - "Float64": 0.0 - }, - "UIMinimum": { - "Float64": 0.0 - }, - "UINumTicks": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReflectionMetadataProperties": { - "Name": "ReflectionMetadataProperties", - "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" - } - } - }, - "ReflectionMetadataYieldFunctions": { - "Name": "ReflectionMetadataYieldFunctions", - "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" - } - } - }, - "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" - } - } - }, - "RemoteDebuggerServer": { - "Name": "RemoteDebuggerServer", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RemoteEvent": { - "Name": "RemoteEvent", - "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" - } - } - }, - "RemoteFunction": { - "Name": "RemoteFunction", - "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" - } - } - }, - "RenderSettings": { - "Name": "RenderSettings", - "Tags": [ - "NotBrowsable", - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AutoFRMLevel": { - "Name": "AutoFRMLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EagerBulkExecution": { - "Name": "EagerBulkExecution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EditQualityLevel": { - "Name": "EditQualityLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "QualityLevel" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable VR Mode": { - "Name": "Enable VR Mode", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableFRM": { - "Name": "EnableFRM", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ExportMergeByMaterial": { - "Name": "ExportMergeByMaterial", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FrameRateManager": { - "Name": "FrameRateManager", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FramerateManagerMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GraphicsMode": { - "Name": "GraphicsMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "GraphicsMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshCacheSize": { - "Name": "MeshCacheSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshPartDetailLevel": { - "Name": "MeshPartDetailLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "MeshPartDetailLevel" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "QualityLevel": { - "Name": "QualityLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "QualityLevel" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReloadAssets": { - "Name": "ReloadAssets", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RenderCSGTrianglesDebug": { - "Name": "RenderCSGTrianglesDebug", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowBoundingBoxes": { - "Name": "ShowBoundingBoxes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - } - } - }, - "RenderingTest": { - "Name": "RenderingTest", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "CFrame": { - "Name": "CFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ComparisonDiffThreshold": { - "Name": "ComparisonDiffThreshold", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ComparisonMethod": { - "Name": "ComparisonMethod", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RenderingTestComparisonMethod" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ComparisonPsnrThreshold": { - "Name": "ComparisonPsnrThreshold", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Description": { - "Name": "Description", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FieldOfView": { - "Name": "FieldOfView", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Orientation": { - "Name": "Orientation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PerfTest": { - "Name": "PerfTest", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Position": { - "Name": "Position", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "QualityAuto": { - "Name": "QualityAuto", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "QualityLevel": { - "Name": "QualityLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RenderingTestFrameCount": { - "Name": "RenderingTestFrameCount", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShouldSkip": { - "Name": "ShouldSkip", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Ticket": { - "Name": "Ticket", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Timeout": { - "Name": "Timeout", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "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 - }, - "ComparisonDiffThreshold": { - "Int32": 10 - }, - "ComparisonMethod": { - "Enum": 0 - }, - "ComparisonPsnrThreshold": { - "Float32": 50.0 - }, - "Description": { - "String": "" - }, - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Ticket": { - "String": "" - }, - "Timeout": { - "Int32": 30 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReplicatedFirst": { - "Name": "ReplicatedFirst", - "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" - } - } - }, - "ReplicatedStorage": { - "Name": "ReplicatedStorage", - "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" - } - } - }, - "RequestOrchestratorService": { - "Name": "RequestOrchestratorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ReverbSoundEffect": { - "Name": "ReverbSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "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" - } - } - }, - "WetLevel": { - "Name": "WetLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DecayTime": { - "Float32": 1.5 - }, - "Density": { - "Float32": 1.0 - }, - "Diffusion": { - "Float32": 1.0 - }, - "DryLevel": { - "Float32": -6.0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": [], - "Superclass": "Constraint", - "Properties": { - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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 - } - } - }, - "RobloxPluginGuiService": { - "Name": "RobloxPluginGuiService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RobloxReplicatedStorage": { - "Name": "RobloxReplicatedStorage", - "Tags": [ - "NotBrowsable", - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "RocketPropulsion": { - "Name": "RocketPropulsion", - "Tags": [ - "Deprecated" - ], - "Superclass": "BodyMover", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CartoonFactor": { - "Name": "CartoonFactor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxSpeed": { - "Name": "MaxSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxThrust": { - "Name": "MaxThrust", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Target": { - "Name": "Target", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetOffset": { - "Name": "TargetOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetRadius": { - "Name": "TargetRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThrustD": { - "Name": "ThrustD", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThrustP": { - "Name": "ThrustP", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TurnD": { - "Name": "TurnD", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TurnP": { - "Name": "TurnP", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CartoonFactor": { - "Float32": 0.7 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxSpeed": { - "Float32": 30.0 - }, - "MaxThrust": { - "Float32": 4000.0 - }, - "MaxTorque": { - "Vector3": [ - 400000.0, - 400000.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TargetOffset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "TargetRadius": { - "Float32": 4.0 - }, - "ThrustD": { - "Float32": 0.001 - }, - "ThrustP": { - "Float32": 5.0 - }, - "TurnD": { - "Float32": 500.0 - }, - "TurnP": { - "Float32": 3000.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RodConstraint": { - "Name": "RodConstraint", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "CurrentDistance": { - "Name": "CurrentDistance", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Length": { - "Name": "Length", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitAngle0": { - "Name": "LimitAngle0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitAngle1": { - "Name": "LimitAngle1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitsEnabled": { - "Name": "LimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thickness": { - "Name": "Thickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 26 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Length": { - "Float32": 5.0 - }, - "LimitAngle0": { - "Float32": 90.0 - }, - "LimitAngle1": { - "Float32": 90.0 - }, - "LimitsEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "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": [], - "Superclass": "Constraint", - "Properties": { - "CurrentDistance": { - "Name": "CurrentDistance", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Length": { - "Name": "Length", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Restitution": { - "Name": "Restitution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thickness": { - "Name": "Thickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WinchEnabled": { - "Name": "WinchEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WinchForce": { - "Name": "WinchForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WinchResponsiveness": { - "Name": "WinchResponsiveness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WinchSpeed": { - "Name": "WinchSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WinchTarget": { - "Name": "WinchTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 25 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Length": { - "Float32": 5.0 - }, - "Restitution": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Thickness": { - "Float32": 0.1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - }, - "WinchEnabled": { - "Bool": false - }, - "WinchForce": { - "Float32": 10000.0 - }, - "WinchResponsiveness": { - "Float32": 45.0 - }, - "WinchSpeed": { - "Float32": 2.0 - }, - "WinchTarget": { - "Float32": 5.0 - } - } - }, - "Rotate": { - "Name": "Rotate", - "Tags": [ - "Deprecated" - ], - "Superclass": "JointInstance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RotateP": { - "Name": "RotateP", - "Tags": [ - "Deprecated" - ], - "Superclass": "DynamicRotate", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BaseAngle": { - "Float32": 0.0 - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RotateV": { - "Name": "RotateV", - "Tags": [ - "Deprecated" - ], - "Superclass": "DynamicRotate", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BaseAngle": { - "Float32": 0.0 - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RotationCurve": { - "Name": "RotationCurve", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Length": { - "Name": "Length", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "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": "AQAAAAAAAAABAAAAAAAAAA==" - } - } - }, - "RtMessagingService": { - "Name": "RtMessagingService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RunService": { - "Name": "RunService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ClientGitHash": { - "Name": "ClientGitHash", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "RunningAverageItemDouble": { - "Name": "RunningAverageItemDouble", - "Tags": [ - "NotCreatable" - ], - "Superclass": "StatsItem", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RunningAverageItemInt": { - "Name": "RunningAverageItemInt", - "Tags": [ - "NotCreatable" - ], - "Superclass": "StatsItem", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "RunningAverageTimeIntervalItem": { - "Name": "RunningAverageTimeIntervalItem", - "Tags": [ - "NotCreatable" - ], - "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" - } - } - }, - "RuntimeScriptService": { - "Name": "RuntimeScriptService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IgnoreGuiInset": { - "Name": "IgnoreGuiInset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ScreenInsets", - "Migration": "IgnoreGuiInsetToScreenInsets" - } - } - } - } - }, - "IgnoresTitleBarReservation": { - "Name": "IgnoresTitleBarReservation", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OnTopOfCoreBlur": { - "Name": "OnTopOfCoreBlur", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "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": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipToDeviceSafeArea": { - "Bool": true - }, - "DisplayOrder": { - "Int32": 0 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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" - }, - "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": [], - "Superclass": "BaseScript", - "Properties": { - "Source": { - "Name": "Source", - "Scriptability": "Custom", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Disabled": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LinkedSource": { - "ContentId": "" - }, - "RunContext": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "ScriptGuid": { - "String": "" - }, - "Source": { - "String": "" - }, - "SourceAssetId": { - "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" - } - } - }, - "ScriptChangeService": { - "Name": "ScriptChangeService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "ScriptContext": { - "Name": "ScriptContext", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ScriptsDisabled": { - "Name": "ScriptsDisabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ScriptDebugger": { - "Name": "ScriptDebugger", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "CoreScriptIdentifier": { - "Name": "CoreScriptIdentifier", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentLine": { - "Name": "CurrentLine", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsDebugging": { - "Name": "IsDebugging", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPaused": { - "Name": "IsPaused", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Script": { - "Name": "Script", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "ScriptRegistrationService": { - "Name": "ScriptRegistrationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "ScriptService": { - "Name": "ScriptService", - "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" - } - } - }, - "ScrollingFrame": { - "Name": "ScrollingFrame", - "Tags": [], - "Superclass": "GuiObject", - "Properties": { - "AbsoluteCanvasSize": { - "Name": "AbsoluteCanvasSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteWindowSize": { - "Name": "AbsoluteWindowSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AutomaticCanvasSize": { - "Name": "AutomaticCanvasSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AutomaticSize" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanvasPosition": { - "Name": "CanvasPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanvasSize": { - "Name": "CanvasSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DraggingScrollBar": { - "Name": "DraggingScrollBar", - "Scriptability": "None", - "DataType": { - "Enum": "DraggingScrollBar" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ElasticBehavior": { - "Name": "ElasticBehavior", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ElasticBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HorizontalBarRect": { - "Name": "HorizontalBarRect", - "Scriptability": "None", - "DataType": { - "Value": "Rect" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HorizontalScrollBarInset": { - "Name": "HorizontalScrollBarInset", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ScrollBarInset" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxCanvasPosition": { - "Name": "MaxCanvasPosition", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScrollBarImageColor3": { - "Name": "ScrollBarImageColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScrollBarImageTransparency": { - "Name": "ScrollBarImageTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScrollBarThickness": { - "Name": "ScrollBarThickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScrollRate": { - "Name": "ScrollRate", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ScrollVelocity": { - "Name": "ScrollVelocity", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ScrollingDirection": { - "Name": "ScrollingDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ScrollingDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScrollingEnabled": { - "Name": "ScrollingEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VerticalBarRect": { - "Name": "VerticalBarRect", - "Scriptability": "None", - "DataType": { - "Value": "Rect" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VerticalScrollBarInset": { - "Name": "VerticalScrollBarInset", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ScrollBarInset" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VerticalScrollBarPosition": { - "Name": "VerticalScrollBarPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VerticalScrollBarPosition" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": false - }, - "AnchorPoint": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "AutomaticCanvasSize": { - "Enum": 0 - }, - "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 - }, - "BottomImageContent": { - "Content": { - "Uri": "rbxasset://textures/ui/Scroll/scroll-bottom.png" - } - }, - "CanvasPosition": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "CanvasSize": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 2.0, - 0 - ] - ] - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendants": { - "Bool": true - }, - "Draggable": { - "Bool": false - }, - "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" - } - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "Rotation": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "ScrollBarImageColor3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "ScrollBarImageTransparency": { - "Float32": 0.0 - }, - "ScrollBarThickness": { - "Int32": 12 - }, - "ScrollingDirection": { - "Enum": 4 - }, - "ScrollingEnabled": { - "Bool": true - }, - "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": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopImageContent": { - "Content": { - "Uri": "rbxasset://textures/ui/Scroll/scroll-top.png" - } - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VerticalScrollBarInset": { - "Enum": 0 - }, - "VerticalScrollBarPosition": { - "Enum": 0 - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "Seat": { - "Name": "Seat", - "Tags": [], - "Superclass": "Part", - "Properties": { - "Disabled": { - "Name": "Disabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Occupant": { - "Name": "Occupant", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "Disabled": { - "Bool": false - }, - "EnableFluidForces": { - "Bool": true - }, - "FormFactor": { - "Enum": 1 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "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 - }, - "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 - }, - "Shape": { - "Enum": 1 - }, - "Size": { - "Vector3": [ - 4.0, - 1.2, - 2.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 3 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "Selection": { - "Name": "Selection", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ActiveInstance": { - "Name": "ActiveInstance", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SelectionBox": { - "Name": "SelectionBox", - "Tags": [], - "Superclass": "InstanceAdornment", - "Properties": { - "LineThickness": { - "Name": "LineThickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudioSelectionBox": { - "Name": "StudioSelectionBox", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SurfaceColor": { - "Name": "SurfaceColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SurfaceColor3": { - "Name": "SurfaceColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SurfaceTransparency": { - "Name": "SurfaceTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LineThickness": { - "Float32": 0.15 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "StudioSelectionBox": { - "Bool": false - }, - "SurfaceColor3": { - "Color3": [ - 0.050980397, - 0.41176474, - 0.6745098 - ] - }, - "SurfaceTransparency": { - "Float32": 1.0 - }, - "Tags": { - "Tags": [] - }, - "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": [ - "NotCreatable" - ], - "Superclass": "GuiBase3d", - "Properties": { - "Humanoid": { - "Name": "Humanoid", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SelectionPartLasso": { - "Name": "SelectionPartLasso", - "Tags": [ - "Deprecated" - ], - "Superclass": "SelectionLasso", - "Properties": { - "Part": { - "Name": "Part", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - } - } - }, - "SelectionPointLasso": { - "Name": "SelectionPointLasso", - "Tags": [ - "Deprecated" - ], - "Superclass": "SelectionLasso", - "Properties": { - "Point": { - "Name": "Point", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Point": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - } - } - }, - "SelectionSphere": { - "Name": "SelectionSphere", - "Tags": [], - "Superclass": "PVAdornment", - "Properties": { - "SurfaceColor": { - "Name": "SurfaceColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SurfaceColor3": { - "Name": "SurfaceColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SurfaceTransparency": { - "Name": "SurfaceTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "SurfaceColor3": { - "Color3": [ - 0.050980397, - 0.41176474, - 0.6745098 - ] - }, - "SurfaceTransparency": { - "Float32": 1.0 - }, - "Tags": { - "Tags": [] - }, - "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": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "NetworkReplicator", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ServerScriptService": { - "Name": "ServerScriptService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "LoadStringEnabled": { - "Name": "LoadStringEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LoadStringEnabled": { - "Bool": false - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ServerStorage": { - "Name": "ServerStorage", - "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" - } - } - }, - "ServiceProvider": { - "Name": "ServiceProvider", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "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" - } - } - }, - "SessionService": { - "Name": "SessionService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "Shirt": { - "Name": "Shirt", - "Tags": [], - "Superclass": "Clothing", - "Properties": { - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "ShirtTemplateContent": { - "Content": "None" - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "ShirtGraphic": { - "Name": "ShirtGraphic", - "Tags": [], - "Superclass": "CharacterAppearance", - "Properties": { - "Color3": { - "Name": "Color3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SkateboardController": { - "Name": "SkateboardController", - "Tags": [], - "Superclass": "Controller", - "Properties": { - "Steer": { - "Name": "Steer", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Throttle": { - "Name": "Throttle", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "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" - } - } - }, - "SkateboardPlatform": { - "Name": "SkateboardPlatform", - "Tags": [ - "Deprecated" - ], - "Superclass": "Part", - "Properties": { - "Controller": { - "Name": "Controller", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ControllingHumanoid": { - "Name": "ControllingHumanoid", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MoveState": { - "Name": "MoveState", - "Scriptability": "None", - "DataType": { - "Enum": "MoveState" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Steer": { - "Name": "Steer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StickyWheels": { - "Name": "StickyWheels", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Throttle": { - "Name": "Throttle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "EnableFluidForces": { - "Bool": true - }, - "FormFactor": { - "Enum": 1 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "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 - }, - "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 - }, - "Shape": { - "Enum": 1 - }, - "Size": { - "Vector3": [ - 4.0, - 1.2, - 2.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Steer": { - "Int32": 0 - }, - "StickyWheels": { - "Bool": true - }, - "Tags": { - "Tags": [] - }, - "Throttle": { - "Int32": 0 - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 3 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "Skin": { - "Name": "Skin", - "Tags": [ - "Deprecated" - ], - "Superclass": "CharacterAppearance", - "Properties": { - "SkinColor": { - "Name": "SkinColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SkinColor": { - "BrickColor": 226 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Sky": { - "Name": "Sky", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "CelestialBodiesShown": { - "Name": "CelestialBodiesShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MoonAngularSize": { - "Name": "MoonAngularSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SkyboxFrontContent": { - "Name": "SkyboxFrontContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SkyboxRt": { - "Name": "SkyboxRt", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "SkyboxRightContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StarCount": { - "Name": "StarCount", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SunAngularSize": { - "Name": "SunAngularSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SunTextureContent": { - "Name": "SunTextureContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - }, - "CelestialBodiesShown": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MoonAngularSize": { - "Float32": 11.0 - }, - "MoonTextureContent": { - "Content": { - "Uri": "rbxasset://sky/moon.jpg" - } - }, - "Sandboxed": { - "Bool": false - }, - "SkyboxBackContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_bk.tex" - } - }, - "SkyboxDownContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_dn.tex" - } - }, - "SkyboxFrontContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_ft.tex" - } - }, - "SkyboxLeftContent": { - "Content": { - "Uri": "rbxasset://textures/sky/sky512_lf.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" - } - }, - "SourceAssetId": { - "Int64": -1 - }, - "StarCount": { - "Int32": 3000 - }, - "SunAngularSize": { - "Float32": 21.0 - }, - "SunTextureContent": { - "Content": { - "Uri": "rbxasset://sky/sun.jpg" - } - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SlidingBallConstraint": { - "Name": "SlidingBallConstraint", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Constraint", - "Properties": { - "ActuatorType": { - "Name": "ActuatorType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentPosition": { - "Name": "CurrentPosition", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LimitsEnabled": { - "Name": "LimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LinearResponsiveness": { - "Name": "LinearResponsiveness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LowerLimit": { - "Name": "LowerLimit", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MotorMaxAcceleration": { - "Name": "MotorMaxAcceleration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MotorMaxForce": { - "Name": "MotorMaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Restitution": { - "Name": "Restitution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ServoMaxForce": { - "Name": "ServoMaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SoftlockServoUponReachingTarget": { - "Name": "SoftlockServoUponReachingTarget", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Speed": { - "Name": "Speed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TargetPosition": { - "Name": "TargetPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UpperLimit": { - "Name": "UpperLimit", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Velocity": { - "Name": "Velocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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" - } - } - }, - "Smoke": { - "Name": "Smoke", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "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" - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Opacity": { - "Name": "Opacity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "opacity_xml" - } - } - } - }, - "RiseVelocity": { - "Name": "RiseVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "riseVelocity_xml" - } - } - } - }, - "Size": { - "Name": "Size", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "size_xml" - } - } - } - }, - "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" - ], - "Kind": { - "Alias": { - "AliasFor": "Opacity" - } - } - }, - "riseVelocity_xml": { - "Name": "riseVelocity_xml", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "RiseVelocity" - } - } - }, - "size_xml": { - "Name": "size_xml", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Size" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Opacity": { - "Float32": 0.5 - }, - "RiseVelocity": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "Size": { - "Float32": 1.0 - }, - "SourceAssetId": { - "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" - } - } - }, - "Snap": { - "Name": "Snap", - "Tags": [ - "Deprecated" - ], - "Superclass": "JointInstance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SocialService": { - "Name": "SocialService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SolidModelContentProvider": { - "Name": "SolidModelContentProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "CacheableContentProvider", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EmitterSize": { - "Name": "EmitterSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Alias": { - "AliasFor": "RollOffMinDistance" - } - } - }, - "IsLoaded": { - "Name": "IsLoaded", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPaused": { - "Name": "IsPaused", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPlaying": { - "Name": "IsPlaying", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDistance": { - "Name": "MaxDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "xmlRead_MaxDistance_3" - } - } - } - }, - "MinDistance": { - "Name": "MinDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Pitch": { - "Name": "Pitch", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PlayOnRemove": { - "Name": "PlayOnRemove", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaybackLoudness": { - "Name": "PlaybackLoudness", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Playing": { - "Name": "Playing", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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": [], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "xmlRead_MaxDistance_3" - } - } - } - }, - "RollOffMinDistance": { - "Name": "RollOffMinDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "EmitterSize" - } - } - } - }, - "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" - } - } - }, - "SoundId": { - "Name": "SoundId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "AudioContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "TimeLength": { - "Name": "TimeLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimePosition": { - "Name": "TimePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "isPlaying": { - "Name": "isPlaying", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "xmlRead_MaxDistance_3": { - "Name": "xmlRead_MaxDistance_3", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "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" - } - } - } - }, - "DefaultProperties": { - "AcousticSimulationEnabled": { - "Bool": true - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AudioContent": { - "Content": "None" - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LoopRegion": { - "NumberRange": [ - 0.0, - 60000.0 - ] - }, - "Looped": { - "Bool": false - }, - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TimePosition": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Volume": { - "Float32": 0.5 - } - } - }, - "SoundEffect": { - "Name": "SoundEffect", - "Tags": [ - "NotCreatable" - ], - "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" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SoundGroup": { - "Name": "SoundGroup", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "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" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Volume": { - "Float32": 0.5 - } - } - }, - "SoundService": { - "Name": "SoundService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AcousticSimulationEnabled": { - "Name": "AcousticSimulationEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AmbientReverb": { - "Name": "AmbientReverb", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ReverbType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DopplerScale": { - "Name": "DopplerScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReverbEnabled": { - "Name": "ReverbEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RolloffScale": { - "Name": "RolloffScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - }, - "DistanceFactor": { - "Float32": 3.33 - }, - "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" - } - } - }, - "Sparkles": { - "Name": "Sparkles", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SparkleColor": { - "Name": "SparkleColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TimeScale": { - "Name": "TimeScale", - "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" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "SparkleColor": { - "Color3": [ - 0.5647059, - 0.098039225, - 1.0 - ] - }, - "Tags": { - "Tags": [] - }, - "TimeScale": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SpawnLocation": { - "Name": "SpawnLocation", - "Tags": [], - "Superclass": "Part", - "Properties": { - "AllowTeamChangeOnTouch": { - "Name": "AllowTeamChangeOnTouch", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Duration": { - "Name": "Duration", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Neutral": { - "Name": "Neutral", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TeamColor": { - "Name": "TeamColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AllowTeamChangeOnTouch": { - "Bool": false - }, - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "Duration": { - "Int32": 10 - }, - "EnableFluidForces": { - "Bool": true - }, - "Enabled": { - "Bool": true - }, - "FormFactor": { - "Enum": 1 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "Neutral": { - "Bool": true - }, - "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 - }, - "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 - }, - "Shape": { - "Enum": 1 - }, - "Size": { - "Vector3": [ - 4.0, - 1.2, - 2.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TeamColor": { - "BrickColor": 194 - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 3 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "SpawnerService": { - "Name": "SpawnerService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SpecialMesh": { - "Name": "SpecialMesh", - "Tags": [], - "Superclass": "FileMesh", - "Properties": { - "MeshType": { - "Name": "MeshType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "MeshType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MeshContent": { - "Content": "None" - }, - "MeshType": { - "Enum": 0 - }, - "Offset": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VertexColor": { - "Vector3": [ - 1.0, - 1.0, - 1.0 - ] - } - } - }, - "SphereHandleAdornment": { - "Name": "SphereHandleAdornment", - "Tags": [], - "Superclass": "HandleAdornment", - "Properties": { - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shading": { - "Name": "Shading", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AdornShading" - }, - "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" - }, - "Radius": { - "Float32": 1.0 - }, - "Sandboxed": { - "Bool": false - }, - "Shading": { - "Enum": 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 - } - } - }, - "SpotLight": { - "Name": "SpotLight", - "Tags": [], - "Superclass": "Light", - "Properties": { - "Angle": { - "Name": "Angle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Face": { - "Name": "Face", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Range": { - "Name": "Range", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Angle": { - "Float32": 90.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Brightness": { - "Float32": 1.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Enabled": { - "Bool": true - }, - "Face": { - "Enum": 5 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Range": { - "Float32": 16.0 - }, - "Sandboxed": { - "Bool": false - }, - "Shadows": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SpringConstraint": { - "Name": "SpringConstraint", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "Coils": { - "Name": "Coils", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentLength": { - "Name": "CurrentLength", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Damping": { - "Name": "Damping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FreeLength": { - "Name": "FreeLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitsEnabled": { - "Name": "LimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxForce": { - "Name": "MaxForce", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxLength": { - "Name": "MaxLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinLength": { - "Name": "MinLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Stiffness": { - "Name": "Stiffness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thickness": { - "Name": "Thickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Coils": { - "Float32": 3.0 - }, - "Color": { - "BrickColor": 200 - }, - "Damping": { - "Float32": 0.0 - }, - "Enabled": { - "Bool": true - }, - "FreeLength": { - "Float32": 1.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LimitsEnabled": { - "Bool": false - }, - "MaxForce": { - "Float32": null - }, - "MaxLength": { - "Float32": 5.0 - }, - "MinLength": { - "Float32": 0.0 - }, - "Radius": { - "Float32": 0.4 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Stiffness": { - "Float32": 0.0 - }, - "Tags": { - "Tags": [] - }, - "Thickness": { - "Float32": 0.1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "StackFrame": { - "Name": "StackFrame", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "FrameId": { - "Name": "FrameId", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FrameName": { - "Name": "FrameName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FrameType": { - "Name": "FrameType", - "Scriptability": "None", - "DataType": { - "Enum": "DebuggerFrameType" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Globals": { - "Name": "Globals", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Line": { - "Name": "Line", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Locals": { - "Name": "Locals", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Populated": { - "Name": "Populated", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Script": { - "Name": "Script", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Upvalues": { - "Name": "Upvalues", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StandalonePluginScripts": { - "Name": "StandalonePluginScripts", - "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" - } - } - }, - "StandardPages": { - "Name": "StandardPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "StarterCharacterScripts": { - "Name": "StarterCharacterScripts", - "Tags": [ - "NotCreatable" - ], - "Superclass": "StarterPlayerScripts", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StarterGear": { - "Name": "StarterGear", - "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" - } - } - }, - "StarterGui": { - "Name": "StarterGui", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "BasePlayerGui", - "Properties": { - "ClipsDescendantsSupportsRotation": { - "Name": "ClipsDescendantsSupportsRotation", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ProcessUserInput": { - "Name": "ProcessUserInput", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ResetPlayerGuiOnSpawn": { - "Name": "ResetPlayerGuiOnSpawn", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RtlTextSupport": { - "Name": "RtlTextSupport", - "Scriptability": "None", - "DataType": { - "Enum": "RtlTextSupport" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScreenOrientation": { - "Name": "ScreenOrientation", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ScreenOrientation" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowDevelopmentGui": { - "Name": "ShowDevelopmentGui", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "VirtualCursorMode" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendantsSupportsRotation": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ResetPlayerGuiOnSpawn": { - "Bool": true - }, - "RtlTextSupport": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "ScreenOrientation": { - "Enum": 2 - }, - "ShowDevelopmentGui": { - "Bool": true - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VirtualCursorMode": { - "Enum": 0 - } - } - }, - "StarterPack": { - "Name": "StarterPack", - "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" - } - } - }, - "StarterPlayer": { - "Name": "StarterPlayer", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AllowCustomAnimations": { - "Name": "AllowCustomAnimations", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutoJumpEnabled": { - "Name": "AutoJumpEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraMinZoomDistance": { - "Name": "CameraMinZoomDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraMode": { - "Name": "CameraMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CameraMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterBreakJointsOnDeath": { - "Name": "CharacterBreakJointsOnDeath", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterJumpHeight": { - "Name": "CharacterJumpHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterJumpPower": { - "Name": "CharacterJumpPower", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterMaxSlopeAngle": { - "Name": "CharacterMaxSlopeAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterUseJumpPower": { - "Name": "CharacterUseJumpPower", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CharacterWalkSpeed": { - "Name": "CharacterWalkSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "DevCameraOcclusionMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevComputerCameraMovementMode": { - "Name": "DevComputerCameraMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevComputerCameraMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevComputerMovementMode": { - "Name": "DevComputerMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevComputerMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevTouchCameraMovementMode": { - "Name": "DevTouchCameraMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevTouchCameraMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DevTouchMovementMode": { - "Name": "DevTouchMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DevTouchMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableDynamicHeads": { - "Name": "EnableDynamicHeads", - "Scriptability": "None", - "DataType": { - "Enum": "LoadDynamicHeads" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EnableMouseLockOption": { - "Name": "EnableMouseLockOption", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GameSettingsAvatar": { - "Name": "GameSettingsAvatar", - "Scriptability": "None", - "DataType": { - "Enum": "GameAvatarType" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GameSettingsR15Collision": { - "Name": "GameSettingsR15Collision", - "Scriptability": "None", - "DataType": { - "Enum": "R15CollisionType" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HealthDisplayDistance": { - "Name": "HealthDisplayDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LoadCharacterAppearance": { - "Name": "LoadCharacterAppearance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LoadCharacterLayeredClothing": { - "Name": "LoadCharacterLayeredClothing", - "Scriptability": "None", - "DataType": { - "Enum": "LoadCharacterLayeredClothing" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LoadCharacterLayeredClothing ": { - "Name": "LoadCharacterLayeredClothing ", - "Scriptability": "None", - "DataType": { - "Enum": "LoadCharacterLayeredClothing" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LuaCharacterController": { - "Name": "LuaCharacterController", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "CharacterControlMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NameDisplayDistance": { - "Name": "NameDisplayDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AllowCustomAnimations": { - "Bool": true - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoJumpEnabled": { - "Bool": true - }, - "AvatarJointUpgrade": { - "Enum": 0 - }, - "CameraMaxZoomDistance": { - "Float32": 400.0 - }, - "CameraMinZoomDistance": { - "Float32": 0.5 - }, - "CameraMode": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CharacterBreakJointsOnDeath": { - "Bool": true - }, - "CharacterJumpHeight": { - "Float32": 7.2 - }, - "CharacterJumpPower": { - "Float32": 50.0 - }, - "CharacterMaxSlopeAngle": { - "Float32": 89.0 - }, - "CharacterUseJumpPower": { - "Bool": true - }, - "CharacterWalkSpeed": { - "Float32": 16.0 - }, - "ClassicDeath": { - "Bool": true - }, - "CreateDefaultPlayerModule": { - "Bool": true - }, - "DevCameraOcclusionMode": { - "Enum": 0 - }, - "DevComputerCameraMovementMode": { - "Enum": 0 - }, - "DevComputerMovementMode": { - "Enum": 0 - }, - "DevTouchCameraMovementMode": { - "Enum": 0 - }, - "DevTouchMovementMode": { - "Enum": 0 - }, - "EnableDynamicHeads": { - "Enum": 0 - }, - "EnableMouseLockOption": { - "Bool": true - }, - "GameSettingsAvatar": { - "Enum": 1 - }, - "GameSettingsR15Collision": { - "Enum": 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" - }, - "UserEmotesEnabled": { - "Bool": true - } - } - }, - "StarterPlayerScripts": { - "Name": "StarterPlayerScripts", - "Tags": [ - "NotCreatable" - ], - "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" - } - } - }, - "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" - } - } - }, - "Stats": { - "Name": "Stats", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ContactsCount": { - "Name": "ContactsCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DataReceiveKbps": { - "Name": "DataReceiveKbps", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DataSendKbps": { - "Name": "DataSendKbps", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InstanceCount": { - "Name": "InstanceCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MemoryTrackingEnabled": { - "Name": "MemoryTrackingEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MovingPrimitivesCount": { - "Name": "MovingPrimitivesCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicsReceiveKbps": { - "Name": "PhysicsReceiveKbps", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicsSendKbps": { - "Name": "PhysicsSendKbps", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicsStepTime": { - "Name": "PhysicsStepTime", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PhysicsStepTimeMs": { - "Name": "PhysicsStepTimeMs", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PrimitivesCount": { - "Name": "PrimitivesCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "StatsItem": { - "Name": "StatsItem", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "DisplayName": { - "Name": "DisplayName", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Status": { - "Name": "Status", - "Tags": [ - "Deprecated", - "NotCreatable" - ], - "Superclass": "Model", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "StopWatchReporter": { - "Name": "StopWatchReporter", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StringValue": { - "Name": "StringValue", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "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 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Value": { - "String": "" - } - } - }, - "Studio": { - "Name": "Studio", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "\"TODO\" Color": { - "Name": "\"TODO\" Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "\"function\" Color": { - "Name": "\"function\" Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "\"local\" Color": { - "Name": "\"local\" Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "\"nil\" Color": { - "Name": "\"nil\" Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "\"self\" Color": { - "Name": "\"self\" Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Active Hover Over Color": { - "Name": "Active Hover Over Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Always Save Script Changes": { - "Name": "Always Save Script Changes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Animate Hover Over": { - "Name": "Animate Hover Over", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Auto Closing Brackets": { - "Name": "Auto Closing Brackets", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Auto Closing Quotes": { - "Name": "Auto Closing Quotes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "AutoIndentRule" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Auto-Recovery Enabled": { - "Name": "Auto-Recovery Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Auto-Recovery Interval (Minutes)": { - "Name": "Auto-Recovery Interval (Minutes)", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Basic Objects Display Mode": { - "Name": "Basic Objects Display Mode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ListDisplayMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Bool Color": { - "Name": "Bool Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Bracket Color": { - "Name": "Bracket Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Built-in Function Color": { - "Name": "Built-in Function Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Camera Mouse Wheel Speed": { - "Name": "Camera Mouse Wheel Speed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Camera Speed": { - "Name": "Camera Speed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Comment Color": { - "Name": "Comment Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Current Line Highlight Color": { - "Name": "Current Line Highlight Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Debugger Current Line Color": { - "Name": "Debugger Current Line Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Debugger Error Line Color": { - "Name": "Debugger Error Line Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DefaultScriptSyncFileType": { - "Name": "DefaultScriptSyncFileType", - "Scriptability": "None", - "DataType": { - "Enum": "DefaultScriptSyncFileType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DeprecatedObjectsShown": { - "Name": "DeprecatedObjectsShown", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DisplayLanguage": { - "Name": "DisplayLanguage", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Doc View Code Background Color": { - "Name": "Doc View Code Background Color", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Autocomplete Doc View": { - "Name": "Enable Autocomplete Doc View", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Http Sandboxing": { - "Name": "Enable Http Sandboxing", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Internal Beta Features": { - "Name": "Enable Internal Beta Features", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Internal Features": { - "Name": "Enable Internal Features", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Script Analysis": { - "Name": "Enable Script Analysis", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Scrollbar Markers": { - "Name": "Enable Scrollbar Markers", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Signature Help": { - "Name": "Enable Signature Help", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Signature Help Doc View": { - "Name": "Enable Signature Help Doc View", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Temporary Tabs": { - "Name": "Enable Temporary Tabs", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Temporary Tabs In Explorer": { - "Name": "Enable Temporary Tabs In Explorer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enable Type Hover": { - "Name": "Enable Type Hover", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ExternalEditorMode": { - "Name": "ExternalEditorMode", - "Scriptability": "None", - "DataType": { - "Enum": "ExternalEditorMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Find Selection Background Color": { - "Name": "Find Selection Background Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Format On Paste": { - "Name": "Format On Paste", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Format On Type": { - "Name": "Format On Type", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Function Name Color": { - "Name": "Function Name Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Highlight Current Line": { - "Name": "Highlight Current Line", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Highlight Occurances": { - "Name": "Highlight Occurances", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HintColor": { - "Name": "HintColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Hover Animate Speed": { - "Name": "Hover Animate Speed", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HoverAnimateSpeed" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Hover Box Thickness": { - "Name": "Hover Box Thickness", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Indent Using Spaces": { - "Name": "Indent Using Spaces", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LuaDebuggerEnabledAtStartup": { - "Name": "LuaDebuggerEnabledAtStartup", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Luau Keyword Color": { - "Name": "Luau Keyword Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxFindReplaceAllResults": { - "Name": "MaxFindReplaceAllResults", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Maximum Output Lines": { - "Name": "Maximum Output Lines", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Menu Item Background Color": { - "Name": "Menu Item Background Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Method Color": { - "Name": "Method Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Number Color": { - "Name": "Number Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Only Play Audio from Window in Focus": { - "Name": "Only Play Audio from Window in Focus", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Operator Color": { - "Name": "Operator Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Output Layout Mode": { - "Name": "Output Layout Mode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "OutputLayoutMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PermissionLevelShown": { - "Name": "PermissionLevelShown", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PermissionLevelShown" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Physical Draggers Select Scope By Default": { - "Name": "Physical Draggers Select Scope By Default", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Pivot Snap To Geometry Color": { - "Name": "Pivot Snap To Geometry Color", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PluginDebuggingEnabled": { - "Name": "PluginDebuggingEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PreferredTextSize": { - "Name": "PreferredTextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "PreferredTextSize" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Primary Text Color": { - "Name": "Primary Text Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Property Color": { - "Name": "Property Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReloadBuiltinPluginsOnChange": { - "Name": "ReloadBuiltinPluginsOnChange", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReloadLocalPluginsOnChange": { - "Name": "ReloadLocalPluginsOnChange", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Respect Studio shortcuts when game has focus": { - "Name": "Respect Studio shortcuts when game has focus", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Rulers": { - "Name": "Rulers", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RuntimeUndoBehavior": { - "Name": "RuntimeUndoBehavior", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "RuntimeUndoBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Script Editor Color Preset": { - "Name": "Script Editor Color Preset", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "StudioScriptEditorColorPresets" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Script Editor Scrollbar Background Color": { - "Name": "Script Editor Scrollbar Background Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Script Editor Scrollbar Handle Color": { - "Name": "Script Editor Scrollbar Handle Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ScriptEditorMenuBorderColor": { - "Name": "ScriptEditorMenuBorderColor", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ScriptEditorShouldShowPluginMethods": { - "Name": "ScriptEditorShouldShowPluginMethods", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScriptTimeoutLength": { - "Name": "ScriptTimeoutLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Scroll Past Last Line": { - "Name": "Scroll Past Last Line", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Secondary Text Color": { - "Name": "Secondary Text Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Select Color": { - "Name": "Select Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Select/Hover Color": { - "Name": "Select/Hover Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Selected Menu Item Background Color": { - "Name": "Selected Menu Item Background Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Selected Text Color": { - "Name": "Selected Text Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Selection Background Color": { - "Name": "Selection Background Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Selection Box Thickness": { - "Name": "Selection Box Thickness", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Selection Color": { - "Name": "Selection Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Selection Line Thickness": { - "Name": "Selection Line Thickness", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Set Pivot of Imported Parts": { - "Name": "Set Pivot of Imported Parts", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Diagnostics Bar": { - "Name": "Show Diagnostics Bar", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show FileSyncService": { - "Name": "Show FileSyncService", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Hidden Objects in Explorer": { - "Name": "Show Hidden Objects in Explorer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Hover Over": { - "Name": "Show Hover Over", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Light Guides": { - "Name": "Show Light Guides", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Navigation Labels": { - "Name": "Show Navigation Labels", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Navigation Mesh": { - "Name": "Show Navigation Mesh", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Singly Selected Attachment Parent Frame": { - "Name": "Show Singly Selected Attachment Parent Frame", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show Whitespace": { - "Name": "Show Whitespace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Show plus button on hover in Explorer": { - "Name": "Show plus button on hover in Explorer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowCorePackagesInExplorer": { - "Name": "ShowCorePackagesInExplorer", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Skip Closing Brackets and Quotes": { - "Name": "Skip Closing Brackets and Quotes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "String Color": { - "Name": "String Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Tab Width": { - "Name": "Tab Width", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Text Color": { - "Name": "Text Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Text Wrapping": { - "Name": "Text Wrapping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Theme": { - "Name": "Theme", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TypeColor": { - "Name": "TypeColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UI Theme": { - "Name": "UI Theme", - "Scriptability": "Read", - "DataType": { - "Enum": "UITheme" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Whitespace Color": { - "Name": "Whitespace Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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": {} - }, - "StudioAssetService": { - "Name": "StudioAssetService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "StudioData": { - "Name": "StudioData", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "EnableScriptCollabByDefaultOnLoad": { - "Name": "EnableScriptCollabByDefaultOnLoad", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "EnableScriptCollabByDefaultOnLoad": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "StudioDeviceEmulatorService": { - "Name": "StudioDeviceEmulatorService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "StudioScriptDebugEventListener": { - "Name": "StudioScriptDebugEventListener", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "StudioService": { - "Name": "StudioService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ActiveScript": { - "Name": "ActiveScript", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AlignDraggedObjects": { - "Name": "AlignDraggedObjects", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DraggerSolveConstraints": { - "Name": "DraggerSolveConstraints", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DrawConstraintsOnTop": { - "Name": "DrawConstraintsOnTop", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GridSize": { - "Name": "GridSize", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HoverInstance": { - "Name": "HoverInstance", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "InstalledPluginData": { - "Name": "InstalledPluginData", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PivotSnapToGeometry": { - "Name": "PivotSnapToGeometry", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RotateIncrement": { - "Name": "RotateIncrement", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Secrets": { - "Name": "Secrets", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShowConstraintDetails": { - "Name": "ShowConstraintDetails", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShowWeldDetails": { - "Name": "ShowWeldDetails", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StudioLocaleId": { - "Name": "StudioLocaleId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UseLocalSpace": { - "Name": "UseLocalSpace", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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" - } - } - }, - "StudioTheme": { - "Name": "StudioTheme", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "SunRaysEffect": { - "Name": "SunRaysEffect", - "Tags": [], - "Superclass": "PostEffect", - "Properties": { - "Intensity": { - "Name": "Intensity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Spread": { - "Name": "Spread", - "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" - }, - "Intensity": { - "Float32": 0.25 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Spread": { - "Float32": 1.0 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SurfaceAppearance": { - "Name": "SurfaceAppearance", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AlphaMode": { - "Name": "AlphaMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AlphaMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "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": { - "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": [ - "Hidden" - ], - "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": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ResampleMode": { - "Name": "ResampleMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ResamplerMode" - }, - "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": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AlphaMode": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TexturePackContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SurfaceGui": { - "Name": "SurfaceGui", - "Tags": [], - "Superclass": "SurfaceGuiBase", - "Properties": { - "AlwaysOnTop": { - "Name": "AlwaysOnTop", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CanvasSize": { - "Name": "CanvasSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClipsDescendants": { - "Name": "ClipsDescendants", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HorizontalCurvature": { - "Name": "HorizontalCurvature", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LightInfluence": { - "Name": "LightInfluence", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxDistance": { - "Name": "MaxDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PixelsPerStud": { - "Name": "PixelsPerStud", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Shape": { - "Name": "Shape", - "Scriptability": "None", - "DataType": { - "Enum": "SurfaceGuiShape" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SizingMode": { - "Name": "SizingMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SurfaceGuiSizingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ToolPunchThroughDistance": { - "Name": "ToolPunchThroughDistance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ZOffset": { - "Name": "ZOffset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": true - }, - "AlwaysOnTop": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Brightness": { - "Float32": 1.0 - }, - "CanvasSize": { - "Vector2": [ - 800.0, - 600.0 - ] - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClipsDescendants": { - "Bool": false - }, - "Enabled": { - "Bool": true - }, - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "ToolPunchThroughDistance": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ZIndexBehavior": { - "Enum": 0 - }, - "ZOffset": { - "Float32": 0.0 - } - } - }, - "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": [], - "Superclass": "Light", - "Properties": { - "Angle": { - "Name": "Angle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Face": { - "Name": "Face", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Range": { - "Name": "Range", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Angle": { - "Float32": 90.0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Brightness": { - "Float32": 1.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 1.0, - 1.0, - 1.0 - ] - }, - "Enabled": { - "Bool": true - }, - "Face": { - "Enum": 5 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Range": { - "Float32": 16.0 - }, - "Sandboxed": { - "Bool": false - }, - "Shadows": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "SurfaceSelection": { - "Name": "SurfaceSelection", - "Tags": [], - "Superclass": "PartAdornment", - "Properties": { - "TargetSurface": { - "Name": "TargetSurface", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "NormalId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 0.050980393, - 0.4117647, - 0.6745098 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TargetSurface": { - "Enum": 0 - }, - "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", - "Properties": { - "SchedulerDutyCycle": { - "Name": "SchedulerDutyCycle", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SchedulerRate": { - "Name": "SchedulerRate", - "Scriptability": "Read", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ThreadPoolConfig": { - "Name": "ThreadPoolConfig", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ThreadPoolConfig" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThreadPoolSize": { - "Name": "ThreadPoolSize", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Team": { - "Name": "Team", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "AutoAssignable": { - "Name": "AutoAssignable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AutoColorCharacters": { - "Name": "AutoColorCharacters", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ChildOrder": { - "Name": "ChildOrder", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Score": { - "Name": "Score", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TeamColor": { - "Name": "TeamColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoAssignable": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "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" - } - } - }, - "Teams": { - "Name": "Teams", - "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" - } - } - }, - "TelemetryService": { - "Name": "TelemetryService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TeleportAsyncResult": { - "Name": "TeleportAsyncResult", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "PrivateServerId": { - "Name": "PrivateServerId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ReservedServerAccessCode": { - "Name": "ReservedServerAccessCode", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TeleportOptions": { - "Name": "TeleportOptions", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "ReservedServerAccessCode": { - "Name": "ReservedServerAccessCode", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReservedServerId": { - "Name": "ReservedServerId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ServerInstanceId": { - "Name": "ServerInstanceId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ShouldReserveServer": { - "Name": "ShouldReserveServer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - }, - "ReservedServerAccessCode": { - "String": "" - }, - "ReservedServerId": { - "String": "" - }, - "Sandboxed": { - "Bool": false - }, - "ServerInstanceId": { - "String": "" - }, - "ShouldReserveServer": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VipServerId": { - "String": "" - } - } - }, - "TeleportService": { - "Name": "TeleportService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "CustomizedTeleportUI": { - "Name": "CustomizedTeleportUI", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "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" - } - } - }, - "TemporaryCageMeshProvider": { - "Name": "TemporaryCageMeshProvider", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TemporaryScriptService": { - "Name": "TemporaryScriptService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Terrain": { - "Name": "Terrain", - "Tags": [ - "NotCreatable" - ], - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LastUsedModificationMethod": { - "Name": "LastUsedModificationMethod", - "Scriptability": "None", - "DataType": { - "Enum": "TerrainAcquisitionMethod" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaterialColors": { - "Name": "MaterialColors", - "Scriptability": "Custom", - "DataType": { - "Value": "MaterialColors" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Materials": { - "Name": "Materials", - "Scriptability": "None", - "DataType": { - "Value": "SharedString" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxExtents": { - "Name": "MaxExtents", - "Scriptability": "Read", - "DataType": { - "Value": "Region3int16" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaterReflectance": { - "Name": "WaterReflectance", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaterTransparency": { - "Name": "WaterTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaterWaveSize": { - "Name": "WaterWaveSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WaterWaveSpeed": { - "Name": "WaterWaveSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "AcquisitionMethod": { - "Enum": 0 - }, - "Anchored": { - "Bool": true - }, - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "Decoration": { - "Bool": false - }, - "EnableFluidForces": { - "Bool": true - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "GrassLength": { - "Float32": 0.7 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LeftParamA": { - "Float32": -0.5 - }, - "LeftParamB": { - "Float32": 0.5 - }, - "LeftSurface": { - "Enum": 0 - }, - "LeftSurfaceInput": { - "Enum": 0 - }, - "Locked": { - "Bool": true - }, - "Massless": { - "Bool": false - }, - "Material": { - "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=" - }, - "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 - }, - "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": [ - 2044.0, - 252.0, - 2044.0 - ] - }, - "SmoothGrid": { - "BinaryString": "AQU=" - }, - "SmoothVoxelsUpgraded": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 3 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "WaterColor": { - "Color3": [ - 0.05, - 0.33, - 0.36 - ] - }, - "WaterReflectance": { - "Float32": 1.0 - }, - "WaterTransparency": { - "Float32": 0.3 - }, - "WaterWaveSize": { - "Float32": 0.15 - }, - "WaterWaveSpeed": { - "Float32": 10.0 - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SizeInCells": { - "Name": "SizeInCells", - "Scriptability": "Read", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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=" - }, - "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" - } - } - }, - "TestService": { - "Name": "TestService", - "Tags": [ - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AutoRuns": { - "Name": "AutoRuns", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Description": { - "Name": "Description", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ErrorCount": { - "Name": "ErrorCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ExecuteWithStudioRun": { - "Name": "ExecuteWithStudioRun", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Is30FpsThrottleEnabled": { - "Name": "Is30FpsThrottleEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsPhysicsEnvironmentalThrottled": { - "Name": "IsPhysicsEnvironmentalThrottled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsSleepAllowed": { - "Name": "IsSleepAllowed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NumberOfPlayers": { - "Name": "NumberOfPlayers", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SimulateSecondsLag": { - "Name": "SimulateSecondsLag", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TestCount": { - "Name": "TestCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ThrottlePhysicsToRealtime": { - "Name": "ThrottlePhysicsToRealtime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Timeout": { - "Name": "Timeout", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WarnCount": { - "Name": "WarnCount", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoRuns": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Description": { - "String": "" - }, - "ExecuteWithStudioRun": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "IsPhysicsEnvironmentalThrottled": { - "Bool": true - }, - "IsSleepAllowed": { - "Bool": true - }, - "NumberOfPlayers": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SimulateSecondsLag": { - "Float64": 0.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "ThrottlePhysicsToRealtime": { - "Bool": true - }, - "Timeout": { - "Float64": 10.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextBox": { - "Name": "TextBox", - "Tags": [], - "Superclass": "GuiObject", - "Properties": { - "ClearTextOnFocus": { - "Name": "ClearTextOnFocus", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Confidential": { - "Name": "Confidential", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ContentText": { - "Name": "ContentText", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CursorPosition": { - "Name": "CursorPosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Font": { - "Name": "Font", - "Scriptability": "ReadWrite", - "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": { - "Serialization": "Serializes" - } - } - }, - "FontSize": { - "Name": "FontSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FontSize" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "HasFocus": { - "Name": "HasFocus", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LineHeight": { - "Name": "LineHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxVisibleGraphemes": { - "Name": "MaxVisibleGraphemes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MultiLine": { - "Name": "MultiLine", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PlaceholderColor3": { - "Name": "PlaceholderColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PlaceholderText": { - "Name": "PlaceholderText", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReturnKeyType": { - "Name": "ReturnKeyType", - "Scriptability": "None", - "DataType": { - "Enum": "ReturnKeyType" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RichText": { - "Name": "RichText", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SelectionStart": { - "Name": "SelectionStart", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextBounds": { - "Name": "TextBounds", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor": { - "Name": "TextColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextDirection": { - "Name": "TextDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextEditable": { - "Name": "TextEditable", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextFits": { - "Name": "TextFits", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextInputType": { - "Name": "TextInputType", - "Scriptability": "None", - "DataType": { - "Enum": "TextInputType" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextScaled": { - "Name": "TextScaled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "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": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextTransparency": { - "Name": "TextTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextTruncate": { - "Name": "TextTruncate", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextTruncate" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextWrap": { - "Name": "TextWrap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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": true - }, - "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 - }, - "ClearTextOnFocus": { - "Bool": true - }, - "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 - }, - "LayoutOrder": { - "Int32": 0 - }, - "LineHeight": { - "Float32": 1.0 - }, - "LocalizationMatchIdentifier": { - "String": "" - }, - "LocalizationMatchedSourceText": { - "String": "" - }, - "MaxVisibleGraphemes": { - "Int32": -1 - }, - "MultiLine": { - "Bool": false - }, - "OpenTypeFeatures": { - "String": "" - }, - "PlaceholderColor3": { - "Color3": [ - 0.5, - 0.5, - 0.5 - ] - }, - "PlaceholderText": { - "String": "" - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "RichText": { - "Bool": false - }, - "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": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Text": { - "String": "TextBox" - }, - "TextColor3": { - "Color3": [ - 0.10588236, - 0.16470589, - 0.20784315 - ] - }, - "TextDirection": { - "Enum": 0 - }, - "TextEditable": { - "Bool": true - }, - "TextScaled": { - "Bool": false - }, - "TextSize": { - "Float32": 8.0 - }, - "TextStrokeColor3": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "TextStrokeTransparency": { - "Float32": 1.0 - }, - "TextTransparency": { - "Float32": 0.0 - }, - "TextTruncate": { - "Enum": 0 - }, - "TextWrapped": { - "Bool": false - }, - "TextXAlignment": { - "Enum": 2 - }, - "TextYAlignment": { - "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Font": { - "Name": "Font", - "Scriptability": "ReadWrite", - "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": { - "Serialization": "Serializes" - } - } - }, - "FontSize": { - "Name": "FontSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FontSize" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LineHeight": { - "Name": "LineHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxVisibleGraphemes": { - "Name": "MaxVisibleGraphemes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextBounds": { - "Name": "TextBounds", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor": { - "Name": "TextColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextDirection": { - "Name": "TextDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextFits": { - "Name": "TextFits", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextScaled": { - "Name": "TextScaled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "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": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextTransparency": { - "Name": "TextTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextTruncate": { - "Name": "TextTruncate", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextTruncate" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextWrap": { - "Name": "TextWrap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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": true - }, - "AnchorPoint": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoButtonColor": { - "Bool": true - }, - "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" - }, - "Interactable": { - "Bool": true - }, - "LayoutOrder": { - "Int32": 0 - }, - "LineHeight": { - "Float32": 1.0 - }, - "LocalizationMatchIdentifier": { - "String": "" - }, - "LocalizationMatchedSourceText": { - "String": "" - }, - "MaxVisibleGraphemes": { - "Int32": -1 - }, - "Modal": { - "Bool": false - }, - "OpenTypeFeatures": { - "String": "" - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "RichText": { - "Bool": false - }, - "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": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Style": { - "Enum": 0 - }, - "Tags": { - "Tags": [] - }, - "Text": { - "String": "Button" - }, - "TextColor3": { - "Color3": [ - 0.10588236, - 0.16470589, - 0.20784315 - ] - }, - "TextDirection": { - "Enum": 0 - }, - "TextScaled": { - "Bool": false - }, - "TextSize": { - "Float32": 8.0 - }, - "TextStrokeColor3": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "TextStrokeTransparency": { - "Float32": 1.0 - }, - "TextTransparency": { - "Float32": 0.0 - }, - "TextTruncate": { - "Enum": 0 - }, - "TextWrapped": { - "Bool": false - }, - "TextXAlignment": { - "Enum": 2 - }, - "TextYAlignment": { - "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "TextChannel": { - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextChatService": { - "Name": "TextChatService", - "Tags": [ - "NotCreatable", - "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" - } - } - } - }, - "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 - }, - "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" - } - } - }, - "TextFilterResult": { - "Name": "TextFilterResult", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "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" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Font": { - "Name": "Font", - "Scriptability": "ReadWrite", - "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": { - "Serialization": "Serializes" - } - } - }, - "FontSize": { - "Name": "FontSize", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FontSize" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LineHeight": { - "Name": "LineHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxVisibleGraphemes": { - "Name": "MaxVisibleGraphemes", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Text": { - "Name": "Text", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextBounds": { - "Name": "TextBounds", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor": { - "Name": "TextColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "BrickColor" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextColor3": { - "Name": "TextColor3", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextDirection": { - "Name": "TextDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextFits": { - "Name": "TextFits", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TextScaled": { - "Name": "TextScaled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextSize": { - "Name": "TextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "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": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextTransparency": { - "Name": "TextTransparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextTruncate": { - "Name": "TextTruncate", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextTruncate" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextWrap": { - "Name": "TextWrap", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - }, - "Interactable": { - "Bool": true - }, - "LayoutOrder": { - "Int32": 0 - }, - "LineHeight": { - "Float32": 1.0 - }, - "LocalizationMatchIdentifier": { - "String": "" - }, - "LocalizationMatchedSourceText": { - "String": "" - }, - "MaxVisibleGraphemes": { - "Int32": -1 - }, - "OpenTypeFeatures": { - "String": "" - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "RichText": { - "Bool": false - }, - "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": [] - }, - "Text": { - "String": "Label" - }, - "TextColor3": { - "Color3": [ - 0.10588236, - 0.16470589, - 0.20784315 - ] - }, - "TextDirection": { - "Enum": 0 - }, - "TextScaled": { - "Bool": false - }, - "TextSize": { - "Float32": 8.0 - }, - "TextStrokeColor3": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "TextStrokeTransparency": { - "Float32": 1.0 - }, - "TextTransparency": { - "Float32": 0.0 - }, - "TextTruncate": { - "Enum": 0 - }, - "TextWrapped": { - "Bool": false - }, - "TextXAlignment": { - "Enum": 2 - }, - "TextYAlignment": { - "Enum": 1 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "TextService": { - "Name": "TextService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TextSource": { - "Name": "TextSource", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "CanSend": { - "Name": "CanSend", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DisplayName": { - "Name": "DisplayName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UserId": { - "Name": "UserId", - "Scriptability": "Read", - "DataType": { - "Value": "Int64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "Texture": { - "Name": "Texture", - "Tags": [], - "Superclass": "Decal", - "Properties": { - "OffsetStudsU": { - "Name": "OffsetStudsU", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OffsetStudsV": { - "Name": "OffsetStudsV", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudsPerTileU": { - "Name": "StudsPerTileU", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StudsPerTileV": { - "Name": "StudsPerTileV", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoLocalize": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color3": { - "Color3": [ - 1.0, - 1.0, - 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 - }, - "StudsPerTileU": { - "Float32": 2.0 - }, - "StudsPerTileV": { - "Float32": 2.0 - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "TexturePack": { - "ContentId": "" - }, - "TexturePackMetadata": { - "String": "" - }, - "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": [ - "NotCreatable", - "NotReplicated", - "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" - } - } - }, - "ThreadState": { - "Name": "ThreadState", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "FrameCount": { - "Name": "FrameCount", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Populated": { - "Name": "Populated", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ThreadId": { - "Name": "ThreadId", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ThreadName": { - "Name": "ThreadName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TimerService": { - "Name": "TimerService", - "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" - } - } - }, - "ToastNotificationService": { - "Name": "ToastNotificationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "Tool": { - "Name": "Tool", - "Tags": [], - "Superclass": "BackpackItem", - "Properties": { - "CanBeDropped": { - "Name": "CanBeDropped", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Grip": { - "Name": "Grip", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GripForward": { - "Name": "GripForward", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GripPos": { - "Name": "GripPos", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GripRight": { - "Name": "GripRight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GripUp": { - "Name": "GripUp", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ManualActivationOnly": { - "Name": "ManualActivationOnly", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RequiresHandle": { - "Name": "RequiresHandle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ToolTip": { - "Name": "ToolTip", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CanBeDropped": { - "Bool": true - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Enabled": { - "Bool": true - }, - "Grip": { - "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" - }, - "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": [] - }, - "TextureContent": { - "Content": "None" - }, - "ToolTip": { - "String": "" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WorldPivotData": { - "OptionalCFrame": null - } - } - }, - "Torque": { - "Name": "Torque", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "RelativeTo": { - "Name": "RelativeTo", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorRelativeTo" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Torque": { - "Name": "Torque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 23 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "RelativeTo": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Torque": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "TorsionSpringConstraint": { - "Name": "TorsionSpringConstraint", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "Coils": { - "Name": "Coils", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentAngle": { - "Name": "CurrentAngle", - "Scriptability": "Read", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Damping": { - "Name": "Damping", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitEnabled": { - "Name": "LimitEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LimitsEnabled": { - "Name": "LimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxAngle": { - "Name": "MaxAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxTorque": { - "Name": "MaxTorque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Restitution": { - "Name": "Restitution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Stiffness": { - "Name": "Stiffness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Coils": { - "Float32": 8.0 - }, - "Color": { - "BrickColor": 200 - }, - "Damping": { - "Float32": 0.01 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LimitEnabled": { - "Bool": false - }, - "LimitsEnabled": { - "Bool": false - }, - "MaxAngle": { - "Float32": 45.0 - }, - "MaxTorque": { - "Float32": null - }, - "Radius": { - "Float32": 0.4 - }, - "Restitution": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Stiffness": { - "Float32": 100.0 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "TotalCountTimeIntervalItem": { - "Name": "TotalCountTimeIntervalItem", - "Tags": [ - "NotCreatable" - ], - "Superclass": "StatsItem", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TouchInputService": { - "Name": "TouchInputService", - "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" - } - } - }, - "TouchTransmitter": { - "Name": "TouchTransmitter", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "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" - } - } - }, - "TracerService": { - "Name": "TracerService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "Trail": { - "Name": "Trail", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Attachment0": { - "Name": "Attachment0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Attachment1": { - "Name": "Attachment1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Brightness": { - "Name": "Brightness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ColorSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FaceCamera": { - "Name": "FaceCamera", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Lifetime": { - "Name": "Lifetime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightEmission": { - "Name": "LightEmission", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightInfluence": { - "Name": "LightInfluence", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LocalTransparencyModifier": { - "Name": "LocalTransparencyModifier", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MaxLength": { - "Name": "MaxLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinLength": { - "Name": "MinLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextureLength": { - "Name": "TextureLength", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TextureMode": { - "Name": "TextureMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TextureMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Transparency": { - "Name": "Transparency", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "WidthScale": { - "Name": "WidthScale", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "NumberSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Brightness": { - "Float32": 1.0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "ColorSequence": { - "keypoints": [ - { - "time": 0.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - }, - { - "time": 1.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - } - ] - } - }, - "Enabled": { - "Bool": true - }, - "FaceCamera": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Lifetime": { - "Float32": 2.0 - }, - "LightEmission": { - "Float32": 0.0 - }, - "LightInfluence": { - "Float32": 0.0 - }, - "MaxLength": { - "Float32": 0.0 - }, - "MinLength": { - "Float32": 0.1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TextureContent": { - "Content": "None" - }, - "TextureLength": { - "Float32": 1.0 - }, - "TextureMode": { - "Enum": 0 - }, - "Transparency": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 0.5, - "envelope": 0.0 - }, - { - "time": 1.0, - "value": 0.5, - "envelope": 0.0 - } - ] - } - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "WidthScale": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 1.0, - "envelope": 0.0 - }, - { - "time": 1.0, - "value": 1.0, - "envelope": 0.0 - } - ] - } - } - } - }, - "Translator": { - "Name": "Translator", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "LocaleId": { - "Name": "LocaleId", - "Scriptability": "Read", - "DataType": { - "Value": "String" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TremoloSoundEffect": { - "Name": "TremoloSoundEffect", - "Tags": [], - "Superclass": "SoundEffect", - "Properties": { - "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" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Depth": { - "Float32": 1.0 - }, - "Duty": { - "Float32": 0.5 - }, - "Enabled": { - "Bool": true - }, - "Frequency": { - "Float32": 5.0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Priority": { - "Int32": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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", - "DataType": { - "Enum": "CollisionFidelity" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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" - } - } - }, - "TrussPart": { - "Name": "TrussPart", - "Tags": [], - "Superclass": "BasePart", - "Properties": { - "Style": { - "Name": "Style", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "Style" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "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 - }, - "BackParamA": { - "Float32": -0.5 - }, - "BackParamB": { - "Float32": 0.5 - }, - "BackSurface": { - "Enum": 5 - }, - "BackSurfaceInput": { - "Enum": 0 - }, - "BottomParamA": { - "Float32": -0.5 - }, - "BottomParamB": { - "Float32": 0.5 - }, - "BottomSurface": { - "Enum": 5 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "EnableFluidForces": { - "Bool": true - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 5 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LeftParamA": { - "Float32": -0.5 - }, - "LeftParamB": { - "Float32": 0.5 - }, - "LeftSurface": { - "Enum": 5 - }, - "LeftSurfaceInput": { - "Enum": 0 - }, - "Locked": { - "Bool": false - }, - "Massless": { - "Bool": false - }, - "Material": { - "Enum": 256 - }, - "MaterialVariant": { - "String": "" - }, - "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 - }, - "RightParamA": { - "Float32": -0.5 - }, - "RightParamB": { - "Float32": 0.5 - }, - "RightSurface": { - "Enum": 5 - }, - "RightSurfaceInput": { - "Enum": 0 - }, - "RootPriority": { - "Int32": 0 - }, - "RotVelocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "Size": { - "Vector3": [ - 2.0, - 2.0, - 2.0 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 5 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "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" - } - } - }, - "Tween": { - "Name": "Tween", - "Tags": [], - "Superclass": "TweenBase", - "Properties": { - "Instance": { - "Name": "Instance", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "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" - } - } - }, - "TweenBase": { - "Name": "TweenBase", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": { - "PlaybackState": { - "Name": "PlaybackState", - "Scriptability": "Read", - "DataType": { - "Enum": "PlaybackState" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "TweenService": { - "Name": "TweenService", - "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" - } - } - }, - "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" - } - } - }, - "UGCValidationService": { - "Name": "UGCValidationService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIAspectRatioConstraint": { - "Name": "UIAspectRatioConstraint", - "Tags": [], - "Superclass": "UIConstraint", - "Properties": { - "AspectRatio": { - "Name": "AspectRatio", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AspectType": { - "Name": "AspectType", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "AspectType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DominantAxis": { - "Name": "DominantAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "DominantAxis" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "AspectRatio": { - "Float32": 1.0 - }, - "AspectType": { - "Enum": 0 - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DominantAxis": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIBase": { - "Name": "UIBase", - "Tags": [ - "NotCreatable" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIComponent": { - "Name": "UIComponent", - "Tags": [ - "NotCreatable" - ], - "Superclass": "UIBase", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIConstraint": { - "Name": "UIConstraint", - "Tags": [ - "NotCreatable" - ], - "Superclass": "UIComponent", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BottomLeftRadius": { - "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" - } - } - }, - "UIGradient": { - "Name": "UIGradient", - "Tags": [], - "Superclass": "UIComponent", - "Properties": { - "Color": { - "Name": "Color", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ColorSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Offset": { - "Name": "Offset", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Rotation": { - "Name": "Rotation", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "NumberSequence" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - }, - "Color": { - "ColorSequence": { - "keypoints": [ - { - "time": 0.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - }, - { - "time": 1.0, - "color": [ - 1.0, - 1.0, - 1.0 - ] - } - ] - } - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Offset": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Rotation": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "Scale": { - "Float32": 1.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TileMode": { - "Enum": 0 - }, - "Transparency": { - "NumberSequence": { - "keypoints": [ - { - "time": 0.0, - "value": 0.0, - "envelope": 0.0 - }, - { - "time": 1.0, - "value": 0.0, - "envelope": 0.0 - } - ] - } - }, - "Type": { - "Enum": 0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIGridLayout": { - "Name": "UIGridLayout", - "Tags": [], - "Superclass": "UIGridStyleLayout", - "Properties": { - "AbsoluteCellCount": { - "Name": "AbsoluteCellCount", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "AbsoluteCellSize": { - "Name": "AbsoluteCellSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "CellPadding": { - "Name": "CellPadding", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CellSize": { - "Name": "CellSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FillDirectionMaxCells": { - "Name": "FillDirectionMaxCells", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StartCorner": { - "Name": "StartCorner", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "StartCorner" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "CellPadding": { - "UDim2": [ - [ - 0.0, - 5 - ], - [ - 0.0, - 5 - ] - ] - }, - "CellSize": { - "UDim2": [ - [ - 0.0, - 100 - ], - [ - 0.0, - 100 - ] - ] - }, - "FillDirection": { - "Enum": 0 - }, - "FillDirectionMaxCells": { - "Int32": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HorizontalAlignment": { - "Enum": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SortOrder": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "StartCorner": { - "Enum": 0 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VerticalAlignment": { - "Enum": 1 - } - } - }, - "UIGridStyleLayout": { - "Name": "UIGridStyleLayout", - "Tags": [ - "NotBrowsable", - "NotCreatable" - ], - "Superclass": "UILayout", - "Properties": { - "AbsoluteContentSize": { - "Name": "AbsoluteContentSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "FillDirection": { - "Name": "FillDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "FillDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HorizontalAlignment": { - "Name": "HorizontalAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "HorizontalAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SortOrder": { - "Name": "SortOrder", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SortOrder" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VerticalAlignment": { - "Name": "VerticalAlignment", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VerticalAlignment" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UILayout": { - "Name": "UILayout", - "Tags": [ - "NotCreatable" - ], - "Superclass": "UIComponent", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "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", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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 - }, - "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 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VerticalAlignment": { - "Enum": 1 - }, - "VerticalFlex": { - "Enum": 0 - }, - "Wraps": { - "Bool": false - } - } - }, - "UIPadding": { - "Name": "UIPadding", - "Tags": [], - "Superclass": "UIComponent", - "Properties": { - "PaddingBottom": { - "Name": "PaddingBottom", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PaddingLeft": { - "Name": "PaddingLeft", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PaddingRight": { - "Name": "PaddingRight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PaddingTop": { - "Name": "PaddingTop", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "PaddingBottom": { - "UDim": [ - 0.0, - 0 - ] - }, - "PaddingLeft": { - "UDim": [ - 0.0, - 0 - ] - }, - "PaddingRight": { - "UDim": [ - 0.0, - 0 - ] - }, - "PaddingTop": { - "UDim": [ - 0.0, - 0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIPageLayout": { - "Name": "UIPageLayout", - "Tags": [], - "Superclass": "UIGridStyleLayout", - "Properties": { - "Animated": { - "Name": "Animated", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Circular": { - "Name": "Circular", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentPage": { - "Name": "CurrentPage", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "EasingDirection": { - "Name": "EasingDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "EasingDirection" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "EasingStyle": { - "Name": "EasingStyle", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "EasingStyle" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GamepadInputEnabled": { - "Name": "GamepadInputEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Padding": { - "Name": "Padding", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ScrollWheelInputEnabled": { - "Name": "ScrollWheelInputEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TouchInputEnabled": { - "Name": "TouchInputEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TweenTime": { - "Name": "TweenTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Animated": { - "Bool": true - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Circular": { - "Bool": false - }, - "EasingDirection": { - "Enum": 1 - }, - "EasingStyle": { - "Enum": 2 - }, - "FillDirection": { - "Enum": 0 - }, - "GamepadInputEnabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HorizontalAlignment": { - "Enum": 1 - }, - "Padding": { - "UDim": [ - 0.0, - 0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "ScrollWheelInputEnabled": { - "Bool": true - }, - "SortOrder": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TouchInputEnabled": { - "Bool": true - }, - "TweenTime": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VerticalAlignment": { - "Enum": 1 - } - } - }, - "UIScale": { - "Name": "UIScale", - "Tags": [], - "Superclass": "UIComponent", - "Properties": { - "Scale": { - "Name": "Scale", - "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 - }, - "Scale": { - "Float32": 1.0 - }, - "SourceAssetId": { - "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 - } - } - }, - "UISizeConstraint": { - "Name": "UISizeConstraint", - "Tags": [], - "Superclass": "UIConstraint", - "Properties": { - "MaxSize": { - "Name": "MaxSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinSize": { - "Name": "MinSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxSize": { - "Vector2": [ - null, - null - ] - }, - "MinSize": { - "Vector2": [ - 0.0, - 0.0 - ] - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UIStroke": { - "Name": "UIStroke", - "Tags": [], - "Superclass": "UIComponent", - "Properties": { - "ApplyStrokeMode": { - "Name": "ApplyStrokeMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ApplyStrokeMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LineJoinMode": { - "Name": "LineJoinMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "LineJoinMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StrokeSizingMode": { - "Name": "StrokeSizingMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "StrokeSizingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Thickness": { - "Name": "Thickness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "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": { - "ApplyStrokeMode": { - "Enum": 0 - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "BorderOffset": { - "UDim": [ - 0.0, - 0 - ] - }, - "BorderStrokePosition": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "Color3": [ - 0.0, - 0.0, - 0.0 - ] - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LineJoinMode": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "StrokeSizingMode": { - "Enum": 0 - }, - "Tags": { - "Tags": [] - }, - "Thickness": { - "Float32": 1.0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "UITableLayout": { - "Name": "UITableLayout", - "Tags": [], - "Superclass": "UIGridStyleLayout", - "Properties": { - "FillEmptySpaceColumns": { - "Name": "FillEmptySpaceColumns", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FillEmptySpaceRows": { - "Name": "FillEmptySpaceRows", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MajorAxis": { - "Name": "MajorAxis", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TableMajorAxis" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Padding": { - "Name": "Padding", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "UDim2" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "FillDirection": { - "Enum": 1 - }, - "FillEmptySpaceColumns": { - "Bool": false - }, - "FillEmptySpaceRows": { - "Bool": false - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "HorizontalAlignment": { - "Enum": 1 - }, - "MajorAxis": { - "Enum": 0 - }, - "Padding": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "Sandboxed": { - "Bool": false - }, - "SortOrder": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VerticalAlignment": { - "Enum": 1 - } - } - }, - "UITextSizeConstraint": { - "Name": "UITextSizeConstraint", - "Tags": [], - "Superclass": "UIConstraint", - "Properties": { - "MaxTextSize": { - "Name": "MaxTextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MinTextSize": { - "Name": "MinTextSize", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "MaxTextSize": { - "Int32": 100 - }, - "MinTextSize": { - "Int32": 1 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UnionOperation": { - "Name": "UnionOperation", - "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 - ] - } - } - }, - "UniqueIdLookupService": { - "Name": "UniqueIdLookupService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UniversalConstraint": { - "Name": "UniversalConstraint", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "LimitsEnabled": { - "Name": "LimitsEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxAngle": { - "Name": "MaxAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Radius": { - "Name": "Radius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Restitution": { - "Name": "Restitution", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 1009 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "LimitsEnabled": { - "Bool": false - }, - "MaxAngle": { - "Float32": 45.0 - }, - "Radius": { - "Float32": 0.2 - }, - "Restitution": { - "Float32": 0.0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "CachedData": { - "Name": "CachedData", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "CachedData": { - "String": "{\"lastSaveTime\":0,\"lastKnownPublishRequest\":0,\"users\":[]}" - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UserGameSettings": { - "Name": "UserGameSettings", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AllTutorialsDisabled": { - "Name": "AllTutorialsDisabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "BadgeVisible": { - "Name": "BadgeVisible", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraMode": { - "Name": "CameraMode", - "Scriptability": "None", - "DataType": { - "Enum": "CustomCameraMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CameraYInverted": { - "Name": "CameraYInverted", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "ComputerCameraMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ComputerMovementChanged": { - "Name": "ComputerMovementChanged", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ComputerMovementMode": { - "Name": "ComputerMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ComputerMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ControlMode": { - "Name": "ControlMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ControlMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GamepadCameraSensitivity": { - "Name": "GamepadCameraSensitivity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GraphicsOptimizationMode": { - "Name": "GraphicsOptimizationMode", - "Scriptability": "None", - "DataType": { - "Enum": "GraphicsOptimizationMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "GraphicsQualityLevel": { - "Name": "GraphicsQualityLevel", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HapticStrength": { - "Name": "HapticStrength", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HasEverUsedVR": { - "Name": "HasEverUsedVR", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IsUsingCameraYInverted": { - "Name": "IsUsingCameraYInverted", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "IsUsingGamepadCameraSensitivity": { - "Name": "IsUsingGamepadCameraSensitivity", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MasterVolume": { - "Name": "MasterVolume", - "Scriptability": "None", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MicroProfilerWebServerIP": { - "Name": "MicroProfilerWebServerIP", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MicroProfilerWebServerPort": { - "Name": "MicroProfilerWebServerPort", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseSensitivity": { - "Name": "MouseSensitivity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MouseSensitivityFirstPerson": { - "Name": "MouseSensitivityFirstPerson", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MouseSensitivityThirdPerson": { - "Name": "MouseSensitivityThirdPerson", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OnScreenProfilerEnabled": { - "Name": "OnScreenProfilerEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "OnboardingsCompleted": { - "Name": "OnboardingsCompleted", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RCCProfilerRecordTimeFrame": { - "Name": "RCCProfilerRecordTimeFrame", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "RotationType" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "SavedQualityLevel": { - "Name": "SavedQualityLevel", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "SavedQualitySetting" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StartMaximized": { - "Name": "StartMaximized", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StartScreenPosition": { - "Name": "StartScreenPosition", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StartScreenSize": { - "Name": "StartScreenSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "TouchCameraMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TouchMovementChanged": { - "Name": "TouchMovementChanged", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TouchMovementMode": { - "Name": "TouchMovementMode", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "TouchMovementMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UsedCustomGuiIsVisibleToggle": { - "Name": "UsedCustomGuiIsVisibleToggle", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "UsedHideHudShortcut": { - "Name": "UsedHideHudShortcut", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VRComfortSetting": { - "Name": "VRComfortSetting", - "Scriptability": "None", - "DataType": { - "Enum": "VRComfortSetting" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VREnabled": { - "Name": "VREnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "VRRotationIntensity": { - "Name": "VRRotationIntensity", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "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" - } - } - }, - "UserInputService": { - "Name": "UserInputService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AccelerometerEnabled": { - "Name": "AccelerometerEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "BottomBarSize": { - "Name": "BottomBarSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GamepadEnabled": { - "Name": "GamepadEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "GyroscopeEnabled": { - "Name": "GyroscopeEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "KeyboardEnabled": { - "Name": "KeyboardEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LegacyInputEventsEnabled": { - "Name": "LegacyInputEventsEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ModalEnabled": { - "Name": "ModalEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseBehavior": { - "Name": "MouseBehavior", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "MouseBehavior" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MouseDeltaSensitivity": { - "Name": "MouseDeltaSensitivity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "MouseEnabled": { - "Name": "MouseEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "NavBarSize": { - "Name": "NavBarSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OnScreenKeyboardAnimationDuration": { - "Name": "OnScreenKeyboardAnimationDuration", - "Scriptability": "None", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OnScreenKeyboardPosition": { - "Name": "OnScreenKeyboardPosition", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OnScreenKeyboardSize": { - "Name": "OnScreenKeyboardSize", - "Scriptability": "Read", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OnScreenKeyboardVisible": { - "Name": "OnScreenKeyboardVisible", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "OverrideMouseIconBehavior": { - "Name": "OverrideMouseIconBehavior", - "Scriptability": "None", - "DataType": { - "Enum": "OverrideMouseIconBehavior" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PreferredInput": { - "Name": "PreferredInput", - "Scriptability": "Read", - "DataType": { - "Enum": "PreferredInput" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "RightBarSize": { - "Name": "RightBarSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StatusBarSize": { - "Name": "StatusBarSize", - "Scriptability": "None", - "DataType": { - "Value": "Vector2" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TouchEnabled": { - "Name": "TouchEnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TouchScreenEnabled": { - "Name": "TouchScreenEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "UserHeadCFrame": { - "Name": "UserHeadCFrame", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "Deprecated", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VREnabled": { - "Name": "VREnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UserService": { - "Name": "UserService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UserSettings": { - "Name": "UserSettings", - "Tags": [ - "NotCreatable" - ], - "Superclass": "GenericSettings", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "UserStorageService": { - "Name": "UserStorageService", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "LocalStorageService", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VRService": { - "Name": "VRService", - "Tags": [ - "NotCreatable", - "Service" - ], - "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" - } - } - }, - "VRDeviceAvailable": { - "Name": "VRDeviceAvailable", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VRDeviceName": { - "Name": "VRDeviceName", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "VREnabled": { - "Name": "VREnabled", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "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 - }, - "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" - } - } - }, - "ValueBase": { - "Name": "ValueBase", - "Tags": [ - "NotCreatable" - ], - "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==" - } - } - }, - "Vector3Curve": { - "Name": "Vector3Curve", - "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" - } - } - }, - "Vector3Value": { - "Name": "Vector3Value", - "Tags": [], - "Superclass": "ValueBase", - "Properties": { - "Value": { - "Name": "Value", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "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" - }, - "Value": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "VectorForce": { - "Name": "VectorForce", - "Tags": [], - "Superclass": "Constraint", - "Properties": { - "ApplyAtCenterOfMass": { - "Name": "ApplyAtCenterOfMass", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Force": { - "Name": "Force", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "RelativeTo": { - "Name": "RelativeTo", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ActuatorRelativeTo" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "ApplyAtCenterOfMass": { - "Bool": false - }, - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "Color": { - "BrickColor": 23 - }, - "Enabled": { - "Bool": true - }, - "Force": { - "Vector3": [ - 1000.0, - 0.0, - 0.0 - ] - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "RelativeTo": { - "Enum": 0 - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": false - } - } - }, - "VehicleController": { - "Name": "VehicleController", - "Tags": [], - "Superclass": "Controller", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VehicleSeat": { - "Name": "VehicleSeat", - "Tags": [], - "Superclass": "BasePart", - "Properties": { - "AreHingesDetected": { - "Name": "AreHingesDetected", - "Scriptability": "Read", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Disabled": { - "Name": "Disabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "HeadsUpDisplay": { - "Name": "HeadsUpDisplay", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxSpeed": { - "Name": "MaxSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Occupant": { - "Name": "Occupant", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Steer": { - "Name": "Steer", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SteerFloat": { - "Name": "SteerFloat", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Throttle": { - "Name": "Throttle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ThrottleFloat": { - "Name": "ThrottleFloat", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Torque": { - "Name": "Torque", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "TurnSpeed": { - "Name": "TurnSpeed", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "Disabled": { - "Bool": false - }, - "EnableFluidForces": { - "Bool": true - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HeadsUpDisplay": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "MaxSpeed": { - "Float32": 25.0 - }, - "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 - }, - "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 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Steer": { - "Int32": 0 - }, - "SteerFloat": { - "Float32": 0.0 - }, - "Tags": { - "Tags": [] - }, - "Throttle": { - "Int32": 0 - }, - "ThrottleFloat": { - "Float32": 0.0 - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 3 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Torque": { - "Float32": 10.0 - }, - "Transparency": { - "Float32": 0.0 - }, - "TurnSpeed": { - "Float32": 1.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "VelocityMotor": { - "Name": "VelocityMotor", - "Tags": [], - "Superclass": "JointInstance", - "Properties": { - "CurrentAngle": { - "Name": "CurrentAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DesiredAngle": { - "Name": "DesiredAngle", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Hole": { - "Name": "Hole", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaxVelocity": { - "Name": "MaxVelocity", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "CurrentAngle": { - "Float32": 0.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" - } - } - }, - "VersionControlService": { - "Name": "VersionControlService", - "Tags": [ - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "ScriptCollabEnabled": { - "Name": "ScriptCollabEnabled", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Looped": { - "Name": "Looped", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MaximumResolution": { - "Name": "MaximumResolution", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "VideoSampleSize" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Playing": { - "Name": "Playing", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "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" - } - } - }, - "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", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "TimePosition": { - "Name": "TimePosition", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Volume": { - "Name": "Volume", - "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 - }, - "InternalVideoUsage": { - "Enum": 0 - }, - "LayoutOrder": { - "Int32": 0 - }, - "Looped": { - "Bool": false - }, - "MaximumResolution": { - "Enum": 3 - }, - "Playing": { - "Bool": false - }, - "Position": { - "UDim2": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "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": [ - [ - 0.0, - 0 - ], - [ - 0.0, - 0 - ] - ] - }, - "SizeConstraint": { - "Enum": 0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TimePosition": { - "Float64": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "VideoContent": { - "Content": "None" - }, - "Visible": { - "Bool": true - }, - "Volume": { - "Float32": 1.0 - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "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": [], - "Superclass": "GuiObject", - "Properties": { - "Ambient": { - "Name": "Ambient", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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" - } - } - }, - "IsMirrored": { - "Name": "IsMirrored", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "LightColor": { - "Name": "LightColor", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Color3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "LightDirection": { - "Name": "LightDirection", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Vector3" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Active": { - "Bool": false - }, - "Ambient": { - "Color3": [ - 0.78431374, - 0.78431374, - 0.78431374 - ] - }, - "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 - }, - "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, - 1.0, - 1.0 - ] - }, - "ImageTransparency": { - "Float32": 0.0 - }, - "Interactable": { - "Bool": true - }, - "LayoutOrder": { - "Int32": 0 - }, - "LightColor": { - "Color3": [ - 0.54901963, - 0.54901963, - 0.54901963 - ] - }, - "LightDirection": { - "Vector3": [ - -1.0, - -1.0, - -1.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" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": 1 - } - } - }, - "VirtualInput": { - "Name": "VirtualInput", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "VirtualInputManager": { - "Name": "VirtualInputManager", - "Tags": [ - "Service" - ], - "Superclass": "Instance", - "Properties": { - "AdditionalLuaState": { - "Name": "AdditionalLuaState", - "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" - } - } - }, - "VirtualUser": { - "Name": "VirtualUser", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "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" - } - } - }, - "Visit": { - "Name": "Visit", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Service" - ], - "Superclass": "Instance", - "Properties": {}, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VisualizationMode": { - "Name": "VisualizationMode", - "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 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "VoiceChatInternal": { - "Name": "VoiceChatInternal", - "Tags": [ - "NotBrowsable", - "NotCreatable", - "Service" - ], - "Superclass": "Instance", - "Properties": { - "VoiceChatState": { - "Name": "VoiceChatState", - "Scriptability": "Read", - "DataType": { - "Enum": "VoiceChatState" - }, - "Tags": [ - "Deprecated", - "Hidden", - "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" - } - } - }, - "VoiceChatService": { - "Name": "VoiceChatService", - "Tags": [ - "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" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "DefaultDistanceAttenuation": { - "Enum": 0 - }, - "EnableDefaultVoice": { - "Bool": true - }, - "EnableVoiceVolumeControls": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "UseAudioApi": { - "Enum": 1 - } - } - }, - "VoxelBuffer": { - "Name": "VoxelBuffer", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Object", - "Properties": {}, - "DefaultProperties": {} - }, - "WebSocketClient": { - "Name": "WebSocketClient", - "Tags": [ - "NotCreatable", - "NotReplicated" - ], - "Superclass": "Instance", - "Properties": { - "ConnectionState": { - "Name": "ConnectionState", - "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" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "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": [], - "Superclass": "FormFactorPart", - "Properties": {}, - "DefaultProperties": { - "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": 4 - }, - "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 - }, - "CollisionGroup": { - "String": "Default" - }, - "CollisionGroupId": { - "Int32": 0 - }, - "Color": { - "Color3uint8": [ - 163, - 162, - 165 - ] - }, - "CustomPhysicalProperties": { - "PhysicalProperties": "Default" - }, - "EnableFluidForces": { - "Bool": true - }, - "FormFactor": { - "Enum": 1 - }, - "FrontParamA": { - "Float32": -0.5 - }, - "FrontParamB": { - "Float32": 0.5 - }, - "FrontSurface": { - "Enum": 0 - }, - "FrontSurfaceInput": { - "Enum": 0 - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "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": "" - }, - "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 - }, - "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 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TopParamA": { - "Float32": -0.5 - }, - "TopParamB": { - "Float32": 0.5 - }, - "TopSurface": { - "Enum": 0 - }, - "TopSurfaceInput": { - "Enum": 0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Velocity": { - "Vector3": [ - 0.0, - 0.0, - 0.0 - ] - } - } - }, - "Weld": { - "Name": "Weld", - "Tags": [], - "Superclass": "JointInstance", - "Properties": { - "EnableSkinning": { - "Name": "EnableSkinning", - "Scriptability": "None", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Hidden" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "C0": { - "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 - ] - ] - } - }, - "C1": { - "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 - }, - "Enabled": { - "Bool": true - }, - "HistoryId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Sandboxed": { - "Bool": false - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WeldConstraint": { - "Name": "WeldConstraint", - "Tags": [], - "Superclass": "Instance", - "Properties": { - "Active": { - "Name": "Active", - "Scriptability": "Read", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Part0": { - "Name": "Part0", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "Part0Internal" - } - } - } - }, - "Part0Internal": { - "Name": "Part0Internal", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Alias": { - "AliasFor": "Part0" - } - } - }, - "Part1": { - "Name": "Part1", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": { - "SerializesAs": "Part1Internal" - } - } - } - }, - "Part1Internal": { - "Name": "Part1Internal", - "Scriptability": "None", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "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 - ] - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "Thickness": { - "Float32": 1.0 - }, - "Transparency": { - "Float32": 0.0 - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - }, - "Visible": { - "Bool": true - }, - "ZIndex": { - "Int32": -1 - } - } - }, - "Workspace": { - "Name": "Workspace", - "Tags": [ - "NotCreatable", - "Service" - ], - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AuthorityMode": { - "Name": "AuthorityMode", - "Scriptability": "None", - "DataType": { - "Enum": "AuthorityMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "AvatarUnificationMode": { - "Name": "AvatarUnificationMode", - "Scriptability": "None", - "DataType": { - "Enum": "AvatarUnificationMode" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ClientAnimatorThrottling": { - "Name": "ClientAnimatorThrottling", - "Scriptability": "ReadWrite", - "DataType": { - "Enum": "ClientAnimatorThrottlingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CollisionGroups": { - "Name": "CollisionGroups", - "Scriptability": "None", - "DataType": { - "Value": "String" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "WriteOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "CurrentCamera": { - "Name": "CurrentCamera", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "DataModelPlaceVersion": { - "Name": "DataModelPlaceVersion", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DistributedGameTime": { - "Name": "DistributedGameTime", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float64" - }, - "Tags": [ - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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": { - "Serialization": "Serializes" - } - } - }, - "FallenPartsDestroyHeight": { - "Name": "FallenPartsDestroyHeight", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "FilteringEnabled": { - "Name": "FilteringEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "Deprecated", - "Hidden", - "NotReplicated" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Float32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "IKControlConstraintSupport": { - "Name": "IKControlConstraintSupport", - "Scriptability": "None", - "DataType": { - "Enum": "IKControlConstraintSupport" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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": { - "Serialization": "Serializes" - } - } - }, - "MapTVRemoteToGamepadKeycodes": { - "Name": "MapTVRemoteToGamepadKeycodes", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshPartHeadsAndAccessories": { - "Name": "MeshPartHeadsAndAccessories", - "Scriptability": "None", - "DataType": { - "Enum": "MeshPartHeadsAndAccessories" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "MeshStreamingAndImprovedLods": { - "Name": "MeshStreamingAndImprovedLods", - "Scriptability": "None", - "DataType": { - "Enum": "RolloutState" - }, - "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" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "PathfindingUseImprovedSearch": { - "Name": "PathfindingUseImprovedSearch", - "Scriptability": "None", - "DataType": { - "Enum": "PathfindingUseImprovedSearch" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "PhysicsSteppingMethod": { - "Name": "PhysicsSteppingMethod", - "Scriptability": "None", - "DataType": { - "Enum": "PhysicsSteppingMethod" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Enum": "AnimatorRetargetingMode" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SandboxedInstanceMode": { - "Name": "SandboxedInstanceMode", - "Scriptability": "None", - "DataType": { - "Enum": "SandboxedInstanceMode" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "SignalBehavior": { - "Name": "SignalBehavior", - "Scriptability": "None", - "DataType": { - "Enum": "SignalBehavior" - }, - "Tags": [ - "NotScriptable" - ], - "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" - } - } - }, - "StreamOutBehavior": { - "Name": "StreamOutBehavior", - "Scriptability": "None", - "DataType": { - "Enum": "StreamOutBehavior" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StreamingAdaptiveRadius": { - "Name": "StreamingAdaptiveRadius", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StreamingEnabled": { - "Name": "StreamingEnabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "StreamingPauseMode": { - "Name": "StreamingPauseMode", - "Scriptability": "None", - "DataType": { - "Enum": "StreamingPauseMode" - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "StreamingTargetRadius": { - "Name": "StreamingTargetRadius", - "Scriptability": "None", - "DataType": { - "Value": "Int32" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Terrain": { - "Name": "Terrain", - "Scriptability": "Read", - "DataType": { - "Value": "Ref" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "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", - "DataType": { - "Value": "Bool" - }, - "Tags": [ - "NotScriptable" - ], - "Kind": { - "Canonical": { - "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": { - "Enum": 0 - }, - "Capabilities": { - "SecurityCapabilities": 0 - }, - "ClientAnimatorThrottling": { - "Enum": 0 - }, - "CollisionGroupData": { - "BinaryString": "AQEABP////8HRGVmYXVsdA==" - }, - "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": { - "Enum": 0 - }, - "ImprovedAnimationConstraint": { - "Enum": 0 - }, - "ImprovedPhysicsReplication": { - "Enum": 0 - }, - "LayeredClothingCacheOptimizations": { - "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 - }, - "StreamingTargetRadius": { - "Int32": 1024 - }, - "Tags": { - "Tags": [] - }, - "TerrainWeldsFixed": { - "Bool": true - }, - "TouchEventsUseCollisionGroups": { - "Enum": 0 - }, - "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" - } - } - }, - "WorldModel": { - "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 - } - } - }, - "WorldRoot": { - "Name": "WorldRoot", - "Tags": [ - "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" - } - } - }, - "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", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Color": { - "Name": "Color", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DebugMode": { - "Name": "DebugMode", - "Scriptability": "None", - "DataType": { - "Enum": "WrapLayerDebugMode" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Enabled": { - "Name": "Enabled", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Bool" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "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", - "DataType": { - "Value": "Int32" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "Puffiness": { - "Name": "Puffiness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReferenceMeshContent": { - "Name": "ReferenceMeshContent", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Content" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReferenceMeshId": { - "Name": "ReferenceMeshId", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "ContentId" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": { - "Migrate": { - "To": "ReferenceMeshContent", - "Migration": "ContentIdToContent" - } - } - } - } - }, - "ReferenceOrigin": { - "Name": "ReferenceOrigin", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "CFrame" - }, - "Tags": [], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - }, - "ReferenceOriginWorld": { - "Name": "ReferenceOriginWorld", - "Scriptability": "Read", - "DataType": { - "Value": "CFrame" - }, - "Tags": [ - "NotReplicated", - "ReadOnly" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "ShrinkFactor": { - "Name": "ShrinkFactor", - "Scriptability": "ReadWrite", - "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" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "DefaultProperties": { - "Archivable": { - "Bool": true - }, - "Attributes": { - "Attributes": {} - }, - "AutoSkin": { - "Enum": 0 - }, - "BindOffset": { - "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 - ] - ] - } - }, - "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 - }, - "Enabled": { - "Bool": true - }, - "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 - ] - ] - } - }, - "Order": { - "Int32": 1 - }, - "Puffiness": { - "Float32": 1.0 - }, - "ReferenceMeshContent": { - "Content": "None" - }, - "ReferenceOrigin": { - "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 - }, - "ShrinkFactor": { - "Float32": 0.0 - }, - "SourceAssetId": { - "Int64": -1 - }, - "Tags": { - "Tags": [] - }, - "TemporaryCageMeshContent": { - "Content": "None" - }, - "TemporaryReferenceMeshContent": { - "Content": "None" - }, - "UniqueId": { - "UniqueId": "00000000000000000000000000000000" - } - } - }, - "WrapTarget": { - "Name": "WrapTarget", - "Tags": [], - "Superclass": "BaseWrap", - "Properties": { - "Color": { - "Name": "Color", - "Scriptability": "None", - "DataType": { - "Value": "Color3" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "DebugMode": { - "Name": "DebugMode", - "Scriptability": "None", - "DataType": { - "Enum": "WrapTargetDebugMode" - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "Kind": { - "Canonical": { - "Serialization": "DoesNotSerialize" - } - } - }, - "Stiffness": { - "Name": "Stiffness", - "Scriptability": "ReadWrite", - "DataType": { - "Value": "Float32" - }, - "Tags": [ - "Deprecated" - ], - "Kind": { - "Canonical": { - "Serialization": "Serializes" - } - } - } - }, - "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 - }, - "Stiffness": { - "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" - } - } - } - }, - "Enums": { - "AccessModifierType": { - "name": "AccessModifierType", - "items": { - "Allow": 0, - "Deny": 1 - } - }, - "AccessoryType": { - "name": "AccessoryType", - "items": { - "Back": 7, - "DressSkirt": 17, - "Eyebrow": 18, - "Eyelash": 19, - "Face": 3, - "Front": 6, - "Hair": 2, - "Hat": 1, - "Jacket": 12, - "LeftShoe": 15, - "Neck": 4, - "Pants": 11, - "RightShoe": 16, - "Shirt": 10, - "Shorts": 14, - "Shoulder": 5, - "Sweater": 13, - "TShirt": 9, - "Unknown": 0, - "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": { - "Draw": 3, - "Lose": 2, - "Nothing": 0, - "Pause": 1, - "Win": 4 - } - }, - "ActivePayerStatus": { - "name": "ActivePayerStatus", - "items": { - "Casual50Percent": 3, - "Intermediate35Percent": 4, - "Lapsed": 2, - "Never": 1, - "Top15Percent": 5, - "Unknown": 0 - } - }, - "ActuatorRelativeTo": { - "name": "ActuatorRelativeTo", - "items": { - "Attachment0": 0, - "Attachment1": 1, - "World": 2 - } - }, - "ActuatorType": { - "name": "ActuatorType", - "items": { - "Motor": 1, - "None": 0, - "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": { - "Automatic": 0, - "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 - } - }, - "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": { - "Acquire": 1, - "Default": 0, - "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": { - "Debug": 1, - "Error": 4, - "Fatal": 5, - "Information": 2, - "Trace": 0, - "Warning": 3 - } - }, - "AnalyticsProgressionStatus": { - "name": "AnalyticsProgressionStatus", - "items": { - "Abandon": 3, - "Begin": 1, - "Complete": 2, - "Default": 0, - "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": { - "Default": 0, - "Disabled": 1, - "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, - "ReadConversation": 5, - "TapAvatarTab": 4, - "TapChatTab": 2, - "TapConversationEntry": 3, - "TapGamePageTab": 6, - "TapHomePageTab": 7 - } - }, - "AppShellFeature": { - "name": "AppShellFeature", - "items": { - "AvatarEditor": 2, - "Chat": 1, - "GamePage": 3, - "HomePage": 4, - "Landing": 6, - "More": 5, - "None": 0, - "WatchPage": 7 - } - }, - "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": { - "Border": 1, - "Contextual": 0 - } - }, - "AspectType": { - "name": "AspectType", - "items": { - "FitWithinMaxSize": 0, - "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 - } - }, - "AssetType": { - "name": "AssetType", - "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, - "HairAccessory": 41, - "Hat": 8, - "Head": 17, - "IdleAnimation": 51, - "Image": 1, - "JacketAccessory": 67, - "JumpAnimation": 52, - "LeftArm": 29, - "LeftLeg": 30, - "LeftShoeAccessory": 70, - "LipMakeup": 89, - "Lua": 5, - "Mesh": 4, - "MeshPart": 40, - "Model": 10, - "MoodAnimation": 78, - "NeckAccessory": 43, - "Package": 32, - "Pants": 12, - "PantsAccessory": 66, - "Place": 9, - "Plugin": 38, - "PoseAnimation": 56, - "RightArm": 28, - "RightLeg": 31, - "RightShoeAccessory": 71, - "RunAnimation": 53, - "Shirt": 11, - "ShirtAccessory": 65, - "ShortsAccessory": 69, - "ShoulderAccessory": 44, - "SweaterAccessory": 68, - "SwimAnimation": 54, - "TShirt": 2, - "TShirtAccessory": 64, - "TextDocument": 93, - "Torso": 27, - "Video": 62, - "WaistAccessory": 47, - "WalkAnimation": 55 - } - }, - "AssetTypeVerification": { - "name": "AssetTypeVerification", - "items": { - "Always": 3, - "ClientOnly": 2, - "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": { - "Absolute": 1, - "Off": 0, - "Relative": 2 - } - }, - "AutomaticSize": { - "name": "AutomaticSize", - "items": { - "None": 0, - "X": 1, - "XY": 3, - "Y": 2 - } - }, - "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, - "HairAccessory": 41, - "Hat": 8, - "Head": 17, - "IdleAnimation": 51, - "JacketAccessory": 67, - "JumpAnimation": 52, - "LeftArm": 29, - "LeftLeg": 30, - "LeftShoeAccessory": 70, - "LipMakeup": 89, - "MoodAnimation": 78, - "NeckAccessory": 43, - "Pants": 12, - "PantsAccessory": 66, - "RightArm": 28, - "RightLeg": 31, - "RightShoeAccessory": 71, - "RunAnimation": 53, - "Shirt": 11, - "ShirtAccessory": 65, - "ShortsAccessory": 69, - "ShoulderAccessory": 44, - "SweaterAccessory": 68, - "SwimAnimation": 54, - "TShirt": 2, - "TShirtAccessory": 64, - "Torso": 27, - "WaistAccessory": 47, - "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": { - "Chat": 1, - "Emote": 2, - "Friend": 0, - "InspectMenu": 3 - } - }, - "AvatarGenerationError": { - "name": "AvatarGenerationError", - "items": { - "Canceled": 3, - "DownloadFailed": 2, - "JobNotFound": 6, - "None": 0, - "Offensive": 4, - "Timeout": 5, - "Unknown": 1 - } - }, - "AvatarItemType": { - "name": "AvatarItemType", - "items": { - "Asset": 1, - "Bundle": 2 - } - }, - "AvatarPromptResult": { - "name": "AvatarPromptResult", - "items": { - "Failed": 3, - "PermissionDenied": 2, - "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": { - "X": 0, - "Y": 1, - "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": { - "Clone": 3, - "GameTool": 1, - "Grab": 2, - "Hammer": 4, - "Script": 0 - } - }, - "BodyPart": { - "name": "BodyPart", - "items": { - "Head": 0, - "LeftArm": 2, - "LeftLeg": 4, - "RightArm": 3, - "RightLeg": 5, - "Torso": 1 - } - }, - "BodyPartR15": { - "name": "BodyPartR15", - "items": { - "Head": 0, - "LeftFoot": 3, - "LeftHand": 9, - "LeftLowerArm": 10, - "LeftLowerLeg": 4, - "LeftUpperArm": 11, - "LeftUpperLeg": 5, - "LowerTorso": 2, - "RightFoot": 6, - "RightHand": 12, - "RightLowerArm": 13, - "RightLowerLeg": 7, - "RightUpperArm": 14, - "RightUpperLeg": 8, - "RootPart": 15, - "Unknown": 17, - "UpperTorso": 1 - } - }, - "BorderMode": { - "name": "BorderMode", - "items": { - "Inset": 2, - "Middle": 1, - "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": { - "Error": 1, - "Other": 0, - "SpecialBreakpoint": 2, - "UserBreakpoint": 3 - } - }, - "BreakpointRemoveReason": { - "name": "BreakpointRemoveReason", - "items": { - "Requested": 0, - "ScriptChanged": 1, - "ScriptRemoved": 2 - } - }, - "BulkMoveMode": { - "name": "BulkMoveMode", - "items": { - "FireAllEvents": 0, - "FireCFrameChanged": 1 - } - }, - "BundleType": { - "name": "BundleType", - "items": { - "Animations": 2, - "BodyParts": 1, - "DynamicHead": 4, - "DynamicHeadAvatar": 5, - "Shoes": 3 - } - }, - "Button": { - "name": "Button", - "items": { - "Dismount": 8, - "Jump": 32 - } - }, - "ButtonStyle": { - "name": "ButtonStyle", - "items": { - "Custom": 0, - "RobloxButton": 2, - "RobloxButtonDefault": 1, - "RobloxRoundButton": 3, - "RobloxRoundDefaultButton": 4, - "RobloxRoundDropdownButton": 5 - } - }, - "CageType": { - "name": "CageType", - "items": { - "Inner": 0, - "Outer": 1 - } - }, - "CameraMode": { - "name": "CameraMode", - "items": { - "Classic": 0, - "LockFirstPerson": 1 - } - }, - "CameraNavigationModel": { - "name": "CameraNavigationModel", - "items": { - "IndustryCompatible": 1, - "Roblox": 0 - } - }, - "CameraPanMode": { - "name": "CameraPanMode", - "items": { - "Classic": 0, - "EdgeBump": 1 - } - }, - "CameraSpeedAdjustBinding": { - "name": "CameraSpeedAdjustBinding", - "items": { - "AltScroll": 2, - "None": 0, - "RmbScroll": 1 - } - }, - "CameraType": { - "name": "CameraType", - "items": { - "Attach": 1, - "Custom": 5, - "Fixed": 0, - "Follow": 4, - "Orbital": 7, - "Scriptable": 6, - "Track": 3, - "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": { - "Collectibles": 3, - "CommunityCreations": 4, - "Featured": 2, - "None": 1, - "Premium": 5, - "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, - "Relevance": 1 - } - }, - "CellBlock": { - "name": "CellBlock", - "items": { - "CornerWedge": 2, - "HorizontalWedge": 4, - "InverseCornerWedge": 3, - "Solid": 0, - "VerticalWedge": 1 - } - }, - "CellMaterial": { - "name": "CellMaterial", - "items": { - "Aluminum": 7, - "Asphalt": 5, - "BluePlastic": 16, - "Brick": 3, - "Cement": 14, - "CinderBlock": 12, - "Empty": 0, - "Gold": 8, - "Granite": 4, - "Grass": 1, - "Gravel": 11, - "Iron": 6, - "MossyStone": 13, - "RedPlastic": 15, - "Sand": 2, - "Water": 17, - "WoodLog": 10, - "WoodPlank": 9 - } - }, - "CellOrientation": { - "name": "CellOrientation", - "items": { - "NegX": 3, - "NegZ": 0, - "X": 1, - "Z": 2 - } - }, - "CenterDialogType": { - "name": "CenterDialogType", - "items": { - "ModalDialog": 3, - "PlayerInitiatedDialog": 2, - "QuitDialog": 4, - "UnsolicitedDialog": 1 - } - }, - "CharacterControlMode": { - "name": "CharacterControlMode", - "items": { - "Default": 0, - "Legacy": 1, - "LuaCharacterController": 3, - "NoCharacterController": 2 - } - }, - "ChatCallbackType": { - "name": "ChatCallbackType", - "items": { - "OnClientFormattingMessage": 3, - "OnClientSendingMessage": 2, - "OnCreatingChatWindow": 1, - "OnServerReceivingMessage": 17 - } - }, - "ChatColor": { - "name": "ChatColor", - "items": { - "Blue": 0, - "Green": 1, - "Red": 2, - "White": 3 - } - }, - "ChatMode": { - "name": "ChatMode", - "items": { - "Menu": 0, - "TextAndMenu": 1 - } - }, - "ChatPrivacyMode": { - "name": "ChatPrivacyMode", - "items": { - "AllUsers": 0, - "Friends": 2, - "NoOne": 1 - } - }, - "ChatRestrictionStatus": { - "name": "ChatRestrictionStatus", - "items": { - "NotRestricted": 1, - "Restricted": 2, - "Unknown": 0 - } - }, - "ChatStyle": { - "name": "ChatStyle", - "items": { - "Bubble": 1, - "Classic": 0, - "ClassicAndBubble": 2 - } - }, - "ChatVersion": { - "name": "ChatVersion", - "items": { - "LegacyChatService": 0, - "TextChatService": 1 - } - }, - "ClientAnimatorThrottlingMode": { - "name": "ClientAnimatorThrottlingMode", - "items": { - "Default": 0, - "Disabled": 1, - "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 - } - }, - "CommandPermission": { - "name": "CommandPermission", - "items": { - "LocalUser": 1, - "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": { - "CameraToggle": 4, - "Classic": 1, - "Default": 0, - "Follow": 2, - "Orbital": 3 - } - }, - "ComputerMovementMode": { - "name": "ComputerMovementMode", - "items": { - "ClickToMove": 2, - "Default": 0, - "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, - "DisconnectDuplicateTicket": 265, - "DisconnectErrors": 256, - "DisconnectEvicted": 273, - "DisconnectHashTimeout": 269, - "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, - "PlacelaunchFlooded": 525, - "PlacelaunchGameEnded": 517, - "PlacelaunchGameFull": 518, - "PlacelaunchHashException": 527, - "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, - "TeleportGameEnded": 771, - "TeleportGameFull": 772, - "TeleportGameNotFound": 770, - "TeleportIsTeleporting": 775, - "TeleportUnauthorized": 773, - "TransportErrors": 1024, - "Unknown": 1 - } - }, - "ConnectionState": { - "name": "ConnectionState", - "items": { - "Connected": 0, - "Disconnected": 1 - } - }, - "ContentSourceType": { - "name": "ContentSourceType", - "items": { - "None": 0, - "Object": 2, - "Opaque": 3, - "Uri": 1 - } - }, - "ContextActionPriority": { - "name": "ContextActionPriority", - "items": { - "High": 3000, - "Low": 1000, - "Medium": 2000 - } - }, - "ContextActionResult": { - "name": "ContextActionResult", - "items": { - "Pass": 1, - "Sink": 0 - } - }, - "ControlMode": { - "name": "ControlMode", - "items": { - "Classic": 0, - "MouseLockSwitch": 1 - } - }, - "CoreGuiType": { - "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 - } - }, - "CreateOutfitFailure": { - "name": "CreateOutfitFailure", - "items": { - "InvalidName": 1, - "Other": 3, - "OutfitLimitReached": 2 - } - }, - "CreatorType": { - "name": "CreatorType", - "items": { - "Group": 1, - "User": 0 - } - }, - "CreatorTypeFilter": { - "name": "CreatorTypeFilter", - "items": { - "All": 2, - "Group": 1, - "User": 0 - } - }, - "CurrencyType": { - "name": "CurrencyType", - "items": { - "Default": 0, - "Robux": 1, - "Tix": 2 - } - }, - "CustomCameraMode": { - "name": "CustomCameraMode", - "items": { - "Classic": 1, - "Default": 0, - "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": { - "ClientRequest": 0, - "ConfigurationFailed": 6, - "Disconnected": 3, - "InvalidHost": 2, - "RpcError": 7, - "ServerProtocolMismatch": 5, - "ServerShutdown": 4, - "Timeout": 1 - } - }, - "DebuggerExceptionBreakMode": { - "name": "DebuggerExceptionBreakMode", - "items": { - "Always": 1, - "Never": 0, - "Unhandled": 2 - } - }, - "DebuggerFrameType": { - "name": "DebuggerFrameType", - "items": { - "C": 0, - "Lua": 1 - } - }, - "DebuggerPauseReason": { - "name": "DebuggerPauseReason", - "items": { - "Breakpoint": 2, - "Entrypoint": 5, - "Exception": 3, - "Requested": 1, - "SingleStep": 4, - "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, - "InvalidResponse": 3, - "InvalidState": 5, - "RpcError": 6, - "Success": 0, - "Timeout": 1 - } - }, - "DefaultScriptSyncFileType": { - "name": "DefaultScriptSyncFileType", - "items": { - "Lua": 0, - "Luau": 1 - } - }, - "DevCameraOcclusionMode": { - "name": "DevCameraOcclusionMode", - "items": { - "Invisicam": 1, - "Zoom": 0 - } - }, - "DevComputerCameraMovementMode": { - "name": "DevComputerCameraMovementMode", - "items": { - "CameraToggle": 4, - "Classic": 1, - "Follow": 2, - "Orbital": 3, - "UserChoice": 0 - } - }, - "DevComputerMovementMode": { - "name": "DevComputerMovementMode", - "items": { - "ClickToMove": 2, - "KeyboardMouse": 1, - "Scriptable": 3, - "UserChoice": 0 - } - }, - "DevTouchCameraMovementMode": { - "name": "DevTouchCameraMovementMode", - "items": { - "Classic": 1, - "Follow": 2, - "Orbital": 3, - "UserChoice": 0 - } - }, - "DevTouchMovementMode": { - "name": "DevTouchMovementMode", - "items": { - "ClickToMove": 4, - "DPad": 2, - "DynamicThumbstick": 6, - "Scriptable": 5, - "Thumbpad": 3, - "Thumbstick": 1, - "UserChoice": 0 - } - }, - "DeveloperMemoryTag": { - "name": "DeveloperMemoryTag", - "items": { - "Animation": 22, - "BaseParts": 7, - "GeometryCSG": 24, - "GraphicsMeshParts": 10, - "GraphicsParticles": 11, - "GraphicsParts": 12, - "GraphicsSlimModels": 25, - "GraphicsSolidModels": 8, - "GraphicsSpatialHash": 13, - "GraphicsTerrain": 14, - "GraphicsTexture": 15, - "GraphicsTextureCharacter": 16, - "Gui": 21, - "HttpCache": 1, - "Instances": 2, - "Internal": 0, - "LuaHeap": 4, - "Navigation": 23, - "PhysicsCollision": 6, - "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 - } - }, - "DeviceType": { - "name": "DeviceType", - "items": { - "Desktop": 1, - "Phone": 3, - "TV": 4, - "Tablet": 2, - "Unknown": 0 - } - }, - "DialogBehaviorType": { - "name": "DialogBehaviorType", - "items": { - "MultiplePlayers": 1, - "SinglePlayer": 0 - } - }, - "DialogPurpose": { - "name": "DialogPurpose", - "items": { - "Help": 1, - "Quest": 0, - "Shop": 2 - } - }, - "DialogTone": { - "name": "DialogTone", - "items": { - "Enemy": 2, - "Friendly": 1, - "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": { - "Height": 1, - "Width": 0 - } - }, - "DraftStatusCode": { - "name": "DraftStatusCode", - "items": { - "DraftCommitted": 3, - "DraftOutdated": 1, - "OK": 0, - "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": { - "Object": 0, - "World": 1 - } - }, - "DraggerMovementMode": { - "name": "DraggerMovementMode", - "items": { - "Geometric": 0, - "Physical": 1 - } - }, - "DraggingScrollBar": { - "name": "DraggingScrollBar", - "items": { - "Horizontal": 1, - "None": 0, - "Vertical": 2 - } - }, - "EasingDirection": { - "name": "EasingDirection", - "items": { - "In": 0, - "InOut": 2, - "Out": 1 - } - }, - "EasingStyle": { - "name": "EasingStyle", - "items": { - "Back": 2, - "Bounce": 6, - "Circular": 9, - "Cubic": 10, - "Elastic": 7, - "Exponential": 8, - "Linear": 0, - "Quad": 3, - "Quart": 4, - "Quint": 5, - "Sine": 1 - } - }, - "EditableStatus": { - "name": "EditableStatus", - "items": { - "Allowed": 1, - "Disallowed": 2, - "Unknown": 0 - } - }, - "ElasticBehavior": { - "name": "ElasticBehavior", - "items": { - "Always": 1, - "Never": 2, - "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": { - "Always": 2, - "DefaultAuto": 0, - "Disabled": 1, - "Skip16": 6, - "Skip2": 3, - "Skip4": 4, - "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": { - "Craters": 1, - "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": { - "Diagonal": 1, - "MaxAxis": 2, - "Vertical": 0 - } - }, - "FillDirection": { - "name": "FillDirection", - "items": { - "Horizontal": 0, - "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": { - "Accepted": 0, - "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": { - "AmaticSC": 21, - "Antique": 15, - "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, - "DenkOne": 24, - "Fantasy": 14, - "Fondamento": 25, - "FredokaOne": 26, - "Garamond": 8, - "Gotham": 17, - "GothamBlack": 20, - "GothamBold": 19, - "GothamMedium": 18, - "GrenzeGotisch": 27, - "Highway": 11, - "IndieFlower": 28, - "JosefinSans": 29, - "Jura": 30, - "Kalam": 31, - "Legacy": 0, - "LuckiestGuy": 32, - "Merriweather": 33, - "Michroma": 34, - "Nunito": 35, - "Oswald": 36, - "PatrickHand": 37, - "PermanentMarker": 38, - "Roboto": 39, - "RobotoCondensed": 40, - "RobotoMono": 41, - "Sarpanch": 42, - "SciFi": 12, - "SourceSans": 3, - "SourceSansBold": 4, - "SourceSansItalic": 6, - "SourceSansLight": 5, - "SourceSansSemibold": 16, - "SpecialElite": 43, - "TitilliumWeb": 44, - "Ubuntu": 45, - "Unknown": 100 - } - }, - "FontSize": { - "name": "FontSize", - "items": { - "Size10": 2, - "Size11": 3, - "Size12": 4, - "Size14": 5, - "Size18": 6, - "Size24": 7, - "Size28": 10, - "Size32": 11, - "Size36": 8, - "Size42": 12, - "Size48": 9, - "Size60": 13, - "Size8": 0, - "Size9": 1, - "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": { - "Brick": 1, - "Custom": 3, - "Plate": 2, - "Symmetric": 0 - } - }, - "FrameStyle": { - "name": "FrameStyle", - "items": { - "ChatBlue": 1, - "ChatGreen": 4, - "ChatRed": 5, - "Custom": 0, - "DropShadow": 6, - "RobloxRound": 3, - "RobloxSquare": 2 - } - }, - "FramerateManagerMode": { - "name": "FramerateManagerMode", - "items": { - "Automatic": 0, - "Off": 2, - "On": 1 - } - }, - "FriendRequestEvent": { - "name": "FriendRequestEvent", - "items": { - "Accept": 2, - "Deny": 3, - "Issue": 0, - "Revoke": 1 - } - }, - "FriendStatus": { - "name": "FriendStatus", - "items": { - "Friend": 2, - "FriendRequestReceived": 4, - "FriendRequestSent": 3, - "NotFriend": 1, - "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": { - "Error": 2, - "Passed": 0, - "Warning": 1 - } - }, - "GameAvatarType": { - "name": "GameAvatarType", - "items": { - "PlayerChoice": 2, - "R15": 1, - "R6": 0 - } - }, - "GamepadType": { - "name": "GamepadType", - "items": { - "PS4": 1, - "PS5": 2, - "Unknown": 0, - "XboxOne": 3 - } - }, - "GearGenreSetting": { - "name": "GearGenreSetting", - "items": { - "AllGenres": 0, - "MatchingGenreOnly": 1 - } - }, - "GearType": { - "name": "GearType", - "items": { - "BuildingTools": 7, - "Explosives": 2, - "MeleeWeapons": 0, - "MusicalInstruments": 5, - "NavigationEnhancers": 4, - "PowerUps": 3, - "RangedWeapons": 1, - "SocialItems": 6, - "Transport": 8 - } - }, - "GenerateMomentTextResult": { - "name": "GenerateMomentTextResult", - "items": { - "Failed": 2, - "Filtered": 3, - "Pending": 1, - "Success": 0 - } - }, - "Genre": { - "name": "Genre", - "items": { - "Adventure": 7, - "All": 0, - "Fantasy": 2, - "Funny": 9, - "Ninja": 4, - "Pirate": 6, - "Scary": 5, - "SciFi": 3, - "SkatePark": 12, - "Sports": 8, - "TownAndCity": 1, - "Tutorial": 13, - "War": 11, - "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, - "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": { - "Movement": 1, - "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 - } - }, - "HorizontalAlignment": { - "name": "HorizontalAlignment", - "items": { - "Center": 0, - "Left": 1, - "Right": 2 - } - }, - "HoverAnimateSpeed": { - "name": "HoverAnimateSpeed", - "items": { - "Fast": 3, - "Medium": 2, - "Slow": 1, - "VeryFast": 4, - "VerySlow": 0 - } - }, - "HttpCachePolicy": { - "name": "HttpCachePolicy", - "items": { - "DataOnly": 2, - "Default": 3, - "Full": 1, - "InternalRedirectRefresh": 4, - "None": 0 - } - }, - "HttpCompression": { - "name": "HttpCompression", - "items": { - "Gzip": 1, - "None": 0 - } - }, - "HttpContentType": { - "name": "HttpContentType", - "items": { - "ApplicationJson": 0, - "ApplicationUrlEncoded": 2, - "ApplicationXml": 1, - "TextPlain": 3, - "TextXml": 4 - } - }, - "HttpError": { - "name": "HttpError", - "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 - } - }, - "HttpRequestType": { - "name": "HttpRequestType", - "items": { - "Analytics": 23, - "Avatar": 16, - "Chat": 15, - "Default": 0, - "Localization": 25, - "MarketplaceService": 2, - "Players": 7 - } - }, - "HumanoidCollisionType": { - "name": "HumanoidCollisionType", - "items": { - "InnerBox": 1, - "OuterBox": 0 - } - }, - "HumanoidDisplayDistanceType": { - "name": "HumanoidDisplayDistanceType", - "items": { - "None": 2, - "Subject": 1, - "Viewer": 0 - } - }, - "HumanoidHealthDisplayType": { - "name": "HumanoidHealthDisplayType", - "items": { - "AlwaysOff": 2, - "AlwaysOn": 1, - "DisplayWhenDamaged": 0 - } - }, - "HumanoidRigType": { - "name": "HumanoidRigType", - "items": { - "R15": 1, - "R6": 0 - } - }, - "HumanoidStateType": { - "name": "HumanoidStateType", - "items": { - "Climbing": 12, - "Dead": 15, - "FallingDown": 0, - "Flying": 6, - "Freefall": 5, - "GettingUp": 2, - "Jumping": 3, - "Landed": 7, - "None": 18, - "Physics": 16, - "PlatformStanding": 14, - "Ragdoll": 1, - "Running": 8, - "RunningNoPhysics": 10, - "Seated": 13, - "StrafingNoPhysics": 11, - "Swimming": 4 - } - }, - "IKCollisionsMode": { - "name": "IKCollisionsMode", - "items": { - "IncludeContactedMechanisms": 2, - "NoCollisions": 0, - "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, - "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 - } - }, - "InOut": { - "name": "InOut", - "items": { - "Center": 2, - "Edge": 0, - "Inset": 1 - } - }, - "InfoType": { - "name": "InfoType", - "items": { - "Asset": 0, - "Bundle": 4, - "GamePass": 2, - "Product": 1, - "Subscription": 3 - } - }, - "InitialDockState": { - "name": "InitialDockState", - "items": { - "Bottom": 1, - "Float": 4, - "Left": 2, - "Right": 3, - "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": { - "Constant": 12, - "NoInput": 0, - "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": { - "Default": 0, - "Disabled": 1, - "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": { - "All": 0, - "None": 2, - "Surface": 1 - } - }, - "KeyCode": { - "name": "KeyCode", - "items": { - "A": 97, - "Ampersand": 38, - "Asterisk": 42, - "At": 64, - "B": 98, - "BackSlash": 92, - "Backquote": 96, - "Backspace": 8, - "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, - "CapsLock": 301, - "Caret": 94, - "Clear": 12, - "Colon": 58, - "Comma": 44, - "Compose": 314, - "D": 100, - "DPadDown": 1015, - "DPadLeft": 1012, - "DPadRight": 1013, - "DPadUp": 1014, - "Delete": 127, - "Dollar": 36, - "Down": 274, - "E": 101, - "Eight": 56, - "End": 279, - "Equals": 61, - "Escape": 27, - "Euro": 321, - "F": 102, - "F1": 282, - "F10": 291, - "F11": 292, - "F12": 293, - "F13": 294, - "F14": 295, - "F15": 296, - "F2": 283, - "F3": 284, - "F4": 285, - "F5": 286, - "F6": 287, - "F7": 288, - "F8": 289, - "F9": 290, - "Five": 53, - "Four": 52, - "G": 103, - "GreaterThan": 62, - "H": 104, - "Hash": 35, - "Help": 315, - "Home": 278, - "I": 105, - "Insert": 277, - "J": 106, - "K": 107, - "KeypadDivide": 267, - "KeypadEight": 264, - "KeypadEnter": 271, - "KeypadEquals": 272, - "KeypadFive": 261, - "KeypadFour": 260, - "KeypadMinus": 269, - "KeypadMultiply": 268, - "KeypadNine": 265, - "KeypadOne": 257, - "KeypadPeriod": 266, - "KeypadPlus": 270, - "KeypadSeven": 263, - "KeypadSix": 262, - "KeypadThree": 259, - "KeypadTwo": 258, - "KeypadZero": 256, - "L": 108, - "Left": 276, - "LeftAlt": 308, - "LeftBracket": 91, - "LeftControl": 306, - "LeftCurly": 123, - "LeftMeta": 310, - "LeftParenthesis": 40, - "LeftShift": 304, - "LeftSuper": 311, - "LessThan": 60, - "M": 109, - "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, - "P": 112, - "PageDown": 281, - "PageUp": 280, - "Pause": 19, - "Percent": 37, - "Period": 46, - "Pipe": 124, - "Plus": 43, - "Power": 320, - "Print": 316, - "Q": 113, - "Question": 63, - "Quote": 39, - "QuotedDouble": 34, - "R": 114, - "Return": 13, - "Right": 275, - "RightAlt": 307, - "RightBracket": 93, - "RightControl": 305, - "RightCurly": 125, - "RightMeta": 309, - "RightParenthesis": 41, - "RightShift": 303, - "RightSuper": 312, - "S": 115, - "ScrollLock": 302, - "Semicolon": 59, - "Seven": 55, - "Six": 54, - "Slash": 47, - "Space": 32, - "SysReq": 317, - "T": 116, - "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, - "Up": 273, - "V": 118, - "W": 119, - "World0": 160, - "World1": 161, - "World10": 170, - "World11": 171, - "World12": 172, - "World13": 173, - "World14": 174, - "World15": 175, - "World16": 176, - "World17": 177, - "World18": 178, - "World19": 179, - "World2": 162, - "World20": 180, - "World21": 181, - "World22": 182, - "World23": 183, - "World24": 184, - "World25": 185, - "World26": 186, - "World27": 187, - "World28": 188, - "World29": 189, - "World3": 163, - "World30": 190, - "World31": 191, - "World32": 192, - "World33": 193, - "World34": 194, - "World35": 195, - "World36": 196, - "World37": 197, - "World38": 198, - "World39": 199, - "World4": 164, - "World40": 200, - "World41": 201, - "World42": 202, - "World43": 203, - "World44": 204, - "World45": 205, - "World46": 206, - "World47": 207, - "World48": 208, - "World49": 209, - "World5": 165, - "World50": 210, - "World51": 211, - "World52": 212, - "World53": 213, - "World54": 214, - "World55": 215, - "World56": 216, - "World57": 217, - "World58": 218, - "World59": 219, - "World6": 166, - "World60": 220, - "World61": 221, - "World62": 222, - "World63": 223, - "World64": 224, - "World65": 225, - "World66": 226, - "World67": 227, - "World68": 228, - "World69": 229, - "World7": 167, - "World70": 230, - "World71": 231, - "World72": 232, - "World73": 233, - "World74": 234, - "World75": 235, - "World76": 236, - "World77": 237, - "World78": 238, - "World79": 239, - "World8": 168, - "World80": 240, - "World81": 241, - "World82": 242, - "World83": 243, - "World84": 244, - "World85": 245, - "World86": 246, - "World87": 247, - "World88": 248, - "World89": 249, - "World9": 169, - "World90": 250, - "World91": 251, - "World92": 252, - "World93": 253, - "World94": 254, - "World95": 255, - "X": 120, - "Y": 121, - "Z": 122, - "Zero": 48 - } - }, - "KeyCodeStringFormat": { - "name": "KeyCodeStringFormat", - "items": { - "Abbreviated": 1, - "Default": 0 - } - }, - "KeyInterpolationMode": { - "name": "KeyInterpolationMode", - "items": { - "Constant": 0, - "Cubic": 2, - "Linear": 1 - } - }, - "KeywordFilterType": { - "name": "KeywordFilterType", - "items": { - "Exclude": 1, - "Include": 0 - } - }, - "KnownWindow": { - "name": "KnownWindow", - "items": { - "Main": 0 - } - }, - "LeftRight": { - "name": "LeftRight", - "items": { - "Center": 1, - "Left": 0, - "Right": 2 - } - }, - "LexemeType": { - "name": "LexemeType", - "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 - } - }, - "Limb": { - "name": "Limb", - "items": { - "Head": 0, - "LeftArm": 2, - "LeftLeg": 4, - "RightArm": 3, - "RightLeg": 5, - "Torso": 1, - "Unknown": 6 - } - }, - "LineJoinMode": { - "name": "LineJoinMode", - "items": { - "Bevel": 1, - "Miter": 2, - "Round": 0 - } - }, - "ListDisplayMode": { - "name": "ListDisplayMode", - "items": { - "Horizontal": 0, - "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": { - "CFrame": 1, - "Camera": 0, - "ObjectCFrame": 3, - "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": { - "Default": 0, - "Disabled": 1, - "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": { - "Air": 1792, - "Asphalt": 1376, - "Basalt": 788, - "Brick": 848, - "Cardboard": 2304, - "Carpet": 2305, - "CeramicTiles": 2306, - "ClayRoofTiles": 2307, - "Cobblestone": 880, - "Concrete": 816, - "CorrodedMetal": 1040, - "CrackedLava": 804, - "DiamondPlate": 1056, - "Fabric": 1312, - "Foil": 1072, - "ForceField": 1584, - "Glacier": 1552, - "Glass": 1568, - "Granite": 832, - "Grass": 1280, - "Ground": 1360, - "Ice": 1536, - "LeafyGrass": 1284, - "Leather": 2309, - "Limestone": 820, - "Marble": 784, - "Metal": 1088, - "Mud": 1344, - "Neon": 288, - "Pavement": 836, - "Pebble": 864, - "Plaster": 2310, - "Plastic": 256, - "Rock": 896, - "RoofShingles": 2308, - "Rubber": 2311, - "Salt": 1392, - "Sand": 1296, - "Sandstone": 912, - "Slate": 800, - "SmoothPlastic": 272, - "Snow": 1328, - "Water": 2048, - "Wood": 512, - "WoodPlanks": 528 - } - }, - "MaterialPattern": { - "name": "MaterialPattern", - "items": { - "Organic": 1, - "Regular": 0 - } - }, - "MembershipType": { - "name": "MembershipType", - "items": { - "BuildersClub": 1, - "None": 0, - "OutrageousBuildersClub": 3, - "Premium": 4, - "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 - } - }, - "MeshPartHeadsAndAccessories": { - "name": "MeshPartHeadsAndAccessories", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "MeshScaleUnit": { - "name": "MeshScaleUnit", - "items": { - "CM": 2, - "Foot": 4, - "Inch": 5, - "MM": 3, - "Meter": 1, - "Stud": 0 - } - }, - "MeshType": { - "name": "MeshType", - "items": { - "Brick": 6, - "CornerWedge": 11, - "Cylinder": 4, - "FileMesh": 5, - "Head": 0, - "ParallelRamp": 9, - "Prism": 7, - "Pyramid": 8, - "RightAngleRamp": 10, - "Sphere": 3, - "Torso": 1, - "Wedge": 2 - } - }, - "MessageType": { - "name": "MessageType", - "items": { - "MessageError": 3, - "MessageInfo": 1, - "MessageOutput": 0, - "MessageWarning": 2 - } - }, - "ModelLevelOfDetail": { - "name": "ModelLevelOfDetail", - "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": { - "Alt": 2, - "Ctrl": 1, - "Meta": 3, - "Shift": 0 - } - }, - "MouseBehavior": { - "name": "MouseBehavior", - "items": { - "Default": 0, - "LockCenter": 1, - "LockCurrentPosition": 2 - } - }, - "MoveState": { - "name": "MoveState", - "items": { - "AirFree": 4, - "Coasting": 1, - "Pushing": 2, - "Stopped": 0, - "Stopping": 3 - } - }, - "MuteState": { - "name": "MuteState", - "items": { - "Muted": 1, - "Unmuted": 0 - } - }, - "NameOcclusion": { - "name": "NameOcclusion", - "items": { - "EnemyOcclusion": 1, - "NoOcclusion": 0, - "OccludeAll": 2 - } - }, - "NegateOperationHiddenHistory": { - "name": "NegateOperationHiddenHistory", - "items": { - "NegatedIntersection": 2, - "NegatedUnion": 1, - "None": 0 - } - }, - "NetworkOwnership": { - "name": "NetworkOwnership", - "items": { - "Automatic": 0, - "Manual": 1, - "OnContact": 2 - } - }, - "NetworkStatus": { - "name": "NetworkStatus", - "items": { - "Connected": 1, - "Disconnected": 2, - "Unknown": 0 - } - }, - "NoiseType": { - "name": "NoiseType", - "items": { - "SimplexGabor": 0 - } - }, - "NormalId": { - "name": "NormalId", - "items": { - "Back": 2, - "Bottom": 4, - "Front": 5, - "Left": 3, - "Right": 0, - "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": { - "OneAttachment": 0, - "TwoAttachment": 1 - } - }, - "OutfitSource": { - "name": "OutfitSource", - "items": { - "All": 1, - "Created": 2, - "Purchased": 3 - } - }, - "OutfitType": { - "name": "OutfitType", - "items": { - "All": 1, - "Avatar": 2, - "DynamicHead": 3, - "Makeup": 5, - "Shoes": 4 - } - }, - "OutputLayoutMode": { - "name": "OutputLayoutMode", - "items": { - "Horizontal": 0, - "Vertical": 1 - } - }, - "OverrideMouseIconBehavior": { - "name": "OverrideMouseIconBehavior", - "items": { - "ForceHide": 2, - "ForceShow": 1, - "None": 0 - } - }, - "PackagePermission": { - "name": "PackagePermission", - "items": { - "Edit": 4, - "NoAccess": 1, - "None": 0, - "Own": 5, - "Revoked": 2, - "UseView": 3 - } - }, - "PageMilestoneType": { - "name": "PageMilestoneType", - "items": { - "FunctionallyReady": 2, - "Interactive": 0, - "SurfaceMounted": 1, - "SurfaceReady": 3 - } - }, - "PageType": { - "name": "PageType", - "items": { - "AvatarEditor": 0, - "AvatarMarketplace": 3, - "ExperienceDetail": 2, - "Party": 1 - } - }, - "PartType": { - "name": "PartType", - "items": { - "Ball": 0, - "Block": 1, - "CornerWedge": 4, - "Cylinder": 2, - "Wedge": 3 - } - }, - "ParticleEmitterShape": { - "name": "ParticleEmitterShape", - "items": { - "Box": 0, - "Cylinder": 2, - "Disc": 3, - "Sphere": 1 - } - }, - "ParticleEmitterShapeInOut": { - "name": "ParticleEmitterShapeInOut", - "items": { - "InAndOut": 2, - "Inward": 1, - "Outward": 0 - } - }, - "ParticleEmitterShapeStyle": { - "name": "ParticleEmitterShapeStyle", - "items": { - "Surface": 1, - "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": { - "FacingCamera": 0, - "FacingCameraWorldUp": 1, - "VelocityParallel": 2, - "VelocityPerpendicular": 3 - } - }, - "PathStatus": { - "name": "PathStatus", - "items": { - "ClosestNoPath": 1, - "ClosestOutOfRange": 2, - "FailFinishNotEmpty": 4, - "FailStartNotEmpty": 3, - "NoPath": 5, - "Success": 0 - } - }, - "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": { - "Game": 0, - "Roblox": 4, - "RobloxGame": 1, - "RobloxScript": 2, - "Studio": 3 - } - }, - "PhysicalConstraintType": { - "name": "PhysicalConstraintType", - "items": { - "AnimationConstraint": 0, - "Motor6D": 1 - } - }, - "PhysicsSimulationRate": { - "name": "PhysicsSimulationRate", - "items": { - "Fixed120Hz": 1, - "Fixed240Hz": 0, - "Fixed60Hz": 2 - } - }, - "PhysicsSteppingMethod": { - "name": "PhysicsSteppingMethod", - "items": { - "Adaptive": 2, - "Default": 0, - "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": { - "Android": 3, - "AndroidTV": 11, - "BeOS": 17, - "Chromecast": 12, - "DOS": 16, - "IOS": 2, - "Linux": 13, - "MetaOS": 20, - "NX": 9, - "None": 22, - "OSX": 1, - "Ouya": 10, - "PS3": 6, - "PS4": 5, - "PS5": 19, - "SteamOS": 14, - "UWP": 18, - "Web": 21, - "WebOS": 15, - "WiiU": 8, - "Windows": 0, - "XBox360": 7, - "XBoxOne": 4 - } - }, - "PlaybackState": { - "name": "PlaybackState", - "items": { - "Begin": 0, - "Cancelled": 5, - "Completed": 4, - "Delayed": 1, - "Paused": 3, - "Playing": 2 - } - }, - "PlayerActions": { - "name": "PlayerActions", - "items": { - "CharacterBackward": 1, - "CharacterForward": 0, - "CharacterJump": 4, - "CharacterLeft": 2, - "CharacterRight": 3 - } - }, - "PlayerCharacterDestroyBehavior": { - "name": "PlayerCharacterDestroyBehavior", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "PlayerChatType": { - "name": "PlayerChatType", - "items": { - "All": 0, - "Team": 1, - "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": { - "In": 0, - "InOut": 2, - "Out": 1 - } - }, - "PoseEasingStyle": { - "name": "PoseEasingStyle", - "items": { - "Bounce": 4, - "Constant": 1, - "Cubic": 3, - "CubicV2": 5, - "Elastic": 2, - "Linear": 0 - } - }, - "PositionAlignmentMode": { - "name": "PositionAlignmentMode", - "items": { - "OneAttachment": 0, - "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": { - "Admin": 240, - "Banned": 0, - "Member": 128, - "Owner": 255, - "Visitor": 10 - } - }, - "ProductLocationRestriction": { - "name": "ProductLocationRestriction", - "items": { - "AllGames": 2, - "AllowedGames": 1, - "AvatarShop": 0 - } - }, - "ProductPurchaseChannel": { - "name": "ProductPurchaseChannel", - "items": { - "AdReward": 3, - "CommerceProduct": 4, - "ExperienceDetailsPage": 2, - "InExperience": 1 - } - }, - "ProductPurchaseDecision": { - "name": "ProductPurchaseDecision", - "items": { - "NotProcessedYet": 0, - "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": { - "AlwaysShow": 2, - "OneGlobally": 1, - "OnePerButton": 0 - } - }, - "ProximityPromptInputType": { - "name": "ProximityPromptInputType", - "items": { - "Gamepad": 1, - "Keyboard": 0, - "Touch": 2 - } - }, - "ProximityPromptStyle": { - "name": "ProximityPromptStyle", - "items": { - "Custom": 1, - "Default": 0 - } - }, - "PurchaseOption": { - "name": "PurchaseOption", - "items": { - "Permanent": 2, - "TimedOption": 1 - } - }, - "QualityLevel": { - "name": "QualityLevel", - "items": { - "Automatic": 0, - "Level01": 1, - "Level02": 2, - "Level03": 3, - "Level04": 4, - "Level05": 5, - "Level06": 6, - "Level07": 7, - "Level08": 8, - "Level09": 9, - "Level10": 10, - "Level11": 11, - "Level12": 12, - "Level13": 13, - "Level14": 14, - "Level15": 15, - "Level16": 16, - "Level17": 17, - "Level18": 18, - "Level19": 19, - "Level20": 20, - "Level21": 21 - } - }, - "QueueDecision": { - "name": "QueueDecision", - "items": { - "Commit": 0, - "Defer": 1 - } - }, - "R15CollisionType": { - "name": "R15CollisionType", - "items": { - "InnerBox": 1, - "OuterBox": 0 - } - }, - "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 - } - }, - "RenderFidelity": { - "name": "RenderFidelity", - "items": { - "Automatic": 0, - "Performance": 2, - "Precise": 1 - } - }, - "RenderPriority": { - "name": "RenderPriority", - "items": { - "Camera": 200, - "Character": 300, - "First": 0, - "Input": 100, - "Last": 2000 - } - }, - "RenderingCacheOptimizationMode": { - "name": "RenderingCacheOptimizationMode", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "RenderingTestComparisonMethod": { - "name": "RenderingTestComparisonMethod", - "items": { - "diff": 1, - "psnr": 0 - } - }, - "ReplicateInstanceDestroySetting": { - "name": "ReplicateInstanceDestroySetting", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "ResamplerMode": { - "name": "ResamplerMode", - "items": { - "Default": 0, - "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": { - "Default": 0, - "Done": 1, - "Go": 2, - "Next": 3, - "Search": 4, - "Send": 5 - } - }, - "ReverbType": { - "name": "ReverbType", - "items": { - "Alley": 15, - "Arena": 10, - "Auditorium": 7, - "Bathroom": 4, - "CarpettedHallway": 12, - "Cave": 9, - "City": 17, - "ConcertHall": 8, - "Forest": 16, - "GenericReverb": 1, - "Hallway": 13, - "Hangar": 11, - "LivingRoom": 5, - "Mountains": 18, - "NoReverb": 0, - "PaddedCell": 2, - "ParkingLot": 21, - "Plain": 20, - "Quarry": 19, - "Room": 3, - "SewerPipe": 22, - "StoneCorridor": 14, - "StoneRoom": 6, - "UnderWater": 23 - } - }, - "ReviewableContentState": { - "name": "ReviewableContentState", - "items": { - "Completed": 1, - "Failed": 2, - "Pending": 0 - } - }, - "RibbonTool": { - "name": "RibbonTool", - "items": { - "ColorPicker": 5, - "Group": 7, - "MaterialPicker": 6, - "Move": 3, - "None": 9, - "PivotEditor": 10, - "Rotate": 2, - "Scale": 1, - "Select": 0, - "Transform": 4, - "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 - } - }, - "RollOffMode": { - "name": "RollOffMode", - "items": { - "Inverse": 0, - "InverseTapered": 3, - "Linear": 1, - "LinearSquare": 2 - } - }, - "RolloutState": { - "name": "RolloutState", - "items": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "RotationOrder": { - "name": "RotationOrder", - "items": { - "XYZ": 0, - "XZY": 1, - "YXZ": 3, - "YZX": 2, - "ZXY": 4, - "ZYX": 5 - } - }, - "RotationType": { - "name": "RotationType", - "items": { - "CameraRelative": 1, - "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": { - "Aggregate": 0, - "Hybrid": 2, - "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": { - "SaveAll": 2, - "SaveGame": 1, - "SaveWorld": 0 - } - }, - "SavedQualitySetting": { - "name": "SavedQualitySetting", - "items": { - "Automatic": 0, - "QualityLevel1": 1, - "QualityLevel10": 10, - "QualityLevel2": 2, - "QualityLevel3": 3, - "QualityLevel4": 4, - "QualityLevel5": 5, - "QualityLevel6": 6, - "QualityLevel7": 7, - "QualityLevel8": 8, - "QualityLevel9": 9 - } - }, - "ScaleType": { - "name": "ScaleType", - "items": { - "Crop": 4, - "Fit": 3, - "Slice": 1, - "Stretch": 0, - "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": { - "LandscapeLeft": 0, - "LandscapeRight": 1, - "LandscapeSensor": 2, - "Portrait": 3, - "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": { - "Always": 2, - "None": 0, - "ScrollBar": 1 - } - }, - "ScrollState": { - "name": "ScrollState", - "items": { - "Idle": 0, - "Scrolling": 1 - } - }, - "ScrollingDirection": { - "name": "ScrollingDirection", - "items": { - "X": 1, - "XY": 4, - "Y": 2 - } - }, - "SecurityCapability": { - "name": "SecurityCapability", - "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 - } - }, - "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": { - "RelativeXX": 1, - "RelativeXY": 0, - "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": { - "Ascending": 0, - "Descending": 1 - } - }, - "SortOrder": { - "name": "SortOrder", - "items": { - "Custom": 1, - "LayoutOrder": 2, - "Name": 0 - } - }, - "SpecialKey": { - "name": "SpecialKey", - "items": { - "ChatHotkey": 5, - "End": 2, - "Home": 1, - "Insert": 0, - "PageDown": 4, - "PageUp": 3 - } - }, - "StartCorner": { - "name": "StartCorner", - "items": { - "BottomLeft": 2, - "BottomRight": 3, - "TopLeft": 0, - "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": { - "Confusion": 1, - "Poison": 0 - } - }, - "StepFrequency": { - "name": "StepFrequency", - "items": { - "Hz1": 5, - "Hz10": 3, - "Hz15": 2, - "Hz30": 1, - "Hz5": 4, - "Hz60": 0 - } - }, - "StreamOutBehavior": { - "name": "StreamOutBehavior", - "items": { - "Default": 0, - "LowMemory": 1, - "Opportunistic": 2 - } - }, - "StreamingIntegrityMode": { - "name": "StreamingIntegrityMode", - "items": { - "Default": 0, - "Disabled": 1, - "MinimumRadiusPause": 2, - "PauseOutsideLoadedArea": 3 - } - }, - "StreamingPauseMode": { - "name": "StreamingPauseMode", - "items": { - "ClientPhysicsPause": 2, - "Default": 0, - "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 - } - }, - "StudioDataModelType": { - "name": "StudioDataModelType", - "items": { - "Edit": 0, - "None": 4, - "PlayClient": 1, - "PlayServer": 2, - "Standalone": 3 - } - }, - "StudioPlaceUpdateFailureReason": { - "name": "StudioPlaceUpdateFailureReason", - "items": { - "Other": 0, - "TeamCreateConflict": 1 - } - }, - "StudioScriptEditorColorCategories": { - "name": "StudioScriptEditorColorCategories", - "items": { - "AICOOverlayButtonBackground": 43, - "AICOOverlayButtonBackgroundHover": 44, - "AICOOverlayButtonBackgroundPressed": 45, - "AICOOverlayText": 42, - "ActiveLine": 27, - "Background": 17, - "Bool": 10, - "Bracket": 31, - "Builtin": 6, - "Comment": 4, - "DebuggerCurrentLine": 28, - "DebuggerErrorLine": 29, - "Default": 0, - "DocViewCodeBackground": 41, - "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, - "Method": 7, - "Nil": 9, - "Number": 2, - "Operator": 1, - "Property": 8, - "ReviewableChangeAddedText": 47, - "ReviewableChangeRemovedText": 48, - "Ruler": 30, - "SelectionBackground": 19, - "SelectionText": 18, - "Self": 13, - "String": 3, - "TODO": 16, - "Type": 32, - "Warning": 22, - "Whitespace": 26 - } - }, - "StudioScriptEditorColorPresets": { - "name": "StudioScriptEditorColorPresets", - "items": { - "Custom": 3, - "Extra1": 1, - "Extra2": 2, - "RobloxDefault": 0 - } - }, - "StudioStyleGuideColor": { - "name": "StudioStyleGuideColor", - "items": { - "AICOOverlayButtonBackground": 129, - "AICOOverlayButtonBackgroundHover": 130, - "AICOOverlayButtonBackgroundPressed": 131, - "AICOOverlayText": 128, - "AttributeCog": 119, - "Border": 31, - "BreakpointMarker": 136, - "BrightText": 40, - "Button": 17, - "ButtonBorder": 91, - "ButtonText": 92, - "CategoryItem": 24, - "ChatIncomingBgColor": 85, - "ChatIncomingTextColor": 86, - "ChatModeratedMessageColor": 89, - "ChatOutgoingBgColor": 87, - "ChatOutgoingTextColor": 88, - "CheckedFieldBackground": 94, - "CheckedFieldBorder": 95, - "CheckedFieldIndicator": 96, - "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, - "Dropdown": 2, - "EmulatorBar": 27, - "EmulatorDropDown": 28, - "ErrorText": 44, - "FilterButtonAccent": 12, - "FilterButtonBorder": 13, - "FilterButtonBorderAlt": 14, - "FilterButtonChecked": 11, - "FilterButtonDefault": 9, - "FilterButtonHover": 10, - "GameSettingsTableItem": 25, - "GameSettingsTooltip": 26, - "HeaderSection": 97, - "InfoBarWarningBackground": 105, - "InfoBarWarningText": 106, - "InfoText": 45, - "InputFieldBackground": 21, - "InputFieldBorder": 93, - "Item": 22, - "Light": 34, - "LinkText": 42, - "MainBackground": 0, - "MainButton": 18, - "MainText": 37, - "Mid": 36, - "Midlight": 98, - "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, - "ScrollBar": 5, - "ScrollBarBackground": 6, - "SensitiveText": 46, - "Separator": 90, - "Shadow": 33, - "StatusBar": 99, - "SubText": 38, - "Tab": 8, - "TabBar": 7, - "TableItem": 23, - "Titlebar": 1, - "TitlebarText": 39, - "Tooltip": 3, - "ViewPortBackground": 20, - "WarningText": 43 - } - }, - "StudioStyleGuideModifier": { - "name": "StudioStyleGuideModifier", - "items": { - "Default": 0, - "Disabled": 3, - "Hover": 4, - "Pressed": 2, - "Selected": 1 - } - }, - "Style": { - "name": "Style", - "items": { - "AlternatingSupports": 0, - "BridgeStyleSupports": 1, - "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": { - "Hinge": 1, - "Motor": 3, - "None": 0, - "SteppingMotor": 2 - } - }, - "SurfaceGuiShape": { - "name": "SurfaceGuiShape", - "items": { - "CurvedHorizontally": 1, - "Flat": 0 - } - }, - "SurfaceGuiSizingMode": { - "name": "SurfaceGuiSizingMode", - "items": { - "FixedSize": 0, - "PixelsPerStud": 1 - } - }, - "SurfaceType": { - "name": "SurfaceType", - "items": { - "Glue": 1, - "Hinge": 6, - "Inlet": 4, - "Motor": 7, - "Smooth": 0, - "SmoothNoOutlines": 10, - "SteppingMotor": 8, - "Studs": 3, - "Universal": 5, - "Weld": 2 - } - }, - "SwipeDirection": { - "name": "SwipeDirection", - "items": { - "Down": 3, - "Left": 1, - "None": 4, - "Right": 0, - "Up": 2 - } - }, - "SystemThemeValue": { - "name": "SystemThemeValue", - "items": { - "dark": 2, - "error": 0, - "light": 1, - "systemDark": 4, - "systemLight": 3 - } - }, - "TableMajorAxis": { - "name": "TableMajorAxis", - "items": { - "ColumnMajor": 1, - "RowMajor": 0 - } - }, - "TeamCreateErrorState": { - "name": "TeamCreateErrorState", - "items": { - "NoError": 3, - "PlaceSizeApproachingLimit": 1, - "PlaceSizeTooLarge": 0, - "PlaceUploadFailing": 2 - } - }, - "Technology": { - "name": "Technology", - "items": { - "Compatibility": 2, - "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 - } - }, - "TeleportResult": { - "name": "TeleportResult", - "items": { - "Failure": 1, - "Flooded": 6, - "GameEnded": 3, - "GameFull": 4, - "GameNotFound": 2, - "IsTeleporting": 7, - "Success": 0, - "Unauthorized": 5 - } - }, - "TeleportState": { - "name": "TeleportState", - "items": { - "Failed": 3, - "InProgress": 4, - "RequestedFromServer": 0, - "Started": 1, - "WaitingForServer": 2 - } - }, - "TeleportType": { - "name": "TeleportType", - "items": { - "ToInstance": 1, - "ToInstanceBack": 4, - "ToPlace": 0, - "ToReservedServer": 2, - "ToVIPServer": 3 - } - }, - "TerrainAcquisitionMethod": { - "name": "TerrainAcquisitionMethod", - "items": { - "Convert": 5, - "EditAddTool": 6, - "EditReplaceTool": 8, - "EditSeaLevelTool": 7, - "Generate": 3, - "Import": 4, - "Legacy": 1, - "None": 0, - "Other": 11, - "RegionFillTool": 9, - "RegionPasteTool": 10, - "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 - } - }, - "TextFilterContext": { - "name": "TextFilterContext", - "items": { - "PrivateChat": 2, - "PublicChat": 1 - } - }, - "TextInputType": { - "name": "TextInputType", - "items": { - "Default": 0, - "Email": 3, - "NewPassword": 9, - "NewPasswordShown": 10, - "NoSuggestions": 1, - "Number": 2, - "OneTimePassword": 8, - "Password": 5, - "PasswordShown": 6, - "Phone": 4, - "Username": 7 - } - }, - "TextTruncate": { - "name": "TextTruncate", - "items": { - "AtEnd": 1, - "None": 0, - "SplitWord": 2 - } - }, - "TextXAlignment": { - "name": "TextXAlignment", - "items": { - "Center": 2, - "Left": 0, - "Right": 1 - } - }, - "TextYAlignment": { - "name": "TextYAlignment", - "items": { - "Bottom": 2, - "Center": 1, - "Top": 0 - } - }, - "TextureMode": { - "name": "TextureMode", - "items": { - "Static": 2, - "Stretch": 0, - "Wrap": 1 - } - }, - "TextureQueryType": { - "name": "TextureQueryType", - "items": { - "Humanoid": 2, - "HumanoidOrphaned": 3, - "NonHumanoid": 0, - "NonHumanoidOrphaned": 1 - } - }, - "ThreadPoolConfig": { - "name": "ThreadPoolConfig", - "items": { - "Auto": 0, - "PerCore1": 101, - "PerCore2": 102, - "PerCore3": 103, - "PerCore4": 104, - "Threads1": 1, - "Threads16": 16, - "Threads2": 2, - "Threads3": 3, - "Threads4": 4, - "Threads8": 8 - } - }, - "ThrottlingPriority": { - "name": "ThrottlingPriority", - "items": { - "Default": 0, - "ElevatedOnServer": 1, - "Extreme": 2 - } - }, - "ThumbnailSize": { - "name": "ThumbnailSize", - "items": { - "Size100x100": 4, - "Size150x150": 5, - "Size180x180": 1, - "Size352x352": 6, - "Size420x420": 2, - "Size48x48": 0, - "Size60x60": 3 - } - }, - "ThumbnailType": { - "name": "ThumbnailType", - "items": { - "AvatarBust": 1, - "AvatarThumbnail": 2, - "HeadShot": 0 - } - }, - "TickCountSampleMethod": { - "name": "TickCountSampleMethod", - "items": { - "Benchmark": 1, - "Fast": 0, - "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": { - "Bottom": 2, - "Center": 1, - "Top": 0 - } - }, - "TouchCameraMovementMode": { - "name": "TouchCameraMovementMode", - "items": { - "Classic": 1, - "Default": 0, - "Follow": 2, - "Orbital": 3 - } - }, - "TouchMovementMode": { - "name": "TouchMovementMode", - "items": { - "ClickToMove": 4, - "DPad": 2, - "Default": 0, - "DynamicThumbstick": 5, - "Thumbpad": 3, - "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": { - "False": 2, - "True": 1, - "Unknown": 0 - } - }, - "TweenStatus": { - "name": "TweenStatus", - "items": { - "Canceled": 0, - "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": { - "Dark": 1, - "Light": 0 - } - }, - "UiMessageType": { - "name": "UiMessageType", - "items": { - "UiMessageError": 0, - "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": { - "Begin": 0, - "Cancel": 3, - "Change": 1, - "End": 2, - "None": 4 - } - }, - "UserInputType": { - "name": "UserInputType", - "items": { - "Accelerometer": 10, - "Focus": 9, - "Gamepad1": 12, - "Gamepad2": 13, - "Gamepad3": 14, - "Gamepad4": 15, - "Gamepad5": 16, - "Gamepad6": 17, - "Gamepad7": 18, - "Gamepad8": 19, - "Gyro": 11, - "InputMethod": 21, - "Keyboard": 8, - "MouseButton1": 0, - "MouseButton2": 1, - "MouseButton3": 2, - "MouseMovement": 4, - "MouseWheel": 3, - "None": 22, - "TextInput": 20, - "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": { - "Left": 0, - "Right": 1 - } - }, - "VRTouchpadMode": { - "name": "VRTouchpadMode", - "items": { - "ABXY": 2, - "Touch": 0, - "VirtualThumbstick": 1 - } - }, - "VelocityConstraintMode": { - "name": "VelocityConstraintMode", - "items": { - "Line": 0, - "Plane": 1, - "Vector": 2 - } - }, - "VerifiedLevel": { - "name": "VerifiedLevel", - "items": { - "High": 1, - "Low": 0 - } - }, - "VerticalAlignment": { - "name": "VerticalAlignment", - "items": { - "Bottom": 2, - "Center": 0, - "Top": 1 - } - }, - "VerticalScrollBarPosition": { - "name": "VerticalScrollBarPosition", - "items": { - "Left": 1, - "Right": 0 - } - }, - "VibrationMotor": { - "name": "VibrationMotor", - "items": { - "Large": 0, - "LeftHand": 4, - "LeftTrigger": 2, - "RightHand": 5, - "RightTrigger": 3, - "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": { - "Default": 0, - "Disabled": 1, - "Enabled": 2 - } - }, - "VirtualInputMode": { - "name": "VirtualInputMode", - "items": { - "None": 0, - "Playing": 2, - "Recording": 1 - } - }, - "VoiceChatDistanceAttenuationType": { - "name": "VoiceChatDistanceAttenuationType", - "items": { - "Inverse": 0, - "Legacy": 1 - } - }, - "VoiceChatState": { - "name": "VoiceChatState", - "items": { - "Ended": 5, - "Failed": 6, - "Idle": 0, - "Joined": 3, - "Joining": 1, - "JoiningRetry": 2, - "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": { - "NegX": 0, - "NegY": 2, - "NegZ": 4, - "X": 1, - "Y": 3, - "Z": 5 - } - }, - "WaterForce": { - "name": "WaterForce", - "items": { - "Max": 4, - "Medium": 2, - "None": 0, - "Small": 1, - "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 - } - }, - "WrapTargetDebugMode": { - "name": "WrapTargetDebugMode", - "items": { - "None": 0, - "OuterCageDetail": 8, - "PreWrapDeformerCage": 9, - "Rbf": 7, - "TargetCageCompressed": 2, - "TargetCageInterface": 3, - "TargetCageOriginal": 1, - "TargetLayerCageCompressed": 5, - "TargetLayerCageOriginal": 4, - "TargetLayerInterface": 6 - } - }, - "ZIndexBehavior": { - "name": "ZIndexBehavior", - "items": { - "Global": 0, - "Sibling": 1 - } - } - } -} \ No newline at end of file diff --git a/rojo-test/syncback-tests/csv/input-project/default.project.json b/plugin/rbx_dom_lua/default.project.json similarity index 60% rename from rojo-test/syncback-tests/csv/input-project/default.project.json rename to plugin/rbx_dom_lua/default.project.json index da44ea35..2ecfe52b 100644 --- a/rojo-test/syncback-tests/csv/input-project/default.project.json +++ b/plugin/rbx_dom_lua/default.project.json @@ -1,5 +1,5 @@ { - "name": "csv", + "name": "rbx_dom_lua", "tree": { "$path": "src" } diff --git a/plugin/rbx_dom_lua/src/EncodedValue.lua b/plugin/rbx_dom_lua/src/EncodedValue.lua new file mode 100644 index 00000000..a36de63b --- /dev/null +++ b/plugin/rbx_dom_lua/src/EncodedValue.lua @@ -0,0 +1,242 @@ +local base64 = require(script.Parent.base64) + +local function identity(...) + return ... +end + +local function unpackDecoder(f) + return function(value) + return f(unpack(value)) + end +end + +local function serializeFloat(value) + -- TODO: Figure out a better way to serialize infinity and NaN, neither of + -- which fit into JSON. + if value == math.huge or value == -math.huge then + return 999999999 * math.sign(value) + end + + return value +end + +local encoders +encoders = { + Bool = identity, + Content = identity, + Float32 = serializeFloat, + Float64 = serializeFloat, + Int32 = identity, + Int64 = identity, + String = identity, + + BinaryString = base64.encode, + SharedString = base64.encode, + + BrickColor = function(value) + return value.Number + end, + + CFrame = function(value) + return {value:GetComponents()} + end, + Color3 = function(value) + return {value.r, value.g, value.b} + end, + NumberRange = function(value) + return {value.Min, value.Max} + end, + NumberSequence = function(value) + local keypoints = {} + + for index, keypoint in ipairs(value.Keypoints) do + keypoints[index] = { + Time = keypoint.Time, + Value = keypoint.Value, + Envelope = keypoint.Envelope, + } + end + + return { + Keypoints = keypoints, + } + end, + ColorSequence = function(value) + local keypoints = {} + + for index, keypoint in ipairs(value.Keypoints) do + keypoints[index] = { + Time = keypoint.Time, + Color = encoders.Color3(keypoint.Value), + } + end + + return { + Keypoints = keypoints, + } + end, + Rect = function(value) + return { + Min = {value.Min.X, value.Min.Y}, + Max = {value.Max.X, value.Max.Y}, + } + end, + UDim = function(value) + return {value.Scale, value.Offset} + end, + UDim2 = function(value) + return {value.X.Scale, value.X.Offset, value.Y.Scale, value.Y.Offset} + end, + Vector2 = function(value) + return { + serializeFloat(value.X), + serializeFloat(value.Y), + } + end, + Vector2int16 = function(value) + return {value.X, value.Y} + end, + Vector3 = function(value) + return { + serializeFloat(value.X), + serializeFloat(value.Y), + serializeFloat(value.Z), + } + end, + Vector3int16 = function(value) + return {value.X, value.Y, value.Z} + end, + + PhysicalProperties = function(value) + if value == nil then + return nil + else + return { + Density = value.Density, + Friction = value.Friction, + Elasticity = value.Elasticity, + FrictionWeight = value.FrictionWeight, + ElasticityWeight = value.ElasticityWeight, + } + end + end, + + Ref = function(value) + return nil + end, +} + +local decoders = { + Bool = identity, + Content = identity, + Enum = identity, + Float32 = identity, + Float64 = identity, + Int32 = identity, + Int64 = identity, + String = identity, + + BinaryString = base64.decode, + SharedString = base64.decode, + + BrickColor = BrickColor.new, + + CFrame = unpackDecoder(CFrame.new), + Color3 = unpackDecoder(Color3.new), + Color3uint8 = unpackDecoder(Color3.fromRGB), + NumberRange = unpackDecoder(NumberRange.new), + UDim = unpackDecoder(UDim.new), + UDim2 = unpackDecoder(UDim2.new), + Vector2 = unpackDecoder(Vector2.new), + Vector2int16 = unpackDecoder(Vector2int16.new), + Vector3 = unpackDecoder(Vector3.new), + Vector3int16 = unpackDecoder(Vector3int16.new), + + Rect = function(value) + return Rect.new(value.Min[1], value.Min[2], value.Max[1], value.Max[2]) + end, + + NumberSequence = function(value) + local keypoints = {} + + for index, keypoint in ipairs(value.Keypoints) do + keypoints[index] = NumberSequenceKeypoint.new( + keypoint.Time, + keypoint.Value, + keypoint.Envelope + ) + end + + return NumberSequence.new(keypoints) + end, + + ColorSequence = function(value) + local keypoints = {} + + for index, keypoint in ipairs(value.Keypoints) do + keypoints[index] = ColorSequenceKeypoint.new( + keypoint.Time, + Color3.new(unpack(keypoint.Color)) + ) + end + + return ColorSequence.new(keypoints) + end, + + PhysicalProperties = function(properties) + if properties == nil then + return nil + else + return PhysicalProperties.new( + properties.Density, + properties.Friction, + properties.Elasticity, + properties.FrictionWeight, + properties.ElasticityWeight + ) + end + end, + + Ref = function() + return nil + end, +} + +local EncodedValue = {} + +function EncodedValue.decode(encodedValue) + local decoder = decoders[encodedValue.Type] + if decoder ~= nil then + return true, decoder(encodedValue.Value) + end + + return false, "Couldn't decode value " .. tostring(encodedValue.Type) +end + +function EncodedValue.encode(rbxValue, propertyType) + assert(propertyType ~= nil, "Property type descriptor is required") + + if propertyType.type == "Data" then + local encoder = encoders[propertyType.name] + + if encoder == nil then + return false, ("Missing encoder for property type %q"):format(propertyType.name) + end + + if encoder ~= nil then + return true, { + Type = propertyType.name, + Value = encoder(rbxValue), + } + end + elseif propertyType.type == "Enum" then + return true, { + Type = "Enum", + Value = rbxValue.Value, + } + end + + return false, ("Unknown property descriptor type %q"):format(tostring(propertyType.type)) +end + +return EncodedValue \ No newline at end of file diff --git a/plugin/rbx_dom_lua/src/EncodedValue.spec.lua b/plugin/rbx_dom_lua/src/EncodedValue.spec.lua new file mode 100644 index 00000000..c58f801d --- /dev/null +++ b/plugin/rbx_dom_lua/src/EncodedValue.spec.lua @@ -0,0 +1,127 @@ +return function() + local RbxDom = require(script.Parent) + local EncodedValue = require(script.Parent.EncodedValue) + + it("should decode Rect values", function() + local input = { + Type = "Rect", + Value = { + Min = {1, 2}, + Max = {3, 4}, + }, + } + + local output = Rect.new(1, 2, 3, 4) + + local ok, decoded = EncodedValue.decode(input) + + assert(ok, decoded) + expect(decoded).to.equal(output) + end) + + it("should decode ColorSequence values", function() + local input = { + Type = "ColorSequence", + Value = { + Keypoints = { + { + Time = 0, + Color = { 0.12, 0.34, 0.56 }, + }, + + { + Time = 1, + Color = { 0.13, 0.33, 0.37 }, + }, + } + }, + } + + local output = ColorSequence.new({ + ColorSequenceKeypoint.new(0, Color3.new(0.12, 0.34, 0.56)), + ColorSequenceKeypoint.new(1, Color3.new(0.13, 0.33, 0.37)), + }) + + local ok, decoded = EncodedValue.decode(input) + assert(ok, decoded) + expect(decoded).to.equal(output) + end) + + it("should decode NumberSequence values", function() + local input = { + Type = "NumberSequence", + Value = { + Keypoints = { + { + Time = 0, + Value = 0.5, + Envelope = 0, + }, + + { + Time = 1, + Value = 0.5, + Envelope = 0, + }, + } + }, + } + + local output = NumberSequence.new({ + NumberSequenceKeypoint.new(0, 0.5, 0), + NumberSequenceKeypoint.new(1, 0.5, 0), + }) + + local ok, decoded = EncodedValue.decode(input) + assert(ok, decoded) + expect(decoded).to.equal(output) + end) + + it("should decode PhysicalProperties values", function() + local input = { + Type = "PhysicalProperties", + Value = { + Density = 0.1, + Friction = 0.2, + Elasticity = 0.3, + FrictionWeight = 0.4, + ElasticityWeight = 0.5, + }, + } + + local output = PhysicalProperties.new( + 0.1, + 0.2, + 0.3, + 0.4, + 0.5 + ) + + local ok, decoded = EncodedValue.decode(input) + assert(ok, decoded) + expect(decoded).to.equal(output) + end) + + -- This part of rbx_dom_lua needs some work still. + itSKIP("should encode Rect values", function() + local input = Rect.new(10, 20, 30, 40) + + local output = { + Type = "Rect", + Value = { + Min = {10, 20}, + Max = {30, 40}, + }, + } + + local descriptor = RbxDom.findCanonicalPropertyDescriptor("ImageLabel", "SliceCenter") + local ok, encoded = EncodedValue.encode(input, descriptor) + + assert(ok, encoded) + expect(encoded.Type).to.equal(output.Type) + expect(encoded.Value.Min[1]).to.equal(output.Value.Min[1]) + expect(encoded.Value.Min[2]).to.equal(output.Value.Min[2]) + expect(encoded.Value.Max[1]).to.equal(output.Value.Max[1]) + expect(encoded.Value.Max[2]).to.equal(output.Value.Max[2]) + end) +end \ No newline at end of file diff --git a/plugin/rbx_dom_lua/Error.lua b/plugin/rbx_dom_lua/src/Error.lua similarity index 89% rename from plugin/rbx_dom_lua/Error.lua rename to plugin/rbx_dom_lua/src/Error.lua index 909c600e..d4c8b1ca 100644 --- a/plugin/rbx_dom_lua/Error.lua +++ b/plugin/rbx_dom_lua/src/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/src/PropertyDescriptor.lua similarity index 72% rename from plugin/rbx_dom_lua/PropertyDescriptor.lua rename to plugin/rbx_dom_lua/src/PropertyDescriptor.lua index 1e34e851..d7fc577a 100644 --- a/plugin/rbx_dom_lua/PropertyDescriptor.lua +++ b/plugin/rbx_dom_lua/src/PropertyDescriptor.lua @@ -20,22 +20,8 @@ local function set(container, key, value) end function PropertyDescriptor.fromRaw(data, className, propertyName) - local key, value = next(data.DataType) - return setmetatable({ - -- The meanings of the key and value in DataType differ when the type of - -- the property is Enum. When the property is of type Enum, the key is - -- the name of the type: - -- - -- { Enum = "" } - -- - -- When the property is not of type Enum, the value is the name of the - -- type: - -- - -- { Value = "" } - dataType = key == "Enum" and key or value, - - scriptability = data.Scriptability, + scriptability = data.scriptability, className = className, name = propertyName, }, PropertyDescriptor) @@ -53,11 +39,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 +65,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) @@ -101,4 +77,4 @@ function PropertyDescriptor:write(instance, value) end end -return PropertyDescriptor +return PropertyDescriptor \ No newline at end of file diff --git a/plugin/rbx_dom_lua/src/ReflectionDatabase/classes.lua b/plugin/rbx_dom_lua/src/ReflectionDatabase/classes.lua new file mode 100644 index 00000000..f420140a --- /dev/null +++ b/plugin/rbx_dom_lua/src/ReflectionDatabase/classes.lua @@ -0,0 +1,20114 @@ +-- This file is automatically @generated. +return { + ABTestService = { + name = "ABTestService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Accessory = { + name = "Accessory", + superclass = "Accoutrement", + properties = { + }, + defaults = { + AttachmentForward = Vector3.new(0, 0, -1), + AttachmentPoint = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + AttachmentPos = Vector3.new(0, 0, 0), + AttachmentRight = Vector3.new(1, 0, 0), + AttachmentUp = Vector3.new(0, 1, 0), + Name = "Accessory", + }, + }, + Accoutrement = { + name = "Accoutrement", + superclass = "Instance", + properties = { + AttachmentForward = { + name = "AttachmentForward", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + AttachmentPoint = { + name = "AttachmentPoint", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AttachmentPos = { + name = "AttachmentPos", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + AttachmentRight = { + name = "AttachmentRight", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + AttachmentUp = { + name = "AttachmentUp", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + AttachmentForward = Vector3.new(0, 0, -1), + AttachmentPoint = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + AttachmentPos = Vector3.new(0, 0, 0), + AttachmentRight = Vector3.new(1, 0, 0), + AttachmentUp = Vector3.new(0, 1, 0), + Name = "Accoutrement", + }, + }, + Actor = { + name = "Actor", + superclass = "Model", + properties = { + }, + defaults = { + LevelOfDetail = 0, + Name = "Actor", + PrimaryPart = nil, + }, + }, + AdService = { + name = "AdService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "AdService", + }, + }, + AdvancedDragger = { + name = "AdvancedDragger", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "AdvancedDragger", + }, + }, + AlignOrientation = { + name = "AlignOrientation", + superclass = "Constraint", + properties = { + AlignType = { + name = "AlignType", + type = {type = "Enum", name = "AlignType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxAngularVelocity = { + name = "MaxAngularVelocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxTorque = { + name = "MaxTorque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PrimaryAxisOnly = { + name = "PrimaryAxisOnly", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReactionTorqueEnabled = { + name = "ReactionTorqueEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Responsiveness = { + name = "Responsiveness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RigidityEnabled = { + name = "RigidityEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AlignType = 0, + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(23), + Enabled = true, + MaxAngularVelocity = 1000000000, + MaxTorque = 10000, + Name = "AlignOrientation", + PrimaryAxisOnly = false, + ReactionTorqueEnabled = false, + Responsiveness = 10, + RigidityEnabled = false, + Visible = false, + }, + }, + AlignPosition = { + name = "AlignPosition", + superclass = "Constraint", + properties = { + ApplyAtCenterOfMass = { + name = "ApplyAtCenterOfMass", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxForce = { + name = "MaxForce", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxVelocity = { + name = "MaxVelocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReactionForceEnabled = { + name = "ReactionForceEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Responsiveness = { + name = "Responsiveness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RigidityEnabled = { + name = "RigidityEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + ApplyAtCenterOfMass = false, + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(194), + Enabled = true, + MaxForce = 10000, + MaxVelocity = 1000000000, + Name = "AlignPosition", + ReactionForceEnabled = false, + Responsiveness = 10, + RigidityEnabled = false, + Visible = false, + }, + }, + AnalysticsSettings = { + name = "AnalysticsSettings", + superclass = "GenericSettings", + properties = { + }, + defaults = { + }, + }, + AnalyticsService = { + name = "AnalyticsService", + superclass = "Instance", + properties = { + ApiKey = { + name = "ApiKey", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + Name = "AnalyticsService", + }, + }, + AngularVelocity = { + name = "AngularVelocity", + superclass = "Constraint", + properties = { + AngularVelocity = { + name = "AngularVelocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxTorque = { + name = "MaxTorque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReactionTorqueEnabled = { + name = "ReactionTorqueEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RelativeTo = { + name = "RelativeTo", + type = {type = "Enum", name = "ActuatorRelativeTo"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AngularVelocity = Vector3.new(0, 0, 0), + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(23), + Enabled = true, + MaxTorque = 0, + Name = "AngularVelocity", + ReactionTorqueEnabled = false, + RelativeTo = 2, + Visible = false, + }, + }, + Animation = { + name = "Animation", + superclass = "Instance", + properties = { + AnimationId = { + name = "AnimationId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AnimationId = "", + Name = "Animation", + }, + }, + AnimationController = { + name = "AnimationController", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "AnimationController", + }, + }, + AnimationTrack = { + name = "AnimationTrack", + superclass = "Instance", + properties = { + Animation = { + name = "Animation", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsPlaying = { + name = "IsPlaying", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Length = { + name = "Length", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Looped = { + name = "Looped", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Priority = { + name = "Priority", + type = {type = "Enum", name = "AnimationPriority"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Speed = { + name = "Speed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TimePosition = { + name = "TimePosition", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + WeightCurrent = { + name = "WeightCurrent", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + WeightTarget = { + name = "WeightTarget", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + Animator = { + name = "Animator", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Animator", + }, + }, + AppStorageService = { + name = "AppStorageService", + superclass = "LocalStorageService", + properties = { + }, + defaults = { + }, + }, + AppUpdateService = { + name = "AppUpdateService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + ArcHandles = { + name = "ArcHandles", + superclass = "HandlesBase", + properties = { + Axes = { + name = "Axes", + type = {type = "Unimplemented", name = "Axes"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Adornee = nil, + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Name = "ArcHandles", + Transparency = 0, + Visible = true, + }, + }, + AssetCounterService = { + name = "AssetCounterService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + AssetDeliveryProxy = { + name = "AssetDeliveryProxy", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + AssetManagerService = { + name = "AssetManagerService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + AssetService = { + name = "AssetService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "AssetService", + }, + }, + Atmosphere = { + name = "Atmosphere", + superclass = "Instance", + properties = { + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Decay = { + name = "Decay", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Density = { + name = "Density", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Glare = { + name = "Glare", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Haze = { + name = "Haze", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Offset = { + name = "Offset", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color = Color3.new(0.7843, 0.6667, 0.4235), + Decay = Color3.new(0.3608, 0.2353, 0.0549), + Density = 0.395, + Glare = 0, + Haze = 0, + Name = "Atmosphere", + Offset = 0, + }, + }, + Attachment = { + name = "Attachment", + superclass = "Instance", + properties = { + Axis = { + name = "Axis", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + CFrame = { + name = "CFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Orientation = { + name = "Orientation", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Position = { + name = "Position", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Rotation = { + name = "Rotation", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + SecondaryAxis = { + name = "SecondaryAxis", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Visible = { + name = "Visible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WorldAxis = { + name = "WorldAxis", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + WorldCFrame = { + name = "WorldCFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + WorldOrientation = { + name = "WorldOrientation", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + WorldPosition = { + name = "WorldPosition", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + WorldRotation = { + name = "WorldRotation", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + WorldSecondaryAxis = { + name = "WorldSecondaryAxis", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + Axis = Vector3.new(1, 0, 0), + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Name = "Attachment", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + SecondaryAxis = Vector3.new(0, 1, 0), + Visible = false, + WorldAxis = Vector3.new(1, 0, 0), + WorldCFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + WorldOrientation = Vector3.new(0, 0, 0), + WorldPosition = Vector3.new(0, 0, 0), + WorldSecondaryAxis = Vector3.new(0, 1, 0), + }, + }, + AvatarEditorService = { + name = "AvatarEditorService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "AvatarEditorService", + }, + }, + Backpack = { + name = "Backpack", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Backpack", + }, + }, + BackpackItem = { + name = "BackpackItem", + superclass = "Instance", + properties = { + TextureId = { + name = "TextureId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + BadgeService = { + name = "BadgeService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "BadgeService", + }, + }, + BallSocketConstraint = { + name = "BallSocketConstraint", + superclass = "Constraint", + properties = { + LimitsEnabled = { + name = "LimitsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxFrictionTorque = { + name = "MaxFrictionTorque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Radius = { + name = "Radius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Restitution = { + name = "Restitution", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TwistLimitsEnabled = { + name = "TwistLimitsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TwistLowerAngle = { + name = "TwistLowerAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TwistUpperAngle = { + name = "TwistUpperAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UpperAngle = { + name = "UpperAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(1009), + Enabled = true, + LimitsEnabled = false, + MaxFrictionTorque = 0, + Name = "BallSocketConstraint", + Radius = 0.15, + Restitution = 0, + TwistLimitsEnabled = false, + TwistLowerAngle = -45, + TwistUpperAngle = 45, + UpperAngle = 45, + Visible = false, + }, + }, + BasePart = { + name = "BasePart", + superclass = "PVInstance", + properties = { + Anchored = { + name = "Anchored", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AssemblyAngularVelocity = { + name = "AssemblyAngularVelocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + AssemblyCenterOfMass = { + name = "AssemblyCenterOfMass", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AssemblyLinearVelocity = { + name = "AssemblyLinearVelocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + AssemblyMass = { + name = "AssemblyMass", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AssemblyRootPart = { + name = "AssemblyRootPart", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + BackParamA = { + name = "BackParamA", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BackParamB = { + name = "BackParamB", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BackSurface = { + name = "BackSurface", + type = {type = "Enum", name = "SurfaceType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BackSurfaceInput = { + name = "BackSurfaceInput", + type = {type = "Enum", name = "InputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BottomParamA = { + name = "BottomParamA", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BottomParamB = { + name = "BottomParamB", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BottomSurface = { + name = "BottomSurface", + type = {type = "Enum", name = "SurfaceType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BottomSurfaceInput = { + name = "BottomSurfaceInput", + type = {type = "Enum", name = "InputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BrickColor = { + name = "BrickColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = false, + canonicalName = "Color", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + CFrame = { + name = "CFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CanCollide = { + name = "CanCollide", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CanTouch = { + name = "CanTouch", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CastShadow = { + name = "CastShadow", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CenterOfMass = { + name = "CenterOfMass", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + CollisionGroupId = { + name = "CollisionGroupId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CollisionGroups = { + name = "CollisionGroups", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Custom", + serializes = true, + }, + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = "Color3uint8", + scriptability = "ReadWrite", + serializes = true, + }, + Color3uint8 = { + name = "Color3uint8", + type = {type = "Data", name = "Color3uint8"}, + isCanonical = false, + canonicalName = "Color", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + CustomPhysicalProperties = { + name = "CustomPhysicalProperties", + type = {type = "Data", name = "PhysicalProperties"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Elasticity = { + name = "Elasticity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Friction = { + name = "Friction", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + FrontParamA = { + name = "FrontParamA", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FrontParamB = { + name = "FrontParamB", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FrontSurface = { + name = "FrontSurface", + type = {type = "Enum", name = "SurfaceType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FrontSurfaceInput = { + name = "FrontSurfaceInput", + type = {type = "Enum", name = "InputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftParamA = { + name = "LeftParamA", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftParamB = { + name = "LeftParamB", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftSurface = { + name = "LeftSurface", + type = {type = "Enum", name = "SurfaceType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftSurfaceInput = { + name = "LeftSurfaceInput", + type = {type = "Enum", name = "InputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LocalTransparencyModifier = { + name = "LocalTransparencyModifier", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Locked = { + name = "Locked", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Mass = { + name = "Mass", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Massless = { + name = "Massless", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Material = { + name = "Material", + type = {type = "Enum", name = "Material"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Orientation = { + name = "Orientation", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Position = { + name = "Position", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ReceiveAge = { + name = "ReceiveAge", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Reflectance = { + name = "Reflectance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ResizeIncrement = { + name = "ResizeIncrement", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ResizeableFaces = { + name = "ResizeableFaces", + type = {type = "Unimplemented", name = "Faces"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + RightParamA = { + name = "RightParamA", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightParamB = { + name = "RightParamB", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightSurface = { + name = "RightSurface", + type = {type = "Enum", name = "SurfaceType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightSurfaceInput = { + name = "RightSurfaceInput", + type = {type = "Enum", name = "InputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RootPriority = { + name = "RootPriority", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RotVelocity = { + name = "RotVelocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rotation = { + name = "Rotation", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Size = { + name = "Size", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = "size", + scriptability = "ReadWrite", + serializes = true, + }, + SpecificGravity = { + name = "SpecificGravity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TopParamA = { + name = "TopParamA", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TopParamB = { + name = "TopParamB", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TopSurface = { + name = "TopSurface", + type = {type = "Enum", name = "SurfaceType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TopSurfaceInput = { + name = "TopSurfaceInput", + type = {type = "Enum", name = "InputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Velocity = { + name = "Velocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + brickColor = { + name = "brickColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = false, + canonicalName = "Color", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + size = { + name = "size", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "Size", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + }, + }, + BasePlayerGui = { + name = "BasePlayerGui", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + BaseScript = { + name = "BaseScript", + superclass = "LuaSourceContainer", + properties = { + Disabled = { + name = "Disabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LinkedSource = { + name = "LinkedSource", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + BaseWrap = { + name = "BaseWrap", + superclass = "Instance", + properties = { + CageMeshId = { + name = "CageMeshId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CageOrigin = { + name = "CageOrigin", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CageOriginWorld = { + name = "CageOriginWorld", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ImportOrigin = { + name = "ImportOrigin", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImportOriginWorld = { + name = "ImportOriginWorld", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + Beam = { + name = "Beam", + superclass = "Instance", + properties = { + Attachment0 = { + name = "Attachment0", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Attachment1 = { + name = "Attachment1", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Color = { + name = "Color", + type = {type = "Data", name = "ColorSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurveSize0 = { + name = "CurveSize0", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurveSize1 = { + name = "CurveSize1", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FaceCamera = { + name = "FaceCamera", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightEmission = { + name = "LightEmission", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightInfluence = { + name = "LightInfluence", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Segments = { + name = "Segments", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Texture = { + name = "Texture", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureLength = { + name = "TextureLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureMode = { + name = "TextureMode", + type = {type = "Enum", name = "TextureMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureSpeed = { + name = "TextureSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "NumberSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Width0 = { + name = "Width0", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Width1 = { + name = "Width1", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ZOffset = { + name = "ZOffset", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attachment0 = nil, + Attachment1 = nil, + Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.new(1, 1, 1)), ColorSequenceKeypoint.new(1, Color3.new(1, 1, 1))}), + CurveSize0 = 0, + CurveSize1 = 0, + Enabled = true, + FaceCamera = false, + LightEmission = 0, + LightInfluence = 0, + Name = "Beam", + Segments = 10, + Texture = "", + TextureLength = 1, + TextureMode = 0, + TextureSpeed = 1, + Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0, 0.5, 0), NumberSequenceKeypoint.new(1, 0.5, 0)}), + Width0 = 1, + Width1 = 1, + ZOffset = 0, + }, + }, + BevelMesh = { + name = "BevelMesh", + superclass = "DataModelMesh", + properties = { + }, + defaults = { + }, + }, + BillboardGui = { + name = "BillboardGui", + superclass = "LayerCollector", + properties = { + Active = { + name = "Active", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Adornee = { + name = "Adornee", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AlwaysOnTop = { + name = "AlwaysOnTop", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClipsDescendants = { + name = "ClipsDescendants", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurrentDistance = { + name = "CurrentDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DistanceLowerLimit = { + name = "DistanceLowerLimit", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DistanceStep = { + name = "DistanceStep", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DistanceUpperLimit = { + name = "DistanceUpperLimit", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ExtentsOffset = { + name = "ExtentsOffset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ExtentsOffsetWorldSpace = { + name = "ExtentsOffsetWorldSpace", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightInfluence = { + name = "LightInfluence", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxDistance = { + name = "MaxDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PlayerToHideFrom = { + name = "PlayerToHideFrom", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SizeOffset = { + name = "SizeOffset", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StudsOffset = { + name = "StudsOffset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StudsOffsetWorldSpace = { + name = "StudsOffsetWorldSpace", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + Adornee = nil, + AlwaysOnTop = false, + AutoLocalize = true, + ClipsDescendants = false, + DistanceLowerLimit = 0, + DistanceStep = 0, + DistanceUpperLimit = -1, + Enabled = true, + ExtentsOffset = Vector3.new(0, 0, 0), + ExtentsOffsetWorldSpace = Vector3.new(0, 0, 0), + LightInfluence = 0, + Localize = true, + MaxDistance = 1000000000, + Name = "BillboardGui", + PlayerToHideFrom = nil, + ResetOnSpawn = true, + RootLocalizationTable = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeOffset = Vector2.new(0, 0), + StudsOffset = Vector3.new(0, 0, 0), + StudsOffsetWorldSpace = Vector3.new(0, 0, 0), + ZIndexBehavior = 0, + }, + }, + BinaryStringValue = { + name = "BinaryStringValue", + superclass = "ValueBase", + properties = { + }, + defaults = { + Name = "Value", + }, + }, + BindableEvent = { + name = "BindableEvent", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Event", + }, + }, + BindableFunction = { + name = "BindableFunction", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Function", + }, + }, + BlockMesh = { + name = "BlockMesh", + superclass = "BevelMesh", + properties = { + }, + defaults = { + Name = "Mesh", + Offset = Vector3.new(0, 0, 0), + Scale = Vector3.new(1, 1, 1), + VertexColor = Vector3.new(1, 1, 1), + }, + }, + BloomEffect = { + name = "BloomEffect", + superclass = "PostEffect", + properties = { + Intensity = { + name = "Intensity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Threshold = { + name = "Threshold", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + Intensity = 0.4, + Name = "Bloom", + Size = 24, + Threshold = 0.95, + }, + }, + BlurEffect = { + name = "BlurEffect", + superclass = "PostEffect", + properties = { + Size = { + name = "Size", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + Name = "Blur", + Size = 24, + }, + }, + BodyAngularVelocity = { + name = "BodyAngularVelocity", + superclass = "BodyMover", + properties = { + AngularVelocity = { + name = "AngularVelocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxTorque = { + name = "MaxTorque", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + P = { + name = "P", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + angularvelocity = { + name = "angularvelocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "AngularVelocity", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + maxTorque = { + name = "maxTorque", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "MaxTorque", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + AngularVelocity = Vector3.new(0, 2, 0), + MaxTorque = Vector3.new(4000, 4000, 4000), + Name = "BodyAngularVelocity", + P = 1250, + }, + }, + BodyColors = { + name = "BodyColors", + superclass = "CharacterAppearance", + properties = { + HeadColor = { + name = "HeadColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + HeadColor3 = { + name = "HeadColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftArmColor = { + name = "LeftArmColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + LeftArmColor3 = { + name = "LeftArmColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftLegColor = { + name = "LeftLegColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + LeftLegColor3 = { + name = "LeftLegColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightArmColor = { + name = "RightArmColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RightArmColor3 = { + name = "RightArmColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightLegColor = { + name = "RightLegColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RightLegColor3 = { + name = "RightLegColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TorsoColor = { + name = "TorsoColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TorsoColor3 = { + name = "TorsoColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + HeadColor = BrickColor.new(226), + HeadColor3 = Color3.new(0.9921569, 0.9176471, 0.5529412), + LeftArmColor = BrickColor.new(226), + LeftArmColor3 = Color3.new(0.9921569, 0.9176471, 0.5529412), + LeftLegColor = BrickColor.new(23), + LeftLegColor3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Name = "Body Colors", + RightArmColor = BrickColor.new(226), + RightArmColor3 = Color3.new(0.9921569, 0.9176471, 0.5529412), + RightLegColor = BrickColor.new(23), + RightLegColor3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + TorsoColor = BrickColor.new(28), + TorsoColor3 = Color3.new(0.15686275, 0.49803925, 0.2784314), + }, + }, + BodyForce = { + name = "BodyForce", + superclass = "BodyMover", + properties = { + Force = { + name = "Force", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + force = { + name = "force", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "Force", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + Force = Vector3.new(0, 1, 0), + Name = "BodyForce", + }, + }, + BodyGyro = { + name = "BodyGyro", + superclass = "BodyMover", + properties = { + CFrame = { + name = "CFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + D = { + name = "D", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxTorque = { + name = "MaxTorque", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + P = { + name = "P", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + cframe = { + name = "cframe", + type = {type = "Data", name = "CFrame"}, + isCanonical = false, + canonicalName = "CFrame", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + maxTorque = { + name = "maxTorque", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "MaxTorque", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + D = 500, + MaxTorque = Vector3.new(400000, 0, 400000), + Name = "BodyGyro", + P = 3000, + }, + }, + BodyMover = { + name = "BodyMover", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + BodyPosition = { + name = "BodyPosition", + superclass = "BodyMover", + properties = { + D = { + name = "D", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxForce = { + name = "MaxForce", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + P = { + name = "P", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Position = { + name = "Position", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + maxForce = { + name = "maxForce", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "MaxForce", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + position = { + name = "position", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "Position", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + D = 1250, + MaxForce = Vector3.new(4000, 4000, 4000), + Name = "BodyPosition", + P = 10000, + Position = Vector3.new(0, 50, 0), + }, + }, + BodyThrust = { + name = "BodyThrust", + superclass = "BodyMover", + properties = { + Force = { + name = "Force", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Location = { + name = "Location", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + force = { + name = "force", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "Force", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + location = { + name = "location", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "Location", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + Force = Vector3.new(0, 1, 0), + Location = Vector3.new(0, 0, 0), + Name = "BodyThrust", + }, + }, + BodyVelocity = { + name = "BodyVelocity", + superclass = "BodyMover", + properties = { + MaxForce = { + name = "MaxForce", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + P = { + name = "P", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Velocity = { + name = "Velocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + maxForce = { + name = "maxForce", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "MaxForce", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + velocity = { + name = "velocity", + type = {type = "Data", name = "Vector3"}, + isCanonical = false, + canonicalName = "Velocity", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + MaxForce = Vector3.new(4000, 4000, 4000), + Name = "BodyVelocity", + P = 1250, + Velocity = Vector3.new(0, 2, 0), + }, + }, + Bone = { + name = "Bone", + superclass = "Attachment", + properties = { + Transform = { + name = "Transform", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TransformedCFrame = { + name = "TransformedCFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TransformedWorldCFrame = { + name = "TransformedWorldCFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Axis = Vector3.new(1, 0, 0), + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Name = "Bone", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + SecondaryAxis = Vector3.new(0, 1, 0), + Transform = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Visible = false, + WorldAxis = Vector3.new(1, 0, 0), + WorldCFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + WorldOrientation = Vector3.new(0, 0, 0), + WorldPosition = Vector3.new(0, 0, 0), + WorldSecondaryAxis = Vector3.new(0, 1, 0), + }, + }, + BoolValue = { + name = "BoolValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = false, + }, + }, + BoxHandleAdornment = { + name = "BoxHandleAdornment", + superclass = "HandleAdornment", + properties = { + Size = { + name = "Size", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AdornCullingMode = 0, + Adornee = nil, + AlwaysOnTop = false, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Name = "BoxHandleAdornment", + Size = Vector3.new(1, 1, 1), + SizeRelativeOffset = Vector3.new(0, 0, 0), + Transparency = 0, + Visible = true, + ZIndex = -1, + }, + }, + BrickColorValue = { + name = "BrickColorValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = BrickColor.new(194), + }, + }, + BrowserService = { + name = "BrowserService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + BulkImportService = { + name = "BulkImportService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + CFrameValue = { + name = "CFrameValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + }, + }, + CSGDictionaryService = { + name = "CSGDictionaryService", + superclass = "FlyweightService", + properties = { + }, + defaults = { + }, + }, + CacheableContentProvider = { + name = "CacheableContentProvider", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Camera = { + name = "Camera", + superclass = "Instance", + properties = { + CFrame = { + name = "CFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraSubject = { + name = "CameraSubject", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraType = { + name = "CameraType", + type = {type = "Enum", name = "CameraType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CoordinateFrame = { + name = "CoordinateFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = false, + canonicalName = "CFrame", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + DiagonalFieldOfView = { + name = "DiagonalFieldOfView", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + FieldOfView = { + name = "FieldOfView", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FieldOfViewMode = { + name = "FieldOfViewMode", + type = {type = "Enum", name = "FieldOfViewMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Focus = { + name = "Focus", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HeadLocked = { + name = "HeadLocked", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HeadScale = { + name = "HeadScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxAxisFieldOfView = { + name = "MaxAxisFieldOfView", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + NearPlaneZ = { + name = "NearPlaneZ", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ViewportSize = { + name = "ViewportSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + focus = { + name = "focus", + type = {type = "Data", name = "CFrame"}, + isCanonical = false, + canonicalName = "Focus", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + CFrame = CFrame.new(0, 20, 20, 1, 0, 0, 0, 0.7071068, 0.7071068, 0, -0.7071068, 0.7071068), + CameraSubject = nil, + CameraType = 0, + DiagonalFieldOfView = 88.87653, + FieldOfView = 70, + FieldOfViewMode = 0, + Focus = CFrame.new(0, 0, -5, 1, 0, 0, 0, 1, 0, 0, 0, 1), + HeadLocked = true, + HeadScale = 1, + MaxAxisFieldOfView = 70, + Name = "Camera", + }, + }, + CatalogPages = { + name = "CatalogPages", + superclass = "Pages", + properties = { + }, + defaults = { + }, + }, + ChangeHistoryService = { + name = "ChangeHistoryService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "ChangeHistoryService", + }, + }, + CharacterAppearance = { + name = "CharacterAppearance", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + CharacterMesh = { + name = "CharacterMesh", + superclass = "CharacterAppearance", + properties = { + BaseTextureId = { + name = "BaseTextureId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BodyPart = { + name = "BodyPart", + type = {type = "Enum", name = "BodyPart"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MeshId = { + name = "MeshId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OverlayTextureId = { + name = "OverlayTextureId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + BaseTextureId = 0, + BodyPart = 0, + MeshId = 0, + Name = "CharacterMesh", + OverlayTextureId = 0, + }, + }, + Chat = { + name = "Chat", + superclass = "Instance", + properties = { + BubbleChatEnabled = { + name = "BubbleChatEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LoadDefaultChat = { + name = "LoadDefaultChat", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = true, + }, + }, + defaults = { + BubbleChatEnabled = false, + LoadDefaultChat = true, + Name = "Chat", + }, + }, + ChorusSoundEffect = { + name = "ChorusSoundEffect", + superclass = "SoundEffect", + properties = { + Depth = { + name = "Depth", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Mix = { + name = "Mix", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rate = { + name = "Rate", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Depth = 0.15, + Enabled = true, + Mix = 0.5, + Name = "ChorusSoundEffect", + Priority = 0, + Rate = 0.5, + }, + }, + ClickDetector = { + name = "ClickDetector", + superclass = "Instance", + properties = { + CursorIcon = { + name = "CursorIcon", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxActivationDistance = { + name = "MaxActivationDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CursorIcon = "", + MaxActivationDistance = 32, + Name = "ClickDetector", + }, + }, + ClientReplicator = { + name = "ClientReplicator", + superclass = "NetworkReplicator", + properties = { + }, + defaults = { + }, + }, + Clothing = { + name = "Clothing", + superclass = "CharacterAppearance", + properties = { + Color3 = { + name = "Color3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + Clouds = { + name = "Clouds", + superclass = "Instance", + properties = { + Cover = { + name = "Cover", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Density = { + name = "Density", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Cover = 0.5, + Density = 0.7, + Name = "Clouds", + }, + }, + ClusterPacketCache = { + name = "ClusterPacketCache", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + CollectionService = { + name = "CollectionService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "CollectionService", + }, + }, + Color3Value = { + name = "Color3Value", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = Color3.new(0, 0, 0), + }, + }, + ColorCorrectionEffect = { + name = "ColorCorrectionEffect", + superclass = "PostEffect", + properties = { + Brightness = { + name = "Brightness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Contrast = { + name = "Contrast", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Saturation = { + name = "Saturation", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TintColor = { + name = "TintColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Brightness = 0, + Contrast = 0, + Enabled = true, + Name = "ColorCorrection", + Saturation = 0, + TintColor = Color3.new(1, 1, 1), + }, + }, + CompressorSoundEffect = { + name = "CompressorSoundEffect", + superclass = "SoundEffect", + properties = { + Attack = { + name = "Attack", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GainMakeup = { + name = "GainMakeup", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Ratio = { + name = "Ratio", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Release = { + name = "Release", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SideChain = { + name = "SideChain", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Threshold = { + name = "Threshold", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attack = 0.1, + Enabled = true, + GainMakeup = 0, + Name = "CompressorSoundEffect", + Priority = 0, + Ratio = 40, + Release = 0.1, + SideChain = nil, + Threshold = -40, + }, + }, + ConeHandleAdornment = { + name = "ConeHandleAdornment", + superclass = "HandleAdornment", + properties = { + Height = { + name = "Height", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Radius = { + name = "Radius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AdornCullingMode = 0, + Adornee = nil, + AlwaysOnTop = false, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Height = 2, + Name = "ConeHandleAdornment", + Radius = 0.5, + SizeRelativeOffset = Vector3.new(0, 0, 0), + Transparency = 0, + Visible = true, + ZIndex = -1, + }, + }, + Configuration = { + name = "Configuration", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Configuration", + }, + }, + Constraint = { + name = "Constraint", + superclass = "Instance", + properties = { + Active = { + name = "Active", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Attachment0 = { + name = "Attachment0", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Attachment1 = { + name = "Attachment1", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Color = { + name = "Color", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Visible = { + name = "Visible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + ContentProvider = { + name = "ContentProvider", + superclass = "Instance", + properties = { + BaseUrl = { + name = "BaseUrl", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + RequestQueueSize = { + name = "RequestQueueSize", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "ContentProvider", + }, + }, + ContextActionService = { + name = "ContextActionService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "ContextActionService", + }, + }, + Controller = { + name = "Controller", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + ControllerService = { + name = "ControllerService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + CookiesService = { + name = "CookiesService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "CookiesService", + }, + }, + CoreGui = { + name = "CoreGui", + superclass = "BasePlayerGui", + properties = { + SelectionImageObject = { + name = "SelectionImageObject", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + Version = { + name = "Version", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "CoreGui", + }, + }, + CorePackages = { + name = "CorePackages", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + CoreScript = { + name = "CoreScript", + superclass = "BaseScript", + properties = { + }, + defaults = { + }, + }, + CoreScriptSyncService = { + name = "CoreScriptSyncService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + CornerWedgePart = { + name = "CornerWedgePart", + superclass = "BasePart", + properties = { + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 0, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "CornerWedge", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(2, 2, 2), + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 0, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + CustomEvent = { + name = "CustomEvent", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "CustomEvent", + }, + }, + CustomEventReceiver = { + name = "CustomEventReceiver", + superclass = "Instance", + properties = { + Source = { + name = "Source", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "CustomEventReceiver", + Source = nil, + }, + }, + CylinderHandleAdornment = { + name = "CylinderHandleAdornment", + superclass = "HandleAdornment", + properties = { + Angle = { + name = "Angle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Height = { + name = "Height", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + InnerRadius = { + name = "InnerRadius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Radius = { + name = "Radius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AdornCullingMode = 0, + Adornee = nil, + AlwaysOnTop = false, + Angle = 360, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Height = 1, + InnerRadius = 0, + Name = "CylinderHandleAdornment", + Radius = 1, + SizeRelativeOffset = Vector3.new(0, 0, 0), + Transparency = 0, + Visible = true, + ZIndex = -1, + }, + }, + CylinderMesh = { + name = "CylinderMesh", + superclass = "BevelMesh", + properties = { + }, + defaults = { + Name = "Mesh", + Offset = Vector3.new(0, 0, 0), + Scale = Vector3.new(1, 1, 1), + VertexColor = Vector3.new(1, 1, 1), + }, + }, + CylindricalConstraint = { + name = "CylindricalConstraint", + superclass = "SlidingBallConstraint", + properties = { + AngularActuatorType = { + name = "AngularActuatorType", + type = {type = "Enum", name = "ActuatorType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AngularLimitsEnabled = { + name = "AngularLimitsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AngularRestitution = { + name = "AngularRestitution", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AngularSpeed = { + name = "AngularSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AngularVelocity = { + name = "AngularVelocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurrentAngle = { + name = "CurrentAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + InclinationAngle = { + name = "InclinationAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LowerAngle = { + name = "LowerAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MotorMaxAngularAcceleration = { + name = "MotorMaxAngularAcceleration", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MotorMaxTorque = { + name = "MotorMaxTorque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RotationAxisVisible = { + name = "RotationAxisVisible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ServoMaxTorque = { + name = "ServoMaxTorque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TargetAngle = { + name = "TargetAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UpperAngle = { + name = "UpperAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WorldRotationAxis = { + name = "WorldRotationAxis", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + ActuatorType = 0, + AngularActuatorType = 0, + AngularLimitsEnabled = false, + AngularRestitution = 0, + AngularSpeed = 0, + AngularVelocity = 0, + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(1009), + Enabled = true, + InclinationAngle = 0, + LimitsEnabled = false, + LowerAngle = -45, + LowerLimit = 0, + MotorMaxAcceleration = 1000000000, + MotorMaxAngularAcceleration = 1000000000, + MotorMaxForce = 0, + MotorMaxTorque = 0, + Name = "CylindricalConstraint", + Restitution = 0, + RotationAxisVisible = false, + ServoMaxForce = 0, + ServoMaxTorque = 0, + Size = 0.15, + Speed = 0, + TargetAngle = 0, + TargetPosition = 0, + UpperAngle = 45, + UpperLimit = 5, + Velocity = 0, + Visible = false, + }, + }, + DataModel = { + name = "DataModel", + superclass = "ServiceProvider", + properties = { + CreatorId = { + name = "CreatorId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + CreatorType = { + name = "CreatorType", + type = {type = "Enum", name = "CreatorType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + GameId = { + name = "GameId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + GearGenreSetting = { + name = "GearGenreSetting", + type = {type = "Enum", name = "GearGenreSetting"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Genre = { + name = "Genre", + type = {type = "Enum", name = "Genre"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsSFFlagsLoaded = { + name = "IsSFFlagsLoaded", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + JobId = { + name = "JobId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PlaceId = { + name = "PlaceId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PlaceVersion = { + name = "PlaceVersion", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PrivateServerId = { + name = "PrivateServerId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PrivateServerOwnerId = { + name = "PrivateServerOwnerId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + VIPServerId = { + name = "VIPServerId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + VIPServerOwnerId = { + name = "VIPServerOwnerId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Workspace = { + name = "Workspace", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + lighting = { + name = "lighting", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + workspace = { + name = "workspace", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + DataModelMesh = { + name = "DataModelMesh", + superclass = "Instance", + properties = { + Offset = { + name = "Offset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Scale = { + name = "Scale", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VertexColor = { + name = "VertexColor", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + DataModelSession = { + name = "DataModelSession", + superclass = "Instance", + properties = { + CurrentDataModelType = { + name = "CurrentDataModelType", + type = {type = "Enum", name = "StudioDataModelType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + SessionId = { + name = "SessionId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + DataStorePages = { + name = "DataStorePages", + superclass = "Pages", + properties = { + }, + defaults = { + }, + }, + DataStoreService = { + name = "DataStoreService", + superclass = "Instance", + properties = { + AutomaticRetry = { + name = "AutomaticRetry", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + LegacyNamingScheme = { + name = "LegacyNamingScheme", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + Name = "DataStoreService", + }, + }, + Debris = { + name = "Debris", + superclass = "Instance", + properties = { + MaxItems = { + name = "MaxItems", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = true, + }, + }, + defaults = { + MaxItems = 1000, + Name = "Debris", + }, + }, + DebugSettings = { + name = "DebugSettings", + superclass = "Instance", + properties = { + DataModel = { + name = "DataModel", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + InstanceCount = { + name = "InstanceCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsScriptStackTracingEnabled = { + name = "IsScriptStackTracingEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + JobCount = { + name = "JobCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PlayerCount = { + name = "PlayerCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ReportSoundWarnings = { + name = "ReportSoundWarnings", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RobloxVersion = { + name = "RobloxVersion", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TickCountPreciseOverride = { + name = "TickCountPreciseOverride", + type = {type = "Enum", name = "TickCountSampleMethod"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + DebuggerBreakpoint = { + name = "DebuggerBreakpoint", + superclass = "Instance", + properties = { + Condition = { + name = "Condition", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsEnabled = { + name = "IsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Line = { + name = "Line", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + isContextDependentBreakpoint = { + name = "isContextDependentBreakpoint", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + DebuggerManager = { + name = "DebuggerManager", + superclass = "Instance", + properties = { + DebuggingEnabled = { + name = "DebuggingEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + DebuggerWatch = { + name = "DebuggerWatch", + superclass = "Instance", + properties = { + Expression = { + name = "Expression", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + }, + }, + Decal = { + name = "Decal", + superclass = "FaceInstance", + properties = { + Color3 = { + name = "Color3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LocalTransparencyModifier = { + name = "LocalTransparencyModifier", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Shiny = { + name = "Shiny", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Specular = { + name = "Specular", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Texture = { + name = "Texture", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color3 = Color3.new(1, 1, 1), + Face = 5, + LocalTransparencyModifier = 0, + Name = "Decal", + Shiny = 20, + Specular = 0, + Texture = "", + Transparency = 0, + }, + }, + DepthOfFieldEffect = { + name = "DepthOfFieldEffect", + superclass = "PostEffect", + properties = { + FarIntensity = { + name = "FarIntensity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FocusDistance = { + name = "FocusDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + InFocusRadius = { + name = "InFocusRadius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NearIntensity = { + name = "NearIntensity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + FarIntensity = 0.75, + FocusDistance = 0.05, + InFocusRadius = 10, + Name = "DepthOfField", + NearIntensity = 0.75, + }, + }, + Dialog = { + name = "Dialog", + superclass = "Instance", + properties = { + BehaviorType = { + name = "BehaviorType", + type = {type = "Enum", name = "DialogBehaviorType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ConversationDistance = { + name = "ConversationDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GoodbyeChoiceActive = { + name = "GoodbyeChoiceActive", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GoodbyeDialog = { + name = "GoodbyeDialog", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + InUse = { + name = "InUse", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + InitialPrompt = { + name = "InitialPrompt", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Purpose = { + name = "Purpose", + type = {type = "Enum", name = "DialogPurpose"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Tone = { + name = "Tone", + type = {type = "Enum", name = "DialogTone"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TriggerDistance = { + name = "TriggerDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TriggerOffset = { + name = "TriggerOffset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + BehaviorType = 0, + ConversationDistance = 25, + GoodbyeChoiceActive = true, + GoodbyeDialog = "", + InUse = false, + InitialPrompt = "", + Name = "Dialog", + Purpose = 1, + Tone = 0, + TriggerDistance = 0, + TriggerOffset = Vector3.new(0, 0, 0), + }, + }, + DialogChoice = { + name = "DialogChoice", + superclass = "Instance", + properties = { + GoodbyeChoiceActive = { + name = "GoodbyeChoiceActive", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GoodbyeDialog = { + name = "GoodbyeDialog", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ResponseDialog = { + name = "ResponseDialog", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UserDialog = { + name = "UserDialog", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + GoodbyeChoiceActive = true, + GoodbyeDialog = "", + Name = "DialogChoice", + ResponseDialog = "", + UserDialog = "", + }, + }, + DistortionSoundEffect = { + name = "DistortionSoundEffect", + superclass = "SoundEffect", + properties = { + Level = { + name = "Level", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + Level = 0.75, + Name = "DistortionSoundEffect", + Priority = 0, + }, + }, + DockWidgetPluginGui = { + name = "DockWidgetPluginGui", + superclass = "PluginGui", + properties = { + HostWidgetWasRestored = { + name = "HostWidgetWasRestored", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + DoubleConstrainedValue = { + name = "DoubleConstrainedValue", + superclass = "ValueBase", + properties = { + ConstrainedValue = { + name = "ConstrainedValue", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + MaxValue = { + name = "MaxValue", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MinValue = { + name = "MinValue", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Value = { + name = "Value", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + ConstrainedValue = 0, + MaxValue = 1, + MinValue = 0, + Name = "Value", + Value = 0, + }, + }, + DraftsService = { + name = "DraftsService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "DraftsService", + }, + }, + Dragger = { + name = "Dragger", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Dragger", + }, + }, + DynamicRotate = { + name = "DynamicRotate", + superclass = "JointInstance", + properties = { + BaseAngle = { + name = "BaseAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + EchoSoundEffect = { + name = "EchoSoundEffect", + superclass = "SoundEffect", + properties = { + Delay = { + name = "Delay", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DryLevel = { + name = "DryLevel", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Feedback = { + name = "Feedback", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WetLevel = { + name = "WetLevel", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Delay = 1, + DryLevel = 0, + Enabled = true, + Feedback = 0.5, + Name = "EchoSoundEffect", + Priority = 0, + WetLevel = 0, + }, + }, + EmotesPages = { + name = "EmotesPages", + superclass = "InventoryPages", + properties = { + }, + defaults = { + }, + }, + EqualizerSoundEffect = { + name = "EqualizerSoundEffect", + superclass = "SoundEffect", + properties = { + HighGain = { + name = "HighGain", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LowGain = { + name = "LowGain", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MidGain = { + name = "MidGain", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + HighGain = 0, + LowGain = -20, + MidGain = -10, + Name = "EqualizerSoundEffect", + Priority = 0, + }, + }, + EventIngestService = { + name = "EventIngestService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Explosion = { + name = "Explosion", + superclass = "Instance", + properties = { + BlastPressure = { + name = "BlastPressure", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BlastRadius = { + name = "BlastRadius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DestroyJointRadiusPercent = { + name = "DestroyJointRadiusPercent", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ExplosionType = { + name = "ExplosionType", + type = {type = "Enum", name = "ExplosionType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Position = { + name = "Position", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Visible = { + name = "Visible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + BlastPressure = 500000, + BlastRadius = 4, + DestroyJointRadiusPercent = 1, + ExplosionType = 1, + Name = "Explosion", + Position = Vector3.new(0, 0, 0), + Visible = true, + }, + }, + FaceInstance = { + name = "FaceInstance", + superclass = "Instance", + properties = { + Face = { + name = "Face", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + Feature = { + name = "Feature", + superclass = "Instance", + properties = { + FaceId = { + name = "FaceId", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + InOut = { + name = "InOut", + type = {type = "Enum", name = "InOut"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftRight = { + name = "LeftRight", + type = {type = "Enum", name = "LeftRight"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TopBottom = { + name = "TopBottom", + type = {type = "Enum", name = "TopBottom"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + File = { + name = "File", + superclass = "Instance", + properties = { + FileName = { + name = "FileName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + FileSize = { + name = "FileSize", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Size = { + name = "Size", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + FileMesh = { + name = "FileMesh", + superclass = "DataModelMesh", + properties = { + MeshId = { + name = "MeshId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureId = { + name = "TextureId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + MeshId = "", + Name = "Mesh", + Offset = Vector3.new(0, 0, 0), + Scale = Vector3.new(1, 1, 1), + TextureId = "", + VertexColor = Vector3.new(1, 1, 1), + }, + }, + Fire = { + name = "Fire", + superclass = "Instance", + properties = { + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Heat = { + name = "Heat", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "heat_xml", + scriptability = "ReadWrite", + serializes = true, + }, + SecondaryColor = { + name = "SecondaryColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "size_xml", + scriptability = "ReadWrite", + serializes = true, + }, + heat_xml = { + name = "heat_xml", + type = {type = "Data", name = "Float32"}, + isCanonical = false, + canonicalName = "Heat", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + size = { + name = "size", + type = {type = "Data", name = "Float32"}, + isCanonical = false, + canonicalName = "Size", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + size_xml = { + name = "size_xml", + type = {type = "Data", name = "Float32"}, + isCanonical = false, + canonicalName = "Size", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + Color = Color3.new(0.92549026, 0.54509807, 0.27450982), + Enabled = true, + Heat = 9, + Name = "Fire", + SecondaryColor = Color3.new(0.54509807, 0.3137255, 0.21568629), + Size = 5, + }, + }, + Flag = { + name = "Flag", + superclass = "Tool", + properties = { + TeamColor = { + name = "TeamColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CanBeDropped = true, + Enabled = true, + Grip = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + GripForward = Vector3.new(0, 0, -1), + GripPos = Vector3.new(0, 0, 0), + GripRight = Vector3.new(1, 0, 0), + GripUp = Vector3.new(0, 1, 0), + ManualActivationOnly = false, + Name = "Flag", + RequiresHandle = true, + TeamColor = BrickColor.new(194), + TextureId = "", + ToolTip = "", + }, + }, + FlagStand = { + name = "FlagStand", + superclass = "Part", + properties = { + TeamColor = { + name = "TeamColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 4, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + FormFactor = 1, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "FlagStand", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Shape = 1, + Size = Vector3.new(4, 1.2, 2), + TeamColor = BrickColor.new(194), + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 3, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + FlagStandService = { + name = "FlagStandService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + FlangeSoundEffect = { + name = "FlangeSoundEffect", + superclass = "SoundEffect", + properties = { + Depth = { + name = "Depth", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Mix = { + name = "Mix", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rate = { + name = "Rate", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Depth = 0.45, + Enabled = true, + Mix = 0.85, + Name = "FlangeSoundEffect", + Priority = 0, + Rate = 5, + }, + }, + FloorWire = { + name = "FloorWire", + superclass = "GuiBase3d", + properties = { + CycleOffset = { + name = "CycleOffset", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + From = { + name = "From", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StudsBetweenTextures = { + name = "StudsBetweenTextures", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Texture = { + name = "Texture", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureSize = { + name = "TextureSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + To = { + name = "To", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Velocity = { + name = "Velocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WireRadius = { + name = "WireRadius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + CycleOffset = 0, + From = nil, + Name = "FloorWire", + StudsBetweenTextures = 4, + Texture = "", + TextureSize = Vector2.new(1, 1), + To = nil, + Transparency = 0, + Velocity = 2, + Visible = true, + WireRadius = 0.0625, + }, + }, + FlyweightService = { + name = "FlyweightService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Folder = { + name = "Folder", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Folder", + }, + }, + ForceField = { + name = "ForceField", + superclass = "Instance", + properties = { + Visible = { + name = "Visible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "ForceField", + Visible = true, + }, + }, + FormFactorPart = { + name = "FormFactorPart", + superclass = "BasePart", + properties = { + FormFactor = { + name = "FormFactor", + type = {type = "Enum", name = "FormFactor"}, + isCanonical = true, + canonicalName = nil, + serializedName = "formFactorRaw", + scriptability = "ReadWrite", + serializes = true, + }, + formFactor = { + name = "formFactor", + type = {type = "Enum", name = "FormFactor"}, + isCanonical = false, + canonicalName = "FormFactor", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + formFactorRaw = { + name = "formFactorRaw", + type = {type = "Enum", name = "FormFactor"}, + isCanonical = false, + canonicalName = "FormFactor", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + }, + }, + Frame = { + name = "Frame", + superclass = "GuiObject", + properties = { + Style = { + name = "Style", + type = {type = "Enum", name = "FrameStyle"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + AnchorPoint = Vector2.new(0, 0), + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClipsDescendants = false, + Draggable = false, + LayoutOrder = 0, + Localize = true, + Name = "Frame", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Position = UDim2.new(0, 0, 0, 0), + RootLocalizationTable = nil, + Rotation = 0, + Selectable = false, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + Style = 0, + Transparency = 0, + Visible = true, + ZIndex = 1, + }, + }, + FriendPages = { + name = "FriendPages", + superclass = "Pages", + properties = { + }, + defaults = { + }, + }, + FriendService = { + name = "FriendService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "FriendService", + }, + }, + FunctionalTest = { + name = "FunctionalTest", + superclass = "Instance", + properties = { + Description = { + name = "Description", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Description = "?", + Name = "Instance", + }, + }, + GamePassService = { + name = "GamePassService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "GamePassService", + }, + }, + GameSettings = { + name = "GameSettings", + superclass = "Instance", + properties = { + AdditionalCoreIncludeDirs = { + name = "AdditionalCoreIncludeDirs", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OverrideStarterScript = { + name = "OverrideStarterScript", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VideoCaptureEnabled = { + name = "VideoCaptureEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VideoRecording = { + name = "VideoRecording", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + GamepadService = { + name = "GamepadService", + superclass = "Instance", + properties = { + GamepadCursorEnabled = { + name = "GamepadCursorEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + Name = "GamepadService", + }, + }, + GenericSettings = { + name = "GenericSettings", + superclass = "ServiceProvider", + properties = { + }, + defaults = { + }, + }, + Geometry = { + name = "Geometry", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Geometry", + }, + }, + GlobalDataStore = { + name = "GlobalDataStore", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + GlobalSettings = { + name = "GlobalSettings", + superclass = "GenericSettings", + properties = { + }, + defaults = { + }, + }, + Glue = { + name = "Glue", + superclass = "JointInstance", + properties = { + F0 = { + name = "F0", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + F1 = { + name = "F1", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + F2 = { + name = "F2", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + F3 = { + name = "F3", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + F0 = Vector3.new(0, 0, 0), + F1 = Vector3.new(0, 0, 0), + F2 = Vector3.new(0, 0, 0), + F3 = Vector3.new(0, 0, 0), + Name = "Glue", + Part0 = nil, + Part1 = nil, + }, + }, + GoogleAnalyticsConfiguration = { + name = "GoogleAnalyticsConfiguration", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + GroupService = { + name = "GroupService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "GroupService", + }, + }, + GuiBase = { + name = "GuiBase", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + GuiBase2d = { + name = "GuiBase2d", + superclass = "GuiBase", + properties = { + AbsolutePosition = { + name = "AbsolutePosition", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AbsoluteRotation = { + name = "AbsoluteRotation", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AbsoluteSize = { + name = "AbsoluteSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AutoLocalize = { + name = "AutoLocalize", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClippedRect = { + name = "ClippedRect", + type = {type = "Data", name = "Rect"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsNotOccluded = { + name = "IsNotOccluded", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Localize = { + name = "Localize", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RawRect2D = { + name = "RawRect2D", + type = {type = "Data", name = "Rect"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + RootLocalizationTable = { + name = "RootLocalizationTable", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TotalGroupScale = { + name = "TotalGroupScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + GuiBase3d = { + name = "GuiBase3d", + superclass = "GuiBase", + properties = { + Color = { + name = "Color", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Color3 = { + name = "Color3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Visible = { + name = "Visible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + GuiButton = { + name = "GuiButton", + superclass = "GuiObject", + properties = { + AutoButtonColor = { + name = "AutoButtonColor", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Modal = { + name = "Modal", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Selected = { + name = "Selected", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Style = { + name = "Style", + type = {type = "Enum", name = "ButtonStyle"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + GuiLabel = { + name = "GuiLabel", + superclass = "GuiObject", + properties = { + }, + defaults = { + }, + }, + GuiMain = { + name = "GuiMain", + superclass = "ScreenGui", + properties = { + }, + defaults = { + AutoLocalize = true, + DisplayOrder = 0, + Enabled = true, + IgnoreGuiInset = false, + Localize = true, + Name = "GuiMain", + ResetOnSpawn = true, + RootLocalizationTable = nil, + ZIndexBehavior = 0, + }, + }, + GuiObject = { + name = "GuiObject", + superclass = "GuiBase2d", + properties = { + Active = { + name = "Active", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AnchorPoint = { + name = "AnchorPoint", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AutomaticSize = { + name = "AutomaticSize", + type = {type = "Enum", name = "AutomaticSize"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BackgroundColor = { + name = "BackgroundColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + BackgroundColor3 = { + name = "BackgroundColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BackgroundTransparency = { + name = "BackgroundTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BorderColor = { + name = "BorderColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + BorderColor3 = { + name = "BorderColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BorderMode = { + name = "BorderMode", + type = {type = "Enum", name = "BorderMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BorderSizePixel = { + name = "BorderSizePixel", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClipsDescendants = { + name = "ClipsDescendants", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Draggable = { + name = "Draggable", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LayoutOrder = { + name = "LayoutOrder", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NextSelectionDown = { + name = "NextSelectionDown", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NextSelectionLeft = { + name = "NextSelectionLeft", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NextSelectionRight = { + name = "NextSelectionRight", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NextSelectionUp = { + name = "NextSelectionUp", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Position = { + name = "Position", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rotation = { + name = "Rotation", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Selectable = { + name = "Selectable", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SelectionImageObject = { + name = "SelectionImageObject", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SizeConstraint = { + name = "SizeConstraint", + type = {type = "Enum", name = "SizeConstraint"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Visible = { + name = "Visible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ZIndex = { + name = "ZIndex", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + GuiService = { + name = "GuiService", + superclass = "Instance", + properties = { + AutoSelectGuiEnabled = { + name = "AutoSelectGuiEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CoreEffectFolder = { + name = "CoreEffectFolder", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + CoreGuiFolder = { + name = "CoreGuiFolder", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + CoreGuiNavigationEnabled = { + name = "CoreGuiNavigationEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GuiNavigationEnabled = { + name = "GuiNavigationEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsModalDialog = { + name = "IsModalDialog", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsWindows = { + name = "IsWindows", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MenuIsOpen = { + name = "MenuIsOpen", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + SelectedCoreObject = { + name = "SelectedCoreObject", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + SelectedObject = { + name = "SelectedObject", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AutoSelectGuiEnabled = true, + CoreGuiNavigationEnabled = true, + GuiNavigationEnabled = true, + Name = "GuiService", + SelectedObject = nil, + }, + }, + GuidRegistryService = { + name = "GuidRegistryService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + HandleAdornment = { + name = "HandleAdornment", + superclass = "PVAdornment", + properties = { + AdornCullingMode = { + name = "AdornCullingMode", + type = {type = "Enum", name = "AdornCullingMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AlwaysOnTop = { + name = "AlwaysOnTop", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CFrame = { + name = "CFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SizeRelativeOffset = { + name = "SizeRelativeOffset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ZIndex = { + name = "ZIndex", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + Handles = { + name = "Handles", + superclass = "HandlesBase", + properties = { + Faces = { + name = "Faces", + type = {type = "Unimplemented", name = "Faces"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Style = { + name = "Style", + type = {type = "Enum", name = "HandlesStyle"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Adornee = nil, + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Name = "Handles", + Style = 0, + Transparency = 0, + Visible = true, + }, + }, + HandlesBase = { + name = "HandlesBase", + superclass = "PartAdornment", + properties = { + }, + defaults = { + }, + }, + HapticService = { + name = "HapticService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "HapticService", + }, + }, + Hat = { + name = "Hat", + superclass = "Accoutrement", + properties = { + }, + defaults = { + AttachmentForward = Vector3.new(0, 0, -1), + AttachmentPoint = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + AttachmentPos = Vector3.new(0, 0, 0), + AttachmentRight = Vector3.new(1, 0, 0), + AttachmentUp = Vector3.new(0, 1, 0), + Name = "Hat", + }, + }, + HeightmapImporterService = { + name = "HeightmapImporterService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "HeightmapImporterService", + }, + }, + HingeConstraint = { + name = "HingeConstraint", + superclass = "Constraint", + properties = { + ActuatorType = { + name = "ActuatorType", + type = {type = "Enum", name = "ActuatorType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AngularSpeed = { + name = "AngularSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AngularVelocity = { + name = "AngularVelocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurrentAngle = { + name = "CurrentAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + LimitsEnabled = { + name = "LimitsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LowerAngle = { + name = "LowerAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MotorMaxAcceleration = { + name = "MotorMaxAcceleration", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MotorMaxTorque = { + name = "MotorMaxTorque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Radius = { + name = "Radius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Restitution = { + name = "Restitution", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ServoMaxTorque = { + name = "ServoMaxTorque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TargetAngle = { + name = "TargetAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UpperAngle = { + name = "UpperAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + ActuatorType = 0, + AngularSpeed = 0, + AngularVelocity = 0, + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(1009), + Enabled = true, + LimitsEnabled = false, + LowerAngle = -45, + MotorMaxAcceleration = 1000000000, + MotorMaxTorque = 0, + Name = "HingeConstraint", + Radius = 0.15, + Restitution = 0, + ServoMaxTorque = 0, + TargetAngle = 0, + UpperAngle = 45, + Visible = false, + }, + }, + Hint = { + name = "Hint", + superclass = "Message", + properties = { + }, + defaults = { + Name = "Message", + Text = "", + }, + }, + Hole = { + name = "Hole", + superclass = "Feature", + properties = { + }, + defaults = { + FaceId = 0, + InOut = 2, + LeftRight = 1, + Name = "Hole", + TopBottom = 1, + }, + }, + Hopper = { + name = "Hopper", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + HopperBin = { + name = "HopperBin", + superclass = "BackpackItem", + properties = { + Active = { + name = "Active", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BinType = { + name = "BinType", + type = {type = "Enum", name = "BinType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + BinType = 0, + Name = "HopperBin", + TextureId = "", + }, + }, + HttpRbxApiService = { + name = "HttpRbxApiService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "HttpRbxApiService", + }, + }, + HttpRequest = { + name = "HttpRequest", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + HttpService = { + name = "HttpService", + superclass = "Instance", + properties = { + HttpEnabled = { + name = "HttpEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + Name = "HttpService", + }, + }, + Humanoid = { + name = "Humanoid", + superclass = "Instance", + properties = { + AutoJumpEnabled = { + name = "AutoJumpEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AutoRotate = { + name = "AutoRotate", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AutomaticScalingEnabled = { + name = "AutomaticScalingEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BreakJointsOnDeath = { + name = "BreakJointsOnDeath", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraOffset = { + name = "CameraOffset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + CollisionType = { + name = "CollisionType", + type = {type = "Enum", name = "HumanoidCollisionType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DisplayDistanceType = { + name = "DisplayDistanceType", + type = {type = "Enum", name = "HumanoidDisplayDistanceType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DisplayName = { + name = "DisplayName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FloorMaterial = { + name = "FloorMaterial", + type = {type = "Enum", name = "Material"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Health = { + name = "Health", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + HealthDisplayDistance = { + name = "HealthDisplayDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HealthDisplayType = { + name = "HealthDisplayType", + type = {type = "Enum", name = "HumanoidHealthDisplayType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HipHeight = { + name = "HipHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Jump = { + name = "Jump", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + JumpHeight = { + name = "JumpHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + JumpPower = { + name = "JumpPower", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftLeg = { + name = "LeftLeg", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + MaxHealth = { + name = "MaxHealth", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxSlopeAngle = { + name = "MaxSlopeAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MoveDirection = { + name = "MoveDirection", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + NameDisplayDistance = { + name = "NameDisplayDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NameOcclusion = { + name = "NameOcclusion", + type = {type = "Enum", name = "NameOcclusion"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PlatformStand = { + name = "PlatformStand", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RequiresNeck = { + name = "RequiresNeck", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RigType = { + name = "RigType", + type = {type = "Enum", name = "HumanoidRigType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightLeg = { + name = "RightLeg", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RootPart = { + name = "RootPart", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + SeatPart = { + name = "SeatPart", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Sit = { + name = "Sit", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TargetPoint = { + name = "TargetPoint", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Torso = { + name = "Torso", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + UseJumpPower = { + name = "UseJumpPower", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WalkSpeed = { + name = "WalkSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WalkToPart = { + name = "WalkToPart", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + WalkToPoint = { + name = "WalkToPoint", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + maxHealth = { + name = "maxHealth", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + AutoJumpEnabled = true, + AutoRotate = true, + AutomaticScalingEnabled = true, + BreakJointsOnDeath = true, + CameraOffset = Vector3.new(0, 0, 0), + CollisionType = 0, + DisplayDistanceType = 0, + DisplayName = "", + Health = 100, + HealthDisplayDistance = 100, + HealthDisplayType = 0, + HipHeight = 0, + Jump = false, + JumpHeight = 7.2, + JumpPower = 50, + LeftLeg = nil, + MaxHealth = 100, + MaxSlopeAngle = 89, + Name = "Humanoid", + NameDisplayDistance = 100, + NameOcclusion = 2, + PlatformStand = false, + RequiresNeck = true, + RigType = 0, + RightLeg = nil, + Sit = false, + TargetPoint = Vector3.new(0, 0, 0), + Torso = nil, + UseJumpPower = true, + WalkSpeed = 16, + WalkToPart = nil, + WalkToPoint = Vector3.new(0, 0, 0), + maxHealth = 100, + }, + }, + HumanoidController = { + name = "HumanoidController", + superclass = "Controller", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + HumanoidDescription = { + name = "HumanoidDescription", + superclass = "Instance", + properties = { + BackAccessory = { + name = "BackAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BodyTypeScale = { + name = "BodyTypeScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClimbAnimation = { + name = "ClimbAnimation", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DepthScale = { + name = "DepthScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Face = { + name = "Face", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FaceAccessory = { + name = "FaceAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FallAnimation = { + name = "FallAnimation", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FrontAccessory = { + name = "FrontAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GraphicTShirt = { + name = "GraphicTShirt", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HairAccessory = { + name = "HairAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HatAccessory = { + name = "HatAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Head = { + name = "Head", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HeadColor = { + name = "HeadColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HeadScale = { + name = "HeadScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HeightScale = { + name = "HeightScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IdleAnimation = { + name = "IdleAnimation", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + JumpAnimation = { + name = "JumpAnimation", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftArm = { + name = "LeftArm", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftArmColor = { + name = "LeftArmColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftLeg = { + name = "LeftLeg", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LeftLegColor = { + name = "LeftLegColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NeckAccessory = { + name = "NeckAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NumberEmotesLoaded = { + name = "NumberEmotesLoaded", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + Pants = { + name = "Pants", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ProportionScale = { + name = "ProportionScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightArm = { + name = "RightArm", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightArmColor = { + name = "RightArmColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightLeg = { + name = "RightLeg", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RightLegColor = { + name = "RightLegColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RunAnimation = { + name = "RunAnimation", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Shirt = { + name = "Shirt", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShouldersAccessory = { + name = "ShouldersAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SwimAnimation = { + name = "SwimAnimation", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Torso = { + name = "Torso", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TorsoColor = { + name = "TorsoColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WaistAccessory = { + name = "WaistAccessory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WalkAnimation = { + name = "WalkAnimation", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WidthScale = { + name = "WidthScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + BackAccessory = "", + BodyTypeScale = 0.3, + ClimbAnimation = 0, + DepthScale = 1, + Face = 0, + FaceAccessory = "", + FallAnimation = 0, + FrontAccessory = "", + GraphicTShirt = 0, + HairAccessory = "", + HatAccessory = "", + Head = 0, + HeadColor = Color3.new(0, 0, 0), + HeadScale = 1, + HeightScale = 1, + IdleAnimation = 0, + JumpAnimation = 0, + LeftArm = 0, + LeftArmColor = Color3.new(0, 0, 0), + LeftLeg = 0, + LeftLegColor = Color3.new(0, 0, 0), + Name = "HumanoidDescription", + NeckAccessory = "", + Pants = 0, + ProportionScale = 1, + RightArm = 0, + RightArmColor = Color3.new(0, 0, 0), + RightLeg = 0, + RightLegColor = Color3.new(0, 0, 0), + RunAnimation = 0, + Shirt = 0, + ShouldersAccessory = "", + SwimAnimation = 0, + Torso = 0, + TorsoColor = Color3.new(0, 0, 0), + WaistAccessory = "", + WalkAnimation = 0, + WidthScale = 1, + }, + }, + ILegacyStudioBridge = { + name = "ILegacyStudioBridge", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + ImageButton = { + name = "ImageButton", + superclass = "GuiButton", + properties = { + HoverImage = { + name = "HoverImage", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Image = { + name = "Image", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageColor3 = { + name = "ImageColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageRectOffset = { + name = "ImageRectOffset", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageRectSize = { + name = "ImageRectSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageTransparency = { + name = "ImageTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsLoaded = { + name = "IsLoaded", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PressedImage = { + name = "PressedImage", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScaleType = { + name = "ScaleType", + type = {type = "Enum", name = "ScaleType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SliceCenter = { + name = "SliceCenter", + type = {type = "Data", name = "Rect"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SliceScale = { + name = "SliceScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TileSize = { + name = "TileSize", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = true, + AnchorPoint = Vector2.new(0, 0), + AutoButtonColor = true, + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClipsDescendants = false, + Draggable = false, + HoverImage = "", + Image = "", + ImageColor3 = Color3.new(1, 1, 1), + ImageRectOffset = Vector2.new(0, 0), + ImageRectSize = Vector2.new(0, 0), + ImageTransparency = 0, + LayoutOrder = 0, + Localize = true, + Modal = false, + Name = "ImageButton", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Position = UDim2.new(0, 0, 0, 0), + PressedImage = "", + RootLocalizationTable = nil, + Rotation = 0, + ScaleType = 0, + Selectable = true, + Selected = false, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + SliceCenter = Rect.new(0, 0, 0, 0), + SliceScale = 1, + Style = 0, + TileSize = UDim2.new(1, 0, 1, 0), + Transparency = 0, + Visible = true, + ZIndex = 1, + }, + }, + ImageHandleAdornment = { + name = "ImageHandleAdornment", + superclass = "HandleAdornment", + properties = { + Image = { + name = "Image", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AdornCullingMode = 0, + Adornee = nil, + AlwaysOnTop = false, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Color = BrickColor.new(1), + Color3 = Color3.new(0.9490197, 0.95294124, 0.95294124), + Image = "rbxasset://textures/SurfacesDefault.png", + Name = "ImageHandleAdornment", + Size = Vector2.new(1, 1), + SizeRelativeOffset = Vector3.new(0, 0, 0), + Transparency = 0, + Visible = true, + ZIndex = -1, + }, + }, + ImageLabel = { + name = "ImageLabel", + superclass = "GuiLabel", + properties = { + Image = { + name = "Image", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageColor3 = { + name = "ImageColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageRectOffset = { + name = "ImageRectOffset", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageRectSize = { + name = "ImageRectSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageTransparency = { + name = "ImageTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsLoaded = { + name = "IsLoaded", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ScaleType = { + name = "ScaleType", + type = {type = "Enum", name = "ScaleType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SliceCenter = { + name = "SliceCenter", + type = {type = "Data", name = "Rect"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SliceScale = { + name = "SliceScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TileSize = { + name = "TileSize", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + AnchorPoint = Vector2.new(0, 0), + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClipsDescendants = false, + Draggable = false, + Image = "", + ImageColor3 = Color3.new(1, 1, 1), + ImageRectOffset = Vector2.new(0, 0), + ImageRectSize = Vector2.new(0, 0), + ImageTransparency = 0, + LayoutOrder = 0, + Localize = true, + Name = "ImageLabel", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Position = UDim2.new(0, 0, 0, 0), + RootLocalizationTable = nil, + Rotation = 0, + ScaleType = 0, + Selectable = false, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + SliceCenter = Rect.new(0, 0, 0, 0), + SliceScale = 1, + TileSize = UDim2.new(1, 0, 1, 0), + Transparency = 0, + Visible = true, + ZIndex = 1, + }, + }, + InputObject = { + name = "InputObject", + superclass = "Instance", + properties = { + Delta = { + name = "Delta", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + KeyCode = { + name = "KeyCode", + type = {type = "Enum", name = "KeyCode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Position = { + name = "Position", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + UserInputState = { + name = "UserInputState", + type = {type = "Enum", name = "UserInputState"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + UserInputType = { + name = "UserInputType", + type = {type = "Enum", name = "UserInputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + InsertService = { + name = "InsertService", + superclass = "Instance", + properties = { + AllowClientInsertModels = { + name = "AllowClientInsertModels", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + AllowInsertFreeModels = { + name = "AllowInsertFreeModels", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AllowInsertFreeModels = false, + Name = "InsertService", + }, + }, + Instance = { + name = "Instance", + superclass = nil, + properties = { + Archivable = { + name = "Archivable", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = "archivable", + scriptability = "ReadWrite", + serializes = true, + }, + ClassName = { + name = "ClassName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DataCost = { + name = "DataCost", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Name = { + name = "Name", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Parent = { + name = "Parent", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RobloxLocked = { + name = "RobloxLocked", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + SourceAssetId = { + name = "SourceAssetId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + Tags = { + name = "Tags", + type = {type = "Data", name = "BinaryString"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Custom", + serializes = true, + }, + archivable = { + name = "archivable", + type = {type = "Data", name = "Bool"}, + isCanonical = false, + canonicalName = "Archivable", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + className = { + name = "className", + type = {type = "Data", name = "String"}, + isCanonical = false, + canonicalName = "ClassName", + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + InstanceAdornment = { + name = "InstanceAdornment", + superclass = "GuiBase3d", + properties = { + Adornee = { + name = "Adornee", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + IntConstrainedValue = { + name = "IntConstrainedValue", + superclass = "ValueBase", + properties = { + ConstrainedValue = { + name = "ConstrainedValue", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + MaxValue = { + name = "MaxValue", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MinValue = { + name = "MinValue", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Value = { + name = "Value", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + ConstrainedValue = 0, + MaxValue = 10, + MinValue = 0, + Name = "Value", + Value = 0, + }, + }, + IntValue = { + name = "IntValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = 0, + }, + }, + InternalContainer = { + name = "InternalContainer", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + InventoryPages = { + name = "InventoryPages", + superclass = "Pages", + properties = { + }, + defaults = { + }, + }, + JointInstance = { + name = "JointInstance", + superclass = "Instance", + properties = { + Active = { + name = "Active", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + C0 = { + name = "C0", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + C1 = { + name = "C1", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Part0 = { + name = "Part0", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Part1 = { + name = "Part1", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + part1 = { + name = "part1", + type = {type = "Data", name = "Ref"}, + isCanonical = false, + canonicalName = "Part1", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + JointsService = { + name = "JointsService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "JointsService", + }, + }, + KeyboardService = { + name = "KeyboardService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + Keyframe = { + name = "Keyframe", + superclass = "Instance", + properties = { + Time = { + name = "Time", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Keyframe", + Time = 0, + }, + }, + KeyframeMarker = { + name = "KeyframeMarker", + superclass = "Instance", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "KeyframeMarker", + Value = "", + }, + }, + KeyframeSequence = { + name = "KeyframeSequence", + superclass = "Instance", + properties = { + AuthoredHipHeight = { + name = "AuthoredHipHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Loop = { + name = "Loop", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Priority = { + name = "Priority", + type = {type = "Enum", name = "AnimationPriority"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AuthoredHipHeight = 2, + Loop = true, + Name = "KeyframeSequence", + Priority = 2, + }, + }, + KeyframeSequenceProvider = { + name = "KeyframeSequenceProvider", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + LanguageService = { + name = "LanguageService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "LanguageService", + }, + }, + LayerCollector = { + name = "LayerCollector", + superclass = "GuiBase2d", + properties = { + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ResetOnSpawn = { + name = "ResetOnSpawn", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ZIndexBehavior = { + name = "ZIndexBehavior", + type = {type = "Enum", name = "ZIndexBehavior"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + LegacyStudioBridge = { + name = "LegacyStudioBridge", + superclass = "ILegacyStudioBridge", + properties = { + }, + defaults = { + }, + }, + Light = { + name = "Light", + superclass = "Instance", + properties = { + Brightness = { + name = "Brightness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Shadows = { + name = "Shadows", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + Lighting = { + name = "Lighting", + superclass = "Instance", + properties = { + Ambient = { + name = "Ambient", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Brightness = { + name = "Brightness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClockTime = { + name = "ClockTime", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ColorShift_Bottom = { + name = "ColorShift_Bottom", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ColorShift_Top = { + name = "ColorShift_Top", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EnvironmentDiffuseScale = { + name = "EnvironmentDiffuseScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EnvironmentSpecularScale = { + name = "EnvironmentSpecularScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ExposureCompensation = { + name = "ExposureCompensation", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FogColor = { + name = "FogColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FogEnd = { + name = "FogEnd", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FogStart = { + name = "FogStart", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GeographicLatitude = { + name = "GeographicLatitude", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GlobalShadows = { + name = "GlobalShadows", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OutdoorAmbient = { + name = "OutdoorAmbient", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Outlines = { + name = "Outlines", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShadowColor = { + name = "ShadowColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ShadowSoftness = { + name = "ShadowSoftness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Technology = { + name = "Technology", + type = {type = "Enum", name = "Technology"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + TimeOfDay = { + name = "TimeOfDay", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Ambient = Color3.new(0.5, 0.5, 0.5), + Brightness = 1, + ClockTime = 14, + ColorShift_Bottom = Color3.new(0, 0, 0), + ColorShift_Top = Color3.new(0, 0, 0), + EnvironmentDiffuseScale = 0, + EnvironmentSpecularScale = 0, + ExposureCompensation = 0, + FogColor = Color3.new(0.75, 0.75, 0.75), + FogEnd = 100000, + FogStart = 0, + GeographicLatitude = 41.7333, + GlobalShadows = false, + Name = "Lighting", + OutdoorAmbient = Color3.new(0.5, 0.5, 0.5), + Outlines = true, + ShadowColor = Color3.new(0.7, 0.7, 0.72), + ShadowSoftness = 0.5, + TimeOfDay = "14:00:00", + }, + }, + LineForce = { + name = "LineForce", + superclass = "Constraint", + properties = { + ApplyAtCenterOfMass = { + name = "ApplyAtCenterOfMass", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + InverseSquareLaw = { + name = "InverseSquareLaw", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Magnitude = { + name = "Magnitude", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxForce = { + name = "MaxForce", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReactionForceEnabled = { + name = "ReactionForceEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + ApplyAtCenterOfMass = false, + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(23), + Enabled = true, + InverseSquareLaw = false, + Magnitude = 1000, + MaxForce = 1000000000, + Name = "LineForce", + ReactionForceEnabled = false, + Visible = false, + }, + }, + LineHandleAdornment = { + name = "LineHandleAdornment", + superclass = "HandleAdornment", + properties = { + Length = { + name = "Length", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Thickness = { + name = "Thickness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AdornCullingMode = 0, + Adornee = nil, + AlwaysOnTop = false, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Length = 5, + Name = "LineHandleAdornment", + SizeRelativeOffset = Vector3.new(0, 0, 0), + Thickness = 1, + Transparency = 0, + Visible = true, + ZIndex = -1, + }, + }, + LocalScript = { + name = "LocalScript", + superclass = "Script", + properties = { + }, + defaults = { + Disabled = false, + LinkedSource = "", + Name = "LocalScript", + Source = "", + }, + }, + LocalStorageService = { + name = "LocalStorageService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + LocalizationService = { + name = "LocalizationService", + superclass = "Instance", + properties = { + ForcePlayModeGameLocaleId = { + name = "ForcePlayModeGameLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + ForcePlayModeRobloxLocaleId = { + name = "ForcePlayModeRobloxLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + IsTextScraperRunning = { + name = "IsTextScraperRunning", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + RobloxForcePlayModeGameLocaleId = { + name = "RobloxForcePlayModeGameLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + RobloxForcePlayModeRobloxLocaleId = { + name = "RobloxForcePlayModeRobloxLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + RobloxLocaleId = { + name = "RobloxLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + SystemLocaleId = { + name = "SystemLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "LocalizationService", + }, + }, + LocalizationTable = { + name = "LocalizationTable", + superclass = "Instance", + properties = { + Contents = { + name = "Contents", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Custom", + serializes = true, + }, + DevelopmentLanguage = { + name = "DevelopmentLanguage", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Root = { + name = "Root", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + SourceLocaleId = { + name = "SourceLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + DevelopmentLanguage = "en-us", + Name = "LocalizationTable", + Root = nil, + SourceLocaleId = "en-us", + }, + }, + LogService = { + name = "LogService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "LogService", + }, + }, + LoginService = { + name = "LoginService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + LuaSettings = { + name = "LuaSettings", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + LuaSourceContainer = { + name = "LuaSourceContainer", + superclass = "Instance", + properties = { + CurrentEditor = { + name = "CurrentEditor", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + IsDifferentFromFileSystem = { + name = "IsDifferentFromFileSystem", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + }, + }, + LuaWebService = { + name = "LuaWebService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ManualGlue = { + name = "ManualGlue", + superclass = "ManualSurfaceJointInstance", + properties = { + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + Name = "ManualGlue", + Part0 = nil, + Part1 = nil, + }, + }, + ManualSurfaceJointInstance = { + name = "ManualSurfaceJointInstance", + superclass = "JointInstance", + properties = { + }, + defaults = { + }, + }, + ManualWeld = { + name = "ManualWeld", + superclass = "ManualSurfaceJointInstance", + properties = { + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + Name = "ManualWeld", + Part0 = nil, + Part1 = nil, + }, + }, + MarketplaceService = { + name = "MarketplaceService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "MarketplaceService", + }, + }, + MemStorageConnection = { + name = "MemStorageConnection", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + MemStorageService = { + name = "MemStorageService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "MemStorageService", + }, + }, + MeshContentProvider = { + name = "MeshContentProvider", + superclass = "CacheableContentProvider", + properties = { + }, + defaults = { + Name = "MeshContentProvider", + }, + }, + MeshPart = { + name = "MeshPart", + superclass = "TriangleMeshPart", + properties = { + DoubleSided = { + name = "DoubleSided", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HasJointOffset = { + name = "HasJointOffset", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = true, + }, + HasSkinnedMesh = { + name = "HasSkinnedMesh", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = true, + }, + JointOffset = { + name = "JointOffset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = true, + }, + MeshID = { + name = "MeshID", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + MeshId = { + name = "MeshId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = true, + }, + MeshSize = { + name = "MeshSize", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + RenderFidelity = { + name = "RenderFidelity", + type = {type = "Enum", name = "RenderFidelity"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureID = { + name = "TextureID", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 0, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionFidelity = 2, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + DoubleSided = false, + Elasticity = 0.5, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + HasJointOffset = false, + HasSkinnedMesh = false, + JointOffset = Vector3.new(0, 0, 0), + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + MeshId = "", + Name = "MeshPart", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RenderFidelity = 1, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(4, 1.2, 2), + TextureID = "", + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 0, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + Message = { + name = "Message", + superclass = "Instance", + properties = { + Text = { + name = "Text", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Message", + Text = "", + }, + }, + MessagingService = { + name = "MessagingService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "MessagingService", + }, + }, + Model = { + name = "Model", + superclass = "PVInstance", + properties = { + LevelOfDetail = { + name = "LevelOfDetail", + type = {type = "Enum", name = "ModelLevelOfDetail"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PrimaryPart = { + name = "PrimaryPart", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + LevelOfDetail = 0, + Name = "Model", + PrimaryPart = nil, + }, + }, + ModuleScript = { + name = "ModuleScript", + superclass = "LuaSourceContainer", + properties = { + LinkedSource = { + name = "LinkedSource", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Source = { + name = "Source", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + LinkedSource = "", + Name = "ModuleScript", + Source = "", + }, + }, + Motor = { + name = "Motor", + superclass = "JointInstance", + properties = { + CurrentAngle = { + name = "CurrentAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + DesiredAngle = { + name = "DesiredAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxVelocity = { + name = "MaxVelocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CurrentAngle = 0, + DesiredAngle = 0, + Enabled = true, + MaxVelocity = 0, + Name = "Motor", + Part0 = nil, + Part1 = nil, + }, + }, + Motor6D = { + name = "Motor6D", + superclass = "Motor", + properties = { + ChildName = { + name = "ChildName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + ParentName = { + name = "ParentName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + Transform = { + name = "Transform", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CurrentAngle = 0, + DesiredAngle = 0, + Enabled = true, + MaxVelocity = 0, + Name = "Motor6D", + Part0 = nil, + Part1 = nil, + Transform = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + }, + }, + MotorFeature = { + name = "MotorFeature", + superclass = "Feature", + properties = { + }, + defaults = { + FaceId = 0, + InOut = 2, + LeftRight = 1, + Name = "MotorFeature", + TopBottom = 1, + }, + }, + Mouse = { + name = "Mouse", + superclass = "Instance", + properties = { + Hit = { + name = "Hit", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Icon = { + name = "Icon", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Origin = { + name = "Origin", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Target = { + name = "Target", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TargetFilter = { + name = "TargetFilter", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TargetSurface = { + name = "TargetSurface", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + UnitRay = { + name = "UnitRay", + type = {type = "Unimplemented", name = "Ray"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ViewSizeX = { + name = "ViewSizeX", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ViewSizeY = { + name = "ViewSizeY", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + X = { + name = "X", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Y = { + name = "Y", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + hit = { + name = "hit", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + target = { + name = "target", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + MouseService = { + name = "MouseService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + MultipleDocumentInterfaceInstance = { + name = "MultipleDocumentInterfaceInstance", + superclass = "Instance", + properties = { + FocusedDataModelSession = { + name = "FocusedDataModelSession", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + NegateOperation = { + name = "NegateOperation", + superclass = "PartOperation", + properties = { + }, + defaults = { + Anchored = true, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 0, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = false, + CanTouch = true, + CastShadow = true, + CollisionFidelity = 2, + CollisionGroupId = 0, + Color = Color3.new(1, 1, 1), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "NegativePart", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RenderFidelity = 1, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(4, 1.2, 2), + SmoothingAngle = 0, + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 0, + TopSurfaceInput = 0, + Transparency = 0.1, + UsePartColor = false, + Velocity = Vector3.new(0, 0, 0), + }, + }, + NetworkClient = { + name = "NetworkClient", + superclass = "NetworkPeer", + properties = { + }, + defaults = { + }, + }, + NetworkMarker = { + name = "NetworkMarker", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + NetworkPeer = { + name = "NetworkPeer", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + NetworkReplicator = { + name = "NetworkReplicator", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + NetworkServer = { + name = "NetworkServer", + superclass = "NetworkPeer", + properties = { + }, + defaults = { + }, + }, + NetworkSettings = { + name = "NetworkSettings", + superclass = "Instance", + properties = { + ExtraMemoryUsed = { + name = "ExtraMemoryUsed", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + FreeMemoryMBytes = { + name = "FreeMemoryMBytes", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + HttpProxyEnabled = { + name = "HttpProxyEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HttpProxyURL = { + name = "HttpProxyURL", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IncomingReplicationLag = { + name = "IncomingReplicationLag", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PrintJoinSizeBreakdown = { + name = "PrintJoinSizeBreakdown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PrintPhysicsErrors = { + name = "PrintPhysicsErrors", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PrintStreamInstanceQuota = { + name = "PrintStreamInstanceQuota", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RenderStreamedRegions = { + name = "RenderStreamedRegions", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShowActiveAnimationAsset = { + name = "ShowActiveAnimationAsset", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TrackDataTypes = { + name = "TrackDataTypes", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TrackPhysicsDetails = { + name = "TrackPhysicsDetails", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + NoCollisionConstraint = { + name = "NoCollisionConstraint", + superclass = "Instance", + properties = { + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Part0 = { + name = "Part0", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Part1 = { + name = "Part1", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + Name = "NoCollisionConstraint", + Part0 = nil, + Part1 = nil, + }, + }, + NonReplicatedCSGDictionaryService = { + name = "NonReplicatedCSGDictionaryService", + superclass = "FlyweightService", + properties = { + }, + defaults = { + }, + }, + NotificationService = { + name = "NotificationService", + superclass = "Instance", + properties = { + IsLuaChatEnabled = { + name = "IsLuaChatEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsLuaGameDetailsEnabled = { + name = "IsLuaGameDetailsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + SelectedTheme = { + name = "SelectedTheme", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + Name = "NotificationService", + }, + }, + NumberPose = { + name = "NumberPose", + superclass = "PoseBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + EasingDirection = 0, + EasingStyle = 0, + Name = "Pose", + Value = 0, + Weight = 1, + }, + }, + NumberValue = { + name = "NumberValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = 0, + }, + }, + ObjectValue = { + name = "ObjectValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = nil, + }, + }, + OrderedDataStore = { + name = "OrderedDataStore", + superclass = "GlobalDataStore", + properties = { + }, + defaults = { + }, + }, + OutfitPages = { + name = "OutfitPages", + superclass = "Pages", + properties = { + }, + defaults = { + }, + }, + PVAdornment = { + name = "PVAdornment", + superclass = "GuiBase3d", + properties = { + Adornee = { + name = "Adornee", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + PVInstance = { + name = "PVInstance", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + PackageLink = { + name = "PackageLink", + superclass = "Instance", + properties = { + AutoUpdate = { + name = "AutoUpdate", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + PackageId = { + name = "PackageId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Status = { + name = "Status", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + VersionNumber = { + name = "VersionNumber", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + PackageService = { + name = "PackageService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + Pages = { + name = "Pages", + superclass = "Instance", + properties = { + IsFinished = { + name = "IsFinished", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + Pants = { + name = "Pants", + superclass = "Clothing", + properties = { + PantsTemplate = { + name = "PantsTemplate", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color3 = Color3.new(1, 1, 1), + Name = "Clothing", + PantsTemplate = "", + }, + }, + ParabolaAdornment = { + name = "ParabolaAdornment", + superclass = "PVAdornment", + properties = { + A = { + name = "A", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + B = { + name = "B", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + C = { + name = "C", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Range = { + name = "Range", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Thickness = { + name = "Thickness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + Part = { + name = "Part", + superclass = "FormFactorPart", + properties = { + Shape = { + name = "Shape", + type = {type = "Enum", name = "PartType"}, + isCanonical = true, + canonicalName = nil, + serializedName = "shape", + scriptability = "ReadWrite", + serializes = true, + }, + shape = { + name = "shape", + type = {type = "Enum", name = "PartType"}, + isCanonical = false, + canonicalName = "Shape", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 4, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + FormFactor = 1, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "Part", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Shape = 1, + Size = Vector3.new(4, 1.2, 2), + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 3, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + PartAdornment = { + name = "PartAdornment", + superclass = "GuiBase3d", + properties = { + Adornee = { + name = "Adornee", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + PartOperation = { + name = "PartOperation", + superclass = "TriangleMeshPart", + properties = { + RenderFidelity = { + name = "RenderFidelity", + type = {type = "Enum", name = "RenderFidelity"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SmoothingAngle = { + name = "SmoothingAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TriangleCount = { + name = "TriangleCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + UsePartColor = { + name = "UsePartColor", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 0, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionFidelity = 2, + CollisionGroupId = 0, + Color = Color3.new(1, 1, 1), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "PartOperation", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RenderFidelity = 1, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(4, 1.2, 2), + SmoothingAngle = 0, + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 0, + TopSurfaceInput = 0, + Transparency = 0, + UsePartColor = false, + Velocity = Vector3.new(0, 0, 0), + }, + }, + PartOperationAsset = { + name = "PartOperationAsset", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ParticleEmitter = { + name = "ParticleEmitter", + superclass = "Instance", + properties = { + Acceleration = { + name = "Acceleration", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Color = { + name = "Color", + type = {type = "Data", name = "ColorSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Drag = { + name = "Drag", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EmissionDirection = { + name = "EmissionDirection", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Lifetime = { + name = "Lifetime", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightEmission = { + name = "LightEmission", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightInfluence = { + name = "LightInfluence", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LockedToPart = { + name = "LockedToPart", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rate = { + name = "Rate", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RotSpeed = { + name = "RotSpeed", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rotation = { + name = "Rotation", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "NumberSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Speed = { + name = "Speed", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SpreadAngle = { + name = "SpreadAngle", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Texture = { + name = "Texture", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "NumberSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VelocityInheritance = { + name = "VelocityInheritance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VelocitySpread = { + name = "VelocitySpread", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ZOffset = { + name = "ZOffset", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Acceleration = Vector3.new(0, 0, 0), + Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.new(1, 1, 1)), ColorSequenceKeypoint.new(1, Color3.new(1, 1, 1))}), + Drag = 0, + EmissionDirection = 1, + Enabled = true, + Lifetime = NumberRange.new(5, 10), + LightEmission = 0, + LightInfluence = 0, + LockedToPart = false, + Name = "ParticleEmitter", + Rate = 20, + RotSpeed = NumberRange.new(0, 0), + Rotation = NumberRange.new(0, 0), + Size = NumberSequence.new({NumberSequenceKeypoint.new(0, 1, 0), NumberSequenceKeypoint.new(1, 1, 0)}), + Speed = NumberRange.new(5, 5), + SpreadAngle = Vector2.new(0, 0), + Texture = "rbxasset://textures/particles/sparkles_main.dds", + Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0, 0, 0), NumberSequenceKeypoint.new(1, 0, 0)}), + VelocityInheritance = 0, + VelocitySpread = 0, + ZOffset = 0, + }, + }, + Path = { + name = "Path", + superclass = "Instance", + properties = { + Status = { + name = "Status", + type = {type = "Enum", name = "PathStatus"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + PathfindingService = { + name = "PathfindingService", + superclass = "Instance", + properties = { + EmptyCutoff = { + name = "EmptyCutoff", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + EmptyCutoff = 0, + Name = "Instance", + }, + }, + PermissionsService = { + name = "PermissionsService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "PermissionsService", + }, + }, + PhysicsService = { + name = "PhysicsService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "PhysicsService", + }, + }, + PhysicsSettings = { + name = "PhysicsSettings", + superclass = "Instance", + properties = { + AllowSleep = { + name = "AllowSleep", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreAnchorsShown = { + name = "AreAnchorsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreAssembliesShown = { + name = "AreAssembliesShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreAwakePartsHighlighted = { + name = "AreAwakePartsHighlighted", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreBodyTypesShown = { + name = "AreBodyTypesShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreContactIslandsShown = { + name = "AreContactIslandsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreContactPointsShown = { + name = "AreContactPointsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreJointCoordinatesShown = { + name = "AreJointCoordinatesShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreMechanismsShown = { + name = "AreMechanismsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreModelCoordsShown = { + name = "AreModelCoordsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreOwnersShown = { + name = "AreOwnersShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ArePartCoordsShown = { + name = "ArePartCoordsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreRegionsShown = { + name = "AreRegionsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreTerrainReplicationRegionsShown = { + name = "AreTerrainReplicationRegionsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreUnalignedPartsShown = { + name = "AreUnalignedPartsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AreWorldCoordsShown = { + name = "AreWorldCoordsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DisableCSGv2 = { + name = "DisableCSGv2", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ForceCSGv2 = { + name = "ForceCSGv2", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsInterpolationThrottleShown = { + name = "IsInterpolationThrottleShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsReceiveAgeShown = { + name = "IsReceiveAgeShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsTreeShown = { + name = "IsTreeShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PhysicsEnvironmentalThrottle = { + name = "PhysicsEnvironmentalThrottle", + type = {type = "Enum", name = "EnviromentalPhysicsThrottle"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShowDecompositionGeometry = { + name = "ShowDecompositionGeometry", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ThrottleAdjustTime = { + name = "ThrottleAdjustTime", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UseCSGv2 = { + name = "UseCSGv2", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + PitchShiftSoundEffect = { + name = "PitchShiftSoundEffect", + superclass = "SoundEffect", + properties = { + Octave = { + name = "Octave", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + Name = "PitchShiftSoundEffect", + Octave = 1.25, + Priority = 0, + }, + }, + Platform = { + name = "Platform", + superclass = "Part", + properties = { + }, + defaults = { + }, + }, + Player = { + name = "Player", + superclass = "Instance", + properties = { + AccountAge = { + name = "AccountAge", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AppearanceDidLoad = { + name = "AppearanceDidLoad", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AutoJumpEnabled = { + name = "AutoJumpEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraMaxZoomDistance = { + name = "CameraMaxZoomDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraMinZoomDistance = { + name = "CameraMinZoomDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraMode = { + name = "CameraMode", + type = {type = "Enum", name = "CameraMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CanLoadCharacterAppearance = { + name = "CanLoadCharacterAppearance", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Character = { + name = "Character", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CharacterAppearance = { + name = "CharacterAppearance", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CharacterAppearanceId = { + name = "CharacterAppearanceId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ChatMode = { + name = "ChatMode", + type = {type = "Enum", name = "ChatMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DataComplexity = { + name = "DataComplexity", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DataComplexityLimit = { + name = "DataComplexityLimit", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + DataReady = { + name = "DataReady", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DevCameraOcclusionMode = { + name = "DevCameraOcclusionMode", + type = {type = "Enum", name = "DevCameraOcclusionMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevComputerCameraMode = { + name = "DevComputerCameraMode", + type = {type = "Enum", name = "DevComputerCameraMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevComputerMovementMode = { + name = "DevComputerMovementMode", + type = {type = "Enum", name = "DevComputerMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevEnableMouseLock = { + name = "DevEnableMouseLock", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevTouchCameraMode = { + name = "DevTouchCameraMode", + type = {type = "Enum", name = "DevTouchCameraMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevTouchMovementMode = { + name = "DevTouchMovementMode", + type = {type = "Enum", name = "DevTouchMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DisplayName = { + name = "DisplayName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + FollowUserId = { + name = "FollowUserId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + GameplayPaused = { + name = "GameplayPaused", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Guest = { + name = "Guest", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + HealthDisplayDistance = { + name = "HealthDisplayDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LocaleId = { + name = "LocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MaximumSimulationRadius = { + name = "MaximumSimulationRadius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + MembershipType = { + name = "MembershipType", + type = {type = "Enum", name = "MembershipType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + NameDisplayDistance = { + name = "NameDisplayDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Neutral = { + name = "Neutral", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OsPlatform = { + name = "OsPlatform", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + PlatformName = { + name = "PlatformName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ReplicationFocus = { + name = "ReplicationFocus", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RespawnLocation = { + name = "RespawnLocation", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SimulationRadius = { + name = "SimulationRadius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Team = { + name = "Team", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TeamColor = { + name = "TeamColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Teleported = { + name = "Teleported", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TeleportedIn = { + name = "TeleportedIn", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UserId = { + name = "UserId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + VRDevice = { + name = "VRDevice", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + userId = { + name = "userId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + PlayerEmulatorService = { + name = "PlayerEmulatorService", + superclass = "Instance", + properties = { + EmulatedCountryCode = { + name = "EmulatedCountryCode", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + EmulatedGameLocale = { + name = "EmulatedGameLocale", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + PlayerEmulationEnabled = { + name = "PlayerEmulationEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + PlayerEmulationEnabled_deprecated = { + name = "PlayerEmulationEnabled_deprecated", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + SerializedEmulatedPolicyInfo = { + name = "SerializedEmulatedPolicyInfo", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + StudioEmulatedCountryRegionCode = { + name = "StudioEmulatedCountryRegionCode", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + }, + }, + PlayerGui = { + name = "PlayerGui", + superclass = "BasePlayerGui", + properties = { + CurrentScreenOrientation = { + name = "CurrentScreenOrientation", + type = {type = "Enum", name = "ScreenOrientation"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ScreenOrientation = { + name = "ScreenOrientation", + type = {type = "Enum", name = "ScreenOrientation"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SelectionImageObject = { + name = "SelectionImageObject", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + PlayerMouse = { + name = "PlayerMouse", + superclass = "Mouse", + properties = { + }, + defaults = { + }, + }, + PlayerScripts = { + name = "PlayerScripts", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Players = { + name = "Players", + superclass = "Instance", + properties = { + BubbleChat = { + name = "BubbleChat", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + CharacterAutoLoads = { + name = "CharacterAutoLoads", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClassicChat = { + name = "ClassicChat", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + LocalPlayer = { + name = "LocalPlayer", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MaxPlayers = { + name = "MaxPlayers", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "MaxPlayersInternal", + scriptability = "Read", + serializes = true, + }, + MaxPlayersInternal = { + name = "MaxPlayersInternal", + type = {type = "Data", name = "Int32"}, + isCanonical = false, + canonicalName = "MaxPlayers", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + NumPlayers = { + name = "NumPlayers", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PreferredPlayers = { + name = "PreferredPlayers", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "PreferredPlayersInternal", + scriptability = "Read", + serializes = true, + }, + PreferredPlayersInternal = { + name = "PreferredPlayersInternal", + type = {type = "Data", name = "Int32"}, + isCanonical = false, + canonicalName = "PreferredPlayers", + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RespawnTime = { + name = "RespawnTime", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + localPlayer = { + name = "localPlayer", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + numPlayers = { + name = "numPlayers", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + CharacterAutoLoads = true, + Name = "Players", + RespawnTime = 5, + }, + }, + Plugin = { + name = "Plugin", + superclass = "Instance", + properties = { + CollisionEnabled = { + name = "CollisionEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + GridSize = { + name = "GridSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + HostDataModelType = { + name = "HostDataModelType", + type = {type = "Enum", name = "StudioDataModelType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + HostDataModelTypeIsCurrent = { + name = "HostDataModelTypeIsCurrent", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MultipleDocumentInterfaceInstance = { + name = "MultipleDocumentInterfaceInstance", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + UsesAssetInsertionDrag = { + name = "UsesAssetInsertionDrag", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + PluginAction = { + name = "PluginAction", + superclass = "Instance", + properties = { + ActionId = { + name = "ActionId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AllowBinding = { + name = "AllowBinding", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Checked = { + name = "Checked", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + DefaultShortcut = { + name = "DefaultShortcut", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + StatusTip = { + name = "StatusTip", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Text = { + name = "Text", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "Instance", + }, + }, + PluginDebugService = { + name = "PluginDebugService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + PluginDragEvent = { + name = "PluginDragEvent", + superclass = "Instance", + properties = { + Data = { + name = "Data", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MimeType = { + name = "MimeType", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Position = { + name = "Position", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Sender = { + name = "Sender", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + PluginGui = { + name = "PluginGui", + superclass = "LayerCollector", + properties = { + Title = { + name = "Title", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + PluginGuiService = { + name = "PluginGuiService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "PluginGuiService", + }, + }, + PluginManager = { + name = "PluginManager", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + PluginManagerInterface = { + name = "PluginManagerInterface", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + PluginMenu = { + name = "PluginMenu", + superclass = "Instance", + properties = { + Icon = { + name = "Icon", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Title = { + name = "Title", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + PluginMouse = { + name = "PluginMouse", + superclass = "Mouse", + properties = { + }, + defaults = { + }, + }, + PluginToolbar = { + name = "PluginToolbar", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + PluginToolbarButton = { + name = "PluginToolbarButton", + superclass = "Instance", + properties = { + ClickableWhenViewportHidden = { + name = "ClickableWhenViewportHidden", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Icon = { + name = "Icon", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + PointLight = { + name = "PointLight", + superclass = "Light", + properties = { + Range = { + name = "Range", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Brightness = 1, + Color = Color3.new(1, 1, 1), + Enabled = true, + Name = "PointLight", + Range = 8, + Shadows = false, + }, + }, + PointsService = { + name = "PointsService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "PointsService", + }, + }, + PolicyService = { + name = "PolicyService", + superclass = "Instance", + properties = { + IsLuobuServer = { + name = "IsLuobuServer", + type = {type = "Enum", name = "TriStateBoolean"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + LuobuWhitelisted = { + name = "LuobuWhitelisted", + type = {type = "Enum", name = "TriStateBoolean"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + Name = "PolicyService", + }, + }, + Pose = { + name = "Pose", + superclass = "PoseBase", + properties = { + CFrame = { + name = "CFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaskWeight = { + name = "MaskWeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + EasingDirection = 0, + EasingStyle = 0, + MaskWeight = 0, + Name = "Pose", + Weight = 1, + }, + }, + PoseBase = { + name = "PoseBase", + superclass = "Instance", + properties = { + EasingDirection = { + name = "EasingDirection", + type = {type = "Enum", name = "PoseEasingDirection"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EasingStyle = { + name = "EasingStyle", + type = {type = "Enum", name = "PoseEasingStyle"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Weight = { + name = "Weight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + PostEffect = { + name = "PostEffect", + superclass = "Instance", + properties = { + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + PrismaticConstraint = { + name = "PrismaticConstraint", + superclass = "SlidingBallConstraint", + properties = { + }, + defaults = { + ActuatorType = 0, + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(1009), + Enabled = true, + LimitsEnabled = false, + LowerLimit = 0, + MotorMaxAcceleration = 1000000000, + MotorMaxForce = 0, + Name = "PrismaticConstraint", + Restitution = 0, + ServoMaxForce = 0, + Size = 0.15, + Speed = 0, + TargetPosition = 0, + UpperLimit = 5, + Velocity = 0, + Visible = false, + }, + }, + ProximityPrompt = { + name = "ProximityPrompt", + superclass = "Instance", + properties = { + ActionText = { + name = "ActionText", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AutoLocalize = { + name = "AutoLocalize", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClickablePrompt = { + name = "ClickablePrompt", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Exclusivity = { + name = "Exclusivity", + type = {type = "Enum", name = "ProximityPromptExclusivity"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GamepadKeyCode = { + name = "GamepadKeyCode", + type = {type = "Enum", name = "KeyCode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HoldDuration = { + name = "HoldDuration", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + KeyboardKeyCode = { + name = "KeyboardKeyCode", + type = {type = "Enum", name = "KeyCode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxActivationDistance = { + name = "MaxActivationDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ObjectText = { + name = "ObjectText", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RequiresLineOfSight = { + name = "RequiresLineOfSight", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RootLocalizationTable = { + name = "RootLocalizationTable", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Style = { + name = "Style", + type = {type = "Enum", name = "ProximityPromptStyle"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UIOffset = { + name = "UIOffset", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + ActionText = "Interact", + AutoLocalize = true, + ClickablePrompt = true, + Enabled = true, + Exclusivity = 0, + GamepadKeyCode = 1000, + HoldDuration = 0, + KeyboardKeyCode = 101, + MaxActivationDistance = 10, + Name = "ProximityPrompt", + ObjectText = "", + RequiresLineOfSight = true, + RootLocalizationTable = nil, + Style = 0, + UIOffset = Vector2.new(0, 0), + }, + }, + ProximityPromptService = { + name = "ProximityPromptService", + superclass = "Instance", + properties = { + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxPromptsVisible = { + name = "MaxPromptsVisible", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + MaxPromptsVisible = 16, + Name = "ProximityPromptService", + }, + }, + QWidgetPluginGui = { + name = "QWidgetPluginGui", + superclass = "PluginGui", + properties = { + }, + defaults = { + }, + }, + RayValue = { + name = "RayValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Unimplemented", name = "Ray"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + }, + }, + RbxAnalyticsService = { + name = "RbxAnalyticsService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + ReflectionMetadata = { + name = "ReflectionMetadata", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ReflectionMetadataCallbacks = { + name = "ReflectionMetadataCallbacks", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ReflectionMetadataClass = { + name = "ReflectionMetadataClass", + superclass = "ReflectionMetadataItem", + properties = { + ExplorerImageIndex = { + name = "ExplorerImageIndex", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ExplorerOrder = { + name = "ExplorerOrder", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Insertable = { + name = "Insertable", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PreferredParent = { + name = "PreferredParent", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Browsable = true, + ClassCategory = "", + ClientOnly = false, + Constraint = "", + Deprecated = false, + EditingDisabled = false, + ExplorerImageIndex = 0, + ExplorerOrder = 2147483647, + Insertable = true, + IsBackend = false, + Name = "Instance", + PreferredParent = "", + ScriptContext = "", + ServerOnly = false, + UIMaximum = 0, + UIMinimum = 0, + UINumTicks = 0, + summary = "", + }, + }, + ReflectionMetadataClasses = { + name = "ReflectionMetadataClasses", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ReflectionMetadataEnum = { + name = "ReflectionMetadataEnum", + superclass = "ReflectionMetadataItem", + properties = { + }, + defaults = { + Browsable = true, + ClassCategory = "", + ClientOnly = false, + Constraint = "", + Deprecated = false, + EditingDisabled = false, + IsBackend = false, + Name = "Instance", + ScriptContext = "", + ServerOnly = false, + UIMaximum = 0, + UIMinimum = 0, + UINumTicks = 0, + summary = "", + }, + }, + ReflectionMetadataEnumItem = { + name = "ReflectionMetadataEnumItem", + superclass = "ReflectionMetadataItem", + properties = { + }, + defaults = { + Browsable = true, + ClassCategory = "", + ClientOnly = false, + Constraint = "", + Deprecated = false, + EditingDisabled = false, + IsBackend = false, + Name = "Instance", + ScriptContext = "", + ServerOnly = false, + UIMaximum = 0, + UIMinimum = 0, + UINumTicks = 0, + summary = "", + }, + }, + ReflectionMetadataEnums = { + name = "ReflectionMetadataEnums", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ReflectionMetadataEvents = { + name = "ReflectionMetadataEvents", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ReflectionMetadataFunctions = { + name = "ReflectionMetadataFunctions", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ReflectionMetadataItem = { + name = "ReflectionMetadataItem", + superclass = "Instance", + properties = { + Browsable = { + name = "Browsable", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClassCategory = { + name = "ClassCategory", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClientOnly = { + name = "ClientOnly", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Constraint = { + name = "Constraint", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Deprecated = { + name = "Deprecated", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EditingDisabled = { + name = "EditingDisabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsBackend = { + name = "IsBackend", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScriptContext = { + name = "ScriptContext", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ServerOnly = { + name = "ServerOnly", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UIMaximum = { + name = "UIMaximum", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UIMinimum = { + name = "UIMinimum", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UINumTicks = { + name = "UINumTicks", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + summary = { + name = "summary", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + ReflectionMetadataMember = { + name = "ReflectionMetadataMember", + superclass = "ReflectionMetadataItem", + properties = { + }, + defaults = { + Browsable = true, + ClassCategory = "", + ClientOnly = false, + Constraint = "", + Deprecated = false, + EditingDisabled = false, + IsBackend = false, + Name = "Instance", + ScriptContext = "", + ServerOnly = false, + UIMaximum = 0, + UIMinimum = 0, + UINumTicks = 0, + summary = "", + }, + }, + ReflectionMetadataProperties = { + name = "ReflectionMetadataProperties", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ReflectionMetadataYieldFunctions = { + name = "ReflectionMetadataYieldFunctions", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + RemoteEvent = { + name = "RemoteEvent", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "RemoteEvent", + }, + }, + RemoteFunction = { + name = "RemoteFunction", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "RemoteFunction", + }, + }, + RenderSettings = { + name = "RenderSettings", + superclass = "Instance", + properties = { + AutoFRMLevel = { + name = "AutoFRMLevel", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EagerBulkExecution = { + name = "EagerBulkExecution", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EditQualityLevel = { + name = "EditQualityLevel", + type = {type = "Enum", name = "QualityLevel"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EnableFRM = { + name = "EnableFRM", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ExportMergeByMaterial = { + name = "ExportMergeByMaterial", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FrameRateManager = { + name = "FrameRateManager", + type = {type = "Enum", name = "FramerateManagerMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GraphicsMode = { + name = "GraphicsMode", + type = {type = "Enum", name = "GraphicsMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MeshCacheSize = { + name = "MeshCacheSize", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MeshPartDetailLevel = { + name = "MeshPartDetailLevel", + type = {type = "Enum", name = "MeshPartDetailLevel"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + QualityLevel = { + name = "QualityLevel", + type = {type = "Enum", name = "QualityLevel"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReloadAssets = { + name = "ReloadAssets", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RenderCSGTrianglesDebug = { + name = "RenderCSGTrianglesDebug", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShowBoundingBoxes = { + name = "ShowBoundingBoxes", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + RenderingTest = { + name = "RenderingTest", + superclass = "Instance", + properties = { + CFrame = { + name = "CFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ComparisonDiffThreshold = { + name = "ComparisonDiffThreshold", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ComparisonMethod = { + name = "ComparisonMethod", + type = {type = "Enum", name = "RenderingTestComparisonMethod"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ComparisonPsnrThreshold = { + name = "ComparisonPsnrThreshold", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Description = { + name = "Description", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FieldOfView = { + name = "FieldOfView", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Orientation = { + name = "Orientation", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Position = { + name = "Position", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + QualityLevel = { + name = "QualityLevel", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShouldSkip = { + name = "ShouldSkip", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Ticket = { + name = "Ticket", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + ComparisonDiffThreshold = 10, + ComparisonMethod = 0, + ComparisonPsnrThreshold = 50, + Description = "", + FieldOfView = 70, + Name = "RenderingTest", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + QualityLevel = 21, + ShouldSkip = false, + Ticket = "", + }, + }, + ReplicatedFirst = { + name = "ReplicatedFirst", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "ReplicatedFirst", + }, + }, + ReplicatedScriptService = { + name = "ReplicatedScriptService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "ReplicatedScriptService", + }, + }, + ReplicatedStorage = { + name = "ReplicatedStorage", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "ReplicatedStorage", + }, + }, + ReverbSoundEffect = { + name = "ReverbSoundEffect", + superclass = "SoundEffect", + properties = { + DecayTime = { + name = "DecayTime", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Density = { + name = "Density", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Diffusion = { + name = "Diffusion", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DryLevel = { + name = "DryLevel", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WetLevel = { + name = "WetLevel", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + DecayTime = 1.5, + Density = 1, + Diffusion = 1, + DryLevel = -6, + Enabled = true, + Name = "ReverbSoundEffect", + Priority = 0, + WetLevel = 0, + }, + }, + RobloxPluginGuiService = { + name = "RobloxPluginGuiService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + RobloxReplicatedStorage = { + name = "RobloxReplicatedStorage", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + RocketPropulsion = { + name = "RocketPropulsion", + superclass = "BodyMover", + properties = { + CartoonFactor = { + name = "CartoonFactor", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxSpeed = { + name = "MaxSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxThrust = { + name = "MaxThrust", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxTorque = { + name = "MaxTorque", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Target = { + name = "Target", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TargetOffset = { + name = "TargetOffset", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TargetRadius = { + name = "TargetRadius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ThrustD = { + name = "ThrustD", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ThrustP = { + name = "ThrustP", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TurnD = { + name = "TurnD", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TurnP = { + name = "TurnP", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CartoonFactor = 0.7, + MaxSpeed = 30, + MaxThrust = 4000, + MaxTorque = Vector3.new(400000, 400000, 0), + Name = "RocketPropulsion", + Target = nil, + TargetOffset = Vector3.new(0, 0, 0), + TargetRadius = 4, + ThrustD = 0.001, + ThrustP = 5, + TurnD = 500, + TurnP = 3000, + }, + }, + RodConstraint = { + name = "RodConstraint", + superclass = "Constraint", + properties = { + CurrentDistance = { + name = "CurrentDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Length = { + name = "Length", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Thickness = { + name = "Thickness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(26), + Enabled = true, + Length = 5, + Name = "RodConstraint", + Thickness = 0.1, + Visible = false, + }, + }, + RopeConstraint = { + name = "RopeConstraint", + superclass = "Constraint", + properties = { + CurrentDistance = { + name = "CurrentDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Length = { + name = "Length", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Restitution = { + name = "Restitution", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Thickness = { + name = "Thickness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(25), + Enabled = true, + Length = 5, + Name = "RopeConstraint", + Restitution = 0, + Thickness = 0.1, + Visible = false, + }, + }, + Rotate = { + name = "Rotate", + superclass = "JointInstance", + properties = { + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + Name = "Rotate", + Part0 = nil, + Part1 = nil, + }, + }, + RotateP = { + name = "RotateP", + superclass = "DynamicRotate", + properties = { + }, + defaults = { + BaseAngle = 0, + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + Name = "RotateP", + Part0 = nil, + Part1 = nil, + }, + }, + RotateV = { + name = "RotateV", + superclass = "DynamicRotate", + properties = { + }, + defaults = { + BaseAngle = 0, + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + Name = "RotateV", + Part0 = nil, + Part1 = nil, + }, + }, + RunService = { + name = "RunService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Run Service", + }, + }, + RunningAverageItemDouble = { + name = "RunningAverageItemDouble", + superclass = "StatsItem", + properties = { + }, + defaults = { + }, + }, + RunningAverageItemInt = { + name = "RunningAverageItemInt", + superclass = "StatsItem", + properties = { + }, + defaults = { + }, + }, + RunningAverageTimeIntervalItem = { + name = "RunningAverageTimeIntervalItem", + superclass = "StatsItem", + properties = { + }, + defaults = { + }, + }, + RuntimeScriptService = { + name = "RuntimeScriptService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + ScreenGui = { + name = "ScreenGui", + superclass = "LayerCollector", + properties = { + DisplayOrder = { + name = "DisplayOrder", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IgnoreGuiInset = { + name = "IgnoreGuiInset", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OnTopOfCoreBlur = { + name = "OnTopOfCoreBlur", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + AutoLocalize = true, + DisplayOrder = 0, + Enabled = true, + IgnoreGuiInset = false, + Localize = true, + Name = "ScreenGui", + ResetOnSpawn = true, + RootLocalizationTable = nil, + ZIndexBehavior = 0, + }, + }, + Script = { + name = "Script", + superclass = "BaseScript", + properties = { + Source = { + name = "Source", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Disabled = false, + LinkedSource = "", + Name = "Script", + Source = "", + }, + }, + ScriptContext = { + name = "ScriptContext", + superclass = "Instance", + properties = { + ScriptsDisabled = { + name = "ScriptsDisabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + Name = "Script Context", + }, + }, + ScriptDebugger = { + name = "ScriptDebugger", + superclass = "Instance", + properties = { + CurrentLine = { + name = "CurrentLine", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsDebugging = { + name = "IsDebugging", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsPaused = { + name = "IsPaused", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Script = { + name = "Script", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + ScriptService = { + name = "ScriptService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + ScrollingFrame = { + name = "ScrollingFrame", + superclass = "GuiObject", + properties = { + AbsoluteCanvasSize = { + name = "AbsoluteCanvasSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AbsoluteWindowSize = { + name = "AbsoluteWindowSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AutomaticCanvasSize = { + name = "AutomaticCanvasSize", + type = {type = "Enum", name = "AutomaticSize"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + BottomImage = { + name = "BottomImage", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CanvasPosition = { + name = "CanvasPosition", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CanvasSize = { + name = "CanvasSize", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ElasticBehavior = { + name = "ElasticBehavior", + type = {type = "Enum", name = "ElasticBehavior"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HorizontalBarRect = { + name = "HorizontalBarRect", + type = {type = "Data", name = "Rect"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + HorizontalScrollBarInset = { + name = "HorizontalScrollBarInset", + type = {type = "Enum", name = "ScrollBarInset"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxCanvasPosition = { + name = "MaxCanvasPosition", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MidImage = { + name = "MidImage", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScrollBarImageColor3 = { + name = "ScrollBarImageColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScrollBarImageTransparency = { + name = "ScrollBarImageTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScrollBarThickness = { + name = "ScrollBarThickness", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScrollingDirection = { + name = "ScrollingDirection", + type = {type = "Enum", name = "ScrollingDirection"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScrollingEnabled = { + name = "ScrollingEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TopImage = { + name = "TopImage", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VerticalBarRect = { + name = "VerticalBarRect", + type = {type = "Data", name = "Rect"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + VerticalScrollBarInset = { + name = "VerticalScrollBarInset", + type = {type = "Enum", name = "ScrollBarInset"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VerticalScrollBarPosition = { + name = "VerticalScrollBarPosition", + type = {type = "Enum", name = "VerticalScrollBarPosition"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + AnchorPoint = Vector2.new(0, 0), + AutoLocalize = true, + AutomaticCanvasSize = 0, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + BottomImage = "rbxasset://textures/ui/Scroll/scroll-bottom.png", + CanvasPosition = Vector2.new(0, 0), + CanvasSize = UDim2.new(0, 0, 2, 0), + ClipsDescendants = true, + Draggable = false, + ElasticBehavior = 0, + HorizontalScrollBarInset = 0, + LayoutOrder = 0, + Localize = true, + MidImage = "rbxasset://textures/ui/Scroll/scroll-middle.png", + Name = "ScrollingFrame", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Position = UDim2.new(0, 0, 0, 0), + RootLocalizationTable = nil, + Rotation = 0, + ScrollBarImageColor3 = Color3.new(1, 1, 1), + ScrollBarImageTransparency = 0, + ScrollBarThickness = 12, + ScrollingDirection = 4, + ScrollingEnabled = true, + Selectable = true, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + TopImage = "rbxasset://textures/ui/Scroll/scroll-top.png", + Transparency = 0, + VerticalScrollBarInset = 0, + VerticalScrollBarPosition = 0, + Visible = true, + ZIndex = 1, + }, + }, + Seat = { + name = "Seat", + superclass = "Part", + properties = { + Disabled = { + name = "Disabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Occupant = { + name = "Occupant", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 4, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Disabled = false, + Elasticity = 0.5, + FormFactor = 1, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "Seat", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Shape = 1, + Size = Vector3.new(4, 1.2, 2), + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 3, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + Selection = { + name = "Selection", + superclass = "Instance", + properties = { + ActiveInstance = { + name = "ActiveInstance", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "Selection", + }, + }, + SelectionBox = { + name = "SelectionBox", + superclass = "InstanceAdornment", + properties = { + LineThickness = { + name = "LineThickness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SurfaceColor = { + name = "SurfaceColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + SurfaceColor3 = { + name = "SurfaceColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SurfaceTransparency = { + name = "SurfaceTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Adornee = nil, + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + LineThickness = 0.15, + Name = "SelectionBox", + SurfaceColor = BrickColor.new(23), + SurfaceColor3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + SurfaceTransparency = 1, + Transparency = 0, + Visible = true, + }, + }, + SelectionLasso = { + name = "SelectionLasso", + superclass = "GuiBase3d", + properties = { + Humanoid = { + name = "Humanoid", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + SelectionPartLasso = { + name = "SelectionPartLasso", + superclass = "SelectionLasso", + properties = { + Part = { + name = "Part", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Humanoid = nil, + Name = "SelectionPartLasso", + Part = nil, + Transparency = 0, + Visible = true, + }, + }, + SelectionPointLasso = { + name = "SelectionPointLasso", + superclass = "SelectionLasso", + properties = { + Point = { + name = "Point", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Humanoid = nil, + Name = "SelectionPointLasso", + Point = Vector3.new(0, 0, 0), + Transparency = 0, + Visible = true, + }, + }, + SelectionSphere = { + name = "SelectionSphere", + superclass = "PVAdornment", + properties = { + SurfaceColor = { + name = "SurfaceColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + SurfaceColor3 = { + name = "SurfaceColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SurfaceTransparency = { + name = "SurfaceTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Adornee = nil, + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Name = "SelectionSphere", + SurfaceColor = BrickColor.new(23), + SurfaceColor3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + SurfaceTransparency = 1, + Transparency = 0, + Visible = true, + }, + }, + ServerReplicator = { + name = "ServerReplicator", + superclass = "NetworkReplicator", + properties = { + }, + defaults = { + }, + }, + ServerScriptService = { + name = "ServerScriptService", + superclass = "Instance", + properties = { + LoadStringEnabled = { + name = "LoadStringEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + Name = "ServerScriptService", + }, + }, + ServerStorage = { + name = "ServerStorage", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "ServerStorage", + }, + }, + ServiceProvider = { + name = "ServiceProvider", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + SessionService = { + name = "SessionService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Shirt = { + name = "Shirt", + superclass = "Clothing", + properties = { + ShirtTemplate = { + name = "ShirtTemplate", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color3 = Color3.new(1, 1, 1), + Name = "Clothing", + ShirtTemplate = "", + }, + }, + ShirtGraphic = { + name = "ShirtGraphic", + superclass = "CharacterAppearance", + properties = { + Color3 = { + name = "Color3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Graphic = { + name = "Graphic", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color3 = Color3.new(1, 1, 1), + Graphic = "", + Name = "Shirt Graphic", + }, + }, + SkateboardController = { + name = "SkateboardController", + superclass = "Controller", + properties = { + Steer = { + name = "Steer", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Throttle = { + name = "Throttle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "SkateboardController", + }, + }, + SkateboardPlatform = { + name = "SkateboardPlatform", + superclass = "Part", + properties = { + Controller = { + name = "Controller", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ControllingHumanoid = { + name = "ControllingHumanoid", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Steer = { + name = "Steer", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StickyWheels = { + name = "StickyWheels", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Throttle = { + name = "Throttle", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 4, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + FormFactor = 1, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "SkateboardPlatform", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Shape = 1, + Size = Vector3.new(4, 1.2, 2), + Steer = 0, + StickyWheels = true, + Throttle = 0, + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 3, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + Skin = { + name = "Skin", + superclass = "CharacterAppearance", + properties = { + SkinColor = { + name = "SkinColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Skin", + SkinColor = BrickColor.new(226), + }, + }, + Sky = { + name = "Sky", + superclass = "Instance", + properties = { + CelestialBodiesShown = { + name = "CelestialBodiesShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MoonAngularSize = { + name = "MoonAngularSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MoonTextureId = { + name = "MoonTextureId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SkyboxBk = { + name = "SkyboxBk", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SkyboxDn = { + name = "SkyboxDn", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SkyboxFt = { + name = "SkyboxFt", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SkyboxLf = { + name = "SkyboxLf", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SkyboxRt = { + name = "SkyboxRt", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SkyboxUp = { + name = "SkyboxUp", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StarCount = { + name = "StarCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SunAngularSize = { + name = "SunAngularSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SunTextureId = { + name = "SunTextureId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CelestialBodiesShown = true, + MoonAngularSize = 11, + MoonTextureId = "rbxasset://sky/moon.jpg", + Name = "Sky", + SkyboxBk = "rbxasset://textures/sky/sky512_bk.tex", + SkyboxDn = "rbxasset://textures/sky/sky512_dn.tex", + SkyboxFt = "rbxasset://textures/sky/sky512_ft.tex", + SkyboxLf = "rbxasset://textures/sky/sky512_lf.tex", + SkyboxRt = "rbxasset://textures/sky/sky512_rt.tex", + SkyboxUp = "rbxasset://textures/sky/sky512_up.tex", + StarCount = 3000, + SunAngularSize = 21, + SunTextureId = "rbxasset://sky/sun.jpg", + }, + }, + SlidingBallConstraint = { + name = "SlidingBallConstraint", + superclass = "Constraint", + properties = { + ActuatorType = { + name = "ActuatorType", + type = {type = "Enum", name = "ActuatorType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurrentPosition = { + name = "CurrentPosition", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + LimitsEnabled = { + name = "LimitsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LowerLimit = { + name = "LowerLimit", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MotorMaxAcceleration = { + name = "MotorMaxAcceleration", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MotorMaxForce = { + name = "MotorMaxForce", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Restitution = { + name = "Restitution", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ServoMaxForce = { + name = "ServoMaxForce", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Speed = { + name = "Speed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TargetPosition = { + name = "TargetPosition", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UpperLimit = { + name = "UpperLimit", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Velocity = { + name = "Velocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + Smoke = { + name = "Smoke", + superclass = "Instance", + properties = { + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Opacity = { + name = "Opacity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "opacity_xml", + scriptability = "ReadWrite", + serializes = true, + }, + RiseVelocity = { + name = "RiseVelocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "riseVelocity_xml", + scriptability = "ReadWrite", + serializes = true, + }, + Size = { + name = "Size", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "size_xml", + scriptability = "ReadWrite", + serializes = true, + }, + opacity_xml = { + name = "opacity_xml", + type = {type = "Data", name = "Float32"}, + isCanonical = false, + canonicalName = "Opacity", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + riseVelocity_xml = { + name = "riseVelocity_xml", + type = {type = "Data", name = "Float32"}, + isCanonical = false, + canonicalName = "RiseVelocity", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + size_xml = { + name = "size_xml", + type = {type = "Data", name = "Float32"}, + isCanonical = false, + canonicalName = "Size", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + Color = Color3.new(1, 1, 1), + Enabled = true, + Name = "Smoke", + Opacity = 0.5, + RiseVelocity = 1, + Size = 1, + }, + }, + Snap = { + name = "Snap", + superclass = "JointInstance", + properties = { + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + Name = "Snap", + Part0 = nil, + Part1 = nil, + }, + }, + SocialService = { + name = "SocialService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "SocialService", + }, + }, + SolidModelContentProvider = { + name = "SolidModelContentProvider", + superclass = "CacheableContentProvider", + properties = { + }, + defaults = { + Name = "SolidModelContentProvider", + }, + }, + Sound = { + name = "Sound", + superclass = "Instance", + properties = { + EmitterSize = { + name = "EmitterSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsLoaded = { + name = "IsLoaded", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsPaused = { + name = "IsPaused", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsPlaying = { + name = "IsPlaying", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Looped = { + name = "Looped", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxDistance = { + name = "MaxDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = "xmlRead_MaxDistance_3", + scriptability = "ReadWrite", + serializes = true, + }, + MinDistance = { + name = "MinDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Pitch = { + name = "Pitch", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + PlayOnRemove = { + name = "PlayOnRemove", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PlaybackLoudness = { + name = "PlaybackLoudness", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PlaybackSpeed = { + name = "PlaybackSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Playing = { + name = "Playing", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RollOffMaxDistance = { + name = "RollOffMaxDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RollOffMinDistance = { + name = "RollOffMinDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + RollOffMode = { + name = "RollOffMode", + type = {type = "Enum", name = "RollOffMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SoundGroup = { + name = "SoundGroup", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SoundId = { + name = "SoundId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TimeLength = { + name = "TimeLength", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TimePosition = { + name = "TimePosition", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Volume = { + name = "Volume", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + isPlaying = { + name = "isPlaying", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + xmlRead_MaxDistance_3 = { + name = "xmlRead_MaxDistance_3", + type = {type = "Data", name = "Float32"}, + isCanonical = false, + canonicalName = "MaxDistance", + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + EmitterSize = 10, + Looped = false, + MaxDistance = 10000, + MinDistance = 10, + Name = "Sound", + Pitch = 1, + PlayOnRemove = false, + PlaybackSpeed = 1, + Playing = false, + RollOffMaxDistance = 10000, + RollOffMinDistance = 10, + RollOffMode = 0, + SoundGroup = nil, + SoundId = "", + TimePosition = 0, + Volume = 0.5, + }, + }, + SoundEffect = { + name = "SoundEffect", + superclass = "Instance", + properties = { + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Priority = { + name = "Priority", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + SoundGroup = { + name = "SoundGroup", + superclass = "Instance", + properties = { + Volume = { + name = "Volume", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "SoundGroup", + Volume = 0.5, + }, + }, + SoundService = { + name = "SoundService", + superclass = "Instance", + properties = { + AmbientReverb = { + name = "AmbientReverb", + type = {type = "Enum", name = "ReverbType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DistanceFactor = { + name = "DistanceFactor", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DopplerScale = { + name = "DopplerScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RespectFilteringEnabled = { + name = "RespectFilteringEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RolloffScale = { + name = "RolloffScale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AmbientReverb = 0, + DistanceFactor = 3.33, + DopplerScale = 1, + Name = "SoundService", + RespectFilteringEnabled = false, + RolloffScale = 1, + }, + }, + Sparkles = { + name = "Sparkles", + superclass = "Instance", + properties = { + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SparkleColor = { + name = "SparkleColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color = Color3.new(1, 1.0000001, 1), + Enabled = true, + Name = "Sparkles", + SparkleColor = Color3.new(0.5647059, 0.09803923, 1), + }, + }, + SpawnLocation = { + name = "SpawnLocation", + superclass = "Part", + properties = { + AllowTeamChangeOnTouch = { + name = "AllowTeamChangeOnTouch", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Duration = { + name = "Duration", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Neutral = { + name = "Neutral", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TeamColor = { + name = "TeamColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AllowTeamChangeOnTouch = false, + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 4, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Duration = 10, + Elasticity = 0.5, + Enabled = true, + FormFactor = 1, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "SpawnLocation", + Neutral = true, + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Shape = 1, + Size = Vector3.new(4, 1.2, 2), + TeamColor = BrickColor.new(194), + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 3, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + SpawnerService = { + name = "SpawnerService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + SpecialMesh = { + name = "SpecialMesh", + superclass = "FileMesh", + properties = { + MeshType = { + name = "MeshType", + type = {type = "Enum", name = "MeshType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + MeshId = "", + MeshType = 0, + Name = "Mesh", + Offset = Vector3.new(0, 0, 0), + Scale = Vector3.new(1, 1, 1), + TextureId = "", + VertexColor = Vector3.new(1, 1, 1), + }, + }, + SphereHandleAdornment = { + name = "SphereHandleAdornment", + superclass = "HandleAdornment", + properties = { + Radius = { + name = "Radius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AdornCullingMode = 0, + Adornee = nil, + AlwaysOnTop = false, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Name = "SphereHandleAdornment", + Radius = 1, + SizeRelativeOffset = Vector3.new(0, 0, 0), + Transparency = 0, + Visible = true, + ZIndex = -1, + }, + }, + SpotLight = { + name = "SpotLight", + superclass = "Light", + properties = { + Angle = { + name = "Angle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Face = { + name = "Face", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Range = { + name = "Range", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Angle = 90, + Brightness = 1, + Color = Color3.new(1, 1, 1), + Enabled = true, + Face = 5, + Name = "SpotLight", + Range = 16, + Shadows = false, + }, + }, + SpringConstraint = { + name = "SpringConstraint", + superclass = "Constraint", + properties = { + Coils = { + name = "Coils", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurrentLength = { + name = "CurrentLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Damping = { + name = "Damping", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FreeLength = { + name = "FreeLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LimitsEnabled = { + name = "LimitsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxForce = { + name = "MaxForce", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxLength = { + name = "MaxLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MinLength = { + name = "MinLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Radius = { + name = "Radius", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Stiffness = { + name = "Stiffness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Thickness = { + name = "Thickness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attachment0 = nil, + Attachment1 = nil, + Coils = 3, + Color = BrickColor.new(200), + Damping = 0, + Enabled = true, + FreeLength = 1, + LimitsEnabled = false, + MaxForce = 1000000000, + MaxLength = 5, + MinLength = 0, + Name = "SpringConstraint", + Radius = 0.4, + Stiffness = 0, + Thickness = 0.1, + Visible = false, + }, + }, + StandalonePluginScripts = { + name = "StandalonePluginScripts", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "StandalonePluginScripts", + }, + }, + StandardPages = { + name = "StandardPages", + superclass = "Pages", + properties = { + }, + defaults = { + }, + }, + StarterCharacterScripts = { + name = "StarterCharacterScripts", + superclass = "StarterPlayerScripts", + properties = { + }, + defaults = { + }, + }, + StarterGear = { + name = "StarterGear", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "StarterGear", + }, + }, + StarterGui = { + name = "StarterGui", + superclass = "BasePlayerGui", + properties = { + ProcessUserInput = { + name = "ProcessUserInput", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ResetPlayerGuiOnSpawn = { + name = "ResetPlayerGuiOnSpawn", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScreenOrientation = { + name = "ScreenOrientation", + type = {type = "Enum", name = "ScreenOrientation"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShowDevelopmentGui = { + name = "ShowDevelopmentGui", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "StarterGui", + ProcessUserInput = true, + ResetPlayerGuiOnSpawn = true, + ScreenOrientation = 2, + ShowDevelopmentGui = true, + }, + }, + StarterPack = { + name = "StarterPack", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "StarterPack", + }, + }, + StarterPlayer = { + name = "StarterPlayer", + superclass = "Instance", + properties = { + AllowCustomAnimations = { + name = "AllowCustomAnimations", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = true, + }, + AutoJumpEnabled = { + name = "AutoJumpEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraMaxZoomDistance = { + name = "CameraMaxZoomDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraMinZoomDistance = { + name = "CameraMinZoomDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraMode = { + name = "CameraMode", + type = {type = "Enum", name = "CameraMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CharacterJumpHeight = { + name = "CharacterJumpHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CharacterJumpPower = { + name = "CharacterJumpPower", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CharacterMaxSlopeAngle = { + name = "CharacterMaxSlopeAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CharacterUseJumpPower = { + name = "CharacterUseJumpPower", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CharacterWalkSpeed = { + name = "CharacterWalkSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevCameraOcclusionMode = { + name = "DevCameraOcclusionMode", + type = {type = "Enum", name = "DevCameraOcclusionMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevComputerCameraMovementMode = { + name = "DevComputerCameraMovementMode", + type = {type = "Enum", name = "DevComputerCameraMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevComputerMovementMode = { + name = "DevComputerMovementMode", + type = {type = "Enum", name = "DevComputerMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevTouchCameraMovementMode = { + name = "DevTouchCameraMovementMode", + type = {type = "Enum", name = "DevTouchCameraMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DevTouchMovementMode = { + name = "DevTouchMovementMode", + type = {type = "Enum", name = "DevTouchMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EnableMouseLockOption = { + name = "EnableMouseLockOption", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GameSettingsAssetIDFace = { + name = "GameSettingsAssetIDFace", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDHead = { + name = "GameSettingsAssetIDHead", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDLeftArm = { + name = "GameSettingsAssetIDLeftArm", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDLeftLeg = { + name = "GameSettingsAssetIDLeftLeg", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDPants = { + name = "GameSettingsAssetIDPants", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDRightArm = { + name = "GameSettingsAssetIDRightArm", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDRightLeg = { + name = "GameSettingsAssetIDRightLeg", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDShirt = { + name = "GameSettingsAssetIDShirt", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDTeeShirt = { + name = "GameSettingsAssetIDTeeShirt", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAssetIDTorso = { + name = "GameSettingsAssetIDTorso", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsAvatar = { + name = "GameSettingsAvatar", + type = {type = "Enum", name = "GameAvatarType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsR15Collision = { + name = "GameSettingsR15Collision", + type = {type = "Enum", name = "R15CollisionType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsScaleRangeBodyType = { + name = "GameSettingsScaleRangeBodyType", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsScaleRangeHead = { + name = "GameSettingsScaleRangeHead", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsScaleRangeHeight = { + name = "GameSettingsScaleRangeHeight", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsScaleRangeProportion = { + name = "GameSettingsScaleRangeProportion", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + GameSettingsScaleRangeWidth = { + name = "GameSettingsScaleRangeWidth", + type = {type = "Data", name = "NumberRange"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + HealthDisplayDistance = { + name = "HealthDisplayDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LoadCharacterAppearance = { + name = "LoadCharacterAppearance", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NameDisplayDistance = { + name = "NameDisplayDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UserEmotesEnabled = { + name = "UserEmotesEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AllowCustomAnimations = true, + AutoJumpEnabled = true, + CameraMaxZoomDistance = 400, + CameraMinZoomDistance = 0.5, + CameraMode = 0, + CharacterJumpHeight = 7.2, + CharacterJumpPower = 50, + CharacterMaxSlopeAngle = 89, + CharacterUseJumpPower = true, + CharacterWalkSpeed = 16, + DevCameraOcclusionMode = 0, + DevComputerCameraMovementMode = 0, + DevComputerMovementMode = 0, + DevTouchCameraMovementMode = 0, + DevTouchMovementMode = 0, + EnableMouseLockOption = true, + HealthDisplayDistance = 100, + LoadCharacterAppearance = true, + Name = "StarterPlayer", + NameDisplayDistance = 100, + UserEmotesEnabled = true, + }, + }, + StarterPlayerScripts = { + name = "StarterPlayerScripts", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Stats = { + name = "Stats", + superclass = "Instance", + properties = { + ContactsCount = { + name = "ContactsCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DataReceiveKbps = { + name = "DataReceiveKbps", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DataSendKbps = { + name = "DataSendKbps", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + HeartbeatTimeMs = { + name = "HeartbeatTimeMs", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + InstanceCount = { + name = "InstanceCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MovingPrimitivesCount = { + name = "MovingPrimitivesCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PhysicsReceiveKbps = { + name = "PhysicsReceiveKbps", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PhysicsSendKbps = { + name = "PhysicsSendKbps", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PhysicsStepTimeMs = { + name = "PhysicsStepTimeMs", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + PrimitivesCount = { + name = "PrimitivesCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "Stats", + }, + }, + StatsItem = { + name = "StatsItem", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Status = { + name = "Status", + superclass = "Model", + properties = { + }, + defaults = { + }, + }, + StopWatchReporter = { + name = "StopWatchReporter", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + StringValue = { + name = "StringValue", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = "", + }, + }, + Studio = { + name = "Studio", + superclass = "Instance", + properties = { + CommandBarLocalState = { + name = "CommandBarLocalState", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DefaultScriptFileDir = { + name = "DefaultScriptFileDir", + type = {type = "Unimplemented", name = "QDir"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DeprecatedObjectsShown = { + name = "DeprecatedObjectsShown", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Font = { + name = "Font", + type = {type = "Unimplemented", name = "QFont"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Language = { + name = "Language", + type = {type = "Enum", name = "LanguagePreference"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LocalAssetsFolder = { + name = "LocalAssetsFolder", + type = {type = "Unimplemented", name = "QDir"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LuaDebuggerEnabled = { + name = "LuaDebuggerEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LuaDebuggerEnabledAtStartup = { + name = "LuaDebuggerEnabledAtStartup", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + OverrideCoreScripts = { + name = "OverrideCoreScripts", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OverrideCoreScriptsDir = { + name = "OverrideCoreScriptsDir", + type = {type = "Unimplemented", name = "QDir"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PermissionLevelShown = { + name = "PermissionLevelShown", + type = {type = "Enum", name = "PermissionLevelShown"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PluginDebuggingEnabled = { + name = "PluginDebuggingEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PluginsDir = { + name = "PluginsDir", + type = {type = "Unimplemented", name = "QDir"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rulers = { + name = "Rulers", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RuntimeUndoBehavior = { + name = "RuntimeUndoBehavior", + type = {type = "Enum", name = "RuntimeUndoBehavior"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScriptTimeoutLength = { + name = "ScriptTimeoutLength", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Theme = { + name = "Theme", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + StudioData = { + name = "StudioData", + superclass = "Instance", + properties = { + EnableScriptCollabByDefaultOnLoad = { + name = "EnableScriptCollabByDefaultOnLoad", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + EnableScriptCollabOnLoad = { + name = "EnableScriptCollabOnLoad", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + SrcPlaceId = { + name = "SrcPlaceId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + SrcUniverseId = { + name = "SrcUniverseId", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + }, + }, + StudioService = { + name = "StudioService", + superclass = "Instance", + properties = { + ActiveScript = { + name = "ActiveScript", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AlignDraggedObjects = { + name = "AlignDraggedObjects", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DraggerSolveConstraints = { + name = "DraggerSolveConstraints", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + DrawConstraintsOnTop = { + name = "DrawConstraintsOnTop", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + GridSize = { + name = "GridSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + HoverInstance = { + name = "HoverInstance", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + InstalledPluginData = { + name = "InstalledPluginData", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + RotateIncrement = { + name = "RotateIncrement", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ShowActiveInstanceHighlight = { + name = "ShowActiveInstanceHighlight", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + ShowConstraintDetails = { + name = "ShowConstraintDetails", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + StudioLocaleId = { + name = "StudioLocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + UseLocalSpace = { + name = "UseLocalSpace", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + Name = "StudioService", + UseLocalSpace = true, + }, + }, + StudioTheme = { + name = "StudioTheme", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + SunRaysEffect = { + name = "SunRaysEffect", + superclass = "PostEffect", + properties = { + Intensity = { + name = "Intensity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Spread = { + name = "Spread", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Enabled = true, + Intensity = 0.25, + Name = "SunRays", + Spread = 1, + }, + }, + SurfaceAppearance = { + name = "SurfaceAppearance", + superclass = "Instance", + properties = { + AlphaMode = { + name = "AlphaMode", + type = {type = "Enum", name = "AlphaMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + ColorMap = { + name = "ColorMap", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + MetalnessMap = { + name = "MetalnessMap", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + NormalMap = { + name = "NormalMap", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + RoughnessMap = { + name = "RoughnessMap", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + TexturePack = { + name = "TexturePack", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + Name = "SurfaceAppearance", + }, + }, + SurfaceGui = { + name = "SurfaceGui", + superclass = "LayerCollector", + properties = { + Active = { + name = "Active", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Adornee = { + name = "Adornee", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AlwaysOnTop = { + name = "AlwaysOnTop", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CanvasSize = { + name = "CanvasSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ClipsDescendants = { + name = "ClipsDescendants", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Face = { + name = "Face", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightInfluence = { + name = "LightInfluence", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PixelsPerStud = { + name = "PixelsPerStud", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SizingMode = { + name = "SizingMode", + type = {type = "Enum", name = "SurfaceGuiSizingMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ToolPunchThroughDistance = { + name = "ToolPunchThroughDistance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ZOffset = { + name = "ZOffset", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = true, + Adornee = nil, + AlwaysOnTop = false, + AutoLocalize = true, + CanvasSize = Vector2.new(800, 600), + ClipsDescendants = false, + Enabled = true, + Face = 5, + LightInfluence = 0, + Localize = true, + Name = "SurfaceGui", + PixelsPerStud = 50, + ResetOnSpawn = true, + RootLocalizationTable = nil, + SizingMode = 0, + ToolPunchThroughDistance = 0, + ZIndexBehavior = 0, + ZOffset = 0, + }, + }, + SurfaceLight = { + name = "SurfaceLight", + superclass = "Light", + properties = { + Angle = { + name = "Angle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Face = { + name = "Face", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Range = { + name = "Range", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Angle = 90, + Brightness = 1, + Color = Color3.new(1, 1, 1), + Enabled = true, + Face = 5, + Name = "SurfaceLight", + Range = 16, + Shadows = false, + }, + }, + SurfaceSelection = { + name = "SurfaceSelection", + superclass = "PartAdornment", + properties = { + TargetSurface = { + name = "TargetSurface", + type = {type = "Enum", name = "NormalId"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Adornee = nil, + Color = BrickColor.new(23), + Color3 = Color3.new(0.050980397, 0.41176474, 0.6745098), + Name = "SurfaceSelection", + TargetSurface = 0, + Transparency = 0, + Visible = true, + }, + }, + TaskScheduler = { + name = "TaskScheduler", + superclass = "Instance", + properties = { + SchedulerDutyCycle = { + name = "SchedulerDutyCycle", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + SchedulerRate = { + name = "SchedulerRate", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ThreadPoolConfig = { + name = "ThreadPoolConfig", + type = {type = "Enum", name = "ThreadPoolConfig"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ThreadPoolSize = { + name = "ThreadPoolSize", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + Team = { + name = "Team", + superclass = "Instance", + properties = { + AutoAssignable = { + name = "AutoAssignable", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AutoColorCharacters = { + name = "AutoColorCharacters", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ChildOrder = { + name = "ChildOrder", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + Score = { + name = "Score", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TeamColor = { + name = "TeamColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AutoAssignable = true, + AutoColorCharacters = true, + Name = "Team", + Score = 0, + TeamColor = BrickColor.new(1), + }, + }, + Teams = { + name = "Teams", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Teams", + }, + }, + TeleportAsyncResult = { + name = "TeleportAsyncResult", + superclass = "Instance", + properties = { + PrivateServerId = { + name = "PrivateServerId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ReservedServerAccessCode = { + name = "ReservedServerAccessCode", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + TeleportOptions = { + name = "TeleportOptions", + superclass = "Instance", + properties = { + ReservedServerAccessCode = { + name = "ReservedServerAccessCode", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ServerInstanceId = { + name = "ServerInstanceId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ShouldReserveServer = { + name = "ShouldReserveServer", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Instance", + ReservedServerAccessCode = "", + ServerInstanceId = "", + ShouldReserveServer = false, + }, + }, + TeleportService = { + name = "TeleportService", + superclass = "Instance", + properties = { + CustomizedTeleportUI = { + name = "CustomizedTeleportUI", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + CustomizedTeleportUI = false, + Name = "Teleport Service", + }, + }, + Terrain = { + name = "Terrain", + superclass = "BasePart", + properties = { + Decoration = { + name = "Decoration", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + IsSmooth = { + name = "IsSmooth", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MaterialColors = { + name = "MaterialColors", + type = {type = "Data", name = "BinaryString"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + MaxExtents = { + name = "MaxExtents", + type = {type = "Unimplemented", name = "Region3int16"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + WaterColor = { + name = "WaterColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WaterReflectance = { + name = "WaterReflectance", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WaterTransparency = { + name = "WaterTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WaterWaveSize = { + name = "WaterWaveSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WaterWaveSpeed = { + name = "WaterWaveSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + TerrainRegion = { + name = "TerrainRegion", + superclass = "Instance", + properties = { + IsSmooth = { + name = "IsSmooth", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + SizeInCells = { + name = "SizeInCells", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "TerrainRegion", + }, + }, + TestService = { + name = "TestService", + superclass = "Instance", + properties = { + AutoRuns = { + name = "AutoRuns", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Description = { + name = "Description", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ErrorCount = { + name = "ErrorCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ExecuteWithStudioRun = { + name = "ExecuteWithStudioRun", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Is30FpsThrottleEnabled = { + name = "Is30FpsThrottleEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsPhysicsEnvironmentalThrottled = { + name = "IsPhysicsEnvironmentalThrottled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsSleepAllowed = { + name = "IsSleepAllowed", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NumberOfPlayers = { + name = "NumberOfPlayers", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SimulateSecondsLag = { + name = "SimulateSecondsLag", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TestCount = { + name = "TestCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Timeout = { + name = "Timeout", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WarnCount = { + name = "WarnCount", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + AutoRuns = true, + Description = "", + ExecuteWithStudioRun = false, + Is30FpsThrottleEnabled = true, + IsPhysicsEnvironmentalThrottled = true, + IsSleepAllowed = true, + Name = "TestService", + NumberOfPlayers = 0, + SimulateSecondsLag = 0, + Timeout = 10, + }, + }, + TextBox = { + name = "TextBox", + superclass = "GuiObject", + properties = { + ClearTextOnFocus = { + name = "ClearTextOnFocus", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CursorPosition = { + name = "CursorPosition", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + EnableRealtimeFilteringHints = { + name = "EnableRealtimeFilteringHints", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + Font = { + name = "Font", + type = {type = "Enum", name = "Font"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FontSize = { + name = "FontSize", + type = {type = "Enum", name = "FontSize"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + LineHeight = { + name = "LineHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ManualFocusRelease = { + name = "ManualFocusRelease", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + MultiLine = { + name = "MultiLine", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OverlayNativeInput = { + name = "OverlayNativeInput", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + PlaceholderColor3 = { + name = "PlaceholderColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PlaceholderText = { + name = "PlaceholderText", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReturnKeyType = { + name = "ReturnKeyType", + type = {type = "Enum", name = "ReturnKeyType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + RichText = { + name = "RichText", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SelectionStart = { + name = "SelectionStart", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ShowNativeInput = { + name = "ShowNativeInput", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Text = { + name = "Text", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextBounds = { + name = "TextBounds", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TextColor = { + name = "TextColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TextColor3 = { + name = "TextColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextEditable = { + name = "TextEditable", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextFits = { + name = "TextFits", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TextInputType = { + name = "TextInputType", + type = {type = "Enum", name = "TextInputType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + TextScaled = { + name = "TextScaled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextSize = { + name = "TextSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextStrokeColor3 = { + name = "TextStrokeColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextStrokeTransparency = { + name = "TextStrokeTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextTransparency = { + name = "TextTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextTruncate = { + name = "TextTruncate", + type = {type = "Enum", name = "TextTruncate"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextWrap = { + name = "TextWrap", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TextWrapped = { + name = "TextWrapped", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextXAlignment = { + name = "TextXAlignment", + type = {type = "Enum", name = "TextXAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextYAlignment = { + name = "TextYAlignment", + type = {type = "Enum", name = "TextYAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = true, + AnchorPoint = Vector2.new(0, 0), + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClearTextOnFocus = true, + ClipsDescendants = false, + CursorPosition = 1, + Draggable = false, + Font = 0, + FontSize = 0, + LayoutOrder = 0, + LineHeight = 1, + Localize = true, + MultiLine = false, + Name = "TextBox", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + PlaceholderColor3 = Color3.new(0.7, 0.7, 0.7), + PlaceholderText = "", + Position = UDim2.new(0, 0, 0, 0), + RichText = false, + RootLocalizationTable = nil, + Rotation = 0, + Selectable = true, + SelectionImageObject = nil, + SelectionStart = -1, + ShowNativeInput = true, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + Text = "TextBox", + TextColor = BrickColor.new(26), + TextColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + TextEditable = true, + TextScaled = false, + TextSize = 8, + TextStrokeColor3 = Color3.new(0, 0, 0), + TextStrokeTransparency = 1, + TextTransparency = 0, + TextTruncate = 0, + TextWrap = false, + TextWrapped = false, + TextXAlignment = 2, + TextYAlignment = 1, + Transparency = 0, + Visible = true, + ZIndex = 1, + }, + }, + TextButton = { + name = "TextButton", + superclass = "GuiButton", + properties = { + Font = { + name = "Font", + type = {type = "Enum", name = "Font"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FontSize = { + name = "FontSize", + type = {type = "Enum", name = "FontSize"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + LineHeight = { + name = "LineHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LocalizedText = { + name = "LocalizedText", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + RichText = { + name = "RichText", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Text = { + name = "Text", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextBounds = { + name = "TextBounds", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TextColor = { + name = "TextColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TextColor3 = { + name = "TextColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextFits = { + name = "TextFits", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TextScaled = { + name = "TextScaled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextSize = { + name = "TextSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextStrokeColor3 = { + name = "TextStrokeColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextStrokeTransparency = { + name = "TextStrokeTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextTransparency = { + name = "TextTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextTruncate = { + name = "TextTruncate", + type = {type = "Enum", name = "TextTruncate"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextWrap = { + name = "TextWrap", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TextWrapped = { + name = "TextWrapped", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextXAlignment = { + name = "TextXAlignment", + type = {type = "Enum", name = "TextXAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextYAlignment = { + name = "TextYAlignment", + type = {type = "Enum", name = "TextYAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = true, + AnchorPoint = Vector2.new(0, 0), + AutoButtonColor = true, + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClipsDescendants = false, + Draggable = false, + Font = 0, + FontSize = 0, + LayoutOrder = 0, + LineHeight = 1, + Localize = true, + Modal = false, + Name = "TextButton", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Position = UDim2.new(0, 0, 0, 0), + RichText = false, + RootLocalizationTable = nil, + Rotation = 0, + Selectable = true, + Selected = false, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + Style = 0, + Text = "Button", + TextColor = BrickColor.new(26), + TextColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + TextScaled = false, + TextSize = 8, + TextStrokeColor3 = Color3.new(0, 0, 0), + TextStrokeTransparency = 1, + TextTransparency = 0, + TextTruncate = 0, + TextWrap = false, + TextWrapped = false, + TextXAlignment = 2, + TextYAlignment = 1, + Transparency = 0, + Visible = true, + ZIndex = 1, + }, + }, + TextFilterResult = { + name = "TextFilterResult", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + TextLabel = { + name = "TextLabel", + superclass = "GuiLabel", + properties = { + Font = { + name = "Font", + type = {type = "Enum", name = "Font"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FontSize = { + name = "FontSize", + type = {type = "Enum", name = "FontSize"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + LineHeight = { + name = "LineHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LocalizedText = { + name = "LocalizedText", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + RichText = { + name = "RichText", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Text = { + name = "Text", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextBounds = { + name = "TextBounds", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TextColor = { + name = "TextColor", + type = {type = "Data", name = "BrickColor"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TextColor3 = { + name = "TextColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextFits = { + name = "TextFits", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TextScaled = { + name = "TextScaled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextSize = { + name = "TextSize", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextStrokeColor3 = { + name = "TextStrokeColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextStrokeTransparency = { + name = "TextStrokeTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextTransparency = { + name = "TextTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextTruncate = { + name = "TextTruncate", + type = {type = "Enum", name = "TextTruncate"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextWrap = { + name = "TextWrap", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + TextWrapped = { + name = "TextWrapped", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextXAlignment = { + name = "TextXAlignment", + type = {type = "Enum", name = "TextXAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextYAlignment = { + name = "TextYAlignment", + type = {type = "Enum", name = "TextYAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + AnchorPoint = Vector2.new(0, 0), + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClipsDescendants = false, + Draggable = false, + Font = 0, + FontSize = 0, + LayoutOrder = 0, + LineHeight = 1, + Localize = true, + Name = "TextLabel", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Position = UDim2.new(0, 0, 0, 0), + RichText = false, + RootLocalizationTable = nil, + Rotation = 0, + Selectable = false, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + Text = "Label", + TextColor = BrickColor.new(26), + TextColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + TextScaled = false, + TextSize = 8, + TextStrokeColor3 = Color3.new(0, 0, 0), + TextStrokeTransparency = 1, + TextTransparency = 0, + TextTruncate = 0, + TextWrap = false, + TextWrapped = false, + TextXAlignment = 2, + TextYAlignment = 1, + Transparency = 0, + Visible = true, + ZIndex = 1, + }, + }, + TextService = { + name = "TextService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "TextService", + }, + }, + Texture = { + name = "Texture", + superclass = "Decal", + properties = { + OffsetStudsU = { + name = "OffsetStudsU", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OffsetStudsV = { + name = "OffsetStudsV", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StudsPerTileU = { + name = "StudsPerTileU", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StudsPerTileV = { + name = "StudsPerTileV", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color3 = Color3.new(1, 1, 1), + Face = 5, + LocalTransparencyModifier = 0, + Name = "Texture", + OffsetStudsU = 0, + OffsetStudsV = 0, + Shiny = 20, + Specular = 0, + StudsPerTileU = 2, + StudsPerTileV = 2, + Texture = "", + Transparency = 0, + }, + }, + ThirdPartyUserService = { + name = "ThirdPartyUserService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + TimerService = { + name = "TimerService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + Tool = { + name = "Tool", + superclass = "BackpackItem", + properties = { + CanBeDropped = { + name = "CanBeDropped", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Grip = { + name = "Grip", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GripForward = { + name = "GripForward", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + GripPos = { + name = "GripPos", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + GripRight = { + name = "GripRight", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + GripUp = { + name = "GripUp", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ManualActivationOnly = { + name = "ManualActivationOnly", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RequiresHandle = { + name = "RequiresHandle", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ToolTip = { + name = "ToolTip", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CanBeDropped = true, + Enabled = true, + Grip = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + GripForward = Vector3.new(0, 0, -1), + GripPos = Vector3.new(0, 0, 0), + GripRight = Vector3.new(1, 0, 0), + GripUp = Vector3.new(0, 1, 0), + ManualActivationOnly = false, + Name = "Tool", + RequiresHandle = true, + TextureId = "", + ToolTip = "", + }, + }, + Torque = { + name = "Torque", + superclass = "Constraint", + properties = { + RelativeTo = { + name = "RelativeTo", + type = {type = "Enum", name = "ActuatorRelativeTo"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Torque = { + name = "Torque", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(23), + Enabled = true, + Name = "Torque", + RelativeTo = 0, + Torque = Vector3.new(0, 0, 0), + Visible = false, + }, + }, + TotalCountTimeIntervalItem = { + name = "TotalCountTimeIntervalItem", + superclass = "StatsItem", + properties = { + }, + defaults = { + }, + }, + TouchInputService = { + name = "TouchInputService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "TouchInputService", + }, + }, + TouchTransmitter = { + name = "TouchTransmitter", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + TracerService = { + name = "TracerService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Trail = { + name = "Trail", + superclass = "Instance", + properties = { + Attachment0 = { + name = "Attachment0", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Attachment1 = { + name = "Attachment1", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Color = { + name = "Color", + type = {type = "Data", name = "ColorSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FaceCamera = { + name = "FaceCamera", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Lifetime = { + name = "Lifetime", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightEmission = { + name = "LightEmission", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightInfluence = { + name = "LightInfluence", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxLength = { + name = "MaxLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MinLength = { + name = "MinLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Texture = { + name = "Texture", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureLength = { + name = "TextureLength", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TextureMode = { + name = "TextureMode", + type = {type = "Enum", name = "TextureMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "NumberSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + WidthScale = { + name = "WidthScale", + type = {type = "Data", name = "NumberSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Attachment0 = nil, + Attachment1 = nil, + Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.new(1, 1, 1)), ColorSequenceKeypoint.new(1, Color3.new(1, 1, 1))}), + Enabled = true, + FaceCamera = false, + Lifetime = 2, + LightEmission = 0, + LightInfluence = 0, + MaxLength = 0, + MinLength = 0.1, + Name = "Trail", + Texture = "", + TextureLength = 1, + TextureMode = 0, + Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0, 0.5, 0), NumberSequenceKeypoint.new(1, 0.5, 0)}), + WidthScale = NumberSequence.new({NumberSequenceKeypoint.new(0, 1, 0), NumberSequenceKeypoint.new(1, 1, 0)}), + }, + }, + Translator = { + name = "Translator", + superclass = "Instance", + properties = { + LocaleId = { + name = "LocaleId", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + TremoloSoundEffect = { + name = "TremoloSoundEffect", + superclass = "SoundEffect", + properties = { + Depth = { + name = "Depth", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Duty = { + name = "Duty", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Frequency = { + name = "Frequency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Depth = 1, + Duty = 0.5, + Enabled = true, + Frequency = 5, + Name = "TremoloSoundEffect", + Priority = 0, + }, + }, + TriangleMeshPart = { + name = "TriangleMeshPart", + superclass = "BasePart", + properties = { + CollisionFidelity = { + name = "CollisionFidelity", + type = {type = "Enum", name = "CollisionFidelity"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + }, + }, + TrussPart = { + name = "TrussPart", + superclass = "BasePart", + properties = { + Style = { + name = "Style", + type = {type = "Enum", name = "Style"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 5, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 5, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 5, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 5, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "Truss", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 5, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(2, 2, 2), + Style = 0, + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 5, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + Tween = { + name = "Tween", + superclass = "TweenBase", + properties = { + Instance = { + name = "Instance", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TweenInfo = { + name = "TweenInfo", + type = {type = "Unimplemented", name = "TweenInfo"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + Name = "Tween", + }, + }, + TweenBase = { + name = "TweenBase", + superclass = "Instance", + properties = { + PlaybackState = { + name = "PlaybackState", + type = {type = "Enum", name = "PlaybackState"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + }, + }, + TweenService = { + name = "TweenService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "TweenService", + }, + }, + UGCValidationService = { + name = "UGCValidationService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "UGCValidationService", + }, + }, + UIAspectRatioConstraint = { + name = "UIAspectRatioConstraint", + superclass = "UIConstraint", + properties = { + AspectRatio = { + name = "AspectRatio", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + AspectType = { + name = "AspectType", + type = {type = "Enum", name = "AspectType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DominantAxis = { + name = "DominantAxis", + type = {type = "Enum", name = "DominantAxis"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + AspectRatio = 1, + AspectType = 0, + DominantAxis = 0, + Name = "UIAspectRatioConstraint", + }, + }, + UIBase = { + name = "UIBase", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + UIComponent = { + name = "UIComponent", + superclass = "UIBase", + properties = { + }, + defaults = { + }, + }, + UIConstraint = { + name = "UIConstraint", + superclass = "UIComponent", + properties = { + }, + defaults = { + }, + }, + UICorner = { + name = "UICorner", + superclass = "UIComponent", + properties = { + CornerRadius = { + name = "CornerRadius", + type = {type = "Data", name = "UDim"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CornerRadius = UDim.new(0, 8), + Name = "UICorner", + }, + }, + UIGradient = { + name = "UIGradient", + superclass = "UIComponent", + properties = { + Color = { + name = "Color", + type = {type = "Data", name = "ColorSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Offset = { + name = "Offset", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Rotation = { + name = "Rotation", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Transparency = { + name = "Transparency", + type = {type = "Data", name = "NumberSequence"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.new(1, 1, 1)), ColorSequenceKeypoint.new(1, Color3.new(1, 1, 1))}), + Enabled = true, + Name = "UIGradient", + Offset = Vector2.new(0, 0), + Rotation = 0, + Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0, 0, 0), NumberSequenceKeypoint.new(1, 0, 0)}), + }, + }, + UIGridLayout = { + name = "UIGridLayout", + superclass = "UIGridStyleLayout", + properties = { + AbsoluteCellCount = { + name = "AbsoluteCellCount", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + AbsoluteCellSize = { + name = "AbsoluteCellSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + CellPadding = { + name = "CellPadding", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CellSize = { + name = "CellSize", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FillDirectionMaxCells = { + name = "FillDirectionMaxCells", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StartCorner = { + name = "StartCorner", + type = {type = "Enum", name = "StartCorner"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CellPadding = UDim2.new(0, 5, 0, 5), + CellSize = UDim2.new(0, 100, 0, 100), + FillDirection = 0, + FillDirectionMaxCells = 0, + HorizontalAlignment = 1, + Name = "UIGridLayout", + SortOrder = 0, + StartCorner = 0, + VerticalAlignment = 1, + }, + }, + UIGridStyleLayout = { + name = "UIGridStyleLayout", + superclass = "UILayout", + properties = { + AbsoluteContentSize = { + name = "AbsoluteContentSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + FillDirection = { + name = "FillDirection", + type = {type = "Enum", name = "FillDirection"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HorizontalAlignment = { + name = "HorizontalAlignment", + type = {type = "Enum", name = "HorizontalAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SortOrder = { + name = "SortOrder", + type = {type = "Enum", name = "SortOrder"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VerticalAlignment = { + name = "VerticalAlignment", + type = {type = "Enum", name = "VerticalAlignment"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + UILayout = { + name = "UILayout", + superclass = "UIComponent", + properties = { + }, + defaults = { + }, + }, + UIListLayout = { + name = "UIListLayout", + superclass = "UIGridStyleLayout", + properties = { + Padding = { + name = "Padding", + type = {type = "Data", name = "UDim"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + FillDirection = 1, + HorizontalAlignment = 1, + Name = "UIListLayout", + Padding = UDim.new(0, 0), + SortOrder = 0, + VerticalAlignment = 1, + }, + }, + UIPadding = { + name = "UIPadding", + superclass = "UIComponent", + properties = { + PaddingBottom = { + name = "PaddingBottom", + type = {type = "Data", name = "UDim"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PaddingLeft = { + name = "PaddingLeft", + type = {type = "Data", name = "UDim"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PaddingRight = { + name = "PaddingRight", + type = {type = "Data", name = "UDim"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + PaddingTop = { + name = "PaddingTop", + type = {type = "Data", name = "UDim"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "UIPadding", + PaddingBottom = UDim.new(0, 0), + PaddingLeft = UDim.new(0, 0), + PaddingRight = UDim.new(0, 0), + PaddingTop = UDim.new(0, 0), + }, + }, + UIPageLayout = { + name = "UIPageLayout", + superclass = "UIGridStyleLayout", + properties = { + Animated = { + name = "Animated", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Circular = { + name = "Circular", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurrentPage = { + name = "CurrentPage", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + EasingDirection = { + name = "EasingDirection", + type = {type = "Enum", name = "EasingDirection"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + EasingStyle = { + name = "EasingStyle", + type = {type = "Enum", name = "EasingStyle"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GamepadInputEnabled = { + name = "GamepadInputEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Padding = { + name = "Padding", + type = {type = "Data", name = "UDim"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ScrollWheelInputEnabled = { + name = "ScrollWheelInputEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TouchInputEnabled = { + name = "TouchInputEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TweenTime = { + name = "TweenTime", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Animated = true, + Circular = false, + EasingDirection = 1, + EasingStyle = 2, + FillDirection = 0, + GamepadInputEnabled = true, + HorizontalAlignment = 1, + Name = "UIPageLayout", + Padding = UDim.new(0, 0), + ScrollWheelInputEnabled = true, + SortOrder = 0, + TouchInputEnabled = true, + TweenTime = 1, + VerticalAlignment = 1, + }, + }, + UIScale = { + name = "UIScale", + superclass = "UIComponent", + properties = { + Scale = { + name = "Scale", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "UIScale", + Scale = 1, + }, + }, + UISizeConstraint = { + name = "UISizeConstraint", + superclass = "UIConstraint", + properties = { + MaxSize = { + name = "MaxSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MinSize = { + name = "MinSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + MaxSize = Vector2.new(1000000000, 1000000000), + MinSize = Vector2.new(0, 0), + Name = "UISizeConstraint", + }, + }, + UITableLayout = { + name = "UITableLayout", + superclass = "UIGridStyleLayout", + properties = { + FillEmptySpaceColumns = { + name = "FillEmptySpaceColumns", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FillEmptySpaceRows = { + name = "FillEmptySpaceRows", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MajorAxis = { + name = "MajorAxis", + type = {type = "Enum", name = "TableMajorAxis"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Padding = { + name = "Padding", + type = {type = "Data", name = "UDim2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + FillDirection = 1, + FillEmptySpaceColumns = false, + FillEmptySpaceRows = false, + HorizontalAlignment = 1, + MajorAxis = 0, + Name = "UITableLayout", + Padding = UDim2.new(0, 0, 0, 0), + SortOrder = 0, + VerticalAlignment = 1, + }, + }, + UITextSizeConstraint = { + name = "UITextSizeConstraint", + superclass = "UIConstraint", + properties = { + MaxTextSize = { + name = "MaxTextSize", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MinTextSize = { + name = "MinTextSize", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + MaxTextSize = 100, + MinTextSize = 1, + Name = "UITextSizeConstraint", + }, + }, + UnionOperation = { + name = "UnionOperation", + superclass = "PartOperation", + properties = { + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 0, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionFidelity = 2, + CollisionGroupId = 0, + Color = Color3.new(1, 1, 1), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "Union", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RenderFidelity = 1, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(4, 1.2, 2), + SmoothingAngle = 0, + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 0, + TopSurfaceInput = 0, + Transparency = 0, + UsePartColor = false, + Velocity = Vector3.new(0, 0, 0), + }, + }, + UnvalidatedAssetService = { + name = "UnvalidatedAssetService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + UserGameSettings = { + name = "UserGameSettings", + superclass = "Instance", + properties = { + AllTutorialsDisabled = { + name = "AllTutorialsDisabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraMode = { + name = "CameraMode", + type = {type = "Enum", name = "CustomCameraMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CameraYInverted = { + name = "CameraYInverted", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ChatVisible = { + name = "ChatVisible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ComputerCameraMovementMode = { + name = "ComputerCameraMovementMode", + type = {type = "Enum", name = "ComputerCameraMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ComputerMovementMode = { + name = "ComputerMovementMode", + type = {type = "Enum", name = "ComputerMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ControlMode = { + name = "ControlMode", + type = {type = "Enum", name = "ControlMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Fullscreen = { + name = "Fullscreen", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GamepadCameraSensitivity = { + name = "GamepadCameraSensitivity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + GraphicsQualityLevel = { + name = "GraphicsQualityLevel", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HasEverUsedVR = { + name = "HasEverUsedVR", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + IsUsingCameraYInverted = { + name = "IsUsingCameraYInverted", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + IsUsingGamepadCameraSensitivity = { + name = "IsUsingGamepadCameraSensitivity", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MasterVolume = { + name = "MasterVolume", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MicroProfilerWebServerEnabled = { + name = "MicroProfilerWebServerEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MicroProfilerWebServerIP = { + name = "MicroProfilerWebServerIP", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MicroProfilerWebServerPort = { + name = "MicroProfilerWebServerPort", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MouseSensitivity = { + name = "MouseSensitivity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MouseSensitivityFirstPerson = { + name = "MouseSensitivityFirstPerson", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MouseSensitivityThirdPerson = { + name = "MouseSensitivityThirdPerson", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OnScreenProfilerEnabled = { + name = "OnScreenProfilerEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + OnboardingsCompleted = { + name = "OnboardingsCompleted", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + PerformanceStatsVisible = { + name = "PerformanceStatsVisible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RCCProfilerRecordFrameRate = { + name = "RCCProfilerRecordFrameRate", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RCCProfilerRecordTimeFrame = { + name = "RCCProfilerRecordTimeFrame", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RotationType = { + name = "RotationType", + type = {type = "Enum", name = "RotationType"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + SavedQualityLevel = { + name = "SavedQualityLevel", + type = {type = "Enum", name = "SavedQualitySetting"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StartMaximized = { + name = "StartMaximized", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + StartScreenPosition = { + name = "StartScreenPosition", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + StartScreenSize = { + name = "StartScreenSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + TouchCameraMovementMode = { + name = "TouchCameraMovementMode", + type = {type = "Enum", name = "TouchCameraMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TouchMovementMode = { + name = "TouchMovementMode", + type = {type = "Enum", name = "TouchMovementMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UsedCoreGuiIsVisibleToggle = { + name = "UsedCoreGuiIsVisibleToggle", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UsedCustomGuiIsVisibleToggle = { + name = "UsedCustomGuiIsVisibleToggle", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + UsedHideHudShortcut = { + name = "UsedHideHudShortcut", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VREnabled = { + name = "VREnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + VRRotationIntensity = { + name = "VRRotationIntensity", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + }, + }, + UserInputService = { + name = "UserInputService", + superclass = "Instance", + properties = { + AccelerometerEnabled = { + name = "AccelerometerEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + BottomBarSize = { + name = "BottomBarSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + GamepadEnabled = { + name = "GamepadEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + GazeSelectionEnabled = { + name = "GazeSelectionEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + GyroscopeEnabled = { + name = "GyroscopeEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + KeyboardEnabled = { + name = "KeyboardEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + LegacyInputEventsEnabled = { + name = "LegacyInputEventsEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + ModalEnabled = { + name = "ModalEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + MouseBehavior = { + name = "MouseBehavior", + type = {type = "Enum", name = "MouseBehavior"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MouseDeltaSensitivity = { + name = "MouseDeltaSensitivity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + MouseEnabled = { + name = "MouseEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + MouseIconEnabled = { + name = "MouseIconEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + NavBarSize = { + name = "NavBarSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + OnScreenKeyboardAnimationDuration = { + name = "OnScreenKeyboardAnimationDuration", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + OnScreenKeyboardPosition = { + name = "OnScreenKeyboardPosition", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + OnScreenKeyboardSize = { + name = "OnScreenKeyboardSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + OnScreenKeyboardVisible = { + name = "OnScreenKeyboardVisible", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + OverrideMouseIconBehavior = { + name = "OverrideMouseIconBehavior", + type = {type = "Enum", name = "OverrideMouseIconBehavior"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + RightBarSize = { + name = "RightBarSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + StatusBarSize = { + name = "StatusBarSize", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TouchEnabled = { + name = "TouchEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + UserHeadCFrame = { + name = "UserHeadCFrame", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + VREnabled = { + name = "VREnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + ModalEnabled = false, + MouseBehavior = 0, + MouseDeltaSensitivity = 1, + MouseIconEnabled = true, + Name = "Instance", + }, + }, + UserService = { + name = "UserService", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "UserService", + }, + }, + UserSettings = { + name = "UserSettings", + superclass = "GenericSettings", + properties = { + }, + defaults = { + }, + }, + UserStorageService = { + name = "UserStorageService", + superclass = "LocalStorageService", + properties = { + }, + defaults = { + }, + }, + VRService = { + name = "VRService", + superclass = "Instance", + properties = { + GuiInputUserCFrame = { + name = "GuiInputUserCFrame", + type = {type = "Enum", name = "UserCFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + VRDeviceName = { + name = "VRDeviceName", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + VREnabled = { + name = "VREnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + }, + defaults = { + GuiInputUserCFrame = 0, + Name = "VRService", + }, + }, + ValueBase = { + name = "ValueBase", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + Vector3Value = { + name = "Vector3Value", + superclass = "ValueBase", + properties = { + Value = { + name = "Value", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Name = "Value", + Value = Vector3.new(0, 0, 0), + }, + }, + VectorForce = { + name = "VectorForce", + superclass = "Constraint", + properties = { + ApplyAtCenterOfMass = { + name = "ApplyAtCenterOfMass", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Force = { + name = "Force", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + RelativeTo = { + name = "RelativeTo", + type = {type = "Enum", name = "ActuatorRelativeTo"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + ApplyAtCenterOfMass = false, + Attachment0 = nil, + Attachment1 = nil, + Color = BrickColor.new(23), + Enabled = true, + Force = Vector3.new(1000, 0, 0), + Name = "VectorForce", + RelativeTo = 0, + Visible = false, + }, + }, + VehicleController = { + name = "VehicleController", + superclass = "Controller", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + VehicleSeat = { + name = "VehicleSeat", + superclass = "BasePart", + properties = { + AreHingesDetected = { + name = "AreHingesDetected", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Disabled = { + name = "Disabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + HeadsUpDisplay = { + name = "HeadsUpDisplay", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxSpeed = { + name = "MaxSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Occupant = { + name = "Occupant", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Steer = { + name = "Steer", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + SteerFloat = { + name = "SteerFloat", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Throttle = { + name = "Throttle", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ThrottleFloat = { + name = "ThrottleFloat", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Torque = { + name = "Torque", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + TurnSpeed = { + name = "TurnSpeed", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 4, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Disabled = false, + Elasticity = 0.5, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + HeadsUpDisplay = true, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + MaxSpeed = 25, + Name = "VehicleSeat", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(4, 1.2, 2), + Steer = 0, + SteerFloat = 0, + Throttle = 0, + ThrottleFloat = 0, + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 3, + TopSurfaceInput = 0, + Torque = 10, + Transparency = 0, + TurnSpeed = 1, + Velocity = Vector3.new(0, 0, 0), + }, + }, + VelocityMotor = { + name = "VelocityMotor", + superclass = "JointInstance", + properties = { + CurrentAngle = { + name = "CurrentAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DesiredAngle = { + name = "DesiredAngle", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Hole = { + name = "Hole", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MaxVelocity = { + name = "MaxVelocity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CurrentAngle = 0, + DesiredAngle = 0, + Enabled = true, + Hole = nil, + MaxVelocity = 0, + Name = "VelocityMotor", + Part0 = nil, + Part1 = nil, + }, + }, + VersionControlService = { + name = "VersionControlService", + superclass = "Instance", + properties = { + }, + defaults = { + }, + }, + VideoFrame = { + name = "VideoFrame", + superclass = "GuiObject", + properties = { + IsLoaded = { + name = "IsLoaded", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Looped = { + name = "Looped", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Playing = { + name = "Playing", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Resolution = { + name = "Resolution", + type = {type = "Data", name = "Vector2"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TimeLength = { + name = "TimeLength", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TimePosition = { + name = "TimePosition", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Video = { + name = "Video", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Volume = { + name = "Volume", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + AnchorPoint = Vector2.new(0, 0), + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClipsDescendants = false, + Draggable = false, + LayoutOrder = 0, + Localize = true, + Looped = false, + Name = "VideoFrame", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Playing = false, + Position = UDim2.new(0, 0, 0, 0), + RootLocalizationTable = nil, + Rotation = 0, + Selectable = false, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + TimePosition = 0, + Transparency = 0, + Video = "", + Visible = true, + Volume = 1, + ZIndex = 1, + }, + }, + ViewportFrame = { + name = "ViewportFrame", + superclass = "GuiObject", + properties = { + Ambient = { + name = "Ambient", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CurrentCamera = { + name = "CurrentCamera", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + ImageColor3 = { + name = "ImageColor3", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ImageTransparency = { + name = "ImageTransparency", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightColor = { + name = "LightColor", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + LightDirection = { + name = "LightDirection", + type = {type = "Data", name = "Vector3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + Active = false, + Ambient = Color3.new(0.78431374, 0.78431374, 0.78431374), + AnchorPoint = Vector2.new(0, 0), + AutoLocalize = true, + AutomaticSize = 0, + BackgroundColor = BrickColor.new(194), + BackgroundColor3 = Color3.new(0.6392157, 0.63529414, 0.64705884), + BackgroundTransparency = 0, + BorderColor = BrickColor.new(26), + BorderColor3 = Color3.new(0.10588236, 0.16470589, 0.20784315), + BorderMode = 0, + BorderSizePixel = 1, + ClipsDescendants = false, + CurrentCamera = nil, + Draggable = false, + ImageColor3 = Color3.new(1, 1, 1), + ImageTransparency = 0, + LayoutOrder = 0, + LightColor = Color3.new(0.54901963, 0.54901963, 0.54901963), + LightDirection = Vector3.new(-1, -1, -1), + Localize = true, + Name = "ViewportFrame", + NextSelectionDown = nil, + NextSelectionLeft = nil, + NextSelectionRight = nil, + NextSelectionUp = nil, + Position = UDim2.new(0, 0, 0, 0), + RootLocalizationTable = nil, + Rotation = 0, + Selectable = false, + SelectionImageObject = nil, + Size = UDim2.new(0, 0, 0, 0), + SizeConstraint = 0, + Transparency = 0, + Visible = true, + ZIndex = 1, + }, + }, + VirtualInputManager = { + name = "VirtualInputManager", + superclass = "Instance", + properties = { + AdditionalLuaState = { + name = "AdditionalLuaState", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + }, + defaults = { + Name = "VirtualInputManager", + }, + }, + VirtualUser = { + name = "VirtualUser", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Instance", + }, + }, + Visit = { + name = "Visit", + superclass = "Instance", + properties = { + }, + defaults = { + Name = "Visit", + }, + }, + WedgePart = { + name = "WedgePart", + superclass = "FormFactorPart", + properties = { + }, + defaults = { + Anchored = false, + AssemblyAngularVelocity = Vector3.new(0, 0, 0), + AssemblyLinearVelocity = Vector3.new(0, 0, 0), + BackParamA = -0.5, + BackParamB = 0.5, + BackSurface = 0, + BackSurfaceInput = 0, + BottomParamA = -0.5, + BottomParamB = 0.5, + BottomSurface = 4, + BottomSurfaceInput = 0, + CFrame = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CanCollide = true, + CanTouch = true, + CastShadow = true, + CollisionGroupId = 0, + Color = Color3.new(0.6392157, 0.63529414, 0.64705884), + CustomPhysicalProperties = nil, + Elasticity = 0.5, + FormFactor = 1, + Friction = 0.3, + FrontParamA = -0.5, + FrontParamB = 0.5, + FrontSurface = 0, + FrontSurfaceInput = 0, + LeftParamA = -0.5, + LeftParamB = 0.5, + LeftSurface = 0, + LeftSurfaceInput = 0, + LocalTransparencyModifier = 0, + Locked = false, + Massless = false, + Material = 256, + Name = "Wedge", + Orientation = Vector3.new(0, 0, 0), + Position = Vector3.new(0, 0, 0), + Reflectance = 0, + RightParamA = -0.5, + RightParamB = 0.5, + RightSurface = 0, + RightSurfaceInput = 0, + RootPriority = 0, + RotVelocity = Vector3.new(0, 0, 0), + Rotation = Vector3.new(0, 0, 0), + Size = Vector3.new(4, 1.2, 2), + TopParamA = -0.5, + TopParamB = 0.5, + TopSurface = 0, + TopSurfaceInput = 0, + Transparency = 0, + Velocity = Vector3.new(0, 0, 0), + }, + }, + Weld = { + name = "Weld", + superclass = "JointInstance", + properties = { + }, + defaults = { + C0 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + C1 = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + Name = "Weld", + Part0 = nil, + Part1 = nil, + }, + }, + WeldConstraint = { + name = "WeldConstraint", + superclass = "Instance", + properties = { + Active = { + name = "Active", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Part0 = { + name = "Part0", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + Part1 = { + name = "Part1", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = false, + }, + }, + defaults = { + Enabled = true, + Name = "WeldConstraint", + Part0 = nil, + Part1 = nil, + }, + }, + Workspace = { + name = "Workspace", + superclass = "WorldRoot", + properties = { + AllowThirdPartySales = { + name = "AllowThirdPartySales", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + CollisionGroups = { + name = "CollisionGroups", + type = {type = "Data", name = "String"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + CurrentCamera = { + name = "CurrentCamera", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + DistributedGameTime = { + name = "DistributedGameTime", + type = {type = "Data", name = "Float64"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FallenPartsDestroyHeight = { + name = "FallenPartsDestroyHeight", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + FilteringEnabled = { + name = "FilteringEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Gravity = { + name = "Gravity", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + InterpolationThrottling = { + name = "InterpolationThrottling", + type = {type = "Enum", name = "InterpolationThrottlingMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + MeshPartHeads = { + name = "MeshPartHeads", + type = {type = "Enum", name = "MeshPartHeads"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + PhysicsSimulationRate = { + name = "PhysicsSimulationRate", + type = {type = "Enum", name = "PhysicsSimulationRate"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + StreamingEnabled = { + name = "StreamingEnabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + StreamingMinRadius = { + name = "StreamingMinRadius", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + StreamingPauseMode = { + name = "StreamingPauseMode", + type = {type = "Enum", name = "StreamingPauseMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + StreamingTargetRadius = { + name = "StreamingTargetRadius", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + Terrain = { + name = "Terrain", + type = {type = "Data", name = "Ref"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + TouchesUseCollisionGroups = { + name = "TouchesUseCollisionGroups", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = true, + }, + }, + defaults = { + AllowThirdPartySales = false, + CurrentCamera = nil, + DistributedGameTime = 0, + FallenPartsDestroyHeight = -500, + FilteringEnabled = false, + Gravity = 196.2, + InterpolationThrottling = 0, + LevelOfDetail = 0, + Name = "Workspace", + PrimaryPart = nil, + StreamingEnabled = false, + }, + }, + WorldModel = { + name = "WorldModel", + superclass = "WorldRoot", + properties = { + }, + defaults = { + LevelOfDetail = 0, + Name = "WorldModel", + PrimaryPart = nil, + }, + }, + WorldRoot = { + name = "WorldRoot", + superclass = "Model", + properties = { + }, + defaults = { + }, + }, + WrapLayer = { + name = "WrapLayer", + superclass = "BaseWrap", + properties = { + BindOffset = { + name = "BindOffset", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + DebugMode = { + name = "DebugMode", + type = {type = "Enum", name = "WrapLayerDebugMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + Enabled = { + name = "Enabled", + type = {type = "Data", name = "Bool"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Order = { + name = "Order", + type = {type = "Data", name = "Int32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + Puffiness = { + name = "Puffiness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReferenceMeshId = { + name = "ReferenceMeshId", + type = {type = "Data", name = "Content"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReferenceOrigin = { + name = "ReferenceOrigin", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + ReferenceOriginWorld = { + name = "ReferenceOriginWorld", + type = {type = "Data", name = "CFrame"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "Read", + serializes = false, + }, + ShrinkFactor = { + name = "ShrinkFactor", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + BindOffset = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + CageMeshId = "", + CageOrigin = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Enabled = true, + ImportOrigin = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Name = "WrapLayer", + Order = 1, + Puffiness = 1, + ReferenceMeshId = "", + ReferenceOrigin = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + ShrinkFactor = 0, + }, + }, + WrapTarget = { + name = "WrapTarget", + superclass = "BaseWrap", + properties = { + Color = { + name = "Color", + type = {type = "Data", name = "Color3"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + DebugMode = { + name = "DebugMode", + type = {type = "Enum", name = "WrapTargetDebugMode"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "None", + serializes = false, + }, + Stiffness = { + name = "Stiffness", + type = {type = "Data", name = "Float32"}, + isCanonical = true, + canonicalName = nil, + serializedName = nil, + scriptability = "ReadWrite", + serializes = true, + }, + }, + defaults = { + CageMeshId = "", + CageOrigin = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + ImportOrigin = CFrame.new(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1), + Name = "WrapTarget", + Stiffness = 0.9, + }, + }, +} diff --git a/plugin/rbx_dom_lua/src/ReflectionDatabase/init.lua b/plugin/rbx_dom_lua/src/ReflectionDatabase/init.lua new file mode 100644 index 00000000..bf1096e6 --- /dev/null +++ b/plugin/rbx_dom_lua/src/ReflectionDatabase/init.lua @@ -0,0 +1,3 @@ +return { + classes = require(script.classes) +} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/src/base64.lua b/plugin/rbx_dom_lua/src/base64.lua new file mode 100644 index 00000000..33011306 --- /dev/null +++ b/plugin/rbx_dom_lua/src/base64.lua @@ -0,0 +1,139 @@ +-- 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 = decodeBase64, + encode = encodeBase64, +} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/src/base64.spec.lua b/plugin/rbx_dom_lua/src/base64.spec.lua new file mode 100644 index 00000000..5f2a5f4a --- /dev/null +++ b/plugin/rbx_dom_lua/src/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/src/customProperties.lua b/plugin/rbx_dom_lua/src/customProperties.lua new file mode 100644 index 00000000..aa03310d --- /dev/null +++ b/plugin/rbx_dom_lua/src/customProperties.lua @@ -0,0 +1,47 @@ +local CollectionService = game:GetService("CollectionService") + +-- Defines how to read and write properties that aren't directly scriptable. +-- +-- The reflection database refers to these as having scriptability = "Custom" +return { + Instance = { + Tags = { + read = function(instance, key) + local tagList = CollectionService:GetTags(instance) + + return true, table.concat(tagList, "\0") + end, + write = function(instance, key, value) + local existingTags = CollectionService:GetTags(instance) + + local unseenTags = {} + for _, tag in ipairs(existingTags) do + unseenTags[tag] = true + end + + local tagList = string.split(value, "\0") + for _, tag in ipairs(tagList) do + unseenTags[tag] = nil + CollectionService:AddTag(instance, tag) + end + + for tag in pairs(unseenTags) do + CollectionService:RemoveTag(instance, tag) + end + + return true + end, + }, + }, + LocalizationTable = { + Contents = { + read = function(instance, key) + return true, instance:GetContents() + end, + write = function(instance, key, value) + instance:SetContents(value) + return true + end, + }, + }, +} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/init.lua b/plugin/rbx_dom_lua/src/init.lua similarity index 76% rename from plugin/rbx_dom_lua/init.lua rename to plugin/rbx_dom_lua/src/init.lua index 2d390a24..3c1149d6 100644 --- a/plugin/rbx_dom_lua/init.lua +++ b/plugin/rbx_dom_lua/src/init.lua @@ -1,4 +1,4 @@ -local database = require(script.database) +local ReflectionDatabase = require(script.ReflectionDatabase) local Error = require(script.Error) local PropertyDescriptor = require(script.PropertyDescriptor) @@ -6,32 +6,29 @@ local function findCanonicalPropertyDescriptor(className, propertyName) local currentClassName = className repeat - local currentClass = database.Classes[currentClassName] + local currentClass = ReflectionDatabase.classes[currentClassName] if currentClass == nil then return currentClass end - local propertyData = currentClass.Properties[propertyName] + local propertyData = currentClass.properties[propertyName] if propertyData ~= nil then - local canonicalData = propertyData.Kind.Canonical - if canonicalData ~= nil then + if propertyData.isCanonical then return PropertyDescriptor.fromRaw(propertyData, currentClassName, propertyName) end - local aliasData = propertyData.Kind.Alias - if aliasData ~= nil then + if propertyData.canonicalName ~= nil then return PropertyDescriptor.fromRaw( - currentClass.Properties[aliasData.AliasFor], + currentClass.properties[propertyData.canonicalName], currentClassName, - aliasData.AliasFor - ) + propertyData.canonicalName) end return nil end - currentClassName = currentClass.Superclass + currentClassName = currentClass.superclass until currentClassName == nil return nil @@ -67,4 +64,4 @@ return { findCanonicalPropertyDescriptor = findCanonicalPropertyDescriptor, Error = Error, EncodedValue = require(script.EncodedValue), -} +} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/src/init.spec.lua b/plugin/rbx_dom_lua/src/init.spec.lua new file mode 100644 index 00000000..4cafe5ae --- /dev/null +++ b/plugin/rbx_dom_lua/src/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/rbx_dom_lua/test-place.project.json b/plugin/rbx_dom_lua/test-place.project.json new file mode 100644 index 00000000..f852b2b4 --- /dev/null +++ b/plugin/rbx_dom_lua/test-place.project.json @@ -0,0 +1,35 @@ +{ + "name": "rbx_dom_lua test place", + "tree": { + "$className": "DataModel", + "ReplicatedStorage": { + "$className": "ReplicatedStorage", + + "RbxDom": { + "$path": "src" + }, + "TestEZ": { + "$path": "modules/testez/lib" + } + }, + "ServerScriptService": { + "$className": "ServerScriptService", + + "Run Tests": { + "$path": "test.server.lua" + } + }, + "Players": { + "$className": "Players", + "$properties": { + "CharacterAutoLoads": false + } + }, + "HttpService": { + "$className": "HttpService", + "$properties": { + "HttpEnabled": true + } + } + } +} \ No newline at end of file diff --git a/plugin/rbx_dom_lua/test.server.lua b/plugin/rbx_dom_lua/test.server.lua new file mode 100644 index 00000000..841c63c1 --- /dev/null +++ b/plugin/rbx_dom_lua/test.server.lua @@ -0,0 +1,7 @@ +local ReplicatedStorage = game:GetService("ReplicatedStorage") + +local LIB_ROOT = ReplicatedStorage.RbxDom + +local TestEZ = require(ReplicatedStorage.TestEZ) + +TestEZ.TestBootstrap:run({LIB_ROOT}) \ 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 deleted file mode 100644 index 95581829..00000000 --- a/plugin/src/App/Components/Studio/StudioPluginAction.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 Dictionary = require(Plugin.Dictionary) - -local StudioPluginContext = require(script.Parent.StudioPluginContext) - -local e = Roact.createElement - -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.pluginAction.Triggered:Connect(self.props.onTriggered) -end - -function StudioPluginAction:render() - return nil -end - -function StudioPluginAction:willUnmount() - self.pluginAction:Destroy() -end - -local function StudioPluginActionWrapper(props) - return e(StudioPluginContext.Consumer, { - render = function(plugin) - return e( - StudioPluginAction, - Dictionary.merge(props, { - plugin = plugin, - }) - ) - end, - }) -end - -return StudioPluginActionWrapper 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..1970ff92 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 @@ -41,10 +44,6 @@ function StudioToggleButton:didUpdate(lastProps) self.button.Enabled = self.props.enabled end - if self.props.icon ~= lastProps.icon then - self.button.Icon = self.props.icon - end - if self.props.active ~= lastProps.active then self.button:SetActive(self.props.active) end @@ -57,14 +56,11 @@ 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 -return StudioToggleButtonWrapper +return StudioToggleButtonWrapper \ No newline at end of file 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..10988424 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 @@ -26,15 +24,14 @@ local function AddressEntry(props) layoutOrder = props.layoutOrder, }, { Host = e("TextBox", { - Text = props.host or "", - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Large, + Text = "", + Font = Enum.Font.Code, + TextSize = 18, TextColor3 = theme.AddressEntry.TextColor, TextXAlignment = Enum.TextXAlignment.Left, TextTransparency = props.transparency, PlaceholderText = Config.defaultHost, PlaceholderColor3 = theme.AddressEntry.PlaceholderColor, - ClearTextOnFocus = false, Size = UDim2.new(1, -(HOST_OFFSET + DIVIDER_WIDTH + PORT_WIDTH), 1, 0), Position = UDim2.new(0, HOST_OFFSET, 0, 0), @@ -42,22 +39,17 @@ local function AddressEntry(props) ClipsDescendants = true, BackgroundTransparency = 1, - [Roact.Change.Text] = function(object) - if props.onHostChange ~= nil then - props.onHostChange(object.Text) - end - end, + [Roact.Ref] = props.hostRef, }), Port = e("TextBox", { - Text = props.port or "", - FontFace = theme.Font.Code, - TextSize = theme.TextSize.Large, + Text = "", + Font = Enum.Font.Code, + TextSize = 18, TextColor3 = theme.AddressEntry.TextColor, TextTransparency = props.transparency, PlaceholderText = Config.defaultPort, PlaceholderColor3 = theme.AddressEntry.PlaceholderColor, - ClearTextOnFocus = false, Size = UDim2.new(0, PORT_WIDTH, 1, 0), Position = UDim2.new(1, 0, 0, 0), @@ -66,14 +58,12 @@ local function AddressEntry(props) ClipsDescendants = true, BackgroundTransparency = 1, + [Roact.Ref] = props.portRef, + [Roact.Change.Text] = function(object) local text = object.Text text = text:gsub("%D", "") object.Text = text - - if props.onPortChange ~= nil then - props.onPortChange(text) - end end, }, { Divider = e("Frame", { @@ -90,6 +80,11 @@ end local NotConnectedPage = Roact.Component:extend("NotConnectedPage") +function NotConnectedPage:init() + self.hostRef = Roact.createRef() + self.portRef = Roact.createRef() +end + function NotConnectedPage:render() return Roact.createFragment({ Header = e(Header, { @@ -98,10 +93,8 @@ function NotConnectedPage:render() }), AddressEntry = e(AddressEntry, { - host = self.props.host, - port = self.props.port, - onHostChange = self.props.onHostChange, - onPortChange = self.props.onPortChange, + hostRef = self.hostRef, + portRef = self.portRef, transparency = self.props.transparency, layoutOrder = 2, }), @@ -110,7 +103,6 @@ function NotConnectedPage:render() Size = UDim2.new(1, 0, 0, 34), LayoutOrder = 3, BackgroundTransparency = 1, - ZIndex = 2, }, { Settings = e(TextButton, { text = "Settings", @@ -118,10 +110,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, { @@ -129,11 +117,15 @@ function NotConnectedPage:render() style = "Solid", transparency = self.props.transparency, layoutOrder = 2, - onClick = self.props.onConnect, - }, { - Tip = e(Tooltip.Trigger, { - text = "Connect to a Rojo sync server", - }), + onClick = function() + local hostText = self.hostRef.current.Text + local portText = self.portRef.current.Text + + self.props.onConnect( + #hostText > 0 and hostText or Config.defaultHost, + #portText > 0 and portText or Config.defaultPort + ) + end, }), Layout = e("UIListLayout", { @@ -159,4 +151,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..1b933252 --- /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 = "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..d6d688b3 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(0xF0F0F0), + 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(0xCACACA), + BorderColor = hexColor(0xAFAFAF), + }, + }, + AddressEntry = { + TextColor = hexColor(0x000000), + PlaceholderColor = hexColor(0x8C8C8C) + }, + BorderedContainer = { + BorderColor = hexColor(0xCBCBCB), + BackgroundColor = hexColor(0xE0E0E0), + }, + Spinner = { + ForegroundColor = BRAND_COLOR, + BackgroundColor = hexColor(0xE0E0E0), + }, + 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(0x272727), + 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(0x717171) + }, + BorderedContainer = { + BorderColor = hexColor(0x535353), + BackgroundColor = hexColor(0x323232), + }, + Spinner = { + ForegroundColor = BRAND_COLOR, + BackgroundColor = hexColor(0x323232), + }, + 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() @@ -264,4 +236,4 @@ return { StudioProvider = StudioProvider, Consumer = Context.Consumer, with = with, -} +} \ No newline at end of file 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..b4d01f5b 100644 --- a/plugin/src/App/init.lua +++ b/plugin/src/App/init.lua @@ -1,36 +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) local StudioPluginGui = require(script.Components.Studio.StudioPluginGui) @@ -41,7 +26,6 @@ local AppStatus = strict("AppStatus", { NotConnected = "NotConnected", Settings = "Settings", Connecting = "Connecting", - Confirming = "Confirming", Connected = "Connected", Error = "Error", }) @@ -53,663 +37,36 @@ 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: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 - -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) -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) +function App:startSession(host, port, sessionOptions) + 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, projectName = details, address = address, - toolbarIcon = Assets.Images.PluginButtonConnected, - }) - self:addNotification({ - text = string.format("Connected to session '%s' at %s.", 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. @@ -719,139 +76,20 @@ function App:startSession() self:setState({ appStatus = AppStatus.Error, 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, }) 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 end -function App:endSession() - if self.serveSession == nil then - return - end - - Log.trace("Disconnecting session") - - self.serveSession:stop() - self.serveSession = nil - self:setState({ - 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 - function App:render() local pluginName = "Rojo " .. Version.display(Config.version) @@ -870,17 +108,19 @@ function App:render() value = self.props.plugin, }, { e(Theme.StudioProvider, nil, { - tooltip = e(Tooltip.Provider, nil, { + e(PluginSettings.StudioProvider, { + plugin = self.props.plugin, + }, { gui = e(StudioPluginGui, { id = pluginName, title = pluginName, active = self.state.guiEnabled, - isEphemeral = false, initDockState = Enum.InitialDockState.Right, + initEnabled = false, overridePreviousState = false, - floatingSize = Vector2.new(320, 210), - minimumSize = Vector2.new(300, 210), + floatingSize = Vector2.new(300, 200), + minimumSize = Vector2.new(300, 200), zIndexBehavior = Enum.ZIndexBehavior.Sibling, @@ -896,72 +136,46 @@ function App:render() }) end, }, { - Tooltips = e(Tooltip.Container, nil), + NotConnectedPage = PluginSettings.with(function(settings) + return createPageElement(AppStatus.NotConnected, { + onConnect = function(host, port) + self:startSession(host, port, { + openScriptsExternally = settings:get("openScriptsExternally"), + twoWaySync = settings:get("twoWaySync"), + }) + end, - NotConnectedPage = createPageElement(AppStatus.NotConnected, { - host = self.host, - onHostChange = self.setHost, - port = self.port, - onPortChange = self.setPort, + onNavigateSettings = function() + self:setState({ + appStatus = AppStatus.Settings, + }) + end, + }) + end), - 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, - }), + Connecting = createPageElement(AppStatus.Connecting), 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, + Log.trace("Disconnecting session") - onNavigateSettings = function() - self.backPage = AppStatus.Connected + self.serveSession:stop() + self.serveSession = nil self:setState({ - appStatus = AppStatus.Settings, + appStatus = AppStatus.NotConnected, }) + + Log.trace("Session terminated by user") 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, + appStatus = AppStatus.NotConnected, }) end, }), @@ -972,96 +186,41 @@ function App:render() onClose = function() self:setState({ appStatus = AppStatus.NotConnected, - toolbarIcon = Assets.Images.PluginButton, }) end, }), + + Background = Theme.with(function(theme) + return e("Frame", { + Size = UDim2.new(1, 0, 1, 0), + BackgroundColor3 = theme.BackgroundColor, + ZIndex = 0, + BorderSizePixel = 0, + }) + end), }), - RojoNotifications = e("ScreenGui", { - ZIndexBehavior = Enum.ZIndexBehavior.Sibling, - ResetOnSpawn = false, - DisplayOrder = 100, + toolbar = e(StudioToolbar, { + name = pluginName, }, { - Notifications = e(Notifications, { - soundPlayer = self.props.soundPlayer, - notifications = self.state.notifications, - onClose = function(id) - self:closeNotification(id) + button = e(StudioToggleButton, { + name = "Rojo", + tooltip = "Show or hide the Rojo panel", + icon = Assets.Images.PluginButton, + active = self.state.guiEnabled, + enabled = true, + onClick = function() + self:setState(function(state) + return { + guiEnabled = not state.guiEnabled, + } + end) end, - }), - }), - }), - - toggleAction = e(StudioPluginAction, { - name = "RojoConnection", - title = "Rojo: Connect/Disconnect", - description = "Toggles the server for a Rojo sync session", - icon = Assets.Images.PluginButton, - bindable = true, - 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 - self:endSession() - end - end, - }), - - connectAction = e(StudioPluginAction, { - name = "RojoConnect", - title = "Rojo: Connect", - description = "Connects the server for a Rojo sync session", - icon = Assets.Images.PluginButton, - bindable = true, - onTriggered = function() - if self.serveSession == nil or self.serveSession:getStatus() == ServeSession.Status.NotStarted then - self:startSession() - end - end, - }), - - disconnectAction = e(StudioPluginAction, { - name = "RojoDisconnect", - title = "Rojo: Disconnect", - description = "Disconnects the server for a Rojo sync session", - icon = Assets.Images.PluginButton, - bindable = true, - onTriggered = function() - if self.serveSession ~= nil and self.serveSession:getStatus() == ServeSession.Status.Connected then - self:endSession() - end - end, - }), - - toolbar = e(StudioToolbar, { - name = pluginName, - }, { - button = e(StudioToggleButton, { - name = "Rojo", - tooltip = "Show or hide the Rojo panel", - icon = self.state.toolbarIcon, - active = self.state.guiEnabled, - enabled = true, - onClick = function() - self:setState(function(state) - return { - guiEnabled = not state.guiEnabled, - } - end) - end, + }) }), }), }), }) end -return function(props) - local mergedProps = Dictionary.merge(props, { - soundPlayer = soundPlayer.new(Settings), - }) - - return e(App, mergedProps) -end +return App \ No newline at end of file diff --git a/plugin/src/Assets.lua b/plugin/src/Assets.lua index c2c168ee..beb4bad5 100644 --- a/plugin/src/Assets.lua +++ b/plugin/src/Assets.lua @@ -18,33 +18,13 @@ local Assets = { Images = { Logo = "rbxassetid://5990772764", PluginButton = "rbxassetid://3405341609", - PluginButtonConnected = "rbxassetid://9529783993", - PluginButtonWarning = "rbxassetid://9529784530", 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 +40,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 +51,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 +60,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 deleted file mode 100644 index 5502d0d6..00000000 --- a/plugin/src/ChangeBatcher/createPatchSet.lua +++ /dev/null @@ -1,41 +0,0 @@ ---[[ - Take an InstanceMap and a dictionary mapping instances to sets of property - names. Populate a patch with the encoded values of all the given properties - on all the given instances (or, if any changes set Parent to nil, removals - of instances) and return the patch. -]] - -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) - -local PatchSet = require(script.Parent.Parent.PatchSet) - -local encodePatchUpdate = require(script.Parent.encodePatchUpdate) - -return function(instanceMap, propertyChanges) - local patch = PatchSet.newEmpty() - - for instance, properties in propertyChanges do - local instanceId = instanceMap.fromInstances[instance] - - if instanceId == nil then - Log.warn("Ignoring change for instance {:?} as it is unknown to Rojo", instance) - continue - end - - if properties.Parent then - if instance.Parent == nil then - table.insert(patch.removed, instanceId) - else - Log.warn("Cannot sync non-nil Parent property changes yet") - end - else - local update = encodePatchUpdate(instance, instanceId, properties) - table.insert(patch.updated, update) - end - - propertyChanges[instance] = nil - end - - return patch -end diff --git a/plugin/src/ChangeBatcher/createPatchSet.spec.lua b/plugin/src/ChangeBatcher/createPatchSet.spec.lua deleted file mode 100644 index 55528df6..00000000 --- a/plugin/src/ChangeBatcher/createPatchSet.spec.lua +++ /dev/null @@ -1,74 +0,0 @@ -return function() - local PatchSet = require(script.Parent.Parent.PatchSet) - local InstanceMap = require(script.Parent.Parent.InstanceMap) - - local createPatchSet = require(script.Parent.createPatchSet) - - it("should return a patch", function() - local patch = createPatchSet(InstanceMap.new(), {}) - - assert(PatchSet.validate(patch)) - end) - - it("should contain updates for every instance with property changes", function() - local instanceMap = InstanceMap.new() - - local part1 = Instance.new("Part") - instanceMap:insert("PART_1", part1) - - local part2 = Instance.new("Part") - instanceMap:insert("PART_2", part2) - - local changes = { - [part1] = { - Position = true, - Size = true, - Color = true, - }, - [part2] = { - CFrame = true, - Velocity = true, - Transparency = true, - }, - } - - local patch = createPatchSet(instanceMap, changes) - - expect(#patch.updated).to.equal(2) - end) - - it("should not contain any updates for removed instances", function() - local instanceMap = InstanceMap.new() - - local part1 = Instance.new("Part") - instanceMap:insert("PART_1", part1) - - local changes = { - [part1] = { - Parent = true, - Position = true, - Size = true, - }, - } - - local patch = createPatchSet(instanceMap, changes) - - expect(#patch.removed).to.equal(1) - expect(#patch.updated).to.equal(0) - end) - - it("should remove instances from the property change table", function() - local instanceMap = InstanceMap.new() - - local part1 = Instance.new("Part") - instanceMap:insert("PART_1", part1) - - local changes = { - [part1] = {}, - } - - createPatchSet(instanceMap, changes) - - expect(next(changes)).to.equal(nil) - end) -end diff --git a/plugin/src/ChangeBatcher/encodePatchUpdate.lua b/plugin/src/ChangeBatcher/encodePatchUpdate.lua deleted file mode 100644 index 5076fea2..00000000 --- a/plugin/src/ChangeBatcher/encodePatchUpdate.lua +++ /dev/null @@ -1,40 +0,0 @@ -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) -local RbxDom = require(Packages.RbxDom) - -local encodeProperty = require(script.Parent.encodeProperty) - -return function(instance, instanceId, properties) - local update = { - id = instanceId, - changedProperties = {}, - } - - for propertyName in properties do - if propertyName == "Name" then - update.changedName = instance.Name - else - local descriptor = RbxDom.findCanonicalPropertyDescriptor(instance.ClassName, propertyName) - - if not descriptor then - Log.debug("Could not sync back property {:?}.{}", instance, propertyName) - continue - end - - local encodeSuccess, encodeResult = encodeProperty(instance, propertyName, descriptor) - - if not encodeSuccess then - Log.debug("Could not sync back property {:?}.{}: {}", instance, propertyName, encodeResult) - continue - end - - update.changedProperties[propertyName] = encodeResult - end - end - - if next(update.changedProperties) == nil and update.changedName == nil then - return nil - end - - return update -end diff --git a/plugin/src/ChangeBatcher/encodePatchUpdate.spec.lua b/plugin/src/ChangeBatcher/encodePatchUpdate.spec.lua deleted file mode 100644 index 9945ae34..00000000 --- a/plugin/src/ChangeBatcher/encodePatchUpdate.spec.lua +++ /dev/null @@ -1,62 +0,0 @@ -return function() - local encodePatchUpdate = require(script.Parent.encodePatchUpdate) - - it("should return an update when there are property changes", function() - local part = Instance.new("Part") - local properties = { - CFrame = true, - Color = true, - } - local update = encodePatchUpdate(part, "PART", properties) - - expect(update.id).to.equal("PART") - expect(update.changedProperties.CFrame).to.be.ok() - expect(update.changedProperties.Color).to.be.ok() - end) - - it("should return nil when there are no property changes", function() - local part = Instance.new("Part") - local properties = { - NonExistentProperty = true, - } - local update = encodePatchUpdate(part, "PART", properties) - - expect(update).to.equal(nil) - end) - - it("should set changedName in the update when the instance's Name changes", function() - local part = Instance.new("Part") - local properties = { - Name = true, - } - - part.Name = "We'reGettingToTheCoolPart" - - local update = encodePatchUpdate(part, "PART", properties) - - expect(update.changedName).to.equal("We'reGettingToTheCoolPart") - end) - - it("should correctly encode property values", function() - local part = Instance.new("Part") - local properties = { - Position = true, - Color = true, - } - - part.Position = Vector3.new(0, 100, 0) - part.Color = Color3.new(0.8, 0.2, 0.9) - - local update = encodePatchUpdate(part, "PART", properties) - local position = update.changedProperties.Position - local color = update.changedProperties.Color - - expect(position.Vector3[1]).to.equal(0) - expect(position.Vector3[2]).to.equal(100) - expect(position.Vector3[3]).to.equal(0) - - expect(color.Color3[1]).to.be.near(0.8, 0.01) - expect(color.Color3[2]).to.be.near(0.2, 0.01) - expect(color.Color3[3]).to.be.near(0.9, 0.01) - end) -end diff --git a/plugin/src/ChangeBatcher/encodeProperty.lua b/plugin/src/ChangeBatcher/encodeProperty.lua deleted file mode 100644 index 52710e16..00000000 --- a/plugin/src/ChangeBatcher/encodeProperty.lua +++ /dev/null @@ -1,22 +0,0 @@ -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) -local RbxDom = require(Packages.RbxDom) - -return function(instance, propertyName, propertyDescriptor) - local readSuccess, readResult = propertyDescriptor:read(instance) - - if not readSuccess then - Log.warn("Could not sync back property {:?}.{}: {}", instance, propertyName, readResult) - return false, nil - end - - local dataType = propertyDescriptor.dataType - local encodeSuccess, encodeResult = RbxDom.EncodedValue.encode(readResult, dataType) - - if not encodeSuccess then - Log.warn("Could not sync back property {:?}.{}: {}", instance, propertyName, encodeResult) - return false, nil - end - - return true, encodeResult -end diff --git a/plugin/src/ChangeBatcher/init.lua b/plugin/src/ChangeBatcher/init.lua deleted file mode 100644 index 5d320ce2..00000000 --- a/plugin/src/ChangeBatcher/init.lua +++ /dev/null @@ -1,81 +0,0 @@ ---[[ - The ChangeBatcher is responsible for collecting and dispatching changes made - to tracked instances during two-way sync. -]] - -local RunService = game:GetService("RunService") - -local PatchSet = require(script.Parent.PatchSet) - -local createPatchSet = require(script.createPatchSet) - -local ChangeBatcher = {} -ChangeBatcher.__index = ChangeBatcher - -local BATCH_INTERVAL = 0.2 - -function ChangeBatcher.new(instanceMap, onChangesFlushed) - local self - - local renderSteppedConnection = RunService.RenderStepped:Connect(function(dt) - self:__cycle(dt) - end) - - self = setmetatable({ - __accumulator = 0, - __renderSteppedConnection = renderSteppedConnection, - __instanceMap = instanceMap, - __onChangesFlushed = onChangesFlushed, - __pendingPropertyChanges = {}, - }, ChangeBatcher) - - return self -end - -function ChangeBatcher:stop() - self.__renderSteppedConnection:Disconnect() - self.__pendingPropertyChanges = {} -end - -function ChangeBatcher:add(instance, propertyName) - local properties = self.__pendingPropertyChanges[instance] - - if not properties then - properties = {} - self.__pendingPropertyChanges[instance] = properties - end - - properties[propertyName] = true -end - -function ChangeBatcher:__cycle(dt) - self.__accumulator += dt - - if self.__accumulator >= BATCH_INTERVAL then - self.__accumulator -= BATCH_INTERVAL - - local patch = self:__flush() - - if patch then - self.__onChangesFlushed(patch) - end - end - - self.__instanceMap:unpauseAllInstances() -end - -function ChangeBatcher:__flush() - if next(self.__pendingPropertyChanges) == nil then - return nil - end - - local patch = createPatchSet(self.__instanceMap, self.__pendingPropertyChanges) - - if PatchSet.isEmpty(patch) then - return nil - end - - return patch -end - -return ChangeBatcher diff --git a/plugin/src/ChangeBatcher/init.spec.lua b/plugin/src/ChangeBatcher/init.spec.lua deleted file mode 100644 index 21173233..00000000 --- a/plugin/src/ChangeBatcher/init.spec.lua +++ /dev/null @@ -1,101 +0,0 @@ -return function() - local ChangeBatcher = require(script.Parent) - local InstanceMap = require(script.Parent.Parent.InstanceMap) - local PatchSet = require(script.Parent.Parent.PatchSet) - - local noop = function() end - - describe("new", function() - it("should create a new ChangeBatcher", function() - local instanceMap = InstanceMap.new() - local changeBatcher = ChangeBatcher.new(instanceMap, noop) - - expect(changeBatcher.__pendingPropertyChanges).to.be.a("table") - expect(next(changeBatcher.__pendingPropertyChanges)).to.equal(nil) - expect(changeBatcher.__onChangesFlushed).to.equal(noop) - expect(changeBatcher.__instanceMap).to.equal(instanceMap) - expect(typeof(changeBatcher.__renderSteppedConnection)).to.equal("RBXScriptConnection") - end) - end) - - describe("stop", function() - it("should disconnect the RenderStepped connection", function() - local changeBatcher = ChangeBatcher.new(InstanceMap.new(), noop) - - changeBatcher:stop() - - expect(changeBatcher.__renderSteppedConnection.Connected).to.equal(false) - end) - end) - - describe("add", function() - it("should add property changes to be considered for the current batch", function() - local instanceMap = InstanceMap.new() - local changeBatcher = ChangeBatcher.new(instanceMap, noop) - local part = Instance.new("Part") - - instanceMap:insert("PART", part) - changeBatcher:add(part, "Name") - - local properties = changeBatcher.__pendingPropertyChanges[part] - - expect(properties).to.be.a("table") - expect(properties.Name).to.be.ok() - - changeBatcher:add(part, "Position") - expect(properties.Position).to.be.ok() - end) - end) - - describe("__cycle", function() - it("should immediately unpause any paused instances after each cycle", function() - local instanceMap = InstanceMap.new() - local changeBatcher = ChangeBatcher.new(instanceMap, noop) - local part = Instance.new("Part") - - instanceMap.pausedUpdateInstances[part] = true - - changeBatcher:__cycle(0) - - expect(instanceMap.pausedUpdateInstances[part]).to.equal(nil) - end) - end) - - describe("__flush", function() - it("should return nil when there are no changes to process", function() - local changeBatcher = ChangeBatcher.new(InstanceMap.new(), noop) - expect(changeBatcher:__flush()).to.equal(nil) - end) - - it("should return a patch when there are changes to process and the resulting patch is non-empty", function() - local instanceMap = InstanceMap.new() - local changeBatcher = ChangeBatcher.new(instanceMap, noop) - local part = Instance.new("Part") - - instanceMap:insert("PART", part) - - changeBatcher.__pendingPropertyChanges[part] = { - Position = true, - Name = true, - } - - local patch = changeBatcher:__flush() - - assert(PatchSet.validate(patch)) - end) - - it("should return nil when there are changes to process and the resulting patch is empty", function() - local instanceMap = InstanceMap.new() - local changeBatcher = ChangeBatcher.new(instanceMap, noop) - local part = Instance.new("Part") - - instanceMap:insert("PART", part) - - changeBatcher.__pendingPropertyChanges[part] = { - NonExistentProperty = true, - } - - expect(changeBatcher:__flush()).to.equal(nil) - end) - end) -end diff --git a/plugin/src/Config.lua b/plugin/src/Config.lua index 8897996a..e681dca8 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 = {6, 0, 2}, + expectedServerVersionString = "6.0 or newer", + protocolVersion = 3, 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..7196d915 100644 --- a/plugin/src/InstanceMap.lua +++ b/plugin/src/InstanceMap.lua @@ -1,7 +1,4 @@ -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 +60,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,62 +109,55 @@ 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 --[[ - Pause updates for an instance. + Pause updates for an instance momentarily and invoke a callback. + + If the callback throws an error, InstanceMap will still be kept in a + consistent state. ]] -function InstanceMap:pauseInstance(instance) +function InstanceMap:pauseInstance(instance, callback) local id = self.fromInstances[instance] - -- If we don't know about this instance, ignore it. + -- If we don't know about this instance, ignore it and do not invoke the + -- callback. if id == nil then return end self.pausedUpdateInstances[instance] = true -end + local success, result = xpcall(callback, debug.traceback) + self.pausedUpdateInstances[instance] = false ---[[ - Unpause updates for an instance. -]] -function InstanceMap:unpauseInstance(instance) - self.pausedUpdateInstances[instance] = nil -end - ---[[ - Unpause updates for all instances. -]] -function InstanceMap:unpauseAllInstances() - table.clear(self.pausedUpdateInstances) + if success then + return result + else + error(result, 2) + end end function InstanceMap:__connectSignals(instance) @@ -210,12 +200,6 @@ function InstanceMap:__maybeFireInstanceChanged(instance, propertyName) return end - if RunService:IsRunning() then - -- We probably don't want to pick up property changes to save to the - -- filesystem in a running game. - return - end - self.onInstanceChanged(instance, propertyName) end @@ -227,7 +211,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 @@ -238,4 +222,4 @@ function InstanceMap:__disconnectSignals(instance) end end -return InstanceMap +return InstanceMap \ No newline at end of file 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..a061bea7 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,10 +60,10 @@ 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) + Log.debug("Failed to reify as part of applying a patch: {}", failedToReify) PatchSet.assign(unappliedPatch, failedToReify) end end @@ -89,10 +77,6 @@ local function applyPatch(instanceMap, patch) continue end - -- Pause updates on this instance to avoid picking up our changes when - -- two-way sync is enabled. - instanceMap:pauseInstance(instance) - -- Track any part of this update that could not be applied. local unappliedUpdate = { id = update.id, @@ -137,7 +121,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 +150,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 +161,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 +174,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,9 +194,7 @@ local function applyPatch(instanceMap, patch) end end - applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) - return unappliedPatch end -return applyPatch +return applyPatch \ No newline at end of file diff --git a/plugin/src/Reconciler/applyPatch.spec.lua b/plugin/src/Reconciler/applyPatch.spec.lua index b44e3eda..28e2a41e 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) @@ -168,7 +146,8 @@ return function() id = "VALUE", changedProperties = { Value = { - String = "WORLD", + Type = "String", + Value = "WORLD", }, }, }) @@ -181,7 +160,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" @@ -198,7 +176,8 @@ return function() changedClassName = "StringValue", changedProperties = { Value = { - String = "I am Root", + Type = "String", + Value = "I am Root", }, }, }) @@ -216,4 +195,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..5962d210 100644 --- a/plugin/src/Reconciler/decodeValue.lua +++ b/plugin/src/Reconciler/decodeValue.lua @@ -3,41 +3,37 @@ 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) - local ty, value = next(encodedValue) - +local function decodeValue(virtualValue, instanceMap) -- Refs are represented as IDs in the same space that Rojo's protocol uses. - if ty == "Ref" then - if value == "00000000000000000000000000000000" then + if virtualValue.Type == "Ref" then + if virtualValue.Value == nil then return true, nil end - local instance = instanceMap.fromIds[value] + local instance = instanceMap.fromIds[virtualValue.Value] if instance ~= nil then return true, instance else return false, Error.new(Error.RefDidNotExist, { - encodedValue = encodedValue, + virtualValue = virtualValue, }) end end - local decodeSuccess, decodedValue = RbxDom.EncodedValue.decode(encodedValue) + local ok, decodedValue = RbxDom.EncodedValue.decode(virtualValue) - if not decodeSuccess then - return false, - Error.new(Error.CannotDecodeValue, { - encodedValue = encodedValue, - innerError = decodedValue, - }) + if not ok then + return false, Error.new(Error.CannotDecodeValue, { + virtualValue = virtualValue, + 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..d146b308 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,55 +64,28 @@ 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 - Log.warn( - "Failed to decode property {}.{}. Encoded property was: {:#?}", - virtualInstance.ClassName, - propertyName, - virtualValue - ) + Log.warn("Failed to decode property of type {}", virtualValue.Type) end else local err = existingValueOrErr 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 +107,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 +114,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 +137,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..47709554 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 @@ -81,7 +80,8 @@ return function() Name = "Value", Properties = { Value = { - String = "Hello, world!", + Type = "String", + Value = "Hello, world!", }, }, Children = {}, @@ -107,9 +107,8 @@ return function() local patchProperty = update.changedProperties["Value"] expect(patchProperty).to.be.a("table") - local ty, value = next(patchProperty) - expect(ty).to.equal("String") - expect(value).to.equal("Hello, world!") + expect(patchProperty.Type).to.equal("String") + expect(patchProperty.Value).to.equal("Hello, world!") end) it("should generate an empty patch if no properties changed", function() @@ -120,7 +119,8 @@ return function() Name = "Value", Properties = { Value = { - String = "Hello, world!", + Type = "String", + Value = "Hello, world!", }, }, Children = {}, @@ -145,7 +145,8 @@ return function() Name = "Folder", Properties = { FAKE_PROPERTY = { - String = "Hello, world!", + Type = "String", + Value = "Hello, world!", }, }, Children = {}, @@ -182,7 +183,8 @@ return function() -- heat_xml is a serialization-only property that is not -- exposed to Lua. heat_xml = { - Float32 = 5, + Type = "Float32", + Value = 5, }, }, Children = {}, @@ -264,7 +266,7 @@ return function() ClassName = "Folder", Name = "Folder", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -287,4 +289,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..bc67525c 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,19 @@ 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 + + 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..b0c8aa0b 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 @@ -61,7 +70,7 @@ function reifyInstanceInner(unappliedPatch, deferredRefs, instanceMap, virtualIn for propertyName, virtualValue in pairs(virtualInstance.Properties) 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(virtualValue) == "Ref" then + if virtualValue.Type == "Ref" then table.insert(deferredRefs, { id = id, instance = instance, @@ -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,28 +135,24 @@ function applyDeferredRefs(instanceMap, deferredRefs, unappliedPatch) }) end - for _, entry in deferredRefs do - local _, refId = next(entry.virtualValue) + for _, entry in ipairs(deferredRefs) do + local virtualValue = entry.virtualValue - if refId == nil then + if virtualValue.Value == nil then continue end - local targetInstance = instanceMap.fromIds[refId] - + local targetInstance = instanceMap.fromIds[virtualValue.Value] if targetInstance == nil then - markFailed(entry.id, entry.propertyName, entry.virtualValue) + markFailed(entry.id, entry.propertyName, virtualValue) continue end - local setPropertySuccess = setProperty(entry.instance, entry.propertyName, targetInstance) - if not setPropertySuccess then - markFailed(entry.id, entry.propertyName, entry.virtualValue) + local ok = setProperty(entry.instance, entry.propertyName, targetInstance) + if not ok then + markFailed(entry.id, entry.propertyName, virtualValue) end end end -return { - reifyInstance = reifyInstance, - applyDeferredRefs = applyDeferredRefs, -} +return reify \ No newline at end of file diff --git a/plugin/src/Reconciler/reify.spec.lua b/plugin/src/Reconciler/reify.spec.lua index 20f363d7..74335ec5 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") @@ -61,18 +54,16 @@ return function() Name = "Spaghetti", Properties = { Value = { - String = "Hello, world!", + Type = "String", + Value = "Hello, world!", }, }, Children = {}, }, } - 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 +81,7 @@ return function() ClassName = "Folder", Name = "Parent", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -101,11 +92,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 +113,7 @@ return function() ClassName = "Folder", Name = "Parent", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -136,11 +124,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 +148,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 +183,7 @@ return function() ClassName = "Folder", Name = "Root", Properties = {}, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -209,18 +191,16 @@ return function() Name = "Child", Properties = { Value = { - Ref = "ROOT", + Type = "Ref", + Value = "ROOT", }, }, Children = {}, }, } - 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") @@ -239,23 +219,21 @@ return function() Name = "Root", Properties = { Value = { - Ref = "EXISTING", + Type = "Ref", + Value = "EXISTING", }, }, Children = {}, }, } - 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 +250,7 @@ return function() ClassName = "Folder", Name = "Root", Properties = {}, - Children = { "CHILD_A", "CHILD_B" }, + Children = {"CHILD_A", "CHILD_B"}, }, CHILD_A = { @@ -280,7 +258,8 @@ return function() Name = "Child A", Properties = { Value = { - Ref = "CHILD_B", + Type = "Ref", + Value = "Child B", }, }, Children = {}, @@ -294,11 +273,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") @@ -315,17 +291,18 @@ return function() -- constructed as part of a recursive call before the parent has totally -- finished. Given deferred refs, this should not fail, but it is a good -- case to test. - it("should apply properties containing refs to later children correctly", function() + it("should apply properties containing refs to later siblings correctly", function() local virtualInstances = { ROOT = { ClassName = "ObjectValue", Name = "Root", Properties = { Value = { - Ref = "CHILD", + Type = "Ref", + Value = "CHILD", }, }, - Children = { "CHILD" }, + Children = {"CHILD"}, }, CHILD = { @@ -336,11 +313,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 +338,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") @@ -378,4 +349,4 @@ return function() expect(update.id).to.equal("ROOT") expect(update.changedProperties.Value).to.equal(virtualInstances["ROOT"].Properties.Value) end) -end +end \ No newline at end of file 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..9e06065f 100644 --- a/plugin/src/ServeSession.lua +++ b/plugin/src/ServeSession.lua @@ -1,24 +1,13 @@ 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 +16,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 +38,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 +45,7 @@ ServeSession.Status = Status local validateServeOptions = t.strictInterface({ apiContext = t.table, + openScriptsExternally = t.boolean, twoWaySync = t.boolean, }) @@ -71,44 +55,34 @@ function ServeSession.new(options) -- Declare self ahead of time to capture it in a closure local self local function onInstanceChanged(instance, propertyName) - if not self.__twoWaySync then - return - end - - self.__changeBatcher:add(instance, propertyName) - end - - local function onChangesFlushed(patch) - self.__apiContext:write(patch) + self:__onInstanceChanged(instance, propertyName) end local instanceMap = InstanceMap.new(onInstanceChanged) - local changeBatcher = ChangeBatcher.new(instanceMap, onChangesFlushed) local reconciler = Reconciler.new(instanceMap) 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) @@ -127,101 +101,26 @@ function ServeSession:__fmtDebug(output) output:write("}") end -function ServeSession:getStatus() - return self.__status -end - 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) - 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 @@ -229,18 +128,8 @@ function ServeSession:stop() self:__stopInternal() end -function ServeSession:__applyGameAndPlaceId(serverInfo) - if serverInfo.gameId ~= nil then - game:SetUniverseId(serverInfo.gameId) - end - - if serverInfo.placeId ~= nil then - game:SetPlaceId(serverInfo.placeId) - end -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 @@ -261,318 +150,126 @@ function ServeSession:__onActiveScriptChanged(activeScript) Log.debug("Trying to open script {} externally...", activeScript) - -- Force-close the script inside Studio... with a small delay in the middle - -- to prevent Studio from crashing. - spawn(function() - local existingParent = activeScript.Parent - activeScript.Parent = nil - - for _ = 1, 3 do - RunService.Heartbeat:Wait() - end - - activeScript.Parent = existingParent - end) + -- Force-close the script inside Studio + local existingParent = activeScript.Parent + activeScript.Parent = nil + activeScript.Parent = existingParent -- Notify the Rojo server to open this script 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 +function ServeSession:__onInstanceChanged(instance, propertyName) + if not self.__twoWaySync then + return end - -- 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 + local instanceId = self.__instanceMap.fromInstances[instance] - 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 + if instanceId == nil then + Log.warn("Ignoring change for instance {:?} as it is unknown to Rojo", instance) + return 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 + local remove = nil + + local update = { + id = instanceId, + changedProperties = {}, + } + + if propertyName == "Name" then + update.changedName = instance.Name + elseif propertyName == "Parent" then + if instance.Parent == nil then + update = nil + remove = instanceId + else + Log.warn("Cannot sync non-nil Parent property changes yet") + return + end + else + local success, encoded = self.__reconciler:encodeApiValue(instance[propertyName]) + + if not success then + Log.warn("Could not sync back property {:?}.{}", instance, propertyName) + return end - table.insert(swaps, { - id = id, - replacement = replacement, - oldInstance = oldInstance, - }) + update.changedProperties[propertyName] = encoded end - for _, swap in orderSwaps(swaps) do - local id, replacement, oldInstance = swap.id, swap.replacement, swap.oldInstance + local patch = { + removed = {remove}, + added = {}, + updated = {update}, + } - 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 + self.__apiContext:write(patch) +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) +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) - 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 "") + -- 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) + + -- 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) self:__setStatus(Status.Disconnected, err) self.__apiContext:disconnect() self.__instanceMap:stop() - self.__changeBatcher:stop() for _, connection in ipairs(self.__connections) do connection:Disconnect() @@ -588,4 +285,4 @@ function ServeSession:__setStatus(status, detail) end end -return ServeSession +return ServeSession \ No newline at end of file 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..dac5f06c 100644 --- a/plugin/src/Types.lua +++ b/plugin/src/Types.lua @@ -1,11 +1,14 @@ -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 -local ApiValue = t.keys(t.string) +local ApiValue = t.interface({ + Type = t.string, + Value = t.optional(t.any), +}) local ApiInstanceMetadata = t.interface({ ignoreUnknownInstances = t.optional(t.boolean), @@ -49,39 +52,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 +82,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, @@ -110,4 +96,4 @@ return strict("Types", { VirtualInstance = ApiInstance, VirtualMetadata = ApiInstanceMetadata, VirtualValue = ApiValue, -}) +}) \ No newline at end of file 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..7bc42eb6 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/lib" } }, @@ -25,4 +25,4 @@ } } } -} +} \ No newline at end of file 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__json_model_in_folder.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__json_model_in_folder.snap index db195dd9..cf1dba88 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__json_model_in_folder.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__json_model_in_folder.snap @@ -10,7 +10,7 @@ expression: contents simple-model - 5 + 5 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__optional.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__optional.snap deleted file mode 100644 index 63f0494f..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__optional.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents - ---- - - - - optional - - - - foo-optional - Hello, from foo.txt! - - - - - foo-required - Hello, from foo.txt! - - - - 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__project_composed_default.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__project_composed_default.snap deleted file mode 100644 index 6445e820..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__project_composed_default.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents - ---- - - - - root - - - - folder - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__project_composed_file.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__project_composed_file.snap deleted file mode 100644 index 287268ed..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__project_composed_file.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents - ---- - - - - root - - - - folder - - - - child-projectname - - - - - diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__project_root_name.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__project_root_name.snap deleted file mode 100644 index 2dd39b54..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__project_root_name.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents - ---- - - - - root - - - 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..92cab199 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 @@ -24,14 +24,15 @@ expression: contents 0 1 - false null - + + Cool StringValue - + + Did you know that BaseValue.Changed is different than Instance.Changed? diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_ref.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_ref.snap index 621961f8..1f1e21a2 100644 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_ref.snap +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__rbxmx_ref.snap @@ -1,25 +1,27 @@ --- source: tests/tests/build.rs expression: contents - --- rbxmx_ref - + + Target - + + Pointed to by ObjectValue Pointer - + + 1 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 deleted file mode 100644 index 805b1d50..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__unresolved_values.snap +++ /dev/null @@ -1,66 +0,0 @@ ---- -source: tests/tests/build.rs -expression: contents ---- - - - - unresolved-values - - - - Lighting - - 1 - 0 - 0 - - 1 - - - - - Workspace - false - - - - Bool - true - - - - - Color - - 1 - 2 - 3 - 0 - 1 - 0 - 0 - 0 - 1 - 1 - 0 - 0 - - 8404992 - - - - - Float - 123.5 - - - - - Int - 65 - - - - - 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 deleted file mode 100644 index 37819274..00000000 --- a/rojo-test/build-test-snapshots/end_to_end__tests__build__weldconstraint.snap +++ /dev/null @@ -1,226 +0,0 @@ ---- -source: tests/tests/build.rs -assertion_line: 99 -expression: contents ---- - - - - weldconstraint - - -1 - - - - - A - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - -14 - 0.5 - -5 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - true - true - true - true - 0 - 10724005 - - false - - 1 - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 1 - - 4 - 1 - 2 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - - - - WeldConstraint - - - 7 - 0.000001013279 - -3 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 1 - 3 - -1 - 3 - - - - - - - B - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - -7 - 0.500001 - -8 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - true - true - true - true - 0 - 10724005 - - false - - 1 - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 1 - - 4 - 1 - 2 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 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/optional/default.project.json b/rojo-test/build-tests/optional/default.project.json deleted file mode 100644 index 9e9091f4..00000000 --- a/rojo-test/build-tests/optional/default.project.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "optional", - "tree": { - "$className": "Folder", - "foo-required": { - "$path": "foo.txt" - }, - "foo-optional":{ - "$path": { "optional": "foo.txt" } - }, - "bar-optional":{ - "$path": { "optional": "bar.txt" } - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/optional/foo.txt b/rojo-test/build-tests/optional/foo.txt deleted file mode 100644 index ca77661c..00000000 --- a/rojo-test/build-tests/optional/foo.txt +++ /dev/null @@ -1 +0,0 @@ -Hello, from foo.txt! \ 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/project_composed_default/default.project.json b/rojo-test/build-tests/project_composed_default/default.project.json deleted file mode 100644 index c38c6b60..00000000 --- a/rojo-test/build-tests/project_composed_default/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "root", - "tree": { - "$className": "Folder", - "folder": { - "$path": "folder" - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/project_composed_default/folder/default.project.json b/rojo-test/build-tests/project_composed_default/folder/default.project.json deleted file mode 100644 index 0b282813..00000000 --- a/rojo-test/build-tests/project_composed_default/folder/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "child-projectname", - "tree": { - "$className": "Folder" - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/project_composed_file/default.project.json b/rojo-test/build-tests/project_composed_file/default.project.json deleted file mode 100644 index c38c6b60..00000000 --- a/rojo-test/build-tests/project_composed_file/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "root", - "tree": { - "$className": "Folder", - "folder": { - "$path": "folder" - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/project_composed_file/folder/child-filename.project.json b/rojo-test/build-tests/project_composed_file/folder/child-filename.project.json deleted file mode 100644 index 0b282813..00000000 --- a/rojo-test/build-tests/project_composed_file/folder/child-filename.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "child-projectname", - "tree": { - "$className": "Folder" - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/project_root_name/default.project.json b/rojo-test/build-tests/project_root_name/default.project.json deleted file mode 100644 index d7171c6a..00000000 --- a/rojo-test/build-tests/project_root_name/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "root", - "tree": { - "$className": "Folder" - } -} \ No newline at end of file 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/build-tests/unresolved_values/default.project.json b/rojo-test/build-tests/unresolved_values/default.project.json deleted file mode 100644 index aecca203..00000000 --- a/rojo-test/build-tests/unresolved_values/default.project.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "unresolved-values", - "tree": { - "$className": "DataModel", - - "Lighting": { - "$properties": { - "Technology": "Voxel", - "Ambient": [1, 0, 0] - } - }, - - "Workspace": { - "Color": { - "$className": "Part", - "$properties": { - "Color": [0.5, 0.25, 0], - "CFrame": [ - 1, 2, 3, - 0, 1, 0, - 0, 0, 1, - 1, 0, 0 - ] - } - }, - - "Bool": { - "$className": "BoolValue", - "$properties": { - "Value": true - } - }, - - "Int": { - "$className": "IntValue", - "$properties": { - "Value": 65 - } - }, - - "Float": { - "$className": "NumberValue", - "$properties": { - "Value": 123.5 - } - } - } - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/weldconstraint/default.project.json b/rojo-test/build-tests/weldconstraint/default.project.json deleted file mode 100644 index 2a61046c..00000000 --- a/rojo-test/build-tests/weldconstraint/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "weldconstraint", - "tree": { - "$path": "two-parts-welded.rbxmx" - } -} \ No newline at end of file diff --git a/rojo-test/build-tests/weldconstraint/two-parts-welded.rbxmx b/rojo-test/build-tests/weldconstraint/two-parts-welded.rbxmx deleted file mode 100644 index a89841ac..00000000 --- a/rojo-test/build-tests/weldconstraint/two-parts-welded.rbxmx +++ /dev/null @@ -1,224 +0,0 @@ - - true - null - nil - - - - Folder - -1 - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - -14 - 0.5 - -5 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - true - true - true - true - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - A - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 4 - 1 - 2 - - - - - - - 7 - 1.01327896e-06 - -3 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - WeldConstraint - RBX15D09A13EACB4A6D96E75739B60CB129 - RBX308EE5932F7A492685067C0B84AA3DAF - -1 - 3 - - - - - - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - - -7 - 0.500001013 - -8 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - true - true - true - true - 0 - 4288914085 - - false - - -0.5 - 0.5 - 0 - 0 - -0.5 - 0.5 - 0 - 0 - false - false - 256 - B - - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 1 - - 0 - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - -1 - - -0.5 - 0.5 - 0 - 0 - 0 - - 0 - 0 - 0 - - 1 - 1 - - 4 - 1 - 2 - - - - - \ No newline at end of file diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all-2.snap index 2053b9c7..29d3b553 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all-2.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all-2.snap @@ -11,7 +11,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: add_folder - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} id-3: Children: [] diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all.snap index 3cffd761..fc902c99 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_folder_all.snap @@ -10,7 +10,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: add_folder - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} messageCursor: 0 sessionId: id-1 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..738c0fd0 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 @@ -3,11 +3,8 @@ source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: add_folder -protocolVersion: 5 +protocolVersion: 3 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 deleted file mode 100644 index 4107de74..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) - ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: optional -protocolVersion: 5 -rootInstanceId: id-2 -serverVersion: "[server-version]" -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_all-2.snap deleted file mode 100644 index 22432adf..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_all-2.snap +++ /dev/null @@ -1,62 +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: optional - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: - - id-4 - - id-5 - ClassName: Folder - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: src - Parent: id-2 - Properties: {} - id-4: - Children: [] - ClassName: StringValue - Id: id-4 - Metadata: - ignoreUnknownInstances: false - Name: foo - Parent: id-3 - Properties: - Value: - String: "Hello, from foo.txt!" - id-5: - Children: - - id-6 - ClassName: Folder - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: node_modules - Parent: id-3 - Properties: {} - id-6: - Children: [] - ClassName: StringValue - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: bar - Parent: id-5 - Properties: - Value: - String: Hello from bar.txt -messageCursor: 2 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_all.snap deleted file mode 100644 index af3714ec..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_all.snap +++ /dev/null @@ -1,40 +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: optional - Parent: "00000000000000000000000000000000" - Properties: {} - 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: false - Name: foo - Parent: id-3 - Properties: - Value: - String: "Hello, from foo.txt!" -messageCursor: 0 -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_subscribe.snap deleted file mode 100644 index 492302c8..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__add_optional_folder_subscribe.snap +++ /dev/null @@ -1,36 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "subscribe_response.intern_and_redact(&mut redactions, ())" - ---- -messageCursor: 2 -messages: - - added: - id-5: - Children: - - id-6 - ClassName: Folder - Id: id-5 - Metadata: - ignoreUnknownInstances: false - Name: node_modules - Parent: id-3 - Properties: {} - id-6: - Children: [] - ClassName: StringValue - Id: id-6 - Metadata: - ignoreUnknownInstances: false - Name: bar - Parent: id-5 - Properties: - Value: - String: Hello from bar.txt - removed: [] - updated: [] - - added: {} - removed: [] - updated: [] -sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all-2.snap index 0229179a..688f72d6 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all-2.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all-2.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: "read_response.intern_and_redact(&mut redactions, root_id)" - --- instances: id-2: @@ -11,10 +10,10 @@ instances: Metadata: ignoreUnknownInstances: false Name: edit_init - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: Source: - String: "-- Edited contents" + Type: String + Value: "-- Edited contents" messageCursor: 1 sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all.snap index d3f50dbd..a484d8e2 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__edit_init_all.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: "read_response.intern_and_redact(&mut redactions, root_id)" - --- instances: id-2: @@ -11,10 +10,10 @@ instances: Metadata: ignoreUnknownInstances: false Name: edit_init - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: Source: - String: "-- Original contents" + Type: String + Value: "-- Original contents" messageCursor: 0 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..b9c43c7a 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 @@ -3,11 +3,8 @@ source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: edit_init -protocolVersion: 5 +protocolVersion: 3 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..bb3f9990 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,18 @@ --- 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: + Type: String + Value: "-- Edited contents" + id: id-2 sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_all.snap index 71fded9e..188f854f 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_all.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_all.snap @@ -10,7 +10,7 @@ instances: Metadata: ignoreUnknownInstances: true Name: empty - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} messageCursor: 0 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..7b4e3904 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 @@ -3,11 +3,8 @@ source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: empty -protocolVersion: 5 +protocolVersion: 3 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 deleted file mode 100644 index b6ccce20..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all-2.snap +++ /dev/null @@ -1,28 +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: empty_folder - Parent: "00000000000000000000000000000000" - Properties: {} - id-3: - Children: [] - ClassName: Model - Id: id-3 - Metadata: - ignoreUnknownInstances: false - Name: test - Parent: id-2 - Properties: - NeedsPivotMigration: - Bool: false -messageCursor: 1 -sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all.snap deleted file mode 100644 index f7440a4a..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_all.snap +++ /dev/null @@ -1,18 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "read_response.intern_and_redact(&mut redactions, root_id)" - ---- -instances: - id-2: - Children: [] - ClassName: Folder - Id: id-2 - Metadata: - ignoreUnknownInstances: false - Name: empty_folder - Parent: "00000000000000000000000000000000" - Properties: {} -messageCursor: 0 -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 deleted file mode 100644 index 0e5958ac..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_info.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: redactions.redacted_yaml(info) ---- -expectedPlaceIds: ~ -gameId: ~ -placeId: ~ -projectName: empty_folder -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__empty_json_model_subscribe.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_subscribe.snap deleted file mode 100644 index 74ce73a2..00000000 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__empty_json_model_subscribe.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: tests/tests/serve.rs -expression: "socket_packet.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 -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_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_all-2.snap index 9b4c47f7..96e5126e 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_all-2.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_all-2.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: "read_response.intern_and_redact(&mut redactions, root_id)" - --- instances: id-10: @@ -14,7 +13,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #6" + Type: String + Value: "File #6" id-11: Children: [] ClassName: StringValue @@ -25,7 +25,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #7" + Type: String + Value: "File #7" id-12: Children: [] ClassName: StringValue @@ -36,7 +37,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #8" + Type: String + Value: "File #8" id-13: Children: [] ClassName: StringValue @@ -47,7 +49,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #9" + Type: String + Value: "File #9" id-2: Children: - id-3 @@ -56,7 +59,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: move_folder_of_stuff - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} id-3: Children: @@ -87,7 +90,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #0" + Type: String + Value: "File #0" id-5: Children: [] ClassName: StringValue @@ -98,7 +102,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #1" + Type: String + Value: "File #1" id-6: Children: [] ClassName: StringValue @@ -109,7 +114,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #2" + Type: String + Value: "File #2" id-7: Children: [] ClassName: StringValue @@ -120,7 +126,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #3" + Type: String + Value: "File #3" id-8: Children: [] ClassName: StringValue @@ -131,7 +138,8 @@ instances: Parent: id-3 Properties: Value: - String: "File #4" + Type: String + Value: "File #4" id-9: Children: [] ClassName: StringValue @@ -142,7 +150,7 @@ instances: Parent: id-3 Properties: Value: - String: "File #5" + Type: String + Value: "File #5" messageCursor: 1 sessionId: id-1 - diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_all.snap index 08cc4e31..1f189d00 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_all.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__move_folder_of_stuff_all.snap @@ -10,7 +10,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: move_folder_of_stuff - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} messageCursor: 0 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..e3a59e17 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 @@ -3,11 +3,8 @@ source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: move_folder_of_stuff -protocolVersion: 5 +protocolVersion: 3 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..9f544c5c 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,149 @@ --- 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: + Type: String + Value: "File #6" + id-11: + Children: [] + ClassName: StringValue + Id: id-11 + Metadata: + ignoreUnknownInstances: false + Name: "7" + Parent: id-3 + Properties: + Value: + Type: String + Value: "File #7" + id-12: + Children: [] + ClassName: StringValue + Id: id-12 + Metadata: + ignoreUnknownInstances: false + Name: "8" + Parent: id-3 + Properties: + Value: + Type: String + Value: "File #8" + id-13: + Children: [] + ClassName: StringValue + Id: id-13 + Metadata: + ignoreUnknownInstances: false + Name: "9" + Parent: id-3 + Properties: + Value: + Type: String + Value: "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: + Type: String + Value: "File #0" + id-5: + Children: [] + ClassName: StringValue + Id: id-5 + Metadata: + ignoreUnknownInstances: false + Name: "1" + Parent: id-3 + Properties: + Value: + Type: String + Value: "File #1" + id-6: + Children: [] + ClassName: StringValue + Id: id-6 + Metadata: + ignoreUnknownInstances: false + Name: "2" + Parent: id-3 + Properties: + Value: + Type: String + Value: "File #2" + id-7: + Children: [] + ClassName: StringValue + Id: id-7 + Metadata: + ignoreUnknownInstances: false + Name: "3" + Parent: id-3 + Properties: + Value: + Type: String + Value: "File #3" + id-8: + Children: [] + ClassName: StringValue + Id: id-8 + Metadata: + ignoreUnknownInstances: false + Name: "4" + Parent: id-3 + Properties: + Value: + Type: String + Value: "File #4" + id-9: + Children: [] + ClassName: StringValue + Id: id-9 + Metadata: + ignoreUnknownInstances: false + Name: "5" + Parent: id-3 + Properties: + Value: + Type: String + Value: "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_all-2.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all-2.snap index 7d0b25bb..b3c0a7fd 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all-2.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all-2.snap @@ -10,7 +10,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: remove_file - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} messageCursor: 1 sessionId: id-1 diff --git a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all.snap b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all.snap index 4ec6ce4c..8534c320 100644 --- a/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all.snap +++ b/rojo-test/serve-test-snapshots/end_to_end__tests__serve__remove_file_all.snap @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: "read_response.intern_and_redact(&mut redactions, root_id)" - --- instances: id-2: @@ -12,7 +11,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: remove_file - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} id-3: Children: [] @@ -24,7 +23,7 @@ instances: Parent: id-2 Properties: Value: - String: This file will be removed! + Type: String + Value: This file will be removed! messageCursor: 0 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..bbc8301f 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 @@ -3,11 +3,8 @@ source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: remove_file -protocolVersion: 5 +protocolVersion: 3 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..7571797f 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 @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: "read_response.intern_and_redact(&mut redactions, root_id)" - --- instances: id-2: @@ -13,7 +12,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: scripts - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} id-3: Children: [] @@ -24,10 +23,9 @@ instances: Name: bar Parent: id-2 Properties: - RunContext: - Enum: 0 Source: - String: "-- Hello, from bar!" + Type: String + Value: "-- Hello, from bar!" id-4: Children: [] ClassName: ModuleScript @@ -38,7 +36,7 @@ instances: Parent: id-2 Properties: Source: - String: Updated foo! + Type: String + Value: Updated foo! messageCursor: 1 sessionId: id-1 - 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..6f67d05c 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 @@ -1,7 +1,6 @@ --- source: tests/tests/serve.rs expression: "read_response.intern_and_redact(&mut redactions, root_id)" - --- instances: id-2: @@ -13,7 +12,7 @@ instances: Metadata: ignoreUnknownInstances: false Name: scripts - Parent: "00000000000000000000000000000000" + Parent: ~ Properties: {} id-3: Children: [] @@ -24,10 +23,9 @@ instances: Name: bar Parent: id-2 Properties: - RunContext: - Enum: 0 Source: - String: "-- Hello, from bar!" + Type: String + Value: "-- Hello, from bar!" id-4: Children: [] ClassName: ModuleScript @@ -38,7 +36,7 @@ instances: Parent: id-2 Properties: Source: - String: "-- Hello, from foo!" + Type: String + Value: "-- Hello, from foo!" messageCursor: 0 sessionId: id-1 - 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..0b801363 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 @@ -3,11 +3,8 @@ source: tests/tests/serve.rs expression: redactions.redacted_yaml(info) --- expectedPlaceIds: ~ -gameId: ~ -placeId: ~ projectName: scripts -protocolVersion: 5 +protocolVersion: 3 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..4b373663 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,18 @@ --- 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: + Type: String + Value: 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/add_optional_folder/default.project.json b/rojo-test/serve-tests/add_optional_folder/default.project.json deleted file mode 100644 index d582e8e5..00000000 --- a/rojo-test/serve-tests/add_optional_folder/default.project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "optional", - "tree": { - "$className": "Folder", - "create-later": { - "$path": { "optional": "create-later" } - } - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/empty_json_model/default.project.json b/rojo-test/serve-tests/empty_json_model/default.project.json deleted file mode 100644 index 5d67b95b..00000000 --- a/rojo-test/serve-tests/empty_json_model/default.project.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "empty_folder", - "tree": { - "$path": "src" - } -} \ No newline at end of file diff --git a/rojo-test/serve-tests/empty_json_model/src/test.model.json b/rojo-test/serve-tests/empty_json_model/src/test.model.json deleted file mode 100644 index e69de29b..00000000 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/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..e73e3567 100644 --- a/selene.toml +++ b/selene.toml @@ -1,7 +1,4 @@ -std = "roblox+testez" +std = "roblox" [config] unused_variable = { allow_unused_self = true } - -[lints] -roblox_manual_fromscale_or_fromoffset = "allow" diff --git a/src/main.rs b/src/bin.rs similarity index 74% rename from src/main.rs rename to src/bin.rs index 357c27cb..ca4b878d 100644 --- a/src/main.rs +++ b/src/bin.rs @@ -1,14 +1,24 @@ use std::{env, panic, process}; use backtrace::Backtrace; -use clap::Parser; +use structopt::StructOpt; -use librojo::cli::Options; +use librojo::cli::{self, GlobalOptions, Options, Subcommand}; + +fn run(global: GlobalOptions, subcommand: Subcommand) -> anyhow::Result<()> { + match subcommand { + Subcommand::Init(init_options) => cli::init(init_options)?, + Subcommand::Serve(serve_options) => cli::serve(global, serve_options)?, + Subcommand::Build(build_options) => cli::build(build_options)?, + Subcommand::Upload(upload_options) => cli::upload(upload_options)?, + Subcommand::Doc => cli::doc()?, + Subcommand::Plugin(plugin_options) => cli::plugin(plugin_options)?, + } + + Ok(()) +} 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 +30,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 +62,7 @@ fn main() { process::exit(1); })); - let options = Options::parse(); + let options = Options::from_args(); let log_filter = match options.global.verbosity { 0 => "info", @@ -74,7 +81,7 @@ fn main() { .write_style(options.global.color.into()) .init(); - if let Err(err) = options.run() { + if let Err(err) = run(options.global, options.subcommand) { log::error!("{:?}", err); process::exit(1); } diff --git a/src/change_processor.rs b/src/change_processor.rs index c1f245f2..449fe911 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::{RbxId, RbxValue}; + use crate::{ message_queue::MessageQueue, snapshot::{ @@ -16,9 +16,6 @@ use crate::{ snapshot_middleware::{snapshot_from_vfs, snapshot_project_node}, }; -/// Processes file change events, updates the DOM, and sends those updates -/// through a channel for other stuff to consume. -/// /// Owns the connection between Rojo's VFS and its DOM by holding onto another /// thread that processes messages. /// @@ -114,49 +111,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 +121,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,18 +176,10 @@ 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", + "Cannot remove instance {}, it's from a project file", id ); } @@ -219,12 +187,12 @@ impl JobThreadContext { } else { // TODO log::warn!( - "Cannot remove instance {:?}, it is not an instigating source.", + "Cannot remove instance {}, it is not an instigating source.", id ); } } else { - log::warn!("Cannot remove instance {:?}, it does not exist.", id); + log::warn!("Cannot remove instance {}, it does not exist.", id); } } @@ -251,28 +219,22 @@ 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 - ); - } + if let Some(RbxValue::String { value }) = changed_value { + 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", + "Cannot remove instance {}, it's from a project file", id ); } } } else { log::warn!( - "Cannot update instance {:?}, it is not an instigating source.", + "Cannot update instance {}, it is not an instigating source.", id ); } @@ -281,20 +243,18 @@ impl JobThreadContext { } } } else { - log::warn!("Cannot update instance {:?}, it does not exist.", id); + log::warn!("Cannot update instance {}, it does not exist.", id); } } 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]); } } -fn compute_and_apply_changes(tree: &mut RojoTree, vfs: &Vfs, id: Ref) -> Option { +fn compute_and_apply_changes(tree: &mut RojoTree, vfs: &Vfs, id: RbxId) -> Option { let metadata = tree .get_metadata(id) .expect("metadata missing for instance present in tree"); @@ -303,7 +263,7 @@ fn compute_and_apply_changes(tree: &mut RojoTree, vfs: &Vfs, id: Ref) -> Option< Some(path) => path, None => { log::error!( - "Instance {:?} did not have an instigating source, but was considered for an update.", + "Instance {} did not have an instigating source, but was considered for an update.", id ); log::error!("This is a bug. Please file an issue!"); @@ -320,15 +280,23 @@ 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) { - Ok(snapshot) => snapshot, + let snapshot = match snapshot_from_vfs(&metadata.context, &vfs, &path) { + Ok(Some(snapshot)) => snapshot, + Ok(None) => { + log::error!( + "Snapshot did not return an instance from path {}", + path.display() + ); + log::error!("This may be a bug!"); + return None; + } Err(err) => { log::error!("Snapshot error: {:?}", err); return None; } }; - let patch_set = compute_patch_set(snapshot, tree, id); + let patch_set = compute_patch_set(&snapshot, &tree, id); apply_patch_set(tree, patch_set) } Ok(None) => { @@ -349,34 +317,34 @@ 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()), ); let snapshot = match snapshot_result { - Ok(snapshot) => snapshot, + Ok(Some(snapshot)) => snapshot, + Ok(None) => { + log::error!("Snapshot did not return an instance from a project node."); + log::error!("This is a bug!"); + return None; + } Err(err) => { log::error!("{:?}", err); return None; } }; - let patch_set = compute_patch_set(snapshot, tree, id); + let patch_set = compute_patch_set(&snapshot, &tree, id); apply_patch_set(tree, patch_set) } }; diff --git a/src/cli/build.rs b/src/cli/build.rs index 82e81387..cab366ab 100644 --- a/src/cli/build.rs +++ b/src/cli/build.rs @@ -1,184 +1,85 @@ use std::{ + fs::File, io::{BufWriter, Write}, - mem::forget, - path::{Path, PathBuf}, }; -use anyhow::{bail, Context}; -use clap::{CommandFactory, Parser}; -use fs_err::File; use memofs::Vfs; -use roblox_install::RobloxStudio; +use thiserror::Error; use tokio::runtime::Runtime; -use crate::serve_session::ServeSession; +use crate::{cli::BuildCommand, serve_session::ServeSession, snapshot::RojoTree}; -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)] -pub struct BuildCommand { - /// Path to the project to build. Defaults to the current directory. - #[clap(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, - - /// Whether to automatically rebuild when any input files change. - #[clap(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)?; - - (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)?; - - log::trace!("Constructing in-memory filesystem"); - let vfs = Vfs::new_default()?; - vfs.set_watch_enabled(self.watch); - - let session = ServeSession::new(vfs, project_path)?; - let mut cursor = session.message_queue().cursor(); - - write_model(&session, &output_path, output_kind)?; - - if self.watch { - 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; - - write_model(&session, &output_path, output_kind)?; - } - } - - // Avoid dropping ServeSession: it's potentially VERY expensive to drop - // and we're about to exit anyways. - forget(session); - - Ok(()) - } -} - -/// The different kinds of output that Rojo can build to. #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum OutputKind { - /// An XML model file. Rbxmx, - - /// An XML place file. Rbxlx, - - /// A binary model file. Rbxm, - - /// A binary place file. Rbxl, } -impl OutputKind { - fn from_output_path(output: &Path) -> Option { - let extension = output.extension()?.to_str()?; +fn detect_output_kind(options: &BuildCommand) -> Option { + let extension = options.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> { +#[derive(Debug, Error)] +enum Error { + #[error("Could not detect what kind of file to build. Expected output file to end in .rbxl, .rbxlx, .rbxm, or .rbxmx.")] + UnknownOutputKind, +} + +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, - output_kind: OutputKind, -) -> anyhow::Result<()> { - println!("Building project '{}'", session.project_name()); +pub fn build(options: BuildCommand) -> Result<(), anyhow::Error> { + log::trace!("Constructing in-memory filesystem"); + + let vfs = Vfs::new_default(); + vfs.set_watch_enabled(options.watch); + + let session = ServeSession::new(vfs, &options.absolute_project())?; + let mut cursor = session.message_queue().cursor(); + + { + let tree = session.tree(); + write_model(&tree, &options)?; + } + + if options.watch { + let mut rt = Runtime::new().unwrap(); + + loop { + let receiver = session.message_queue().subscribe(cursor); + let (new_cursor, _patch_set) = rt.block_on(receiver).unwrap(); + cursor = new_cursor; + + let tree = session.tree(); + write_model(&tree, &options)?; + } + } + + Ok(()) +} + +fn write_model(tree: &RojoTree, options: &BuildCommand) -> Result<(), anyhow::Error> { + let output_kind = detect_output_kind(&options).ok_or(Error::UnknownOutputKind)?; + log::debug!("Hoping to generate file of type {:?}", output_kind); - let tree = session.tree(); let root_id = tree.get_root_id(); log::trace!("Opening output file for write"); - let mut file = BufWriter::new(File::create(output)?); + let file = File::create(&options.output)?; + let mut file = BufWriter::new(file); match output_kind { - OutputKind::Rbxm => { - rbx_binary::to_writer(&mut file, tree.inner(), &[root_id])?; - } - OutputKind::Rbxl => { - let root_instance = tree.get_instance(root_id).unwrap(); - let top_level_ids = root_instance.children(); - - rbx_binary::to_writer(&mut file, tree.inner(), top_level_ids)?; - } OutputKind::Rbxmx => { // Model files include the root instance of the tree and all its // descendants. @@ -187,22 +88,36 @@ fn write_model( } OutputKind::Rbxlx => { // Place files don't contain an entry for the DataModel, but our - // WeakDom representation does. + // RbxTree representation does. let root_instance = tree.get_instance(root_id).unwrap(); let top_level_ids = root_instance.children(); rbx_xml::to_writer(&mut file, tree.inner(), top_level_ids, xml_encode_config())?; } + OutputKind::Rbxm => { + rbx_binary::encode(tree.inner(), &[root_id], &mut file)?; + } + OutputKind::Rbxl => { + log::warn!("Support for building binary places (rbxl) is still experimental."); + log::warn!("Using the XML place format (rbxlx) is recommended instead."); + log::warn!("For more info, see https://github.com/rojo-rbx/rojo/issues/180"); + + let root_instance = tree.get_instance(root_id).unwrap(); + let top_level_ids = root_instance.children(); + + rbx_binary::encode(tree.inner(), top_level_ids, &mut file)?; + } } file.flush()?; - let filename = output + let filename = options + .output .file_name() .and_then(|name| name.to_str()) .unwrap_or(""); - println!("Built project to {}", filename); + log::info!("Built project to {}", filename); Ok(()) } diff --git a/src/cli/doc.rs b/src/cli/doc.rs index 61a8d416..3de2b052 100644 --- a/src/cli/doc.rs +++ b/src/cli/doc.rs @@ -1,12 +1,4 @@ -use clap::Parser; - -/// Open Rojo's documentation in your browser. -#[derive(Debug, Parser)] -pub struct DocCommand {} - -impl DocCommand { - pub fn run(self) -> anyhow::Result<()> { - opener::open("https://rojo.space/docs")?; - Ok(()) - } +pub fn doc() -> Result<(), anyhow::Error> { + opener::open("https://rojo.space/docs")?; + Ok(()) } diff --git a/src/cli/fmt_project.rs b/src/cli/fmt_project.rs deleted file mode 100644 index e1c7adaa..00000000 --- a/src/cli/fmt_project.rs +++ /dev/null @@ -1,36 +0,0 @@ -use std::path::PathBuf; - -use anyhow::Context; -use clap::Parser; -use memofs::Vfs; - -use crate::project::Project; - -use super::resolve_path; - -/// Reformat a Rojo project using the standard JSON formatting rules. -#[derive(Debug, Parser)] -pub struct FmtProjectCommand { - /// Path to the project to format. Defaults to the current directory. - #[clap(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)? - .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) - .context("could not write back to project file")?; - - Ok(()) - } -} diff --git a/src/cli/init.rs b/src/cli/init.rs index 434c2e34..b5ff49dc 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -1,176 +1,119 @@ -use std::process::{Command, Stdio}; -use std::str::FromStr; use std::{ - collections::VecDeque, - path::{Path, PathBuf}, -}; -use std::{ - ffi::OsStr, + fs::{self, OpenOptions}, io::{self, Write}, + path::Path, + process::{Command, Stdio}, }; -use anyhow::{bail, format_err, Context}; -use clap::Parser; -use fs_err as fs; -use fs_err::OpenOptions; -use memofs::{InMemoryFs, Vfs, VfsSnapshot}; +use thiserror::Error; -use super::resolve_path; +use crate::cli::{InitCommand, InitKind}; -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)] -pub struct InitCommand { - /// Path to the place to create the project. Defaults to the current directory. - #[clap(default_value = "")] - pub path: PathBuf, +#[derive(Debug, Error)] +enum Error { + #[error("A project file named default.project.json already exists in this folder")] + AlreadyExists, - /// The kind of project to create, 'place', 'plugin', or 'model'. - #[clap(long, default_value = "place")] - pub kind: InitKind, - - /// Skips the initialization of a git repository. - #[clap(long)] - pub skip_git: bool, + #[error("git init failed")] + GitInit, } -impl InitCommand { - pub fn run(self) -> anyhow::Result<()> { - let template = self.kind.template()?; +pub fn init(options: InitCommand) -> Result<(), anyhow::Error> { + let base_path = options.absolute_path(); + fs::create_dir_all(&base_path)?; - let base_path = resolve_path(&self.path)?; - fs::create_dir_all(&base_path)?; + let canonical = fs::canonicalize(&base_path)?; + let project_name = canonical + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or("new-project"); - let canonical = fs::canonicalize(&base_path)?; - let project_name = canonical - .file_name() - .and_then(|name| name.to_str()) - .unwrap_or("new-project"); + let project_params = ProjectParams { + name: project_name.to_owned(), + }; - let project_params = ProjectParams { - 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()); - } - } - - println!("Created project successfully."); - - Ok(()) + match options.kind { + InitKind::Place => init_place(&base_path, project_params), + InitKind::Model => init_model(&base_path, project_params), } } -/// The templates we support for initializing a Rojo project. -#[derive(Debug, Clone, Copy)] -pub enum InitKind { - /// A place that contains a baseplate. - Place, +fn init_place(base_path: &Path, project_params: ProjectParams) -> Result<(), anyhow::Error> { + eprintln!("Creating new place project '{}'", project_params.name); - /// An empty model, suitable for a library. - Model, + let project_file = project_params.render_template(PLACE_PROJECT); + try_create_project(base_path, &project_file)?; - /// An empty plugin. - Plugin, + 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)?; + + eprintln!("Created project successfully."); + + Ok(()) } -impl InitKind { - fn template(&self) -> anyhow::Result { - let template_path = match self { - Self::Place => "place", - Self::Model => "model", - Self::Plugin => "plugin", - }; +fn init_model(base_path: &Path, project_params: ProjectParams) -> Result<(), anyhow::Error> { + eprintln!("Creating new model project '{}'", project_params.name); - 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 project_file = project_params.render_template(MODEL_PROJECT); + try_create_project(base_path, &project_file)?; - 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 readme = project_params.render_template(MODEL_README); + write_if_not_exists(&base_path.join("README.md"), &readme)?; - 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 src = base_path.join("src"); + fs::create_dir_all(&src)?; - let mut fs = InMemoryFs::new(); - fs.load_snapshot("", template) - .context("Failed to load Rojo's bundled template into memory")?; + let init = project_params.render_template(MODEL_INIT); + write_if_not_exists(&src.join("init.lua"), &init)?; - Ok(fs) - } -} + let git_ignore = project_params.render_template(MODEL_GIT_IGNORE); + try_git_init(base_path, &git_ignore)?; -impl FromStr for InitKind { - type Err = anyhow::Error; + eprintln!("Created project successfully."); - fn from_str(source: &str) -> Result { - 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", - source - )), - } - } + Ok(()) } /// Contains parameters used in templates to create a project. @@ -187,13 +130,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() { + return Err(Error::GitInit.into()); + } + } + + 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 +187,27 @@ 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 => Err(Error::AlreadyExists.into()), + _ => Err(err.into()), + } + } + }; + + file.write_all(contents.as_bytes())?; + + Ok(()) +} diff --git a/src/cli/mod.rs b/src/cli/mod.rs index caef95aa..5bd69a1d 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -1,67 +1,51 @@ -//! Defines Rojo's CLI through clap types. +//! Defines Rojo's CLI through structopt types. mod build; mod doc; -mod fmt_project; mod init; mod plugin; mod serve; -mod sourcemap; -mod syncback; mod upload; -use std::{borrow::Cow, env, path::Path, str::FromStr}; +use std::{ + borrow::Cow, + env, + error::Error, + fmt, + path::{Path, PathBuf}, + str::FromStr, +}; -use anyhow::Context; -use clap::Parser; +use structopt::StructOpt; use thiserror::Error; -pub use self::build::BuildCommand; -pub use self::doc::DocCommand; -pub use self::fmt_project::FmtProjectCommand; -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; +pub use self::build::*; +pub use self::doc::*; +pub use self::init::*; +pub use self::plugin::*; +pub use self::serve::*; +pub use self::upload::*; -/// 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, } -impl Options { - pub fn run(self) -> anyhow::Result<()> { - match self.subcommand { - Subcommand::Init(subcommand) => subcommand.run(), - Subcommand::Serve(subcommand) => subcommand.run(self.global), - Subcommand::Build(subcommand) => subcommand.run(), - Subcommand::Upload(subcommand) => subcommand.run(), - Subcommand::Sourcemap(subcommand) => subcommand.run(), - 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,27 +97,216 @@ pub struct ColorChoiceParseError { attempted: String, } -#[derive(Debug, Parser)] +#[derive(Debug, StructOpt)] pub enum Subcommand { + /// Creates a new Rojo project. Init(InitCommand), + + /// Serves the project's files for use with the Rojo Studio plugin. Serve(ServeCommand), + + /// Generates a model or place file from the project. Build(BuildCommand), + + /// Generates a place or model file out of the project and uploads it to Roblox. Upload(UploadCommand), - Sourcemap(SourcemapCommand), - FmtProject(FmtProjectCommand), - Doc(DocCommand), + + /// Open Rojo's documentation in your browser. + Doc, + + /// Manages Rojo's Roblox Studio plugin. Plugin(PluginCommand), - Syncback(SyncbackCommand), } -pub(super) fn resolve_path(path: &Path) -> anyhow::Result> { - if path.is_absolute() { - Ok(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))) +/// Initializes a new Rojo project. +#[derive(Debug, StructOpt)] +pub struct InitCommand { + /// Path to the place to create the project. Defaults to the current directory. + #[structopt(default_value = "")] + pub path: PathBuf, + + /// The kind of project to create, 'place' or 'model'. Defaults to place. + #[structopt(long, default_value = "place")] + pub kind: InitKind, +} + +impl InitCommand { + pub fn absolute_path(&self) -> Cow<'_, Path> { + resolve_path(&self.path) } } + +/// The templates we support for initializing a Rojo project. +#[derive(Debug, Clone, Copy)] +pub enum InitKind { + /// A place that matches what File -> New does in Roblox Studio. + Place, + + /// An empty model, suitable for a library or plugin. + Model, +} + +impl FromStr for InitKind { + type Err = InitKindParseError; + + fn from_str(source: &str) -> Result { + match source { + "place" => Ok(InitKind::Place), + "model" => Ok(InitKind::Model), + _ => Err(InitKindParseError { + attempted: source.to_owned(), + }), + } + } +} + +/// Error type for failing to parse an `InitKind`. +#[derive(Debug)] +pub struct InitKindParseError { + attempted: String, +} + +impl Error for InitKindParseError {} + +impl fmt::Display for InitKindParseError { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!( + formatter, + "Invalid init kind '{}'. Valid kinds are: place, model", + self.attempted + ) + } +} + +/// Expose a Rojo project through a web server that can communicate with the +/// Rojo Roblox Studio plugin, or be visited by the user in the browser. +#[derive(Debug, StructOpt)] +pub struct ServeCommand { + /// Path to the project to serve. Defaults to the current directory. + #[structopt(default_value = "")] + pub project: PathBuf, + + /// The port to listen on. Defaults to the project's preference, or 34872 if + /// it has none. + #[structopt(long)] + pub port: Option, +} + +impl ServeCommand { + pub fn absolute_project(&self) -> Cow<'_, Path> { + resolve_path(&self.project) + } +} + +/// Build a Rojo project into a file. +#[derive(Debug, StructOpt)] +pub struct BuildCommand { + /// Path to the project to serve. Defaults to the current directory. + #[structopt(default_value = "")] + pub project: PathBuf, + + /// Where to output the result. + #[structopt(long, short)] + pub output: PathBuf, + + /// Whether to automatically rebuild when any input files change. + #[structopt(long)] + pub watch: bool, +} + +impl BuildCommand { + pub fn absolute_project(&self) -> Cow<'_, Path> { + resolve_path(&self.project) + } +} + +/// Build and upload a Rojo project to Roblox.com. +#[derive(Debug, StructOpt)] +pub struct UploadCommand { + /// Path to the project to upload. Defaults to the current directory. + #[structopt(default_value = "")] + pub project: PathBuf, + + /// Authenication cookie to use. If not specified, Rojo will attempt to find one from the system automatically. + #[structopt(long)] + pub cookie: Option, + + /// Asset ID to upload to. + #[structopt(long = "asset_id")] + pub asset_id: u64, +} + +impl UploadCommand { + pub fn absolute_project(&self) -> Cow<'_, Path> { + resolve_path(&self.project) + } +} + +/// 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)] +pub 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 = UploadKindParseError; + + fn from_str(source: &str) -> Result { + match source { + "place" => Ok(UploadKind::Place), + "model" => Ok(UploadKind::Model), + _ => Err(UploadKindParseError { + attempted: source.to_owned(), + }), + } + } +} + +/// Error type for failing to parse an `UploadKind`. +#[derive(Debug)] +pub struct UploadKindParseError { + attempted: String, +} + +impl Error for UploadKindParseError {} + +impl fmt::Display for UploadKindParseError { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!( + formatter, + "Invalid upload kind '{}'. Valid kinds are: place, model", + self.attempted + ) + } +} + +fn resolve_path(path: &Path) -> Cow<'_, Path> { + if path.is_absolute() { + Cow::Borrowed(path) + } else { + Cow::Owned(env::current_dir().unwrap().join(path)) + } +} + +#[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 + /// file. + Install, + + /// Removes the plugin if it is installed. + Uninstall, +} + +/// Install Rojo's plugin. +#[derive(Debug, StructOpt)] +pub struct PluginCommand { + #[structopt(subcommand)] + subcommand: PluginSubcommand, +} diff --git a/src/cli/plugin.rs b/src/cli/plugin.rs index af7025ca..d3c31c7c 100644 --- a/src/cli/plugin.rs +++ b/src/cli/plugin.rs @@ -3,61 +3,29 @@ use std::{ io::BufWriter, }; -use clap::Parser; +use anyhow::Result; use memofs::{InMemoryFs, Vfs, VfsSnapshot}; use roblox_install::RobloxStudio; -use crate::serve_session::ServeSession; +use crate::{ + cli::{PluginCommand, PluginSubcommand}, + serve_session::ServeSession, +}; static PLUGIN_BINCODE: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/plugin.bincode")); static PLUGIN_FILE_NAME: &str = "RojoManagedPlugin.rbxm"; -/// Install Rojo's plugin. -#[derive(Debug, Parser)] -pub struct PluginCommand { - #[clap(subcommand)] - subcommand: PluginSubcommand, -} - -/// Manages Rojo's Roblox Studio plugin. -#[derive(Debug, Parser)] -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 - /// file. - Install, - - /// Removes the plugin if it is installed. - Uninstall, -} - -impl PluginCommand { - pub fn run(self) -> anyhow::Result<()> { - self.subcommand.run() +pub fn plugin(options: PluginCommand) -> Result<()> { + match options.subcommand { + PluginSubcommand::Install => install_plugin(), + PluginSubcommand::Uninstall => uninstall_plugin(), } } -impl PluginSubcommand { - pub fn run(self) -> anyhow::Result<()> { - match self { - PluginSubcommand::Install => install_plugin(), - PluginSubcommand::Uninstall => uninstall_plugin(), - } - } -} - -fn initialize_plugin() -> anyhow::Result { +pub fn install_plugin() -> 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,21 +35,26 @@ 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(); - rbx_binary::to_writer(&mut file, tree.inner(), &[root_id])?; + rbx_binary::encode(tree.inner(), &[root_id], &mut file)?; Ok(()) } -fn uninstall_plugin() -> anyhow::Result<()> { +fn uninstall_plugin() -> Result<()> { let studio = RobloxStudio::locate()?; let plugin_path = studio.plugins_path().join(PLUGIN_FILE_NAME); @@ -95,8 +68,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..07ae85b3 100644 --- a/src/cli/serve.rs +++ b/src/cli/serve.rs @@ -1,132 +1,60 @@ use std::{ io::{self, Write}, - net::{IpAddr, Ipv4Addr}, - path::PathBuf, sync::Arc, }; -use clap::Parser; +use anyhow::Result; use memofs::Vfs; use termcolor::{BufferWriter, Color, ColorChoice, ColorSpec, WriteColor}; -use crate::{serve_session::ServeSession, web::LiveServer}; +use crate::{ + cli::{GlobalOptions, ServeCommand}, + serve_session::ServeSession, + web::LiveServer, +}; -use super::{resolve_path, GlobalOptions}; - -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)] -pub struct ServeCommand { - /// Path to the project to serve. Defaults to the current directory. - #[clap(default_value = "")] - pub project: PathBuf, +pub fn serve(global: GlobalOptions, options: ServeCommand) -> Result<()> { + let vfs = Vfs::new_default(); - /// The IP address to listen on. Defaults to `127.0.0.1`. - #[clap(long)] - pub address: Option, + let session = Arc::new(ServeSession::new(vfs, &options.absolute_project())?); - /// The port to listen on. Defaults to the project's preference, or `34872` if - /// it has none. - #[clap(long)] - pub port: Option, + let port = options + .port + .or_else(|| session.project_port()) + .unwrap_or(DEFAULT_PORT); - /// 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, + let server = LiveServer::new(session); + + let _ = show_start_message(port, global.color.into()); + server.start(port); + + Ok(()) } -impl ServeCommand { - pub fn run(self, global: GlobalOptions) -> anyhow::Result<()> { - let project_path = resolve_path(&self.project)?; - - let vfs = Vfs::new_default()?; - - let session = Arc::new(ServeSession::new(vfs, project_path)?); - - let ip = self - .address - .or_else(|| session.serve_address()) - .unwrap_or(DEFAULT_BIND_ADDRESS.into()); - - let port = self - .port - .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()); - })?; - - Ok(()) - } -} - -fn show_start_message(bind_address: IpAddr, port: u16, color: ColorChoice) -> io::Result<()> { - let mut green = ColorSpec::new(); - green.set_fg(Some(Color::Green)).set_bold(true); - +fn show_start_message(port: u16, color: ColorChoice) -> io::Result<()> { 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)?; + buffer.set_color(ColorSpec::new().set_fg(Some(Color::Green)).set_bold(true))?; + writeln!(&mut buffer, "localhost")?; buffer.set_color(&ColorSpec::new())?; write!(&mut buffer, " Port: ")?; - buffer.set_color(&green)?; + buffer.set_color(ColorSpec::new().set_fg(Some(Color::Green)).set_bold(true))?; writeln!(&mut buffer, "{}", port)?; 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)?; + buffer.set_color(ColorSpec::new().set_fg(Some(Color::Green)).set_bold(true))?; + 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 deleted file mode 100644 index 2e4a7ce9..00000000 --- a/src/cli/sourcemap.rs +++ /dev/null @@ -1,340 +0,0 @@ -use std::{ - borrow::Cow, - io::{BufWriter, Write}, - mem::forget, - path::{self, 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 crate::{ - serve_session::ServeSession, - snapshot::{AppliedPatchSet, 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)] -#[serde(rename_all = "camelCase")] -struct SourcemapNode<'a> { - name: &'a str, - class_name: Ustr, - - #[serde( - default, - skip_serializing_if = "Vec::is_empty", - serialize_with = "crate::path_serializer::serialize_vec_absolute" - )] - file_paths: Vec>, - - #[serde(default, skip_serializing_if = "Vec::is_empty")] - children: Vec>, -} - -/// Generates a sourcemap file from the Rojo project. -#[derive(Debug, Parser)] -pub struct SourcemapCommand { - /// Path to the project to use for the sourcemap. Defaults to the current - /// directory. - #[clap(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)] - pub output: Option, - - /// If non-script files should be included or not. Defaults to false. - #[clap(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)?)?; - - log::trace!("Constructing filesystem with StdBackend"); - let vfs = Vfs::new_default()?; - vfs.set_watch_enabled(self.watch); - - log::trace!("Setting up session for sourcemap generation"); - let session = ServeSession::new(vfs, project_path)?; - let mut cursor = session.message_queue().cursor(); - - let filter = if self.include_non_scripts { - filter_nothing - } else { - 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(); - - log::trace!("Writing initial sourcemap"); - write_sourcemap(&session, self.output.as_deref(), filter, self.absolute)?; - - 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)?; - } - } - } - - // Avoid dropping ServeSession: it's potentially VERY expensive to drop - // and we're about to exit anyways. - forget(session); - - Ok(()) - } -} - -fn filter_nothing(_instance: &InstanceWithMeta) -> bool { - true -} - -fn filter_non_scripts(instance: &InstanceWithMeta) -> bool { - matches!( - instance.class_name().as_str(), - "Script" | "LocalScript" | "ModuleScript" - ) -} - -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, - referent: Ref, - project_dir: &Path, - filter: fn(&InstanceWithMeta) -> bool, - use_absolute_paths: bool, -) -> 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(); - - // If this object has no children and doesn't pass the filter, it doesn't - // contain any information we're looking for. - if children.is_empty() && !filter(&instance) { - return None; - } - - let file_paths = instance - .metadata() - .relevant_paths - .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), - )); - } - }; - - Some(SourcemapNode { - name: instance.name(), - class_name: instance.class_name(), - file_paths: output_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..e6969c22 100644 --- a/src/cli/upload.rs +++ b/src/cli/upload.rs @@ -1,93 +1,50 @@ -use std::path::PathBuf; - -use anyhow::{bail, Context}; -use clap::Parser; use memofs::Vfs; use reqwest::{ header::{ACCEPT, CONTENT_TYPE, COOKIE, USER_AGENT}, StatusCode, }; +use thiserror::Error; -use crate::{auth_cookie::get_auth_cookie, serve_session::ServeSession}; +use crate::{auth_cookie::get_auth_cookie, cli::UploadCommand, serve_session::ServeSession}; -use super::resolve_path; +#[derive(Debug, Error)] +enum Error { + #[error("Rojo could not find your Roblox auth cookie. Please pass one via --cookie.")] + NeedAuthCookie, -/// Builds the project and uploads it to Roblox. -#[derive(Debug, Parser)] -pub struct UploadCommand { - /// Path to the project to upload. Defaults to the current directory. - #[clap(default_value = "")] - pub project: PathBuf, - - /// Authenication cookie to use. If not specified, Rojo will attempt to find one from the system automatically. - #[clap(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")] - pub api_key: Option, - - /// The Universe ID of the given place. Required when using the Open Cloud API. - #[clap(long = "universe_id")] - pub universe_id: Option, - - /// Asset ID to upload to. - #[clap(long = "asset_id")] - pub asset_id: u64, + #[error("The Roblox API returned an unexpected error: {body}")] + RobloxApi { body: String }, } -impl UploadCommand { - pub fn run(self) -> Result<(), anyhow::Error> { - let project_path = resolve_path(&self.project)?; +pub fn upload(options: UploadCommand) -> Result<(), anyhow::Error> { + let cookie = options + .cookie + .clone() + .or_else(get_auth_cookie) + .ok_or(Error::NeedAuthCookie)?; - let vfs = Vfs::new_default()?; + let vfs = Vfs::new_default(); - let session = ServeSession::new(vfs, project_path)?; + let session = ServeSession::new(vfs, &options.absolute_project())?; - let tree = session.tree(); - let inner_tree = tree.inner(); - let root = inner_tree.root(); + let tree = session.tree(); + let inner_tree = tree.inner(); + let root_id = inner_tree.get_root_id(); + let root_instance = inner_tree.get_instance(root_id).unwrap(); - let encode_ids = match root.class.as_str() { - "DataModel" => root.children().to_vec(), - _ => vec![root.referent()], - }; + let encode_ids = match root_instance.class_name.as_str() { + "DataModel" => root_instance.get_children_ids().to_vec(), + _ => vec![root_id], + }; - let mut buffer = Vec::new(); + let mut buffer = Vec::new(); - log::trace!("Encoding binary model"); - rbx_binary::to_writer(&mut buffer, tree.inner(), &encode_ids)?; + log::trace!("Encoding XML model"); + let config = rbx_xml::EncodeOptions::new() + .property_behavior(rbx_xml::EncodePropertyBehavior::WriteUnknown); - match (self.cookie, self.api_key, self.universe_id) { - (cookie, None, universe) => { - // using legacy. notify if universe is provided. - if universe.is_some() { - log::warn!( - "--universe_id was provided but is ignored when using legacy upload" - ); - } - - let cookie = cookie.or_else(get_auth_cookie).context( - "Rojo could not find your Roblox auth cookie. Please pass one via --cookie.", - )?; - do_upload(buffer, self.asset_id, &cookie) - } - - (cookie, Some(api_key), Some(universe_id)) => { - // using open cloud. notify if cookie is provided. - if cookie.is_some() { - log::warn!("--cookie was provided but is ignored when using Open Cloud API"); - } - - do_upload_open_cloud(buffer, universe_id, self.asset_id, &api_key) - } - - (_, Some(_), None) => { - // API key is provided, universe id is not. - bail!("--universe_id must be provided to use the Open Cloud API"); - } - } - } + rbx_xml::to_writer(&mut buffer, tree.inner(), &encode_ids, config)?; + do_upload(buffer, options.asset_id, &cookie) } fn do_upload(buffer: Vec, asset_id: u64, cookie: &str) -> anyhow::Result<()> { @@ -96,7 +53,7 @@ fn do_upload(buffer: Vec, asset_id: u64, cookie: &str) -> anyhow::Result<()> asset_id ); - let client = reqwest::blocking::Client::new(); + let client = reqwest::Client::new(); let build_request = move || { client @@ -123,45 +80,10 @@ fn do_upload(buffer: Vec, asset_id: u64, cookie: &str) -> anyhow::Result<()> let status = response.status(); if !status.is_success() { - bail!( - "The Roblox API returned an unexpected error: {}", - response.text()? - ); - } - - Ok(()) -} - -/// Implementation of do_upload that supports the new open cloud api. -/// see https://developer.roblox.com/en-us/articles/open-cloud -fn do_upload_open_cloud( - buffer: Vec, - universe_id: u64, - asset_id: u64, - api_key: &str, -) -> anyhow::Result<()> { - let url = format!( - "https://apis.roblox.com/universes/v1/{}/places/{}/versions?versionType=Published", - universe_id, asset_id - ); - - let client = reqwest::blocking::Client::new(); - - log::debug!("Uploading to Roblox..."); - let response = client - .post(url) - .header("x-api-key", api_key) - .header(CONTENT_TYPE, "application/xml") - .header(ACCEPT, "application/json") - .body(buffer) - .send()?; - - let status = response.status(); - if !status.is_success() { - bail!( - "The Roblox API returned an unexpected error: {}", - response.text()? - ); + return Err(Error::RobloxApi { + body: response.text()?, + } + .into()); } Ok(()) 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..361c92e4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,31 +10,17 @@ 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..b29370b4 100644 --- a/src/lua_ast.rs +++ b/src/lua_ast.rs @@ -1,5 +1,4 @@ -//! Defines module for defining a small Lua AST for simple codegen. Rojo uses -//! this module to convert JSON into generated Lua code. +//! Defines module for defining a small Lua AST for simple codegen. use std::{ fmt::{self, Write}, @@ -22,7 +21,6 @@ trait FmtLua { } } -#[allow(dead_code)] struct DisplayLua(T); impl fmt::Display for DisplayLua @@ -220,30 +218,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/message_queue.rs b/src/message_queue.rs index 56482ea1..8542c671 100644 --- a/src/message_queue.rs +++ b/src/message_queue.rs @@ -1,6 +1,26 @@ use std::sync::{Mutex, RwLock}; -use futures::channel::oneshot; +use futures::sync::oneshot; + +struct Listener { + sender: oneshot::Sender<(u32, Vec)>, + cursor: u32, +} + +fn fire_listener_if_ready( + messages: &[T], + listener: Listener, +) -> Result<(), Listener> { + let current_cursor = messages.len() as u32; + + if listener.cursor < current_cursor { + let new_messages = messages[(listener.cursor as usize)..].to_vec(); + let _ = listener.sender.send((current_cursor, new_messages)); + Ok(()) + } else { + Err(listener) + } +} /// A message queue with persistent history that can be subscribed to. /// @@ -64,7 +84,6 @@ impl MessageQueue { /// This method is only useful in tests. Non-test code should use subscribe /// instead. #[cfg(test)] - #[allow(unused)] pub fn subscribe_any(&self) -> oneshot::Receiver<(u32, Vec)> { let cursor = { let messages = self.messages.read().unwrap(); @@ -78,23 +97,3 @@ impl MessageQueue { self.messages.read().unwrap().len() as u32 } } - -struct Listener { - sender: oneshot::Sender<(u32, Vec)>, - cursor: u32, -} - -fn fire_listener_if_ready( - messages: &[T], - listener: Listener, -) -> Result<(), Listener> { - let current_cursor = messages.len() as u32; - - if listener.cursor < current_cursor { - let new_messages = messages[(listener.cursor as usize)..].to_vec(); - let _ = listener.sender.send((current_cursor, new_messages)); - Ok(()) - } else { - Err(listener) - } -} 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..18a61707 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, @@ -44,3 +36,17 @@ where seq.end() } + +pub fn serialize_option_absolute( + maybe_path: &Option, + serializer: S, +) -> Result +where + S: Serializer, + T: AsRef, +{ + match maybe_path { + Some(path) => serialize_absolute(path, serializer), + None => serializer.serialize_none(), + } +} diff --git a/src/project.rs b/src/project.rs index 093529b1..16c3a7cf 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 rbx_dom_weak::UnresolvedRbxValue; use serde::{Deserialize, Serialize}; use thiserror::Error; -use crate::{ - glob::IgnorableGlob, json, resolution::UnresolvedValue, snapshot::SyncRule, - syncback::SyncbackRules, -}; +use crate::glob::Glob; -/// 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,58 +58,10 @@ 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")] - pub place_id: Option, - - /// If specified, sets the current place's game ID when connecting to the - /// Rojo server from Roblox Studio. - #[serde(skip_serializing_if = "Option::is_none")] - pub game_id: Option, - - /// If specified, this address will be used in place of the default address - /// As long as --address is unprovided. - #[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 +75,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 +93,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 @@ -327,44 +159,6 @@ impl Project { } } -#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] -pub struct OptionalPathNode { - #[serde(serialize_with = "crate::path_serializer::serialize_absolute")] - pub optional: PathBuf, -} - -impl OptionalPathNode { - pub fn new(optional: PathBuf) -> Self { - OptionalPathNode { optional } - } -} - -/// Describes a path that is either optional or required -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(untagged)] -pub enum PathNode { - Required(#[serde(serialize_with = "crate::path_serializer::serialize_absolute")] PathBuf), - Optional(OptionalPathNode), -} - -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, - } - } - - /// 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. #[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)] pub struct ProjectNode { @@ -375,12 +169,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 +181,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 @@ -427,8 +209,12 @@ pub struct ProjectNode { /// path can point to any file type supported by Rojo, including Lua files /// (`.lua`), Roblox models (`.rbxm`, `.rbxmx`), and localization table /// spreadsheets (`.csv`). - #[serde(rename = "$path", skip_serializing_if = "Option::is_none")] - pub path: Option, + #[serde( + rename = "$path", + serialize_with = "crate::path_serializer::serialize_option_absolute", + skip_serializing_if = "Option::is_none" + )] + pub path: Option, } impl ProjectNode { @@ -448,245 +234,3 @@ impl ProjectNode { } } } - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn path_node_required() { - let path_node: PathNode = 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(); - assert_eq!( - path_node, - PathNode::Optional(OptionalPathNode::new(PathBuf::from("src"))) - ); - } - - #[test] - fn project_node_required() { - let project_node: ProjectNode = json::from_str( - r#"{ - "$path": "src" - }"#, - ) - .unwrap(); - - assert_eq!( - project_node.path, - Some(PathNode::Required(PathBuf::from("src"))) - ); - } - - #[test] - fn project_node_optional() { - let project_node: ProjectNode = json::from_str( - r#"{ - "$path": { "optional": "src" } - }"#, - ) - .unwrap(); - - assert_eq!( - project_node.path, - Some(PathNode::Optional(OptionalPathNode::new(PathBuf::from( - "src" - )))) - ); - } - - #[test] - fn project_node_none() { - let project_node: ProjectNode = json::from_str( - r#"{ - "$className": "Folder" - }"#, - ) - .unwrap(); - - assert_eq!(project_node.path, None); - } - - #[test] - fn project_node_optional_serialize_absolute() { - let project_node: ProjectNode = json::from_str( - r#"{ - "$path": { "optional": "..\\src" } - }"#, - ) - .unwrap(); - - let serialized = serde_json::to_string(&project_node).unwrap(); - assert_eq!(serialized, r#"{"$path":{"optional":"../src"}}"#); - } - - #[test] - fn project_node_optional_serialize_absolute_no_change() { - let project_node: ProjectNode = json::from_str( - r#"{ - "$path": { "optional": "../src" } - }"#, - ) - .unwrap(); - - let serialized = serde_json::to_string(&project_node).unwrap(); - assert_eq!(serialized, r#"{"$path":{"optional":"../src"}}"#); - } - - #[test] - fn project_node_optional_serialize_optional() { - let project_node: ProjectNode = json::from_str( - r#"{ - "$path": "..\\src" - }"#, - ) - .unwrap(); - - 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 deleted file mode 100644 index 47fbac7e..00000000 --- a/src/resolution.rs +++ /dev/null @@ -1,495 +0,0 @@ -use std::borrow::Borrow; - -use anyhow::{bail, format_err}; -use rbx_dom_weak::types::{ - Attributes, CFrame, Color3, Content, ContentId, ContentType, Enum, Font, MaterialColors, - 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. -/// -/// This type is used in Rojo projects and JSON models to make specifying the -/// most common types of properties, like strings or vectors, much easier. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(untagged)] -pub enum UnresolvedValue { - FullyQualified(Variant), - Ambiguous(AmbiguousValue), -} - -impl UnresolvedValue { - pub fn resolve(self, class_name: &str, prop_name: &str) -> anyhow::Result { - match self { - UnresolvedValue::FullyQualified(full) => Ok(full), - 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)] -#[serde(untagged)] -pub enum AmbiguousValue { - Bool(bool), - String(String), - StringArray(Vec), - Number(f64), - Array2([f64; 2]), - Array3([f64; 3]), - Array4([f64; 4]), - Array12([f64; 12]), - Attributes(Attributes), - Font(Font), - MaterialColors(MaterialColors), -} - -impl AmbiguousValue { - pub fn resolve(self, class_name: &str, prop_name: &str) -> anyhow::Result { - let property = find_descriptor(class_name, prop_name) - .ok_or_else(|| format_err!("Unknown property {}.{}", class_name, prop_name))?; - - match &property.data_type { - DataType::Enum(enum_name) => { - let database = rbx_reflection_database::get().unwrap(); - - let enum_descriptor = database.enums.get(enum_name).ok_or_else(|| { - format_err!("Unknown enum {}. This is a Rojo bug!", enum_name) - })?; - - let error = |what: &str| { - let mut all_values = enum_descriptor - .items - .keys() - .map(|value| value.borrow()) - .collect::>(); - all_values.sort(); - - let examples = nonexhaustive_list(&all_values); - - format_err!( - "Invalid value for property {}.{}. Got {} but \ - expected a member of the {} enum such as {}", - class_name, - prop_name, - what, - enum_name, - examples, - ) - }; - - let value = match self { - AmbiguousValue::String(value) => value, - unresolved => return Err(error(unresolved.describe())), - }; - - let resolved = enum_descriptor - .items - .get(value.as_str()) - .ok_or_else(|| error(value.as_str()))?; - - Ok(Enum::from_u32(*resolved).into()) - } - DataType::Value(variant_ty) => match (variant_ty, self) { - (VariantType::Bool, AmbiguousValue::Bool(value)) => Ok(value.into()), - - (VariantType::Float32, AmbiguousValue::Number(value)) => Ok((value as f32).into()), - (VariantType::Float64, AmbiguousValue::Number(value)) => Ok(value.into()), - (VariantType::Int32, AmbiguousValue::Number(value)) => Ok((value as i32).into()), - (VariantType::Int64, AmbiguousValue::Number(value)) => Ok((value as i64).into()), - - (VariantType::String, AmbiguousValue::String(value)) => Ok(value.into()), - (VariantType::Tags, AmbiguousValue::StringArray(value)) => { - Ok(Tags::from(value).into()) - } - (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()) - } - - (VariantType::Vector3, AmbiguousValue::Array3(value)) => { - Ok(Vector3::new(value[0] as f32, value[1] as f32, value[2] as f32).into()) - } - - (VariantType::Color3, AmbiguousValue::Array3(value)) => { - Ok(Color3::new(value[0] as f32, value[1] as f32, value[2] as f32).into()) - } - - (VariantType::CFrame, AmbiguousValue::Array12(value)) => { - let value = value.map(|v| v as f32); - let pos = Vector3::new(value[0], value[1], value[2]); - let orientation = Matrix3::new( - Vector3::new(value[3], value[4], value[5]), - Vector3::new(value[6], value[7], value[8]), - Vector3::new(value[9], value[10], value[11]), - ); - - 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, - prop_name, - variant_ty, - unresolved.describe(), - )), - }, - _ => Err(format_err!( - "Unknown data type for property {}.{}", - class_name, - prop_name - )), - } - } - - 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", - AmbiguousValue::String(_) => "a string", - AmbiguousValue::StringArray(_) => "an array of strings", - AmbiguousValue::Number(_) => "a number", - AmbiguousValue::Array2(_) => "an array of two numbers", - 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", - } - } -} - -fn find_descriptor( - class_name: &str, - prop_name: &str, -) -> Option<&'static PropertyDescriptor<'static>> { - let database = rbx_reflection_database::get().unwrap(); - let mut current_class_name = class_name; - - loop { - let class = database.classes.get(current_class_name)?; - if let Some(descriptor) = class.properties.get(prop_name) { - return Some(descriptor); - } - - current_class_name = class.superclass?; - } -} - -/// Outputs a string containing up to MAX_ITEMS entries from the given list. If -/// there are more than MAX_ITEMS items, the number of remaining items will be -/// listed. -fn nonexhaustive_list(values: &[&str]) -> String { - use std::fmt::Write; - - const MAX_ITEMS: usize = 8; - - let mut output = String::new(); - - let last_index = values.len() - 1; - let main_length = last_index.min(9); - - let main_list = &values[..main_length]; - for value in main_list { - output.push_str(value); - output.push_str(", "); - } - - if values.len() > MAX_ITEMS { - write!(output, "or {} more", values.len() - main_length).unwrap(); - } else { - output.push_str("or "); - output.push_str(values[values.len() - 1]); - } - - output -} - -#[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(); - 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] - fn strings() { - // String literals can stay as strings - assert_eq!( - resolve("StringValue", "Value", "\"Hello!\""), - Variant::String("Hello!".into()), - ); - - // String literals can also turn into ContentId - 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()) - ); - - // What about BinaryString values? For forward-compatibility reasons, we - // don't support any shorthands for BinaryString. - // - // assert_eq!( - // 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] - fn numbers() { - assert_eq!( - resolve("Part", "CollisionGroupId", "123"), - Variant::Int32(123), - ); - - assert_eq!( - resolve("IntValue", "Value", "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] - fn vectors() { - assert_eq!( - resolve("ParticleEmitter", "SpreadAngle", "[1, 2]"), - Variant::Vector2(Vector2::new(1.0, 2.0)), - ); - - assert_eq!( - resolve("Part", "Position", "[4, 5, 6]"), - Variant::Vector3(Vector3::new(4.0, 5.0, 6.0)), - ); - } - - #[test] - fn colors() { - assert_eq!( - resolve("Part", "Color", "[1, 1, 1]"), - Variant::Color3(Color3::new(1.0, 1.0, 1.0)), - ); - - // There aren't any user-facing Color3uint8 properties. If there are - // some, we should treat them the same in the future. - } - - #[test] - fn enums() { - assert_eq!( - resolve("Lighting", "Technology", "\"Voxel\""), - 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..ee6020a6 100644 --- a/src/serve_session.rs +++ b/src/serve_session.rs @@ -1,14 +1,16 @@ 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 rbx_dom_weak::RbxInstanceProperties; use thiserror::Error; use crate::{ @@ -17,15 +19,13 @@ use crate::{ project::{Project, ProjectError}, session_id::SessionId, snapshot::{ - apply_patch_set, compute_patch_set, AppliedPatchSet, InstanceContext, InstanceSnapshot, - PatchSet, RojoTree, + apply_patch_set, compute_patch_set, AppliedPatchSet, InstanceContext, + InstancePropertiesWithMeta, PatchSet, RojoTree, }, snapshot_middleware::snapshot_from_vfs, }; -/// Contains all of the state for a Rojo serve session. A serve session is used -/// when we need to build a Rojo tree and possibly rebuild it when input files -/// change. +/// Contains all of the state for a Rojo serve session. /// /// Nothing here is specific to any Rojo interface. Though the primary way to /// interact with a serve session is Rojo's HTTP right now, there's no reason @@ -95,26 +95,48 @@ 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")); + } - let mut tree = RojoTree::new(InstanceSnapshot::new()); + 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(InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "ROOT".to_owned(), + class_name: "Folder".to_owned(), + properties: Default::default(), + }, + metadata: Default::default(), + }); 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)? + .expect("snapshot did not return an instance"); log::trace!("Computing initial patch set"); - let patch_set = compute_patch_set(snapshot, &tree, root_id); + let patch_set = compute_patch_set(&snapshot, &tree, root_id); log::trace!("Applying initial patch set"); apply_patch_set(&mut tree, patch_set); @@ -174,24 +196,13 @@ 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 { self.root_project.serve_port } - pub fn place_id(&self) -> Option { - self.root_project.place_id - } - - pub fn game_id(&self) -> Option { - self.root_project.game_id - } - pub fn start_time(&self) -> Instant { self.start_time } @@ -199,30 +210,17 @@ impl ServeSession { pub fn serve_place_ids(&self) -> Option<&HashSet> { 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 +239,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..aae249a8 100644 --- a/src/snapshot/instance_snapshot.rs +++ b/src/snapshot/instance_snapshot.rs @@ -1,11 +1,8 @@ //! 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, -}; +use rbx_dom_weak::{RbxId, RbxTree, RbxValue}; use serde::{Deserialize, Serialize}; use super::InstanceMetadata; @@ -14,11 +11,11 @@ use super::InstanceMetadata; /// // Possible future improvements: // - Use refcounted/interned strings -// - Replace use of Variant with a sum of Variant + borrowed value +// - Replace use of RbxValue with a sum of RbxValue + borrowed value #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct InstanceSnapshot { /// 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 +24,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 +38,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 +54,14 @@ 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, - 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,13 +75,6 @@ impl InstanceSnapshot { } } - pub fn snapshot_id(self, snapshot_id: Ref) -> Self { - Self { - snapshot_id, - ..self - } - } - pub fn metadata(self, metadata: impl Into) -> Self { Self { metadata: metadata.into(), @@ -101,29 +82,24 @@ 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) + pub fn from_tree(tree: &RbxTree, id: RbxId) -> Self { + let instance = tree + .get_instance(id) .expect("instance did not exist in tree"); let children = instance - .children() + .get_children_ids() .iter() - .map(|&id| Self::from_raw_tree(raw_tree, id)) + .cloned() + .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_name.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..6fa1eb29 100644 --- a/src/snapshot/patch.rs +++ b/src/snapshot/patch.rs @@ -1,26 +1,25 @@ //! 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::{RbxId, RbxValue}; use serde::{Deserialize, Serialize}; use super::{InstanceMetadata, InstanceSnapshot}; -/// A set of different kinds of patches that can be applied to an WeakDom. +/// A set of different kinds of patches that can be applied to an RbxTree. /// /// These patches shouldn't be persisted: there's no mechanism in place to make /// sure that another patch wasn't applied before this one that could cause a /// conflict! #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] pub struct PatchSet { - pub removed_instances: Vec, + pub removed_instances: Vec, pub added_instances: Vec, pub updated_instances: Vec, } -impl PatchSet { +impl<'a> PatchSet { pub fn new() -> Self { PatchSet { removed_instances: Vec::new(), @@ -33,20 +32,20 @@ impl PatchSet { /// A patch containing an instance that was added to the tree. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct PatchAdd { - pub parent_id: Ref, + pub parent_id: RbxId, pub instance: InstanceSnapshot, } /// A patch indicating that properties of an instance changed. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct PatchUpdate { - pub id: Ref, + pub id: RbxId, 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, @@ -64,8 +63,8 @@ pub struct PatchUpdate { // current values in all fields. #[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct AppliedPatchSet { - pub removed: Vec, - pub added: Vec, + pub removed: Vec, + pub added: Vec, pub updated: Vec, } @@ -77,30 +76,26 @@ 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)] pub struct AppliedPatchUpdate { - pub id: Ref, + pub id: RbxId, // 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, } impl AppliedPatchUpdate { - pub fn new(id: Ref) -> Self { + pub fn new(id: RbxId) -> Self { Self { 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..ea28f302 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::{RbxId, RbxInstanceProperties, RbxValue}; use super::{ patch::{AppliedPatchSet, AppliedPatchUpdate, PatchSet, PatchUpdate}, - InstanceSnapshot, RojoTree, + InstancePropertiesWithMeta, 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) @@ -54,7 +37,7 @@ pub fn apply_patch_set(tree: &mut RojoTree, patch_set: PatchSet) -> AppliedPatch struct PatchApplyContext { /// A map from transient snapshot IDs (generated by snapshot middleware) to /// instance IDs in the actual tree. These are both the same data type so - /// that they fit into the same `Variant::Ref` type. + /// that they fit into the same `RbxValue::Ref` type. /// /// At this point in the patch process, IDs in instance properties have been /// partially translated from 'snapshot space' into 'tree space' by the @@ -70,16 +53,22 @@ struct PatchApplyContext { /// #2 should not occur in well-formed projects, but is indistinguishable /// from #1 right now. It could happen if two model files try to reference /// eachother. - snapshot_id_to_instance_id: HashMap, + 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,80 +84,75 @@ 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 RbxValue::Ref { value: Some(id) } = property_value { + if let Some(&instance_id) = context.snapshot_id_to_instance_id.get(&id) { + property_value = RbxValue::Ref { + value: Some(instance_id), + }; } } - } - } - // 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 } -fn apply_remove_instance(context: &mut PatchApplyContext, tree: &mut RojoTree, removed_id: Ref) { - tree.remove(removed_id); - context.applied_patch_set.removed.push(removed_id); +fn apply_remove_instance(context: &mut PatchApplyContext, tree: &mut RojoTree, removed_id: RbxId) { + match tree.remove_instance(removed_id) { + Some(_) => context.applied_patch_set.removed.push(removed_id), + None => { + log::warn!( + "Patch misapplication: Tried to remove instance {} but it did not exist.", + removed_id + ); + } + } } fn apply_add_child( context: &mut PatchApplyContext, tree: &mut RojoTree, - parent_id: Ref, - mut snapshot: InstanceSnapshot, + parent_id: RbxId, + snapshot: InstanceSnapshot, ) { - let snapshot_id = snapshot.snapshot_id; - let children = take(&mut snapshot.children); + let properties = InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: snapshot.name.into_owned(), + class_name: snapshot.class_name.into_owned(), - // 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 assignment is deferred until after we know about all + // instances in this patch. See `PatchApplyContext` for details. + properties: HashMap::new(), + }, + metadata: snapshot.metadata, + }; + + let id = tree.insert_instance(properties, parent_id); - let id = tree.insert_instance(parent_id, snapshot); context.applied_patch_set.added.push(id); - if has_refs { - context.has_refs_to_rewrite.insert(id); - } + context + .added_instance_properties + .insert(id, snapshot.properties); - if snapshot_id.is_some() { + if let Some(snapshot_id) = snapshot.snapshot_id { context.snapshot_id_to_instance_id.insert(snapshot_id, id); } - for child in children { - apply_add_child(context, tree, id, child); + for child_snapshot in snapshot.children { + apply_add_child(context, tree, id, child_snapshot); } - - defer_ref_properties(tree, id, context); } fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patch: PatchUpdate) { @@ -183,7 +167,7 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc Some(instance) => instance, None => { log::warn!( - "Patch misapplication: Instance {:?}, referred to by update patch, did not exist.", + "Patch misapplication: Instance {}, referred to by update patch, did not exist.", patch.id ); return; @@ -196,7 +180,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); } @@ -205,27 +189,26 @@ fn apply_update_child(context: &mut PatchApplyContext, tree: &mut RojoTree, patc // Ref values need to be potentially rewritten from snapshot IDs to // instance IDs if they referred to an instance that was created as // part of this patch. - Some(Variant::Ref(referent)) => { - if referent.is_none() { - continue; - } - + Some(RbxValue::Ref { value: Some(id) }) => { // If our ID is not found in this map, then it either refers to // an existing instance NOT added by this patch, or there was an // error. See `PatchApplyContext::snapshot_id_to_instance_id` // for more info. - let new_referent = context + let new_id = context .snapshot_id_to_instance_id - .get(&referent) + .get(&id) .copied() - .unwrap_or(referent); + .unwrap_or(id); - instance - .properties_mut() - .insert(key, Variant::Ref(new_referent)); + instance.properties_mut().insert( + key.clone(), + RbxValue::Ref { + value: Some(new_id), + }, + ); } 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 +218,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 std::{borrow::Cow, collections::HashMap}; - use rbx_dom_weak::{types::Variant, UstrMap}; + use maplit::hashmap; + use rbx_dom_weak::RbxValue; use super::super::PatchAdd; @@ -315,16 +236,25 @@ mod test { fn add_from_empty() { let _ = env_logger::try_init(); - let mut tree = RojoTree::new(InstanceSnapshot::new()); + let mut tree = RojoTree::new(InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "Folder".to_owned(), + class_name: "Folder".to_owned(), + properties: HashMap::new(), + }, + metadata: Default::default(), + }); 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() => RbxValue::Int32 { value: 5 }, + }, children: Vec::new(), }; @@ -343,7 +273,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()); } @@ -352,29 +282,35 @@ mod test { fn update_existing() { let _ = env_logger::try_init(); - let mut tree = RojoTree::new( - InstanceSnapshot::new() - .class_name("OldClassName") - .name("OldName") - .property("Foo", 7i32) - .property("Bar", 3i32) - .property("Unchanged", -5i32), - ); + let mut tree = RojoTree::new(InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "OldName".to_owned(), + class_name: "OldClassName".to_owned(), + properties: hashmap! { + "Foo".to_owned() => RbxValue::Int32 { value: 7 }, + "Bar".to_owned() => RbxValue::Int32 { value: 3 }, + "Unchanged".to_owned() => RbxValue::Int32 { value: -5 }, + }, + }, + metadata: Default::default(), + }); let root_id = tree.get_root_id(); 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(RbxValue::Int32 { value: 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(RbxValue::Int32 { value: 10 }), + }, changed_metadata: None, }; @@ -385,11 +321,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() => RbxValue::Int32 { value: 8 }, + "Baz".to_owned() => RbxValue::Int32 { value: 10 }, + "Unchanged".to_owned() => RbxValue::Int32 { value: -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..96418d02 100644 --- a/src/snapshot/patch_compute.rs +++ b/src/snapshot/patch_compute.rs @@ -1,51 +1,42 @@ //! 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::{RbxId, RbxValue}; 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: &InstanceSnapshot, tree: &RojoTree, id: RbxId) -> PatchSet { let mut patch_set = PatchSet::new(); + let mut context = ComputePatchContext::default(); - if let Some(snapshot) = snapshot { - let mut context = ComputePatchContext::default(); + compute_patch_set_internal(&mut context, snapshot, tree, id, &mut patch_set); - compute_patch_set_internal(&mut context, snapshot, tree, id, &mut patch_set); - - // Rewrite Ref properties to refer to instance IDs instead of snapshot IDs - // 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); - } + // Rewrite Ref properties to refer to instance IDs instead of snapshot IDs + // 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); patch_set } #[derive(Default)] struct ComputePatchContext { - snapshot_id_to_instance_id: HashMap, + snapshot_id_to_instance_id: HashMap, } fn rewrite_refs_in_updates(context: &ComputePatchContext, updates: &mut [PatchUpdate]) { for update in updates { for property_value in update.changed_properties.values_mut() { - if let Some(Variant::Ref(referent)) = property_value { - if let Some(&instance_ref) = context.snapshot_id_to_instance_id.get(referent) { - *property_value = Some(Variant::Ref(instance_ref)); + if let Some(RbxValue::Ref { value: Some(id) }) = property_value { + if let Some(&instance_id) = context.snapshot_id_to_instance_id.get(id) { + *property_value = Some(RbxValue::Ref { + value: Some(instance_id), + }); } } } @@ -60,9 +51,11 @@ fn rewrite_refs_in_additions(context: &ComputePatchContext, additions: &mut [Pat fn rewrite_refs_in_snapshot(context: &ComputePatchContext, snapshot: &mut InstanceSnapshot) { for property_value in snapshot.properties.values_mut() { - 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); + if let RbxValue::Ref { value: Some(id) } = property_value { + if let Some(&instance_id) = context.snapshot_id_to_instance_id.get(id) { + *property_value = RbxValue::Ref { + value: Some(instance_id), + }; } } } @@ -74,123 +67,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, + id: RbxId, 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,9 +152,9 @@ fn compute_property_patches( fn compute_children_patches( context: &mut ComputePatchContext, - snapshot: &mut InstanceSnapshot, + snapshot: &InstanceSnapshot, tree: &RojoTree, - id: Ref, + id: RbxId, patch_set: &mut PatchSet, ) { let instance = tree @@ -223,7 +165,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 +202,7 @@ fn compute_children_patches( None => { patch_set.added_instances.push(PatchAdd { parent_id: id, - instance: snapshot_child, + instance: snapshot_child.clone(), }); } } @@ -275,92 +217,63 @@ 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; + use rbx_dom_weak::RbxInstanceProperties; + + use super::super::InstancePropertiesWithMeta; + /// 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 /// value before returning from compute_patch_set. #[test] fn rewrite_ref_existing_instance_update() { - let tree = RojoTree::new(InstanceSnapshot::new().name("foo").class_name("foo")); + let tree = RojoTree::new(InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "foo".to_owned(), + class_name: "foo".to_owned(), + properties: HashMap::new(), + }, + metadata: Default::default(), + }); let root_id = tree.get_root_id(); // This snapshot should be identical to the existing tree except for the // addition of a prop named Self, which is a self-referential Ref. - let snapshot_id = Ref::new(); + let snapshot_id = RbxId::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() => RbxValue::Ref { + value: Some(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(&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(RbxValue::Ref { + value: Some(root_id), + }), + }, changed_metadata: None, }], added_instances: Vec::new(), @@ -375,41 +288,56 @@ mod test { /// one. #[test] fn rewrite_ref_existing_instance_addition() { - let tree = RojoTree::new(InstanceSnapshot::new().name("foo").class_name("foo")); + let tree = RojoTree::new(InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "foo".to_owned(), + class_name: "foo".to_owned(), + properties: HashMap::new(), + }, + metadata: Default::default(), + }); let root_id = tree.get_root_id(); // This patch describes the existing instance with a new child added. - let snapshot_id = Ref::new(); + let snapshot_id = RbxId::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() => RbxValue::Ref { + value: Some(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(&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() => RbxValue::Ref { + value: Some(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..d9bb0753 100644 --- a/src/snapshot/tests/apply.rs +++ b/src/snapshot/tests/apply.rs @@ -1,16 +1,17 @@ use insta::assert_yaml_snapshot; +use maplit::hashmap; +use rbx_dom_weak::{RbxInstanceProperties, RbxValue}; -use rbx_dom_weak::{ustr, UstrMap}; use rojo_insta_ext::RedactionMap; use crate::{ - snapshot::{apply_patch_set, InstanceSnapshot, PatchSet, PatchUpdate, RojoTree}, + snapshot::{apply_patch_set, InstancePropertiesWithMeta, PatchSet, PatchUpdate, RojoTree}, tree_view::{intern_tree, view_tree}, }; #[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 +20,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 +38,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 +48,11 @@ 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(RbxValue::String { + value: "Value of Foo".to_owned(), + }), + }, changed_metadata: None, }], ..Default::default() @@ -64,7 +69,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); @@ -73,9 +78,12 @@ 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"), "Should be removed".into()); + root_instance.properties_mut().insert( + "Foo".to_owned(), + RbxValue::String { + value: "Should be removed".to_owned(), + }, + ); } let tree_view = view_tree(&tree, &mut redactions); @@ -86,7 +94,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() @@ -102,5 +112,12 @@ fn remove_property() { } fn empty_tree() -> RojoTree { - RojoTree::new(InstanceSnapshot::new().name("ROOT").class_name("ROOT")) + RojoTree::new(InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "ROOT".to_owned(), + class_name: "ROOT".to_owned(), + properties: Default::default(), + }, + metadata: Default::default(), + }) } diff --git a/src/snapshot/tests/compute.rs b/src/snapshot/tests/compute.rs index 2888a94d..8564ea34 100644 --- a/src/snapshot/tests/compute.rs +++ b/src/snapshot/tests/compute.rs @@ -1,29 +1,30 @@ use std::borrow::Cow; use insta::assert_yaml_snapshot; +use maplit::hashmap; +use rbx_dom_weak::{RbxInstanceProperties, RbxValue}; -use rbx_dom_weak::{types::Ref, ustr, UstrMap}; use rojo_insta_ext::RedactionMap; -use crate::snapshot::{compute_patch_set, InstanceSnapshot, RojoTree}; +use crate::snapshot::{compute_patch_set, InstancePropertiesWithMeta, 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(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -31,21 +32,25 @@ 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() => RbxValue::String { + value: "Hello, world!".to_owned(), + }, + }, children: Vec::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -53,7 +58,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 +66,24 @@ 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(), + RbxValue::String { + value: "This should be removed by the patch.".to_owned(), + }, + ); } 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(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -83,28 +91,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(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); @@ -112,7 +120,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()); @@ -120,28 +128,42 @@ fn remove_child() { { let root_id = tree.get_root_id(); let new_id = tree.insert_instance( + InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "Should not appear in snapshot".to_owned(), + class_name: "Folder".to_owned(), + properties: Default::default(), + }, + metadata: Default::default(), + }, root_id, - InstanceSnapshot::new().name("Should not appear in snapshot"), ); redactions.intern(new_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::new(), }; - let patch_set = compute_patch_set(Some(snapshot), &tree, tree.get_root_id()); + let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id()); let patch_value = redactions.redacted_yaml(patch_set); assert_yaml_snapshot!(patch_value); } fn empty_tree() -> RojoTree { - RojoTree::new(InstanceSnapshot::new().name("ROOT").class_name("ROOT")) + RojoTree::new(InstancePropertiesWithMeta { + properties: RbxInstanceProperties { + name: "ROOT".to_owned(), + class_name: "ROOT".to_owned(), + properties: Default::default(), + }, + metadata: Default::default(), + }) } diff --git a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property-2.snap b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property-2.snap index 4fc4f9ab..81500ec3 100644 --- a/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property-2.snap +++ b/src/snapshot/tests/snapshots/librojo__snapshot__tests__apply__add_property-2.snap @@ -1,7 +1,6 @@ --- source: src/snapshot/tests/apply.rs expression: applied_patch_value - --- removed: [] added: [] @@ -11,6 +10,6 @@ updated: changed_class_name: ~ changed_properties: Foo: - String: Value of Foo + Type: String + Value: Value of Foo changed_metadata: ~ - 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..fa57996d 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 @@ -7,13 +7,10 @@ name: ROOT class_name: ROOT properties: Foo: - String: Value of Foo + Type: String + Value: Value of Foo 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..631eacdf 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 @@ -7,13 +7,10 @@ name: ROOT class_name: ROOT properties: Foo: - String: Should be removed + Type: String + Value: Should be removed 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/tests/snapshots/librojo__snapshot__tests__compute__set_property.snap b/src/snapshot/tests/snapshots/librojo__snapshot__tests__compute__set_property.snap index fbaae3b9..8c39d3fd 100644 --- a/src/snapshot/tests/snapshots/librojo__snapshot__tests__compute__set_property.snap +++ b/src/snapshot/tests/snapshots/librojo__snapshot__tests__compute__set_property.snap @@ -1,7 +1,6 @@ --- source: src/snapshot/tests/compute.rs expression: patch_value - --- removed_instances: [] added_instances: [] @@ -11,6 +10,6 @@ updated_instances: changed_class_name: ~ changed_properties: PropertyName: - String: "Hello, world!" + Type: String + Value: "Hello, world!" changed_metadata: ~ - diff --git a/src/snapshot/tree.rs b/src/snapshot/tree.rs index 9e891f2c..baafe32a 100644 --- a/src/snapshot/tree.rs +++ b/src/snapshot/tree.rs @@ -1,29 +1,26 @@ use std::{ - collections::{HashMap, VecDeque}, + collections::HashMap, path::{Path, PathBuf}, }; -use rbx_dom_weak::{ - types::{Ref, Variant}, - ustr, Instance, InstanceBuilder, Ustr, UstrMap, WeakDom, -}; +use rbx_dom_weak::{Descendants, RbxId, RbxInstance, RbxInstanceProperties, RbxTree, RbxValue}; -use crate::{multimap::MultiMap, RojoRef}; +use crate::multimap::MultiMap; -use super::{InstanceMetadata, InstanceSnapshot}; +use super::InstanceMetadata; -/// An expanded variant of rbx_dom_weak's `WeakDom` that tracks additional +/// An expanded variant of rbx_dom_weak's `RbxTree` that tracks additional /// metadata per instance that's Rojo-specific. /// /// This tree is also optimized for doing fast incremental updates and patches. #[derive(Debug)] pub struct RojoTree { /// Contains the instances without their Rojo-specific metadata. - inner: WeakDom, + inner: RbxTree, /// Metadata associated with each instance that is kept up-to-date with the /// set of actual instances. - metadata_map: HashMap, + metadata_map: HashMap, /// A multimap from source paths to all of the root instances that were /// constructed from that path. @@ -32,56 +29,31 @@ pub struct RojoTree { /// value portion of the map is also a set in order to support the same path /// 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, + path_to_ids: MultiMap, } impl RojoTree { - pub fn new(snapshot: InstanceSnapshot) -> RojoTree { - let root_builder = InstanceBuilder::new(snapshot.class_name) - .with_name(snapshot.name) - .with_properties(snapshot.properties); - + pub fn new(root: InstancePropertiesWithMeta) -> RojoTree { let mut tree = RojoTree { - inner: WeakDom::new(root_builder), + inner: RbxTree::new(root.properties), metadata_map: HashMap::new(), path_to_ids: MultiMap::new(), - specified_id_to_refs: MultiMap::new(), }; - let root_ref = tree.inner.root_ref(); - - tree.insert_metadata(root_ref, snapshot.metadata); - - for child in snapshot.children { - tree.insert_instance(root_ref, child); - } - + tree.insert_metadata(tree.inner.get_root_id(), root.metadata); tree } - pub fn inner(&self) -> &WeakDom { + pub fn inner(&self) -> &RbxTree { &self.inner } - pub fn get_root_id(&self) -> Ref { - self.inner.root_ref() + pub fn get_root_id(&self) -> RbxId { + self.inner.get_root_id() } - /// 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> { - if let Some(instance) = self.inner.get_by_ref(id) { + pub fn get_instance(&self, id: RbxId) -> Option { + if let Some(instance) = self.inner.get_instance(id) { let metadata = self.metadata_map.get(&id).unwrap(); Some(InstanceWithMeta { instance, metadata }) @@ -90,8 +62,8 @@ impl RojoTree { } } - pub fn get_instance_mut(&mut self, id: Ref) -> Option> { - if let Some(instance) = self.inner.get_by_ref_mut(id) { + pub fn get_instance_mut(&mut self, id: RbxId) -> Option { + if let Some(instance) = self.inner.get_instance_mut(id) { let metadata = self.metadata_map.get_mut(&id).unwrap(); Some(InstanceWithMetaMut { instance, metadata }) @@ -100,63 +72,38 @@ 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) - .with_properties(snapshot.properties); - - let referent = self.inner.insert(parent_ref, builder); - self.insert_metadata(referent, snapshot.metadata); - - for child in snapshot.children { - self.insert_instance(referent, child); - } - - referent + pub fn insert_instance( + &mut self, + properties: InstancePropertiesWithMeta, + parent_id: RbxId, + ) -> RbxId { + let id = self.inner.insert_instance(properties.properties, parent_id); + self.insert_metadata(id, properties.metadata); + id } - pub fn remove(&mut self, id: Ref) { - let mut to_move = VecDeque::new(); - to_move.push_back(id); + pub fn remove_instance(&mut self, id: RbxId) -> Option { + if let Some(inner) = self.inner.remove_instance(id) { + let mut metadata_map = HashMap::new(); + let mut path_to_ids = MultiMap::new(); - while let Some(id) = to_move.pop_front() { - self.remove_metadata(id); - - if let Some(instance) = self.inner.get_by_ref(id) { - to_move.extend(instance.children().iter().copied()); + self.move_metadata(id, &mut metadata_map, &mut path_to_ids); + for instance in inner.descendants(id) { + self.move_metadata(instance.get_id(), &mut metadata_map, &mut path_to_ids); } - } - self.inner.destroy(id); + Some(RojoTree { + inner, + metadata_map, + path_to_ids, + }) + } else { + None + } } /// Replaces the metadata associated with the given instance ID. - pub fn update_metadata(&mut self, id: Ref, metadata: InstanceMetadata) { + pub fn update_metadata(&mut self, id: RbxId, metadata: InstanceMetadata) { use std::collections::hash_map::Entry; match self.metadata_map.entry(id) { @@ -175,20 +122,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); } @@ -198,72 +131,50 @@ impl RojoTree { } } - pub fn descendants(&self, id: Ref) -> RojoDescendants<'_> { - let mut queue = VecDeque::new(); - queue.push_back(id); - - RojoDescendants { queue, tree: self } + pub fn descendants(&self, id: RbxId) -> RojoDescendants<'_> { + RojoDescendants { + inner: self.inner.descendants(id), + tree: self, + } } - pub fn get_ids_at_path(&self, path: &Path) -> &[Ref] { + pub fn get_ids_at_path(&self, path: &Path) -> &[RbxId] { self.path_to_ids.get(path) } - pub fn get_metadata(&self, id: Ref) -> Option<&InstanceMetadata> { + pub fn get_metadata(&self, id: RbxId) -> Option<&InstanceMetadata> { 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) { + fn insert_metadata(&mut self, id: RbxId, 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); } /// Moves the Rojo metadata from the instance with the given ID from this /// tree into some loose maps. - fn remove_metadata(&mut self, id: Ref) { + fn move_metadata( + &mut self, + id: RbxId, + metadata_map: &mut HashMap, + path_to_ids: &mut MultiMap, + ) { 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); + path_to_ids.insert(path.clone(), id); } + + metadata_map.insert(id, metadata); } } pub struct RojoDescendants<'a> { - queue: VecDeque, + inner: Descendants<'a>, tree: &'a RojoTree, } @@ -271,84 +182,87 @@ impl<'a> Iterator for RojoDescendants<'a> { type Item = InstanceWithMeta<'a>; fn next(&mut self) -> Option { - let id = self.queue.pop_front()?; - - let instance = self - .tree - .inner - .get_by_ref(id) - .expect("Instance did not exist"); - + let instance = self.inner.next()?; let metadata = self .tree - .get_metadata(instance.referent()) + .get_metadata(instance.get_id()) .expect("Metadata did not exist for instance"); - self.queue.extend(instance.children().iter().copied()); - Some(InstanceWithMeta { instance, metadata }) } } -/// RojoTree's equivalent of `&'a Instance`. +/// RojoTree's equivalent of `RbxInstanceProperties`. +#[derive(Debug, Clone)] +pub struct InstancePropertiesWithMeta { + pub properties: RbxInstanceProperties, + pub metadata: InstanceMetadata, +} + +impl InstancePropertiesWithMeta { + pub fn new(properties: RbxInstanceProperties, metadata: InstanceMetadata) -> Self { + InstancePropertiesWithMeta { + properties, + metadata, + } + } +} + +/// RojoTree's equivalent of `&'a RbxInstance`. /// /// This has to be a value type for RojoTree because the instance and metadata /// are stored in different places. The mutable equivalent is /// `InstanceWithMetaMut`. #[derive(Debug, Clone, Copy)] pub struct InstanceWithMeta<'a> { - instance: &'a Instance, + instance: &'a RbxInstance, metadata: &'a InstanceMetadata, } impl<'a> InstanceWithMeta<'a> { - pub fn id(&self) -> Ref { - self.instance.referent() + pub fn id(&self) -> RbxId { + self.instance.get_id() } - pub fn parent(&self) -> Ref { - self.instance.parent() + pub fn parent(&self) -> Option { + self.instance.get_parent_id() } pub fn name(&self) -> &'a str { &self.instance.name } - pub fn class_name(&self) -> Ustr { - self.instance.class + pub fn class_name(&self) -> &'a str { + &self.instance.class_name } - pub fn properties(&self) -> &'a UstrMap { + pub fn properties(&self) -> &'a HashMap { &self.instance.properties } - pub fn children(&self) -> &'a [Ref] { - self.instance.children() + pub fn children(&self) -> &'a [RbxId] { + self.instance.get_children_ids() } pub fn metadata(&self) -> &'a InstanceMetadata { - self.metadata - } - - pub fn inner(&self) -> &Instance { - self.instance + &self.metadata } } -/// RojoTree's equivalent of `&'a mut Instance`. +/// RojoTree's equivalent of `&'a mut RbxInstance`. /// /// This has to be a value type for RojoTree because the instance and metadata /// are stored in different places. The immutable equivalent is /// `InstanceWithMeta`. #[derive(Debug)] pub struct InstanceWithMetaMut<'a> { - instance: &'a mut Instance, + instance: &'a mut RbxInstance, metadata: &'a mut InstanceMetadata, } impl InstanceWithMetaMut<'_> { - pub fn id(&self) -> Ref { - self.instance.referent() + pub fn id(&self) -> RbxId { + self.instance.get_id() } pub fn name(&self) -> &str { @@ -360,61 +274,26 @@ impl InstanceWithMetaMut<'_> { } pub fn class_name(&self) -> &str { - &self.instance.class + &self.instance.class_name } - 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_name } - 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 } - pub fn children(&self) -> &[Ref] { - self.instance.children() + pub fn children(&self) -> &[RbxId] { + self.instance.get_children_ids() } 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..fd39b04e 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 rbx_dom_weak::RbxValue; +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, middleware::SnapshotInstanceResult}; pub fn snapshot_csv( _context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, -) -> anyhow::Result> { + instance_name: &str, +) -> SnapshotInstanceResult { + let meta_path = path.with_file_name(format!("{}.meta.json", instance_name)); let contents = vfs.read(path)?; let table_contents = convert_localization_csv(&contents).with_context(|| { @@ -36,213 +27,48 @@ pub fn snapshot_csv( })?; let mut snapshot = InstanceSnapshot::new() - .name(name) + .name(instance_name) .class_name("LocalizationTable") - .property(ustr("Contents"), table_contents) + .properties(hashmap! { + "Contents".to_owned() => RbxValue::String { + value: table_contents, + }, + }) .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 +80,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 +102,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 +119,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,11 +144,11 @@ 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, + &mut vfs, Path::new("/foo.csv"), "foo", ) @@ -401,11 +176,11 @@ 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, + &mut vfs, Path::new("/foo.csv"), "foo", ) @@ -414,74 +189,4 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#, 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..84c7d64a 100644 --- a/src/snapshot_middleware/dir.rs +++ b/src/snapshot_middleware/dir.rs @@ -1,51 +1,19 @@ -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}; +use super::{meta_file::DirectoryMetadata, middleware::SnapshotInstanceResult, 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), +pub fn snapshot_dir(context: &InstanceContext, vfs: &Vfs, path: &Path) -> SnapshotInstanceResult { + 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 +28,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 +59,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 +80,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 +95,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..959b3cb3 100644 --- a/src/snapshot_middleware/json.rs +++ b/src/snapshot_middleware/json.rs @@ -1,42 +1,53 @@ use std::path::Path; -use memofs::Vfs; -use rbx_dom_weak::ustr; +use anyhow::Context; +use maplit::hashmap; +use memofs::{IoResultExt, Vfs}; +use rbx_dom_weak::RbxValue; use crate::{ - json, lua_ast::{Expression, Statement}, snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, }; -use super::meta_file::AdjacentMetadata; +use super::{meta_file::AdjacentMetadata, middleware::SnapshotInstanceResult}; pub fn snapshot_json( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, -) -> anyhow::Result> { + instance_name: &str, +) -> SnapshotInstanceResult { 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() => RbxValue::String { + value: as_lua, + }, + }; + + let meta_path = path.with_file_name(format!("{}.meta.json", instance_name)); + let mut snapshot = InstanceSnapshot::new() - .name(name) + .name(instance_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,49 +104,11 @@ mod test { ) .unwrap(); - let vfs = Vfs::new(imfs.clone()); + let mut vfs = Vfs::new(imfs.clone()); let instance_snapshot = snapshot_json( &InstanceContext::default(), - &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, + &mut vfs, Path::new("/foo.json"), "foo", ) diff --git a/src/snapshot_middleware/json_model.rs b/src/snapshot_middleware/json_model.rs index fdc2069e..b0dd361c 100644 --- a/src/snapshot_middleware/json_model.rs +++ b/src/snapshot_middleware/json_model.rs @@ -1,220 +1,93 @@ -use std::{borrow::Cow, path::Path, str}; +use std::{borrow::Cow, collections::HashMap, path::Path}; 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 rbx_dom_weak::UnresolvedRbxValue; +use rbx_reflection::try_resolve_value; +use serde::Deserialize; -use crate::{ - json, - resolution::UnresolvedValue, - snapshot::{InstanceContext, InstanceSnapshot}, - syncback::{filter_properties_preallocated, FsSnapshot, SyncbackReturn, SyncbackSnapshot}, - RojoRef, -}; +use crate::snapshot::{InstanceContext, InstanceSnapshot}; + +use super::middleware::SnapshotInstanceResult; pub fn snapshot_json_model( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, -) -> anyhow::Result> { + instance_name: &str, +) -> SnapshotInstanceResult { let contents = vfs.read(path)?; - let contents_str = str::from_utf8(&contents) - .with_context(|| format!("File was not valid UTF-8: {}", path.display()))?; + let instance: JsonModel = serde_json::from_slice(&contents) + .with_context(|| format!("File is not a valid JSON model: {}", path.display()))?; - if contents_str.trim().is_empty() { - 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 mut snapshot = instance - .into_snapshot() - .with_context(|| format!("Could not load JSON model: {}", path.display()))?; + let mut snapshot = instance.core.into_snapshot(instance_name.to_owned()); 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) -> InstanceSnapshot { 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()?); - } + let children = self + .children + .into_iter() + .map(|child| child.core.into_snapshot(child.name)) + .collect(); - let mut properties = UstrMap::with_capacity(self.properties.len()); - for (key, unresolved) in self.properties { - let value = unresolved.resolve(&class_name, &key)?; - properties.insert(key, value); - } + let properties = self + .properties + .into_iter() + .map(|(key, value)| { + try_resolve_value(&class_name, &key, &value).map(|resolved| (key, resolved)) + }) + .collect::, _>>() + .expect("TODO: Handle rbx_reflection errors"); - 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(), + InstanceSnapshot { + snapshot_id: None, metadata: Default::default(), name: Cow::Owned(name), - class_name, + class_name: Cow::Owned(class_name), properties, children, - }) + } } } @@ -232,44 +105,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,11 +122,11 @@ 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", ) diff --git a/src/snapshot_middleware/lua.rs b/src/snapshot_middleware/lua.rs index 98f43e40..bfea5324 100644 --- a/src/snapshot_middleware/lua.rs +++ b/src/snapshot_middleware/lua.rs @@ -1,98 +1,58 @@ 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 rbx_dom_weak::RbxValue; -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 _, + dir::snapshot_dir, meta_file::AdjacentMetadata, middleware::SnapshotInstanceResult, + util::match_trailing, }; -#[derive(Debug)] -pub enum ScriptType { - Server, - Client, - Module, - Plugin, - LegacyServer, - LegacyClient, - RunContextServer, - RunContextClient, -} - /// 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; +pub fn snapshot_lua(context: &InstanceContext, vfs: &Vfs, path: &Path) -> SnapshotInstanceResult { + 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() => RbxValue::String { + value: contents_str, + }, + }) .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,113 +66,31 @@ pub fn snapshot_lua_init( context: &InstanceContext, vfs: &Vfs, init_path: &Path, - name: &str, - script_type: ScriptType, -) -> anyhow::Result> { +) -> SnapshotInstanceResult { 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!( "init.lua, init.server.lua, and init.client.lua can \ only be used if the instance produced by the containing \ - directory would be a Folder.\n\ - \n\ + 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_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 +98,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 +190,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 +217,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 +249,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..618f72c6 100644 --- a/src/snapshot_middleware/meta_file.rs +++ b/src/snapshot_middleware/meta_file.rs @@ -1,18 +1,11 @@ -use std::path::{Path, PathBuf}; +use std::{borrow::Cow, collections::HashMap, path::Path}; -use anyhow::{format_err, Context}; -use indexmap::IndexMap; -use memofs::{IoResultExt as _, Vfs}; -use rbx_dom_weak::{ - types::{Attributes, Variant}, - Ustr, -}; +use anyhow::Context; +use rbx_dom_weak::UnresolvedRbxValue; +use rbx_reflection::try_resolve_value; use serde::{Deserialize, Serialize}; -use crate::{ - json, resolution::UnresolvedValue, snapshot::InstanceSnapshot, syncback::SyncbackSnapshot, - RojoRef, -}; +use crate::snapshot::InstanceSnapshot; /// Represents metadata in a sibling file with the same basename. /// @@ -21,141 +14,21 @@ 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(skip)] - pub path: PathBuf, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub properties: HashMap, } 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: &Path) -> anyhow::Result { + serde_json::from_slice(slice).with_context(|| { format!( "File contained malformed .meta.json data: {}", path.display() ) - })?; - - meta.path = path; - 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) { @@ -164,73 +37,23 @@ impl AdjacentMetadata { } } - pub fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - let path = &self.path; + pub fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) { + let class_name = &snapshot.class_name; - // 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) { - let value = unresolved - .resolve(&snapshot.class_name, &key) - .with_context(|| format!("error applying meta file {}", path.display()))?; + let source_properties = self.properties.drain().map(|(key, value)| { + try_resolve_value(class_name, &key, &value) + .map(|resolved| (key, resolved)) + .expect("TODO: Handle rbx_reflection errors") + }); + for (key, value) in source_properties { 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<()> { + pub fn apply_all(&mut self, snapshot: &mut InstanceSnapshot) { 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() + self.apply_properties(snapshot); } // TODO: Add method to allow selectively applying parts of metadata and @@ -244,173 +67,41 @@ 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, - - #[serde(skip)] - pub path: PathBuf, + pub class_name: Option, } 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: &Path) -> anyhow::Result { + serde_json::from_slice(slice).with_context(|| { format!( "File contained malformed init.meta.json data: {}", path.display() ) - })?; - - meta.path = path; - 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<()> { + pub fn apply_all(&mut self, snapshot: &mut InstanceSnapshot) { self.apply_ignore_unknown_instances(snapshot); - self.apply_class_name(snapshot)?; - self.apply_properties(snapshot)?; - self.apply_id(snapshot)?; - self.apply_schema(snapshot)?; - - Ok(()) + self.apply_class_name(snapshot); + self.apply_properties(snapshot); } - fn apply_class_name(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { + fn apply_class_name(&mut self, snapshot: &mut InstanceSnapshot) { if let Some(class_name) = self.class_name.take() { if snapshot.class_name != "Folder" { // TODO: Turn into error type - return Err(format_err!( - "className in init.meta.json can only be specified if the \ - affected directory would turn into a Folder instance." - )); + panic!("className in init.meta.json can only be specified if the affected directory would turn into a Folder instance."); } - snapshot.class_name = class_name; + snapshot.class_name = Cow::Owned(class_name); } - - Ok(()) } fn apply_ignore_unknown_instances(&mut self, snapshot: &mut InstanceSnapshot) { @@ -419,174 +110,17 @@ impl DirectoryMetadata { } } - fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) -> anyhow::Result<()> { - let path = &self.path; + fn apply_properties(&mut self, snapshot: &mut InstanceSnapshot) { + let class_name = &snapshot.class_name; - for (key, unresolved) in std::mem::take(&mut self.properties) { - let value = unresolved - .resolve(&snapshot.class_name, &key) - .with_context(|| format!("error applying meta file {}", path.display()))?; + let source_properties = self.properties.drain().map(|(key, value)| { + try_resolve_value(class_name, &key, &value) + .map(|resolved| (key, resolved)) + .expect("TODO: Handle rbx_reflection errors") + }); + for (key, value) in source_properties { 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/middleware.rs b/src/snapshot_middleware/middleware.rs new file mode 100644 index 00000000..f576ede8 --- /dev/null +++ b/src/snapshot_middleware/middleware.rs @@ -0,0 +1,3 @@ +use crate::snapshot::InstanceSnapshot; + +pub type SnapshotInstanceResult = anyhow::Result>; diff --git a/src/snapshot_middleware/mod.rs b/src/snapshot_middleware/mod.rs index fadce5f6..bf9f4e8c 100644 --- a/src/snapshot_middleware/mod.rs +++ b/src/snapshot_middleware/mod.rs @@ -1,7 +1,5 @@ //! Defines the semantics that Rojo uses to turn entries on the filesystem into //! Roblox instances using the instance snapshot subsystem. -//! -//! These modules define how files turn into instances. #![allow(dead_code)] @@ -11,435 +9,95 @@ mod json; mod json_model; mod lua; mod meta_file; +mod middleware; 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; 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, + json_model::snapshot_json_model, + lua::{snapshot_lua, snapshot_lua_init}, + middleware::SnapshotInstanceResult, + project::snapshot_project, + rbxm::snapshot_rbxm, + rbxmx::snapshot_rbxmx, + txt::snapshot_txt, + util::match_file_name, }; -pub use self::{ - lua::ScriptType, project::snapshot_project_node, util::emit_legacy_scripts_default, - util::PathExt, -}; +pub use self::project::snapshot_project_node; -/// 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 fn snapshot_from_vfs( context: &InstanceContext, vfs: &Vfs, path: &Path, -) -> anyhow::Result> { +) -> SnapshotInstanceResult { let meta = match vfs.metadata(path).with_not_found()? { Some(meta) => meta, None => return Ok(None), }; 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 Some(name) = match_file_name(path, ".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 let Some(_name) = match_file_name(path, ".project.json") { + return snapshot_project(context, vfs, path); + } else if let Some(name) = match_file_name(path, ".model.json") { + return snapshot_json_model(context, vfs, path, name); + } else if let Some(_name) = match_file_name(path, ".meta.json") { + // .meta.json files do not turn into their own instances. + return Ok(None); + } else if let Some(name) = match_file_name(path, ".json") { + return snapshot_json(context, vfs, path, name); + } else if let Some(name) = match_file_name(path, ".csv") { + return snapshot_csv(context, vfs, path, name); + } else if let Some(name) = match_file_name(path, ".txt") { + return snapshot_txt(context, vfs, path, name); + } else if let Some(name) = match_file_name(path, ".rbxmx") { + return snapshot_rbxmx(context, vfs, path, name); + } else if let Some(name) = match_file_name(path, ".rbxm") { + return snapshot_rbxm(context, vfs, path, name); } - } - 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..c644c396 100644 --- a/src/snapshot_middleware/project.rs +++ b/src/snapshot_middleware/project.rs @@ -1,92 +1,59 @@ -use std::{ - borrow::Cow, - collections::{BTreeMap, HashMap, VecDeque}, - path::Path, -}; +use std::{borrow::Cow, collections::HashMap, path::Path}; -use anyhow::{bail, Context}; +use anyhow::Context; use memofs::Vfs; -use rbx_dom_weak::{ - types::{Attributes, Ref, Variant}, - ustr, HashMapExt as _, Instance, Ustr, UstrMap, -}; -use rbx_reflection::ClassTag; +use rbx_reflection::{get_class_descriptor, try_resolve_value}; use crate::{ - project::{PathNode, Project, ProjectNode}, - resolution::UnresolvedValue, + project::{Project, ProjectNode}, 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::{middleware::SnapshotInstanceResult, 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)) +) -> SnapshotInstanceResult { + 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)? { - Some(found_snapshot) => { - let mut snapshot = found_snapshot; - // Setting the instigating source to the project file path is a little - // coarse. - // - // Ideally, we'd only snapshot the project file if the project file - // actually changed. Because Rojo only has the concept of one - // relevant path -> snapshot path mapping per instance, we pick the more - // conservative approach of snapshotting the project file if any - // relevant paths changed. - snapshot.metadata.instigating_source = Some(path.to_path_buf().into()); + // TODO: If this project node is a path to an instance that Rojo doesn't + // understand, this may panic! + let mut snapshot = + snapshot_project_node(&context, path, &project.name, &project.tree, vfs, None)?.unwrap(); - // Mark this snapshot (the root node of the project file) as being - // related to the project file. - // - // We SHOULD NOT mark the project file as a relevant path for any - // nodes that aren't roots. They'll be updated as part of the project - // file being updated. - snapshot.metadata.relevant_paths.push(path.to_path_buf()); + // Setting the instigating source to the project file path is a little + // coarse. + // + // Ideally, we'd only snapshot the project file if the project file + // actually changed. Because Rojo only has the concept of one + // relevant path -> snapshot path mapping per instance, we pick the more + // conservative approach of snapshotting the project file if any + // relevant paths changed. + snapshot.metadata.instigating_source = Some(path.to_path_buf().into()); - Ok(Some(snapshot)) - } - None => Ok(None), - } + // Mark this snapshot (the root node of the project file) as being + // related to the project file. + // + // We SHOULD NOT mark the project file as a relevant path for any + // nodes that aren't roots. They'll be updated as part of the project + // file being updated. + snapshot.metadata.relevant_paths.push(path.to_path_buf()); + + Ok(Some(snapshot)) } pub fn snapshot_project_node( @@ -96,29 +63,46 @@ pub fn snapshot_project_node( node: &ProjectNode, vfs: &Vfs, parent_class: Option<&str>, -) -> anyhow::Result> { +) -> SnapshotInstanceResult { let project_folder = project_path.parent().unwrap(); - let mut class_name_from_path = None; - let name = Cow::Owned(instance_name.to_owned()); - let mut properties = UstrMap::new(); + let mut class_name = node + .class_name + .as_ref() + .map(|name| Cow::Owned(name.clone())); + let mut properties = HashMap::new(); let mut children = Vec::new(); - let mut metadata = InstanceMetadata::new().context(context); - - if let Some(path_node) = &node.path { - let path = path_node.path(); + let mut metadata = InstanceMetadata::default(); + if let Some(path) = &node.path { // If the path specified in the project is relative, we assume it's // relative to the folder that the project is in, project_folder. - let full_path = if path.is_relative() { + let path = if path.is_relative() { Cow::Owned(project_folder.join(path)) } else { Cow::Borrowed(path) }; - if let Some(snapshot) = snapshot_from_vfs(context, vfs, &full_path)? { - class_name_from_path = Some(snapshot.class_name); + if let Some(snapshot) = snapshot_from_vfs(context, vfs, &path)? { + // If a class name was already specified, then it'll override the + // class name of this snapshot ONLY if it's a Folder. + // + // This restriction is in place to prevent applying properties to + // instances that don't make sense. The primary use-case for using + // $className and $path at the same time is to use a directory as a + // service in a place file. + class_name = match class_name { + Some(class_name) => { + if snapshot.class_name == "Folder" { + Some(class_name) + } else { + // TODO: Turn this into an error object. + panic!("If $className and $path are specified, $path must yield an instance of class Folder"); + } + } + None => Some(snapshot.class_name), + }; // Properties from the snapshot are pulled in unchanged, and // overridden by properties set on the project node. @@ -137,86 +121,42 @@ pub fn snapshot_project_node( // Take the snapshot's metadata as-is, which will be mutated later // on. metadata = snapshot.metadata; + } else { + // TODO: Should this issue an error instead? + log::warn!( + "$path referred to a path that could not be turned into an instance by Rojo" + ); } } - let class_name_from_inference = infer_class_name(&name, parent_class); + let class_name = class_name + .or_else(|| { + // If className wasn't defined from another source, we may be able + // to infer one. - let class_name = match ( - node.class_name, - class_name_from_path, - class_name_from_inference, - &node.path, - ) { - // These are the easy, happy paths! - (Some(project), None, None, _) => project, - (None, Some(path), None, _) => path, - (None, None, Some(inference), _) => inference, + let parent_class = parent_class?; - // If the user specifies a class name, but there's an inferred class - // name, we prefer the name listed explicitly by the user. - (Some(project), None, Some(_), _) => project, + if parent_class == "DataModel" { + // Members of DataModel with names that match known services are + // probably supposed to be those services. - // If the user has a $path pointing to a folder and we're able to infer - // a class name, let's use the inferred name. If the path we're pointing - // to isn't a folder, though, that's a user error. - (None, Some(path), Some(inference), _) => { - if path == "Folder" { - inference - } else { - path + let descriptor = get_class_descriptor(&name)?; + + if descriptor.is_service() { + return Some(name.clone()); + } + } else if parent_class == "StarterPlayer" { + // StarterPlayer has two special members with their own classes. + + if name == "StarterPlayerScripts" || name == "StarterCharacterScripts" { + return Some(name.clone()); + } } - } - (Some(project), Some(path), _, _) => { - if path == "Folder" { - project - } else { - bail!( - "ClassName for Instance \"{}\" was specified in both the project file (as \"{}\") and from the filesystem (as \"{}\").\n\ - If $className and $path are both set, $path must refer to a Folder. - \n\ - Project path: {}\n\ - Filesystem path: {}\n", - instance_name, - project, - path, - project_path.display(), - node.path.as_ref().unwrap().path().display() - ); - } - } - - (None, None, None, Some(PathNode::Optional(_))) => { - return Ok(None); - } - - (_, None, _, Some(PathNode::Required(path))) => { - anyhow::bail!( - "Rojo project referred to a file using $path that could not be turned into a Roblox Instance by Rojo.\n\ - Check that the file exists and is a file type known by Rojo.\n\ - \n\ - Project path: {}\n\ - File $path: {}", - project_path.display(), - path.display(), - ); - } - - (None, None, None, None) => { - bail!( - "Instance \"{}\" is missing some required information.\n\ - One of the following must be true:\n\ - - $className must be set to the name of a Roblox class\n\ - - $path must be set to a path of an instance\n\ - - The instance must be a known service, like ReplicatedStorage\n\ - \n\ - Project path: {}", - instance_name, - project_path.display(), - ); - } - }; + None + }) + // TODO: Turn this into an error object. + .expect("$className or $path must be specified"); for (child_name, child_project_node) in &node.children { if let Some(child) = snapshot_project_node( @@ -231,49 +171,11 @@ pub fn snapshot_project_node( } } - for (key, unresolved) in &node.properties { - let value = unresolved - .clone() - .resolve(&class_name, key) - .with_context(|| { - format!( - "Unresolvable property in project at path {}", - project_path.display() - ) - })?; + for (key, value) in &node.properties { + let resolved_value = try_resolve_value(&class_name, key, value) + .expect("TODO: Properly handle value resolution errors"); - match key.as_str() { - "Name" | "Parent" => { - log::warn!( - "Property '{}' cannot be set manually, ignoring. Attempted to set in '{}' at {}", - key, - instance_name, - project_path.display() - ); - continue; - } - - _ => {} - } - - 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(), resolved_value); } // If the user specified $ignoreUnknownInstances, overwrite the existing @@ -290,19 +192,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,404 +209,12 @@ 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 { - // If className wasn't defined from another source, we may be able - // to infer one. - - let parent_class = parent_class?; - - if parent_class == "DataModel" { - // 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)?; - - if descriptor.tags.contains(&ClassTag::Service) { - return Some(ustr(name)); - } - } 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)); - } - } - - None -} - // #[cfg(feature = "broken-tests")] #[cfg(test)] mod test { use super::*; + use maplit::hashmap; use memofs::{InMemoryFs, VfsSnapshot}; #[ignore = "Functionality moved to root snapshot middleware"] @@ -719,32 +225,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 +255,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"); @@ -801,7 +296,8 @@ mod test { "$className": "StringValue", "$properties": { "Value": { - "String": "Hello, world!" + "Type": "String", + "Value": "Hello, world!" } } } @@ -811,13 +307,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 +343,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 +380,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 +400,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 +434,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 +475,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 +495,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 +523,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 +534,8 @@ mod test { } } } - "#, - ), - ), - ( - "other.project.json", - VfsSnapshot::file( - r#" + "#), + "other.project.json" => VfsSnapshot::file(r#" { "name": "other-project", "tree": { @@ -1088,56 +545,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..68080b1d 100644 --- a/src/snapshot_middleware/rbxm.rs +++ b/src/snapshot_middleware/rbxm.rs @@ -1,65 +1,52 @@ -use std::path::Path; +use std::{collections::HashMap, path::Path}; use anyhow::Context; use memofs::Vfs; +use rbx_dom_weak::{RbxInstanceProperties, RbxTree}; -use crate::{ - snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}, - syncback::{FsSnapshot, SyncbackReturn, SyncbackSnapshot}, -}; +use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot}; + +use super::middleware::SnapshotInstanceResult; -#[profiling::function] pub fn snapshot_rbxm( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, -) -> anyhow::Result> { - let temp_tree = rbx_binary::from_reader(vfs.read(path)?.as_slice()) + instance_name: &str, +) -> SnapshotInstanceResult { + let mut temp_tree = RbxTree::new(RbxInstanceProperties { + name: "DataModel".to_owned(), + class_name: "DataModel".to_owned(), + properties: HashMap::new(), + }); + + let root_id = temp_tree.get_root_id(); + rbx_binary::decode(&mut temp_tree, root_id, vfs.read(path)?.as_slice()) .with_context(|| format!("Malformed rbxm file: {}", path.display()))?; - let root_instance = temp_tree.root(); - let children = root_instance.children(); + let root_instance = temp_tree.get_instance(root_id).unwrap(); + let children = root_instance.get_children_ids(); if children.len() == 1 { - let child = children[0]; - let snapshot = InstanceSnapshot::from_tree(temp_tree, child) - .name(name) + let snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]) + .name(instance_name) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf()]) .context(context), ); Ok(Some(snapshot)) } else { anyhow::bail!( - "Rojo currently only supports model files with one top-level instance.\n\n \ + "Rojo doesn't have support for model files with zero or more than one top-level instances yet.\n\n \ Check the model file at path {}", path.display() ); } } -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,11 +62,11 @@ 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", ) diff --git a/src/snapshot_middleware/rbxmx.rs b/src/snapshot_middleware/rbxmx.rs index 8f122324..e24a6f58 100644 --- a/src/snapshot_middleware/rbxmx.rs +++ b/src/snapshot_middleware/rbxmx.rs @@ -2,75 +2,46 @@ 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::middleware::SnapshotInstanceResult; pub fn snapshot_rbxmx( context: &InstanceContext, vfs: &Vfs, path: &Path, - name: &str, -) -> anyhow::Result> { + instance_name: &str, +) -> SnapshotInstanceResult { 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(); + let root_instance = temp_tree.get_instance(temp_tree.get_root_id()).unwrap(); + let children = root_instance.get_children_ids(); if children.len() == 1 { - let child = children[0]; - let snapshot = InstanceSnapshot::from_tree(temp_tree, child) - .name(name) + let snapshot = InstanceSnapshot::from_tree(&temp_tree, children[0]) + .name(instance_name) .metadata( InstanceMetadata::new() .instigating_source(path) - .relevant_paths(vec![vfs.canonicalize(path)?]) + .relevant_paths(vec![path.to_path_buf()]) .context(context), ); Ok(Some(snapshot)) } else { anyhow::bail!( - "Rojo currently only supports model files with one top-level instance.\n\n \ + "Rojo doesn't have support for model files with zero or more than one top-level instances yet.\n\n \ Check the model file at path {}", path.display() ); } } -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,11 +67,11 @@ 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", ) 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..ccb2de88 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/csv.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +10,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!\"}}]" + Type: String + Value: "[{\"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..def16559 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/csv.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,15 +10,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!\"}}]" + Type: String + Value: "[{\"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..59378750 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/json.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +10,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}" + Type: String + Value: "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..427f2ab9 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 @@ -2,33 +2,26 @@ 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 + Type: Int32 + Value: 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: {} 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 62% 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..f0ce9fe1 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/lua.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +10,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! + Type: String + Value: 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 61% 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..1fbc5638 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/lua.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +10,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! + Type: String + Value: 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 61% 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..9c64cab8 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/lua.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,15 +10,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! + Type: String + Value: 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 57% 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..329c7d99 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/lua.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,19 +10,14 @@ 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 + Type: Bool + Value: true Source: - String: Hello there! + Type: String + Value: 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 58% 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..34cdd503 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/lua.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: true instigating_source: @@ -10,17 +10,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! + Type: String + Value: 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 58% 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..357d89d6 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/lua.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,17 +10,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! + Type: String + Value: 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..8fe66f62 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 @@ -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,14 +10,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 + Type: String + Value: 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..68802abb 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/project.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,16 +10,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!" + Type: String + Value: "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..21159485 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 @@ -2,21 +2,18 @@ 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!" + Type: String + Value: "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..d3cbb593 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 @@ -2,21 +2,18 @@ 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! + Type: String + Value: 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..38b62a6f 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 @@ -2,7 +2,7 @@ source: src/snapshot_middleware/txt.rs expression: instance_snapshot --- -snapshot_id: "00000000000000000000000000000000" +snapshot_id: ~ metadata: ignore_unknown_instances: false instigating_source: @@ -10,15 +10,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! + Type: String + Value: 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..4e408475 100644 --- a/src/snapshot_middleware/txt.rs +++ b/src/snapshot_middleware/txt.rs @@ -1,75 +1,50 @@ 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 rbx_dom_weak::RbxValue; -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, middleware::SnapshotInstanceResult}; 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(); + instance_name: &str, +) -> SnapshotInstanceResult { + 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() => RbxValue::String { + value: contents_str, + }, + }; + + let meta_path = path.with_file_name(format!("{}.meta.json", instance_name)); let mut snapshot = InstanceSnapshot::new() - .name(name) + .name(instance_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,39 +59,11 @@ 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, + &mut vfs, Path::new("/foo.txt"), "foo", ) diff --git a/src/snapshot_middleware/util.rs b/src/snapshot_middleware/util.rs index c16edcce..153c31c2 100644 --- a/src/snapshot_middleware/util.rs +++ b/src/snapshot_middleware/util.rs @@ -1,7 +1,5 @@ use std::path::Path; -use anyhow::Context; - /// If the given string ends up with the given suffix, returns the portion of /// the string before the suffix. pub fn match_trailing<'a>(input: &'a str, suffix: &str) -> Option<&'a str> { @@ -13,43 +11,10 @@ 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 -where - P: AsRef, -{ - fn file_name_ends_with(&self, suffix: &str) -> bool { - self.as_ref() - .file_name() - .and_then(|name| name.to_str()) - .map(|name| name.ends_with(suffix)) - .unwrap_or(false) - } - - fn file_name_trim_end<'a>(&'a self, suffix: &str) -> anyhow::Result<&'a str> { - let path = self.as_ref(); - let file_name = path - .file_name() - .and_then(|name| name.to_str()) - .with_context(|| format!("Path did not have a file name: {}", path.display()))?; - - 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) +/// If the given path has a file name, and that file name ends with the given +/// suffix, returns the portion of the file name before the given suffix. +pub fn match_file_name<'a>(path: &'a Path, suffix: &str) -> Option<&'a str> { + let file_name = path.file_name()?.to_str()?; + + match_trailing(&file_name, suffix) } 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..a55e7e92 100644 --- a/src/tree_view.rs +++ b/src/tree_view.rs @@ -1,10 +1,6 @@ -//! Utiilty that helps redact nondeterministic information from trees so that -//! they can be part of snapshot tests. +use std::collections::HashMap; -use rbx_dom_weak::{ - types::{Ref, Variant}, - Ustr, UstrMap, -}; +use rbx_dom_weak::{RbxId, RbxValue}; use rojo_insta_ext::RedactionMap; use serde::Serialize; @@ -33,21 +29,21 @@ pub fn intern_tree(tree: &RojoTree, redactions: &mut RedactionMap) { /// Copy of data from RojoTree in the right shape to have useful snapshots. #[derive(Debug, Serialize)] struct InstanceView { - id: Ref, + id: RbxId, name: String, - class_name: Ustr, - properties: UstrMap, + class_name: String, + properties: HashMap, metadata: InstanceMetadata, children: Vec, } -fn extract_instance_view(tree: &RojoTree, id: Ref) -> InstanceView { +fn extract_instance_view(tree: &RojoTree, id: RbxId) -> InstanceView { let instance = tree.get_instance(id).unwrap(); 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..d041b9c1 100644 --- a/src/web/api.rs +++ b/src/web/api.rs @@ -1,196 +1,211 @@ //! 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, 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 futures::{Future, Stream}; + +use hyper::{service::Service, Body, Method, Request, StatusCode}; +use rbx_dom_weak::RbxId; use crate::{ serve_session::ServeSession, snapshot::{InstanceWithMeta, PatchSet, PatchUpdate}, web::{ interface::{ - ErrorResponse, Instance, MessagesPacket, OpenResponse, ReadResponse, - ServerInfoResponse, SocketPacket, SocketPacketBody, SocketPacketType, SubscribeMessage, + ErrorResponse, Instance, InstanceMetadata as WebInstanceMetadata, InstanceUpdate, + 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); - - 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::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( - ErrorResponse::not_found(format!("Route not found: {}", path)), - StatusCode::NOT_FOUND, - ), - } -} - pub struct ApiService { serve_session: Arc, - remote_addr: SocketAddr, +} + +impl Service for ApiService { + type ReqBody = Body; + type ResBody = Body; + type Error = hyper::Error; + type Future = + Box, Error = Self::Error> + Send>; + + fn call(&mut self, request: hyper::Request) -> Self::Future { + match (request.method(), request.uri().path()) { + (&Method::GET, "/api/rojo") => self.handle_api_rojo(), + (&Method::GET, path) if path.starts_with("/api/read/") => self.handle_api_read(request), + (&Method::GET, path) if path.starts_with("/api/subscribe/") => { + self.handle_api_subscribe(request) + } + (&Method::POST, path) if path.starts_with("/api/open/") => { + self.handle_api_open(request) + } + + (&Method::POST, "/api/write") => self.handle_api_write(request), + + (_method, path) => json( + ErrorResponse::not_found(format!("Route not found: {}", path)), + StatusCode::NOT_FOUND, + ), + } + } } 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 - async fn handle_api_rojo(&self) -> Response { + fn handle_api_rojo(&self) -> ::Future { 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. + fn handle_api_subscribe(&self, request: Request) -> ::Future { + 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 receiver = self.serve_session.message_queue().subscribe(input_cursor); + + let tree_handle = self.serve_session.tree_handle(); + + Box::new(receiver.then(move |result| match result { + Ok((message_cursor, messages)) => { + let tree = tree_handle.lock().unwrap(); + + let api_messages = messages + .into_iter() + .map(|message| { + let removed = message.removed; + + let mut added = HashMap::new(); + for id in message.added { + let instance = tree.get_instance(id).unwrap(); + added.insert(id, Instance::from_rojo_instance(instance)); + + for instance in tree.descendants(id) { + added.insert(instance.id(), Instance::from_rojo_instance(instance)); + } + } + + let updated = message + .updated + .into_iter() + .map(|update| { + let changed_metadata = update + .changed_metadata + .as_ref() + .map(WebInstanceMetadata::from_rojo_metadata); + + InstanceUpdate { + id: update.id, + changed_name: update.changed_name, + changed_class_name: update.changed_class_name, + changed_properties: update.changed_properties, + changed_metadata, + } + }) + .collect(); + + SubscribeMessage { + removed, + added, + updated, + } + }) + .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 { + fn handle_api_write(&self, request: Request) -> ::Future { let session_id = self.serve_session.session_id(); let tree_mutation_sender = self.serve_session.tree_mutation_sender(); - let body = body::to_bytes(request.into_body()).await.unwrap(); + Box::new(request.into_body().concat2().and_then(move |body| { + let request: WriteRequest = match serde_json::from_slice(&body) { + Ok(request) => request, + Err(err) => { + return json( + ErrorResponse::bad_request(format!("Invalid body: {}", err)), + StatusCode::BAD_REQUEST, + ); + } + }; - let request: WriteRequest = match deserialize_msgpack(&body) { - Ok(request) => request, - Err(err) => { - return msgpack( - ErrorResponse::bad_request(format!("Invalid body: {}", err)), + if request.session_id != session_id { + return json( + ErrorResponse::bad_request("Wrong session ID"), StatusCode::BAD_REQUEST, ); } - }; - if request.session_id != session_id { - return msgpack( - ErrorResponse::bad_request("Wrong session ID"), - StatusCode::BAD_REQUEST, - ); - } + let updated_instances = request + .updated + .into_iter() + .map(|update| PatchUpdate { + id: update.id, + changed_class_name: update.changed_class_name, + changed_name: update.changed_name, + changed_properties: update.changed_properties, + changed_metadata: None, + }) + .collect(); - let updated_instances = request - .updated - .into_iter() - .map(|update| PatchUpdate { - id: update.id, - changed_class_name: update.changed_class_name, - changed_name: update.changed_name, - changed_properties: update.changed_properties, - changed_metadata: None, - }) - .collect(); + tree_mutation_sender + .send(PatchSet { + removed_instances: Vec::new(), + added_instances: Vec::new(), + updated_instances, + }) + .unwrap(); - tree_mutation_sender - .send(PatchSet { - removed_instances: Vec::new(), - added_instances: Vec::new(), - updated_instances, - }) - .unwrap(); - - msgpack_ok(WriteResponse { session_id }) + json_ok(&WriteResponse { session_id }) + })) } - async fn handle_api_read(&self, request: Request) -> Response { + fn handle_api_read(&self, request: Request) -> ::Future { let argument = &request.uri().path()["/api/read/".len()..]; - let requested_ids: Result, _> = argument.split(',').map(Ref::from_str).collect(); + let requested_ids: Option> = argument.split(',').map(RbxId::parse_str).collect(); let requested_ids = match requested_ids { - Ok(ids) => ids, - Err(_) => { - return msgpack( + Some(ids) => ids, + None => { + return json( ErrorResponse::bad_request("Malformed ID list"), StatusCode::BAD_REQUEST, ); @@ -214,178 +229,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, - ); - } - + fn handle_api_open(&self, request: Request) -> ::Future { let argument = &request.uri().path()["/api/open/".len()..]; - let requested_id = match Ref::from_str(argument) { - Ok(id) => id, - Err(_) => { - return msgpack( + let requested_id = match RbxId::parse_str(argument) { + Some(id) => id, + None => { + return json( ErrorResponse::bad_request("Invalid instance ID"), StatusCode::BAD_REQUEST, ); @@ -397,7 +254,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 +264,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 +273,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 +308,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..09bfc3db 100644 --- a/src/web/assets.rs +++ b/src/web/assets.rs @@ -1,7 +1,3 @@ -//! A simple asset reloading system intended for iterating on CSS. When in the -//! `dev_live_assets` feature is enabled, files are read from disk and watched -//! for changes. Otherwise, they're baked into the executable. - macro_rules! declare_asset { ($name: ident, $path: expr) => { pub fn $name() -> &'static str { @@ -29,13 +25,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..be37f1e0 100644 --- a/src/web/interface.rs +++ b/src/web/interface.rs @@ -1,99 +1,44 @@ -//! Defines all the structs needed to interact with the Rojo Serve API. This is -//! useful for tests to be able to use the same data structures as the -//! implementation. +//! Defines all the structs needed to interact with the Rojo Serve API. use std::{ borrow::Cow, collections::{HashMap, HashSet}, }; -use rbx_dom_weak::{ - types::{Ref, Variant, VariantType}, - Ustr, UstrMap, -}; +use rbx_dom_weak::{RbxId, RbxValue}; use serde::{Deserialize, Serialize}; -use strum::Display; use crate::{ session_id::SessionId, - snapshot::{ - AppliedPatchSet, InstanceMetadata as RojoInstanceMetadata, InstanceWithMeta, RojoTree, - }, + snapshot::{InstanceMetadata as RojoInstanceMetadata, InstanceWithMeta}, }; /// Server version to report over the API, not exposed outside this 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 = 3; /// Message returned by Rojo API when a change has occurred. #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SubscribeMessage<'a> { - pub removed: Vec, - pub added: HashMap>, + pub removed: Vec, + pub added: HashMap>, pub updated: Vec, } -impl<'a> SubscribeMessage<'a> { - pub(crate) fn from_patch_update(tree: &'a RojoTree, patch: AppliedPatchSet) -> Self { - let removed = patch.removed; - - let mut added = HashMap::new(); - for id in patch.added { - let instance = tree.get_instance(id).unwrap(); - added.insert(id, Instance::from_rojo_instance(instance)); - - for instance in tree.descendants(id) { - added.insert(instance.id(), Instance::from_rojo_instance(instance)); - } - } - - let updated = patch - .updated - .into_iter() - .map(|update| { - let changed_metadata = update - .changed_metadata - .as_ref() - .map(InstanceMetadata::from_rojo_metadata); - - let changed_properties = update - .changed_properties - .into_iter() - .filter(|(_key, value)| property_filter(value.as_ref())) - .collect(); - - InstanceUpdate { - id: update.id, - changed_name: update.changed_name, - changed_class_name: update.changed_class_name, - changed_properties, - changed_metadata, - } - }) - .collect(); - - Self { - removed, - added, - updated, - } - } -} - #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InstanceUpdate { - pub id: Ref, + pub id: RbxId, 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, } @@ -114,44 +59,29 @@ impl InstanceMetadata { #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Instance<'a> { - pub id: Ref, - pub parent: Ref, + pub id: RbxId, + pub parent: Option, pub name: Cow<'a, str>, - pub class_name: Ustr, - pub properties: UstrMap>, - pub children: Cow<'a, [Ref]>, + pub class_name: Cow<'a, str>, + pub properties: Cow<'a, HashMap>, + pub children: Cow<'a, [RbxId]>, 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))) - .collect(); - Instance { id: source.id(), parent: source.parent(), name: Cow::Borrowed(source.name()), - class_name: source.class_name(), - properties, + class_name: Cow::Borrowed(source.class_name()), + properties: Cow::Borrowed(source.properties()), children: Cow::Borrowed(source.children()), metadata: Some(InstanceMetadata::from_rojo_metadata(source.metadata())), } } } -fn property_filter(value: Option<&Variant>) -> bool { - let ty = value.map(|value| value.ty()); - - // Lua can't do anything with SharedString values. They also can't be - // serialized directly by Serde! - ty != Some(VariantType::SharedString) -} - /// Response body from /api/rojo #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -161,10 +91,7 @@ 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, + pub root_instance_id: RbxId, } /// Response body from /api/read/{id} @@ -173,17 +100,17 @@ pub struct ServerInfoResponse { pub struct ReadResponse<'a> { pub session_id: SessionId, pub message_cursor: u32, - pub instances: HashMap>, + pub instances: HashMap>, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct WriteRequest { pub session_id: SessionId, - pub removed: Vec, + pub removed: Vec, #[serde(default)] - pub added: HashMap, + pub added: HashMap, pub updated: Vec, } @@ -193,44 +120,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 +136,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 +159,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 +171,5 @@ impl ErrorResponse { pub enum ErrorResponseKind { NotFound, BadRequest, - Forbidden, InternalError, } diff --git a/src/web/mod.rs b/src/web/mod.rs index 8a003285..e9a032bc 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -1,28 +1,53 @@ -//! Defines the Rojo web interface. This is what the Roblox Studio plugin -//! communicates with. Eventually, we'll make this API stable, produce better -//! documentation for it, and open it up for other consumers. - mod api; mod assets; pub mod interface; -mod origin; mod ui; mod util; -use std::convert::Infallible; -use std::net::SocketAddr; use std::sync::Arc; -use anyhow::Context; -use hyper::{ - server::{conn::AddrStream, Server}, - service::{make_service_fn, service_fn}, - Body, Request, +use futures::{ + future::{self, FutureResult}, + Future, }; -use tokio::runtime::Runtime; +use hyper::{service::Service, Body, Request, Response, Server}; +use log::trace; use crate::serve_session::ServeSession; +use self::{api::ApiService, ui::UiService}; + +pub struct RootService { + api: ApiService, + ui: UiService, +} + +impl Service for RootService { + type ReqBody = Body; + type ResBody = Body; + type Error = hyper::Error; + type Future = Box, Error = Self::Error> + Send>; + + fn call(&mut self, request: Request) -> Self::Future { + trace!("{} {}", request.method(), request.uri().path()); + + if request.uri().path().starts_with("/api") { + self.api.call(request) + } else { + self.ui.call(request) + } + } +} + +impl RootService { + pub fn new(serve_session: Arc) -> Self { + RootService { + api: ApiService::new(Arc::clone(&serve_session)), + ui: UiService::new(Arc::clone(&serve_session)), + } + } +} + pub struct LiveServer { serve_session: Arc, } @@ -32,73 +57,17 @@ 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<()> { - let serve_session = Arc::clone(&self.serve_session); - let allowed_hosts = origin::allowed_hosts(address.ip(), address.port(), &allowed_hosts); + pub fn start(self, port: u16) { + let address = ([127, 0, 0, 1], port).into(); - let make_service = make_service_fn(move |conn: &AddrStream| { - let serve_session = Arc::clone(&serve_session); - let allowed_hosts = allowed_hosts.clone(); - let remote_addr = conn.remote_addr(); + let server = Server::bind(&address) + .serve(move || { + let service: FutureResult<_, hyper::Error> = + future::ok(RootService::new(Arc::clone(&self.serve_session))); + service + }) + .map_err(|e| eprintln!("Server error: {}", e)); - async move { - 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) - } else { - Ok::<_, Infallible>(ui::call(serve_session, req).await) - } - } - }; - - Ok::<_, Infallible>(service_fn(service)) - } - }); - - let rt = Runtime::new().context("Failed to start the async runtime for the web server")?; - 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(()) + hyper::rt::run(server); } } 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..a3705e06 100644 --- a/src/web/ui.rs +++ b/src/web/ui.rs @@ -1,13 +1,11 @@ -//! Defines the HTTP-based Rojo UI. It uses ritz for templating, which is like -//! JSX for Rust. Eventually we should probably replace this with a new -//! framework, maybe using JS and client side rendering. -//! -//! These endpoints generally return HTML and SVG. +//! Defines the HTTP-based UI. These endpoints generally return HTML and SVG. use std::{borrow::Cow, sync::Arc, time::Duration}; -use hyper::{Body, Method, Request, Response, StatusCode}; -use rbx_dom_weak::types::{Ref, Variant}; +use futures::{future, Future}; +use hyper::{header, service::Service, Body, Method, Request, Response, StatusCode}; +use maplit::hashmap; +use rbx_dom_weak::{RbxId, RbxValue}; use ritz::{html, Fragment, HtmlContent, HtmlSelfClosingTag}; use crate::{ @@ -16,40 +14,55 @@ use crate::{ web::{ assets, interface::{ErrorResponse, SERVER_VERSION}, - util::{json, response}, + util::json, }, }; -pub async fn call(serve_session: Arc, request: Request) -> Response { - let service = UiService::new(serve_session); - - match (request.method(), request.uri().path()) { - (&Method::GET, "/") => service.handle_home(), - (&Method::GET, "/logo.png") => service.handle_logo(), - (&Method::GET, "/icon.png") => service.handle_icon(), - (&Method::GET, "/show-instances") => service.handle_show_instances(), - (_method, path) => json( - ErrorResponse::not_found(format!("Route not found: {}", path)), - StatusCode::NOT_FOUND, - ), - } -} - pub struct UiService { serve_session: Arc, } +impl Service for UiService { + type ReqBody = Body; + type ResBody = Body; + type Error = hyper::Error; + type Future = Box, Error = Self::Error> + Send>; + + fn call(&mut self, request: Request) -> Self::Future { + let response = match (request.method(), request.uri().path()) { + (&Method::GET, "/") => self.handle_home(), + (&Method::GET, "/logo.png") => self.handle_logo(), + (&Method::GET, "/icon.png") => self.handle_icon(), + (&Method::GET, "/show-instances") => self.handle_show_instances(), + (_method, path) => { + return json( + ErrorResponse::not_found(format!("Route not found: {}", path)), + StatusCode::NOT_FOUND, + ) + } + }; + + Box::new(future::ok(response)) + } +} + impl UiService { pub fn new(serve_session: Arc) -> Self { UiService { serve_session } } 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 +73,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,14 +87,13 @@ 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<'_> { + fn instance(tree: &RojoTree, id: RbxId) -> HtmlContent<'_> { let instance = tree.get_instance(id).unwrap(); let children_list: Vec<_> = instance .children() @@ -115,7 +126,7 @@ impl UiService { .map(|(key, value)| { html! {

- { key.as_str() } ": " { format!("{:?}", value.ty()) } + { key.clone() } ": " { format!("{:?}", value.get_type()) }
} }) @@ -158,10 +169,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 +198,7 @@ impl UiService { html! {
-